From 26e47a8cf9dec25fe3ad6eee6184f056b700f06d Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Wed, 28 May 2025 23:25:26 +0200 Subject: [PATCH] some modifications - clang formatter - new NimBLE settings - BLE has more advertise data Signed-off-by: Peter Siegmund --- .clang-format | 2 + .clangd | 17 +++ components/led_matrix/led_matrix.c | 30 ++-- .../remote_control/include/device_service.h | 2 +- .../remote_control/include/led_service.h | 11 +- components/remote_control/led_service.c | 36 +++-- components/remote_control/remote_control.c | 133 ++++++++++++------ sdkconfig.defaults | 3 +- 8 files changed, 157 insertions(+), 77 deletions(-) create mode 100644 .clang-format create mode 100644 .clangd diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..515162e --- /dev/null +++ b/.clang-format @@ -0,0 +1,2 @@ +--- +BasedOnStyle: Microsoft diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..12e1375 --- /dev/null +++ b/.clangd @@ -0,0 +1,17 @@ +CompileFlags: + Add: + - -Wno-unknown-warning-option + - -Wno-format + Remove: + - -mword-relocations + +Diagnostics: + ClangTidy: + FastCheckFilter: None + +--- + +If: + PathMatch: .*\.h +Diagnostics: + UnusedIncludes: None diff --git a/components/led_matrix/led_matrix.c b/components/led_matrix/led_matrix.c index a2f8e45..8aae203 100644 --- a/components/led_matrix/led_matrix.c +++ b/components/led_matrix/led_matrix.c @@ -1,8 +1,8 @@ #include "led_matrix.h" +#include "esp_log.h" #include "freertos/FreeRTOS.h" #include "led_strip.h" -#include "esp_log.h" #include "sdkconfig.h" typedef struct @@ -17,22 +17,20 @@ static void led_strip_init(uint8_t gpio_pin, uint32_t size) { led_matrix.size = size; - led_strip_config_t strip_config = { - .strip_gpio_num = gpio_pin, - .max_leds = size, - .led_model = LED_MODEL_WS2812, - .color_component_format = LED_STRIP_COLOR_COMPONENT_FMT_RGB, - .flags = { - .invert_out = false, - }}; + led_strip_config_t strip_config = {.strip_gpio_num = gpio_pin, + .max_leds = size, + .led_model = LED_MODEL_WS2812, + .color_component_format = LED_STRIP_COLOR_COMPONENT_FMT_RGB, + .flags = { + .invert_out = false, + }}; - led_strip_rmt_config_t rmt_config = { - .clk_src = RMT_CLK_SRC_DEFAULT, - .resolution_hz = 0, - .mem_block_symbols = 0, - .flags = { - .with_dma = true, - }}; + led_strip_rmt_config_t rmt_config = {.clk_src = RMT_CLK_SRC_DEFAULT, + .resolution_hz = 0, + .mem_block_symbols = 0, + .flags = { + .with_dma = true, + }}; ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_matrix.led_strip)); } diff --git a/components/remote_control/include/device_service.h b/components/remote_control/include/device_service.h index e51c0f6..d3512cc 100644 --- a/components/remote_control/include/device_service.h +++ b/components/remote_control/include/device_service.h @@ -1,7 +1,7 @@ #pragma once -#include #include "host/ble_hs.h" +#include int ds_model_number_read(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); int ds_manufacturer_read(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); diff --git a/components/remote_control/include/led_service.h b/components/remote_control/include/led_service.h index 1332ba0..13212eb 100644 --- a/components/remote_control/include/led_service.h +++ b/components/remote_control/include/led_service.h @@ -1,7 +1,14 @@ #pragma once -#include #include "host/ble_hs.h" +#include +/// LED Service Characteristic Callbacks int ls_write(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); -int ls_read(uint16_t con_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); +int ls_capabilities_read(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg); + +/// LED Service Characteristic User Description +int ls_char_a000_user_desc_read(uint16_t con_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, + void *arg); +int ls_char_dead_user_desc_read(uint16_t con_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, + void *arg); diff --git a/components/remote_control/led_service.c b/components/remote_control/led_service.c index 92546cd..6a30e80 100644 --- a/components/remote_control/led_service.c +++ b/components/remote_control/led_service.c @@ -4,6 +4,14 @@ static const char *TAG = "led_service"; +/// Capabilities of Device +int ls_capabilities_read(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) +{ + char *data = "To be implemented later"; + os_mbuf_append(ctxt->om, data, strlen(data)); + return 0; +} + // Write data to ESP32 defined as server int ls_write(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { @@ -16,8 +24,7 @@ int ls_write(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ const char CMD_FAN_ON[] = "FAN ON"; const char CMD_FAN_OFF[] = "FAN OFF"; - if (payload_len == (sizeof(CMD_LIGHT_ON) - 1) && - strncmp(received_payload, CMD_LIGHT_ON, payload_len) == 0) + if (payload_len == (sizeof(CMD_LIGHT_ON) - 1) && strncmp(received_payload, CMD_LIGHT_ON, payload_len) == 0) { ESP_LOGI(TAG, "LIGHT ON"); for (int i = 0; i < led_matrix_get_size(); i++) @@ -25,8 +32,7 @@ int ls_write(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ led_matrix_set_pixel(i, 10, 10, 0); } } - else if (payload_len == (sizeof(CMD_LIGHT_OFF) - 1) && - strncmp(received_payload, CMD_LIGHT_OFF, payload_len) == 0) + else if (payload_len == (sizeof(CMD_LIGHT_OFF) - 1) && strncmp(received_payload, CMD_LIGHT_OFF, payload_len) == 0) { ESP_LOGI(TAG, "LIGHT OFF"); for (int i = 0; i < led_matrix_get_size(); i++) @@ -34,14 +40,12 @@ int ls_write(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ led_matrix_set_pixel(i, 0, 0, 0); } } - else if (payload_len == (sizeof(CMD_FAN_ON) - 1) && - strncmp(received_payload, CMD_FAN_ON, payload_len) == 0) + else if (payload_len == (sizeof(CMD_FAN_ON) - 1) && strncmp(received_payload, CMD_FAN_ON, payload_len) == 0) { ESP_LOGI(TAG, "FAN ON"); // TODO: Implement action for FAN ON } - else if (payload_len == (sizeof(CMD_FAN_OFF) - 1) && - strncmp(received_payload, CMD_FAN_OFF, payload_len) == 0) + else if (payload_len == (sizeof(CMD_FAN_OFF) - 1) && strncmp(received_payload, CMD_FAN_OFF, payload_len) == 0) { ESP_LOGI(TAG, "FAN OFF"); // TODO: Implement action for FAN OFF @@ -58,10 +62,18 @@ int ls_write(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ return 0; } -// Read data from ESP32 defined as server -int ls_read(uint16_t con_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) +int ls_char_a000_user_desc_read(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, + void *arg) { - char *data = "Data from the server"; - os_mbuf_append(ctxt->om, data, strlen(data)); + const char *desc = "Capabilities of Device"; + os_mbuf_append(ctxt->om, desc, strlen(desc)); + return 0; +} + +int ls_char_dead_user_desc_read(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, + void *arg) +{ + const char *desc = "Readable Data from Server"; + os_mbuf_append(ctxt->om, desc, strlen(desc)); return 0; } diff --git a/components/remote_control/remote_control.c b/components/remote_control/remote_control.c index 8a26e4b..9542986 100644 --- a/components/remote_control/remote_control.c +++ b/components/remote_control/remote_control.c @@ -1,41 +1,75 @@ #include #include -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/event_groups.h" + #include "esp_event.h" #include "esp_log.h" #include "esp_nimble_hci.h" -#include "nimble/nimble_port.h" -#include "nimble/nimble_port_freertos.h" +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "freertos/task.h" #include "host/ble_hs.h" #include "host/ble_sm.h" -#include "services/gap/ble_svc_gap.h" -#include "services/gatt/ble_svc_gatt.h" -#include "sdkconfig.h" - -#include "led_matrix.h" - +#include "host/ble_uuid.h" #include "include/device_service.h" #include "include/led_service.h" +#include "led_matrix.h" +#include "nimble/nimble_port.h" +#include "nimble/nimble_port_freertos.h" +#include "sdkconfig.h" +#include "services/gap/ble_svc_gap.h" +#include "services/gatt/ble_svc_gatt.h" static const char *TAG = "remote_control"; +static const ble_uuid16_t device_service_uuid = BLE_UUID16_INIT(0x180A); +static const ble_uuid128_t led_service_uuid128 = + BLE_UUID128_INIT(0x91, 0xB6, 0xCA, 0x95, 0xB2, 0xC6, 0x7B, 0x90, 0x31, 0x45, 0x77, 0xE6, 0x67, 0x10, 0x68, 0xB9); + uint8_t ble_addr_type; void ble_app_advertise(void); +static struct ble_gatt_dsc_def char_0xA000_descs[] = {{ + .uuid = BLE_UUID16_DECLARE(0x2901), + .att_flags = BLE_ATT_F_READ, + .access_cb = ls_char_a000_user_desc_read, + }, + {0}}; + +static struct ble_gatt_dsc_def char_0xDEAD_descs[] = {{ + .uuid = BLE_UUID16_DECLARE(0x2901), + .att_flags = BLE_ATT_F_WRITE, + .access_cb = ls_char_dead_user_desc_read, + }, + {0}}; + // Array of pointers to other service definitions static const struct ble_gatt_svc_def gatt_svcs[] = { { .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = BLE_UUID16_DECLARE(0x180A), - .characteristics = (struct ble_gatt_chr_def[]){{.uuid = BLE_UUID16_DECLARE(0x2A24), .flags = BLE_GATT_CHR_F_READ, .access_cb = ds_model_number_read}, {.uuid = BLE_UUID16_DECLARE(0x2A29), .flags = BLE_GATT_CHR_F_READ, .access_cb = ds_manufacturer_read}, {0}}, + .uuid = &device_service_uuid.u, + .characteristics = + (struct ble_gatt_chr_def[]){ + {.uuid = BLE_UUID16_DECLARE(0x2A24), .flags = BLE_GATT_CHR_F_READ, .access_cb = ds_model_number_read}, + {.uuid = BLE_UUID16_DECLARE(0x2A29), .flags = BLE_GATT_CHR_F_READ, .access_cb = ds_manufacturer_read}, + {0}}, }, { .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = BLE_UUID16_DECLARE(0x180), - .characteristics = (struct ble_gatt_chr_def[]){{.uuid = BLE_UUID16_DECLARE(0xFEF4), .flags = BLE_GATT_CHR_F_READ, .access_cb = ls_read}, {.uuid = BLE_UUID16_DECLARE(0xDEAD), .flags = BLE_GATT_CHR_F_WRITE, .access_cb = ls_write}, {0}}, + .uuid = &led_service_uuid128.u, + .characteristics = (struct ble_gatt_chr_def[]){{ + .uuid = BLE_UUID16_DECLARE(0xA000), + .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY, + .access_cb = ls_capabilities_read, + .descriptors = char_0xA000_descs, + }, + { + .uuid = BLE_UUID16_DECLARE(0xDEAD), + .flags = BLE_GATT_CHR_F_WRITE, + .access_cb = ls_write, + .descriptors = char_0xDEAD_descs, + }, + {0}}, }, {0}}; @@ -46,13 +80,7 @@ static int ble_gap_event(struct ble_gap_event *event, void *arg) { case BLE_GAP_EVENT_CONNECT: ESP_LOGI(TAG, "BLE GAP EVENT CONNECT %s", event->connect.status == 0 ? "OK!" : "FAILED!"); - if (event->connect.status == 0) - { - // Start security pairing without disconnecting - int ret = ble_gap_security_initiate(event->connect.conn_handle); - ESP_LOGI(TAG, "BLE GAP SECURITY INITIATE %s", ret == 0 ? "OK!" : "FAILED!"); - } - else + if (event->connect.status != 0) { // Re-advertise if connection failed ble_app_advertise(); @@ -71,17 +99,6 @@ static int ble_gap_event(struct ble_gap_event *event, void *arg) ble_app_advertise(); break; - case BLE_GAP_EVENT_ENC_CHANGE: - if (event->enc_change.status == 0) - { - ESP_LOGI(TAG, "Encryption enabled for connection"); - } - else - { - ESP_LOGE(TAG, "Failed to enable encryption, status=%d", event->enc_change.status); - } - break; - default: break; } @@ -93,12 +110,18 @@ void ble_app_advertise(void) { // GAP - device name definition struct ble_hs_adv_fields fields; + struct ble_hs_adv_fields scan_rsp_fields; const char *device_name; + int ret; + memset(&fields, 0, sizeof(fields)); - device_name = ble_svc_gap_device_name(); // Read the BLE device name - fields.name = (uint8_t *)device_name; - fields.name_len = strlen(device_name); - fields.name_is_complete = 1; + + // GAP - advertising definition + fields.flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP; + fields.uuids128 = (ble_uuid128_t[]){led_service_uuid128}; + fields.num_uuids128 = 1; + fields.uuids128_is_complete = 1; + ble_gap_adv_set_fields(&fields); // GAP - device connectivity definition @@ -106,7 +129,32 @@ void ble_app_advertise(void) memset(&adv_params, 0, sizeof(adv_params)); adv_params.conn_mode = BLE_GAP_CONN_MODE_UND; // connectable or non-connectable adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN; // discoverable or non-discoverable - ble_gap_adv_start(ble_addr_type, NULL, BLE_HS_FOREVER, &adv_params, ble_gap_event, NULL); + ret = ble_gap_adv_start(ble_addr_type, NULL, BLE_HS_FOREVER, &adv_params, ble_gap_event, NULL); + if (ret != 0) + { + ESP_LOGE(TAG, "Advertising failed to start (err %d)", ret); + return; + } + + // --- Configure Scan Response Data (SCAN_RSP) --- + memset(&scan_rsp_fields, 0, sizeof(scan_rsp_fields)); + + // Get the device name + device_name = ble_svc_gap_device_name(); + scan_rsp_fields.name = (uint8_t *)device_name; + scan_rsp_fields.name_len = strlen(device_name); + scan_rsp_fields.name_is_complete = 1; + + // Optionally, add TX power level to scan response + scan_rsp_fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; + scan_rsp_fields.tx_pwr_lvl_is_present = 1; + + ret = ble_gap_adv_rsp_set_fields(&scan_rsp_fields); + if (ret != 0) + { + ESP_LOGE(TAG, "Error setting scan response data; rc=%d", ret); + return; + } } // The application @@ -119,7 +167,8 @@ void ble_app_on_sync(void) // The infinite task void host_task(void *param) { - nimble_port_run(); // This function will return only when nimble_port_stop() is executed + nimble_port_run(); // This function will return only when nimble_port_stop() + // is executed } void ble_init(void *args) @@ -132,12 +181,6 @@ void ble_init(void *args) ble_gatts_add_svcs(gatt_svcs); ble_hs_cfg.sync_cb = ble_app_on_sync; - // Configure security settings - ble_hs_cfg.sm_bonding = 1; - ble_hs_cfg.sm_sc = 0; - ble_hs_cfg.sm_our_key_dist = BLE_SM_PAIR_KEY_DIST_ENC; - ble_hs_cfg.sm_their_key_dist = BLE_SM_PAIR_KEY_DIST_ENC; - nimble_port_freertos_init(host_task); // Run the host task xTaskCreatePinnedToCore(led_matrix_init, "led_matrix", configMINIMAL_STACK_SIZE * 2, NULL, 5, NULL, 1); diff --git a/sdkconfig.defaults b/sdkconfig.defaults index c60e329..6d57ddc 100755 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -2,7 +2,8 @@ CONFIG_BT_ENABLED=y CONFIG_BT_NIMBLE_ENABLED=y -# nimble options +# NimBLE Options +CONFIG_BT_NIMBLE_SECURITY_ENABLE=n CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="miniature" # Logging