|
33 | 33 | #define GATTS_CHAR_UUID_FAN 0x5301 |
34 | 34 | #define GATTS_NUM_HANDLE_FAN 4 |
35 | 35 |
|
| 36 | +static uint16_t desc_val_ota = 0x0000; |
| 37 | +static uint16_t desc_val_fan = 0x0000; |
| 38 | + |
36 | 39 | static const char *s_gatts_conn_state_str[] = {"disconnected", "connected"}; |
37 | 40 |
|
38 | 41 | static void profile_ota_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); |
@@ -68,19 +71,29 @@ static void profile_ota_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t |
68 | 71 |
|
69 | 72 | memset(&rsp, 0, sizeof(esp_gatt_rsp_t)); |
70 | 73 | rsp.attr_value.handle = param->read.handle; |
71 | | - rsp.attr_value.len = strlen(app_get_version()) < (ESP_GATT_DEF_BLE_MTU_SIZE - 3) ? |
72 | | - strlen(app_get_version()) : (ESP_GATT_DEF_BLE_MTU_SIZE - 3); |
73 | | - memcpy(rsp.attr_value.value, app_get_version(), rsp.attr_value.len); |
| 74 | + |
| 75 | + if (param->read.handle == gatts_profile_tbl[PROFILE_IDX_OTA].descr_handle) { |
| 76 | + rsp.attr_value.len = 2; |
| 77 | + memcpy(rsp.attr_value.value, &desc_val_ota, sizeof(desc_val_ota)); |
| 78 | + } else { |
| 79 | + rsp.attr_value.len = strlen(app_get_version()) < (ESP_GATT_DEF_BLE_MTU_SIZE - 3) ? |
| 80 | + strlen(app_get_version()) : (ESP_GATT_DEF_BLE_MTU_SIZE - 3); |
| 81 | + memcpy(rsp.attr_value.value, app_get_version(), rsp.attr_value.len); |
| 82 | + } |
74 | 83 |
|
75 | 84 | esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &rsp); |
76 | 85 | break; |
77 | 86 | } |
78 | 87 | case ESP_GATTS_WRITE_EVT: { |
79 | | - if (!param->write.need_rsp) { |
80 | | - if (!param->write.is_prep) { |
| 88 | + if (!param->write.is_prep) { |
| 89 | + if (param->write.handle == gatts_profile_tbl[PROFILE_IDX_OTA].descr_handle) { |
| 90 | + desc_val_ota = param->write.value[1] << 8 | param->write.value[0]; |
| 91 | + } else { |
81 | 92 | ota_exec((const char *)param->write.value, param->write.len); |
82 | 93 | } |
83 | | - } else { |
| 94 | + } |
| 95 | + |
| 96 | + if (param->write.need_rsp) { |
84 | 97 | esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL); |
85 | 98 | } |
86 | 99 | break; |
@@ -189,40 +202,51 @@ static void profile_fan_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t |
189 | 202 |
|
190 | 203 | memset(&rsp, 0, sizeof(esp_gatt_rsp_t)); |
191 | 204 | rsp.attr_value.handle = param->read.handle; |
192 | | - rsp.attr_value.len = 8; |
193 | 205 |
|
194 | | - rsp.attr_value.value[0] = 0x02; |
195 | | - rsp.attr_value.value[1] = 0x00; |
196 | | - rsp.attr_value.value[2] = 0x00; |
197 | | - rsp.attr_value.value[3] = 0x00; |
198 | | - rsp.attr_value.value[4] = 0x00; |
199 | | - rsp.attr_value.value[5] = 0x00; |
200 | | - rsp.attr_value.value[6] = fan_get_duty(); |
201 | | - rsp.attr_value.value[7] = 0x00; |
| 206 | + if (param->read.handle == gatts_profile_tbl[PROFILE_IDX_FAN].descr_handle) { |
| 207 | + rsp.attr_value.len = 2; |
| 208 | + memcpy(rsp.attr_value.value, &desc_val_fan, sizeof(desc_val_fan)); |
| 209 | + } else { |
| 210 | + rsp.attr_value.len = 8; |
| 211 | + rsp.attr_value.value[0] = 0x02; |
| 212 | + rsp.attr_value.value[1] = 0x00; |
| 213 | + rsp.attr_value.value[2] = 0x00; |
| 214 | + rsp.attr_value.value[3] = 0x00; |
| 215 | + rsp.attr_value.value[4] = 0x00; |
| 216 | + rsp.attr_value.value[5] = 0x00; |
| 217 | + rsp.attr_value.value[6] = fan_get_duty(); |
| 218 | + rsp.attr_value.value[7] = 0x00; |
| 219 | + } |
202 | 220 |
|
203 | 221 | esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &rsp); |
204 | 222 | break; |
205 | 223 | } |
206 | 224 | case ESP_GATTS_WRITE_EVT: { |
207 | 225 | if (!param->write.is_prep) { |
208 | | - switch (param->write.value[0]) { |
209 | | - case 0xEF: { |
210 | | - if (param->write.len == 1) { // Restore Default Configuration |
211 | | - fan_set_duty(DEFAULT_FAN_DUTY); |
212 | | - } else if (param->write.len == 8) { // Update with New Configuration |
213 | | - fan_set_duty(param->write.value[6]); |
214 | | - } else { |
215 | | - ESP_LOGE(GATTS_FAN_TAG, "command 0x%02X error", param->write.value[0]); |
| 226 | + if (param->write.handle == gatts_profile_tbl[PROFILE_IDX_FAN].descr_handle) { |
| 227 | + desc_val_fan = param->write.value[1] << 8 | param->write.value[0]; |
| 228 | + } else { |
| 229 | + switch (param->write.value[0]) { |
| 230 | + case 0xEF: { |
| 231 | + if (param->write.len == 1) { // Restore Default Configuration |
| 232 | + fan_set_duty(DEFAULT_FAN_DUTY); |
| 233 | + } else if (param->write.len == 8) { // Update with New Configuration |
| 234 | + fan_set_duty(param->write.value[6]); |
| 235 | + } else { |
| 236 | + ESP_LOGE(GATTS_FAN_TAG, "command 0x%02X error", param->write.value[0]); |
| 237 | + } |
| 238 | + break; |
| 239 | + } |
| 240 | + default: |
| 241 | + ESP_LOGW(GATTS_FAN_TAG, "unknown command: 0x%02X", param->write.value[0]); |
| 242 | + break; |
216 | 243 | } |
217 | | - break; |
218 | | - } |
219 | | - default: |
220 | | - ESP_LOGW(GATTS_FAN_TAG, "unknown command: 0x%02X", param->write.value[0]); |
221 | | - break; |
222 | 244 | } |
223 | 245 | } |
224 | 246 |
|
225 | | - esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL); |
| 247 | + if (param->write.need_rsp) { |
| 248 | + esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL); |
| 249 | + } |
226 | 250 | break; |
227 | 251 | } |
228 | 252 | case ESP_GATTS_EXEC_WRITE_EVT: |
|
0 commit comments