external fota service implementation

Dependencies:   mbed

Committer:
dudnwjs
Date:
Fri Jun 19 06:49:20 2015 +0000
Revision:
0:bab3be8d31cf
add GAPM,GAPC header

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudnwjs 0:bab3be8d31cf 1 #include "serial_communicator.h"
dudnwjs 0:bab3be8d31cf 2
dudnwjs 0:bab3be8d31cf 3 Serial_Communicator::Serial_Communicator(Serial* _device)
dudnwjs 0:bab3be8d31cf 4 {
dudnwjs 0:bab3be8d31cf 5 debug_flag = 0;
dudnwjs 0:bab3be8d31cf 6 device = _device;
dudnwjs 0:bab3be8d31cf 7 queue = new Msg_Queue(512);
dudnwjs 0:bab3be8d31cf 8 FE_MSG_PACKET_TYPE = 0x05;
dudnwjs 0:bab3be8d31cf 9 MAX_PACKET_LENGTH = 350;
dudnwjs 0:bab3be8d31cf 10 bReceiveState = 0;
dudnwjs 0:bab3be8d31cf 11 wDataLength = 0;
dudnwjs 0:bab3be8d31cf 12 wReceivePos = 0;
dudnwjs 0:bab3be8d31cf 13 bHdrBytesRead = 0;
dudnwjs 0:bab3be8d31cf 14 memset(bReceiveElementArr,0,512);
dudnwjs 0:bab3be8d31cf 15 }
dudnwjs 0:bab3be8d31cf 16
dudnwjs 0:bab3be8d31cf 17 Serial_Communicator::Serial_Communicator(Serial* _device, Serial* _hostpc)
dudnwjs 0:bab3be8d31cf 18 {
dudnwjs 0:bab3be8d31cf 19 debug_flag = 1;
dudnwjs 0:bab3be8d31cf 20 device = _device;
dudnwjs 0:bab3be8d31cf 21 hostpc = _hostpc;
dudnwjs 0:bab3be8d31cf 22 queue = new Msg_Queue(512);
dudnwjs 0:bab3be8d31cf 23 FE_MSG_PACKET_TYPE = 0x05;
dudnwjs 0:bab3be8d31cf 24 MAX_PACKET_LENGTH = 350;
dudnwjs 0:bab3be8d31cf 25 bReceiveState = 0;
dudnwjs 0:bab3be8d31cf 26 wDataLength = 0;
dudnwjs 0:bab3be8d31cf 27 wReceivePos = 0;
dudnwjs 0:bab3be8d31cf 28 bHdrBytesRead = 0;
dudnwjs 0:bab3be8d31cf 29 memset(bReceiveElementArr,0,512);
dudnwjs 0:bab3be8d31cf 30 }
dudnwjs 0:bab3be8d31cf 31
dudnwjs 0:bab3be8d31cf 32 Serial_Communicator::~Serial_Communicator(void)
dudnwjs 0:bab3be8d31cf 33 {
dudnwjs 0:bab3be8d31cf 34 free(queue);
dudnwjs 0:bab3be8d31cf 35 }
dudnwjs 0:bab3be8d31cf 36
dudnwjs 0:bab3be8d31cf 37 void Serial_Communicator::print_title()
dudnwjs 0:bab3be8d31cf 38 {
dudnwjs 0:bab3be8d31cf 39 if( debug_flag == 1)
dudnwjs 0:bab3be8d31cf 40 hostpc->printf("FOTA CLASS START!\n");
dudnwjs 0:bab3be8d31cf 41 }
dudnwjs 0:bab3be8d31cf 42
dudnwjs 0:bab3be8d31cf 43 void Serial_Communicator::BleMsgAlloc( unsigned short id,
dudnwjs 0:bab3be8d31cf 44 unsigned short dest_id,
dudnwjs 0:bab3be8d31cf 45 unsigned short src_id,
dudnwjs 0:bab3be8d31cf 46 unsigned short data_len,
dudnwjs 0:bab3be8d31cf 47 void *pdata,
dudnwjs 0:bab3be8d31cf 48 uint8_t *msg )
dudnwjs 0:bab3be8d31cf 49 {
dudnwjs 0:bab3be8d31cf 50 memset(msg,0,sizeof(msg));
dudnwjs 0:bab3be8d31cf 51 msg[0] = 0x05;
dudnwjs 0:bab3be8d31cf 52 memcpy(&msg[1],&id,sizeof(unsigned short));
dudnwjs 0:bab3be8d31cf 53 memcpy(&msg[1+1*sizeof(unsigned short)],&dest_id,sizeof(unsigned short));
dudnwjs 0:bab3be8d31cf 54 memcpy(&msg[1+2*sizeof(unsigned short)],&src_id,sizeof(unsigned short));
dudnwjs 0:bab3be8d31cf 55 memcpy(&msg[1+3*sizeof(unsigned short)],&data_len,sizeof(unsigned short));
dudnwjs 0:bab3be8d31cf 56 memcpy(&msg[1+4*sizeof(unsigned short)],pdata,data_len);
dudnwjs 0:bab3be8d31cf 57 }
dudnwjs 0:bab3be8d31cf 58
dudnwjs 0:bab3be8d31cf 59 int Serial_Communicator::BleSendMsg(uint8_t *msg,unsigned short size)
dudnwjs 0:bab3be8d31cf 60 {
dudnwjs 0:bab3be8d31cf 61 int cnt = 0;
dudnwjs 0:bab3be8d31cf 62 if(debug_flag == 1)
dudnwjs 0:bab3be8d31cf 63 hostpc->printf("send size = %hu\n",size);
dudnwjs 0:bab3be8d31cf 64
dudnwjs 0:bab3be8d31cf 65 for(int i=0; i < size; i++)
dudnwjs 0:bab3be8d31cf 66 {
dudnwjs 0:bab3be8d31cf 67 if( device->writeable())
dudnwjs 0:bab3be8d31cf 68 {
dudnwjs 0:bab3be8d31cf 69 if(debug_flag == 1)
dudnwjs 0:bab3be8d31cf 70 hostpc->printf("%02X ", msg[i]);
dudnwjs 0:bab3be8d31cf 71 device->putc(msg[i]);
dudnwjs 0:bab3be8d31cf 72 cnt++;
dudnwjs 0:bab3be8d31cf 73 }
dudnwjs 0:bab3be8d31cf 74 }
dudnwjs 0:bab3be8d31cf 75 return cnt;
dudnwjs 0:bab3be8d31cf 76 }
dudnwjs 0:bab3be8d31cf 77
dudnwjs 0:bab3be8d31cf 78 void Serial_Communicator::BleMsgEnQueue(uint8_t *msg)
dudnwjs 0:bab3be8d31cf 79 {
dudnwjs 0:bab3be8d31cf 80 queue->EnQueue((void *)msg);
dudnwjs 0:bab3be8d31cf 81 }
dudnwjs 0:bab3be8d31cf 82
dudnwjs 0:bab3be8d31cf 83 uint8_t *Serial_Communicator::BleMsgDeQueue(void)
dudnwjs 0:bab3be8d31cf 84 {
dudnwjs 0:bab3be8d31cf 85 return (uint8_t *)queue->DeQueue();
dudnwjs 0:bab3be8d31cf 86 }
dudnwjs 0:bab3be8d31cf 87
dudnwjs 0:bab3be8d31cf 88 bool Serial_Communicator::IsQueueEmpty(void)
dudnwjs 0:bab3be8d31cf 89 {
dudnwjs 0:bab3be8d31cf 90 return queue->IsEmpty();
dudnwjs 0:bab3be8d31cf 91 }
dudnwjs 0:bab3be8d31cf 92
dudnwjs 0:bab3be8d31cf 93 void Serial_Communicator::BleReceiveMsg(void)
dudnwjs 0:bab3be8d31cf 94 {
dudnwjs 0:bab3be8d31cf 95 unsigned char tmp;
dudnwjs 0:bab3be8d31cf 96
dudnwjs 0:bab3be8d31cf 97
dudnwjs 0:bab3be8d31cf 98 //while(true)
dudnwjs 0:bab3be8d31cf 99 //{
dudnwjs 0:bab3be8d31cf 100 if(device->readable())
dudnwjs 0:bab3be8d31cf 101 {
dudnwjs 0:bab3be8d31cf 102 tmp = device->getc();
dudnwjs 0:bab3be8d31cf 103 switch(bReceiveState)
dudnwjs 0:bab3be8d31cf 104 {
dudnwjs 0:bab3be8d31cf 105 case 0:
dudnwjs 0:bab3be8d31cf 106 if( tmp == FE_MSG_PACKET_TYPE )
dudnwjs 0:bab3be8d31cf 107 {
dudnwjs 0:bab3be8d31cf 108 bReceiveState = 1;
dudnwjs 0:bab3be8d31cf 109 wDataLength = 0;
dudnwjs 0:bab3be8d31cf 110 wReceivePos = 0;
dudnwjs 0:bab3be8d31cf 111 bHdrBytesRead = 0;
dudnwjs 0:bab3be8d31cf 112
dudnwjs 0:bab3be8d31cf 113 bReceiveElementArr[wReceivePos] = tmp;
dudnwjs 0:bab3be8d31cf 114 wReceivePos++;
dudnwjs 0:bab3be8d31cf 115 if(debug_flag == 1)
dudnwjs 0:bab3be8d31cf 116 hostpc->printf("\n[Receiver] Packet Type |: %02X \n", tmp);
dudnwjs 0:bab3be8d31cf 117 }else
dudnwjs 0:bab3be8d31cf 118 {
dudnwjs 0:bab3be8d31cf 119 if(debug_flag == 1)
dudnwjs 0:bab3be8d31cf 120 hostpc->printf("\n[Receiver] Packet Type Error |: %02X \n", tmp);
dudnwjs 0:bab3be8d31cf 121 }
dudnwjs 0:bab3be8d31cf 122 break;
dudnwjs 0:bab3be8d31cf 123 case 1:
dudnwjs 0:bab3be8d31cf 124 if(debug_flag == 1)
dudnwjs 0:bab3be8d31cf 125 hostpc->printf("R-%02X ",tmp);
dudnwjs 0:bab3be8d31cf 126 bHdrBytesRead++;
dudnwjs 0:bab3be8d31cf 127 bReceiveElementArr[wReceivePos] = tmp;
dudnwjs 0:bab3be8d31cf 128 wReceivePos++;
dudnwjs 0:bab3be8d31cf 129 if( bHdrBytesRead == 6 )
dudnwjs 0:bab3be8d31cf 130 bReceiveState = 2;
dudnwjs 0:bab3be8d31cf 131 break;
dudnwjs 0:bab3be8d31cf 132 case 2:
dudnwjs 0:bab3be8d31cf 133 if(debug_flag == 1)
dudnwjs 0:bab3be8d31cf 134 hostpc->printf("R-%02X ",tmp);
dudnwjs 0:bab3be8d31cf 135 wDataLength += tmp;
dudnwjs 0:bab3be8d31cf 136 if( wDataLength > MAX_PACKET_LENGTH )
dudnwjs 0:bab3be8d31cf 137 bReceiveState = 0;
dudnwjs 0:bab3be8d31cf 138 else
dudnwjs 0:bab3be8d31cf 139 {
dudnwjs 0:bab3be8d31cf 140 bReceiveElementArr[wReceivePos] = tmp;
dudnwjs 0:bab3be8d31cf 141 wReceivePos++;
dudnwjs 0:bab3be8d31cf 142 bReceiveState = 3;
dudnwjs 0:bab3be8d31cf 143 }
dudnwjs 0:bab3be8d31cf 144 break;
dudnwjs 0:bab3be8d31cf 145 case 3:
dudnwjs 0:bab3be8d31cf 146 if( debug_flag == 1 )
dudnwjs 0:bab3be8d31cf 147 hostpc->printf("R-%02X ",tmp);
dudnwjs 0:bab3be8d31cf 148 wDataLength += (unsigned short) (tmp*256);
dudnwjs 0:bab3be8d31cf 149 if( wDataLength > MAX_PACKET_LENGTH )
dudnwjs 0:bab3be8d31cf 150 {
dudnwjs 0:bab3be8d31cf 151 if( debug_flag == 1 )
dudnwjs 0:bab3be8d31cf 152 hostpc->printf("\n[Receiver] Over SIZE: %d ", wDataLength);
dudnwjs 0:bab3be8d31cf 153 bReceiveState = 0;
dudnwjs 0:bab3be8d31cf 154 }else if (wDataLength == 0)
dudnwjs 0:bab3be8d31cf 155 {
dudnwjs 0:bab3be8d31cf 156 if( debug_flag == 1 )
dudnwjs 0:bab3be8d31cf 157 hostpc->printf("\n[Receiver] Zero SIZE: %d ", wDataLength);
dudnwjs 0:bab3be8d31cf 158 uint8_t *msg;
dudnwjs 0:bab3be8d31cf 159 msg = new uint8_t[wReceivePos];
dudnwjs 0:bab3be8d31cf 160 memcpy(msg,bReceiveElementArr,wReceivePos);
dudnwjs 0:bab3be8d31cf 161 BleMsgEnQueue(msg);
dudnwjs 0:bab3be8d31cf 162 bReceiveState = 0;
dudnwjs 0:bab3be8d31cf 163 }else
dudnwjs 0:bab3be8d31cf 164 {
dudnwjs 0:bab3be8d31cf 165 bReceiveElementArr[wReceivePos] = tmp;
dudnwjs 0:bab3be8d31cf 166 wReceivePos++;
dudnwjs 0:bab3be8d31cf 167 bReceiveState = 4;
dudnwjs 0:bab3be8d31cf 168 }
dudnwjs 0:bab3be8d31cf 169 break;
dudnwjs 0:bab3be8d31cf 170 case 4:
dudnwjs 0:bab3be8d31cf 171 if( debug_flag == 1 )
dudnwjs 0:bab3be8d31cf 172 hostpc->printf("R-%02X ",tmp);
dudnwjs 0:bab3be8d31cf 173 bReceiveElementArr[wReceivePos] = tmp;
dudnwjs 0:bab3be8d31cf 174 wReceivePos++;
dudnwjs 0:bab3be8d31cf 175 // 9 = 1(first byte = FE_MSG_PACKET_TYPE) + 2(type) +2(dstid) +2(srcid) +2(length size)
dudnwjs 0:bab3be8d31cf 176 if(wReceivePos == wDataLength + 9)
dudnwjs 0:bab3be8d31cf 177 {
dudnwjs 0:bab3be8d31cf 178 uint8_t *msg;
dudnwjs 0:bab3be8d31cf 179 msg = new uint8_t[wReceivePos];
dudnwjs 0:bab3be8d31cf 180 memcpy(msg,bReceiveElementArr,wReceivePos);
dudnwjs 0:bab3be8d31cf 181 BleMsgEnQueue(msg);
dudnwjs 0:bab3be8d31cf 182 bReceiveState = 0;
dudnwjs 0:bab3be8d31cf 183 if( debug_flag == 1 )
dudnwjs 0:bab3be8d31cf 184 hostpc->printf("\n[Receiver] Rcv Data SIZE: %d ", wDataLength);
dudnwjs 0:bab3be8d31cf 185 }
dudnwjs 0:bab3be8d31cf 186 break;
dudnwjs 0:bab3be8d31cf 187 default:
dudnwjs 0:bab3be8d31cf 188 if(debug_flag == 1)
dudnwjs 0:bab3be8d31cf 189 hostpc->printf("ERROR STRAGE STATE\n");
dudnwjs 0:bab3be8d31cf 190 break;
dudnwjs 0:bab3be8d31cf 191 }
dudnwjs 0:bab3be8d31cf 192 }
dudnwjs 0:bab3be8d31cf 193 //}
dudnwjs 0:bab3be8d31cf 194 }
dudnwjs 0:bab3be8d31cf 195
dudnwjs 0:bab3be8d31cf 196