BLE fota Robot Demo
Dependencies: mbed-rtos mbed mbed_fota_fan_control
Fork of mbed_fota_lamp_control by
dialog_fota/app.cpp@4:60be78a172c2, 2015-06-24 (annotated)
- 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?
User | Revision | Line number | New 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 |