00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __WPROGRAM_H__
00025
00026 #include <WaspClasses.h>
00027 #endif
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 void WaspXBeeCore::init(uint8_t protocol_used, uint8_t frequency, uint8_t model_used)
00038 {
00039 protocol=protocol_used;
00040 freq=frequency;
00041 model=model_used;
00042
00043 totalFragmentsReceived=0;
00044 pendingPackets=0;
00045 pos=0;
00046 discoveryOptions=0x00;
00047 if(protocol==XBEE_802_15_4)
00048 {
00049 awakeTime[0]=AWAKE_TIME_802_15_4_H;
00050 awakeTime[1]=AWAKE_TIME_802_15_4_L;
00051 sleepTime[0]=SLEEP_TIME_802_15_4_H;
00052 sleepTime[1]=SLEEP_TIME_802_15_4_L;
00053 scanTime[0]=SCAN_TIME_802_15_4;
00054 scanChannels[0]=SCAN_CHANNELS_802_15_4_H;
00055 scanChannels[1]=SCAN_CHANNELS_802_15_4_L;
00056 encryptMode=ENCRYPT_MODE_802_15_4;
00057 powerLevel=POWER_LEVEL_802_15_4;
00058 timeRSSI=TIME_RSSI_802_15_4;
00059 sleepOptions=SLEEP_OPTIONS_802_15_4;
00060 }
00061 if(protocol==ZIGBEE)
00062 {
00063 awakeTime[0]=AWAKE_TIME_ZIGBEE_H;
00064 awakeTime[1]=AWAKE_TIME_ZIGBEE_L;
00065 sleepTime[0]=SLEEP_TIME_ZIGBEE_H;
00066 sleepTime[1]=SLEEP_TIME_ZIGBEE_L;
00067 scanTime[0]=SCAN_TIME_ZIGBEE;
00068 scanChannels[0]=SCAN_CHANNELS_ZIGBEE_H;
00069 scanChannels[1]=SCAN_CHANNELS_ZIGBEE_L;
00070 timeEnergyChannel=TIME_ENERGY_CHANNEL_ZIGBEE;
00071 encryptMode=ENCRYPT_MODE_ZIGBEE;
00072 powerLevel=POWER_LEVEL_ZIGBEE;
00073 timeRSSI=TIME_RSSI_ZIGBEE;
00074 sleepOptions=SLEEP_OPTIONS_ZIGBEE;
00075 }
00076 if(protocol==DIGIMESH)
00077 {
00078 awakeTime[0]=AWAKE_TIME_DIGIMESH_H;
00079 awakeTime[1]=AWAKE_TIME_DIGIMESH_M;
00080 awakeTime[2]=AWAKE_TIME_DIGIMESH_L;
00081 sleepTime[0]=SLEEP_TIME_DIGIMESH_H;
00082 sleepTime[1]=SLEEP_TIME_DIGIMESH_M;
00083 sleepTime[2]=SLEEP_TIME_DIGIMESH_L;
00084 scanTime[0]=SCAN_TIME_DIGIMESH_H;
00085 scanTime[1]=SCAN_TIME_DIGIMESH_L;
00086 encryptMode=ENCRYPT_MODE_DIGIMESH;
00087 powerLevel=POWER_LEVEL_DIGIMESH;
00088 timeRSSI=TIME_RSSI_DIGIMESH;
00089 sleepOptions=SLEEP_OPTIONS_DIGIMESH;
00090 }
00091
00092 data_length=0;
00093 it=0;
00094 start=0;
00095 finish=0;
00096 add_type=0;
00097 mode=0;
00098 frag_length=0;
00099 TIME1=0;
00100 nextIndex1=0;
00101 frameNext=0;
00102 replacementPolicy=XBEE_OUT;
00103 indexNotModified=1;
00104 error_AT=2;
00105 error_RX=2;
00106 error_TX=2;
00107 clearFinishArray();
00108 clearCommand();
00109 apsEncryption=0;
00110 }
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 uint8_t WaspXBeeCore::getOwnMacLow()
00122 {
00123 int8_t error=2;
00124
00125 error_AT=2;
00126 gen_data(get_own_mac_low);
00127 error=gen_send(get_own_mac_low);
00128
00129 if(error==0)
00130 {
00131 for(it=0;it<4;it++)
00132 {
00133 sourceMacLow[it]=data[it];
00134 }
00135 }
00136 return error;
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 uint8_t WaspXBeeCore::getOwnMacHigh()
00149 {
00150 int8_t error=2;
00151
00152 error_AT=2;
00153 gen_data(get_own_mac_high);
00154 error=gen_send(get_own_mac_high);
00155
00156 if(error==0)
00157 {
00158 for(it=0;it<4;it++)
00159 {
00160 sourceMacHigh[it]=data[it];
00161 }
00162 }
00163 return error;
00164 }
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 uint8_t WaspXBeeCore::getOwnMac()
00175 {
00176 int8_t error=2;
00177 error=getOwnMacLow();
00178 if(error==0)
00179 {
00180 error=getOwnMacHigh();
00181 }
00182 return error;
00183 }
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 uint8_t WaspXBeeCore::setOwnNetAddress(uint8_t NA_H, uint8_t NA_L)
00198 {
00199 int8_t error=2;
00200
00201 if(protocol==XBEE_802_15_4)
00202 {
00203 error_AT=2;
00204 gen_data(set_own_net_address,NA_H,NA_L);
00205 gen_checksum(set_own_net_address);
00206 error=gen_send(set_own_net_address);
00207 }
00208 else
00209 {
00210 error_AT=-1;
00211 error=-1;
00212 }
00213
00214 if(!error)
00215 {
00216 sourceNA[0]=NA_H;
00217 sourceNA[1]=NA_L;
00218 }
00219 return error;
00220 }
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 uint8_t WaspXBeeCore::getOwnNetAddress()
00233 {
00234 int8_t error=2;
00235
00236
00237 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) )
00238 {
00239 error_AT=2;
00240 gen_data(get_own_net_address);
00241 error=gen_send(get_own_net_address);
00242 }
00243 else
00244 {
00245 error_AT=-1;
00246 error=-1;
00247 }
00248
00249 if(!error)
00250 {
00251 sourceNA[0]=data[0];
00252 sourceNA[1]=data[1];
00253 }
00254 return error;
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 uint8_t WaspXBeeCore::setBaudrate(uint8_t baud_rate)
00269 {
00270 int8_t error=2;
00271
00272 error_AT=2;
00273 gen_data(set_baudrate,baud_rate);
00274 gen_checksum(set_baudrate);
00275 error=gen_send(set_baudrate);
00276
00277 if(!error)
00278 {
00279 baudrate=baud_rate;
00280 }
00281 return error;
00282 }
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295 uint8_t WaspXBeeCore::setAPI(uint8_t api_value)
00296 {
00297 int8_t error=2;
00298
00299 error_AT=2;
00300 gen_data(set_api_mode,api_value);
00301 gen_checksum(set_api_mode);
00302 error=gen_send(set_api_mode);
00303
00304 if(!error)
00305 {
00306 apiValue=api_value;
00307 }
00308 return error;
00309 }
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321 uint8_t WaspXBeeCore::setAPIoptions(uint8_t api_options)
00322 {
00323 int8_t error=2;
00324
00325 if( (protocol!=XBEE_802_15_4) )
00326 {
00327 error_AT=2;
00328 gen_data(set_api_options,api_options);
00329 gen_checksum(set_api_options);
00330 error=gen_send(set_api_options);
00331 }
00332 else
00333 {
00334 error_AT=-1;
00335 error=-1;
00336 }
00337 return error;
00338 }
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350 uint8_t WaspXBeeCore::setPAN(uint8_t* PANID)
00351 {
00352 int8_t error=2;
00353
00354 if( (protocol==XBEE_802_15_4) || (protocol==DIGIMESH) || (protocol==XBEE_900) || (protocol==XBEE_868) )
00355 {
00356 error_AT=2;
00357 gen_data(set_pan,PANID);
00358 gen_checksum(set_pan);
00359 error=gen_send(set_pan);
00360 }
00361
00362 if(protocol==ZIGBEE)
00363 {
00364 error_AT=2;
00365 gen_data(set_pan_zb,PANID);
00366 gen_checksum(set_pan_zb);
00367 error=gen_send(set_pan_zb);
00368 }
00369
00370 if(!error)
00371 {
00372 if( (protocol==XBEE_802_15_4) || (protocol==DIGIMESH) || (protocol==XBEE_900) || (protocol==XBEE_868) )
00373 {
00374 for(it=0;it<2;it++)
00375 {
00376 PAN_ID[it]=PANID[it];
00377 }
00378 }
00379 if(protocol==ZIGBEE)
00380 {
00381 for(it=0;it<8;it++)
00382 {
00383 PAN_ID[it]=PANID[it];
00384 }
00385 }
00386 }
00387 return error;
00388 }
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399 uint8_t WaspXBeeCore::getPAN()
00400 {
00401 int8_t error=2;
00402
00403 error_AT=2;
00404 gen_data(get_pan);
00405 if( protocol==ZIGBEE ) error=gen_send(get_pan);
00406 else error=gen_send(get_pan);
00407
00408 if(!error)
00409 {
00410 if( (protocol==XBEE_802_15_4) || (protocol==DIGIMESH) || (protocol==XBEE_900) || (protocol==XBEE_868) )
00411 {
00412 for(it=0;it<2;it++)
00413 {
00414 PAN_ID[it]=data[it];
00415 delay(20);
00416 }
00417 }
00418 if(protocol==ZIGBEE)
00419 {
00420 for(it=0;it<8;it++)
00421 {
00422 PAN_ID[it]=data[it];
00423 delay(20);
00424 }
00425 }
00426 }
00427 return error;
00428 }
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440 uint8_t WaspXBeeCore::setSleepMode(uint8_t sleep)
00441 {
00442 int8_t error=2;
00443
00444 error_AT=2;
00445 gen_data(set_sleep_mode_xbee,sleep);
00446 gen_checksum(set_sleep_mode_xbee);
00447 error=gen_send(set_sleep_mode_xbee);
00448
00449 if(!error)
00450 {
00451 sleepMode=sleep;
00452 }
00453 return error;
00454 }
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464 uint8_t WaspXBeeCore::getSleepMode()
00465 {
00466 int8_t error=2;
00467
00468 error_AT=2;
00469 gen_data(get_sleep_mode_xbee);
00470 error=gen_send(get_sleep_mode_xbee);
00471
00472 if(error==0)
00473 {
00474 sleepMode=data[0];
00475 }
00476 return error;
00477 }
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490 uint8_t WaspXBeeCore::setAwakeTime(uint8_t* awake)
00491 {
00492 int8_t error=2;
00493
00494 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) || (protocol==XBEE_868) )
00495 {
00496 error_AT=2;
00497 gen_data(set_awake_time,awake);
00498 gen_checksum(set_awake_time);
00499 error=gen_send(set_awake_time);
00500 }
00501
00502 if( (protocol==DIGIMESH) || (protocol==XBEE_900) )
00503 {
00504 error_AT=2;
00505 gen_data(set_awake_time_DM,awake);
00506 gen_checksum(set_awake_time_DM);
00507 error=gen_send(set_awake_time_DM);
00508 }
00509
00510 if(!error)
00511 {
00512 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) || (protocol==XBEE_868) )
00513 {
00514 awakeTime[0]=awake[0];
00515 awakeTime[1]=awake[1];
00516 }
00517 if( (protocol==DIGIMESH) || (protocol==XBEE_900) )
00518 {
00519 awakeTime[0]=awake[0];
00520 awakeTime[1]=awake[1];
00521 awakeTime[2]=awake[2];
00522 }
00523 }
00524 return error;
00525 }
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538 uint8_t WaspXBeeCore::setSleepTime(uint8_t* sleep)
00539 {
00540 int8_t error=2;
00541
00542 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) || (protocol==XBEE_868) )
00543 {
00544 error_AT=2;
00545 gen_data(set_sleep_time,sleep);
00546 gen_checksum(set_sleep_time);
00547 error=gen_send(set_sleep_time);
00548 }
00549
00550 if( (protocol==DIGIMESH) || (protocol==XBEE_900) )
00551 {
00552 error_AT=2;
00553 gen_data(set_sleep_time_DM,sleep);
00554 gen_checksum(set_sleep_time_DM);
00555 error=gen_send(set_sleep_time_DM);
00556 }
00557
00558 if(!error)
00559 {
00560 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) || (protocol==XBEE_868) )
00561 {
00562 sleepTime[0]=sleep[0];
00563 sleepTime[1]=sleep[1];
00564 }
00565 if( (protocol==DIGIMESH) || (protocol==XBEE_900) )
00566 {
00567 sleepTime[0]=sleep[0];
00568 sleepTime[1]=sleep[1];
00569 sleepTime[2]=sleep[2];
00570 }
00571 }
00572 return error;
00573 }
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586 uint8_t WaspXBeeCore::setChannel(uint8_t _channel)
00587 {
00588 int8_t error=2;
00589
00590
00591 if( (protocol==XBEE_802_15_4) || (protocol==DIGIMESH) || (protocol==XBEE_900) )
00592 {
00593 error_AT=2;
00594 gen_data(set_channel,_channel);
00595 gen_checksum(set_channel);
00596 error=gen_send(set_channel);
00597 }
00598 else
00599 {
00600 error_AT=-1;
00601 error=-1;
00602 }
00603 if(!error)
00604 {
00605 channel=_channel;
00606 }
00607
00608 return error;
00609 }
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619 uint8_t WaspXBeeCore::getChannel()
00620 {
00621 int8_t error=2;
00622
00623 error_AT=2;
00624 gen_data(get_channel);
00625 error=gen_send(get_channel);
00626
00627 if(!error)
00628 {
00629 channel=data[0];
00630 }
00631 return error;
00632 }
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646 uint8_t WaspXBeeCore::setNodeIdentifier(char* node)
00647 {
00648 uint8_t* NI = (uint8_t*) calloc(30,sizeof(uint8_t));
00649 NI[0]=0x7E;
00650 NI[1]=0x00;
00651 NI[3]=0x08;
00652 NI[4]=0x52;
00653 NI[5]=0x4E;
00654 NI[6]=0x49;
00655 uint8_t num_NI;
00656 int8_t error=2;
00657 uint8_t* ByteIN = (uint8_t*) calloc(20,sizeof(uint8_t));
00658
00659 uint8_t counter=0;
00660 uint8_t counter3=0;
00661 uint8_t est=1;
00662 uint8_t frame_ID=NI[4];
00663 uint8_t end=0;
00664 uint16_t interval=WAIT_TIME;
00665 uint8_t checksum=0;
00666 uint8_t numberBytes=9;
00667 uint8_t status=0;
00668 uint8_t undesired=0;
00669
00670
00671 it=0;
00672 error_AT=2;
00673 while( (node[it]!='\0') )
00674 {
00675 NI[it+7]=uint8_t(node[it]);
00676 it++;
00677 }
00678 NI[2]=4+it;
00679 for(it=3;it<(7+(NI[2]-4));it++)
00680 {
00681 checksum=checksum+NI[it];
00682 }
00683 while( (checksum>255))
00684 {
00685 checksum=checksum-256;
00686 }
00687 checksum=255-checksum;
00688 NI[7+NI[2]-4]=checksum;
00689 while(counter<(8+NI[2]-4))
00690 {
00691 XBee.print(NI[counter], BYTE);
00692 counter++;
00693 }
00694 counter=0;
00695 clearCommand();
00696 command[5]=0x4E;
00697 command[6]=0x49;
00698 error=parse_message(command);
00699
00700 if(error==0)
00701 {
00702 for(it=0;it<NI[2]-4;it++)
00703 {
00704 nodeID[it]=node[it];
00705 }
00706 }
00707 free(NI);
00708 free(ByteIN);
00709 NI=NULL;
00710 ByteIN=NULL;
00711 return error;
00712 }
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722 uint8_t WaspXBeeCore::getNodeIdentifier()
00723 {
00724 int8_t error=2;
00725
00726 error_AT=2;
00727 gen_data(get_NI);
00728 error=gen_send(get_NI);
00729
00730 if(!error)
00731 {
00732 for(it=0;it<data_length;it++)
00733 {
00734 nodeID[it]=char(data[it]);
00735 }
00736 }
00737 return error;
00738 }
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749 uint8_t WaspXBeeCore::scanNetwork()
00750 {
00751 uint8_t error=2;
00752
00753 error_AT=2;
00754 totalScannedBrothers=0;
00755 gen_data(scan_network);
00756 error=gen_send(scan_network);
00757
00758 return error;
00759 }
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772 uint8_t WaspXBeeCore::scanNetwork(char* node)
00773 {
00774 uint8_t* ND = (uint8_t*) calloc(30,sizeof(uint8_t));
00775 ND[0]=0x7E;
00776 ND[1]=0x00;
00777 ND[3]=0x08;
00778 ND[4]=0x52;
00779 ND[5]=0x4E;
00780 ND[6]=0x44;
00781 uint8_t num_ND;
00782 int8_t error=2;
00783 uint8_t* ByteIN = (uint8_t*) calloc(20,sizeof(uint8_t));
00784
00785 uint8_t cont=1;
00786 uint8_t cont2=0;
00787 uint8_t counter=0;
00788 uint8_t counter3=0;
00789 uint8_t est=1;
00790 uint8_t frame_ID=ND[4];
00791 uint8_t end=0;
00792 uint16_t interval=WAIT_TIME2;
00793 uint16_t length=0;
00794 uint16_t aux=0;
00795 uint8_t existsNI=0;
00796 uint8_t length_NI=0;
00797 uint16_t checksum=0;
00798 uint8_t finish=0;
00799
00800 error_AT=2;
00801 totalScannedBrothers=0;
00802 if( (protocol==DIGIMESH) || (protocol==XBEE_900) || (protocol==XBEE_868) )
00803 {
00804 interval=14000;
00805 }
00806 it=0;
00807 while( (node[it]!='\0') )
00808 {
00809 ND[it+7]=uint8_t(node[it]);
00810 it++;
00811 }
00812 ND[2]=4+it;
00813 for(it=3;it<(7+(ND[2]-4));it++)
00814 {
00815 checksum=checksum+ND[it];
00816 }
00817 while( (checksum>255))
00818 {
00819 checksum=checksum-256;
00820 }
00821 checksum=255-checksum;
00822 ND[7+ND[2]-4]=checksum;
00823 while(counter<(8+ND[2]-4))
00824 {
00825 XBee.print(ND[counter], BYTE);
00826 counter++;
00827 }
00828 counter=0;
00829 clearCommand();
00830 command[5]=ND[5];
00831 command[6]=ND[6];
00832 error=parse_message(command);
00833
00834 free(ND);
00835 free(ByteIN);
00836 ND=NULL;
00837 ByteIN=NULL;
00838 return error;
00839 }
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853 uint8_t WaspXBeeCore::setScanningTime(uint8_t* time)
00854 {
00855 int8_t error=2;
00856
00857 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) || (protocol==XBEE_900) )
00858 {
00859 error_AT=2;
00860 gen_data(set_scanning_time,time);
00861 gen_checksum(set_scanning_time);
00862 error=gen_send(set_scanning_time);
00863 }
00864
00865 if( (protocol==DIGIMESH) || (protocol==XBEE_868) )
00866 {
00867 error_AT=2;
00868 gen_data(set_scanning_time_DM,time);
00869 gen_checksum(set_scanning_time_DM);
00870 error=gen_send(set_scanning_time_DM);
00871 }
00872
00873
00874 if(!error)
00875 {
00876 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) || (protocol==XBEE_900) )
00877 {
00878 scanTime[0]=time[0];
00879 }
00880 if( (protocol==DIGIMESH) || (protocol==XBEE_868) )
00881 {
00882 scanTime[0]=time[0];
00883 scanTime[1]=time[1];
00884 }
00885 }
00886 return error;
00887 }
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898 uint8_t WaspXBeeCore::getScanningTime()
00899 {
00900 int8_t error=2;
00901
00902 error_AT=2;
00903 gen_data(get_scanning_time);
00904 if( (protocol==DIGIMESH) || (protocol==XBEE_868) || (protocol==ZIGBEE) || (protocol==XBEE_900) ) error=gen_send(get_scanning_time);
00905 else error=gen_send(get_scanning_time);
00906
00907 if(!error)
00908 {
00909 if( (protocol==XBEE_802_15_4) )
00910 {
00911 scanTime[0]=data[0];
00912 }
00913 if( (protocol==ZIGBEE) || (protocol==XBEE_900) )
00914 {
00915 scanTime[0]=data[1];
00916 }
00917 if( (protocol==DIGIMESH) || (protocol==XBEE_868) )
00918 {
00919 scanTime[0]=data[0];
00920 scanTime[1]=data[1];
00921 }
00922 }
00923 return error;
00924 }
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936 uint8_t WaspXBeeCore::setDiscoveryOptions(uint8_t options)
00937 {
00938 int8_t error=2;
00939
00940 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) )
00941 {
00942 error_AT=2;
00943 gen_data(set_discov_options,options);
00944 gen_checksum(set_discov_options);
00945 error=gen_send(set_discov_options);
00946 }
00947 else
00948 {
00949 error_AT=-1;
00950 error=-1;
00951 }
00952 if(!error)
00953 {
00954 discoveryOptions=options;
00955 }
00956 return error;
00957 }
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967 uint8_t WaspXBeeCore::getDiscoveryOptions()
00968 {
00969 int8_t error=2;
00970
00971 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) )
00972 {
00973 error_AT=2;
00974 gen_data(get_discov_options);
00975 error=gen_send(get_discov_options);
00976 }
00977 else
00978 {
00979 error_AT=-1;
00980 error=-1;
00981 }
00982 if(error==0)
00983 {
00984 discoveryOptions=data[0];
00985 }
00986 return error;
00987 }
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003 uint8_t WaspXBeeCore::nodeSearch(char* node, struct packetXBee* paq)
01004 {
01005 uint8_t* DN = (uint8_t*) calloc(30,sizeof(uint8_t));
01006 DN[0]=0x7E;
01007 DN[1]=0x00;
01008 DN[3]=0x08;
01009 DN[4]=0x52;
01010 DN[5]=0x44;
01011 DN[6]=0x4E;
01012 uint8_t num_DN;
01013 int8_t error=2;
01014 uint8_t* ByteIN = (uint8_t*) calloc(25,sizeof(uint8_t));
01015
01016 uint8_t counter=0;
01017 uint8_t counter3=0;
01018 uint8_t est=1;
01019 uint8_t frame_ID=DN[4];
01020 uint8_t end=0;
01021 uint16_t interval=2000;
01022 uint8_t checksum=0;
01023 uint8_t status=0;
01024 uint8_t undesired=0;
01025
01026
01027 error_AT=2;
01028 if(protocol==DIGIMESH)
01029 {
01030 interval=14000;
01031 }
01032 it=0;
01033 while( (node[it]!='\0') )
01034 {
01035 DN[it+7]=uint8_t(node[it]);
01036 it++;
01037 }
01038 DN[2]=4+it;
01039 for(it=3;it<(7+(DN[2]-4));it++)
01040 {
01041 checksum=checksum+DN[it];
01042 }
01043 while( (checksum>255))
01044 {
01045 checksum=checksum-256;
01046 }
01047 checksum=255-checksum;
01048 DN[7+DN[2]-4]=checksum;
01049 while(counter<(8+DN[2]-4))
01050 {
01051 XBee.print(DN[counter], BYTE);
01052 counter++;
01053 }
01054
01055 counter=0;
01056 clearCommand();
01057 command[5]=0x44;
01058 command[6]=0x4E;
01059 error=parse_message(command);
01060
01061 if(error==0)
01062 {
01063 if( (protocol==ZIGBEE) || (protocol==XBEE_900) || (protocol==XBEE_868) )
01064 {
01065 for(it=0;it<2;it++)
01066 {
01067 paq->naD[it]=data[it];
01068 }
01069 for(it=0;it<4;it++)
01070 {
01071 paq->macDH[it]=data[it+2];
01072 }
01073 for(it=0;it<4;it++)
01074 {
01075 paq->macDL[it]=data[it+6];
01076 }
01077 }
01078 if(protocol==DIGIMESH)
01079 {
01080 for(it=0;it<4;it++)
01081 {
01082 paq->macDH[it]=data[it];
01083 }
01084 for(it=0;it<4;it++)
01085 {
01086 paq->macDL[it]=data[it+4];
01087 }
01088 }
01089 }
01090 free(DN);
01091 free(ByteIN);
01092 DN=NULL;
01093 ByteIN=NULL;
01094 return error;
01095 }
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105 uint8_t WaspXBeeCore::writeValues()
01106 {
01107 int8_t error=2;
01108
01109 error_AT=2;
01110 gen_data(write_values);
01111 error=gen_send(write_values);
01112
01113 return error;
01114 }
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128 uint8_t WaspXBeeCore::setScanningChannels(uint8_t channel_H, uint8_t channel_L)
01129 {
01130 int8_t error=2;
01131
01132 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) )
01133 {
01134 error_AT=2;
01135 gen_data(set_scanning_channel,channel_H,channel_L);
01136 gen_checksum(set_scanning_channel);
01137 error=gen_send(set_scanning_channel);
01138 }
01139 else
01140 {
01141 error_AT=-1;
01142 error=-1;
01143 }
01144 if(error==0)
01145 {
01146 scanChannels[0]=channel_H;
01147 scanChannels[1]=channel_L;
01148 }
01149 return error;
01150 }
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161 uint8_t WaspXBeeCore::getScanningChannels()
01162 {
01163 int8_t error=2;
01164
01165 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) )
01166 {
01167 error_AT=2;
01168 gen_data(get_scanning_channel);
01169 error=gen_send(get_scanning_channel);
01170 }
01171 else
01172 {
01173 error_AT=-1;
01174 error=-1;
01175 }
01176 if(error==0)
01177 {
01178 for(it=0;it<2;it++)
01179 {
01180 scanChannels[it]=data[it];
01181 }
01182 }
01183 return error;
01184 }
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197 uint8_t WaspXBeeCore::setDurationEnergyChannels(uint8_t duration)
01198 {
01199 int8_t error=2;
01200
01201 if( (protocol==XBEE_802_15_4) )
01202 {
01203 error_AT=2;
01204 gen_data(set_duration_energy,duration);
01205 gen_checksum(set_duration_energy);
01206 error=gen_send(set_duration_energy);
01207 }
01208 else if( (protocol==ZIGBEE) )
01209 {
01210 error_AT=2;
01211 gen_data(set_duration_energy_ZB,duration);
01212 gen_checksum(set_duration_energy_ZB);
01213 error=gen_send(set_duration_energy_ZB);
01214 }
01215 else
01216 {
01217 error_AT=-1;
01218 error=-1;
01219 }
01220
01221 if(error==0)
01222 {
01223 if(protocol==XBEE_802_15_4)
01224 {
01225 for(it=0;it<data_length;it++)
01226 {
01227 energyChannel[it]=data[it];
01228 }
01229 }
01230 if(protocol==ZIGBEE)
01231 {
01232 timeEnergyChannel=data[0];
01233 }
01234 }
01235 return error;
01236 }
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248 uint8_t WaspXBeeCore::getDurationEnergyChannels()
01249 {
01250 int8_t error=2;
01251
01252 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) )
01253 {
01254 error_AT=2;
01255 gen_data(get_duration_energy);
01256 error=gen_send(get_duration_energy);
01257 }
01258 else
01259 {
01260 error_AT=-1;
01261 error=-1;
01262 }
01263 if(!error)
01264 {
01265 timeEnergyChannel=data[0];
01266 }
01267 return error;
01268 }
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280 uint8_t WaspXBeeCore::setLinkKey(char* key)
01281 {
01282 int8_t error=2;
01283
01284 error_AT=2;
01285 gen_data(set_link_key,key);
01286 gen_checksum(set_link_key);
01287 error=gen_send(set_link_key);
01288
01289 if(!error)
01290 {
01291 for(it=0;it<16;it++)
01292 {
01293 linkKey[it]=char(key[it]);
01294 }
01295 }
01296 return error;
01297 }
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309 uint8_t WaspXBeeCore::encryptionMode(uint8_t mode)
01310 {
01311 int8_t error=2;
01312
01313 error_AT=2;
01314 gen_data(set_encryption,mode);
01315 gen_checksum(set_encryption);
01316 error=gen_send(set_encryption);
01317 if(!error)
01318 {
01319 encryptMode=mode;
01320 }
01321 return error;
01322 }
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334 uint8_t WaspXBeeCore::setPowerLevel(uint8_t value)
01335 {
01336 int8_t error=2;
01337
01338 if(protocol!=XBEE_900)
01339 {
01340 error_AT=2;
01341 gen_data(set_power_level,value);
01342 gen_checksum(set_power_level);
01343 error=gen_send(set_power_level);
01344 }
01345 if(!error)
01346 {
01347 powerLevel=value;
01348 }
01349 return error;
01350 }
01351
01352
01353
01354
01355
01356
01357
01358
01359
01360 uint8_t WaspXBeeCore::getRSSI()
01361 {
01362 int8_t error=2;
01363 uint8_t* ByteIN = (uint8_t*) calloc(40,sizeof(uint8_t));
01364 uint8_t i=0;
01365
01366 if( (protocol == XBEE_802_15_4 ) || (protocol==ZIGBEE) )
01367 {
01368 error_AT=2;
01369 gen_data(get_RSSI);
01370 error=gen_send(get_RSSI);
01371 }
01372 else if( (protocol== DIGIMESH) || (protocol==XBEE_868) || (protocol==XBEE_900) )
01373 {
01374 delay(2000);
01375 XBee.print("+++");
01376 delay(2000);
01377 XBee.flush();
01378 XBee.println("atdb");
01379 delay(1000);
01380 error_AT=2;
01381 while(XBee.available()>0)
01382 {
01383 ByteIN[i]=XBee.read();
01384 error=0;
01385 i++;
01386 error_AT=0;
01387 }
01388 i=0;
01389 XBee.println("atcn");
01390 delay(1000);
01391 valueRSSI[0]=Utils.str2hex(ByteIN);
01392 }
01393 if(error==0)
01394 {
01395 if( (protocol==XBEE_802_15_4) || (protocol==ZIGBEE) )
01396 {
01397 valueRSSI[0]=data[0];
01398 }
01399 }
01400 free(ByteIN);
01401 ByteIN=NULL;
01402 return error;
01403 }
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413 uint8_t WaspXBeeCore::getHardVersion()
01414 {
01415 int8_t error=2;
01416
01417 error_AT=2;
01418 gen_data(get_hard_version);
01419 error=gen_send(get_hard_version);
01420 if(!error)
01421 {
01422 hardVersion[0]=data[0];
01423 hardVersion[1]=data[1];
01424 }
01425 return error;
01426 }
01427
01428
01429
01430
01431
01432
01433
01434
01435
01436 uint8_t WaspXBeeCore::getSoftVersion()
01437 {
01438 int8_t error=2;
01439
01440 error_AT=2;
01441 gen_data(get_soft_version);
01442 error=gen_send(get_soft_version);
01443 if(error==0)
01444 {
01445 softVersion[0]=data[0];
01446 softVersion[1]=data[1];
01447 }
01448 return error;
01449 }
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460
01461
01462 uint8_t WaspXBeeCore::setRSSItime(uint8_t time)
01463 {
01464 int8_t error=2;
01465
01466 error_AT=2;
01467 gen_data(set_RSSI_time,time);
01468 gen_checksum(set_RSSI_time);
01469 error=gen_send(set_RSSI_time);
01470 if(!error)
01471 {
01472 timeRSSI=time;
01473 }
01474 return error;
01475 }
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485 uint8_t WaspXBeeCore::getRSSItime()
01486 {
01487 int8_t error=2;
01488
01489 error_AT=2;
01490 gen_data(get_RSSI_time);
01491 error=gen_send(get_RSSI_time);
01492 if(!error)
01493 {
01494 timeRSSI=data[0];
01495 }
01496 return error;
01497 }
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507 uint8_t WaspXBeeCore::applyChanges()
01508 {
01509 int8_t error=2;
01510
01511 error_AT=2;
01512 gen_data(apply_changes);
01513 error=gen_send(apply_changes);
01514 return error;
01515 }
01516
01517
01518
01519
01520
01521
01522
01523
01524
01525
01526 uint8_t WaspXBeeCore::reset()
01527 {
01528 int8_t error=2;
01529
01530 error_AT=2;
01531 gen_data(reset_xbee);
01532 error=gen_send(reset_xbee);
01533 return error;
01534 }
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544 uint8_t WaspXBeeCore::resetDefaults()
01545 {
01546 int8_t error=2;
01547
01548 error_AT=2;
01549 gen_data(reset_defaults_xbee);
01550 error=gen_send(reset_defaults_xbee);
01551 return error;
01552 }
01553
01554
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565 uint8_t WaspXBeeCore::setSleepOptions(uint8_t soption)
01566 {
01567 int8_t error=2;
01568
01569 if( (protocol==ZIGBEE) || (protocol==DIGIMESH) || (protocol==XBEE_900) || (protocol==XBEE_868) )
01570 {
01571 error_AT=2;
01572 gen_data(set_sleep_options_xbee,soption);
01573 gen_checksum(set_sleep_options_xbee);
01574 error=gen_send(set_sleep_options_xbee);
01575 }
01576 else
01577 {
01578 error_AT=-1;
01579 error=-1;
01580 }
01581 if(!error)
01582 {
01583 sleepOptions=soption;
01584 }
01585 return error;
01586 }
01587
01588
01589
01590
01591
01592
01593
01594
01595
01596
01597 uint8_t WaspXBeeCore::getSleepOptions()
01598 {
01599 int8_t error=2;
01600
01601 if( (protocol==ZIGBEE) || (protocol==DIGIMESH) || (protocol==XBEE_900) || (protocol==XBEE_868) )
01602 {
01603 error_AT=2;
01604 gen_data(get_sleep_options_xbee);
01605 error=gen_send(get_sleep_options_xbee);
01606 }
01607 else
01608 {
01609 error_AT=-1;
01610 error=-1;
01611 }
01612 if(!error)
01613 {
01614 sleepOptions=data[0];
01615 }
01616 return error;
01617 }
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628 uint8_t WaspXBeeCore::sendCommandAT(char* atcommand)
01629 {
01630 uint8_t* AT = (uint8_t*) calloc(30,sizeof(uint8_t));
01631 AT[0]=0x7E;
01632 AT[1]=0x00;
01633 AT[3]=0x08;
01634 AT[4]=0x52;
01635 uint8_t num_AT=0;
01636 int8_t error=2;
01637
01638 uint8_t* ByteIN = (uint8_t*) calloc(120,sizeof(uint8_t));
01639 uint8_t counter=0;
01640 uint8_t counter3=0;
01641 uint8_t est=1;
01642 uint8_t frame_ID=AT[4];
01643 uint8_t end=0;
01644 uint16_t interval=WAIT_TIME;
01645 uint8_t checksum=0;
01646 uint16_t length=0;
01647
01648
01649 it=0;
01650 error_AT=2;
01651 while((int(atcommand[it]))!='#')
01652 {
01653 AT[it+5]=int(atcommand[it]);
01654 it++;
01655 }
01656 length=it;
01657 AT[2]=2+length;
01658 for(it=3;it<(5+length);it++)
01659 {
01660 checksum=checksum+AT[it];
01661 }
01662 while( (checksum>255))
01663 {
01664 checksum=checksum-256;
01665 }
01666 checksum=255-checksum;
01667 AT[5+length]=checksum;
01668 while(counter<(6+length))
01669 {
01670 XBee.print(AT[counter], BYTE);
01671 counter++;
01672 }
01673 counter=0;
01674 clearCommand();
01675 command[5]=AT[5];
01676 command[6]=AT[6];
01677 data_length=0;
01678 error=parse_message(command);
01679 if(error==0)
01680 {
01681 if(data_length>0)
01682 {
01683 for(it=0;it<data_length;it++)
01684 {
01685 commandAT[it]=data[it];
01686 delay(20);
01687 }
01688 }
01689 else
01690 {
01691 commandAT[0]=0x4F;
01692 commandAT[1]=0x4B;
01693 }
01694 }
01695 return error;
01696 }
01697
01698
01699
01700
01701
01702
01703
01704
01705 uint8_t WaspXBeeCore::ON()
01706 {
01707 uint8_t error=2;
01708 XBee.begin();
01709 XBee.setMode(XBEE_ON);
01710 if( protocol== ZIGBEE || protocol==XBEE_868 ) delay(500);
01711 else delay(50);
01712 error=0;
01713 XBee_ON=1;
01714 return error;
01715 }
01716
01717
01718
01719
01720
01721
01722
01723
01724
01725 uint8_t WaspXBeeCore::OFF()
01726 {
01727 uint8_t error=2;
01728 XBee.close();
01729 XBee.setMode(XBEE_OFF);
01730 error=0;
01731 XBee_ON=0;
01732 return error;
01733 }
01734
01735
01736
01737
01738
01739
01740
01741
01742
01743 uint8_t WaspXBeeCore::sleep()
01744 {
01745 uint8_t error=2;
01746 pinMode(XBEE_SLEEP, OUTPUT);
01747 digitalWrite(XBEE_SLEEP,HIGH);
01748 XBee.close();
01749 error=0;
01750 return error;
01751 }
01752
01753
01754
01755
01756
01757
01758
01759
01760 uint8_t WaspXBeeCore::wake()
01761 {
01762 uint8_t error=2;
01763 pinMode(XBEE_SLEEP, OUTPUT);
01764 digitalWrite(XBEE_SLEEP,LOW);
01765 XBee.begin();
01766 delay(50);
01767 error=0;
01768 return error;
01769 }
01770
01771
01772
01773
01774
01775
01776
01777
01778
01779
01780
01781 uint8_t WaspXBeeCore::sendXBeePriv(struct packetXBee* packet)
01782 {
01783 uint8_t* TX = (uint8_t*) calloc(120,sizeof(uint8_t));
01784 uint8_t counter=0;
01785 uint8_t counter3=0;
01786 uint8_t num_TX=0;
01787 uint8_t checksum=0;
01788 uint8_t est=1;
01789 uint8_t end=0;
01790 uint16_t interval=2000;
01791 long previous=0;
01792 uint16_t aux=0;
01793 uint16_t aux2=0;
01794 uint8_t protegido=0;
01795 uint8_t a=5;
01796 uint8_t tipo=0;
01797 uint8_t estado=1;
01798 int8_t error=2;
01799 uint8_t* ByteIN = (uint8_t*) calloc(20,sizeof(uint8_t));
01800 uint8_t numberBytes=0;
01801 uint8_t status=0;
01802 uint8_t undesired=0;
01803
01804 clearCommand();
01805
01806 error_TX=2;
01807 for(it=0;it<120;it++)
01808 {
01809 TX[it]=0;
01810 }
01811 TX[0]=0x7E;
01812 TX[1]=0x00;
01813 TX[4]=packet->packetID;
01814 it=0;
01815 error_AT=2;
01816 if(protocol==XBEE_802_15_4)
01817 {
01818 if(packet->mode==BROADCAST)
01819 {
01820 tipo=15;
01821 TX[3]=0x00;
01822 previous=millis();
01823 while( ((error_AT==1) || (error_AT==2)) && (millis()-previous<5000) )
01824 {
01825 estado=setOwnNetAddress(0xFF,0xFF);
01826 }
01827 error=2;
01828 while(a<13)
01829 {
01830 for(it=0;it<4;it++)
01831 {
01832 TX[a]=0x00;
01833 a++;
01834 }
01835 for(it=0;it<2;it++)
01836 {
01837 TX[a]=0x00;
01838 a++;
01839 }
01840 for(it=0;it<2;it++)
01841 {
01842 TX[a]=0xFF;
01843 a++;
01844 }
01845 }
01846 TX[13]=0x00;
01847 TX[14]=packet->packetID;
01848 TX[15]=packet->numFragment;
01849 it=0;
01850 gen_frame(packet,TX,16);
01851 TX[2]=11+packet->frag_length;
01852 for(it=3;it<(TX[2]+3);it++)
01853 {
01854 checksum=checksum+TX[it];
01855 }
01856 while((checksum>255))
01857 {
01858 checksum=checksum-256;
01859 }
01860 checksum=255-checksum;
01861 TX[packet->frag_length+14]=checksum;
01862 }
01863 if(packet->mode==UNICAST)
01864 {
01865 if(packet->address_type==_64B)
01866 {
01867 tipo=15;
01868 TX[3]=0x00;
01869 while(a<13)
01870 {
01871 for(it=0;it<4;it++)
01872 {
01873 TX[a]=packet->macDH[it];
01874 a++;
01875 }
01876 for(it=0;it<4;it++)
01877 {
01878 TX[a]=packet->macDL[it];
01879 a++;
01880 }
01881 }
01882 previous=millis();
01883
01884 while( ((error_AT==1) || (error_AT==2)) && (millis()-previous<5000) )
01885 {
01886 estado=setOwnNetAddress(0xFF,0xFF);
01887 }
01888 error=2;
01889 TX[13]=0x00;
01890 TX[14]=packet->packetID;
01891 TX[15]=packet->numFragment;
01892 it=0;
01893 gen_frame(packet,TX,16);
01894 TX[2]=11+packet->frag_length;
01895 for(it=3;it<(TX[2]+3);it++)
01896 {
01897 checksum=checksum+TX[it];
01898 }
01899 while((checksum>255))
01900 {
01901 checksum=checksum-256;
01902 }
01903 checksum=255-checksum;
01904 TX[packet->frag_length+14]=checksum;
01905 }
01906 if(packet->address_type==_16B)
01907 {
01908 tipo=9;
01909 TX[3]=0x01;
01910 TX[5]=packet->naD[0];
01911 TX[6]=packet->naD[1];
01912 TX[7]=0x00;
01913 TX[8]=packet->packetID;
01914 TX[9]=packet->numFragment;
01915 it=0;
01916 gen_frame(packet,TX,10);
01917 TX[2]=5+packet->frag_length;
01918 for(it=3;it<(TX[2]+3);it++)
01919 {
01920 checksum=checksum+TX[it];
01921 }
01922 while((checksum>255))
01923 {
01924 checksum=checksum-256;
01925 }
01926 checksum=255-checksum;
01927 TX[packet->frag_length+8]=checksum;
01928 }
01929 }
01930 if(packet->mode==SYNC)
01931 {
01932 tipo=15;
01933 TX[3]=0x00;
01934 if(packet->opt==1)
01935 {
01936 previous=millis();
01937 while( ((error_AT==1) || (error_AT==2)) && (millis()-previous<5000) )
01938 {
01939 estado=setOwnNetAddress(0xFF,0xFF);
01940 if( (error_AT==1) || (error_AT==2) )
01941 {
01942 TIME1=millis();
01943 delay(100);
01944 }
01945 }
01946 error=2;
01947 while(a<13)
01948 {
01949 for(it=0;it<4;it++)
01950 {
01951 TX[a]=0x00;
01952 a++;
01953 }
01954 for(it=0;it<2;it++)
01955 {
01956 TX[a]=0x00;
01957 a++;
01958 }
01959 for(it=0;it<2;it++)
01960 {
01961 TX[a]=0xFF;
01962 a++;
01963 }
01964 }
01965 }
01966 else if(packet->opt==0)
01967 {
01968 while(a<13)
01969 {
01970 for(it=0;it<4;it++)
01971 {
01972 TX[a]=packet->macDH[it];
01973 a++;
01974 }
01975 for(it=0;it<4;it++)
01976 {
01977 TX[a]=packet->macDL[it];
01978 a++;
01979 }
01980 }
01981 previous=millis();
01982 while( ((error_AT==1) || (error_AT==2)) && (millis()-previous<5000) )
01983 {
01984 estado=setOwnNetAddress(0xFF,0xFF);
01985 }
01986 }
01987 TX[13]=0x00;
01988 TX[14]=packet->packetID;
01989 TX[15]=packet->numFragment;
01990 it=0;
01991 gen_frame(packet,TX,16);
01992 TX[2]=11+packet->frag_length;
01993 for(it=3;it<(TX[2]+3);it++)
01994 {
01995 checksum=checksum+TX[it];
01996 }
01997 while((checksum>255))
01998 {
01999 checksum=checksum-256;
02000 }
02001 checksum=255-checksum;
02002 TX[packet->frag_length+14]=checksum;
02003 }
02004
02005 gen_frame_ap2(packet,TX,protegido,tipo);
02006
02007 counter=0;
02008
02009 while(counter<(packet->frag_length+tipo+protegido))
02010 {
02011 XBee.print(TX[counter], BYTE);
02012 counter++;
02013 }
02014 counter=0;
02015
02016 command[0]=0xFF;
02017 error=parse_message(command);
02018 packet->deliv_status=delivery_status;
02019 }
02020
02021 if( (protocol==ZIGBEE) || (protocol==DIGIMESH) || (protocol==XBEE_900) || (protocol==XBEE_868) )
02022 {
02023 if( (packet->mode==BROADCAST) || (packet->mode==UNICAST) )
02024 {
02025 if(protocol==XBEE_868)
02026 {
02027 if(packet->frag_length>241)
02028 {
02029 TX[1]=0x01;
02030 aux=packet->frag_length+14;
02031 aux=aux-256;
02032 if(aux>9)
02033 {
02034 switch(aux)
02035 {
02036 case 10: TX[2]=0x0A;
02037 break;
02038 case 11: TX[2]=0x0B;
02039 break;
02040 case 12: TX[2]=0x0C;
02041 break;
02042 case 13: TX[2]=0x0D;
02043 break;
02044 case 14: TX[2]=0x0E;
02045 break;
02046 }
02047 }
02048 else
02049 {
02050 TX[2]=aux;
02051 }
02052 }
02053 else
02054 {
02055 TX[1]=0x00;
02056 TX[2]=14+packet->frag_length;
02057 }
02058 }
02059 else
02060 {
02061 TX[2]=14+packet->frag_length;
02062 }
02063 aux=0;
02064 TX[3]=0x10;
02065 tipo=18;
02066 if(packet->mode==BROADCAST)
02067 {
02068 while(a<13)
02069 {
02070 for(it=0;it<4;it++)
02071 {
02072 TX[a]=0x00;
02073 a++;
02074 }
02075 for(it=0;it<2;it++)
02076 {
02077 TX[a]=0x00;
02078 a++;
02079 }
02080 for(it=0;it<2;it++)
02081 {
02082 TX[a]=0xFF;
02083 a++;
02084 }
02085 }
02086 TX[13]=0xFF;
02087 TX[14]=0xFE;
02088 }
02089 if(packet->mode==UNICAST)
02090 {
02091 while(a<13)
02092 {
02093 for(it=0;it<4;it++)
02094 {
02095 TX[a]=packet->macDH[it];
02096 a++;
02097 }
02098 for(it=0;it<4;it++)
02099 {
02100 TX[a]=packet->macDL[it];
02101 a++;
02102 }
02103 }
02104 if (packet->MY_known==1)
02105 {
02106 for(it=0;it<2;it++)
02107 {
02108 TX[it+13]=packet->naD[it];
02109 }
02110 }
02111 else
02112 {
02113 TX[13]=0xFF;
02114 TX[14]=0xFE;
02115 }
02116 }
02117 if(protocol==XBEE_868)
02118 {
02119 TX[13]=0xFF;
02120 TX[14]=0xFE;
02121 }
02122 TX[15]=hops;
02123 if( apsEncryption) TX[16]=0x20;
02124 else TX[16]=packet->opt;
02125 TX[17]=packet->packetID;
02126 TX[18]=packet->numFragment;
02127 it=0;
02128 gen_frame(packet,TX,19);
02129 for(it=3;it<(TX[2]+3);it++)
02130 {
02131 checksum=checksum+TX[it];
02132 }
02133 while((checksum>255))
02134 {
02135 checksum=checksum-256;
02136 }
02137 checksum=255-checksum;
02138 TX[packet->frag_length+17]=checksum;
02139 }
02140 else
02141 {
02142 if( (protocol==ZIGBEE) || (protocol==XBEE_868) )
02143 {
02144 if(protocol==XBEE_868)
02145 {
02146 if(packet->frag_length>235)
02147 {
02148 TX[1]=0x01;
02149 aux=packet->frag_length+20;
02150 aux=aux-256;
02151 if(aux>9)
02152 {
02153 switch(aux)
02154 {
02155 case 10: TX[2]=0x0A;
02156 break;
02157 case 11: TX[2]=0x0B;
02158 break;
02159 case 12: TX[2]=0x0C;
02160 break;
02161 case 13: TX[2]=0x0D;
02162 break;
02163 case 14: TX[2]=0x0E;
02164 break;
02165 case 15: TX[2]=0x0F;
02166 break;
02167 case 16: TX[2]=0x10;
02168 break;
02169 case 17: TX[2]=0x11;
02170 break;
02171 case 18: TX[2]=0x12;
02172 break;
02173 case 19: TX[2]=0x13;
02174 break;
02175 case 20: TX[2]=0x14;
02176 break;
02177 }
02178 }
02179 else
02180 {
02181 TX[2]=aux;
02182 }
02183 }
02184 else
02185 {
02186 TX[1]=0x00;
02187 TX[2]=20+packet->frag_length;
02188 }
02189 }
02190 else
02191 {
02192 TX[2]=20+packet->frag_length;
02193 }
02194 TX[3]=0x11;
02195 tipo=24;
02196 while(a<13)
02197 {
02198 for(it=0;it<4;it++)
02199 {
02200 TX[a]=packet->macDH[it];
02201 a++;
02202 }
02203 for(it=0;it<4;it++)
02204 {
02205 TX[a]=packet->macDL[it];
02206 a++;
02207 }
02208 }
02209 if (packet->MY_known==1)
02210 {
02211 for(it=0;it<2;it++)
02212 {
02213 TX[it+13]=packet->naD[it];
02214 }
02215 }
02216 else
02217 {
02218 TX[13]=0xFF;
02219 TX[14]=0xFE;
02220 }
02221 TX[15]=packet->SD;
02222 TX[16]=packet->DE;
02223 TX[17]=packet->CID[0];
02224 TX[18]=packet->CID[1];
02225 TX[19]=packet->PID[0];
02226 TX[20]=packet->PID[1];
02227 TX[21]=hops;
02228 if( apsEncryption) TX[22]=0x20;
02229 else TX[22]=packet->opt;
02230 TX[23]=packet->packetID;
02231 TX[24]=packet->numFragment;
02232 it=0;
02233 gen_frame(packet,TX,25);
02234 for(it=3;it<(TX[2]+3);it++)
02235 {
02236 checksum=checksum+TX[it];
02237 }
02238 while((checksum>255))
02239 {
02240 checksum=checksum-256;
02241 }
02242 checksum=255-checksum;
02243 TX[packet->frag_length+23]=checksum;
02244 }
02245 else
02246 {
02247 TX[2]=20+packet->frag_length;
02248 TX[3]=0x11;
02249 tipo=24;
02250 while(a<13)
02251 {
02252 for(it=0;it<4;it++)
02253 {
02254 TX[a]=packet->macDH[it];
02255 a++;
02256 }
02257 for(it=0;it<4;it++)
02258 {
02259 TX[a]=packet->macDL[it];
02260 a++;
02261 }
02262 }
02263 if (packet->MY_known==1)
02264 {
02265 for(it=0;it<2;it++)
02266 {
02267 TX[it+13]=packet->naD[it];
02268 }
02269 }
02270 else
02271 {
02272 TX[13]=0xFF;
02273 TX[14]=0xFE;
02274 }
02275 TX[15]=packet->SD;
02276 TX[16]=packet->DE;
02277 TX[17]=0x00;
02278 TX[18]=packet->CID[0];
02279 TX[19]=packet->PID[0];
02280 TX[20]=packet->PID[1];
02281 TX[21]=hops;
02282 TX[22]=packet->opt;
02283 TX[23]=packet->packetID;
02284 TX[24]=packet->numFragment;
02285 it=0;
02286 gen_frame(packet,TX,25);
02287 for(it=3;it<(TX[2]+3);it++)
02288 {
02289 checksum=checksum+TX[it];
02290 }
02291 while((checksum>255))
02292 {
02293 checksum=checksum-256;
02294 }
02295 checksum=255-checksum;
02296 TX[packet->frag_length+23]=checksum;
02297 }
02298 }
02299
02300
02301 gen_frame_ap2(packet,TX,protegido,tipo);
02302
02303 while(counter<(packet->frag_length+tipo+protegido))
02304 {
02305 XBee.print(TX[counter], BYTE);
02306 counter++;
02307 }
02308 counter=0;
02309 command[0]=0xFE;
02310 error=parse_message(command);
02311 packet->deliv_status=delivery_status;
02312 packet->discov_status=discovery_status;
02313 packet->true_naD[0]=true_naD[0];
02314 packet->true_naD[1]=true_naD[1];
02315 packet->retries=retries_sending;
02316 }
02317 free(TX);
02318 free(ByteIN);
02319 TX=NULL;
02320 ByteIN=NULL;
02321 return error;
02322 }
02323
02324
02325
02326
02327
02328
02329
02330
02331
02332
02333 uint8_t WaspXBeeCore::sendXBee(struct packetXBee* packet)
02334 {
02335 uint8_t counter=0;
02336 uint8_t counter3=0;
02337 uint8_t checksum=0;
02338 uint8_t est=1;
02339 uint8_t final=0;
02340 uint8_t end=0;
02341 uint16_t interval=2000;
02342 uint8_t protegido=0;
02343 uint8_t unico=0;
02344 uint8_t tipo=0;
02345 uint8_t estado=1;
02346 uint8_t estadoSend=0;
02347 uint8_t maxPayload=0;
02348 uint8_t numPackets=0;
02349 uint8_t maxPackets=0;
02350 uint16_t lastPacket=0;
02351 uint16_t aux3=0;
02352 int8_t error=2;
02353 uint8_t firstPacket=1;
02354 uint16_t maxData=0;
02355 uint16_t counter1=0;
02356 uint8_t type=0;
02357 uint8_t header=0;
02358
02359
02360 it=0;
02361
02362
02363 if(protocol==XBEE_802_15_4)
02364 {
02365 if(encryptMode==0)
02366 {
02367 maxPayload=100;
02368 }
02369 else
02370 {
02371 if(packet->mode==BROADCAST)
02372 {
02373 maxPayload=95;
02374 }
02375 else
02376 {
02377 if(packet->address_type==_16B)
02378 {
02379 maxPayload=98;
02380 }
02381 else
02382 {
02383 maxPayload=94;
02384 }
02385 }
02386 }
02387 }
02388 if(protocol==ZIGBEE)
02389 {
02390 if(encryptMode==0)
02391 {
02392 if(packet->mode==BROADCAST)
02393 {
02394 maxPayload=92;
02395 }
02396 else
02397 {
02398 maxPayload=84;
02399 }
02400 }
02401 else
02402 {
02403 if(packet->mode==BROADCAST)
02404 {
02405 if(apsEncryption) maxPayload=70;
02406 else maxPayload=74;
02407 }
02408 else
02409 {
02410 if(apsEncryption) maxPayload=62;
02411 else maxPayload=66;
02412 }
02413 }
02414 }
02415 if( (protocol==DIGIMESH) )
02416 {
02417 maxPayload=73;
02418 }
02419 if( (protocol==XBEE_900) )
02420 {
02421 if(encryptMode) maxPayload=80;
02422 else maxPayload=100;
02423 }
02424 if(protocol==XBEE_868)
02425 {
02426 maxPayload=100;
02427 }
02428
02429 switch(packet->typeSourceID)
02430 {
02431 case 0: type=2;
02432 break;
02433 case 1: type=8;
02434 break;
02435 case 2: while(packet->niO[it]!='#'){
02436 counter1++;
02437 it++;
02438 }
02439 type=counter1+1;
02440 break;
02441 default: break;
02442 }
02443 header=3+firstPacket+type;
02444 aux3=packet->data_length;
02445 if((aux3+header)<=maxPayload)
02446 {
02447 lastPacket=aux3+header;
02448 numPackets=1;
02449 }
02450 else
02451 {
02452 while((aux3+header)>maxPayload)
02453 {
02454 numPackets++;
02455 aux3=aux3-maxPayload+header;
02456 firstPacket=0;
02457 header=3+firstPacket+type;
02458 if((aux3+header)<=maxPayload)
02459 {
02460 lastPacket=aux3+header;
02461 numPackets++;
02462 }
02463 }
02464 }
02465 maxPackets=numPackets;
02466
02467
02468 while(estadoSend!=1)
02469 {
02470 while(numPackets>0)
02471 {
02472 packet->numFragment=numPackets;
02473 if(numPackets==1)
02474 {
02475 packet->frag_length=lastPacket;
02476 }
02477 else
02478 {
02479 packet->frag_length=maxPayload;
02480 }
02481 if(numPackets==maxPackets)
02482 {
02483 start=0;
02484 firstPacket=1;
02485 header=3+firstPacket+type;
02486 packet->endFragment=1;
02487 }
02488 else
02489 {
02490 start=finish+1;
02491 firstPacket=0;
02492 header=3+firstPacket+type;
02493 packet->endFragment=0;
02494 }
02495 if(numPackets==1)
02496 {
02497 finish=packet->data_length-1;
02498 }
02499 else
02500 {
02501 finish=start+packet->frag_length-header-1;
02502 }
02503 frag_length=packet->frag_length;
02504
02505 error=sendXBeePriv(packet);
02506 if(error==0)
02507 {
02508 numPackets--;
02509 if(numPackets==0)
02510 {
02511 estadoSend=1;
02512 }
02513 else delay(50);
02514 }
02515 else
02516 {
02517 numPackets=0;
02518 estadoSend=1;
02519 }
02520 }
02521 }
02522 return error;
02523
02524 }
02525
02526
02527
02528
02529
02530
02531
02532
02533
02534 int8_t WaspXBeeCore::send(uint8_t* address, char* data)
02535 {
02536 char macDest[16];
02537 Utils.hex2str(address, macDest);
02538
02539 return send(macDest,data);
02540 }
02541
02542
02543
02544
02545
02546
02547
02548
02549
02550 int8_t WaspXBeeCore::send(char* address, char* data)
02551 {
02552 uint8_t maxPayload = 0;
02553 uint8_t i=0;
02554 uint8_t j=0;
02555 char aux[2];
02556 uint8_t error=2;
02557 uint8_t destination[8];
02558 uint8_t maxData = 0;
02559 uint8_t checksum = 0;
02560 uint8_t tipo = 0;
02561
02562
02563 switch( protocol )
02564 {
02565 case XBEE_802_15_4 : if( !encryptMode ) maxPayload = 100;
02566 else
02567 {
02568 if( !strcmp(address,"000000000000FFFF") ) maxPayload = 95;
02569 else maxPayload = 94;
02570 }
02571 tipo = 15;
02572 break;
02573 case ZIGBEE : if( !encryptMode )
02574 {
02575 if( !strcmp(address,"000000000000FFFF") ) maxPayload = 92;
02576 else maxPayload = 84;
02577 }
02578 else
02579 {
02580 if( !strcmp(address,"000000000000FFFF") ) maxPayload = 74;
02581 else maxPayload = 66;
02582 }
02583 tipo = 18;
02584 break;
02585 case DIGIMESH : tipo = 18;
02586 maxPayload = 73;
02587 break;
02588 case XBEE_900 : tipo = 18;
02589 if(encryptMode) maxPayload=80;
02590 else maxPayload=100;
02591 break;
02592 case XBEE_868 : tipo = 18;
02593 maxPayload = 100;
02594 break;
02595 }
02596
02597 while( data[i]!='\0' )
02598 {
02599 maxData++;
02600 i++;
02601 }
02602 i=0;
02603
02604 if( maxData > maxPayload )
02605 {
02606 error_TX = 2;
02607 return -1;
02608 }
02609
02610 while(j<8)
02611 {
02612 aux[i-j*2]=address[i];
02613 aux[(i-j*2)+1]=address[i+1];
02614 destination[j]=Utils.str2hex(aux);
02615 i+=2;
02616 j++;
02617 }
02618
02619 uint8_t* command = (uint8_t*) calloc(130,sizeof(uint8_t));
02620 if(command==NULL) return -1;
02621
02622 switch( protocol )
02623 {
02624 case XBEE_802_15_4 : command[0] = 0x7E;
02625 command[1] = 0x00;
02626 command[2] = maxData+11;
02627 command[3] = 0x00;
02628 command[4] = 0x01;
02629 for(it=0;it<8;it++) command[it+5]=destination[it];
02630 command[13]=0x00;
02631 for(it=0;it<maxData;it++) command[it+14]=data[it];
02632 for(it=3;it<(maxData+14);it++)
02633 {
02634 checksum=checksum+command[it];
02635 }
02636 while( (checksum>255))
02637 {
02638 checksum=checksum-256;
02639 }
02640 checksum=255-checksum;
02641 command[14+maxData]=checksum;
02642 break;
02643
02644 case DIGIMESH :
02645
02646 case XBEE_900 :
02647
02648 case XBEE_868 :
02649
02650 case ZIGBEE : command[0] = 0x7E;
02651 command[1] = 0x00;
02652 command[2] = maxData+14;
02653 command[3] = 0x10;
02654 command[4] = 0x01;
02655 for(it=0;it<8;it++) command[it+5]=destination[it];
02656 command[13]=0xFF;
02657 command[14]=0xFE;
02658 command[15]=0x00;
02659 command[16]=0x00;
02660 for(it=0;it<maxData;it++) command[it+17]=data[it];
02661 for(it=3;it<(maxData+17);it++)
02662 {
02663 checksum=checksum+command[it];
02664 }
02665 while( (checksum>255))
02666 {
02667 checksum=checksum-256;
02668 }
02669 checksum=255-checksum;
02670 command[17+maxData]=checksum;
02671 break;
02672 }
02673
02674 it=0;
02675 while(it<(maxData+tipo))
02676 {
02677 XBee.print(command[it], BYTE);
02678 it++;
02679 }
02680
02681 if( protocol==XBEE_802_15_4 ) command[0]=0xFF;
02682 else if( protocol==ZIGBEE || protocol==DIGIMESH) command[0]=0xFE;
02683 error=parse_message(command);
02684 free(command);
02685 command=NULL;
02686
02687 return error;
02688 }
02689
02690
02691
02692
02693
02694
02695
02696
02697
02698
02699 int8_t WaspXBeeCore::treatData()
02700 {
02701 command[0]=0xEE;
02702 return parse_message(command);
02703 }
02704
02705
02706
02707
02708
02709 uint8_t WaspXBeeCore::freeXBee()
02710 {
02711 uint8_t temp=0;
02712 uint8_t error=2;
02713 while(XBee.available()>0)
02714 {
02715 temp=XBee.read();
02716 error=0;
02717 }
02718 return error;
02719 }
02720
02721
02722
02723
02724
02725 uint8_t WaspXBeeCore::synchronization(struct packetXBee* paq)
02726 {
02727 uint8_t estado=2;
02728 int i=0;
02729 char* number = (char*) alloca(10);
02730 long previous2=0;
02731 int syncro=0;
02732 TIME1=millis();
02733 long TIME3=3000;
02734 long TIME2=0;
02735 long TIME4=0;
02736 long TIME5=0;
02737 i=Utils.long2array(TIME3,number);
02738 i=0;
02739 paq->data[i]=char(35);
02740 paq->data[i+1]=char(35);
02741 while( (number[i]) != 35 )
02742 {
02743 paq->data[i+2]=number[i];
02744 i++;
02745 }
02746 paq->data[i+2]=char(35);
02747 paq->data_length=i+3;
02748 estado=sendXBee(paq);
02749 TIME1=millis()-TIME1;
02750 delay(TIME3-TIME1);
02751 digitalWrite(XBEE_SLEEP,HIGH);
02752 free(number);
02753 return estado;
02754 }
02755
02756
02757
02758 uint8_t WaspXBeeCore::setDestinationParams(packetXBee* paq, uint8_t* address, char* data, uint8_t type, uint8_t off_type)
02759 {
02760 char macDest[16];
02761 Utils.hex2str(address, macDest);
02762 return setDestinationParams(paq,macDest,data,type,off_type);
02763 }
02764
02765
02766
02767 uint8_t WaspXBeeCore::setDestinationParams(packetXBee* paq, uint8_t* address, int data, uint8_t type, uint8_t off_type)
02768 {
02769 char macDest[16];
02770 Utils.hex2str(address, macDest);
02771 return setDestinationParams(paq,macDest,data,type,off_type);
02772 }
02773
02774
02775
02776 uint8_t WaspXBeeCore::setDestinationParams(packetXBee* paq, char* address, char* data, uint8_t type, uint8_t off_type)
02777 {
02778 uint8_t destination[8];
02779 uint8_t i=0;
02780 uint8_t j=0;
02781 char aux[2];
02782
02783 if( off_type==DATA_ABSOLUTE )
02784 {
02785 if( type==MAC_TYPE )
02786 {
02787 while(j<8)
02788 {
02789 aux[i-j*2]=address[i];
02790 aux[(i-j*2)+1]=address[i+1];
02791 destination[j]=Utils.str2hex(aux);
02792 i+=2;
02793 j++;
02794 }
02795 for(uint8_t a=0;a<4;a++)
02796 {
02797 paq->macDH[a]=destination[a];
02798 }
02799 for(uint8_t b=0;b<4;b++)
02800 {
02801 paq->macDL[b]=destination[b+4];
02802 }
02803 paq->address_type=_64B;
02804 }
02805 if( type==MY_TYPE )
02806 {
02807 while(j<2)
02808 {
02809 aux[i-j*2]=address[i];
02810 aux[(i-j*2)+1]=address[i+1];
02811 destination[j]=Utils.str2hex(aux);
02812 i+=2;
02813 j++;
02814 }
02815 paq->naD[0]=destination[0];
02816 paq->naD[1]=destination[1];
02817 paq->address_type=_16B;
02818 }
02819 data_ind=0;
02820 }
02821 while( *data!='\0' )
02822 {
02823 paq->data[data_ind]=*data++;
02824 data_ind++;
02825 if( data_ind>=MAX_DATA ) break;
02826 }
02827 paq->data_length=data_ind;
02828 return 1;
02829 }
02830
02831
02832
02833
02834 uint8_t WaspXBeeCore::setDestinationParams(packetXBee* paq, char* address, int data, uint8_t type, uint8_t off_type)
02835 {
02836 uint8_t destination[8];
02837 uint8_t i=0;
02838 uint8_t j=0;
02839 char aux[2];
02840 char numb[10];
02841
02842 if( off_type==DATA_ABSOLUTE )
02843 {
02844 if( type==MAC_TYPE )
02845 {
02846 while(j<8)
02847 {
02848 aux[i-j*2]=address[i];
02849 aux[(i-j*2)+1]=address[i+1];
02850 destination[j]=Utils.str2hex(aux);
02851 i+=2;
02852 j++;
02853 }
02854 for(uint8_t a=0;a<4;a++)
02855 {
02856 paq->macDH[a]=destination[a];
02857 }
02858 for(uint8_t a=0;a<4;a++)
02859 {
02860 paq->macDL[a]=destination[a+4];
02861 }
02862 paq->address_type=_64B;
02863 }
02864 if( type==MY_TYPE )
02865 {
02866 while(j<2)
02867 {
02868 aux[i-j*2]=address[i];
02869 aux[(i-j*2)+1]=address[i+1];
02870 destination[j]=Utils.str2hex(aux);
02871 i+=2;
02872 j++;
02873 }
02874 paq->naD[0]=destination[0];
02875 paq->naD[1]=destination[1];
02876 paq->address_type=_16B;
02877 }
02878 data_ind=0;
02879 }
02880 i=0;
02881 Utils.long2array(data,numb);
02882 while( numb[i]!='\0' )
02883 {
02884 paq->data[data_ind]=numb[i]++;
02885 data_ind++;
02886 i++;
02887 if( data_ind>=MAX_DATA ) break;
02888 }
02889 paq->data_length=data_ind;
02890 }
02891
02892
02893
02894 uint8_t WaspXBeeCore::setOriginParams(packetXBee* paq, uint8_t type)
02895 {
02896 return setOriginParams(paq,"",type);
02897 }
02898
02899
02900
02901 uint8_t WaspXBeeCore::setOriginParams(packetXBee* paq, char* address, uint8_t type)
02902 {
02903 uint8_t origin[8];
02904 uint8_t i=0;
02905 uint8_t j=0;
02906 char aux[2];
02907 char ni[20];
02908
02909 if( type==MAC_TYPE )
02910 {
02911 if(Utils.sizeOf(address)<5)
02912 {
02913 getOwnMac();
02914 for(uint8_t a=0;a<4;a++)
02915 {
02916 paq->macOH[a]=sourceMacHigh[a];
02917 }
02918 for(uint8_t b=0;b<4;b++)
02919 {
02920 paq->macOL[b]=sourceMacLow[b];
02921 }
02922 }
02923 else
02924 {
02925 while(j<8)
02926 {
02927 aux[i-j*2]=address[i];
02928 aux[(i-j*2)+1]=address[i+1];
02929 origin[j]=Utils.str2hex(aux);
02930 i+=2;
02931 j++;
02932 }
02933 for(uint8_t a=0;a<4;a++)
02934 {
02935 paq->macOH[a]=origin[a];
02936 }
02937 for(uint8_t b=0;b<4;b++)
02938 {
02939 paq->macOL[b]=origin[b+4];
02940 }
02941 }
02942 paq->typeSourceID=1;
02943 }
02944 if( type==MY_TYPE )
02945 {
02946 if(Utils.sizeOf(address)<2)
02947 {
02948 getOwnNetAddress();
02949 for(uint8_t a=0;a<2;a++)
02950 {
02951 paq->naO[a]=sourceNA[a];
02952 }
02953 }
02954 else
02955 {
02956 while(j<2)
02957 {
02958 aux[i-j*2]=address[i];
02959 aux[(i-j*2)+1]=address[i+1];
02960 origin[j]=Utils.str2hex(aux);
02961 i+=2;
02962 j++;
02963 }
02964 paq->naO[0]=origin[0];
02965 paq->naO[1]=origin[1];
02966 }
02967 paq->typeSourceID=0;
02968 }
02969 i=0;
02970 if( type==NI_TYPE )
02971 {
02972 while( *address!='\0' )
02973 {
02974 paq->niO[i]=*address++;
02975 i++;
02976 }
02977 paq->niO[i]='#';
02978 paq->typeSourceID=2;
02979 }
02980 return 1;
02981 }
02982
02983
02984
02985
02986
02987
02988
02989
02990
02991
02992
02993 int8_t WaspXBeeCore::readXBee(uint8_t* data)
02994 {
02995 uint16_t counter=0;
02996 uint8_t checksum=0;
02997 uint8_t estado=1;
02998 uint16_t length=0;
02999 uint16_t cont=1;
03000 uint16_t aux=0;
03001 uint16_t aux2=0;
03002 uint8_t aux3=0;
03003 uint16_t counter3=0;
03004 uint8_t est=1;
03005 uint8_t end=0;
03006 uint16_t interval=WAIT_TIME_READ;
03007 uint8_t primero=0;
03008 int8_t error=2;
03009 uint8_t num_read=0;
03010 uint16_t cont3=0;
03011 uint8_t header=0;
03012 uint16_t temp=0;
03013 int16_t temp2=0;
03014 uint16_t temp3=0;
03015 uint8_t samePacket=0;
03016 uint8_t comp=0;
03017 uint8_t numFragments;
03018 uint8_t index1=0;
03019 uint8_t index2=0;
03020 long time=0;
03021 uint8_t finishIndex=0;
03022 uint16_t counter1=0;
03023
03024 it=0;
03025 uint8_t checksum_read=0;
03026
03027 if( indexNotModified )
03028 {
03029 for(it=0;it<MAX_FINISH_PACKETS;it++)
03030 {
03031 if( pendingFragments[it]==NULL ) break;
03032 }
03033 nextIndex1=it;
03034 }
03035
03036 it=0;
03037 #if DEBUG
03038 XBee.println("");
03039 XBee.println("-----------------------------------------------------");
03040 XBee.print("Pending Packets: ");
03041 XBee.println(pendingPackets,DEC);
03042 #endif
03043
03044 temp=0;
03045 if( protocol!=XBEE_802_15_4 && data_length<12 ) return 1;
03046 if( protocol==XBEE_802_15_4 && add_type==_16B && data_length<5 ) return 1;
03047 if( protocol==XBEE_802_15_4 && add_type==_64B && data_length<11 ) return 1;
03048
03049 while(temp<MAX_FINISH_PACKETS)
03050 {
03051 #if DEBUG
03052 XBee.println("Posible fragmento de paquete existente");
03053 #endif
03054 it=0;
03055 temp2=0;
03056 temp3=0;
03057 if( pendingFragments[temp]->time > 0 )
03058 {
03059 if(protocol==XBEE_802_15_4)
03060 {
03061 if(add_type==_16B)
03062 {
03063 if( (data[4]) == pendingFragments[temp]->packetID )
03064 {
03065 if((data[6])==35)
03066 {
03067 temp2=1;
03068 }
03069 else
03070 {
03071 temp2=0;
03072 }
03073 temp3=data[6+temp2];
03074 it=0;
03075 switch(temp3)
03076 {
03077 case 0: if(pendingFragments[temp]->naO[0]==data[7+temp2])
03078 {
03079 if(pendingFragments[temp]->naO[1]==data[8+temp2])
03080 {
03081 samePacket=1;
03082 }
03083 }
03084 break;
03085 case 1: for(it=0;it<4;it++)
03086 {
03087 if(pendingFragments[temp]->macOH[it]!=data[7+temp2+it])
03088 {
03089 comp=1;
03090 break;
03091 }
03092 }
03093 for(it=0;it<4;it++)
03094 {
03095 if(pendingFragments[temp]->macOL[it]!=data[11+temp2+it])
03096 {
03097 comp=1;
03098 break;
03099 }
03100 }
03101 if(comp==0)
03102 {
03103 samePacket=1;
03104 }
03105 break;
03106 case 2: while(pendingFragments[temp]->niO[it]!=35)
03107 {
03108 if(pendingFragments[temp]->niO[it]!=data[7+it+temp2])
03109 {
03110 comp=1;
03111 break;
03112 }
03113 it++;
03114 }
03115 if(comp==0)
03116 {
03117 samePacket=1;
03118 }
03119 break;
03120 }
03121 if(samePacket==1)
03122 {
03123 index1=temp;
03124 temp=MAX_FINISH_PACKETS;
03125 if(temp2==1)
03126 {
03127 pendingFragments[index1]->totalFragments=data[5];
03128 }
03129 pendingFragments[index1]->recFragments++;
03130 pendingFragments[index1]->RSSI=pendingFragments[index1]->RSSI+data[2];
03131 index2=data[5]-1;
03132 if( index2>= MAX_FRAG_PACKETS ){
03133 freeIndexMatrix(index1);
03134 return -1;
03135 }
03136 }
03137 }
03138 }
03139 else if(add_type==_64B)
03140 {
03141 if((data[10])==pendingFragments[temp]->packetID)
03142 {
03143 if((data[12])==35)
03144 {
03145 temp2=1;
03146 }
03147 else
03148 {
03149 temp2=0;
03150 }
03151 temp3=data[12+temp2];
03152 it=0;
03153 switch(temp3)
03154 {
03155 case 0: if(pendingFragments[temp]->naO[0]==data[13+temp2])
03156 {
03157 if(pendingFragments[temp]->naO[1]==data[14+temp2])
03158 {
03159 samePacket=1;
03160 }
03161 }
03162 break;
03163 case 1: for(it=0;it<4;it++)
03164 {
03165 if(pendingFragments[temp]->macOH[it]!=data[13+temp2+it])
03166 {
03167 comp=1;
03168 break;
03169 }
03170 }
03171 for(it=0;it<4;it++)
03172 {
03173 if(pendingFragments[temp]->macOL[it]!=data[17+temp2+it])
03174 {
03175 comp=1;
03176 break;
03177 }
03178 }
03179 if(comp==0)
03180 {
03181 samePacket=1;
03182 }
03183 break;
03184 case 2: while(pendingFragments[temp]->niO[it]!=35)
03185 {
03186 if(pendingFragments[temp]->niO[it]!=data[13+it+temp2])
03187 {
03188 comp=1;
03189 break;
03190 }
03191 it++;
03192 }
03193 if(comp==0)
03194 {
03195 samePacket=1;
03196 }
03197 break;
03198 }
03199 if(samePacket==1)
03200 {
03201 #if DEBUG
03202 XBee.println("Fragmento de paquete existente");
03203 #endif
03204 index1=temp;
03205 temp=MAX_FINISH_PACKETS;
03206 if(temp2==1)
03207 {
03208 pendingFragments[index1]->totalFragments=data[11];
03209 }
03210 pendingFragments[index1]->recFragments++;
03211 pendingFragments[index1]->RSSI=pendingFragments[index1]->RSSI+data[8];
03212 index2=data[11]-1;
03213 if( index2>= MAX_FRAG_PACKETS ){
03214 freeIndexMatrix(index1);
03215 return -1;
03216 }
03217 #if DEBUG
03218 XBee.print("Index1: ");
03219 XBee.println(index1,DEC);
03220 XBee.print("Index2: ");
03221 XBee.println(index2,DEC);
03222 #endif
03223 }
03224 }
03225 }
03226 }
03227 else if( (protocol==DIGIMESH) || (protocol==ZIGBEE) || (protocol==XBEE_900) || (protocol==XBEE_868) )
03228 {
03229 if(mode==UNICAST)
03230 {
03231 if((data[11])==pendingFragments[temp]->packetID)
03232 {
03233 if((data[13])==35)
03234 {
03235 temp2=1;
03236 }
03237 else
03238 {
03239 temp2=0;
03240 }
03241 temp3=data[13+temp2];
03242 it=0;
03243 switch(temp3)
03244 {
03245 case 0: if(pendingFragments[temp]->naO[0]==data[14+temp2])
03246 {
03247 if(pendingFragments[temp]->naO[1]==data[15+temp2])
03248 {
03249 samePacket=1;
03250 }
03251 }
03252 break;
03253 case 1: for(it=0;it<4;it++)
03254 {
03255 if(pendingFragments[temp]->macOH[it]!=data[14+temp2+it])
03256 {
03257 comp=1;
03258 break;
03259 }
03260 }
03261 for(it=0;it<4;it++)
03262 {
03263 if(pendingFragments[temp]->macOL[it]!=data[18+temp2+it])
03264 {
03265 comp=1;
03266 break;
03267 }
03268 }
03269 if(comp==0)
03270 {
03271 samePacket=1;
03272 }
03273 break;
03274 case 2: while(pendingFragments[temp]->niO[it]!=35)
03275 {
03276 if(pendingFragments[temp]->niO[it]!=data[14+it+temp2])
03277 {
03278 comp=1;
03279 break;
03280 }
03281 it++;
03282 }
03283 if(comp==0)
03284 {
03285 samePacket=1;
03286 }
03287 break;
03288 }
03289 if(samePacket==1)
03290 {
03291 index1=temp;
03292 #if DEBUG
03293 XBee.println("Fragmento de paquete existente");
03294 #endif
03295 temp=MAX_FINISH_PACKETS;
03296 if(temp2==1)
03297 {
03298 pendingFragments[index1]->totalFragments=data[12];
03299 }
03300 pendingFragments[index1]->recFragments++;
03301 index2=data[12]-1;
03302 #if DEBUG
03303 XBee.print("Index1: ");
03304 XBee.println(index1,DEC);
03305 XBee.print("Index2: ");
03306 XBee.println(index2,DEC);
03307 #endif
03308 if( index2>= MAX_FRAG_PACKETS ){
03309 freeIndexMatrix(index1);
03310 return -1;
03311 }
03312 }
03313 }
03314 }
03315 else if(mode==CLUSTER)
03316 {
03317 if((data[17])==pendingFragments[temp]->packetID)
03318 {
03319 if((data[19])==35)
03320 {
03321 temp2=1;
03322 }
03323 else
03324 {
03325 temp2=0;
03326 }
03327 temp3=data[19+temp2];
03328 it=0;
03329 switch(temp3)
03330 {
03331 case 0: if(pendingFragments[temp]->naO[0]==data[20+temp2])
03332 {
03333 if(pendingFragments[temp]->naO[1]==data[21+temp2])
03334 {
03335 samePacket=1;
03336 }
03337 }
03338 break;
03339 case 1: for(it=0;it<4;it++)
03340 {
03341 if(pendingFragments[temp]->macOH[it]!=data[20+temp2+it])
03342 {
03343 comp=1;
03344 break;
03345 }
03346 }
03347 for(it=0;it<4;it++)
03348 {
03349 if(pendingFragments[temp]->macOL[it]!=data[24+temp2+it])
03350 {
03351 comp=1;
03352 break;
03353 }
03354 }
03355 if(comp==0)
03356 {
03357 samePacket=1;
03358 }
03359 break;
03360 case 2: while(pendingFragments[temp]->niO[it]!=35)
03361 {
03362 if(pendingFragments[temp]->niO[it]!=data[20+it+temp2])
03363 {
03364 comp=1;
03365 break;
03366 }
03367 it++;
03368 }
03369 if(comp==0)
03370 {
03371 samePacket=1;
03372 }
03373 break;
03374 }
03375 if(samePacket==1)
03376 {
03377 index1=temp;
03378 temp=MAX_FINISH_PACKETS;
03379 if(temp2==1)
03380 {
03381 pendingFragments[index1]->totalFragments=data[18];
03382 }
03383 pendingFragments[index1]->recFragments++;
03384 index2=data[18]-1;
03385 if( index2>= MAX_FRAG_PACKETS ){
03386 freeIndexMatrix(index1);
03387 return -1;
03388 }
03389 }
03390 }
03391 }
03392 }
03393 }
03394 temp++;
03395 }
03396 it=0;
03397 if(samePacket==0)
03398 {
03399 #if DEBUG
03400 XBee.println("Fragmento de paquete nuevo");
03401 #endif
03402 index1=nextIndex1;
03403 indexNotModified=1;
03404 if( pendingPackets>= MAX_FINISH_PACKETS ){
03405 freeIndex();
03406 index1=nextIndex1;
03407 }
03408 pendingPackets++;
03409 pendingFragments[index1] = (index*) calloc(1,sizeof(index));
03410 if(pendingFragments[index1]==NULL){
03411 freeAll();
03412 return -1;
03413 }
03414 if(protocol==XBEE_802_15_4)
03415 {
03416 if(add_type==_16B)
03417 {
03418 pendingFragments[index1]->address_typeS=add_type;
03419 pendingFragments[index1]->packetID=data[4];
03420 pendingFragments[index1]->time=millis();
03421 for(it=0;it<2;it++)
03422 {
03423 pendingFragments[index1]->naS[it]=data[it];
03424 }
03425 if((data[6])==35)
03426 {
03427 temp2=1;
03428 }
03429 else
03430 {
03431 temp2=0;
03432 }
03433 pendingFragments[index1]->typeSourceID=data[6+temp2];
03434 it=0;
03435 switch(pendingFragments[index1]->typeSourceID)
03436 {
03437 case 0: pendingFragments[index1]->naO[0]=data[7+temp2];
03438 pendingFragments[index1]->naO[1]=data[8+temp2];
03439 break;
03440 case 1: for(it=0;it<4;it++)
03441 {
03442 pendingFragments[index1]->macOH[it]=data[7+it+temp2];
03443 }
03444 for(it=0;it<4;it++)
03445 {
03446 pendingFragments[index1]->macOL[it]=data[11+it+temp2];
03447 }
03448 break;
03449 case 2: while(data[7+temp2+it]!=35)
03450 {
03451 pendingFragments[index1]->niO[it]=char(data[7+it+temp2]);
03452 it++;
03453 if(it>20)
03454 {
03455 break;
03456 }
03457 }
03458 pendingFragments[index1]->niO[it]=char(35);
03459 break;
03460 }
03461 if(temp2==1)
03462 {
03463 pendingFragments[index1]->totalFragments=data[5];
03464 }
03465 pendingFragments[index1]->recFragments=1;
03466 index2=data[5]-1;
03467 if( index2>= MAX_FRAG_PACKETS ){
03468 freeIndexMatrix(index1);
03469 return -1;
03470 }
03471 pendingFragments[index1]->RSSI=data[2];
03472 pendingFragments[index1]->opt=data[3];
03473 if( (pendingFragments[index1]->opt==0x01) || (pendingFragments[index1]->opt==0x02) )
03474 {
03475 pendingFragments[index1]->mode=BROADCAST;
03476 }
03477 else
03478 {
03479 pendingFragments[index1]->mode=UNICAST;
03480 }
03481 }
03482 else if(add_type==_64B)
03483 {
03484 pendingFragments[index1]->address_typeS=add_type;
03485 pendingFragments[index1]->packetID=data[10];
03486 pendingFragments[index1]->time=millis();
03487 #if DEBUG
03488 XBee.println("Entro en 64B");
03489 XBee.println(pendingFragments[index1]->packetID,HEX);
03490 XBee.println(pendingFragments[index1]->time,DEC);
03491 #endif
03492 for(it=0;it<4;it++)
03493 {
03494 pendingFragments[index1]->macSH[it]=data[it];
03495 #if DEBUG
03496 XBee.print(pendingFragments[index1]->macSH[it],HEX);
03497 #endif
03498 }
03499 for(it=0;it<4;it++)
03500 {
03501 pendingFragments[index1]->macSL[it]=data[it+4];
03502 #if DEBUG
03503 XBee.print(pendingFragments[index1]->macSL[it],HEX);
03504 #endif
03505 }
03506 if((data[12])==35)
03507 {
03508 temp2=1;
03509 }
03510 else
03511 {
03512 temp2=0;
03513 }
03514 pendingFragments[index1]->typeSourceID=data[12+temp2];
03515 #if DEBUG
03516 XBee.println("");
03517 XBee.println(pendingFragments[index1]->typeSourceID,DEC);
03518 #endif
03519 it=0;
03520 switch(pendingFragments[index1]->typeSourceID)
03521 {
03522 case 0: pendingFragments[index1]->naO[0]=data[13+temp2];
03523 pendingFragments[index1]->naO[1]=data[14+temp2];
03524 #if DEBUG
03525 XBee.println(pendingFragments[index1]->naO[0],HEX);
03526 XBee.println(pendingFragments[index1]->naO[1],HEX);
03527 #endif
03528 break;
03529 case 1: for(it=0;it<4;it++)
03530 {
03531 pendingFragments[index1]->macOH[it]=data[13+it+temp2];
03532 }
03533 for(it=0;it<4;it++)
03534 {
03535 pendingFragments[index1]->macOL[it]=data[17+it+temp2];
03536 }
03537 break;
03538 case 2: while(data[13+temp2+it]!=35)
03539 {
03540 pendingFragments[index1]->niO[it]=char(data[13+it+temp2]);
03541 #if DEBUG
03542 XBee.print(pendingFragments[index1]->niO[it],BYTE);
03543 #endif
03544 it++;
03545 if(it>20)
03546 {
03547 break;
03548 }
03549 }
03550 pendingFragments[index1]->niO[it]=char(35);
03551 break;
03552 }
03553 pendingFragments[index1]->RSSI=data[8];
03554 pendingFragments[index1]->opt=data[9];
03555 if( (pendingFragments[index1]->opt==0x01) || (pendingFragments[index1]->opt==0x02) )
03556 {
03557 pendingFragments[index1]->mode=BROADCAST;
03558 }
03559 else
03560 {
03561 pendingFragments[index1]->mode=UNICAST;
03562 }
03563 if(temp2==1)
03564 {
03565 pendingFragments[index1]->totalFragments=data[11];
03566 }
03567 pendingFragments[index1]->recFragments=1;
03568 index2=data[11]-1;
03569 if( index2>= MAX_FRAG_PACKETS ){
03570 freeIndexMatrix(index1);
03571 return -1;
03572 }
03573 #if DEBUG
03574 XBee.print("Index1: ");
03575 XBee.println(index1,DEC);
03576 XBee.print("Index2: ");
03577 XBee.println(index2,DEC);
03578 #endif
03579 }
03580 }
03581 else if( (protocol==DIGIMESH) || (protocol==ZIGBEE) || (protocol==XBEE_900) || (protocol==XBEE_868) )
03582 {
03583 if(mode==UNICAST)
03584 {
03585 pendingFragments[index1]->packetID=data[11];
03586 pendingFragments[index1]->time=millis();
03587 if((data[13])==35)
03588 {
03589 temp2=1;
03590 }
03591 else
03592 {
03593 temp2=0;
03594 }
03595 pendingFragments[index1]->typeSourceID=data[13+temp2];
03596 it=0;
03597 switch(pendingFragments[index1]->typeSourceID)
03598 {
03599 case 0: pendingFragments[index1]->naO[0]=data[14+temp2];
03600 pendingFragments[index1]->naO[1]=data[15+temp2];
03601 aux3=2;
03602 break;
03603 case 1: for(it=0;it<4;it++)
03604 {
03605 pendingFragments[index1]->macOH[it]=data[14+it+temp2];
03606 }
03607 for(it=0;it<4;it++)
03608 {
03609 pendingFragments[index1]->macOL[it]=data[18+it+temp2];
03610 }
03611 aux3=8;
03612 break;
03613 case 2: while(data[14+temp2+it]!=35)
03614 {
03615 pendingFragments[index1]->niO[it]=char(data[14+it+temp2]);
03616 it++;
03617 aux3++;
03618 if(it>20)
03619 {
03620 break;
03621 }
03622 }
03623 pendingFragments[index1]->niO[it]=char(35);
03624 break;
03625 }
03626 if(temp2==1)
03627 {
03628 pendingFragments[index1]->totalFragments=data[12];
03629 }
03630 pendingFragments[index1]->recFragments=1;
03631 index2=data[12]-1;
03632 if( index2>= MAX_FRAG_PACKETS ){
03633 freeIndexMatrix(index1);
03634 return -1;
03635 }
03636 for(it=0;it<4;it++)
03637 {
03638 pendingFragments[index1]->macSH[it]=data[it];
03639 }
03640 for(it=0;it<4;it++)
03641 {
03642 pendingFragments[index1]->macSL[it]=data[it+4];
03643 }
03644 for(it=0;it<2;it++)
03645 {
03646 pendingFragments[index1]->naS[it]=data[it+8];
03647 }
03648 pendingFragments[index1]->mode=UNICAST;
03649 pendingFragments[index1]->opt=data[10];
03650 if(pendingFragments[index1]->opt==0x02)
03651 {
03652 pendingFragments[index1]->mode=BROADCAST;
03653 }
03654 #if DEBUG
03655 XBee.print("Index1: ");
03656 XBee.println(index1,DEC);
03657 XBee.print("Index2: ");
03658 XBee.println(index2,DEC);
03659 #endif
03660 }
03661 else if(mode==CLUSTER)
03662 {
03663 pendingFragments[index1]->packetID=data[17];
03664 pendingFragments[index1]->time=millis();
03665 if((data[19])==35)
03666 {
03667 temp2=1;
03668 }
03669 else
03670 {
03671 temp2=0;
03672 }
03673 pendingFragments[index1]->typeSourceID=data[19+temp2];
03674 it=0;
03675 switch(pendingFragments[index1]->typeSourceID)
03676 {
03677 case 0: pendingFragments[index1]->naO[0]=data[20+temp2];
03678 pendingFragments[index1]->naO[1]=data[21+temp2];
03679 aux3=2;
03680 break;
03681 case 1: for(it=0;it<4;it++)
03682 {
03683 pendingFragments[index1]->macOH[it]=data[20+it+temp2];
03684 }
03685 for(it=0;it<4;it++)
03686 {
03687 pendingFragments[index1]->macOL[it]=data[24+it+temp2];
03688 }
03689 aux3=8;
03690 break;
03691 case 2: while(data[20+temp2+it]!=35)
03692 {
03693 pendingFragments[index1]->niO[it]=char(data[20+it+temp2]);
03694 it++;
03695 aux3++;
03696 if(it>20)
03697 {
03698 break;
03699 }
03700 }
03701 pendingFragments[index1]->niO[it]=char(35);
03702 break;
03703 }
03704 if(temp2==1)
03705 {
03706 pendingFragments[index1]->totalFragments=data[18];
03707 }
03708 pendingFragments[index1]->recFragments=1;
03709 index2=data[18]-1;
03710 if( index2>= MAX_FRAG_PACKETS ){
03711 freeIndexMatrix(index1);
03712 return -1;
03713 }
03714 for(it=0;it<4;it++)
03715 {
03716 pendingFragments[index1]->macSH[it]=data[it];
03717 }
03718 for(it=0;it<4;it++)
03719 {
03720 pendingFragments[index1]->macSL[it]=data[it+4];
03721 }
03722 for(it=0;it<2;it++)
03723 {
03724 pendingFragments[index1]->naS[it]=data[it+8];
03725 }
03726 pendingFragments[index1]->mode=CLUSTER;
03727 pendingFragments[index1]->SD=data[10];
03728 pendingFragments[index1]->DE=data[11];
03729 for(it=0;it<2;it++)
03730 {
03731 pendingFragments[index1]->CID[it]=data[it+12];
03732 }
03733 for(it=0;it<2;it++)
03734 {
03735 pendingFragments[index1]->PID[it]=data[it+14];
03736 }
03737 pendingFragments[index1]->opt=data[16];
03738 if(pendingFragments[index1]->opt==0x02)
03739 {
03740 pendingFragments[index1]->mode=BROADCAST;
03741 }
03742 }
03743 }
03744
03745 }
03746 samePacket=0;
03747 packet_fragments[index1][index2] = (matrix*) calloc(1,sizeof(matrix));
03748 if(packet_fragments[index1][index2]==NULL){
03749 freeAll();
03750 return -1;
03751 }
03752 if(protocol==XBEE_802_15_4)
03753 {
03754 if(add_type==_16B)
03755 {
03756 packet_fragments[index1][index2]->numFragment=data[5];
03757 if(data[6]==35)
03758 {
03759 packet_fragments[index1][index2]->endFragment=1;
03760 }
03761 else
03762 {
03763 packet_fragments[index1][index2]->endFragment=0;
03764 }
03765 aux2=packet_fragments[index1][index2]->endFragment;
03766 it=0;
03767 cont3=0;
03768 switch(pendingFragments[index1]->typeSourceID)
03769 {
03770 case 0: cont3=2;
03771 break;
03772 case 1: cont3=8;
03773 break;
03774 case 2: while(data[7+aux2+it]!=35)
03775 {
03776 it++;
03777 cont3++;
03778 }
03779 cont3++;
03780 break;
03781 }
03782 header=4+3+aux2+cont3;
03783 if( header>data_length ) data_length=header;
03784 packet_fragments[index1][index2]->frag_length=data_length-header;
03785 for(it=0;it<packet_fragments[index1][index2]->frag_length;it++)
03786 {
03787 packet_fragments[index1][index2]->data[it]=char(data[it+header]);
03788 }
03789 }
03790 if(add_type==_64B)
03791 {
03792 packet_fragments[index1][index2]->numFragment=data[11];
03793 if(data[12]==35)
03794 {
03795 packet_fragments[index1][index2]->endFragment=1;
03796 }
03797 else
03798 {
03799 packet_fragments[index1][index2]->endFragment=0;
03800 }
03801 aux2=packet_fragments[index1][index2]->endFragment;
03802 it=0;
03803 cont3=0;
03804 switch(pendingFragments[index1]->typeSourceID)
03805 {
03806 case 0: cont3=2;
03807 break;
03808 case 1: cont3=8;
03809 break;
03810 case 2: while(data[13+aux2+it]!=35)
03811 {
03812 it++;
03813 cont3++;
03814 }
03815 cont3++;
03816 break;
03817 }
03818 header=10+3+aux2+cont3;
03819 if( header>data_length ) data_length=header;
03820 packet_fragments[index1][index2]->frag_length=data_length-header;
03821 #if DEBUG
03822 XBee.println("");
03823 XBee.print("data_length: ");
03824 XBee.println(data_length,DEC);
03825 XBee.print("header: ");
03826 XBee.println(header,DEC);
03827 XBee.print("aux2: ");
03828 XBee.println(aux2,DEC);
03829 XBee.print("cont3: ");
03830 XBee.println(cont3,DEC);
03831 XBee.println(packet_fragments[index1][index2]->frag_length,DEC);
03832 #endif
03833 for(it=0;it<packet_fragments[index1][index2]->frag_length;it++)
03834 {
03835 packet_fragments[index1][index2]->data[it]=char(data[it+header]);
03836 #if DEBUG
03837 XBee.print(packet_fragments[index1][index2]->data[it],BYTE);
03838 #endif
03839 }
03840 }
03841 }
03842
03843 if( (protocol==ZIGBEE) || (protocol==DIGIMESH) || (protocol==XBEE_900) || (protocol==XBEE_868) )
03844 {
03845 if(mode==UNICAST)
03846 {
03847 packet_fragments[index1][index2]->numFragment=data[12];
03848 if(data[13]==35)
03849 {
03850 packet_fragments[index1][index2]->endFragment=1;
03851 }
03852 else
03853 {
03854 packet_fragments[index1][index2]->endFragment=0;
03855 }
03856 aux2=packet_fragments[index1][index2]->endFragment;
03857 it=0;
03858 cont3=0;
03859 switch(pendingFragments[index1]->typeSourceID)
03860 {
03861 case 0: cont3=2;
03862 break;
03863 case 1: cont3=8;
03864 break;
03865 case 2: while(data[14+aux2+it]!=35)
03866 {
03867 it++;
03868 cont3++;
03869 }
03870 cont3++;
03871 break;
03872 }
03873 header=11+3+aux2+cont3;
03874 if( header>data_length ) data_length=header;
03875 packet_fragments[index1][index2]->frag_length=data_length-header;
03876 #if DEBUG
03877 XBee.println("");
03878 XBee.print("data_length: ");
03879 XBee.println(data_length,DEC);
03880 XBee.print("header: ");
03881 XBee.println(header,DEC);
03882 XBee.print("aux2: ");
03883 XBee.println(aux2,DEC);
03884 XBee.print("cont3: ");
03885 XBee.println(cont3,DEC);
03886 XBee.println(packet_fragments[index1][index2]->frag_length,DEC);
03887 #endif
03888 for(it=0;it<packet_fragments[index1][index2]->frag_length;it++)
03889 {
03890 packet_fragments[index1][index2]->data[it]=char(data[it+header]);
03891 }
03892 }
03893 else if(mode==CLUSTER)
03894 {
03895 packet_fragments[index1][index2]->numFragment=data[18];
03896 if(data[19]==35)
03897 {
03898 packet_fragments[index1][index2]->endFragment=1;
03899 }
03900 else
03901 {
03902 packet_fragments[index1][index2]->endFragment=0;
03903 }
03904 aux2=packet_fragments[index1][index2]->endFragment;
03905 it=0;
03906 cont3=0;
03907 switch(pendingFragments[index1]->typeSourceID)
03908 {
03909 case 0: cont3=2;
03910 break;
03911 case 1: cont3=8;
03912 break;
03913 case 2: while(data[23+aux2+it]!=35)
03914 {
03915 it++;
03916 cont3++;
03917 }
03918 cont3++;
03919 break;
03920 }
03921 header=17+3+aux2+cont3;
03922 if( header>data_length ) data_length=header;
03923 packet_fragments[index1][index2]->frag_length=data_length-header;
03924 for(it=0;it<packet_fragments[index1][index2]->frag_length;it++)
03925 {
03926 packet_fragments[index1][index2]->data[it]=char(data[it+header]);
03927 }
03928 }
03929 }
03930 totalFragmentsReceived++;
03931
03932 if(totalFragmentsReceived==MAX_FRAG_PACKETS)
03933 {
03934 totalFragmentsReceived=0;
03935 }
03936
03937 if(pendingFragments[index1]->recFragments==pendingFragments[index1]->totalFragments)
03938 {
03939 pendingFragments[index1]->complete=1;
03940 }
03941
03942 temp=0;
03943 temp2=0;
03944 temp3=0;
03945 aux=0;
03946 while(temp<MAX_FINISH_PACKETS)
03947 {
03948 it=0;
03949 time=millis();
03950 if( (pendingFragments[temp]!=NULL) )
03951 {
03952 if ( (pendingFragments[temp]->time>0) )
03953 {
03954 if( ((time-pendingFragments[temp]->time)<=TIMEOUT) )
03955 {
03956 if ((pendingFragments[temp]->time>0) )
03957 {
03958 if(pendingFragments[temp]->complete==1)
03959 {
03960 nextIndex1=temp;
03961 indexNotModified=0;
03962 pos++;
03963 finishIndex=getFinishIndex();
03964 if( pos>=MAX_FINISH_PACKETS ){
03965 switch( replacementPolicy )
03966 {
03967 case XBEE_FIFO: finishIndex=getIndexFIFO();
03968 break;
03969 case XBEE_LIFO: finishIndex=getIndexLIFO();
03970 break;
03971 case XBEE_OUT: freeIndexMatrix(temp);
03972 return -1;
03973 break;
03974 }
03975 }
03976 packet_finished[finishIndex] = (packetXBee*) calloc(1,sizeof(packetXBee));
03977 if(packet_finished[finishIndex]==NULL){
03978 freeIndexMatrix(temp);
03979 return -1;
03980 }
03981 else pendingPackets--;
03982 packet_finished[finishIndex]->time=pendingFragments[temp]->time;
03983 packet_finished[finishIndex]->packetID=pendingFragments[temp]->packetID;
03984 packet_finished[finishIndex]->address_typeS=pendingFragments[temp]->address_typeS;
03985 packet_finished[finishIndex]->mode=pendingFragments[temp]->mode;
03986 if(protocol==XBEE_802_15_4)
03987 {
03988 if(packet_finished[finishIndex]->address_typeS==_64B)
03989 {
03990 for(it=0;it<4;it++)
03991 {
03992 packet_finished[finishIndex]->macSH[it]=pendingFragments[temp]->macSH[it];
03993 }
03994 for(it=0;it<4;it++)
03995 {
03996 packet_finished[finishIndex]->macSL[it]=pendingFragments[temp]->macSL[it];
03997 }
03998 }
03999 else if(packet_finished[finishIndex]->address_typeS==_16B)
04000 {
04001 packet_finished[finishIndex]->naS[0]=pendingFragments[temp]->naS[0];
04002 packet_finished[finishIndex]->naS[1]=pendingFragments[temp]->naS[1];
04003 }
04004 }
04005 else
04006 {
04007 for(it=0;it<4;it++)
04008 {
04009 packet_finished[finishIndex]->macSH[it]=pendingFragments[temp]->macSH[it];
04010 }
04011 for(it=0;it<4;it++)
04012 {
04013 packet_finished[finishIndex]->macSL[it]=pendingFragments[temp]->macSL[it];
04014 }
04015 packet_finished[finishIndex]->naS[0]=pendingFragments[temp]->naS[0];
04016 packet_finished[finishIndex]->naS[1]=pendingFragments[temp]->naS[1];
04017 }
04018 aux=(pendingFragments[temp]->RSSI)/(pendingFragments[temp]->totalFragments);
04019 packet_finished[finishIndex]->RSSI=aux;
04020 packet_finished[finishIndex]->typeSourceID=pendingFragments[temp]->typeSourceID;
04021 switch(packet_finished[finishIndex]->typeSourceID)
04022 {
04023 case 0: packet_finished[finishIndex]->naO[0]=pendingFragments[temp]->naO[0];
04024 packet_finished[finishIndex]->naO[1]=pendingFragments[temp]->naO[1];
04025 break;
04026 case 1: for(it=0;it<4;it++)
04027 {
04028 packet_finished[finishIndex]->macOH[it]=pendingFragments[temp]->macOH[it];
04029 }
04030 for(it=0;it<4;it++)
04031 {
04032 packet_finished[finishIndex]->macOL[it]=pendingFragments[temp]->macOL[it];
04033 }
04034 break;
04035 case 2: it=0;
04036 do
04037 {
04038 packet_finished[finishIndex]->niO[it]=pendingFragments[temp]->niO[it];
04039 it++;
04040 } while(pendingFragments[temp]->niO[it]!=35);
04041 packet_finished[finishIndex]->niO[it]=char(35);
04042 break;
04043 }
04044 temp2=(pendingFragments[temp]->totalFragments)-1;
04045 aux=0;
04046 temp3=0;
04047 while(temp2>=0)
04048 {
04049 for(it=0;it<packet_fragments[temp][temp2]->frag_length;it++)
04050 {
04051 packet_finished[finishIndex]->data[it+temp3]=packet_fragments[temp][temp2]->data[it];
04052 aux++;
04053 }
04054 temp3=packet_fragments[temp][temp2]->frag_length+temp3;
04055 temp2--;
04056 }
04057 packet_finished[finishIndex]->data_length=aux;
04058 if(mode==CLUSTER)
04059 {
04060 packet_finished[finishIndex]->SD=pendingFragments[temp]->SD;
04061 packet_finished[finishIndex]->DE=pendingFragments[temp]->DE;
04062 packet_finished[finishIndex]->CID[0]=pendingFragments[temp]->CID[0];
04063 packet_finished[finishIndex]->CID[1]=pendingFragments[temp]->CID[1];
04064 packet_finished[finishIndex]->PID[0]=pendingFragments[temp]->PID[0];
04065 packet_finished[finishIndex]->PID[1]=pendingFragments[temp]->PID[1];
04066 }
04067
04068 for(it=0;it<MAX_FRAG_PACKETS;it++)
04069 {
04070 free(packet_fragments[temp][it]);
04071 packet_fragments[temp][it]=NULL;
04072 }
04073
04074 pendingFragments[temp]->time=0;
04075 free(pendingFragments[temp]);
04076 pendingFragments[temp]=NULL;
04077 }
04078 else if(pendingFragments[temp]->totalFragments==pendingFragments[temp]->recFragments)
04079 {
04080 for(it=0;it<MAX_FRAG_PACKETS;it++)
04081 {
04082
04083 free(packet_fragments[temp][it]);
04084 packet_fragments[temp][it]=NULL;
04085 }
04086
04087 pendingFragments[temp]->time=0;
04088 free(pendingFragments[temp]);
04089 pendingFragments[temp]=NULL;
04090 pendingPackets--;
04091 nextIndex1=temp;
04092 indexNotModified=0;
04093 }
04094 }
04095 }
04096 else
04097 {
04098 for(it=0;it<MAX_FRAG_PACKETS;it++)
04099 {
04100
04101 free(packet_fragments[temp][it]);
04102 packet_fragments[temp][it]=NULL;
04103 }
04104 pendingFragments[temp]->time=0;
04105 free(pendingFragments[temp]);
04106 pendingFragments[temp]=NULL;
04107 pendingPackets--;
04108 nextIndex1=temp;
04109 indexNotModified=0;
04110 }
04111 }
04112 }
04113 temp++;
04114 }
04115 temp=0;
04116 return 0;
04117 }
04118
04119
04120
04121
04122
04123
04124
04125
04126
04127
04128 void WaspXBeeCore::gen_data(const char* data, uint8_t param)
04129 {
04130 uint8_t inc=0;
04131 uint8_t inc2=0;
04132
04133 clearCommand();
04134 it=0;
04135 while(data[it] != '\0') {
04136 inc++;
04137 it++;
04138 }
04139 inc/=2;
04140
04141 while(inc2<inc){
04142 command[inc2]=Utils.converter(data[2*inc2],data[2*inc2+1]);
04143 inc2++;
04144 }
04145
04146 command[inc-2]=param;
04147 }
04148
04149
04150
04151
04152
04153
04154
04155
04156
04157 void WaspXBeeCore::gen_data(const char* data)
04158 {
04159 uint8_t inc=0;
04160 uint8_t inc2=0;
04161
04162 clearCommand();
04163 it=0;
04164 while(data[it] != '\0') {
04165 inc++;
04166 it++;
04167 }
04168 inc/=2;
04169
04170 while(inc2<inc){
04171 command[inc2]=Utils.converter(data[2*inc2],data[2*inc2+1]);
04172 inc2++;
04173 }
04174 }
04175
04176
04177
04178
04179
04180
04181
04182
04183
04184
04185
04186 void WaspXBeeCore::gen_data(const char* data, uint8_t param1, uint8_t param2)
04187 {
04188 uint8_t inc=0;
04189 uint8_t inc2=0;
04190
04191 clearCommand();
04192 it=0;
04193 while(data[it] != '\0') {
04194 inc++;
04195 it++;
04196 }
04197 inc/=2;
04198
04199 while(inc2<inc){
04200 command[inc2]=Utils.converter(data[2*inc2],data[2*inc2+1]);
04201 inc2++;
04202 }
04203
04204 command[inc-3]=param1;
04205 command[inc-2]=param2;
04206 }
04207
04208
04209
04210
04211
04212
04213
04214
04215
04216
04217 void WaspXBeeCore::gen_data(const char* data, uint8_t* param)
04218 {
04219 uint8_t inc=0;
04220 uint8_t inc2=0;
04221
04222 clearCommand();
04223 it=0;
04224 while(data[it] != '\0') {
04225 inc++;
04226 it++;
04227 }
04228 inc/=2;
04229
04230 while(inc2<inc){
04231 command[inc2]=Utils.converter(data[2*inc2],data[2*inc2+1]);
04232 inc2++;
04233 }
04234
04235 if(inc>11)
04236 {
04237 for(it=0;it<8;it++)
04238 {
04239 command[inc-9+it]=param[it];
04240 }
04241 }
04242 else if(inc==11)
04243 {
04244 for(it=0;it<3;it++)
04245 {
04246 command[inc-4+it]=param[it];
04247 }
04248 }
04249 else if(inc==10)
04250 {
04251 for(it=0;it<2;it++)
04252 {
04253 command[inc-3+it]=param[it];
04254 }
04255 }
04256 else command[inc-2]=param[0];
04257 }
04258
04259
04260
04261
04262
04263
04264
04265
04266
04267
04268 void WaspXBeeCore::gen_data(const char* data, char* param)
04269 {
04270 gen_data(data,(uint8_t*) param);
04271 }
04272
04273
04274
04275
04276
04277
04278
04279
04280
04281 uint8_t WaspXBeeCore::gen_checksum(const char* data)
04282 {
04283 uint8_t inc=0;
04284 uint8_t inc2=0;
04285 uint8_t checksum=0;
04286
04287 it=0;
04288 while(data[it] != '\0') {
04289 inc++;
04290 it++;
04291 }
04292 inc/=2;
04293
04294 for(it=3;it<inc;it++)
04295 {
04296 checksum=checksum+command[it];
04297 }
04298 while( (checksum>255))
04299 {
04300 checksum=checksum-256;
04301 }
04302 checksum=255-checksum;
04303 command[inc-1]=checksum;
04304
04305 return checksum;
04306 }
04307
04308
04309
04310
04311
04312
04313
04314
04315
04316
04317
04318 uint8_t WaspXBeeCore::gen_send(const char* data)
04319 {
04320 uint8_t inc=0;
04321 uint8_t inc2=0;
04322 uint8_t checksum=0;
04323 uint8_t counter3=0;
04324 uint8_t undesired=0;
04325 uint8_t status=0;
04326 uint8_t num_max=0;
04327 int8_t error_int=2;
04328 uint8_t est=1;
04329 uint8_t frame_ID=data[4];
04330
04331 it=0;
04332 while(data[it] != '\0') {
04333 inc++;
04334 it++;
04335 }
04336 inc/=2;
04337
04338 while(inc2<inc)
04339 {
04340 XBee.print(command[inc2], BYTE);
04341 inc2++;
04342 }
04343 inc2=0;
04344
04345 error_int=parse_message(command);
04346
04347 return error_int;
04348 }
04349
04350
04351
04352
04353
04354
04355
04356
04357
04358
04359 void WaspXBeeCore::gen_frame(struct packetXBee* _packet, uint8_t* TX_array, uint8_t start_pos)
04360 {
04361 uint16_t counter1=0;
04362
04363 if(_packet->endFragment==1)
04364 {
04365 TX_array[start_pos]=0x23;
04366 switch(_packet->typeSourceID)
04367 {
04368 case 0: TX_array[start_pos+1]=_packet->typeSourceID;
04369 TX_array[start_pos+2]=_packet->naO[0];
04370 TX_array[start_pos+3]=_packet->naO[1];
04371 for(it=0;it<(finish-start+1);it++)
04372 {
04373 TX_array[it+start_pos+4]=uint8_t(_packet->data[it+start]);
04374 }
04375 break;
04376 case 1: TX_array[start_pos+1]=_packet->typeSourceID;
04377 for(it=0;it<4;it++)
04378 {
04379 TX_array[start_pos+2+it]=_packet->macOH[it];
04380 }
04381 for(it=0;it<4;it++)
04382 {
04383 TX_array[start_pos+6+it]=_packet->macOL[it];
04384 }
04385 for(it=0;it<(finish-start+1);it++)
04386 {
04387 TX_array[it+start_pos+10]=uint8_t(_packet->data[it+start]);
04388 }
04389 break;
04390 case 2: TX_array[start_pos+1]=_packet->typeSourceID;
04391 while(_packet->niO[it]!='#'){
04392 counter1++;
04393 it++;
04394 }
04395 counter1++;
04396 for(it=0;it<counter1;it++)
04397 {
04398 TX_array[start_pos+2+it]=uint8_t(_packet->niO[it]);
04399 }
04400 for(it=0;it<(finish-start+1);it++)
04401 {
04402 TX_array[it+start_pos+2+counter1]=uint8_t(_packet->data[it+start]);
04403 }
04404 break;
04405 default: break;
04406 }
04407 }
04408 else
04409 {
04410 switch(_packet->typeSourceID)
04411 {
04412 case 0: TX_array[start_pos]=_packet->typeSourceID;
04413 TX_array[start_pos+1]=_packet->naO[0];
04414 TX_array[start_pos+2]=_packet->naO[1];
04415 for(it=0;it<(finish-start+1);it++)
04416 {
04417 TX_array[it+start_pos+3]=uint8_t(_packet->data[it+start]);
04418 }
04419 break;
04420 case 1: TX_array[start_pos]=_packet->typeSourceID;
04421 for(it=0;it<4;it++)
04422 {
04423 TX_array[start_pos+1+it]=_packet->macOH[it];
04424 }
04425 for(it=0;it<4;it++)
04426 {
04427 TX_array[start_pos+5+it]=_packet->macOL[it];
04428 }
04429 for(it=0;it<(finish-start+1);it++)
04430 {
04431 TX_array[it+start_pos+9]=uint8_t(_packet->data[it+start]);
04432 }
04433 break;
04434 case 2: TX_array[start_pos]=_packet->typeSourceID;
04435 while(_packet->niO[it]!='#'){
04436 counter1++;
04437 it++;
04438 }
04439 counter1++;
04440 for(it=0;it<counter1;it++)
04441 {
04442 TX_array[start_pos+1+it]=uint8_t(_packet->niO[it]);
04443 }
04444 for(it=0;it<(finish-start+1);it++)
04445 {
04446 TX_array[it+start_pos+1+counter1]=uint8_t(_packet->data[it+start]);
04447 }
04448 break;
04449 default: break;
04450 }
04451 }
04452 }
04453
04454
04455
04456
04457
04458
04459
04460
04461
04462
04463
04464 void WaspXBeeCore::gen_frame_ap2(struct packetXBee* _packet, uint8_t* TX_array, uint8_t &protect, uint8_t type)
04465 {
04466 uint8_t a=1;
04467 uint8_t final=0;
04468 uint8_t unico=0;
04469 uint16_t aux=0;
04470 uint16_t aux2=0;
04471
04472 while(a<(_packet->frag_length+type+protect))
04473 {
04474 if( (TX_array[a]==17) && (unico==0) )
04475 {
04476 TX_array[a]=49;
04477 protect++;
04478 aux=TX_array[a];
04479 TX_array[a]=125;
04480 uint16_t l=a-1;
04481 while(final==0)
04482 {
04483 aux2=TX_array[l+2];
04484 TX_array[l+2]=aux;
04485 if( ((l+3)>=(_packet->frag_length+type+protect)) )
04486 {
04487 final=1;
04488 break;
04489 }
04490 aux=TX_array[l+3];
04491 TX_array[l+3]=aux2;
04492 if( ((l+4)>=(_packet->frag_length+type+protect)) )
04493 {
04494 final=1;
04495 break;
04496 }
04497 l++;
04498 l++;
04499 }
04500 final=0;
04501 unico=1;
04502 }
04503 if( (TX_array[a]==19) && (unico==0) )
04504 {
04505 TX_array[a]=51;
04506 protect++;
04507 aux=TX_array[a];
04508 TX_array[a]=125;
04509 uint16_t l=a-1;
04510 while(final==0)
04511 {
04512 aux2=TX_array[l+2];
04513 TX_array[l+2]=aux;
04514 if( ((l+3)>=(_packet->frag_length+type+protect)) )
04515 {
04516 final=1;
04517 break;
04518 }
04519 aux=TX_array[l+3];
04520 TX_array[l+3]=aux2;
04521 if( ((l+4)>=(_packet->frag_length+type+protect)) )
04522 {
04523 final=1;
04524 break;
04525 }
04526 l++;
04527 l++;
04528 }
04529 final=0;
04530 unico=1;
04531 }
04532 if( (TX_array[a]==126) && (unico==0) )
04533 {
04534 TX_array[a]=94;
04535 protect++;
04536 aux=TX_array[a];
04537 TX_array[a]=125;
04538 uint16_t l=a-1;
04539 while(final==0)
04540 {
04541 aux2=TX_array[l+2];
04542 TX_array[l+2]=aux;
04543 if( ((l+3)>=(_packet->frag_length+type+protect)) )
04544 {
04545 final=1;
04546 break;
04547 }
04548 aux=TX_array[l+3];
04549 TX_array[l+3]=aux2;
04550 if( ((l+4)>=(_packet->frag_length+type+protect)) )
04551 {
04552 final=1;
04553 break;
04554 }
04555 l++;
04556 l++;
04557 }
04558 final=0;
04559 unico=1;
04560 }
04561 if( (TX_array[a]==125) && (unico==0) )
04562 {
04563 TX_array[a]=93;
04564 protect++;
04565 aux=TX_array[a];
04566 TX_array[a]=125;
04567 uint16_t l=a-1;
04568 while(final==0)
04569 {
04570 aux2=TX_array[l+2];
04571 TX_array[l+2]=aux;
04572 if( ((l+3)>=(_packet->frag_length+type+protect)) )
04573 {
04574 final=1;
04575 break;
04576 }
04577 aux=TX_array[l+3];
04578 TX_array[l+3]=aux2;
04579 if( ((l+4)>=(_packet->frag_length+type+protect)) )
04580 {
04581 final=1;
04582 break;
04583 }
04584 l++;
04585 l++;
04586 }
04587 final=0;
04588 unico=1;
04589 }
04590 a++;
04591 unico=0;
04592 }
04593 }
04594
04595
04596
04597
04598
04599
04600
04601
04602
04603
04604
04605 int8_t WaspXBeeCore::parse_message(uint8_t* frame)
04606 {
04607 uint8_t* memory = (uint8_t*) calloc(MAX_PARSE,sizeof(uint8_t));
04608 if( memory==NULL ) return -1;
04609 uint16_t i=0;
04610 long previous=millis();
04611 long previous2=millis();
04612 uint8_t num_mes=0;
04613 uint8_t num_esc=0;
04614 uint16_t num_data=0;
04615 uint16_t length_mes=0;
04616 uint16_t length_prev=0;
04617 int8_t error=2;
04618 long interval=50;
04619 long intervalMAX=40000;
04620 uint8_t good_frame=0;
04621 uint8_t maxFrame=30;
04622
04623 long auxiliar = 0;
04624
04625
04626
04627 if( frameNext ){
04628 frameNext=0;
04629 memory[0]=0x7E;
04630 i=1;
04631 num_mes=1;
04632 }
04633
04634
04635 if( frame[0]==0xFF ){
04636 error_TX=txStatusResponse(memory);
04637 free(memory);
04638 memory=NULL;
04639 return error_TX;
04640 }
04641 else if( frame[0]==0xFE ){
04642 error_TX=txZBStatusResponse(memory);
04643 free(memory);
04644 memory=NULL;
04645 return error_TX;
04646 }
04647
04648
04649 if( frame[0]==0xEE ){
04650 interval=5;
04651 maxFrame=109;
04652 }
04653
04654
04655 if( frame[5]==0x45 && frame[6]==0x44 && protocol==XBEE_802_15_4 ) interval=2000;
04656
04657
04658 if( frame[5]==0x44 && frame[6]==0x4E ) interval=1000;
04659
04660
04661 if( frame[5]==0x4E && frame[6]==0x44 ){
04662 interval=20000;
04663 if(protocol==DIGIMESH) interval=40000;
04664 else if( (protocol==XBEE_900) || (protocol==XBEE_868) )
04665 {
04666 interval=14000;
04667 }
04668 }
04669
04670
04671 previous2=millis();
04672 previous=millis();
04673
04674 while( ((millis()-previous)<interval) && ((millis()-previous2)<intervalMAX) && i<MAX_PARSE && !frameNext )
04675 {
04676 if(XBee.available())
04677 {
04678 memory[i]=XBee.read();
04679 i++;
04680 if(memory[i-1]==0x7E){
04681 if( (MAX_PARSE-i) < maxFrame ) frameNext=1;
04682 else num_mes++;
04683 }
04684 previous=millis();
04685 }
04686 if( millis()-previous < 0 ) previous=millis();
04687 if( millis()-previous2 < 0 ) previous2=millis();
04688 }
04689
04690 num_data=i;
04691 i=1;
04692
04693
04694 if( memory[0]!=0x7E ) num_mes++;
04695
04696
04697 while( num_mes>0 )
04698 {
04699 while( memory[i]!=0x7E && i<num_data ) i++;
04700 length_mes=i-length_prev;
04701
04702
04703 for( it=0;it<length_mes;it++ )
04704 {
04705 if( memory[it+length_prev]==0x7D ) num_esc++;
04706 }
04707 if( num_esc ) des_esc(memory,length_mes,i-length_mes);
04708
04709 switch( memory[(i-length_mes)+3] )
04710 {
04711 case 0x88 : error=atCommandResponse(memory,frame,length_mes-num_esc+length_prev,i-length_mes);
04712 error_AT=error;
04713 break;
04714 case 0x8A : error=modemStatusResponse(memory,length_mes-num_esc+length_prev,i-length_mes);
04715 break;
04716 case 0x80 : error=rxData(memory,length_mes-num_esc+length_prev,i-length_mes);
04717 error_RX=error;
04718 break;
04719 case 0x81 : error=rxData(memory,length_mes-num_esc+length_prev,i-length_mes);
04720 error_RX=error;
04721 break;
04722 case 0x90 : error=rxData(memory,length_mes-num_esc+length_prev,i-length_mes);
04723 error_RX=error;
04724 break;
04725 case 0x91 : error=rxData(memory,length_mes-num_esc+length_prev,i-length_mes);
04726 error_RX=error;
04727 break;
04728 default : break;
04729 }
04730
04731 num_mes--;
04732 length_prev=i;
04733 i++;
04734 num_esc=0;
04735 if(!error) good_frame++;
04736 }
04737
04738 free(memory);
04739 memory=NULL;
04740
04741 if(good_frame) return 0;
04742 else return error;
04743 }
04744
04745
04746
04747
04748
04749
04750
04751
04752
04753
04754 void WaspXBeeCore::des_esc(uint8_t* data_in, uint16_t end, uint16_t start)
04755 {
04756 uint16_t i=0;
04757 uint16_t aux=0;
04758
04759 while( i<end )
04760 {
04761 while( data_in[start+i]!=0x7D && i<end ) i++;
04762 if( i<end )
04763 {
04764 aux=i+1;
04765 switch( data_in[start+i+1] )
04766 {
04767 case 0x31 : data_in[start+i]=0x11;
04768 break;
04769 case 0x33 : data_in[start+i]=0x13;
04770 break;
04771 case 0x5E : data_in[start+i]=0x7E;
04772 break;
04773 case 0x5D : data_in[start+i]=0x7D;
04774 break;
04775 }
04776 i++;
04777 end--;
04778 while( i<(end) ){
04779 data_in[start+i]=data_in[start+i+1];
04780 i++;
04781 }
04782 i=aux;
04783 }
04784 }
04785 }
04786
04787
04788
04789
04790
04791
04792
04793
04794
04795
04796
04797
04798
04799
04800 uint8_t WaspXBeeCore::atCommandResponse(uint8_t* data_in, uint8_t* frame, uint16_t end, uint16_t start)
04801 {
04802
04803 if(checkChecksum(data_in,end,start)) return 1;
04804
04805
04806 if( data_in[start+5]!=frame[5] || data_in[start+6]!=frame[6] ) return 1;
04807
04808
04809 if( (end-start)==9 ){
04810 if( data_in[start+7]==0 ) return 0;
04811 else return 1;
04812 }
04813
04814 if( data_in[start+7]!=0 ) return 1;
04815
04816 for(it=0;it<(end-start-9);it++)
04817 {
04818 data[it]=data_in[8+it+start];
04819 }
04820
04821
04822 data_length=end-start-9;
04823 if( frame[5]==0x4E && frame[6]==0x44 ){
04824 if( data_length>1 ) totalScannedBrothers++;
04825 treatScan();
04826 }
04827 return 0;
04828 }
04829
04830
04831
04832
04833
04834
04835
04836
04837
04838
04839
04840
04841
04842 uint8_t WaspXBeeCore::modemStatusResponse(uint8_t* data_in, uint16_t end, uint16_t start)
04843 {
04844
04845 if(checkChecksum(data_in,end,start)) return 1;
04846
04847 modem_status=data_in[start+4];
04848 return 0;
04849 }
04850
04851
04852
04853
04854
04855
04856
04857
04858
04859
04860
04861
04862
04863 uint8_t WaspXBeeCore::txStatusResponse(uint8_t* ByteIN)
04864 {
04865 long previous=millis();
04866 uint16_t numberBytes=7;
04867 uint8_t end=0;
04868 uint16_t counter3=0;
04869 uint8_t undesired=0;
04870 uint8_t status=0;
04871 uint16_t num_TX=0;
04872 uint8_t num_esc=0;
04873 int16_t interval=2000;
04874 uint8_t num_mes=0;
04875 uint16_t i=1;
04876 uint16_t length_mes=0;
04877 uint16_t length_prev=0;
04878 uint8_t maxFrame=110;
04879
04880 error_TX=2;
04881
04882 if( frameNext )
04883 {
04884 ByteIN[0]=0x7E;
04885 counter3=1;
04886 num_mes=1;
04887 frameNext=0;
04888 }
04889
04890 while( end==0 && !frameNext )
04891 {
04892 if(XBee.available()>0)
04893 {
04894 ByteIN[counter3]=XBee.read();
04895 counter3++;
04896 previous=millis();
04897 if(ByteIN[counter3-1]==0x7E){
04898 if( (MAX_PARSE-counter3) < maxFrame ) frameNext=1;
04899 else num_mes++;
04900 }
04901 if( (counter3==1) && (ByteIN[counter3-1]!=0x7E) ) counter3=0;
04902 if( counter3>=MAX_PARSE ) end=1;
04903 if( (counter3==4+status*6+undesired) && (undesired!=1) )
04904 {
04905 if( (ByteIN[counter3-1]!= 0x89) && (ByteIN[counter3-1]!=0x8A) ){
04906 undesired=1;
04907 numberBytes+=3;
04908 }
04909 }
04910 if( undesired==1 ) numberBytes++;
04911 if( (ByteIN[counter3-1]==0x7D) && (!undesired) )
04912 {
04913 numberBytes++;
04914 }
04915 if( (ByteIN[counter3-1]==0x8A) && (counter3==(4+status*6)) )
04916 {
04917 numberBytes+=6;
04918 status++;
04919 }
04920 if( (ByteIN[counter3-1]==0x7E) && (undesired==1) )
04921 {
04922 numberBytes--;
04923 undesired=numberBytes-7;
04924 }
04925 if(counter3==numberBytes)
04926 {
04927 end=1;
04928 }
04929 }
04930 if( millis()-previous < 0 ) previous=millis();
04931 if( (millis()-previous) > interval )
04932 {
04933 end=1;
04934 XBee.flush();
04935 }
04936 }
04937 num_TX=counter3;
04938 counter3=0;
04939
04940
04941 if( ByteIN[0]!=0x7E ) num_mes++;
04942
04943
04944 while( num_mes>0 )
04945 {
04946 while( ByteIN[i]!=0x7E && i<num_TX ) i++;
04947 length_mes=i-length_prev;
04948
04949
04950 for( it=0;it<length_mes;it++)
04951 {
04952 if( ByteIN[it+length_prev]==0x7D ) num_esc++;
04953 }
04954 if( num_esc ) des_esc(ByteIN,length_mes,i-length_mes);
04955
04956 switch( ByteIN[(i-length_mes)+3] )
04957 {
04958 case 0x8A : modemStatusResponse(ByteIN,length_mes-num_esc+length_prev,i-length_mes);
04959 break;
04960 case 0x80 : error_RX=rxData(ByteIN,length_mes-num_esc+length_prev,i-length_mes);
04961 break;
04962 case 0x81 : error_RX=rxData(ByteIN,length_mes-num_esc+length_prev,i-length_mes);
04963 break;
04964 case 0x89 : delivery_status=ByteIN[i-length_mes+5];
04965 if( delivery_status==0 ) error_TX=0;
04966 else error_TX=1;
04967 break;
04968 default : break;
04969 }
04970
04971 num_mes--;
04972 length_prev=i;
04973 i++;
04974 num_esc=0;
04975 }
04976
04977 return error_TX;
04978 }
04979
04980
04981
04982
04983
04984
04985
04986
04987
04988
04989
04990
04991 uint8_t WaspXBeeCore::txZBStatusResponse(uint8_t* ByteIN)
04992 {
04993 long previous=millis();
04994 uint16_t numberBytes=11;
04995 uint8_t end=0;
04996 uint16_t counter3=0;
04997 uint8_t undesired=0;
04998 uint8_t status=0;
04999 uint16_t num_TX=0;
05000 uint8_t num_esc=0;
05001 int16_t interval=2000;
05002 uint8_t num_mes=0;
05003 uint16_t i=1;
05004 uint16_t length_mes=0;
05005 uint16_t length_prev=0;
05006 uint8_t maxFrame=110;
05007
05008 error_TX=2;
05009
05010 if( frameNext )
05011 {
05012 ByteIN[0]=0x7E;
05013 counter3=1;
05014 num_mes=1;
05015 frameNext=0;
05016 }
05017
05018 while( end==0 && !frameNext )
05019 {
05020 if(XBee.available()>0)
05021 {
05022 ByteIN[counter3]=XBee.read();
05023 counter3++;
05024 previous=millis();
05025 if(ByteIN[counter3-1]==0x7E){
05026 if( (MAX_PARSE-counter3) < maxFrame ) frameNext=1;
05027 else num_mes++;
05028 }
05029 if( (counter3==1) && (ByteIN[counter3-1]!=0x7E) ) counter3=0;
05030 if( counter3>=MAX_PARSE ) end=1;
05031 if( (counter3==4+status*6+undesired) && (undesired!=1) )
05032 {
05033 if( (ByteIN[counter3-1]!= 0x8B) && (ByteIN[counter3-1]!=0x8A) ){
05034 undesired=1;
05035 numberBytes+=3;
05036 }
05037 }
05038 if( undesired==1 ) numberBytes++;
05039 if( (ByteIN[counter3-1]==0x7D) && (!undesired) )
05040 {
05041 numberBytes++;
05042 }
05043 if( (ByteIN[counter3-1]==0x8A) && (counter3==(4+status*6)) )
05044 {
05045 numberBytes+=6;
05046 status++;
05047 }
05048 if( (ByteIN[counter3-1]==0x7E) && (undesired==1) )
05049 {
05050 numberBytes--;
05051 undesired=numberBytes-7;
05052 }
05053 if(counter3==numberBytes)
05054 {
05055 end=1;
05056 }
05057 }
05058 if( millis()-previous < 0 ) previous=millis();
05059 if( (millis()-previous) > interval )
05060 {
05061 end=1;
05062 XBee.flush();
05063 }
05064 }
05065 num_TX=counter3;
05066 counter3=0;
05067
05068
05069 if( ByteIN[0]!=0x7E ) num_mes++;
05070
05071
05072 while( num_mes>0 )
05073 {
05074 while( ByteIN[i]!=0x7E && i<num_TX ) i++;
05075 length_mes=i-length_prev;
05076
05077
05078 for( it=0;it<length_mes;it++)
05079 {
05080 if( ByteIN[it+length_prev]==0x7D ) num_esc++;
05081 }
05082 if( num_esc ) des_esc(ByteIN,length_mes,i-length_mes);
05083
05084 switch( ByteIN[(i-length_mes)+3] )
05085 {
05086 case 0x8A : modemStatusResponse(ByteIN,length_mes-num_esc+length_prev,i-length_mes);
05087 break;
05088 case 0x90 : error_RX=rxData(ByteIN,length_mes-num_esc+length_prev,i-length_mes);
05089 break;
05090 case 0x91 : error_RX=rxData(ByteIN,length_mes-num_esc+length_prev,i-length_mes);
05091 break;
05092 case 0x8B : true_naD[0]=ByteIN[i-length_mes+5];
05093 true_naD[1]=ByteIN[i-length_mes+6];
05094 retries_sending=ByteIN[i-length_mes+7];
05095 discovery_status=ByteIN[i-length_mes+9];
05096 delivery_status=ByteIN[i-length_mes+8];
05097 if( delivery_status==0 ) error_TX=0;
05098 else error_TX=1;
05099 break;
05100 default : break;
05101 }
05102
05103 num_mes--;
05104 length_prev=i;
05105 i++;
05106 num_esc=0;
05107 }
05108
05109 return error_TX;
05110 }
05111
05112
05113
05114
05115
05116
05117
05118
05119
05120
05121
05122
05123 int8_t WaspXBeeCore::rxData(uint8_t* data_in, uint16_t end, uint16_t start)
05124 {
05125 uint8_t* byteIN = (uint8_t*) calloc(120,sizeof(uint8_t));
05126 int8_t error=2;
05127
05128
05129 if(checkChecksum(data_in,end,start)){
05130 free(byteIN);
05131 byteIN=NULL;
05132 return 1;
05133 }
05134
05135
05136 data_length=0;
05137 for(it=4+start;it<end-1;it++)
05138 {
05139 byteIN[it-4-start]=data_in[it];
05140 data_length++;
05141 }
05142
05143 switch( data_in[start+3] )
05144 {
05145 case 0x80 : add_type=_64B;
05146 break;
05147 case 0x81 : add_type=_16B;
05148 break;
05149 case 0x90 : mode=UNICAST;
05150 break;
05151 case 0x91 : mode=CLUSTER;
05152 break;
05153 }
05154
05155 error=readXBee(byteIN);
05156 free(byteIN);
05157 byteIN=NULL;
05158
05159 return error;
05160 }
05161
05162
05163
05164
05165
05166 void WaspXBeeCore::treatScan()
05167 {
05168 uint8_t cont2=0;
05169 uint8_t length_NI=data_length-19;
05170
05171 if(protocol==XBEE_802_15_4)
05172 {
05173 cont2=totalScannedBrothers-1;
05174 for(it=0;it<2;it++)
05175 {
05176 scannedBrothers[cont2].MY[it]=data[it];
05177 }
05178 for(it=0;it<4;it++)
05179 {
05180 scannedBrothers[cont2].SH[it]=data[it+2];
05181 }
05182 for(it=0;it<4;it++)
05183 {
05184 scannedBrothers[cont2].SL[it]=data[it+6];
05185 }
05186 scannedBrothers[cont2].RSSI=data[10];
05187 if (data_length>12)
05188 {
05189 for(it=0;it<(data_length-12);it++)
05190 {
05191 scannedBrothers[cont2].NI[it]=char(data[it+11]);
05192 }
05193 }
05194 }
05195 if( (protocol==ZIGBEE) || (protocol==DIGIMESH) || (protocol==XBEE_900) || (protocol==XBEE_868) )
05196 {
05197 cont2=totalScannedBrothers-1;
05198 for(it=0;it<2;it++)
05199 {
05200 scannedBrothers[cont2].MY[it]=data[it];
05201 }
05202 for(it=0;it<4;it++)
05203 {
05204 scannedBrothers[cont2].SH[it]=data[it+2];
05205 }
05206 for(it=0;it<4;it++)
05207 {
05208 scannedBrothers[cont2].SL[it]=data[it+6];
05209 }
05210 for(it=0;it<length_NI;it++)
05211 {
05212 scannedBrothers[cont2].NI[it]=char(data[it+10]);
05213 }
05214 for(it=0;it<2;it++)
05215 {
05216 scannedBrothers[cont2].PMY[it]=data[it+length_NI+11];
05217 }
05218 scannedBrothers[cont2].DT=data[length_NI+13];
05219 scannedBrothers[cont2].ST=data[length_NI+14];
05220 for(it=0;it<2;it++)
05221 {
05222 scannedBrothers[cont2].PID[it]=data[it+length_NI+15];
05223 }
05224 for(it=0;it<2;it++)
05225 {
05226 scannedBrothers[cont2].MID[it]=data[it+length_NI+17];
05227 }
05228 }
05229 }
05230
05231
05232
05233
05234
05235
05236
05237
05238
05239
05240
05241
05242 uint8_t WaspXBeeCore::checkChecksum(uint8_t* data_in, uint16_t end, uint16_t start)
05243 {
05244 uint16_t checksum=0;
05245
05246 for(it=3+start;it<end;it++)
05247 {
05248 checksum=checksum+data_in[it];
05249 }
05250 if( (checksum==255) ) return 0;
05251 checksum%=256;
05252 if( checksum!=255 ) return 1;
05253 return 0;
05254 }
05255
05256
05257
05258
05259 void WaspXBeeCore::clearCommand()
05260 {
05261 for(it=0;it<30;it++)
05262 {
05263 command[it]=0;
05264 }
05265 }
05266
05267
05268
05269
05270
05271 void WaspXBeeCore::freeIndex()
05272 {
05273 uint16_t counter1=0;
05274
05275 nextIndex1=0;
05276 while( counter1<MAX_FINISH_PACKETS )
05277 {
05278 for(it=counter1;it<(MAX_FINISH_PACKETS-1);it++)
05279 {
05280 if( pendingFragments[counter1]->time < pendingFragments[it+1]->time ) nextIndex1++;
05281 else break;
05282 }
05283 if( nextIndex1==(MAX_FINISH_PACKETS-1) ){
05284 nextIndex1=counter1;
05285 counter1=MAX_FINISH_PACKETS;
05286 }
05287 else nextIndex1=counter1+1;
05288 counter1++;
05289 }
05290 for(it=0;it<MAX_FRAG_PACKETS;it++)
05291 {
05292 free(packet_fragments[nextIndex1][it]);
05293 packet_fragments[nextIndex1][it]=NULL;
05294 }
05295 pendingFragments[nextIndex1]->time=0;
05296 free(pendingFragments[nextIndex1]);
05297 pendingFragments[nextIndex1]=NULL;
05298 pendingPackets--;
05299 indexNotModified=0;
05300 }
05301
05302
05303
05304
05305 void WaspXBeeCore::freeAll()
05306 {
05307 uint8_t temp=0;
05308
05309 for(temp=0;temp<MAX_FINISH_PACKETS;temp++)
05310 {
05311 for(it=0;it<MAX_FRAG_PACKETS;it++)
05312 {
05313
05314 free(packet_fragments[temp][it]);
05315 packet_fragments[temp][it]=NULL;
05316 }
05317 pendingFragments[temp]->time=0;
05318 free(pendingFragments[temp]);
05319 pendingFragments[temp]=NULL;
05320 }
05321 pendingPackets=0;
05322 nextIndex1=0;
05323 indexNotModified=0;
05324 }
05325
05326
05327
05328
05329 uint8_t WaspXBeeCore::getFinishIndex()
05330 {
05331 for(it=0;it<MAX_FINISH_PACKETS;it++)
05332 {
05333 if( packet_finished[it]==NULL ) break;
05334 }
05335 return it;
05336 }
05337
05338
05339
05340
05341 void WaspXBeeCore::clearFinishArray()
05342 {
05343 for(it=0;it<MAX_FINISH_PACKETS;it++)
05344 {
05345 free(packet_finished[it]);
05346 packet_finished[it]=NULL;
05347 }
05348 }
05349
05350
05351
05352
05353 uint8_t WaspXBeeCore::getIndexFIFO()
05354 {
05355 uint8_t position=0;
05356 uint16_t counter1=0;
05357
05358 while( counter1<MAX_FINISH_PACKETS )
05359 {
05360 for(it=counter1;it<(MAX_FINISH_PACKETS-1);it++)
05361 {
05362 if( packet_finished[counter1]->time < packet_finished[it+1]->time ) position++;
05363 else break;
05364 }
05365 if( position==(MAX_FINISH_PACKETS-1) ){
05366 position=counter1;
05367 counter1=MAX_FINISH_PACKETS;
05368 }
05369 else position=counter1+1;
05370 counter1++;
05371 }
05372 free(packet_finished[position]);
05373 packet_finished[position]=NULL;
05374 return position;
05375 }
05376
05377
05378
05379
05380 uint8_t WaspXBeeCore::getIndexLIFO()
05381 {
05382 uint8_t position=0;
05383 uint16_t counter1=0;
05384
05385 while( counter1<MAX_FINISH_PACKETS )
05386 {
05387 for(it=counter1;it<(MAX_FINISH_PACKETS-1);it++)
05388 {
05389 if( packet_finished[counter1]->time > packet_finished[it+1]->time ) position++;
05390 else break;
05391 }
05392 if( position==(MAX_FINISH_PACKETS-1) ){
05393 position=counter1;
05394 counter1=MAX_FINISH_PACKETS;
05395 }
05396 else position=counter1+1;
05397 counter1++;
05398 }
05399 free(packet_finished[position]);
05400 packet_finished[position]=NULL;
05401 return position;
05402 }
05403
05404
05405
05406
05407 void WaspXBeeCore::freeIndexMatrix(uint8_t position)
05408 {
05409 for(it=0;it<MAX_FRAG_PACKETS;it++)
05410 {
05411 free(packet_fragments[position][it]);
05412 packet_fragments[position][it]=NULL;
05413 }
05414 pendingFragments[position]->time=0;
05415 free(pendingFragments[position]);
05416 pendingFragments[position]=NULL;
05417 pendingPackets--;
05418 }
05419
05420
05421 WaspXBeeCore xbee = WaspXBeeCore();