| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /*
- * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
- *
- * SPDX-License-Identifier: Unlicense OR CC0-1.0
- */
- /* Includes */
- #include "common.h"
- #include "gap.h"
- #include "gatt_svc.h"
- #include "heart_rate.h"
- #include "led.h"
- #include "device_manager.h"
- #define MAX_CONN 10
- static int connected_devices[MAX_CONN];
- static int conn_count = 0;
- /* Library function declarations */
- void ble_store_config_init(void);
- /* Private function declarations */
- static void on_stack_reset(int reason);
- static void on_stack_sync(void);
- static void nimble_host_config_init(void);
- static void nimble_host_task(void *param);
- /* Private functions */
- /*
- * Stack event callback functions
- * - on_stack_reset is called when host resets BLE stack due to errors
- * - on_stack_sync is called when host has synced with controller
- */
- static void on_stack_reset(int reason) {
- /* On reset, print reset reason to console */
- ESP_LOGI(TAG, "nimble stack reset, reset reason: %d", reason);
- }
- static void on_stack_sync(void) {
- /* On stack sync, do advertising initialization */
- adv_init();
- }
- static void nimble_host_config_init(void) {
- /* Set host callbacks */
- ble_hs_cfg.reset_cb = on_stack_reset;
- ble_hs_cfg.sync_cb = on_stack_sync;
- ble_hs_cfg.gatts_register_cb = gatt_svr_register_cb;
- ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
- /* Store host configuration */
- ble_store_config_init();
- }
- static void nimble_host_task(void *param) {
- /* Task entry log */
- ESP_LOGI(TAG, "nimble host task has been started!");
- /* This function won't return until nimble_port_stop() is executed */
- nimble_port_run();
- /* Clean up at exit */
- vTaskDelete(NULL);
- }
- static void heart_rate_task(void *param) {
- /* Task entry log */
- ESP_LOGI(TAG, "heart rate task has been started!");
- /* Loop forever */
- while (1) {
- /* Update heart rate value every 1 second */
- update_heart_rate();
- ESP_LOGI(TAG, "heart rate updated to %d", get_heart_rate());
- /* Send heart rate indication if enabled */
- send_heart_rate_indication();
- /* Sleep */
- vTaskDelay(HEART_RATE_TASK_PERIOD);
- }
- /* Clean up at exit */
- vTaskDelete(NULL);
- }
- void interactive_task(void *param)
- {
- while (1) {
- printf("\n--- Connected Devices ---\n");
- for (int i = 0; i < conn_count; i++) {
- printf("%d: conn_handle=%d\n", i, connected_devices[i]);
- }
- printf("Enter index to disconnect (or -1 to skip): ");
- int idx;
- if(scanf("%d", &idx) == 1) {
- if (idx >= 0 && idx < conn_count) {
- disconnect_device(connected_devices[idx]);
- }
- }
- vTaskDelay(pdMS_TO_TICKS(5000)); // update tiap 5 detik
- }
- }
- void app_main(void) {
- /* Local variables */
- int rc;
- esp_err_t ret;
- /* LED initialization */
- led_init();
- /*
- * NVS flash initialization
- * Dependency of BLE stack to store configurations
- */
- ret = nvs_flash_init();
- if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
- ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
- ESP_ERROR_CHECK(nvs_flash_erase());
- ret = nvs_flash_init();
- }
- if (ret != ESP_OK) {
- ESP_LOGE(TAG, "failed to initialize nvs flash, error code: %d ", ret);
- return;
- }
- /* NimBLE stack initialization */
- ret = nimble_port_init();
- if (ret != ESP_OK) {
- ESP_LOGE(TAG, "failed to initialize nimble stack, error code: %d ",
- ret);
- return;
- }
- /* GAP service initialization */
- rc = gap_init();
- if (rc != 0) {
- ESP_LOGE(TAG, "failed to initialize GAP service, error code: %d", rc);
- return;
- }
- /* GATT server initialization */
- rc = gatt_svc_init();
- if (rc != 0) {
- ESP_LOGE(TAG, "failed to initialize GATT server, error code: %d", rc);
- return;
- }
- /* NimBLE host configuration initialization */
- nimble_host_config_init();
- /* Start NimBLE host task thread and return */
- xTaskCreate(nimble_host_task, "NimBLE Host", 4*1024, NULL, 5, NULL);
- xTaskCreate(interactive_task, "interactive_task", 4*1024, NULL, 5, NULL);
- // xTaskCreate(heart_rate_task, "Heart Rate", 4*1024, NULL, 5, NULL);
- return;
- }
|