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
00017
00018 wxSemaphore sem_com(1,1);
00019
00020
00021
00022 int TRIGGER1 = 0;
00023
00024 int TRIGGER2 = 0;
00025
00026 int TRIGGER3 = 0;
00027
00028 int TRIGGER4 = 0;
00029
00030 int TRIGGER5 = 0;
00031
00032 int TEMPERATURE = 0;
00033
00034 int COORDINATES[9] = {0,0,0,0,0,0,0,0,0};
00035
00036
00037
00038
00039
00040
00041
00042 wxSemaphore sem_data(0,1);
00043
00044
00045 int COM_ID=0;
00046
00047
00048 char received_message[40];
00049
00050 char received_header[3];
00051
00052 int received_message_len = 0;
00053
00054
00055
00056
00057
00058
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
00076
00077
00078
00079
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
00093
00094
00095
00096
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
00115
00116
00117
00118
00119
00120
00121 static void port_handler(const unsigned char *data, unsigned char len)
00122 {
00123
00124 int i;
00125
00126
00127 if (data[1]==COM_ID+'0'){
00128
00129 for(i=0;i<=len;i++) {
00130 if (i<3) {
00131
00132 received_header[i]=data[i];
00133 } else {
00134
00135 received_message[i-3]=data[i];
00136 }
00137
00138 }
00139
00140 received_message_len = len-3;
00141 sem_data.Post();
00142 }
00143 }
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
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
00175 int i, j, k;
00176
00177
00178 char data_header[4];
00179
00180 char data_received[40];
00181
00182 char number_string[5];
00183
00184 int data_received_int[9];
00185
00186 while(!TestDestroy()) {
00187
00188
00189
00190 sem_data.Wait();
00191
00192
00193
00194 memcpy(data_received, received_message, received_message_len);
00195
00196 memcpy(data_header, received_header, 3);
00197
00198
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
00210 data_received_int[k] = own_atoi(number_string);
00211 k++;
00212 j = 0;
00213 }
00214 }
00215
00216
00217 sem_com.Wait();
00218
00219
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
00247 sem_com.Post();
00248
00249 received_message_len = 0;
00250 }
00251 return 0;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
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
00267 unsigned int i,j,k;
00268
00269 char id_sender_string[2];
00270
00271 char id_receiver_string[2];
00272
00273 char message_type_string[2];
00274
00275 char message_send_string[4];
00276
00277 char message_send[40];
00278
00279 int message_len;
00280
00281
00282
00283
00284 own_itoa(id_sender_int,id_sender_string);
00285 message_send[0]=id_sender_string[0];
00286
00287 own_itoa(id_receiver_int,id_receiver_string);
00288 message_send[1]=id_receiver_string[0];
00289
00290 own_itoa(message_type_int,message_type_string);
00291 message_send[2]=message_type_string[0];
00292
00293
00294
00295
00296
00297 k = 2;
00298
00299 if ((message_type_int>=1) && (message_type_int<=6)) {
00300
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
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
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
00334 lnp_integrity_write((unsigned char *)message_send,message_len);
00335
00336 return 0;
00337 }
00338
00339
00340
00341
00342
00343 int init_com(int id) {
00344
00345 COM_ID=id;
00346
00347
00348
00349 if ( lnp_init(0,0,0,0,0) )
00350 {
00351
00352 printf("error lnp \n");
00353 exit(1);
00354
00355 }
00356 else fprintf(stderr,"init OK\n");
00357
00358
00359
00360
00361
00362 lnp_integrity_set_handler(port_handler);
00363
00364
00365
00366
00367
00368 ReadFromIrThread *readthread = new ReadFromIrThread();
00369 readthread->Create();
00370 readthread->Run();
00371
00372 return 0;
00373 }