com.cpp

Go to the documentation of this file.
00001 
00002 
00003 #include <string.h>
00004 #include <stdio.h>
00005 
00006 #include "liblnp.h"
00007 #include "wx/wx.h"
00008 
00009 
00010 #include "com.h"
00011 
00012 
00013 //=====================================================================
00014 
00015 
00016 /* declare sem_com (semaphore for communication) */
00017 // - initial 1 -> not locked!
00018 wxSemaphore sem_com(1,1);
00019 
00020 
00021 /* declare & initialize TRIGGER1 */
00022 int TRIGGER1 = 0;
00023 /* declare & initialize TRIGGER2 */
00024 int TRIGGER2 = 0;
00025 /* declare & initialize TRIGGER3 */
00026 int TRIGGER3 = 0;
00027 /* declare & initialize TRIGGER4 */
00028 int TRIGGER4 = 0;
00029 /* declare & initialize TRIGGER5 */
00030 int TRIGGER5 = 0;
00031 /* declare & initialize TEMPERATURE */
00032 int TEMPERATURE = 0;
00033 /* declare & initialize COORDINATES */
00034 int COORDINATES[9] = {0,0,0,0,0,0,0,0,0};
00035 
00036 
00037 //=====================================================================
00038 
00039 // semaphore for new data : 
00040 // - lnphandler signals data processor thread
00041 // - so initial value 0 -> no data! 
00042 wxSemaphore sem_data(0,1);
00043 
00044 
00045 int COM_ID=0;
00046 
00047 /* declare received_message */
00048 char received_message[40];
00049 /* declare receiver_header */
00050 char received_header[3];
00051 /* declare & initialize received_message_len */
00052 int received_message_len = 0;
00053 
00054 //=====================================================================
00055 
00056 
00057 /****************************************/
00058 /* begin own_atoi: convert s to integer */
00059 /****************************************/
00060 
00061 int own_atoi ( char s[]) {
00062     int i, n, sign;
00063     
00064     for (i=0; s[i] == ' ' || s[i] == '\n' || s[i] == '\t' ; i++) {
00065     }
00066     sign = (s[i] == '-') ? -1 : 1;
00067     if (s[i] == '+' || s[i] == '-')
00068         i++;
00069     for (n=0; s[i] >= '0' && s[i] <= '9'; i++)
00070         n = 10*n + (s[i] - '0');
00071     return sign * n;
00072 }
00073 
00074 /****************************************/
00075 /* end own_atoi: convert s to integer   */
00076 /****************************************/
00077 
00078 /***************************************/
00079 /* begin own_reverse: reverse string s */
00080 /***************************************/
00081 
00082 void own_reverse (char s[]) {
00083     int  i, j;
00084     char c;
00085     for (i=0, j = strlen(s) -1; i<j; i++, j--) {
00086         c = s[i];
00087         s[i] = s[j];
00088         s[j] = c;
00089     }
00090 }
00091 /***************************************/
00092 /* end own_reverse: reverse string s   */
00093 /***************************************/
00094 
00095 /*****************************************/
00096 /* begin own_itoa: convert n to string s */
00097 /*****************************************/
00098 
00099 void own_itoa (int n,char s[]) {
00100     int i, sign;
00101     
00102     if ((sign = n) < 0)
00103         n=-n;
00104     i=0;
00105     do {
00106         s[i++] =  (char) ( n % 10 + (int) '0');
00107     } while ((n /= 10) > 0);
00108     if (sign<0)
00109         s[i++]='-';
00110     s[i] = '\0';
00111     own_reverse(s);
00112 }
00113 /*****************************************/
00114 /* end own_itoa: convert n to string s   */
00115 /*****************************************/
00116 
00117 /******************************************/
00118 /* begin porthandler: define port handler */
00119 /******************************************/
00120 
00121 static void port_handler(const unsigned char *data, unsigned char len)
00122 {
00123     /* declare i */
00124     int i;
00125     
00126     /* is the received packet for RCX ID? */
00127     if (data[1]==COM_ID+'0'){
00128         
00129         for(i=0;i<=len;i++) {
00130             if (i<3) {
00131                 /* received header */
00132                 received_header[i]=data[i];
00133             } else {
00134                 /* received message */
00135                 received_message[i-3]=data[i];
00136             }
00137                 
00138         }
00139         /* received message length */
00140         received_message_len = len-3;
00141                 sem_data.Post();
00142     }
00143 }
00144 
00145 /***************************************/
00146 /* end porthandler: set port handler   */
00147 /***************************************/
00148 
00149 
00150 
00151 
00152 /***************************************/
00153 /* begin read_from_ir: read from ir    */
00154 /***************************************/
00155 
00156 
00157 class ReadFromIrThread : public wxThread
00158 {
00159 public:
00160     ReadFromIrThread();
00161 
00162     virtual void *Entry();
00163 
00164 private:
00165 
00166 };
00167 
00168 ReadFromIrThread::ReadFromIrThread() {
00169     
00170 }
00171 
00172 void *ReadFromIrThread::Entry()
00173 {
00174                 /* declare i, j and k */
00175                 int i, j, k;
00176     
00177                 /* declare data_header */
00178                 char data_header[4];
00179                 /* declare data_received */    
00180                 char data_received[40];
00181                 /* declare data_header */
00182                 char number_string[5];
00183     
00184                 int data_received_int[9];
00185     
00186                 while(!TestDestroy()) {
00187             
00188                         //printf("!!! wait data !!!!\n");
00189                         // wait for incoming data
00190                         sem_data.Wait();        
00191             //printf("!!! data !!!!\n");
00192 
00193                         /* copy received_message to data_received */
00194                         memcpy(data_received, received_message, received_message_len);
00195                         /* copy received_header to data_header */
00196                         memcpy(data_header, received_header, 3);
00197         
00198                         /* initialize k and j */
00199                         j = 0;
00200                         k = 0;
00201         
00202                         for (i=0;i<received_message_len;i++) {
00203                                 if (data_received[i]!=' ' && data_received[i] != '\0') {
00204                                         number_string[j] = data_received[i];
00205                                         j++;
00206                 
00207                                 } else if (data_received[i] == ' ' || data_received[i] == '\0') {
00208                                         number_string[j] = '\0';
00209                                         /* convert string number_string to integer */
00210                                         data_received_int[k] = own_atoi(number_string);
00211                                         k++;
00212                                         j = 0;
00213                                 }
00214                         }
00215         
00216                         /* protect data from mutual access */
00217                         sem_com.Wait();
00218         
00219                         /* write in global variables */
00220                         switch (data_header[2]) {
00221                                 case '1':
00222                                         TRIGGER1=data_received_int[0];
00223                                         break;
00224                                 case '2':
00225                                         TRIGGER2=data_received_int[0];
00226                                         break;
00227                                 case '3':
00228                                         TRIGGER3=data_received_int[0];
00229                                         break;
00230                                 case '4':
00231                                         TRIGGER4=data_received_int[0];
00232                                         break;
00233                                 case '5':
00234                                         TRIGGER5=data_received_int[0];
00235                                         break;
00236                                 case '6':
00237                                         TEMPERATURE=data_received_int[0];
00238                                         break;
00239                                 case '7':
00240                                         for (i=0;i<9;i++) {
00241                                                 COORDINATES[i]=data_received_int[i];
00242                                         }
00243                                         break;
00244                         }
00245 
00246                         /* wait for semaphore key */
00247                         sem_com.Post();
00248 
00249                         received_message_len = 0;
00250                 }
00251         return 0;
00252 }
00253 
00254 /*************************************/
00255 /* end read_from_ir: read from ir    */
00256 /*************************************/
00257 
00258 
00259 /***************************************************************************/
00260 /* begin com_send: send message with LNP from RCX to RCX or from RCX to PC */
00261 /***************************************************************************/
00262 
00263 int com_send(int id_sender_int, int id_receiver_int,
00264              int message_type_int, int *message_send_int) {
00265 
00266     /* declare i, j and k */    
00267     unsigned int i,j,k;
00268     /* declare id_sender_string */
00269     char id_sender_string[2];
00270     /* declare id_receiver_string */
00271     char id_receiver_string[2];
00272     /* declare message_type_string */
00273     char message_type_string[2];
00274     /* declare message_send_string */
00275     char message_send_string[4];
00276     /* declare message_send_string */
00277     char message_send[40];
00278 
00279         int message_len;
00280         
00281     /* create header */
00282 
00283     /* convert integer id_sender_int to string */
00284     own_itoa(id_sender_int,id_sender_string);
00285     message_send[0]=id_sender_string[0];
00286     /* convert integer id_receiver_int to string */
00287     own_itoa(id_receiver_int,id_receiver_string);
00288     message_send[1]=id_receiver_string[0];
00289     /* convert integer message_type_int to string */
00290     own_itoa(message_type_int,message_type_string);
00291     message_send[2]=message_type_string[0];
00292     
00293 
00294     /* create message body */
00295 
00296     /* initialize k */
00297     k = 2;
00298     
00299     if ((message_type_int>=1) && (message_type_int<=6)) {
00300         /* convert integer message_send_int[0] to string */        
00301         own_itoa(message_send_int[0],message_send_string);
00302         
00303         for (j=0;j<strlen(message_send_string);++j) {
00304             k++;
00305             message_send[k]=message_send_string[j];
00306         }
00307         
00308     } else if (message_type_int == 7) {
00309         for (i=0;i<9;++i) {
00310             /* convert integer message_send_int[i] to string */
00311             own_itoa(message_send_int[i],message_send_string);
00312             
00313             for (j=0;j<strlen(message_send_string);++j) {
00314                 k++;
00315                 message_send[k]=message_send_string[j];
00316             }
00317             if (i!=9-1) {
00318                 k++;
00319                 message_send[k]=' ';
00320             }
00321         }
00322     } else {
00323         message_send[3]='\0';
00324     }
00325     
00326     k++;
00327     message_send[k]='\0'; 
00328     //unsigned char message_len=(unsigned char)(strlen(message_send)+1);
00329 
00330         message_len =strlen(message_send)+1;
00331         printf("message_len: %d \n",message_len);
00332         printf("message_send %s \n ", message_send);
00333     /* send message */
00334     lnp_integrity_write((unsigned char *)message_send,message_len);
00335 
00336     return 0;
00337 }
00338 
00339 /*************************************************************************/
00340 /* end com_send: send message with LNP from RCX to RCX or from RCX to PC */
00341 /*************************************************************************/
00342 
00343 int init_com(int id) {
00344 
00345         COM_ID=id;
00346 
00347 
00348         // initialize LNP
00349     if ( lnp_init(0,0,0,0,0) )
00350         {
00351         //perror("lnp_init");  
00352             printf("error lnp \n");
00353         exit(1);
00354           
00355         }
00356     else fprintf(stderr,"init OK\n");
00357 
00358         // test : light on usb tower should lit up!
00359 //      lnp_integrity_write((unsigned char *)"test",4);
00360  
00361     // initialize communication port 
00362     lnp_integrity_set_handler(port_handler);
00363  
00364         /* set ir range to "far" */
00365     //lnp_logical_range(1);
00366 
00367 
00368     ReadFromIrThread *readthread = new ReadFromIrThread();
00369     readthread->Create();
00370         readthread->Run();
00371 
00372         return 0;
00373 }

Generated on Wed Nov 29 01:27:40 2006 by  doxygen 1.4.6