增加 BLE MAC 地址管理功能,添加电量灯颜色设置,优化调度器挂起和恢复逻辑

This commit is contained in:
LokLiang
2025-06-23 12:02:30 +08:00
parent 176b2c49f6
commit f34eaca585
13 changed files with 259 additions and 20 deletions

View File

@@ -526,6 +526,25 @@ int app_cfg_set_mac_tab(uint8_t mac[6])
return 0;
}
int app_cfg_set_ble_mac_tab(uint8_t mac[6])
{
for (int i = 0; i < __ARRAY_SIZE(s_cfg_app.ble_mac_tab); i++)
{
if (memcmp(mac, s_cfg_app.ble_mac_tab[i], 6) == 0)
{
return 0;
}
}
if (++s_cfg_app.ble_mac_index >= __ARRAY_SIZE(s_cfg_app.ble_mac_tab))
{
s_cfg_app.ble_mac_index = 0;
}
memcpy(s_cfg_app.ble_mac_tab[s_cfg_app.ble_mac_index], mac, sizeof(s_cfg_app.ble_mac_tab[0]));
app_cfg_do_save(1000);
return 0;
}
int app_cfg_set_temp_log_on(bool sw)
{
// SYS_LOG_INF("set temp log on: %d", sw);
@@ -552,3 +571,15 @@ int app_cfg_set_gyro_heat_value(uint8_t value)
app_cfg_do_save(100);
return 0;
}
int app_cfg_set_bat_led_color(uint32_t color)
{
if (color > 0xFFFFFF)
{
SYS_LOG_WRN("error color: %d", color);
return -1;
}
s_cfg_app.ws2812_bat_led_color = color & 0xFFFFFF;
app_cfg_do_save(100);
return 0;
}

View File

@@ -104,7 +104,7 @@ typedef struct // 设备配置统一数据结构
bool strip_pwrup : 1; // 使用灯带上电效果
bool strip_show_rf : 1; // 在灯带中用一个灯来显示射频数据接口状态的灯效图层
bool strip_link_fc : 1; // 开启灯带联动飞控用于飞控状态监控MSP
char ws2812_bat_led_mode : 2; // 电量灯效, 0: 关闭, 1: 普通飞控, 2: 竞速飞控
char ws2812_bat_led_mode : 3; // 电量灯效, 0: 关闭, 1: 普通飞控, 2: 竞速飞控, 3: 固定翼飞控
uint32_t reserve : 21; // 预留占位(原来是24个uint32)
} capacity;
@@ -132,8 +132,12 @@ typedef struct // 设备配置统一数据结构
} temperature_log;
bool ws2812_bat_led_direction; // 0: 正向1: 反向(正反向是指灯珠的连接方式,正向是指从第一个灯珠开始,反向是指从最后一个灯珠开始)
uint32_t ws2812_bat_led_color; // 电量灯颜色, RGB颜色值,如 0xFFFFFF 代表白色(默认)
uint32_t reserve[36]; // 预留占位,下次更改时保证参数总长度不变,如超过预留长度后则当作新数据处理,sizeof(cfg_app_t) = 484UL
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;
@@ -182,8 +186,11 @@ 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);

View File

@@ -54,9 +54,10 @@ static cfg_app_t const s_cfg_app_default = {
.strip_pwrup = 0, // 使用灯带上电效果
.strip_show_rf = 0, // 在灯带中用一个灯来显示射频数据接口状态的灯效图层
.strip_link_fc = 0, // 开启灯带联动飞控
.ws2812_bat_led_mode = 1, // 电量灯效, 0: 关闭, 1: 普通飞控, 2: 竞速飞控
.ws2812_bat_led_mode = 1, // 电量灯效, 0: 关闭, 1: 普通飞控, 2: 竞速飞控, 3: 固定翼飞控
},
.ws2812_bat_led_direction = 0, // 0: 正向1: 反向(正反向是指灯珠的连接方式,正向是指从第一个灯珠开始,反向是指从最后一个灯珠开始)
.ws2812_bat_led_direction = 0, // 0: 正向1: 反向(正反向是指灯珠的连接方式,正向是指从第一个灯珠开始,反向是指从最后一个灯珠开始)
.ws2812_bat_led_color = 0xFFFFFF, // 电量灯颜色, RGB颜色值,如 0xFFFFFF 代表白色(默认)
.temperature_log = {
.temp_log_on = 0, // 温度日志开关
.temp_log_index = 0, // 温度日志最新索引

View File

@@ -50,9 +50,21 @@ static cfg_app_t const s_cfg_app_default = {
.ble = 1, // 使用 BLE
.ap = 0, // 使用 WIFI AP 模式
.sta = 0, // 使用 WIFI STA 模式
.strip_pwrup = 0, // 使用灯带上电效果
.strip_show_rf = 0, // 在灯带中用一个灯来显示射频数据接口状态的灯效图层
.strip_link_fc = 0, // 开启灯带联动飞控
.ws2812_bat_led_mode = 0, // 电量灯效, 0: 关闭, 1: 普通飞控, 2: 竞速飞控, 3: 固定翼飞控
},
.armed2close_rf_sw = 1, // 解锁后自动关闭射频功能的开关0:关, 1:开
.ws2812_bat_led_direction = 0, // 0: 正向1: 反向(正反向是指灯珠的连接方式,正向是指从第一个灯珠开始,反向是指从最后一个灯珠开始)
.ws2812_bat_led_color = 0xFFFFFF, // 电量灯颜色, RGB颜色值,如 0xFFFFFF 代表白色(默认)
.temperature_log = {
.temp_log_on = 0, // 温度日志开关
.temp_log_index = 0, // 温度日志最新索引
},
.armed2close_rf_sw = 0, // 解锁后自动关闭射频功能的开关0:关, 1:开
.product_id = PRODUCT_ID, // 产品 ID
.gyro_heat_value = 0, // 陀螺仪加热值,单位温度,0为关闭,最大值为80℃
};
#endif

