Colin Stearns
/
qcControl
QC Control software
Fork of dgps by
Diff: packet.h
- Revision:
- 12:e42985e3ea64
- Child:
- 13:a6d3cf2b018e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/packet.h Sat Apr 05 22:27:18 2014 +0000 @@ -0,0 +1,77 @@ +#define PACKETSIZE 256 + +// Example +// Packet 1. (SuperPackid=5,type=PT_IMAGE,size=0) +// Packet 2. (SuperPackid=5,type=PT_DEFAULT,size=1024) +// Packet 3. (SuperPackid=5,type=PT_DEFAULT,size=1000) +// Packet 4. (SuperPackid=5,type=PT_END,size=0) + +enum PACKET_TYPE{ + PT_DEFAULT=0, + PT_END, + PT_IMAGE, + PT_SIZE +}; +typedef struct PacketStruct{ + PACKET_TYPE type; + unsigned int size;// Number of valid bits + char data[PACKETSIZE]; + unsigned int superPackID;// +}PacketStruct; + +class PacketSender{ + private: + unsigned int superID; + public: + unsigned int getSuperID(){return superID++;} + PacketSender():superID(0),outputDevice(USB::getSerial()){} + Serial& outputDevice; + void sendPacket(PacketStruct& output){ + for(int a=0;a<sizeof(PacketStruct);a++){ + outputDevice.putc(((char*)(&output))[a]); + } + } + unsigned int min(unsigned int a,unsigned int b){ + return a<b ? a : b; + } + void sendPacket(unsigned int superPackID,char* data,unsigned int size,PACKET_TYPE type = PT_END){ + if(data!=NULL && size>0){ + for(int i=0;i<=size/PACKETSIZE;i++){ + PacketStruct output; + output.type=PT_DEFAULT; + output.superPackID=superPackID; + output.size=min(PACKETSIZE,size-i*PACKETSIZE); + for(int a=0;a<output.size;a++){ + //USB::getSerial().printf(">>%d/%d - %d\n",a,size,output.size); + output.data[a]=data[a-i*PACKETSIZE]; + } + + //memcpy(output.data,&(data[i*PACKETSIZE]),min(PACKETSIZE,size-i*PACKETSIZE)); + sendPacket(output); + } + + }else{ + PacketStruct output; + output.type=type; + output.superPackID=superPackID; + sendPacket(output); + } + } + PacketStruct* getNextPacket(){ + int avail = outputDevice.readable(); + if(avail <= 0)return NULL; + PacketStruct* output=new PacketStruct(); + for(int i=0;i<sizeof(PacketStruct);i++){ + // Wait for byte + while(outputDevice.readable()<=0){} + ((char*)output)[i] = outputDevice.getc(); + } + return output; + } + +}; +static PacketSender* ps=NULL; +static PacketSender& getPS(){ + if(ps==NULL)ps=new PacketSender(); + return *ps; +}