增加断网后重连广播和温湿度广播循环切换
This commit is contained in:
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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__ */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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_updata,BLE 线程任务上下文)调本函数取走,
|
||||
* 内部 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__ */
|
||||
|
||||
Reference in New Issue
Block a user