00001
00014 #include <signal.h>
00015 #include <korebot/korebot.h>
00016
00017 #define device "/dev/tts/2"
00018
00019 #define MAX_DIST 2000
00020 #define RCVBUFSIZE 32
00021
00022
00023 int lrf;
00024 knet_dev_t *koala;
00025
00026 int cmd_received = 0;
00027
00028
00029 void * koa_lrf_task(void * arg)
00030 {
00031 long left,right;
00032 unsigned workdata[121];
00033 int potential[121];
00034 int i;
00035 enum {suspended, active} state = active;
00036
00037 struct timeval lastcommand, now, diff;
00038 struct timezone here;
00039
00040
00041 lrf = kb_lrf_Init(device);
00042
00043
00044 for(i=0; i<10; i++)
00045 potential[i] = -1;
00046
00047 for(i=10; i<30; i++)
00048 potential[i] = -7;
00049
00050 for(i=30; i<40; i++)
00051 potential[i] = -15;
00052
00053 for(i=40; i<50; i++)
00054 potential[i] = -22;
00055
00056 for(i=50; i<60; i++)
00057 potential[i] = -27;
00058
00059 for(i=60; i<70; i++)
00060 potential[i] = 9;
00061
00062 for(i=70; i<80; i++)
00063 potential[i] = 7;
00064
00065 for(i=80; i<90; i++)
00066 potential[i] = 6;
00067
00068 for(i=90; i<110; i++)
00069 potential[i] = 3;
00070
00071 for(i=110; i<121; i++)
00072 potential[i] = 1;
00073
00074 #if 1
00075 for(;;)
00076 {
00077 switch(state)
00078 {
00079 case active:
00080 if(cmd_received)
00081 {
00082 gettimeofday(&lastcommand,&here);
00083 state = suspended;
00084 }
00085 else
00086 if(kb_lrf_GetDistances(lrf) >= 0)
00087 {
00088 for(i=0; i<121; i++)
00089 if(kb_lrf_DistanceData[i])
00090 workdata[i] = MAX_DIST/kb_lrf_DistanceData[i];
00091 else
00092 workdata[i] = 0;
00093
00094 for(i=0, right=0, left=0; i<121; i++)
00095 {
00096 right += (workdata[i] * potential[i]);
00097 left += (workdata[i] * potential[120-i]);
00098 }
00099
00100 printf("done ok d:%ld g:%ld\r\n",right,left);
00101
00102 right = (right / 10) + 100;
00103 left = (left / 10) + 100;
00104
00105 printf("droite:%ld gauche:%ld\r\n",right,left);
00106 koa_setSpeed(koala,right,left);
00107 }
00108
00109 break;
00110
00111 case suspended:
00112 gettimeofday(&now,&here);
00113 timersub(&now,&lastcommand,&diff);
00114
00115 if(diff.tv_sec > 3)
00116 {
00117 state = active;
00118 cmd_received = 0;
00119 }
00120
00121 break;
00122 }
00123 }
00124 #endif
00125
00126 }
00127
00128 void handle_kill(int arg)
00129 {
00130 fprintf(stderr, "arg... killed\r\n");
00131
00132 koa_setSpeed(koala,0,0);
00133
00134 kb_lrf_Close(lrf);
00135
00136 exit(1);
00137 }
00138
00139 int koa_net_stop(int argc, char * argv[])
00140 {
00141 koa_setSpeed(koala,0,0);
00142
00143 return 0;
00144 }
00145
00146 int koa_net_setspeed(int argc, char * argv[])
00147 {
00148 int right = 0;
00149 int left = 0;
00150 int i;
00151
00152 right = atoi(argv[1]);
00153 left = atoi(argv[2]);
00154
00155 koa_setSpeed(koala, right, left);
00156
00157 for(i=0;i<argc;i++)
00158 printf("%s ",argv[i]);
00159 printf("(%d,%d)\r\n",right,left);
00160
00161 return 0;
00162 }
00163
00164 int main( int argc , char * argv[] )
00165 {
00166 int rc;
00167 unsigned char a,b,c,d;
00168 int clntSocket;
00169 ksock_t server;
00170 char echoBuffer[RCVBUFSIZE];
00171 int port;
00172
00173 pthread_t lrf_task;
00174
00175
00176 signal(SIGINT, handle_kill);
00177
00178 if(argc > 1)
00179 port = atoi(argv[1]);
00180 else
00181 port = 344;
00182
00183
00184 kb_set_debug_level(2);
00185
00186 if((rc = kb_init( argc , argv )) < 0 )
00187 return 1;
00188
00189 printf("Koala Demo Program\r\n");
00190
00191
00192 if((rc = ksock_init('\n')) < 0 )
00193 return 1;
00194
00195 koala = knet_open( "Koala:Robot", KNET_BUS_ANY, 0 , NULL );
00196 if(!koala)
00197 {
00198 printf("Open Koala device failed\r\n");
00199 return 1;
00200 }
00201
00202
00203 koa_getOSVersion(koala,&a,&b,&c,&d);
00204 printf("OS revision %d.%d protocol %d.%d\r\n",a,b,c,d);
00205 koa_setSpeed(koala,0,0);
00206
00207
00208 ksock_server_open(&server, port);
00209
00210 ksock_add_command("setspeed",2,2,koa_net_setspeed);
00211 ksock_add_command("stop",0,0,koa_net_stop);
00212 list_command();
00213
00214
00215 rc = pthread_create(&lrf_task, NULL, koa_lrf_task, NULL);
00216 if (rc){
00217 printf("ERROR; return code from pthread_create() is %d\n", rc);
00218 exit(-1);
00219 }
00220
00221
00222 clntSocket = ksock_next_connection(&server);
00223
00224 for(;;)
00225 {
00226 #if 1
00227 rc = ksock_get_command(clntSocket, echoBuffer, RCVBUFSIZE);
00228
00229 if(rc>0)
00230 {
00231 cmd_received = 1;
00232 ksock_exec_command(echoBuffer);
00233
00234 if (send(clntSocket, echoBuffer, rc, 0) != rc)
00235 DieWithError("send() failed");
00236 }
00237 else
00238 switch(rc)
00239 {
00240 case 0 :
00241 break;
00242 case -3 :
00243 printf("Client disconnected\r\n");
00244 clntSocket = ksock_next_connection(&server);
00245 break;
00246 default :
00247 printf("Socket error: %d\r\n",rc);
00248 clntSocket = ksock_next_connection(&server);
00249 break;
00250 }
00251 #endif
00252
00253 }
00254 close(clntSocket);
00255 }