View File

@@ -1194,3 +1194,17 @@ const uint8_t *ble_server_get_mac(void)
{
return s_mac;
}
/**
* @brief 获取远程设备的 MAC 地址
*
* @return const uint8_t* MAC[6]
*/
void ble_server_get_remote_mac(uint8_t *mac)
{
if (mac == NULL)
{
return;
}
memcpy(mac, spp_remote_bda, sizeof(esp_bd_addr_t));
}

View File

@@ -48,3 +48,4 @@ ble_server_status_t ble_server_get_gap_status(void);
uint32_t ble_server_get_mtu(void);
const uint8_t *ble_server_get_mac(void);
void ble_server_get_remote_mac(uint8_t *mac);

View File

@@ -7,7 +7,7 @@ config LED_STRIP_MAX_LEDS
config LED_STRIP_MIN_LEDS
depends on CAP_LED_STRIP
int "最小灯珠数"
range 1 64
range 1 68
default 64
config LED_STRIP_DEFAULT_LEDS

View File

@@ -16,7 +16,7 @@
typedef enum
{
SBLIB_INIT_WIRE_TUNE = 0, // 初始化为无线调参功能
SBLIB_INIT_ADAPTER, // 初始化为 小黄砖4 功能
SBLIB_INIT_ADAPTER, // 初始化为 静态库 功能
} sblib_init_t;
/**
@@ -30,12 +30,12 @@ void sblib_init(sblib_init_t init_type);
/**
* @brief 注册事件回调函数。
* 当有关于小黄砖功能的事件发生或接收到数据时,调用回调函数。
* 当有关于静态库功能的事件发生或接收到数据时,调用回调函数。
* 由 lib_notify_event() 和 sblib_notify_datastream() 函数调用。
*/
typedef void (*lib_notify_cb)(void);
typedef enum __packed // 小黄砖功能控制命令
typedef enum __packed // 静态库功能控制命令
{
LIB_CONTROL_FCPORT_OFF, // 关闭飞控数据接口
LIB_CONTROL_FCPORT_UART, // 使用 UART 连接飞控
@@ -47,7 +47,7 @@ typedef enum __packed // 小黄砖功能控制命令
LIB_CONTROL_RF_STA, // 打开 WIFI(STA)
} lib_control_t;
typedef enum __packed // 小黄砖通知的事件类型
typedef enum __packed // 通知的事件类型
{
LIB_EVENT_NONE = 0,
@@ -80,7 +80,7 @@ typedef enum __packed // 小黄砖通知的事件类型
LIB_EVENT_MAX
} lib_event_type_t;
typedef struct // 小黄砖通知的事件数据
typedef struct // 静态库通知的事件数据
{
lib_event_type_t type; // 事件类型
uint8_t len; // data[] 有效数据长度
@@ -88,7 +88,7 @@ typedef struct // 小黄砖通知的事件数据
} lib_event_t;
/**
* @brief 执行对小黄砖功能的控制。
* @brief 执行对静态库功能的控制。
*
* @param control 控制命令
* @retval 0 表示成功; -1 表示失败。
@@ -97,7 +97,7 @@ int sblib_control(lib_control_t control);
/**
* @brief 注册事件回调函数。
* 当有关于小黄砖的新事件发生时,将调用指定的回调函数以通知上层应用。
* 当有关于静态库的新事件发生时,将调用指定的回调函数以通知上层应用。
* 内部可缓存的记录数为 32 个。
* 使用 sblib_get_event() 可读取这些记录,读取后会清除记录。
*
@@ -106,7 +106,7 @@ int sblib_control(lib_control_t control);
void sblib_regist_notify_event(lib_notify_cb cb);
/**
* @brief 获取小黄砖的事件。线程和中断可用。
* @brief 获取静态库的事件。线程和中断可用。
*
* @return lib_event_t
*/