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 KIM HyoengJun

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SerialManager.cpp Source File

SerialManager.cpp

Go to the documentation of this file.
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