QC Control software

Dependencies:   mbed

Fork of dgps by Colin Stearns

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?

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,
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 }