Colin Stearns
/
qcControl
QC Control software
Fork of dgps by
packet.h@18:e72ee7aed088, 2014-04-20 (annotated)
- Committer:
- krobertson
- Date:
- Sun Apr 20 08:04:37 2014 +0000
- Revision:
- 18:e72ee7aed088
- Parent:
- 16:4f5d20b87dc3
- Child:
- 19:8c1f2a2204fb
new communication module. Need to add open and close connection to sync packet and end packet but otherwise looks like it will work.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
krobertson | 18:e72ee7aed088 | 1 | #include <InterruptIn.h> |
krobertson | 18:e72ee7aed088 | 2 | |
dylanembed123 | 12:e42985e3ea64 | 3 | #define PACKETSIZE 256 |
dylanembed123 | 12:e42985e3ea64 | 4 | |
dylanembed123 | 12:e42985e3ea64 | 5 | // Example |
dylanembed123 | 12:e42985e3ea64 | 6 | // Packet 1. (SuperPackid=5,type=PT_IMAGE,size=0) |
dylanembed123 | 12:e42985e3ea64 | 7 | // Packet 2. (SuperPackid=5,type=PT_DEFAULT,size=1024) |
dylanembed123 | 12:e42985e3ea64 | 8 | // Packet 3. (SuperPackid=5,type=PT_DEFAULT,size=1000) |
dylanembed123 | 12:e42985e3ea64 | 9 | // Packet 4. (SuperPackid=5,type=PT_END,size=0) |
dylanembed123 | 15:e3e03a9df89e | 10 | #define XBEEON |
dylanembed123 | 12:e42985e3ea64 | 11 | enum PACKET_TYPE{ |
dylanembed123 | 14:6be57da62283 | 12 | PT_EMPTY=0, |
dylanembed123 | 14:6be57da62283 | 13 | PT_DEFAULT, |
dylanembed123 | 12:e42985e3ea64 | 14 | PT_END, |
dylanembed123 | 12:e42985e3ea64 | 15 | PT_IMAGE, |
dylanembed123 | 15:e3e03a9df89e | 16 | PT_IMAGEHEAD, |
dylanembed123 | 15:e3e03a9df89e | 17 | PT_REQLOC, |
dylanembed123 | 15:e3e03a9df89e | 18 | PT_SENDLOC, |
dylanembed123 | 15:e3e03a9df89e | 19 | PT_WAY, |
dylanembed123 | 12:e42985e3ea64 | 20 | PT_SIZE |
dylanembed123 | 12:e42985e3ea64 | 21 | }; |
dylanembed123 | 12:e42985e3ea64 | 22 | typedef struct PacketStruct{ |
dylanembed123 | 13:a6d3cf2b018e | 23 | unsigned int type; |
dylanembed123 | 12:e42985e3ea64 | 24 | unsigned int size;// Number of valid bits |
dylanembed123 | 12:e42985e3ea64 | 25 | char data[PACKETSIZE]; |
dylanembed123 | 12:e42985e3ea64 | 26 | unsigned int superPackID;// |
dylanembed123 | 14:6be57da62283 | 27 | char special[4];// Set to FF when |
dylanembed123 | 12:e42985e3ea64 | 28 | }PacketStruct; |
dylanembed123 | 12:e42985e3ea64 | 29 | |
dylanembed123 | 12:e42985e3ea64 | 30 | class PacketSender{ |
dylanembed123 | 12:e42985e3ea64 | 31 | private: |
dylanembed123 | 12:e42985e3ea64 | 32 | unsigned int superID; |
dylanembed123 | 12:e42985e3ea64 | 33 | public: |
dylanembed123 | 12:e42985e3ea64 | 34 | unsigned int getSuperID(){return superID++;} |
dylanembed123 | 13:a6d3cf2b018e | 35 | PacketSender():superID(0),outputDevice( |
dylanembed123 | 13:a6d3cf2b018e | 36 | #ifdef XBEEON |
dylanembed123 | 13:a6d3cf2b018e | 37 | XBEE::getSerial() |
dylanembed123 | 13:a6d3cf2b018e | 38 | #else |
dylanembed123 | 13:a6d3cf2b018e | 39 | USB::getSerial() |
dylanembed123 | 13:a6d3cf2b018e | 40 | #endif |
krobertson | 18:e72ee7aed088 | 41 | ),setTCPConStatus( |
krobertson | 18:e72ee7aed088 | 42 | XBEE::getTCPConOut() |
krobertson | 18:e72ee7aed088 | 43 | ),getTCPConStatus( |
krobertson | 18:e72ee7aed088 | 44 | XBEE::getTCPConIn() |
dylanembed123 | 16:4f5d20b87dc3 | 45 | ),next(NULL){ |
dylanembed123 | 16:4f5d20b87dc3 | 46 | //outputDevice.attach(this,&PacketSender::handleUpdate,Serial::RxIrq); |
dylanembed123 | 16:4f5d20b87dc3 | 47 | lastValid=NULL; |
dylanembed123 | 16:4f5d20b87dc3 | 48 | } |
dylanembed123 | 12:e42985e3ea64 | 49 | Serial& outputDevice; |
krobertson | 18:e72ee7aed088 | 50 | DigitalOut& setTCPConStatus; |
krobertson | 18:e72ee7aed088 | 51 | DigitalIn& getTCPConStatus; |
dylanembed123 | 12:e42985e3ea64 | 52 | void sendPacket(PacketStruct& output){ |
dylanembed123 | 12:e42985e3ea64 | 53 | for(int a=0;a<sizeof(PacketStruct);a++){ |
dylanembed123 | 14:6be57da62283 | 54 | while(!outputDevice.writeable()){} |
dylanembed123 | 12:e42985e3ea64 | 55 | outputDevice.putc(((char*)(&output))[a]); |
dylanembed123 | 15:e3e03a9df89e | 56 | //wait_us(10); |
dylanembed123 | 13:a6d3cf2b018e | 57 | //USB::getSerial().putc(((char*)(&output))[a]); |
dylanembed123 | 12:e42985e3ea64 | 58 | } |
dylanembed123 | 14:6be57da62283 | 59 | //wait_ms(100); |
dylanembed123 | 12:e42985e3ea64 | 60 | } |
krobertson | 18:e72ee7aed088 | 61 | |
krobertson | 18:e72ee7aed088 | 62 | void wait_for_egg(){ |
krobertson | 18:e72ee7aed088 | 63 | char response[40]; |
krobertson | 18:e72ee7aed088 | 64 | while(1){ |
krobertson | 18:e72ee7aed088 | 65 | while(!outputDevice.readable()){} |
krobertson | 18:e72ee7aed088 | 66 | outputDevice.scanf("%s",response); |
krobertson | 18:e72ee7aed088 | 67 | if(strcmp(response,"DHCP:") == 0){ |
krobertson | 18:e72ee7aed088 | 68 | USB::getSerial().printf("Egg Connected!\r\n"); |
krobertson | 18:e72ee7aed088 | 69 | for(int a=0;a<100000000;a++); |
krobertson | 18:e72ee7aed088 | 70 | while(outputDevice.readable()){ |
krobertson | 18:e72ee7aed088 | 71 | outputDevice.getc(); |
krobertson | 18:e72ee7aed088 | 72 | } |
krobertson | 18:e72ee7aed088 | 73 | return; |
krobertson | 18:e72ee7aed088 | 74 | } |
krobertson | 18:e72ee7aed088 | 75 | } |
krobertson | 18:e72ee7aed088 | 76 | } |
krobertson | 18:e72ee7aed088 | 77 | |
krobertson | 18:e72ee7aed088 | 78 | void openConnection(char close_conn = 0){ |
krobertson | 18:e72ee7aed088 | 79 | __disable_irq(); |
krobertson | 18:e72ee7aed088 | 80 | while(!getTCPConStatus){ |
krobertson | 18:e72ee7aed088 | 81 | setTCPConStatus = 0; |
krobertson | 18:e72ee7aed088 | 82 | wait_us(500000); |
krobertson | 18:e72ee7aed088 | 83 | setTCPConStatus = 1; |
krobertson | 18:e72ee7aed088 | 84 | wait_us(500000); |
krobertson | 18:e72ee7aed088 | 85 | } |
krobertson | 18:e72ee7aed088 | 86 | __enable_irq(); |
krobertson | 18:e72ee7aed088 | 87 | //for(int a=0;a<10000000;a++); |
krobertson | 18:e72ee7aed088 | 88 | // char connected = 0; |
krobertson | 18:e72ee7aed088 | 89 | // char in_cmd_mode = 0; |
krobertson | 18:e72ee7aed088 | 90 | // char response[80]; |
krobertson | 18:e72ee7aed088 | 91 | // int charcount; |
krobertson | 18:e72ee7aed088 | 92 | // |
krobertson | 18:e72ee7aed088 | 93 | // while(in_cmd_mode == 0){ |
krobertson | 18:e72ee7aed088 | 94 | // //get into command mode |
krobertson | 18:e72ee7aed088 | 95 | // while(!outputDevice.writeable()){} |
krobertson | 18:e72ee7aed088 | 96 | // outputDevice.putc('$'); |
krobertson | 18:e72ee7aed088 | 97 | // while(!outputDevice.writeable()){} |
krobertson | 18:e72ee7aed088 | 98 | // outputDevice.putc('$'); |
krobertson | 18:e72ee7aed088 | 99 | // while(!outputDevice.writeable()){} |
krobertson | 18:e72ee7aed088 | 100 | // outputDevice.putc('$'); |
krobertson | 18:e72ee7aed088 | 101 | // while(!outputDevice.writeable()){} |
krobertson | 18:e72ee7aed088 | 102 | // while(!outputDevice.readable()){} |
krobertson | 18:e72ee7aed088 | 103 | // //outputDevice.scanf("%s",response); |
krobertson | 18:e72ee7aed088 | 104 | // charcount = 0; |
krobertson | 18:e72ee7aed088 | 105 | // while(outputDevice.readable()){ |
krobertson | 18:e72ee7aed088 | 106 | // response[charcount] = outputDevice.getc(); |
krobertson | 18:e72ee7aed088 | 107 | // charcount++; |
krobertson | 18:e72ee7aed088 | 108 | // for(int a=0;a<10000;a++); |
krobertson | 18:e72ee7aed088 | 109 | // } |
krobertson | 18:e72ee7aed088 | 110 | // response[charcount] = 0; |
krobertson | 18:e72ee7aed088 | 111 | // USB::getSerial().printf("%s",response); |
krobertson | 18:e72ee7aed088 | 112 | // if(strcmp(response+strlen(response)-5,"CMD\r\n") == 0){ |
krobertson | 18:e72ee7aed088 | 113 | // in_cmd_mode = 1; |
krobertson | 18:e72ee7aed088 | 114 | // }else{ |
krobertson | 18:e72ee7aed088 | 115 | // while(1); |
krobertson | 18:e72ee7aed088 | 116 | // } |
krobertson | 18:e72ee7aed088 | 117 | // USB::getSerial().printf("in cmd mode: %d\r\n",in_cmd_mode); |
krobertson | 18:e72ee7aed088 | 118 | // } |
krobertson | 18:e72ee7aed088 | 119 | // //open the connection! |
krobertson | 18:e72ee7aed088 | 120 | // while(connected == 0){ |
krobertson | 18:e72ee7aed088 | 121 | // for(int a=0;a<10000000;a++); |
krobertson | 18:e72ee7aed088 | 122 | // while(!outputDevice.writeable()){} |
krobertson | 18:e72ee7aed088 | 123 | // if(close_conn){ |
krobertson | 18:e72ee7aed088 | 124 | // outputDevice.printf("close"); |
krobertson | 18:e72ee7aed088 | 125 | // while(!outputDevice.writeable()){} |
krobertson | 18:e72ee7aed088 | 126 | // outputDevice.putc(0); |
krobertson | 18:e72ee7aed088 | 127 | // while(!outputDevice.writeable()){} |
krobertson | 18:e72ee7aed088 | 128 | // outputDevice.printf("exit"); |
krobertson | 18:e72ee7aed088 | 129 | // }else{ |
krobertson | 18:e72ee7aed088 | 130 | // outputDevice.printf("open 1.2.3.14 7000"); |
krobertson | 18:e72ee7aed088 | 131 | // } |
krobertson | 18:e72ee7aed088 | 132 | // while(!outputDevice.writeable()){} |
krobertson | 18:e72ee7aed088 | 133 | // outputDevice.putc(0); |
krobertson | 18:e72ee7aed088 | 134 | // while(!outputDevice.writeable()){} |
krobertson | 18:e72ee7aed088 | 135 | // if(0 && !close_conn){ |
krobertson | 18:e72ee7aed088 | 136 | // for(int a=0;a<5;a++){ |
krobertson | 18:e72ee7aed088 | 137 | // while(!outputDevice.readable()){} |
krobertson | 18:e72ee7aed088 | 138 | // outputDevice.scanf("%s",response); |
krobertson | 18:e72ee7aed088 | 139 | // USB::getSerial().printf("%s ",response); |
krobertson | 18:e72ee7aed088 | 140 | // } |
krobertson | 18:e72ee7aed088 | 141 | // } |
krobertson | 18:e72ee7aed088 | 142 | // while(!outputDevice.readable()){} |
krobertson | 18:e72ee7aed088 | 143 | // for(int a=0;a<10000000;a++); |
krobertson | 18:e72ee7aed088 | 144 | // charcount = 0; |
krobertson | 18:e72ee7aed088 | 145 | // while(outputDevice.readable()){ |
krobertson | 18:e72ee7aed088 | 146 | // response[charcount] = outputDevice.getc(); |
krobertson | 18:e72ee7aed088 | 147 | // USB::getSerial().putc(response[charcount]); |
krobertson | 18:e72ee7aed088 | 148 | // charcount++; |
krobertson | 18:e72ee7aed088 | 149 | // for(int a=0;a<10000;a++); |
krobertson | 18:e72ee7aed088 | 150 | // } |
krobertson | 18:e72ee7aed088 | 151 | // response[charcount] = 0; |
krobertson | 18:e72ee7aed088 | 152 | // USB::getSerial().printf("RESPONSE: %s\r\n",response); |
krobertson | 18:e72ee7aed088 | 153 | // if(close_conn){ |
krobertson | 18:e72ee7aed088 | 154 | // connected = 1; |
krobertson | 18:e72ee7aed088 | 155 | // }else{ |
krobertson | 18:e72ee7aed088 | 156 | // if(strcmp(response+strlen(response)-6,"*OPEN*") == 0){ |
krobertson | 18:e72ee7aed088 | 157 | // connected = 1; |
krobertson | 18:e72ee7aed088 | 158 | // } |
krobertson | 18:e72ee7aed088 | 159 | // } |
krobertson | 18:e72ee7aed088 | 160 | // USB::getSerial().printf("connected: %d\r\n",connected); |
krobertson | 18:e72ee7aed088 | 161 | // } |
krobertson | 18:e72ee7aed088 | 162 | // for(int a=0;a<1000000;a++); |
krobertson | 18:e72ee7aed088 | 163 | } |
krobertson | 18:e72ee7aed088 | 164 | void closeConnection(){ |
krobertson | 18:e72ee7aed088 | 165 | wait_us(100000); |
krobertson | 18:e72ee7aed088 | 166 | __disable_irq(); |
krobertson | 18:e72ee7aed088 | 167 | while(getTCPConStatus){ |
krobertson | 18:e72ee7aed088 | 168 | setTCPConStatus = 0; |
krobertson | 18:e72ee7aed088 | 169 | wait_us(50000); |
krobertson | 18:e72ee7aed088 | 170 | } |
krobertson | 18:e72ee7aed088 | 171 | } |
dylanembed123 | 12:e42985e3ea64 | 172 | unsigned int min(unsigned int a,unsigned int b){ |
dylanembed123 | 12:e42985e3ea64 | 173 | return a<b ? a : b; |
dylanembed123 | 12:e42985e3ea64 | 174 | } |
dylanembed123 | 12:e42985e3ea64 | 175 | void sendPacket(unsigned int superPackID,char* data,unsigned int size,PACKET_TYPE type = PT_END){ |
dylanembed123 | 12:e42985e3ea64 | 176 | if(data!=NULL && size>0){ |
dylanembed123 | 13:a6d3cf2b018e | 177 | for(int i=0;i<=(size-1)/PACKETSIZE;i++){ |
dylanembed123 | 12:e42985e3ea64 | 178 | PacketStruct output; |
dylanembed123 | 12:e42985e3ea64 | 179 | output.type=PT_DEFAULT; |
dylanembed123 | 12:e42985e3ea64 | 180 | output.superPackID=superPackID; |
dylanembed123 | 12:e42985e3ea64 | 181 | output.size=min(PACKETSIZE,size-i*PACKETSIZE); |
dylanembed123 | 14:6be57da62283 | 182 | for(int a=0;a<4;a++){output.special[a]='\0';}output.special[3]=0xAA; |
dylanembed123 | 14:6be57da62283 | 183 | for(int a=0;a<output.size;a++){output.data[a]=data[a-i*PACKETSIZE];} |
dylanembed123 | 13:a6d3cf2b018e | 184 | for(int a=output.size;a<PACKETSIZE;a++){output.data[a]='\0';} |
dylanembed123 | 12:e42985e3ea64 | 185 | sendPacket(output); |
dylanembed123 | 12:e42985e3ea64 | 186 | } |
dylanembed123 | 12:e42985e3ea64 | 187 | }else{ |
dylanembed123 | 12:e42985e3ea64 | 188 | PacketStruct output; |
dylanembed123 | 12:e42985e3ea64 | 189 | output.type=type; |
dylanembed123 | 13:a6d3cf2b018e | 190 | output.size=0; |
dylanembed123 | 12:e42985e3ea64 | 191 | output.superPackID=superPackID; |
dylanembed123 | 14:6be57da62283 | 192 | for(int a=0;a<4;a++){output.special[a]='\0';}output.special[3]=0xAA; |
dylanembed123 | 14:6be57da62283 | 193 | // Check for empty packet |
dylanembed123 | 14:6be57da62283 | 194 | if(output.type==PT_EMPTY){output.type=0;output.size=0;output.superPackID=0;output.special[3]=0xFF;} |
dylanembed123 | 14:6be57da62283 | 195 | for(int a=0;a<PACKETSIZE;a++){output.data[a]='\0';} |
dylanembed123 | 12:e42985e3ea64 | 196 | sendPacket(output); |
dylanembed123 | 12:e42985e3ea64 | 197 | } |
dylanembed123 | 12:e42985e3ea64 | 198 | } |
dylanembed123 | 16:4f5d20b87dc3 | 199 | PacketStruct* lastValid; |
dylanembed123 | 16:4f5d20b87dc3 | 200 | bool found; |
dylanembed123 | 16:4f5d20b87dc3 | 201 | void handleUpdate(){ |
dylanembed123 | 16:4f5d20b87dc3 | 202 | USB::getSerial().printf("Interupt\n"); |
dylanembed123 | 16:4f5d20b87dc3 | 203 | PacketStruct* next = getNextPacket(); |
dylanembed123 | 16:4f5d20b87dc3 | 204 | if(next!=NULL){lastValid=next;} |
dylanembed123 | 16:4f5d20b87dc3 | 205 | } |
dylanembed123 | 14:6be57da62283 | 206 | |
dylanembed123 | 14:6be57da62283 | 207 | // Number of consecutive zeros |
dylanembed123 | 14:6be57da62283 | 208 | unsigned int numZeros; |
dylanembed123 | 14:6be57da62283 | 209 | // Return true if a resync command has been received |
dylanembed123 | 14:6be57da62283 | 210 | bool resetCheck(char input){ |
dylanembed123 | 14:6be57da62283 | 211 | if(input=='\0'){ |
dylanembed123 | 14:6be57da62283 | 212 | numZeros++; |
dylanembed123 | 14:6be57da62283 | 213 | }else if(numZeros==sizeof(PacketStruct)-1&&input==0xFF){ |
dylanembed123 | 14:6be57da62283 | 214 | return true; |
dylanembed123 | 14:6be57da62283 | 215 | }else{ |
dylanembed123 | 14:6be57da62283 | 216 | numZeros=0; |
dylanembed123 | 14:6be57da62283 | 217 | } |
dylanembed123 | 14:6be57da62283 | 218 | return false; |
dylanembed123 | 14:6be57da62283 | 219 | } |
dylanembed123 | 14:6be57da62283 | 220 | |
dylanembed123 | 14:6be57da62283 | 221 | // Temperary storage for next valid |
dylanembed123 | 14:6be57da62283 | 222 | PacketStruct* next; |
dylanembed123 | 14:6be57da62283 | 223 | // Number of valid bits in next packet |
dylanembed123 | 14:6be57da62283 | 224 | int nextValid; |
dylanembed123 | 14:6be57da62283 | 225 | /// \brief Grab the next packet |
dylanembed123 | 12:e42985e3ea64 | 226 | PacketStruct* getNextPacket(){ |
dylanembed123 | 14:6be57da62283 | 227 | // Check for null packet |
dylanembed123 | 14:6be57da62283 | 228 | if(next==NULL){next=new PacketStruct();nextValid=0;} |
dylanembed123 | 14:6be57da62283 | 229 | // Create reset packet which resets on re-sync command |
dylanembed123 | 14:6be57da62283 | 230 | bool resetPacket=false; |
dylanembed123 | 14:6be57da62283 | 231 | |
dylanembed123 | 14:6be57da62283 | 232 | // While there is data to read |
dylanembed123 | 14:6be57da62283 | 233 | while(0<outputDevice.readable()){ |
dylanembed123 | 14:6be57da62283 | 234 | // Check if a full packet has been received |
dylanembed123 | 14:6be57da62283 | 235 | if(nextValid==sizeof(PacketStruct))break; |
dylanembed123 | 14:6be57da62283 | 236 | // Read in next char |
dylanembed123 | 14:6be57da62283 | 237 | char input=outputDevice.getc(); |
dylanembed123 | 16:4f5d20b87dc3 | 238 | USB::getSerial().printf("Read ByteC %X %X\n",nextValid,input); |
dylanembed123 | 14:6be57da62283 | 239 | // Check for valid char |
dylanembed123 | 14:6be57da62283 | 240 | if(resetCheck(input)){resetPacket=true;break;} |
dylanembed123 | 14:6be57da62283 | 241 | // Set char |
dylanembed123 | 14:6be57da62283 | 242 | ((char*)next)[nextValid++] = input; |
dylanembed123 | 14:6be57da62283 | 243 | } |
dylanembed123 | 14:6be57da62283 | 244 | |
dylanembed123 | 14:6be57da62283 | 245 | if(nextValid==sizeof(PacketStruct)||resetPacket){ |
dylanembed123 | 14:6be57da62283 | 246 | // Reset packet |
dylanembed123 | 14:6be57da62283 | 247 | PacketStruct* output=next;next=NULL; |
dylanembed123 | 14:6be57da62283 | 248 | // Return |
dylanembed123 | 14:6be57da62283 | 249 | return resetPacket?NULL:output; |
dylanembed123 | 14:6be57da62283 | 250 | } |
dylanembed123 | 14:6be57da62283 | 251 | return NULL; |
dylanembed123 | 14:6be57da62283 | 252 | /* |
dylanembed123 | 12:e42985e3ea64 | 253 | int avail = outputDevice.readable(); |
dylanembed123 | 12:e42985e3ea64 | 254 | if(avail <= 0)return NULL; |
dylanembed123 | 12:e42985e3ea64 | 255 | PacketStruct* output=new PacketStruct(); |
dylanembed123 | 12:e42985e3ea64 | 256 | for(int i=0;i<sizeof(PacketStruct);i++){ |
dylanembed123 | 12:e42985e3ea64 | 257 | // Wait for byte |
dylanembed123 | 12:e42985e3ea64 | 258 | while(outputDevice.readable()<=0){} |
dylanembed123 | 12:e42985e3ea64 | 259 | ((char*)output)[i] = outputDevice.getc(); |
dylanembed123 | 12:e42985e3ea64 | 260 | } |
dylanembed123 | 12:e42985e3ea64 | 261 | return output; |
dylanembed123 | 14:6be57da62283 | 262 | */ |
dylanembed123 | 12:e42985e3ea64 | 263 | } |
dylanembed123 | 12:e42985e3ea64 | 264 | |
dylanembed123 | 12:e42985e3ea64 | 265 | }; |
dylanembed123 | 12:e42985e3ea64 | 266 | static PacketSender* ps=NULL; |
dylanembed123 | 12:e42985e3ea64 | 267 | static PacketSender& getPS(){ |
dylanembed123 | 12:e42985e3ea64 | 268 | if(ps==NULL)ps=new PacketSender(); |
dylanembed123 | 12:e42985e3ea64 | 269 | return *ps; |
dylanembed123 | 12:e42985e3ea64 | 270 | } |