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:
Wed Jun 24 08:50:07 2015 +0000
Revision:
4:60be78a172c2
Parent:
3:1e70387e1337
Child:
5:e11b23f9aacc
Add advertising feature;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudnwjs 3:1e70387e1337 1 #include "app.h"
dudnwjs 3:1e70387e1337 2 #include "gapm_task.h"
dudnwjs 3:1e70387e1337 3 #include "dialog_fota_config.h"
dudnwjs 4:60be78a172c2 4 #include "diss_task.h"
dudnwjs 3:1e70387e1337 5
dudnwjs 3:1e70387e1337 6
dudnwjs 3:1e70387e1337 7 namespace sevencore_fota{
dudnwjs 3:1e70387e1337 8
dudnwjs 3:1e70387e1337 9 void app_rst_gap(BleMsgHandler *BMH)
dudnwjs 3:1e70387e1337 10 {
dudnwjs 3:1e70387e1337 11 struct gapm_reset_cmd gm_cmd;
dudnwjs 3:1e70387e1337 12 gm_cmd.operation = GAPM_RESET;
dudnwjs 3:1e70387e1337 13 uint8_t *msg;
dudnwjs 3:1e70387e1337 14 unsigned short msg_size = 1+sizeof(ble_hdr) + sizeof(gapm_reset_cmd);
dudnwjs 3:1e70387e1337 15 msg = new uint8_t[msg_size];
dudnwjs 3:1e70387e1337 16 BMH->BleMsgAlloc(GAPM_RESET_CMD, TASK_GAPM, TASK_GTL,
dudnwjs 3:1e70387e1337 17 sizeof(struct gapm_reset_cmd),&gm_cmd,msg);
dudnwjs 3:1e70387e1337 18
dudnwjs 3:1e70387e1337 19 BMH->BleSendMsg(msg,msg_size);
dudnwjs 3:1e70387e1337 20
dudnwjs 3:1e70387e1337 21 return;
dudnwjs 3:1e70387e1337 22 }
dudnwjs 3:1e70387e1337 23
dudnwjs 4:60be78a172c2 24 void app_diss_db_create(BleMsgHandler* BMH)
dudnwjs 4:60be78a172c2 25 {
dudnwjs 4:60be78a172c2 26 uint8_t *msg;
dudnwjs 4:60be78a172c2 27 // Add DIS in the database
dudnwjs 4:60be78a172c2 28 struct diss_create_db_req req;
dudnwjs 4:60be78a172c2 29 unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(struct diss_create_db_req);
dudnwjs 4:60be78a172c2 30 req.features = APP_DIS_FEATURES;
dudnwjs 4:60be78a172c2 31
dudnwjs 4:60be78a172c2 32 msg = new uint8_t[msg_size];
dudnwjs 4:60be78a172c2 33
dudnwjs 4:60be78a172c2 34 BMH->BleMsgAlloc(DISS_CREATE_DB_REQ,TASK_DISS, TASK_GTL,sizeof(struct diss_create_db_req),&req,msg);
dudnwjs 4:60be78a172c2 35 BMH->BleSendMsg(msg,msg_size);
dudnwjs 4:60be78a172c2 36 }
dudnwjs 4:60be78a172c2 37
dudnwjs 4:60be78a172c2 38 void app_adv_start(BleMsgHandler* BMH)
dudnwjs 4:60be78a172c2 39 {
dudnwjs 4:60be78a172c2 40 uint8_t device_name_length;
dudnwjs 4:60be78a172c2 41 uint8_t device_name_avail_space;
dudnwjs 4:60be78a172c2 42 uint8_t device_name_temp_buf[64];
dudnwjs 4:60be78a172c2 43 uint8_t *msg;
dudnwjs 4:60be78a172c2 44 unsigned short msg_size;
dudnwjs 4:60be78a172c2 45 msg_size = 1 + sizeof(ble_hdr) + sizeof(struct gapm_start_advertise_cmd);
dudnwjs 4:60be78a172c2 46 msg = new uint8_t[msg_size];
dudnwjs 4:60be78a172c2 47
dudnwjs 4:60be78a172c2 48 // Allocate a message for GAP
dudnwjs 4:60be78a172c2 49 struct gapm_start_advertise_cmd cmd;
dudnwjs 4:60be78a172c2 50 cmd.op.code = GAPM_ADV_UNDIRECT;
dudnwjs 4:60be78a172c2 51 cmd.op.addr_src = GAPM_PUBLIC_ADDR;
dudnwjs 4:60be78a172c2 52 cmd.intv_min = APP_ADV_INT_MIN;
dudnwjs 4:60be78a172c2 53 cmd.intv_max = APP_ADV_INT_MAX;
dudnwjs 4:60be78a172c2 54 cmd.channel_map = APP_ADV_CHMAP;
dudnwjs 4:60be78a172c2 55 cmd.info.host.mode = GAP_GEN_DISCOVERABLE;
dudnwjs 4:60be78a172c2 56 cmd.info.host.adv_data_len = APP_ADV_DATA_MAX_SIZE;
dudnwjs 4:60be78a172c2 57 cmd.info.host.scan_rsp_data_len = APP_SCAN_RESP_DATA_MAX_SIZE;
dudnwjs 4:60be78a172c2 58
dudnwjs 4:60be78a172c2 59 /*-----------------------------------------------------------------------------------
dudnwjs 4:60be78a172c2 60 * Set the Advertising Data and the Scan Response Data
dudnwjs 4:60be78a172c2 61 *---------------------------------------------------------------------------------*/
dudnwjs 4:60be78a172c2 62
dudnwjs 4:60be78a172c2 63
dudnwjs 4:60be78a172c2 64 // Advertising Data
dudnwjs 4:60be78a172c2 65 #if (NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 66 if(nvds_get(NVDS_TAG_APP_BLE_ADV_DATA, &cmd.info.host.adv_data_len,
dudnwjs 4:60be78a172c2 67 &cmd.info.host.adv_data[0]) != NVDS_OK)
dudnwjs 4:60be78a172c2 68 #endif //(NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 69 {
dudnwjs 4:60be78a172c2 70 cmd.info.host.adv_data_len = APP_DFLT_ADV_DATA_LEN;
dudnwjs 4:60be78a172c2 71 memcpy(&cmd.info.host.adv_data[0], APP_DFLT_ADV_DATA, cmd.info.host.adv_data_len);
dudnwjs 4:60be78a172c2 72
dudnwjs 4:60be78a172c2 73 //Add list of UUID
dudnwjs 4:60be78a172c2 74 #if (BLE_APP_HT)
dudnwjs 4:60be78a172c2 75 cmd.info.host.adv_data_len += APP_HT_ADV_DATA_UUID_LEN;
dudnwjs 4:60be78a172c2 76 memcpy(&cmd.info.host.adv_data[APP_DFLT_ADV_DATA_LEN], APP_HT_ADV_DATA_UUID, APP_HT_ADV_DATA_UUID_LEN);
dudnwjs 4:60be78a172c2 77 #else
dudnwjs 4:60be78a172c2 78 #if (BLE_APP_NEB)
dudnwjs 4:60be78a172c2 79 cmd.info.host.adv_data_len += APP_NEB_ADV_DATA_UUID_LEN;
dudnwjs 4:60be78a172c2 80 memcpy(&cmd.info.host.adv_data[APP_DFLT_ADV_DATA_LEN], APP_NEB_ADV_DATA_UUID, APP_NEB_ADV_DATA_UUID_LEN);
dudnwjs 4:60be78a172c2 81 #endif //(BLE_APP_NEB)
dudnwjs 4:60be78a172c2 82 #endif //(BLE_APP_HT)
dudnwjs 4:60be78a172c2 83 }
dudnwjs 4:60be78a172c2 84
dudnwjs 4:60be78a172c2 85 // Scan Response Data
dudnwjs 4:60be78a172c2 86 #if (NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 87 if(nvds_get(NVDS_TAG_APP_BLE_SCAN_RESP_DATA, &cmd.info.host.scan_rsp_data_len,
dudnwjs 4:60be78a172c2 88 &cmd.info.host.scan_rsp_data[0]) != NVDS_OK)
dudnwjs 4:60be78a172c2 89 #endif //(NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 90 {
dudnwjs 4:60be78a172c2 91 cmd.info.host.scan_rsp_data_len = APP_SCNRSP_DATA_LENGTH;
dudnwjs 4:60be78a172c2 92 memcpy(&cmd.info.host.scan_rsp_data[0], APP_SCNRSP_DATA, cmd.info.host.scan_rsp_data_len);
dudnwjs 4:60be78a172c2 93 }
dudnwjs 4:60be78a172c2 94
dudnwjs 4:60be78a172c2 95 // Get remaining space in the Advertising Data - 2 bytes are used for name length/flag
dudnwjs 4:60be78a172c2 96 device_name_avail_space = APP_ADV_DATA_MAX_SIZE - cmd.info.host.adv_data_len - 2;
dudnwjs 4:60be78a172c2 97
dudnwjs 4:60be78a172c2 98 // Check if data can be added to the Advertising data
dudnwjs 4:60be78a172c2 99 if (device_name_avail_space > 0)
dudnwjs 4:60be78a172c2 100 {
dudnwjs 4:60be78a172c2 101 // Get the Device Name to add in the Advertising Data (Default one or NVDS one)
dudnwjs 4:60be78a172c2 102 #if (NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 103 device_name_length = NVDS_LEN_DEVICE_NAME;
dudnwjs 4:60be78a172c2 104 if (nvds_get(NVDS_TAG_DEVICE_NAME, &device_name_length, &device_name_temp_buf[0]) != NVDS_OK)
dudnwjs 4:60be78a172c2 105 #endif //(NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 106 {
dudnwjs 4:60be78a172c2 107 // Get default Device Name (No name if not enough space)
dudnwjs 4:60be78a172c2 108 device_name_length = strlen(APP_DFLT_DEVICE_NAME);
dudnwjs 4:60be78a172c2 109 memcpy(&device_name_temp_buf[0], APP_DFLT_DEVICE_NAME, device_name_length);
dudnwjs 4:60be78a172c2 110 }
dudnwjs 4:60be78a172c2 111
dudnwjs 4:60be78a172c2 112 if(device_name_length > 0)
dudnwjs 4:60be78a172c2 113 {
dudnwjs 4:60be78a172c2 114 // Check available space
dudnwjs 4:60be78a172c2 115 if( device_name_length > device_name_avail_space)
dudnwjs 4:60be78a172c2 116 device_name_length = device_name_avail_space;
dudnwjs 4:60be78a172c2 117
dudnwjs 4:60be78a172c2 118 // Fill Length
dudnwjs 4:60be78a172c2 119 cmd.info.host.adv_data[cmd.info.host.adv_data_len] = device_name_length + 1;
dudnwjs 4:60be78a172c2 120 // Fill Device Name Flag
dudnwjs 4:60be78a172c2 121 cmd.info.host.adv_data[cmd.info.host.adv_data_len + 1] = '\x09';
dudnwjs 4:60be78a172c2 122 // Copy device name
dudnwjs 4:60be78a172c2 123 memcpy(&cmd.info.host.adv_data[cmd.info.host.adv_data_len + 2], device_name_temp_buf, device_name_length);
dudnwjs 4:60be78a172c2 124
dudnwjs 4:60be78a172c2 125 // Update Advertising Data Length
dudnwjs 4:60be78a172c2 126 cmd.info.host.adv_data_len += (device_name_length + 2);
dudnwjs 4:60be78a172c2 127 }
dudnwjs 4:60be78a172c2 128 }
dudnwjs 4:60be78a172c2 129
dudnwjs 4:60be78a172c2 130 // Send the message
dudnwjs 4:60be78a172c2 131 BMH->BleMsgAlloc(GAPM_START_ADVERTISE_CMD,TASK_GAPM, TASK_GTL,sizeof (struct gapm_start_advertise_cmd),&cmd,msg);
dudnwjs 4:60be78a172c2 132 BMH->BleSendMsg(msg, msg_size);
dudnwjs 4:60be78a172c2 133
dudnwjs 4:60be78a172c2 134 return;
dudnwjs 4:60be78a172c2 135 }
dudnwjs 4:60be78a172c2 136
dudnwjs 4:60be78a172c2 137 void app_set_mode(BleMsgHandler* BMH)
dudnwjs 4:60be78a172c2 138 {
dudnwjs 4:60be78a172c2 139 uint8_t *msg;
dudnwjs 4:60be78a172c2 140 struct gapm_set_dev_config_cmd cmd;
dudnwjs 4:60be78a172c2 141 unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(struct gapm_set_dev_config_cmd);
dudnwjs 4:60be78a172c2 142 msg = new uint8_t[msg_size];
dudnwjs 4:60be78a172c2 143
dudnwjs 4:60be78a172c2 144 cmd.operation = GAPM_SET_DEV_CONFIG;
dudnwjs 4:60be78a172c2 145 // Device Role
dudnwjs 4:60be78a172c2 146 cmd.role = GAP_PERIPHERAL_SLV;
dudnwjs 4:60be78a172c2 147 // Device Appearance
dudnwjs 4:60be78a172c2 148 cmd.appearance = 0x0000;
dudnwjs 4:60be78a172c2 149 // Device Appearance write permission requirements for peer device
dudnwjs 4:60be78a172c2 150 cmd.appearance_write_perm = GAPM_WRITE_DISABLE;
dudnwjs 4:60be78a172c2 151 // Device Name write permission requirements for peer device
dudnwjs 4:60be78a172c2 152 cmd.name_write_perm = GAPM_WRITE_DISABLE;
dudnwjs 4:60be78a172c2 153 // Peripheral only: *****************************************************************
dudnwjs 4:60be78a172c2 154 // Slave preferred Minimum of connection interval
dudnwjs 4:60be78a172c2 155 cmd.con_intv_min = 8; // 10ms (8*1.25ms)
dudnwjs 4:60be78a172c2 156 // Slave preferred Maximum of connection interval
dudnwjs 4:60be78a172c2 157 cmd.con_intv_max = 16; // 20ms (16*1.25ms)
dudnwjs 4:60be78a172c2 158 // Slave preferred Connection latency
dudnwjs 4:60be78a172c2 159 cmd.con_latency = 0;
dudnwjs 4:60be78a172c2 160 // Slave preferred Link supervision timeout
dudnwjs 4:60be78a172c2 161 cmd.superv_to = 100;
dudnwjs 4:60be78a172c2 162 // Privacy settings bit field
dudnwjs 4:60be78a172c2 163 cmd.flags = 0;
dudnwjs 4:60be78a172c2 164
dudnwjs 4:60be78a172c2 165 BMH->BleMsgAlloc(GAPM_SET_DEV_CONFIG_CMD, TASK_GAPM, TASK_GTL,sizeof(struct gapm_set_dev_config_cmd ),&cmd, msg);
dudnwjs 4:60be78a172c2 166 BMH->BleSendMsg(msg,msg_size);
dudnwjs 4:60be78a172c2 167
dudnwjs 4:60be78a172c2 168 return;
dudnwjs 4:60be78a172c2 169 }
dudnwjs 4:60be78a172c2 170
dudnwjs 4:60be78a172c2 171
dudnwjs 3:1e70387e1337 172 }//namespace