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

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.

Committer:
dudnwjs
Date:
Thu Aug 20 05:16:55 2015 +0000
Revision:
8:9eec2c246a85
Parent:
7:3478c46cceef
Child:
9:fcf91f563147
add msg handler doxygen

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudnwjs 8:9eec2c246a85 1 /**
dudnwjs 8:9eec2c246a85 2 * @file BleMsgHandler.cpp
dudnwjs 8:9eec2c246a85 3 * @brief ble message handler ( Ble message is communication mathod between Mbed and DA14583 )
dudnwjs 8:9eec2c246a85 4 * Copyright 2015 SEVENCORE Co., Ltd.
dudnwjs 8:9eec2c246a85 5 *
dudnwjs 8:9eec2c246a85 6 * @author HyeongJun Kim
dudnwjs 8:9eec2c246a85 7 * @version 1.0.0
dudnwjs 8:9eec2c246a85 8 * @date 2015-08-19
dudnwjs 8:9eec2c246a85 9 */
dudnwjs 8:9eec2c246a85 10
dudnwjs 0:a1f6b1ba8a1e 11 #include "BleMsgHandler.h"
dudnwjs 3:1e70387e1337 12 #include "dialog_fota_config.h"
dudnwjs 4:60be78a172c2 13 #include "diss_task.h"
dudnwjs 5:e11b23f9aacc 14 #include "fota_server_task.h"
dudnwjs 4:60be78a172c2 15 #include "app_task.h"
dudnwjs 4:60be78a172c2 16
dudnwjs 8:9eec2c246a85 17 /**
dudnwjs 8:9eec2c246a85 18 ****************************************************************************************
dudnwjs 8:9eec2c246a85 19 * @addtogroup ext_fota module
dudnwjs 8:9eec2c246a85 20 * @brief Ble message Handler Class Mathod Definition.
dudnwjs 8:9eec2c246a85 21 *
dudnwjs 8:9eec2c246a85 22 * @{
dudnwjs 8:9eec2c246a85 23 ****************************************************************************************
dudnwjs 8:9eec2c246a85 24 */
dudnwjs 8:9eec2c246a85 25
dudnwjs 6:8dd20294b2aa 26 extern "C" void mbed_reset();
dudnwjs 0:a1f6b1ba8a1e 27
dudnwjs 0:a1f6b1ba8a1e 28 namespace sevencore_fota{
dudnwjs 8:9eec2c246a85 29
dudnwjs 8:9eec2c246a85 30 /**
dudnwjs 8:9eec2c246a85 31 ****************************************************************************************
dudnwjs 8:9eec2c246a85 32 * @brief Ble message Handler Constructor.
dudnwjs 8:9eec2c246a85 33 * @param[in] mbed serial class reference to device.
dudnwjs 8:9eec2c246a85 34 * @detail Create SerialManager instance and Create inner MsgQueue
dudnwjs 8:9eec2c246a85 35 ****************************************************************************************
dudnwjs 8:9eec2c246a85 36 */
dudnwjs 0:a1f6b1ba8a1e 37 BleMsgHandler::BleMsgHandler(Serial *_device)
dudnwjs 0:a1f6b1ba8a1e 38 {
dudnwjs 0:a1f6b1ba8a1e 39 print_flag = 0;
dudnwjs 0:a1f6b1ba8a1e 40 device = _device;
dudnwjs 2:dba344c91bce 41 SerialM = new SerialManager(_device);
dudnwjs 3:1e70387e1337 42 MsgQ = new MsgQueue(512);
dudnwjs 3:1e70387e1337 43 memset(recv_msg,0,512);
dudnwjs 0:a1f6b1ba8a1e 44 }
dudnwjs 8:9eec2c246a85 45 /**
dudnwjs 8:9eec2c246a85 46 ****************************************************************************************
dudnwjs 8:9eec2c246a85 47 * @brief Ble message Handler Constructor.
dudnwjs 8:9eec2c246a85 48 * @param[in] mbed serial class reference to device.
dudnwjs 8:9eec2c246a85 49 * @param[in] mbed serial class reference to hostpc.
dudnwjs 8:9eec2c246a85 50 * @detail Create SerialManager instance and Create inner MsgQueue
dudnwjs 8:9eec2c246a85 51 ****************************************************************************************
dudnwjs 8:9eec2c246a85 52 */
dudnwjs 0:a1f6b1ba8a1e 53 BleMsgHandler::BleMsgHandler(Serial *_device, Serial *_hostpc)
dudnwjs 0:a1f6b1ba8a1e 54 {
dudnwjs 0:a1f6b1ba8a1e 55 print_flag = 1;
dudnwjs 0:a1f6b1ba8a1e 56 device = _device;
dudnwjs 0:a1f6b1ba8a1e 57 hostpc = _hostpc;
dudnwjs 2:dba344c91bce 58 SerialM = new SerialManager(_device,_hostpc);
dudnwjs 3:1e70387e1337 59 MsgQ = new MsgQueue(512);
dudnwjs 8:9eec2c246a85 60 memset(recv_msg,0,512);
dudnwjs 0:a1f6b1ba8a1e 61 }
dudnwjs 8:9eec2c246a85 62 /**
dudnwjs 8:9eec2c246a85 63 ****************************************************************************************
dudnwjs 8:9eec2c246a85 64 * @brief Ble message Handler Destructor.
dudnwjs 8:9eec2c246a85 65 ****************************************************************************************
dudnwjs 8:9eec2c246a85 66 */
dudnwjs 1:5cf3a6c969be 67 BleMsgHandler::~BleMsgHandler(void)
dudnwjs 1:5cf3a6c969be 68 {
dudnwjs 2:dba344c91bce 69 free(SerialM);
dudnwjs 3:1e70387e1337 70 free(MsgQ);
dudnwjs 1:5cf3a6c969be 71 }
dudnwjs 8:9eec2c246a85 72 /**
dudnwjs 8:9eec2c246a85 73 ****************************************************************************************
dudnwjs 8:9eec2c246a85 74 * @brief Ble message handler Start title print function.
dudnwjs 8:9eec2c246a85 75 * @param[in] mbed serial class reference to device.
dudnwjs 8:9eec2c246a85 76 * @param[in] mbed serial class reference to hostpc.
dudnwjs 8:9eec2c246a85 77 ****************************************************************************************
dudnwjs 8:9eec2c246a85 78 */
dudnwjs 0:a1f6b1ba8a1e 79 void BleMsgHandler::PrintTitle(void)
dudnwjs 0:a1f6b1ba8a1e 80 {
dudnwjs 0:a1f6b1ba8a1e 81 if( print_flag == 1 )
dudnwjs 5:e11b23f9aacc 82 hostpc->printf("\nSevencore Fota : BleMsg Handler Start\n");
dudnwjs 5:e11b23f9aacc 83 //SerialM->ReceiveToSerialTest();
dudnwjs 0:a1f6b1ba8a1e 84 }
dudnwjs 8:9eec2c246a85 85 /**
dudnwjs 8:9eec2c246a85 86 ****************************************************************************************
dudnwjs 8:9eec2c246a85 87 * @brief Create ble message.
dudnwjs 8:9eec2c246a85 88 * @param[in] 16byte ble message type. @ref structure 'ble_hdr' member 'bType'
dudnwjs 8:9eec2c246a85 89 * @param[in] 16byte ble dest task id(number). @ref structure 'ble_hdr' member 'bDstid'
dudnwjs 8:9eec2c246a85 90 * @param[in] 16byte ble source task id(number). @ref structure 'ble_hdr' member 'bSrcid'
dudnwjs 8:9eec2c246a85 91 * @param[in] 16byte ble message data length. @ref structure 'ble_hdr' member 'bLength'
dudnwjs 8:9eec2c246a85 92 * @param[in] input data pointer.
dudnwjs 8:9eec2c246a85 93 * @param[in] message alloc output pointer.
dudnwjs 8:9eec2c246a85 94 ****************************************************************************************
dudnwjs 8:9eec2c246a85 95 */
dudnwjs 3:1e70387e1337 96 void BleMsgHandler::BleMsgAlloc( unsigned short id,
dudnwjs 3:1e70387e1337 97 unsigned short dest_id,
dudnwjs 3:1e70387e1337 98 unsigned short src_id,
dudnwjs 3:1e70387e1337 99 unsigned short data_len,
dudnwjs 3:1e70387e1337 100 void *pdata,
dudnwjs 3:1e70387e1337 101 uint8_t *msg )
dudnwjs 3:1e70387e1337 102 {
dudnwjs 3:1e70387e1337 103 memset(msg,0,sizeof(msg));
dudnwjs 3:1e70387e1337 104 msg[0] = 0x05;
dudnwjs 3:1e70387e1337 105 memcpy(&msg[1],&id,sizeof(unsigned short));
dudnwjs 3:1e70387e1337 106 memcpy(&msg[1+1*sizeof(unsigned short)],&dest_id,sizeof(unsigned short));
dudnwjs 3:1e70387e1337 107 memcpy(&msg[1+2*sizeof(unsigned short)],&src_id,sizeof(unsigned short));
dudnwjs 3:1e70387e1337 108 memcpy(&msg[1+3*sizeof(unsigned short)],&data_len,sizeof(unsigned short));
dudnwjs 3:1e70387e1337 109 memcpy(&msg[1+4*sizeof(unsigned short)],pdata,data_len);
dudnwjs 3:1e70387e1337 110 }
dudnwjs 8:9eec2c246a85 111 /**
dudnwjs 8:9eec2c246a85 112 ****************************************************************************************
dudnwjs 8:9eec2c246a85 113 * @brief Send ble message to device.
dudnwjs 8:9eec2c246a85 114 * @param[in] sending message pointer
dudnwjs 8:9eec2c246a85 115 * @param[in] message size.
dudnwjs 8:9eec2c246a85 116 ****************************************************************************************
dudnwjs 8:9eec2c246a85 117 */
dudnwjs 3:1e70387e1337 118 int BleMsgHandler::BleSendMsg(uint8_t *msg, unsigned short size)
dudnwjs 3:1e70387e1337 119 {
dudnwjs 3:1e70387e1337 120 return SerialM->SendToSerial(msg,size);
dudnwjs 3:1e70387e1337 121 }
dudnwjs 8:9eec2c246a85 122 /**
dudnwjs 8:9eec2c246a85 123 ****************************************************************************************
dudnwjs 8:9eec2c246a85 124 * @brief Receive ble message from device.
dudnwjs 8:9eec2c246a85 125 * @detail Received message insert inner MsgQueue
dudnwjs 8:9eec2c246a85 126 ****************************************************************************************
dudnwjs 8:9eec2c246a85 127 */
dudnwjs 3:1e70387e1337 128 void BleMsgHandler::BleReceiveMsg(void)
dudnwjs 3:1e70387e1337 129 {
dudnwjs 3:1e70387e1337 130 int receive_size = -1;//default
dudnwjs 3:1e70387e1337 131 while(receive_size == -1)
dudnwjs 3:1e70387e1337 132 {
dudnwjs 3:1e70387e1337 133 receive_size = SerialM->ReceiveToSerial(recv_msg);
dudnwjs 3:1e70387e1337 134 }
dudnwjs 3:1e70387e1337 135
dudnwjs 3:1e70387e1337 136 uint8_t *msg;
dudnwjs 3:1e70387e1337 137 msg = new uint8_t[receive_size];
dudnwjs 3:1e70387e1337 138 memcpy(msg,recv_msg,receive_size);
dudnwjs 3:1e70387e1337 139 memset(recv_msg,0,512);
dudnwjs 3:1e70387e1337 140 MsgQ->EnQueue(msg);
dudnwjs 3:1e70387e1337 141 }
dudnwjs 8:9eec2c246a85 142 /**
dudnwjs 8:9eec2c246a85 143 ****************************************************************************************
dudnwjs 8:9eec2c246a85 144 * @brief Get message from MsgQueue and Execute corresponding function.
dudnwjs 8:9eec2c246a85 145 * @detail After get message, extract message type. Each message type connect corresponding function
dudnwjs 8:9eec2c246a85 146 ****************************************************************************************
dudnwjs 8:9eec2c246a85 147 */
dudnwjs 3:1e70387e1337 148 void BleMsgHandler::BleMsgHandle(void)
dudnwjs 3:1e70387e1337 149 {
dudnwjs 4:60be78a172c2 150 uint8_t *msg;
dudnwjs 4:60be78a172c2 151 ble_hdr msg_hdr;
dudnwjs 4:60be78a172c2 152 unsigned short paramPos = 1 + sizeof(msg_hdr);
dudnwjs 4:60be78a172c2 153
dudnwjs 3:1e70387e1337 154 if( print_flag == 1)
dudnwjs 8:9eec2c246a85 155 hostpc->printf("Ble-message Handle Function!\n");
dudnwjs 4:60be78a172c2 156
dudnwjs 3:1e70387e1337 157 msg = (uint8_t*)MsgQ->DeQueue();
dudnwjs 3:1e70387e1337 158 memcpy(&msg_hdr, &msg[1], sizeof(msg_hdr));
dudnwjs 3:1e70387e1337 159
dudnwjs 3:1e70387e1337 160 if( print_flag == 1 )
dudnwjs 3:1e70387e1337 161 hostpc->printf(" handle msg : id(%d), dst(%d), src(%d), len(%d) !\n",
dudnwjs 3:1e70387e1337 162 msg_hdr.bType, msg_hdr.bDstid, msg_hdr.bSrcid, msg_hdr.bLength);
dudnwjs 3:1e70387e1337 163
dudnwjs 6:8dd20294b2aa 164 if (msg_hdr.bDstid != TASK_GTL){
dudnwjs 6:8dd20294b2aa 165 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 166 hostpc->printf("Dstid not TASK_GTL!\n");
dudnwjs 3:1e70387e1337 167 return;
dudnwjs 6:8dd20294b2aa 168 }
dudnwjs 3:1e70387e1337 169
dudnwjs 4:60be78a172c2 170 switch( msg_hdr.bType )
dudnwjs 4:60be78a172c2 171 {
dudnwjs 4:60be78a172c2 172 case GAPM_CMP_EVT:
dudnwjs 5:e11b23f9aacc 173 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 174 hostpc->printf("==> GAPM_CMP_EVT!!\n");
dudnwjs 4:60be78a172c2 175 HandleGapmCmpEvt(msg_hdr.bType,(struct gapm_cmp_evt *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid);
dudnwjs 4:60be78a172c2 176 break;
dudnwjs 4:60be78a172c2 177 case GAPM_DEVICE_READY_IND:
dudnwjs 5:e11b23f9aacc 178 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 179 hostpc->printf("==> GAPM_DEVICE_READY_IND!!\n");
dudnwjs 5:e11b23f9aacc 180 gapm_device_ready_ind_handler(msg_hdr.bType,(struct gap_ready_evt *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid,this);
dudnwjs 4:60be78a172c2 181 break;
dudnwjs 4:60be78a172c2 182 case GAPM_ADV_REPORT_IND:
dudnwjs 5:e11b23f9aacc 183 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 184 hostpc->printf("==> GAPM_ADV_REPORT_IND!!\n");
dudnwjs 4:60be78a172c2 185 gapm_adv_report_ind_handler(msg_hdr.bType,(struct gapm_adv_report_ind *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid);
dudnwjs 4:60be78a172c2 186 break;
dudnwjs 4:60be78a172c2 187 case GAPC_CMP_EVT:
dudnwjs 5:e11b23f9aacc 188 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 189 hostpc->printf("==> GAPC_CMP_EVT!!\n");
dudnwjs 4:60be78a172c2 190 HandleGapcCmpEvt(msg_hdr.bType,(struct gapc_cmp_evt *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid);
dudnwjs 4:60be78a172c2 191 break;
dudnwjs 5:e11b23f9aacc 192 case GAPC_CONNECTION_REQ_IND:
dudnwjs 5:e11b23f9aacc 193 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 194 hostpc->printf("==> GAPC_CONNECTION_REQ_IND!!\n");
dudnwjs 5:e11b23f9aacc 195 gapc_connection_req_ind_handler(msg_hdr.bType,(struct gapc_connection_req_ind *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid,this);
dudnwjs 5:e11b23f9aacc 196 break;
dudnwjs 5:e11b23f9aacc 197 case GAPC_DISCONNECT_IND:
dudnwjs 5:e11b23f9aacc 198 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 199 hostpc->printf("==> GAPC_DISCONNECT_IND!!\n");
dudnwjs 5:e11b23f9aacc 200 gapc_disconnect_ind_handler(msg_hdr.bType,(struct gapc_disconnect_ind *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid,this);
dudnwjs 5:e11b23f9aacc 201 break;
dudnwjs 4:60be78a172c2 202 case DISS_CREATE_DB_CFM:
dudnwjs 5:e11b23f9aacc 203 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 204 hostpc->printf("==> DISS_CREATE_DB_CFM!!\n");
dudnwjs 4:60be78a172c2 205 diss_create_db_cfm_handler(msg_hdr.bType,(struct diss_create_db_cfm *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid,this);
dudnwjs 4:60be78a172c2 206 break;
dudnwjs 4:60be78a172c2 207 case DISS_DISABLE_IND:
dudnwjs 5:e11b23f9aacc 208 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 209 hostpc->printf("==> DISS_DISABLE_IND!!\n");
dudnwjs 4:60be78a172c2 210 break;
dudnwjs 4:60be78a172c2 211 case DISS_ERROR_IND:
dudnwjs 4:60be78a172c2 212 if ( print_flag == 1)
dudnwjs 4:60be78a172c2 213 hostpc->printf("Rcved DISS_ERROR_IND Msg\n");
dudnwjs 4:60be78a172c2 214 break;
dudnwjs 5:e11b23f9aacc 215 case FOTA_SERVER_CREATE_DB_CFM:
dudnwjs 5:e11b23f9aacc 216 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 217 hostpc->printf("==> FOTA_SERVER_CREATE_DB_CFM!!\n");
dudnwjs 5:e11b23f9aacc 218 fota_server_create_db_cfm_handler(msg_hdr.bType,(struct fota_server_create_db_cfm *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid,this);
dudnwjs 5:e11b23f9aacc 219 break;
dudnwjs 5:e11b23f9aacc 220 case FOTA_SERVER_DISABLE_IND:
dudnwjs 5:e11b23f9aacc 221 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 222 hostpc->printf("==> FOTA_SERVER_DISABLE_IND!!\n");
dudnwjs 5:e11b23f9aacc 223 break;
dudnwjs 5:e11b23f9aacc 224 case FOTA_SERVER_ERROR_IND:
dudnwjs 5:e11b23f9aacc 225 if ( print_flag == 1)
dudnwjs 5:e11b23f9aacc 226 hostpc->printf("Rcved FOTA_SERVER_ERROR_IND Msg\n");
dudnwjs 6:8dd20294b2aa 227 fota_server_data_flash_ind_handler(msg_hdr.bType,(struct fota_server_data_flash_ind *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid,this);
dudnwjs 5:e11b23f9aacc 228 break;
dudnwjs 4:60be78a172c2 229 default:
dudnwjs 4:60be78a172c2 230 if( print_flag == 1)
dudnwjs 8:9eec2c246a85 231 hostpc->printf("message Type Not Defined ! \n");
dudnwjs 4:60be78a172c2 232 break;
dudnwjs 4:60be78a172c2 233 }
dudnwjs 5:e11b23f9aacc 234 }//gapc_disconnect_ind_handler(GAPC_DISCONNECT_IND),(GAPC_CONNECTION_REQ_IND)gapc_connection_req_ind_handler
dudnwjs 8:9eec2c246a85 235 /**
dudnwjs 8:9eec2c246a85 236 ****************************************************************************************
dudnwjs 8:9eec2c246a85 237 * @brief GAPM Command Event Handler.
dudnwjs 8:9eec2c246a85 238 * @detail After get GAPM command, extract operation. Each operation connect corresponding function
dudnwjs 8:9eec2c246a85 239 ****************************************************************************************
dudnwjs 8:9eec2c246a85 240 */
dudnwjs 4:60be78a172c2 241 void BleMsgHandler::HandleGapmCmpEvt(unsigned short msgid,
dudnwjs 4:60be78a172c2 242 struct gapm_cmp_evt *param,
dudnwjs 4:60be78a172c2 243 unsigned short dest_id,
dudnwjs 4:60be78a172c2 244 unsigned short src_id)
dudnwjs 4:60be78a172c2 245 {
dudnwjs 4:60be78a172c2 246 if (param->status == CO_ERROR_NO_ERROR)
dudnwjs 4:60be78a172c2 247 {
dudnwjs 4:60be78a172c2 248 switch(param->operation)
dudnwjs 4:60be78a172c2 249 {
dudnwjs 4:60be78a172c2 250 case GAPM_NO_OP:// No operation.
dudnwjs 4:60be78a172c2 251 break;
dudnwjs 4:60be78a172c2 252 case GAPM_RESET:// Reset BLE subsystem: LL and HL.
dudnwjs 5:e11b23f9aacc 253 if( print_flag == 1)
dudnwjs 5:e11b23f9aacc 254 hostpc->printf("GAPM_RESET!! Start...\n");
dudnwjs 4:60be78a172c2 255 gapm_reset_completion_handler (msgid, (struct gapm_cmp_evt *)param, dest_id, src_id,this);
dudnwjs 4:60be78a172c2 256 break;
dudnwjs 4:60be78a172c2 257 case GAPM_CANCEL:// Cancel currently executed operation.
dudnwjs 6:8dd20294b2aa 258 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 259 hostpc->printf("GAPM_CANCEL\n");
dudnwjs 4:60be78a172c2 260 break;
dudnwjs 4:60be78a172c2 261 case GAPM_SET_DEV_CONFIG:// Set device configuration
dudnwjs 4:60be78a172c2 262 if( print_flag == 1)
dudnwjs 4:60be78a172c2 263 hostpc->printf("Adverting Start...\n");
dudnwjs 4:60be78a172c2 264 gapm_set_dev_config_completion_handler(msgid, (struct gapm_cmp_evt *)param, dest_id, src_id,this);
dudnwjs 4:60be78a172c2 265 break;
dudnwjs 4:60be78a172c2 266 case GAPM_SET_DEV_NAME: // Set device name
dudnwjs 6:8dd20294b2aa 267 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 268 hostpc->printf("GAPM_SET_DEV_NAME\n");
dudnwjs 4:60be78a172c2 269 break;
dudnwjs 4:60be78a172c2 270 case GAPM_SET_CHANNEL_MAP:// Set device channel map
dudnwjs 6:8dd20294b2aa 271 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 272 hostpc->printf("GAPM_SET_CHANNEL_MAP\n");
dudnwjs 4:60be78a172c2 273 break;
dudnwjs 4:60be78a172c2 274 case GAPM_GET_DEV_NAME:// Get Local device name
dudnwjs 6:8dd20294b2aa 275 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 276 hostpc->printf("GAPM_GET_DEV_NAME\n");
dudnwjs 4:60be78a172c2 277 break;
dudnwjs 4:60be78a172c2 278 case GAPM_GET_DEV_VERSION:// Get Local device version
dudnwjs 6:8dd20294b2aa 279 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 280 hostpc->printf("GAPM_GET_DEV_VERSION\n");
dudnwjs 4:60be78a172c2 281 break;
dudnwjs 4:60be78a172c2 282 case GAPM_GET_DEV_BDADDR:// Get Local device BD Address
dudnwjs 6:8dd20294b2aa 283 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 284 hostpc->printf("GAPM_GET_DEV_BDADDR\n");
dudnwjs 4:60be78a172c2 285 break;
dudnwjs 4:60be78a172c2 286 case GAPM_GET_WLIST_SIZE:// Get White List Size.
dudnwjs 6:8dd20294b2aa 287 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 288 hostpc->printf("GAPM_GET_WLIST_SIZE\n");
dudnwjs 4:60be78a172c2 289 break;
dudnwjs 4:60be78a172c2 290 case GAPM_ADD_DEV_IN_WLIST:// Add devices in white list.
dudnwjs 6:8dd20294b2aa 291 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 292 hostpc->printf("GAPM_ADD_DEV_IN_WLIST\n");
dudnwjs 4:60be78a172c2 293 break;
dudnwjs 4:60be78a172c2 294 case GAPM_RMV_DEV_FRM_WLIST:// Remove devices form white list.
dudnwjs 6:8dd20294b2aa 295 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 296 hostpc->printf("GAPM_RMV_DEV_FRM_WLIST\n");
dudnwjs 4:60be78a172c2 297 break;
dudnwjs 4:60be78a172c2 298 case GAPM_CLEAR_WLIST:// Clear all devices from white list.
dudnwjs 6:8dd20294b2aa 299 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 300 hostpc->printf("GAPM_CLEAR_WLIST\n");
dudnwjs 4:60be78a172c2 301 break;
dudnwjs 4:60be78a172c2 302 case GAPM_ADV_NON_CONN:// Start non connectable advertising
dudnwjs 4:60be78a172c2 303 case GAPM_ADV_UNDIRECT:// Start undirected connectable advertising
dudnwjs 4:60be78a172c2 304 case GAPM_ADV_DIRECT:// Start directed connectable advertising
dudnwjs 6:8dd20294b2aa 305 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 306 hostpc->printf("GAPM_ADV_~\n");
dudnwjs 6:8dd20294b2aa 307 break;
dudnwjs 4:60be78a172c2 308 case GAPM_SCAN_ACTIVE:// Start active scan operation
dudnwjs 4:60be78a172c2 309 case GAPM_SCAN_PASSIVE: // Start passive scan operation
dudnwjs 6:8dd20294b2aa 310 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 311 hostpc->printf("GAPM_SCAN_~\n");
dudnwjs 4:60be78a172c2 312 break;
dudnwjs 4:60be78a172c2 313 case GAPM_CONNECTION_DIRECT:// Direct connection operation
dudnwjs 6:8dd20294b2aa 314 //break;
dudnwjs 4:60be78a172c2 315 case GAPM_CONNECTION_AUTO:// Automatic connection operation
dudnwjs 6:8dd20294b2aa 316 //break;
dudnwjs 4:60be78a172c2 317 case GAPM_CONNECTION_SELECTIVE:// Selective connection operation
dudnwjs 6:8dd20294b2aa 318 //break;
dudnwjs 4:60be78a172c2 319 case GAPM_CONNECTION_NAME_REQUEST:// Name Request operation (requires to start a direct connection)
dudnwjs 6:8dd20294b2aa 320 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 321 hostpc->printf("GAPM_CONNECT_~\n");
dudnwjs 4:60be78a172c2 322 break;
dudnwjs 4:60be78a172c2 323 case GAPM_RESOLV_ADDR:// Resolve device address
dudnwjs 6:8dd20294b2aa 324 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 325 hostpc->printf("GAPM_RESOLV_ADDR\n");
dudnwjs 4:60be78a172c2 326 break;
dudnwjs 4:60be78a172c2 327 case GAPM_GEN_RAND_ADDR:// Generate a random address
dudnwjs 6:8dd20294b2aa 328 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 329 hostpc->printf("GAPM_GEN_RAND_ADDR\n");
dudnwjs 4:60be78a172c2 330 break;
dudnwjs 4:60be78a172c2 331 case GAPM_USE_ENC_BLOCK:// Use the controller's AES-128 block
dudnwjs 6:8dd20294b2aa 332 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 333 hostpc->printf("GAPM_USE_ENC_BLOCK\n");
dudnwjs 4:60be78a172c2 334 break;
dudnwjs 4:60be78a172c2 335 case GAPM_GEN_RAND_NB:// Generate a 8-byte random number
dudnwjs 6:8dd20294b2aa 336 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 337 hostpc->printf("GAPM_GEN_RAND_NB\n");
dudnwjs 4:60be78a172c2 338 break;
dudnwjs 4:60be78a172c2 339 case GAPM_DBG_GET_MEM_INFO:// Get memory usage
dudnwjs 6:8dd20294b2aa 340 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 341 hostpc->printf("GAPM_GAPM_DBG_GET_MEM_INFO\n");
dudnwjs 4:60be78a172c2 342 break;
dudnwjs 4:60be78a172c2 343 case GAPM_PLF_RESET:// Perform a platform reset
dudnwjs 6:8dd20294b2aa 344 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 345 hostpc->printf("GAPM_PLF_RESET\n");
dudnwjs 4:60be78a172c2 346 break;
dudnwjs 4:60be78a172c2 347 case GAPM_GET_DEV_ADV_TX_POWER:// Get device advertising power level
dudnwjs 6:8dd20294b2aa 348 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 349 hostpc->printf("GAPM_GET_DEV_ADV_TX_POWER\n");
dudnwjs 6:8dd20294b2aa 350 break;
dudnwjs 6:8dd20294b2aa 351 default:
dudnwjs 6:8dd20294b2aa 352 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 353 hostpc->printf("??????????????????????????\n");
dudnwjs 4:60be78a172c2 354 break;
dudnwjs 4:60be78a172c2 355 }
dudnwjs 6:8dd20294b2aa 356 }else{
dudnwjs 6:8dd20294b2aa 357 if( print_flag == 1)
dudnwjs 6:8dd20294b2aa 358 hostpc->printf("?status ERROR?\n");
dudnwjs 4:60be78a172c2 359 }
dudnwjs 4:60be78a172c2 360 }
dudnwjs 8:9eec2c246a85 361 /**
dudnwjs 8:9eec2c246a85 362 ****************************************************************************************
dudnwjs 8:9eec2c246a85 363 * @brief GAPC Command Event Handler.
dudnwjs 8:9eec2c246a85 364 * @detail After get GAPC command, extract operation. Each operation connect corresponding function
dudnwjs 8:9eec2c246a85 365 ****************************************************************************************
dudnwjs 8:9eec2c246a85 366 */
dudnwjs 4:60be78a172c2 367 void BleMsgHandler::HandleGapcCmpEvt(unsigned short msgid,
dudnwjs 4:60be78a172c2 368 struct gapc_cmp_evt *param,
dudnwjs 4:60be78a172c2 369 unsigned short dest_id,
dudnwjs 4:60be78a172c2 370 unsigned short src_id)
dudnwjs 4:60be78a172c2 371 {
dudnwjs 4:60be78a172c2 372 switch(param->operation)
dudnwjs 4:60be78a172c2 373 {
dudnwjs 4:60be78a172c2 374 case GAPC_NO_OP: // No operation
dudnwjs 4:60be78a172c2 375 break;
dudnwjs 4:60be78a172c2 376 case GAPC_DISCONNECT: // Disconnect link
dudnwjs 4:60be78a172c2 377 break;
dudnwjs 4:60be78a172c2 378 case GAPC_GET_PEER_NAME: // Retrieve name of peer device
dudnwjs 4:60be78a172c2 379 break;
dudnwjs 4:60be78a172c2 380 case GAPC_GET_PEER_VERSION: // Retrieve peer device version info.
dudnwjs 4:60be78a172c2 381 break;
dudnwjs 4:60be78a172c2 382 case GAPC_GET_PEER_FEATURES: // Retrieve peer device features.
dudnwjs 4:60be78a172c2 383 break;
dudnwjs 4:60be78a172c2 384 case GAPC_GET_CON_RSSI: // Retrieve connection RSSI.
dudnwjs 4:60be78a172c2 385 break;
dudnwjs 4:60be78a172c2 386 case GAPC_GET_PRIVACY: // Retrieve Privacy Info.
dudnwjs 4:60be78a172c2 387 break;
dudnwjs 4:60be78a172c2 388 case GAPC_GET_RECON_ADDR: // Retrieve Reconnection Address Value.
dudnwjs 4:60be78a172c2 389 break;
dudnwjs 4:60be78a172c2 390 case GAPC_SET_PRIVACY: // Set Privacy flag.
dudnwjs 4:60be78a172c2 391 break;
dudnwjs 4:60be78a172c2 392 case GAPC_SET_RECON_ADDR: // Set Reconnection Address Value.
dudnwjs 4:60be78a172c2 393 break;
dudnwjs 4:60be78a172c2 394 case GAPC_UPDATE_PARAMS: // Perform update of connection parameters.
dudnwjs 4:60be78a172c2 395 break;
dudnwjs 4:60be78a172c2 396 case GAPC_BOND: // Start bonding procedure.
dudnwjs 4:60be78a172c2 397 break;
dudnwjs 4:60be78a172c2 398 case GAPC_ENCRYPT: // Start encryption procedure.
dudnwjs 4:60be78a172c2 399 break;
dudnwjs 4:60be78a172c2 400 case GAPC_SECURITY_REQ: // Start security request procedure
dudnwjs 4:60be78a172c2 401 break;
dudnwjs 4:60be78a172c2 402 case GAPC_GET_CON_CHANNEL_MAP: // Retrieve Connection Channel MAP.
dudnwjs 4:60be78a172c2 403 break;
dudnwjs 4:60be78a172c2 404 }
dudnwjs 4:60be78a172c2 405 }
dudnwjs 8:9eec2c246a85 406 /**
dudnwjs 8:9eec2c246a85 407 ****************************************************************************************
dudnwjs 8:9eec2c246a85 408 * @brief Debugging message output to hostpc.
dudnwjs 8:9eec2c246a85 409 * @param[in] output char array pointer
dudnwjs 8:9eec2c246a85 410 ****************************************************************************************
dudnwjs 8:9eec2c246a85 411 */
dudnwjs 5:e11b23f9aacc 412 void BleMsgHandler::HostPcPrint(char *str)
dudnwjs 5:e11b23f9aacc 413 {
dudnwjs 5:e11b23f9aacc 414 if(print_flag == 1)
dudnwjs 5:e11b23f9aacc 415 hostpc->printf("%s",str);
dudnwjs 5:e11b23f9aacc 416 }
dudnwjs 8:9eec2c246a85 417 /**
dudnwjs 8:9eec2c246a85 418 ****************************************************************************************
dudnwjs 8:9eec2c246a85 419 * @brief Receive test method
dudnwjs 8:9eec2c246a85 420 ****************************************************************************************
dudnwjs 8:9eec2c246a85 421 */
dudnwjs 5:e11b23f9aacc 422 void BleMsgHandler::ReceiveToSerialTest(void)
dudnwjs 5:e11b23f9aacc 423 {
dudnwjs 5:e11b23f9aacc 424 SerialM->ReceiveToSerialTest();
dudnwjs 5:e11b23f9aacc 425 }
dudnwjs 8:9eec2c246a85 426 /**
dudnwjs 8:9eec2c246a85 427 ****************************************************************************************
dudnwjs 8:9eec2c246a85 428 * @brief Receive and Store Da14583 flash data.
dudnwjs 8:9eec2c246a85 429 * @param[in] mbed binary file size
dudnwjs 8:9eec2c246a85 430 * @param[in] mbed binary version string
dudnwjs 8:9eec2c246a85 431 ****************************************************************************************
dudnwjs 8:9eec2c246a85 432 */
dudnwjs 6:8dd20294b2aa 433 void BleMsgHandler::FirmwareDataReceive(unsigned short code_size, char *version)
dudnwjs 6:8dd20294b2aa 434 {
dudnwjs 6:8dd20294b2aa 435 unsigned short stored_data_cnt = 0;
dudnwjs 7:3478c46cceef 436 char path[20]="/local/";
dudnwjs 7:3478c46cceef 437 char databuf[FIRMWARE_DATA_FRAGMENT_SIZE]="/local/";
dudnwjs 6:8dd20294b2aa 438 if(print_flag == 1)
dudnwjs 6:8dd20294b2aa 439 hostpc->printf("\n!!File name = %s!! code_size = %d\n",version,code_size);
dudnwjs 7:3478c46cceef 440 strcat(databuf, version);
dudnwjs 7:3478c46cceef 441 strcat(databuf, ".BIN");
dudnwjs 6:8dd20294b2aa 442 hostpc->printf("\n!!name = %s!\n",databuf);
dudnwjs 6:8dd20294b2aa 443
dudnwjs 6:8dd20294b2aa 444
dudnwjs 6:8dd20294b2aa 445 DIR *d = opendir("/local/");
dudnwjs 6:8dd20294b2aa 446 struct dirent *p;
dudnwjs 6:8dd20294b2aa 447 while ((p = readdir(d)) != NULL)
dudnwjs 6:8dd20294b2aa 448 {
dudnwjs 7:3478c46cceef 449 hostpc->printf("%s,%d\n", p->d_name,strcmp(strchr(p->d_name,'.')+1,"BIN"));
dudnwjs 7:3478c46cceef 450 if( strcmp(strchr(p->d_name,'.')+1,"BIN") == 0 ){
dudnwjs 7:3478c46cceef 451 strcat(path,p->d_name);
dudnwjs 7:3478c46cceef 452 hostpc->printf("%s\n",path);
dudnwjs 7:3478c46cceef 453 remove(path);
dudnwjs 7:3478c46cceef 454 strcpy(path,"/local/");
dudnwjs 7:3478c46cceef 455 }
dudnwjs 6:8dd20294b2aa 456 }
dudnwjs 6:8dd20294b2aa 457 closedir(d);
dudnwjs 6:8dd20294b2aa 458
dudnwjs 7:3478c46cceef 459 fp = fopen(databuf, "w");
dudnwjs 6:8dd20294b2aa 460
dudnwjs 7:3478c46cceef 461 SerialM->DataReceive((uint8_t*)databuf,2);
dudnwjs 6:8dd20294b2aa 462 if(databuf[0] == 0x80 && databuf[1] == 0x46 ){
dudnwjs 6:8dd20294b2aa 463 if(print_flag == 1)
dudnwjs 6:8dd20294b2aa 464 hostpc->printf("\n!!Firmware Data Transmition Start!!\n");
dudnwjs 6:8dd20294b2aa 465 }else{
dudnwjs 6:8dd20294b2aa 466 if(print_flag == 1)
dudnwjs 6:8dd20294b2aa 467 hostpc->printf("\n!!Firmware Data Transmition ERROR!!\n");
dudnwjs 6:8dd20294b2aa 468 }
dudnwjs 6:8dd20294b2aa 469
dudnwjs 6:8dd20294b2aa 470 memset(databuf,0,FIRMWARE_DATA_FRAGMENT_SIZE);
dudnwjs 6:8dd20294b2aa 471
dudnwjs 6:8dd20294b2aa 472 while( stored_data_cnt < code_size )
dudnwjs 6:8dd20294b2aa 473 {
dudnwjs 6:8dd20294b2aa 474 if( code_size - stored_data_cnt >= FIRMWARE_DATA_FRAGMENT_SIZE ){
dudnwjs 7:3478c46cceef 475 SerialM->DataReceive((uint8_t*)databuf,FIRMWARE_DATA_FRAGMENT_SIZE);
dudnwjs 6:8dd20294b2aa 476 fwrite(databuf, 1, FIRMWARE_DATA_FRAGMENT_SIZE, fp);
dudnwjs 6:8dd20294b2aa 477 stored_data_cnt += FIRMWARE_DATA_FRAGMENT_SIZE;
dudnwjs 6:8dd20294b2aa 478 }else{
dudnwjs 7:3478c46cceef 479 SerialM->DataReceive((uint8_t*)databuf, code_size - stored_data_cnt);
dudnwjs 6:8dd20294b2aa 480 fwrite(databuf, 1, code_size - stored_data_cnt, fp);
dudnwjs 6:8dd20294b2aa 481 stored_data_cnt = code_size ;
dudnwjs 6:8dd20294b2aa 482 }
dudnwjs 6:8dd20294b2aa 483 memset(databuf,0,FIRMWARE_DATA_FRAGMENT_SIZE);
dudnwjs 6:8dd20294b2aa 484 }
dudnwjs 6:8dd20294b2aa 485
dudnwjs 7:3478c46cceef 486 SerialM->DataReceive((uint8_t*)databuf,2);
dudnwjs 6:8dd20294b2aa 487 if(databuf[0] == 0x80 && databuf[1] == 0x46 ){
dudnwjs 6:8dd20294b2aa 488 if(print_flag == 1)
dudnwjs 6:8dd20294b2aa 489 hostpc->printf("\n!!Firmware Data Transmition END!!\n");
dudnwjs 6:8dd20294b2aa 490 }else{
dudnwjs 6:8dd20294b2aa 491 if(print_flag == 1)
dudnwjs 6:8dd20294b2aa 492 hostpc->printf("\n!!Firmware Data Transmition END ERROR!!\n");
dudnwjs 6:8dd20294b2aa 493 }
dudnwjs 6:8dd20294b2aa 494 fclose(fp);
dudnwjs 8:9eec2c246a85 495 wait(5);
dudnwjs 8:9eec2c246a85 496 if(print_flag == 1)
dudnwjs 8:9eec2c246a85 497 hostpc->printf("\n!!RESET MBED!!\n");
dudnwjs 6:8dd20294b2aa 498 mbed_reset();
dudnwjs 6:8dd20294b2aa 499 }
dudnwjs 5:e11b23f9aacc 500
dudnwjs 5:e11b23f9aacc 501
dudnwjs 3:1e70387e1337 502
dudnwjs 0:a1f6b1ba8a1e 503
dudnwjs 0:a1f6b1ba8a1e 504 }//namespace
dudnwjs 8:9eec2c246a85 505 /// @} ext_fota module