197 lines
9.3 KiB
C
197 lines
9.3 KiB
C
/**
|
||
* @file app_config.h
|
||
* @author LokLiang
|
||
* @brief 用于应用控制程序的统一配置的数据结构
|
||
* @version 0.1
|
||
* @date 2023-11-24
|
||
*
|
||
* @copyright Copyright (c) 2023
|
||
*
|
||
* 本模块实现功能:
|
||
* 1. 统一定义应用程序需要存储的所有数据;
|
||
* 2. 依赖 nfs 模块,使当前数据与内部存储的数据实现同步;
|
||
* 3. 依赖 sh_vset 模块,并提供其对应的所有设置实现函数;
|
||
*
|
||
* 对数据的读操作:
|
||
* 上层应用:应用和模式管理模块和控制模块
|
||
* 对外提数据结构为 g_cfg_app 指针,指内部的对应的内存,程序只读;
|
||
*
|
||
* 对数据的写操作:
|
||
* 上层应用:
|
||
* 为所有成员提供专门的写入接口,内部数据被立即更新。
|
||
* 这些接口可用于 shell 的设置函数。
|
||
*
|
||
* 数据的默认值:
|
||
* 当出现以下情况时,配置数据被恢复到默认值:
|
||
* nvs 未初始化或操作失败;
|
||
* 使用 app_cfg_factory_set() 恢复到默认值;
|
||
* 结构体的长度 cfg_app_t 发生改变;
|
||
* APP_CONFIG_DATA_VER 定义的值发生改变(在 app_config.c 内部定义);
|
||
*
|
||
*/
|
||
|
||
#pragma once
|
||
|
||
#include "sys_types.h"
|
||
|
||
/* 数据结构 ------------------------------------------------------------------------------------ */
|
||
|
||
#define MAX_WIFI_STA_NUM 12 /* cfg_app_t::wifi_setting.wifi_max_connection_num 的范围最大合法值 */
|
||
#define MIN_WIFI_STA_NUM 1 /* cfg_app_t::wifi_setting.wifi_max_connection_num 的范围最小合法值 */
|
||
|
||
typedef enum // 当前的无线数据模式,由按键控制更改
|
||
{
|
||
DATA_BRIDGE_RF_MODE_OFF, // 设置数据桥接模式:关闭所有数据接口
|
||
DATA_BRIDGE_RF_MODE_BLE, // 设置数据桥接模式:仅使用 UART <==> BLE
|
||
DATA_BRIDGE_RF_MODE_WIFI_AP, // 设置数据桥接模式:仅使用 UART <==> WIFI(AP)
|
||
DATA_BRIDGE_RF_MODE_WIFI_STA, // 设置数据桥接模式:仅使用 UART <==> WIFI(STA)
|
||
|
||
DATA_BRIDGE_RF_MODE_MAX,
|
||
} data_bridge_rf_mode_t;
|
||
|
||
typedef struct __packed // 由 APP 通过命令设置, WIFI 部分的透传设置
|
||
{
|
||
uint16_t ardupilot_passthrough_tcp_port; // tcp 透传端口(本地端口)
|
||
uint16_t ardupilot_passthrough_udp_port; // udp 透传端口(本地端口)
|
||
uint8_t ardupilot_passthrough_udp_transfer_in_raw_mode; // UDP 连接下, 0: 解析飞控数据帧转发, 1: 直接转发原文
|
||
uint8_t wifi_max_connection_num; // WIFI 最多的连接数。范围 MIN_WIFI_STA_NUM..MAX_WIFI_STA_NUM
|
||
uint32_t uartBaudRate; // 串口透传波特率
|
||
} cfg_app_wifi_setting_t;
|
||
|
||
typedef struct // 设备配置统一数据结构
|
||
{
|
||
uint32_t version; // 配置版本,修改 APP_CONFIG_DATA_VER 的值后, nvs 已同步的数据被恢复到默认值
|
||
|
||
int sys_log_on; // 打开调试日志
|
||
|
||
data_bridge_rf_mode_t rf_mode; // 由按键控制切换的,当前的无线接口
|
||
|
||
char psPassword[12]; // 由 APP 通过命令设置,透传密码
|
||
|
||
char device_name_ble[32]; // 由 APP 通过命令设置, BLE 设备名,必须包含结束符
|
||
|
||
char drone_data[12]; // 由 APP 通过命令设置,表示记录配置
|
||
|
||
cfg_app_wifi_setting_t wifi_setting; // 由 APP 通过命令设置, WIFI 部分的透传设置
|
||
|
||
uint8_t wifi_ap_ipv4[4]; // WIFI AP 模式下的 IP 地址
|
||
struct
|
||
{
|
||
char wifi_ap_ssid[33]; // WIFI AP 模式下的 SSID
|
||
char wifi_ap_password[65]; // WIFI AP 模式下的 密码
|
||
char wifi_sta_ssid[33]; // WIFI STA 模式下的 SSID
|
||
char wifi_sta_password[33]; // WIFI STA 模式下的 密码
|
||
} app_config_wifi_para;
|
||
|
||
uint16_t udp_port_passthrough_broadcast; // udp 透传端口(广播端口)
|
||
uint16_t udp_port_command; // udp 命令端口(本地端口)
|
||
uint16_t tcp_port_command; // tcp 命令端口(本地端口)
|
||
uint16_t tcp_port_telnet; // tcp telnet 端口(默认23)
|
||
uint16_t tcp_port_dfu; // tcp DFU 升级服务端口(本地端口)
|
||
uint16_t tcp_port_msc; // tcp 黑匣子服务端口(本地端口)
|
||
|
||
char dev_mac_str[14]; // 通过 esp_base_mac_addr_get() 获取的 MAC 地址的字符串形式
|
||
|
||
uint32_t salt_random; // 32 位的随机值,生成唯一 ID 的附加值
|
||
|
||
struct // 功能模块开关
|
||
{
|
||
bool pwrup_light : 1; // 短亮黄灯表示启动(方便观察是否有重启)
|
||
bool ble : 1; // 使用 BLE
|
||
bool ap : 1; // 使用 WIFI AP 模式
|
||
bool sta : 1; // 使用 WIFI STA 模式
|
||
|
||
bool strip_pwrup : 1; // 使用灯带上电效果
|
||
bool strip_show_rf : 1; // 在灯带中用一个灯来显示射频数据接口状态的灯效图层
|
||
bool strip_link_fc : 1; // 开启灯带联动飞控:用于飞控状态监控(MSP)
|
||
char ws2812_bat_led_mode : 3; // 电量灯效, 0: 关闭, 1: 普通飞控, 2: 竞速飞控, 3: 固定翼飞控
|
||
|
||
uint32_t reserve : 21; // 预留占位(原来是24个uint32)
|
||
} capacity;
|
||
|
||
struct
|
||
{
|
||
uint8_t protocol_type; // @ref fc_comm_protocol_type_t
|
||
} fc;
|
||
|
||
uint8_t led_strip_ctrl_sw; // 记录当前灯带的模拟开关状态,0: 表示切换到由飞控控制, 1: 表示切换到由本固件控制
|
||
|
||
uint8_t armed2close_rf_sw; // 解锁后自动关闭射频功能的开关,0: 关, 1: 开
|
||
|
||
uint8_t mac_index; // 记录当前通过 WIFI 连接过的 APP 的 MAC 地址的序号
|
||
uint8_t mac_tab[6][6]; // 记录当前通过 WIFI 连接过的 APP 的 MAC 地址, 6 个 MAC 地址,每个 MAC 地址 6 字节,判断是否 APP 设备连接,用于决定是否停止对飞控状态监测
|
||
|
||
uint8_t product_id[6]; // 产品 ID
|
||
|
||
uint8_t gyro_heat_value; // 陀螺仪加热值,单位温度,0为关闭,最大值为80℃
|
||
|
||
struct
|
||
{
|
||
bool temp_log_on : 1; // 温度日志开关
|
||
uint8_t temp_log_index : 5; // 温度日志最新索引
|
||
} temperature_log;
|
||
|
||
bool ws2812_bat_led_direction; // 0: 正向,1: 反向(正反向是指灯珠的连接方式,正向是指从第一个灯珠开始,反向是指从最后一个灯珠开始)
|
||
uint32_t ws2812_bat_led_color; // 电量灯颜色, RGB颜色值,如 0xFFFFFF 代表白色(默认)
|
||
|
||
uint8_t ble_mac_index; // 记录当前通过 BLE 连接过的 APP 的 MAC 地址的序号
|
||
uint8_t ble_mac_tab[6][6]; // 记录当前通过 BLE 连接过的 APP 的 MAC 地址, 6 个 MAC 地址,每个 MAC 地址 6 字节,判断是否 APP 设备连接,用于决定是否停止对飞控状态监测
|
||
|
||
uint32_t reserve[25]; // 预留占位,下次更改时保证参数总长度不变,如超过预留长度后则当作新数据处理,sizeof(cfg_app_t) = 484UL
|
||
|
||
uint32_t crc32; // 校验数据(可放于任何位置)
|
||
} cfg_app_t;
|
||
|
||
/* nvs 接口 ------------------------------------------------------------------------------------ */
|
||
|
||
int app_cfg_init(void); // 初始化
|
||
|
||
int app_cfg_factory_set(void); // 使内存的数据恢复到默认设置,注意不会被立即保存到 nvs 中
|
||
|
||
int app_cfg_do_save(uint32_t delay_ms); // 保存配置数据 到 nvs 的动作
|
||
|
||
/* 读接口 -------------------------------------------------------------------------------------- */
|
||
|
||
extern const cfg_app_t *g_cfg_app; // 指向 cfg_app_t 内存,只读,在 app_cfg_init() 执行初始化后可用
|
||
|
||
extern const int *g_sys_log_on;
|
||
|
||
/* 写接口 -------------------------------------------------------------------------------------- */
|
||
|
||
void app_cfg_set_sys_log(bool on);
|
||
|
||
void app_cfg_set_rf_mode_change(void); // 设置 g_cfg_app->rf_mode 的下一个模式
|
||
int app_cfg_set_rf_mode(data_bridge_rf_mode_t rf_mode);
|
||
|
||
int app_cfg_set_psPassword(const void *psPassword, int size);
|
||
int app_cfg_set_device_name_ble(const void *device_name_ble, int size);
|
||
int app_cfg_set_drone_data(const void *drone_data, int size);
|
||
|
||
int app_cfg_set_wifi_setting_ardupilot_passthrough_tcp_port(uint16_t ardupilot_passthrough_tcp_port); // TCP 透传端口(本地端口)
|
||
int app_cfg_set_wifi_setting_ardupilot_passthrough_udp_port(uint16_t ardupilot_passthrough_udp_port); // UDP 透传端口(本地端口)
|
||
int app_cfg_set_wifi_setting_ardupilot_passthrough_udp_transfer_in_raw_mode(uint8_t ardupilot_passthrough_udp_transfer_in_raw_mode); // UDP 连接下,直接转发原文
|
||
int app_cfg_set_wifi_setting_wifi_max_connection_num(uint8_t wifi_max_connection_num); // WIFI 最多的连接数。范围 MIN_WIFI_STA_NUM..MAX_WIFI_STA_NUM
|
||
int app_cfg_set_wifi_setting_uartBaudRate(uint32_t uartBaudRate); // 串口透传波特率
|
||
|
||
int app_cfg_set_fc_protocol_type(uint8_t type);
|
||
|
||
int app_cfg_set_led_strip_sw(uint8_t sw);
|
||
|
||
int app_cfg_set_armed2close_rf_sw(bool sw);
|
||
|
||
int app_cfg_set_rf_parameters(const void *wifi_parameters, size_t size);
|
||
int app_cfg_set_wifi_ap_ssid(const void *ssid);
|
||
int app_cfg_set_wifi_ap_password(const void *password);
|
||
int app_cfg_set_wifi_sta_ssid(const void *ssid);
|
||
int app_cfg_set_wifi_sta_password(const void *password);
|
||
|
||
int app_cfg_set_mac_tab(uint8_t mac[6]);
|
||
int app_cfg_set_ble_mac_tab(uint8_t mac[6]);
|
||
|
||
int app_cfg_set_temp_log_on(bool sw);
|
||
int app_cfg_set_temp_log_index(uint8_t index);
|
||
|
||
int app_cfg_set_gyro_heat_value(uint8_t value);
|
||
|
||
int app_cfg_set_bat_led_color(uint32_t color);
|