Websocket example

Dependencies:   WebSocketClient

Fork of Websocket_Ethernet_HelloWorld by mbed_example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ATcommand.cpp Source File

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 }