增加断网后重连广播和温湿度广播循环切换

This commit is contained in:
2026-09-03 14:57:03 +08:00
parent 5625362916
commit 9a2fdb1709
5 changed files with 312 additions and 6 deletions
+21
View File
@@ -282,3 +282,24 @@ uint8_t app_linkage_is_valid(void)
LinkageCfg_t cfg;
return lk_parse(gDevData.linkage_config, &cfg);
}
/**
* @brief 缸体编号(Byte0-1 大端)
* @note 只读,不做有效性判定,不受 BOARD_LINKAGE_ENABLE 影响——
* 引擎关掉时 DP6 依然由 APP 下发并存在 gDevData 里。
* @return 缸体编号,0=未配
*/
uint16_t app_linkage_get_tank_id(void)
{
return (uint16_t)(((uint16_t)gDevData.linkage_config[0] << 8) |
gDevData.linkage_config[1]);
}
/**
* @brief 联动配置版本(Byte6
* @return 配置版本
*/
uint8_t app_linkage_get_cfg_ver(void)
{
return gDevData.linkage_config[6];
}
+15
View File
@@ -81,4 +81,19 @@ void app_linkage_void(void);
*/
uint8_t app_linkage_is_valid(void);
/**
* @brief 缸体编号(DP6 Byte0-1 大端)
* @note 只读 DP6,不判有效性、不改任何开停状态。
* 0 = 未配缸体(此时不发自定义温湿度广播,一直发见宝回连包)。
* @return 缸体编号
*/
uint16_t app_linkage_get_tank_id(void);
/**
* @brief 联动配置版本(DP6 Byte6,只存不用)
* @note 温湿度广播 Manufacturer Data 的 ver 字段取这里。
* @return 配置版本
*/
uint8_t app_linkage_get_cfg_ver(void);
#endif /* __APP_LINKAGE_H__ */
+40
View File
@@ -41,6 +41,14 @@ typedef struct {
static AppThCtx_t s_th;
/**
* 「本周期采样成功」事件(生产者=20ms 中断,消费者=500ms 任务上下文)
* ⚠ 中断里只写这三个 volatile,绝不做开关广播 / 打日志 / 写 flash
*/
static volatile uint8_t s_th_pending;
static volatile int16_t s_th_pending_t;
static volatile uint8_t s_th_pending_h;
/**
* @brief 记一次采样失败(发令 nack / 读数失败共用)
* @return 无
@@ -73,6 +81,9 @@ void app_th_init(void)
s_th.valid = 0;
s_th.fail_cnt = 0;
s_th.last_ok = 0;
s_th_pending = 0;
s_th_pending_t = 0;
s_th_pending_h = 0;
s_th.inited = 1;
log_info("th init period=%ums\n", (unsigned)BOARD_TH_PERIOD_MS);
}
@@ -119,6 +130,10 @@ void app_th_poll(uint16_t dt)
s_th.fail_cnt = 0;
s_th.valid = 1;
s_th.last_ok = 1;
/* 先填值再置 pending:消费者关中断取,生产者是中断,顺序无歧义 */
s_th_pending_t = t;
s_th_pending_h = h;
s_th_pending = 1;
log_info("th %d.%dC %d%%\n",
(int)(t / 10), (int)((t < 0) ? (-t % 10) : (t % 10)), h);
} else {
@@ -181,3 +196,28 @@ uint8_t app_th_last_sample_ok(void)
{
return s_th.last_ok;
}
/**
* @brief 取走一次「本周期采样成功」事件(消费端,任务上下文)
* @param t_x10 出参:温度 ×10
* @param h 出参:湿度 %
* @return 1=取到新采样,0=无新采样
*/
uint8_t app_th_take_sample(int16_t *t_x10, uint8_t *h)
{
uint8_t got;
local_irq_disable();
got = s_th_pending;
if (got) {
s_th_pending = 0;
if (t_x10) {
*t_x10 = s_th_pending_t;
}
if (h) {
*h = s_th_pending_h;
}
}
local_irq_enable();
return got;
}
+14
View File
@@ -65,4 +65,18 @@ uint8_t app_th_is_fault(void);
*/
uint8_t app_th_last_sample_ok(void);
/**
* @brief 取走一次「本周期采样成功」事件(供 usr_le_adv 的 500ms 任务上下文)
* @note ⚠ 生产者是 app_th_poll(20ms 硬件定时器中断上下文),那里只置
* volatile pending,不开关广播、不打日志、不写 flash。
* 消费者(usr_ble_adv_updataBLE 线程任务上下文)调本函数取走,
* 内部 local_irq_disable 保护,取到即清。
* 只在真正采样成功(last_ok 那次)时产生,失败/fault 不产生,
* 取到的就是本次新值而不是历史有效值。
* @param t_x10 出参:温度 ×10(可为 NULL)
* @param h 出参:湿度 %(可为 NULL)
* @return 1=取到一次新采样,0=无新采样
*/
uint8_t app_th_take_sample(int16_t *t_x10, uint8_t *h);
#endif /* __APP_TH_H__ */