Bluetooth Low Energy based Firmware Over The Air with Mbed. Mbed part is a external processor of the IoT devices and communicate with a Bluetooth module. The Bluetooth module have to support BLE and implement BLE FOTA profile designed by ours. BLE FOTA profile specification is available from our GIT hub wiki(https://github.com/sevencore/BLEFOTA).
Dependencies: mbed
Fork of mbed_fota by
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 16:20:47 by 1.7.2