129 lines
3.4 KiB
C
129 lines
3.4 KiB
C
/* Includes */
|
|
#include "common.h"
|
|
#include "gap.h"
|
|
#include "gatt_svc.h"
|
|
#include "heart_rate.h"
|
|
#include "led.h"
|
|
|
|
/* 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 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(heart_rate_task, "Heart Rate", 4*1024, NULL, 5, NULL);
|
|
return;
|
|
}
|