Colin Stearns / Mbed 2 deprecated qcControl

Dependencies:   mbed

Fork of dgps by Colin Stearns

Committer:
krobertson
Date:
Sun Apr 20 22:01:05 2014 +0000
Revision:
19:8c1f2a2204fb
Parent:
18:e72ee7aed088
Child:
20:81d5655fecc2
downlink seems to be reliable now

Who changed what in which revision?

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