Donavan Martin
/
Web_suck_et
Websocket example
Fork of Websocket_Ethernet_HelloWorld by
Embed:
(wiki syntax)
Show/hide line numbers
ATcommand.cpp
00001 #include "ATcommand.h" 00002 int timeout = 5000; 00003 char off[9] = {0x7E,0x00,0x05,0x09,0x01,0x44,0x30,0x04,0x7D}; 00004 char on[9] = {0x7E,0x00,0x05,0x09,0x01,0x44,0x30,0x05,0x7C}; 00005 00006 //-------------------------------------------- 00007 //------------- Application ------------------ 00008 //-------------------------------------------- 00009 void print(Serial *pc, char buff[]); 00010 void toggleError(Serial *xbee, Serial *pc, int delay, char * msg){ 00011 pc->printf("\n\r !!!!!!!!!!! %s !!!!!!!!!!!",msg); 00012 flush(xbee,pc); 00013 send(xbee,pc, on, 9); flush(xbee,pc); 00014 ATWR(xbee, pc); flush(xbee,pc); 00015 apply(xbee, pc); flush(xbee,pc); 00016 00017 wait_ms(delay); 00018 00019 send(xbee,pc, off, 9); flush(xbee,pc); 00020 ATWR(xbee, pc); flush(xbee,pc); 00021 apply(xbee, pc); flush(xbee,pc); 00022 } 00023 00024 void waitForConnection(Serial *xbee, Serial *pc, char * macAddr){ 00025 while(ND(xbee, pc, macAddr)==-1){} 00026 pc->printf("MAC FOUND"); 00027 flush(xbee,pc); 00028 } 00029 00030 void sendAccData(Serial *xbee, Serial *pc, char * macAddr ,char D[4]){ 00031 pc->printf("\n\rTransmit Data Request"); 00032 sendTR(xbee, pc, macAddr, D, 4); 00033 } 00034 00035 int decodePacket(Serial *xbee, Serial *pc, char *packet, int len){ 00036 int ret = 0; 00037 switch(packet[0]){ 00038 case 0x92: char * params= NULL; 00039 params = readParam(xbee, pc); 00040 free(params); 00041 ret = -1; 00042 break; 00043 case 0x8B: bool status = (packet[6]== 0x00); 00044 if(status){ 00045 pc->printf("\n\rData send succes"); 00046 ret= 0; 00047 }else{ 00048 pc->printf("\n\rData send failed. Status: 0x%X",packet[6]); 00049 ret= -1; 00050 } 00051 00052 break; 00053 default: pc->printf("\n\rTO DO: decoder for frame type 0x%x",packet[0]); break; 00054 } 00055 return ret; 00056 } 00057 00058 int receiveAcknowledge(Serial *xbee, Serial *pc){ 00059 char *packet = NULL; 00060 int ret = 0; 00061 if(0 == isStartDelimiter(xbee, pc)){ 00062 int l = getLenght(xbee, pc); 00063 packet = readFrame(xbee, pc); 00064 ret = decodePacket(xbee, pc, packet,l ); 00065 }else{ 00066 toggleError(xbee, pc, 200, "Error in FrameID"); 00067 ret = -1; 00068 } 00069 free(packet); 00070 return ret; 00071 } 00072 00073 //-------------------------------------------- 00074 //----------------- Network ------------------ 00075 //-------------------------------------------- 00076 char getStatusResponse(Serial *xbee, Serial *pc){ 00077 char *buf; 00078 char status; 00079 buf = read(xbee, pc,2, "AT Command"); 00080 free(buf); 00081 00082 char *frame = NULL; 00083 frame = readFrame(xbee, pc); 00084 status = frame[5]; 00085 free(frame); 00086 return status; 00087 } 00088 00089 int ND(Serial *xbee, Serial *pc, char * macAddr){ 00090 char AT_ND[2] = {0x4E,0x44}; 00091 sendAT(xbee, pc, AT_ND, NULL, 0); 00092 free(AT_ND); 00093 00094 int time = timeout; 00095 while(time >=0){ 00096 //wait_ms(10); 00097 time -= 10; 00098 if(xbee->readable()){ 00099 isStartDelimiter(xbee,pc); 00100 int len = getLenght(xbee,pc); 00101 00102 char *c; 00103 c = readFrame(xbee, pc); 00104 00105 00106 if(len>14){ 00107 pc->printf("\n\r\tMAC adresse:"); 00108 for(int i=0; i<8;i++){ 00109 macAddr[i] = c[i+7]; 00110 pc->printf("0x%x ", c[i+7]); 00111 } 00112 }else{ 00113 toggleError(xbee, pc, 200, "\n\r !!! Mac adresse not return !!!"); 00114 return -1; 00115 } 00116 flush(xbee,pc); 00117 free(c); 00118 return 0; 00119 } 00120 } 00121 pc->printf("WARNING : Connection Lost!"); 00122 return -1; 00123 } 00124 00125 00126 //-------------------------------------------- 00127 //------------------- MAC -------------------- 00128 //-------------------------------------------- 00129 int isStartDelimiter(Serial *xbee, Serial *pc){ 00130 pc->printf("\n\r\tRECEIVE:"); 00131 return (xbee->getc() == 0x7E) ? 0 : -1; 00132 } 00133 int getLenght(Serial *xbee, Serial *pc){ 00134 char *buf; 00135 buf = read(xbee, pc, 2, "Lenght"); 00136 int result = buf[0] << 8 | buf[1]; 00137 free(buf); 00138 return result; 00139 } 00140 char * readFrame(Serial *xbee, Serial *pc){ 00141 int l = 0; 00142 char *packet = NULL; 00143 while(xbee->readable()) { 00144 packet = (char*)realloc(packet ,sizeof(char)*(l+1)); 00145 packet[l++] = xbee->getc(); 00146 } 00147 //wait_ms(10); // CPU to fast 00148 pc->printf("\n\r\tFrame:"); 00149 for(int i=0; i<l; i++){ 00150 pc->printf("0x%x ",packet[i]); 00151 } 00152 return packet; 00153 } 00154 char * readParam(Serial *xbee, Serial *pc){ 00155 int l = 0; 00156 char *packet = NULL; 00157 while(xbee->readable()) { 00158 packet = (char*)realloc(&packet[0],sizeof(char)*(l+1)); 00159 packet[l++] = xbee->getc(); 00160 } 00161 //wait_ms(50); // CPU to fast 00162 pc->printf("\n\r\tParams:"); 00163 for(int i=0; i<l; i++){ 00164 pc->printf("0x%x ",packet[i]); 00165 } 00166 return packet; 00167 } 00168 00169 00170 00171 //-------------------------------------------- 00172 //------------------- PHY -------------------- 00173 //-------------------------------------------- 00174 char read(Serial *xbee, Serial *pc, char* msg){ 00175 char c; 00176 pc->printf("\n\r\t %s:",msg); 00177 c = xbee->getc(); 00178 pc->printf(" 0x%X", c); 00179 if(strstr(msg, "Status")!= NULL){ 00180 if((int)c != 0){ 00181 toggleError(xbee, pc, 200, "Bad Status"); 00182 } 00183 } 00184 //wait_ms(10);// CPU to fast 00185 return c; 00186 } 00187 void send(Serial* xbee, Serial* pc, char * b, int size){ 00188 pc->printf("\n\r\tSEND:"); 00189 for(int i=0 ;i<size; i=i++){ 00190 xbee->putc(b[i]); 00191 pc->printf(" 0x%X", b[i]); 00192 } 00193 } 00194 void sendAT(Serial *xbee, Serial *pc, char* command, char* params, int lenparams){ 00195 uint8_t len = 4 + lenparams; 00196 //printf("Lenght is: %d\n", len); 00197 00198 char c[4+len]; 00199 c[0]= 0x7E; 00200 c[1]= len >> 8 ; 00201 c[2]= len; 00202 00203 c[3]= 0x09; 00204 c[4]= 0x01; 00205 c[5] = command[0]; 00206 c[6] = command[1]; 00207 int i =0; 00208 for(; i<lenparams; i++){ 00209 c[i+7] = params[i]; 00210 } 00211 char check; 00212 check = checksum(c,lenparams+4 ); 00213 c[i+7] = check; 00214 00215 send(xbee,pc, c,len+4); 00216 free(c); 00217 } 00218 00219 void sendTR(Serial *xbee, Serial *pc, char macAddr[8], char RFdata[], int lenparams ){ 00220 uint8_t len = 14 + lenparams; 00221 00222 char c[4+len]; 00223 c[0]= 0x7E; 00224 c[1]= len >> 8 ; 00225 c[2]= len; 00226 00227 c[3]= 0x10; 00228 c[4]= 0x01; 00229 c[5] = macAddr[0]; 00230 c[6] = macAddr[1]; 00231 c[7] = macAddr[2]; 00232 c[8] = macAddr[3]; 00233 c[9] = macAddr[4]; 00234 c[10] = macAddr[5]; 00235 c[11] = macAddr[6]; 00236 c[12] = macAddr[7]; 00237 c[13] = 0xFF; 00238 c[14] = 0xFE; 00239 c[15] = 0x00; 00240 c[16] = 0x00; 00241 int i =0; 00242 for(; i<lenparams; i++){ 00243 c[i+17] = RFdata[i]; 00244 } 00245 char check; 00246 check = checksum(c,len); 00247 c[i+17] = check; 00248 00249 send(xbee,pc, c,4+len); 00250 free(c); 00251 } 00252 00253 char checksum(char* array, int size){ 00254 char checksum = 0x00; 00255 for(int x = 3; x < size+3; x++){ 00256 checksum += array[x]; 00257 //printf("\n\r 0x%X --> 0x%x",array[x],checksum); 00258 } 00259 //printf("\n\r substract 0xFF"); 00260 checksum = 0xFF - checksum; 00261 //printf("\n\rChecksum is: 0x%x\n", checksum); 00262 return checksum; 00263 } 00264 00265 void ATWR(Serial *xbee, Serial *pc){ 00266 char c[8] = {0x7E,0x00,0x04,0x09,0x01,0x57,0x52,0x4C}; 00267 send(xbee,pc, c,8); 00268 //free(c); 00269 } 00270 void apply(Serial *xbee, Serial *pc){ 00271 char c[8] = {0x7E,0x00,0x04,0x09,0x01,0x41,0x43,0x71}; 00272 send(xbee,pc, c,8); 00273 //free(c); 00274 } 00275 void flush(Serial *xbee, Serial *pc){ 00276 while(xbee->readable()) { 00277 char c = xbee->getc(); 00278 //pc->printf("%X ",c); 00279 } 00280 } 00281 00282 00283 char * read(Serial *xbee, Serial *pc, int nbyte, char* msg){ 00284 pc->printf("\n\r\t%s:",msg); 00285 char *buff = NULL; 00286 if(xbee->readable()) { 00287 for(int i=0; i<nbyte; i++){ 00288 buff = (char*)realloc(buff ,sizeof(char)*(i+1)); 00289 buff[i] = xbee->getc(); 00290 } 00291 } 00292 00293 //wait_ms(10); // CPU to fast 00294 for(int i=0; i<nbyte; i++){ 00295 pc->printf("0x%X ", buff[i]); 00296 } 00297 return buff; 00298 }
Generated on Sat Jul 16 2022 18:21:49 by 1.7.2