sevencore fota solution development project
ext_fota/SerialManager.cpp
- Committer:
- dudnwjs
- Date:
- 2015-07-17
- Revision:
- 6:8dd20294b2aa
- Parent:
- 5:e11b23f9aacc
- Child:
- 9:fcf91f563147
File content as of revision 6:8dd20294b2aa:
#include "SerialManager.h" namespace sevencore_fota{ SerialManager::SerialManager(Serial *_device) { print_flag = 0; device = _device; FE_MSG_PACKET_TYPE = 0x05; MAX_PACKET_LENGTH = 350; bReceiveState = 0; wDataLength = 0; wReceivePos = 0; bHdrBytesRead = 0; memset(bReceiveElementArr,0,512); } SerialManager::SerialManager(Serial *_device, Serial *_hostpc) { print_flag = 1; device = _device; hostpc = _hostpc; FE_MSG_PACKET_TYPE = 0x05; MAX_PACKET_LENGTH = 350; bReceiveState = 0; wDataLength = 0; wReceivePos = 0; bHdrBytesRead = 0; memset(bReceiveElementArr,0,512); PrintSerialManager(); } SerialManager::~SerialManager(void) { } void SerialManager::PrintSerialManager(void) { if(print_flag == 1) hostpc->printf("\nSerialManager Start!!\n"); } int SerialManager::SendToSerial(uint8_t *data,unsigned short size) { int cnt = 0; if(print_flag == 1) hostpc->printf("\n>>> send size = %hu\n",size); for(int i=0; i < size; i++) { if( device->writeable()) { if(print_flag == 1) hostpc->printf("%02X ", data[i]); device->putc(data[i]); cnt++; } } return cnt; } // return boolean : msg_size (receive complete) or -1 (receive not complete) int SerialManager::ReceiveToSerial(unsigned char *receive_msg) { int ret = -1; unsigned char tmp; if(device->readable()) { tmp = device->getc(); switch(bReceiveState) { case 0: if( tmp == FE_MSG_PACKET_TYPE ) { bReceiveState = 1; wDataLength = 0; wReceivePos = 0; bHdrBytesRead = 0; memset(bReceiveElementArr,0,512); bReceiveElementArr[wReceivePos] = tmp; wReceivePos++; if(print_flag == 1) hostpc->printf("\n[Receiver] Packet Type |: %02X \n", tmp); }else { if(print_flag == 1) hostpc->printf("\n[Receiver] Packet Type Error |: %02X \n", tmp); } break; case 1: if(print_flag == 1) hostpc->printf("R-%02X ",tmp); bHdrBytesRead++; bReceiveElementArr[wReceivePos] = tmp; wReceivePos++; if( bHdrBytesRead == 6 ) bReceiveState = 2; break; case 2: if(print_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( print_flag == 1 ) hostpc->printf("R=%02X ",tmp); wDataLength += (unsigned short) (tmp*256); if( wDataLength > MAX_PACKET_LENGTH ) { if( print_flag == 1 ) hostpc->printf("\n[Receiver] Over SIZE: %d \n", wDataLength); bReceiveState = 0; }else if (wDataLength == 0) { if( print_flag == 1 ) hostpc->printf("\n[Receiver] Zero SIZE: %d \n", wDataLength); memcpy(receive_msg,bReceiveElementArr,wReceivePos); ret = wReceivePos; bReceiveState = 0; }else { bReceiveElementArr[wReceivePos] = tmp; wReceivePos++; bReceiveState = 4; } break; case 4: if( print_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) { memcpy(receive_msg,bReceiveElementArr,wReceivePos); ret = wReceivePos; bReceiveState = 0; if( print_flag == 1 ) hostpc->printf("\n[Receiver] Rcv Data SIZE: %d \n", wDataLength); } break; default: if(print_flag == 1) hostpc->printf("\nERROR STRAGE STATE R+%02X \n",tmp); break; } } return ret; } void SerialManager::DataReceive(uint8_t *databuf, unsigned short size) { int i; for(i=0;i<size;i++) { databuf[i] = (uint8_t)device->getc(); } } void SerialManager::ReceiveToSerialTest(void) { unsigned char tmp; int pos = 0; char buff[1024]; memset(buff,'K',1023); buff[1023] = '\0'; hostpc->printf("\n pos = %d FIRST <%s> \n",pos,buff); tmp = device->getc(); if( tmp == 0x80 ){ tmp = device->getc(); if( tmp == 0x46 ) { hostpc->printf("\n FIRMWARE DATA CONFIRM!! \n"); } } tmp = device->getc();//reserved value tmp = device->getc();//reserved value tmp = device->getc();//reserved value while(1) { if(device->readable()) { tmp = device->getc(); //hostpc->printf("%d ==> 0x%X\n",pos,tmp); buff[pos] = tmp; pos++; if( pos%512 == 0 ){ buff[1023] = '\0'; hostpc->printf("\n pos = %d CHECK <%s> \n",pos,buff); } if( pos == 1024 ){ pos = 0; memset(buff,'Z',1023); buff[1023] = '\0'; } } } } }//namespace