Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
SerialManager.cpp
00001 /** 00002 * @file SerialManager.cpp 00003 * @brief Serial Communication Management 00004 * Copyright 2015 SEVENCORE Co., Ltd. 00005 * 00006 * @author HyeongJun Kim 00007 * @version 1.0.0 00008 * @date 2015-08-19 00009 */ 00010 #include "SerialManager.h" 00011 /** 00012 **************************************************************************************** 00013 * @addtogroup ext_fota module 00014 * @brief Serial Manager Class Method Definition. 00015 * 00016 * @{ 00017 **************************************************************************************** 00018 */ 00019 namespace sevencore_fota{ 00020 00021 /** 00022 **************************************************************************************** 00023 * @brief Serial Manager constructor only connected Device. 00024 * @param[in] mbed serial class reference to device. 00025 **************************************************************************************** 00026 */ 00027 SerialManager::SerialManager(Serial *_device) 00028 { 00029 print_flag = 0; 00030 device = _device; 00031 FE_MSG_PACKET_TYPE = 0x05; 00032 MAX_PACKET_LENGTH = 350; 00033 bReceiveState = 0; 00034 wDataLength = 0; 00035 wReceivePos = 0; 00036 bHdrBytesRead = 0; 00037 memset(bReceiveElementArr,0,512); 00038 } 00039 /** 00040 **************************************************************************************** 00041 * @brief Serial Manager constructor with connected Device & HostPC. 00042 * @param[in] mbed serial class reference to device. 00043 * @param[in] mbed serial class reference to hostpc. 00044 **************************************************************************************** 00045 */ 00046 SerialManager::SerialManager(Serial *_device, Serial *_hostpc) 00047 { 00048 print_flag = 1; 00049 device = _device; 00050 hostpc = _hostpc; 00051 FE_MSG_PACKET_TYPE = 0x05; 00052 MAX_PACKET_LENGTH = 350; 00053 bReceiveState = 0; 00054 wDataLength = 0; 00055 wReceivePos = 0; 00056 bHdrBytesRead = 0; 00057 memset(bReceiveElementArr,0,512); 00058 PrintSerialManager(); 00059 } 00060 /** 00061 **************************************************************************************** 00062 * @brief Serial Manager destructor. 00063 **************************************************************************************** 00064 */ 00065 SerialManager::~SerialManager(void) 00066 { 00067 } 00068 /** 00069 **************************************************************************************** 00070 * @brief Serial Manager Start title print function. 00071 **************************************************************************************** 00072 */ 00073 void SerialManager::PrintSerialManager(void) 00074 { 00075 if(print_flag == 1) 00076 hostpc->printf("\nSerialManager Start!!\n"); 00077 } 00078 /** 00079 **************************************************************************************** 00080 * @brief Send ble message to serial port. 00081 * @param[in] Sending data pointer. 00082 * @param[in] Sending data size. 00083 **************************************************************************************** 00084 */ 00085 int SerialManager::SendToSerial(uint8_t *data,unsigned short size) 00086 { 00087 int cnt = 0; 00088 if(print_flag == 1) 00089 hostpc->printf("\n>>> send size = %hu\n",size); 00090 00091 for(int i=0; i < size; i++) 00092 { 00093 if( device->writeable()) 00094 { 00095 if(print_flag == 1) 00096 hostpc->printf("%02X ", data[i]); 00097 device->putc(data[i]); 00098 cnt++; 00099 } 00100 } 00101 return cnt; 00102 } 00103 /** 00104 **************************************************************************************** 00105 * @brief Receive ble message from serial port. 00106 * @param[in] Storing data pointer. 00107 * @return Boolean - msg_size (receive complete) or -1 (receive not complete) 00108 **************************************************************************************** 00109 */ 00110 int SerialManager::ReceiveToSerial(unsigned char *receive_msg) 00111 { 00112 int ret = -1; 00113 unsigned char tmp; 00114 if(device->readable()) 00115 { 00116 tmp = device->getc(); 00117 switch(bReceiveState) 00118 { 00119 case 0: 00120 if( tmp == FE_MSG_PACKET_TYPE ) 00121 { 00122 bReceiveState = 1; 00123 wDataLength = 0; 00124 wReceivePos = 0; 00125 bHdrBytesRead = 0; 00126 memset(bReceiveElementArr,0,512); 00127 00128 bReceiveElementArr[wReceivePos] = tmp; 00129 wReceivePos++; 00130 if(print_flag == 1) 00131 hostpc->printf("\n[Receiver] Packet Type |: %02X \n", tmp); 00132 }else 00133 { 00134 if(print_flag == 1) 00135 hostpc->printf("\n[Receiver] Packet Type Error |: %02X \n", tmp); 00136 } 00137 break; 00138 case 1: 00139 if(print_flag == 1) 00140 hostpc->printf("R-%02X ",tmp); 00141 bHdrBytesRead++; 00142 bReceiveElementArr[wReceivePos] = tmp; 00143 wReceivePos++; 00144 if( bHdrBytesRead == 6 ) 00145 bReceiveState = 2; 00146 break; 00147 case 2: 00148 if(print_flag == 1) 00149 hostpc->printf("R+%02X ",tmp); 00150 wDataLength += tmp; 00151 if( wDataLength > MAX_PACKET_LENGTH ) 00152 bReceiveState = 0; 00153 else 00154 { 00155 bReceiveElementArr[wReceivePos] = tmp; 00156 wReceivePos++; 00157 bReceiveState = 3; 00158 } 00159 break; 00160 case 3: 00161 if( print_flag == 1 ) 00162 hostpc->printf("R=%02X ",tmp); 00163 wDataLength += (unsigned short) (tmp*256); 00164 if( wDataLength > MAX_PACKET_LENGTH ) 00165 { 00166 if( print_flag == 1 ) 00167 hostpc->printf("\n[Receiver] Over SIZE: %d \n", wDataLength); 00168 bReceiveState = 0; 00169 }else if (wDataLength == 0) 00170 { 00171 if( print_flag == 1 ) 00172 hostpc->printf("\n[Receiver] Zero SIZE: %d \n", wDataLength); 00173 memcpy(receive_msg,bReceiveElementArr,wReceivePos); 00174 ret = wReceivePos; 00175 bReceiveState = 0; 00176 }else 00177 { 00178 bReceiveElementArr[wReceivePos] = tmp; 00179 wReceivePos++; 00180 bReceiveState = 4; 00181 } 00182 break; 00183 case 4: 00184 if( print_flag == 1 ) 00185 hostpc->printf("R~%02X ",tmp); 00186 bReceiveElementArr[wReceivePos] = tmp; 00187 wReceivePos++; 00188 // 9 = 1(first byte = FE_MSG_PACKET_TYPE) + 2(type) +2(dstid) +2(srcid) +2(length size) 00189 if(wReceivePos == wDataLength + 9) 00190 { 00191 memcpy(receive_msg,bReceiveElementArr,wReceivePos); 00192 ret = wReceivePos; 00193 bReceiveState = 0; 00194 if( print_flag == 1 ) 00195 hostpc->printf("\n[Receiver] Rcv Data SIZE: %d \n", wDataLength); 00196 } 00197 break; 00198 default: 00199 if(print_flag == 1) 00200 hostpc->printf("\nERROR STRAGE STATE R+%02X \n",tmp); 00201 break; 00202 } 00203 } 00204 00205 return ret; 00206 } 00207 /** 00208 **************************************************************************************** 00209 * @brief Receive data for size. 00210 * @param[in] Storing data pointer. 00211 * @param[in] transmision data size. 00212 **************************************************************************************** 00213 */ 00214 void SerialManager::DataReceive(uint8_t *databuf, unsigned short size) 00215 { 00216 int i; 00217 00218 for(i=0;i<size;i++) 00219 { 00220 databuf[i] = (uint8_t)device->getc(); 00221 } 00222 } 00223 /** 00224 **************************************************************************************** 00225 * @brief Receive data test function. 00226 **************************************************************************************** 00227 */ 00228 void SerialManager::ReceiveToSerialTest(void) 00229 { 00230 unsigned char tmp; 00231 int pos = 0; 00232 char buff[1024]; 00233 memset(buff,'K',1023); 00234 buff[1023] = '\0'; 00235 hostpc->printf("\n pos = %d FIRST <%s> \n",pos,buff); 00236 tmp = device->getc(); 00237 if( tmp == 0x80 ){ 00238 tmp = device->getc(); 00239 if( tmp == 0x46 ) 00240 { 00241 hostpc->printf("\n FIRMWARE DATA CONFIRM!! \n"); 00242 } 00243 } 00244 tmp = device->getc();//reserved value 00245 tmp = device->getc();//reserved value 00246 tmp = device->getc();//reserved value 00247 while(1) 00248 { 00249 if(device->readable()) 00250 { 00251 tmp = device->getc(); 00252 //hostpc->printf("%d ==> 0x%X\n",pos,tmp); 00253 buff[pos] = tmp; 00254 pos++; 00255 if( pos%512 == 0 ){ 00256 buff[1023] = '\0'; 00257 hostpc->printf("\n pos = %d CHECK <%s> \n",pos,buff); 00258 } 00259 if( pos == 1024 ){ 00260 pos = 0; 00261 memset(buff,'Z',1023); 00262 buff[1023] = '\0'; 00263 } 00264 } 00265 00266 } 00267 00268 00269 } 00270 00271 }//namespace 00272 /// @} ext_fota module
Generated on Tue Jul 12 2022 21:40:44 by
1.7.2