sTodo-m5paper-client/libraries/bsec2/examples/bme68x_demo_sample/ble_controller.h
2025-06-30 20:47:33 +02:00

327 lines
8.3 KiB
C++

/*!
* Copyright (c) 2021 Bosch Sensortec GmbH. All rights reserved.
*
* BSD-3-Clause
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @file ble_controller.h
* @date 03 Jan 2024
* @version 2.1.5
*
* @brief Header file for the ble controller
*
*
*/
#ifndef BLE_CONTROLLER_H
#define BLE_CONTROLLER_H
/* Include Arduino Core */
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/queue.h>
#include <sstream>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include "BLECharacteristic.h"
#include <ArduinoJson.h>
#include "label_provider.h"
#include "demo_app.h"
/* Bluetooth UART UUID's */
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
#define BLE_MSG_QUEUE_LEN UINT8_C(3)
#define BLE_JSON_DOC_SIZE UINT16_C(2048)
#define BLE_CONTROLLER_NOTIF_SIZE UINT16_C(600)
#define BLE_MAX_MTU_SIZE UINT16_C(512)
static bool device_connected = false;
static bool old_device_connected = false;
/*!
* @brief Class library for the ble controller
*/
class bleController: public BLECharacteristicCallbacks
{
public:
/*!
* @brief ble communication status
*/
enum cmd_status
{
CMD_VALID,
CMD_INVALID,
CONTROLLER_QUEUE_FULL,
LABEL_INVALID,
BSEC_SELECTED_SENSOR_INVALID,
BSEC_CONFIG_FILE_ERROR,
BSEC_INIT_ERROR,
BSEC_SET_CONFIG_ERROR,
BSEC_UPDATE_SUBSCRIPTION_ERROR,
BSEC_RUN_ERROR,
BSEC_OUTPUT_EXCESS_ERROR,
SENSOR_CONFIG_MISSING,
SENSOR_INITIALIZATION_FAILED,
SD_CARD_INIT_ERROR,
CONFIG_FILE_ERROR,
APP_ALREADY_IN_STREAMING_MODE,
SENSOR_READ_ERROR,
BSEC_CONFIG_FILE_MISSING,
AI_CONFIG_FILE_MISSING,
LABEL_INFO_FILE_MISSING,
INVALID_APP_MODE,
LABEL_FILE_OPEN_FAILED,
MAX_LABEL_NAME_REACHED,
MAX_LABEL_DESCRIPTION_REACHED,
FILE_OPEN_ERROR,
DESERIALIZATION_FAILED,
LABEL_NOT_FOUND,
AI_CONFIG_AND_SUBSCRIPTION_MISSMATCH
};
/*!
* @brief bsec sample rate enumeration
*/
enum bsec_sample_rate
{
ULP,
LP,
HP
};
/*!
* @brief config file type enumeration
*/
enum config_file
{
BMECONFIG,
AICONFIG
};
/*!
* @brief bluetooth message id enumeration
*/
enum ble_msg_id
{
GET_LABEL_INFO,
SET_LABEL_INFO,
SET_LABEL,
GET_RTC_TIME,
SET_RTC_TIME,
START_STREAMING,
STOP_STREAMING,
READ_CONFIG,
SET_APPMODE,
GET_APPMODE,
SET_GROUNDTRUTH,
GET_FW_VERSION
};
/*!
* @brief bluetooth bsec message
*/
struct ble_bsec_msg
{
uint8_t selected_sensor;
uint8_t sample_rate;
uint8_t len;
uint8_t output_id[BSEC_NUMBER_OUTPUTS];
};
/*!
* @brief label information
*/
struct ble_label_info
{
uint32_t label;
char label_name[LABEL_NAME_SIZE + 1];
char label_desc[LABEL_DESC_SIZE + 1];
};
/*!
* @brief bluetooth message structure
*/
struct ble_msg
{
const char *name;
ble_msg_id id;
union
{
ble_bsec_msg bsec;
uint32_t label;
uint32_t rtc_time;
config_file file_type;
uint8_t mode;
ble_label_info label_info;
uint32_t ground_truth;
};
};
/*!
* @brief bluetooth command structure
*/
struct ble_cmd
{
const char *name;
cmd_status (*parse)(std::stringstream& ss, ble_msg& msg);
ble_msg_id id;
};
typedef void (*bleCallBack)(const ble_msg &msg, JsonDocument& jsonDoc);
/*!
* @brief : The constructor of the bleController class creates an instance of the class
*
* @param[in] callBack : ble callBack called when a message is dequeued.
*/
bleController(bleCallBack callBack);
/*!
* @brief : This function initializes the ble controller.
*
* @return bosch error code
*/
demo_ret_code begin();
/*!
* @brief : This function dequeues the last received ble message. The ble callBack
* is called if a new message is available.
*
* @return true if a new message is available else false
*/
bool dequeue_ble_msg(void);
/*!
* @brief : This function send a json formatted notification.
*
* @param[out] jsonDoc : json formatted message
*/
void send_notification(JsonDocument& jsonDoc);
/*!
* @brief : This function gets called when data is received from a bluetooth device.
* It will read in the sent bluetooth command.
*/
void onWrite(BLECharacteristic *pCharacteristic);
/*!
* @brief : This function checks the ble connection status, restarts advertising if disconnected
*/
void check_ble_connection_sts();
private:
bleCallBack _callBack;
static QueueHandle_t msg_queue;
static ble_cmd cmd_list[];
static BLECharacteristic *ble_char_tx, *ble_char_rx;
static BLEServer *pServer;
/*!
* @brief : This function fetches the RTC time which is requested through ble command
*/
static cmd_status parse_cmd_get_rtc_time(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function parses the RTC time received from the ble device and updates
* the RTC time to the ble structure
*/
static cmd_status parse_cmd_set_rtc_time(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function fetches the current label information from the .bmelabelinfo file
*/
static cmd_status parse_cmd_get_label_info(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function updates the received label information to the ble structure
*/
static cmd_status parse_cmd_set_label_info(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function updates the received label to the ble structure
*/
static cmd_status parse_cmd_set_label(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function launches sensor data or sensor data and BSEC output streaming through ble
* based on the app mode
*/
static cmd_status parse_cmd_start_streaming(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function stops ble streaming
*/
static cmd_status parse_cmd_stop_streaming(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function launches the config file data through ble
*/
static cmd_status parse_cmd_read_config(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function updates the current Appmode
*/
static cmd_status parse_cmd_set_appmode(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function retrieves the current Appmode through ble
*/
static cmd_status parse_cmd_get_appmode(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function updates the Groundtruth through ble
*/
static cmd_status parse_cmd_set_groundtruth(std::stringstream& ss, ble_msg& msg);
/*!
* @brief : This function retrieves the current firmware version through ble
*/
static cmd_status parse_cmd_get_fw_version(std::stringstream& ss, ble_msg& msg);
};
class serverCallbacks: public BLEServerCallbacks
{
void onConnect(BLEServer* pServer)
{
device_connected = true;
}
void onDisconnect(BLEServer* pServer)
{
device_connected = false;
}
};
#endif