![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
external fota service implementation
ext_fota/serial_communicator.cpp
- Committer:
- dudnwjs
- Date:
- 2015-06-19
- Revision:
- 0:bab3be8d31cf
File content as of revision 0:bab3be8d31cf:
#include "serial_communicator.h" Serial_Communicator::Serial_Communicator(Serial* _device) { debug_flag = 0; device = _device; queue = new Msg_Queue(512); FE_MSG_PACKET_TYPE = 0x05; MAX_PACKET_LENGTH = 350; bReceiveState = 0; wDataLength = 0; wReceivePos = 0; bHdrBytesRead = 0; memset(bReceiveElementArr,0,512); } Serial_Communicator::Serial_Communicator(Serial* _device, Serial* _hostpc) { debug_flag = 1; device = _device; hostpc = _hostpc; queue = new Msg_Queue(512); FE_MSG_PACKET_TYPE = 0x05; MAX_PACKET_LENGTH = 350; bReceiveState = 0; wDataLength = 0; wReceivePos = 0; bHdrBytesRead = 0; memset(bReceiveElementArr,0,512); } Serial_Communicator::~Serial_Communicator(void) { free(queue); } void Serial_Communicator::print_title() { if( debug_flag == 1) hostpc->printf("FOTA CLASS START!\n"); } void Serial_Communicator::BleMsgAlloc( unsigned short id, unsigned short dest_id, unsigned short src_id, unsigned short data_len, void *pdata, uint8_t *msg ) { memset(msg,0,sizeof(msg)); msg[0] = 0x05; memcpy(&msg[1],&id,sizeof(unsigned short)); memcpy(&msg[1+1*sizeof(unsigned short)],&dest_id,sizeof(unsigned short)); memcpy(&msg[1+2*sizeof(unsigned short)],&src_id,sizeof(unsigned short)); memcpy(&msg[1+3*sizeof(unsigned short)],&data_len,sizeof(unsigned short)); memcpy(&msg[1+4*sizeof(unsigned short)],pdata,data_len); } int Serial_Communicator::BleSendMsg(uint8_t *msg,unsigned short size) { int cnt = 0; if(debug_flag == 1) hostpc->printf("send size = %hu\n",size); for(int i=0; i < size; i++) { if( device->writeable()) { if(debug_flag == 1) hostpc->printf("%02X ", msg[i]); device->putc(msg[i]); cnt++; } } return cnt; } void Serial_Communicator::BleMsgEnQueue(uint8_t *msg) { queue->EnQueue((void *)msg); } uint8_t *Serial_Communicator::BleMsgDeQueue(void) { return (uint8_t *)queue->DeQueue(); } bool Serial_Communicator::IsQueueEmpty(void) { return queue->IsEmpty(); } void Serial_Communicator::BleReceiveMsg(void) { unsigned char tmp; //while(true) //{ if(device->readable()) { tmp = device->getc(); switch(bReceiveState) { case 0: if( tmp == FE_MSG_PACKET_TYPE ) { bReceiveState = 1; wDataLength = 0; wReceivePos = 0; bHdrBytesRead = 0; bReceiveElementArr[wReceivePos] = tmp; wReceivePos++; if(debug_flag == 1) hostpc->printf("\n[Receiver] Packet Type |: %02X \n", tmp); }else { if(debug_flag == 1) hostpc->printf("\n[Receiver] Packet Type Error |: %02X \n", tmp); } break; case 1: if(debug_flag == 1) hostpc->printf("R-%02X ",tmp); bHdrBytesRead++; bReceiveElementArr[wReceivePos] = tmp; wReceivePos++; if( bHdrBytesRead == 6 ) bReceiveState = 2; break; case 2: if(debug_flag == 1) hostpc->printf("R-%02X ",tmp); wDataLength += tmp; if( wDataLength > MAX_PACKET_LENGTH ) bReceiveState = 0; else { bReceiveElementArr[wReceivePos] = tmp; wReceivePos++; bReceiveState = 3; } break; case 3: if( debug_flag == 1 ) hostpc->printf("R-%02X ",tmp); wDataLength += (unsigned short) (tmp*256); if( wDataLength > MAX_PACKET_LENGTH ) { if( debug_flag == 1 ) hostpc->printf("\n[Receiver] Over SIZE: %d ", wDataLength); bReceiveState = 0; }else if (wDataLength == 0) { if( debug_flag == 1 ) hostpc->printf("\n[Receiver] Zero SIZE: %d ", wDataLength); uint8_t *msg; msg = new uint8_t[wReceivePos]; memcpy(msg,bReceiveElementArr,wReceivePos); BleMsgEnQueue(msg); bReceiveState = 0; }else { bReceiveElementArr[wReceivePos] = tmp; wReceivePos++; bReceiveState = 4; } break; case 4: if( debug_flag == 1 ) hostpc->printf("R-%02X ",tmp); bReceiveElementArr[wReceivePos] = tmp; wReceivePos++; // 9 = 1(first byte = FE_MSG_PACKET_TYPE) + 2(type) +2(dstid) +2(srcid) +2(length size) if(wReceivePos == wDataLength + 9) { uint8_t *msg; msg = new uint8_t[wReceivePos]; memcpy(msg,bReceiveElementArr,wReceivePos); BleMsgEnQueue(msg); bReceiveState = 0; if( debug_flag == 1 ) hostpc->printf("\n[Receiver] Rcv Data SIZE: %d ", wDataLength); } break; default: if(debug_flag == 1) hostpc->printf("ERROR STRAGE STATE\n"); break; } } //} }