Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
314a50a14b | ||
|
|
767b9e4343 |
@@ -532,6 +532,8 @@ usr_rtc_get_time() 失败 → 全部定时不执行(等同 time_en=0)
|
|||||||
- 对时成功:按本地日历把数组左移 N 天(跨了几天就移几天),新今天从 0 或当天已累加值继续。
|
- 对时成功:按本地日历把数组左移 N 天(跨了几天就移几天),新今天从 0 或当天已累加值继续。
|
||||||
- 掉电再上电:先把 VM 里 31 格灌进 `gDevData.run_record`;未对时继续往 slot[0] 加。
|
- 掉电再上电:先把 VM 里 31 格灌进 `gDevData.run_record`;未对时继续往 slot[0] 加。
|
||||||
|
|
||||||
|
**上报:** 今天累计秒数相对上次 0x07 上报满 **60 秒** 才进差分(`JB_RUNREC_DIFF_SEC`);跨天旋转立刻带 DP15。APP 0x05 读、10 分钟全量仍带完整 124B。其它 DP 上报时不刷新运行记录基准。
|
||||||
|
|
||||||
**落盘:** 每累计运行满 600 秒写一次 VM。跨天立刻写。拔电没有软关机钩子,**接受最多丢不满 10 分钟的秒数**。
|
**落盘:** 每累计运行满 600 秒写一次 VM。跨天立刻写。拔电没有软关机钩子,**接受最多丢不满 10 分钟的秒数**。
|
||||||
|
|
||||||
`BOARD_RUNREC_ENABLE=0`:不累加、DP15 报全 0。
|
`BOARD_RUNREC_ENABLE=0`:不累加、DP15 报全 0。
|
||||||
@@ -561,7 +563,7 @@ usr_rtc_get_time() 失败 → 全部定时不执行(等同 time_en=0)
|
|||||||
| 6 linkage_config | 20 字节 memcpy + 存 VM + 第 10.5 节立刻重判 |
|
| 6 linkage_config | 20 字节 memcpy + 存 VM + 第 10.5 节立刻重判 |
|
||||||
| 7 time_en | 见第 11 章 |
|
| 7 time_en | 见第 11 章 |
|
||||||
| 8~14 time_config | 8 字节 + 存 VM |
|
| 8~14 time_config | 8 字节 + 存 VM |
|
||||||
| 15 run_record | RO,由 `app_runrec` 填 124B,禁止 APP 写 |
|
| 15 run_record | RO,由 `app_runrec` 填 124B,禁止 APP 写。差分满 1 分钟或跨天才 0x07 |
|
||||||
| 16 heartbeat | 本版忽略(写了也不停温湿度上报) |
|
| 16 heartbeat | 本版忽略(写了也不停温湿度上报) |
|
||||||
| 17 fault_en | 原样存,P0 不做位级过滤 |
|
| 17 fault_en | 原样存,P0 不做位级过滤 |
|
||||||
| 18 fault_code | 0 无 / 1 传感器故障 / 2 预留 |
|
| 18 fault_code | 0 无 / 1 传感器故障 / 2 预留 |
|
||||||
|
|||||||
@@ -12,9 +12,9 @@
|
|||||||
* - app_runrec_tick(20ms 中断):只把在转的毫秒折成 pending 秒,
|
* - app_runrec_tick(20ms 中断):只把在转的毫秒折成 pending 秒,
|
||||||
* **不碰 s_rr.rec[]、不打日志、不写 flash**(跨天旋转在任务侧)。
|
* **不碰 s_rr.rec[]、不打日志、不写 flash**(跨天旋转在任务侧)。
|
||||||
* - app_runrec_rotate_if_needed(500ms 任务):收下 pending 加到
|
* - app_runrec_rotate_if_needed(500ms 任务):收下 pending 加到
|
||||||
* slot[0]、每拍灌 DP21、跨天旋转、满 10 分钟 / 跨天才写 VM。
|
* slot[0]、每拍灌 DP15、跨天旋转、满 10 分钟 / 跨天才写 VM。
|
||||||
* DP21 每 500ms 更新到 gDevData,供读请求和 10min 全量上报;
|
* DP15 每 500ms 更新到 gDevData:0x05 读立刻拿到当前秒;
|
||||||
* 差分变化上报不带 DP21(避免每秒推 124B)。
|
* 差分满 1 分钟才 0x07;10min 全量仍带。
|
||||||
* 拔电没有软关机钩子,接受最多丢不满 10 分钟的秒数(13.1 已拍板)。
|
* 拔电没有软关机钩子,接受最多丢不满 10 分钟的秒数(13.1 已拍板)。
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ void app_runrec_rotate_if_needed(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 每拍灌 DP21:读请求 / 10min 全量能拿到当前秒数;差分上报不带本 DP */
|
/* 每拍灌 DP15:0x05 读立刻拿到当前秒;差分满 1 分钟才 0x07;10min 全量仍带 */
|
||||||
app_runrec_pack(gDevData.run_record);
|
app_runrec_pack(gDevData.run_record);
|
||||||
if (need_vm) {
|
if (need_vm) {
|
||||||
app_nvm_save_runrec(); /* 满 10 分钟或跨天 / 首次对时才写 flash */
|
app_nvm_save_runrec(); /* 满 10 分钟或跨天 / 首次对时才写 flash */
|
||||||
|
|||||||
@@ -13,8 +13,8 @@
|
|||||||
* N 天;掉电上电先把 VM 的 31 格灌回 RAM。
|
* N 天;掉电上电先把 VM 的 31 格灌回 RAM。
|
||||||
* 落盘:每累计运行满 BOARD_RUN_RECORD_SAVE_SEC(600s) 写一次 VM;
|
* 落盘:每累计运行满 BOARD_RUN_RECORD_SAVE_SEC(600s) 写一次 VM;
|
||||||
* 跨天旋转**立刻写**。拔电无软关机钩子,接受丢不满 10 分钟的秒数。
|
* 跨天旋转**立刻写**。拔电无软关机钩子,接受丢不满 10 分钟的秒数。
|
||||||
* DP21:任务上下文每 500ms 灌进 gDevData(读请求 / 10min 全量用);
|
* DP15:任务上下文每 500ms 灌进 gDevData(0x05 读立刻拿到当前秒;
|
||||||
* 差分变化上报不带本 DP,避免每秒推 124B。
|
* 差分满 1 分钟才 0x07;10min 全量仍带)。
|
||||||
*
|
*
|
||||||
* ⚠ 上下文分工(规格书第 0/13 章,2026-08-31 事故定论):
|
* ⚠ 上下文分工(规格书第 0/13 章,2026-08-31 事故定论):
|
||||||
* - app_runrec_tick() = 20ms **中断上下文**:只折 pending 秒,
|
* - app_runrec_tick() = 20ms **中断上下文**:只折 pending 秒,
|
||||||
|
|||||||
@@ -582,7 +582,15 @@ static void jbUnpackDps(const uint8_t *bitmap, const uint8_t *values,
|
|||||||
/* ════════════════════════════════════════════════════════════════
|
/* ════════════════════════════════════════════════════════════════
|
||||||
* jbBuildDiffMask — 比较上次与当前值,为变化的可上报 DP 置 mask 位
|
* jbBuildDiffMask — 比较上次与当前值,为变化的可上报 DP 置 mask 位
|
||||||
* 返回: 1 = 有 DP 发生变化, 0 = 全部未变化
|
* 返回: 1 = 有 DP 发生变化, 0 = 全部未变化
|
||||||
|
* DP15 运行记录:今天累计秒数相对上次上报满 JB_RUNREC_DIFF_SEC 才进差分;
|
||||||
|
* 其它日期格变化(跨天旋转)立刻进差分。0x05 读 / 10min 全量仍带完整 124B。
|
||||||
* ════════════════════════════════════════════════════════════════ */
|
* ════════════════════════════════════════════════════════════════ */
|
||||||
|
static uint32_t jbRunrecTodaySec(const uint8_t *rec)
|
||||||
|
{
|
||||||
|
return ((uint32_t)rec[0] << 24) | ((uint32_t)rec[1] << 16)
|
||||||
|
| ((uint32_t)rec[2] << 8) | (uint32_t)rec[3];
|
||||||
|
}
|
||||||
|
|
||||||
static uint8_t jbBuildDiffMask(const jb_data_point_t *last,
|
static uint8_t jbBuildDiffMask(const jb_data_point_t *last,
|
||||||
const jb_data_point_t *cur,
|
const jb_data_point_t *cur,
|
||||||
uint8_t *mask)
|
uint8_t *mask)
|
||||||
@@ -680,8 +688,21 @@ static uint8_t jbBuildDiffMask(const jb_data_point_t *last,
|
|||||||
mask[DP_ID_TIME_CONFIG7 / 8] |= (1 << (DP_ID_TIME_CONFIG7 % 8));
|
mask[DP_ID_TIME_CONFIG7 / 8] |= (1 << (DP_ID_TIME_CONFIG7 % 8));
|
||||||
hasChange = 1;
|
hasChange = 1;
|
||||||
}
|
}
|
||||||
/* DP15 运行记录:每秒都在变,不参与差分上报(避免 2s 防抖推 124B)。
|
/* DP15 运行记录:今天秒数差分满 1 分钟,或后 30 天格变了(跨天) */
|
||||||
* 读请求与 REPORT_PERIOD 全量仍带当前 gDevData.run_record。 */
|
{
|
||||||
|
uint32_t last_today = jbRunrecTodaySec(last->run_record);
|
||||||
|
uint32_t cur_today = jbRunrecTodaySec(cur->run_record);
|
||||||
|
uint32_t delta = (cur_today > last_today)
|
||||||
|
? (cur_today - last_today)
|
||||||
|
: (last_today - cur_today);
|
||||||
|
|
||||||
|
if ((delta >= JB_RUNREC_DIFF_SEC)
|
||||||
|
|| memcmp(&last->run_record[4], &cur->run_record[4], 120))
|
||||||
|
{
|
||||||
|
mask[DP_ID_RUN_RECORD / 8] |= (1 << (DP_ID_RUN_RECORD % 8));
|
||||||
|
hasChange = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* DP17 设备故障使能 */
|
/* DP17 设备故障使能 */
|
||||||
if (last->fault_en != cur->fault_en)
|
if (last->fault_en != cur->fault_en)
|
||||||
{
|
{
|
||||||
@@ -864,7 +885,19 @@ static void jbReportPolicy(jb_data_point_t *data)
|
|||||||
(now - jbProtocol.lastChangeTime > REPORT_DEBOUNCE))
|
(now - jbProtocol.lastChangeTime > REPORT_DEBOUNCE))
|
||||||
{
|
{
|
||||||
jbSendReport(data, diffMask);
|
jbSendReport(data, diffMask);
|
||||||
|
/* 未带 DP15 时保留上次记录基准,避免档位/模式等上报把 1 分钟差分冲掉 */
|
||||||
|
if (!(diffMask[DP_ID_RUN_RECORD / 8] & (1u << (DP_ID_RUN_RECORD % 8))))
|
||||||
|
{
|
||||||
|
uint8_t keep[124];
|
||||||
|
|
||||||
|
memcpy(keep, jbProtocol.lastData.run_record, 124);
|
||||||
memcpy(&jbProtocol.lastData, data, sizeof(jb_data_point_t));
|
memcpy(&jbProtocol.lastData, data, sizeof(jb_data_point_t));
|
||||||
|
memcpy(jbProtocol.lastData.run_record, keep, 124);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(&jbProtocol.lastData, data, sizeof(jb_data_point_t));
|
||||||
|
}
|
||||||
jbProtocol.lastChangeTime = now;
|
jbProtocol.lastChangeTime = now;
|
||||||
jbProtocol.lastReportTime = now;
|
jbProtocol.lastReportTime = now;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
#define SEND_MAX_NUM 3 /* 最大重传次数 */
|
#define SEND_MAX_NUM 3 /* 最大重传次数 */
|
||||||
#define REPORT_DEBOUNCE 2000 /* 变化上报防抖时间(ms) */
|
#define REPORT_DEBOUNCE 2000 /* 变化上报防抖时间(ms) */
|
||||||
#define REPORT_PERIOD 600000 /* 定时全量上报周期(ms) */
|
#define REPORT_PERIOD 600000 /* 定时全量上报周期(ms) */
|
||||||
|
#define JB_RUNREC_DIFF_SEC 60 /* DP15 差分:今天秒数相对上次上报满 1 分钟才带 */
|
||||||
|
|
||||||
/* Device identity: 取自 Excel 设备信息表的 ProdtCode / productCode。
|
/* Device identity: 取自 Excel 设备信息表的 ProdtCode / productCode。
|
||||||
* JB_CATEGORY_CODE: 必须 4 字符 ASCII,供 BLE 广播 prodcode 使用
|
* JB_CATEGORY_CODE: 必须 4 字符 ASCII,供 BLE 广播 prodcode 使用
|
||||||
|
|||||||
@@ -2,9 +2,10 @@
|
|||||||
* @file usr_le_adv.c
|
* @file usr_le_adv.c
|
||||||
* @brief BLE 广播 / 配对 / OTA 广播切换
|
* @brief BLE 广播 / 配对 / OTA 广播切换
|
||||||
* @author cyWu <1917507415@qq.com>
|
* @author cyWu <1917507415@qq.com>
|
||||||
* @date 2026.09.03
|
* @date 2026.09.07
|
||||||
* @version V1.3.0,温湿度窗拆到 app_th_adv
|
* @version V1.4.0,慢广播改由 BOARD_BLE_SLOW_ADV_ENABLE / SEC 控制
|
||||||
* @history
|
* @history
|
||||||
|
* - V1.4.0, 2026.09.07, cyWu, 常供电默认不切慢广播,秒数可配
|
||||||
* - V1.0.0, 2026.08.03, cyWu, 首次发布
|
* - V1.0.0, 2026.08.03, cyWu, 首次发布
|
||||||
* - V1.1.0, 2026.08.19, cyWu, 对齐模组注释与助手;保留 SOC 上电绑广播策略
|
* - V1.1.0, 2026.08.19, cyWu, 对齐模组注释与助手;保留 SOC 上电绑广播策略
|
||||||
* - V1.2.0, 2026.09.03, cyWu, 已绑定未连接温湿度窗(随后拆出)
|
* - V1.2.0, 2026.09.03, cyWu, 已绑定未连接温湿度窗(随后拆出)
|
||||||
@@ -20,6 +21,7 @@
|
|||||||
#include "usr_le_product.h"
|
#include "usr_le_product.h"
|
||||||
#include "usr_le_api.h"
|
#include "usr_le_api.h"
|
||||||
#include "app_th_adv.h"
|
#include "app_th_adv.h"
|
||||||
|
#include "board_pin.h"
|
||||||
|
|
||||||
#define LOG_TAG_CONST APP
|
#define LOG_TAG_CONST APP
|
||||||
#define LOG_TAG "[LE_ADV]"
|
#define LOG_TAG "[LE_ADV]"
|
||||||
@@ -54,6 +56,10 @@ extern u8 muti_adv_data_len;
|
|||||||
|
|
||||||
/** 广播数据最大长度(BLE 4.x 31 字节) */
|
/** 广播数据最大长度(BLE 4.x 31 字节) */
|
||||||
#define USR_ADV_DATA_MAX 31
|
#define USR_ADV_DATA_MAX 31
|
||||||
|
#define USR_LE_ADV_TICK_MS 500u /* 与 sys_timer_add(usr_ble_adv_updata) 一致 */
|
||||||
|
#if BOARD_BLE_SLOW_ADV_ENABLE
|
||||||
|
#define USR_LE_SLOW_ADV_TICKS ((BOARD_BLE_SLOW_ADV_SEC * 1000u) / USR_LE_ADV_TICK_MS)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 定义在 usr_le_recieve.c,库内共用,不对外导出 */
|
/* 定义在 usr_le_recieve.c,库内共用,不对外导出 */
|
||||||
extern bleproto_authsetup_req_t usr_auth_data;
|
extern bleproto_authsetup_req_t usr_auth_data;
|
||||||
@@ -213,7 +219,7 @@ void usr_ble_adv_init(void)
|
|||||||
usr_ble_adv_updata();
|
usr_ble_adv_updata();
|
||||||
if (le_timer_handle == 0)
|
if (le_timer_handle == 0)
|
||||||
{
|
{
|
||||||
le_timer_handle = sys_timer_add(NULL, usr_ble_adv_updata, 500);
|
le_timer_handle = sys_timer_add(NULL, usr_ble_adv_updata, USR_LE_ADV_TICK_MS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,7 +274,9 @@ void usr_ble_adv_set_raw(const uint8_t *data, uint8_t len)
|
|||||||
*/
|
*/
|
||||||
void usr_ble_adv_updata(void)
|
void usr_ble_adv_updata(void)
|
||||||
{
|
{
|
||||||
|
#if BOARD_BLE_SLOW_ADV_ENABLE
|
||||||
static u16 usr_goto_slow_adv = 0;
|
static u16 usr_goto_slow_adv = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 产品温湿度窗:须先于广播刷新,进/出窗当拍立即生效 */
|
/* 产品温湿度窗:须先于广播刷新,进/出窗当拍立即生效 */
|
||||||
app_th_adv_tick();
|
app_th_adv_tick();
|
||||||
@@ -283,10 +291,11 @@ void usr_ble_adv_updata(void)
|
|||||||
ble_trans_module_enable(1);
|
ble_trans_module_enable(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if BOARD_BLE_SLOW_ADV_ENABLE
|
||||||
if (!usr_ble_is_connected())
|
if (!usr_ble_is_connected())
|
||||||
{
|
{
|
||||||
/* 未连接:回连快广播(80)持续约 60s(500ms×120)后切慢广播
|
/* 未连接:回连快广播(80)持续 BOARD_BLE_SLOW_ADV_SEC 后切慢广播(800)
|
||||||
* 温湿度窗内暂停计数(窗内强制快广播,窗长 1s) */
|
* 温湿度窗内暂停计数(窗内强制快广播) */
|
||||||
if (usr_get_adv_interval() == 80)
|
if (usr_get_adv_interval() == 80)
|
||||||
{
|
{
|
||||||
if ((usr_var.usr_goto_pair == 0) && usr_auth_data.paired_flag)
|
if ((usr_var.usr_goto_pair == 0) && usr_auth_data.paired_flag)
|
||||||
@@ -294,13 +303,15 @@ void usr_ble_adv_updata(void)
|
|||||||
if ((usr_var.usr_ota_succ_flag == 0) && (app_th_adv_is_active() == 0))
|
if ((usr_var.usr_ota_succ_flag == 0) && (app_th_adv_is_active() == 0))
|
||||||
{
|
{
|
||||||
usr_goto_slow_adv++;
|
usr_goto_slow_adv++;
|
||||||
printf("usr_goto_slow_adv = %d\n", usr_goto_slow_adv);
|
|
||||||
}
|
}
|
||||||
if (usr_goto_slow_adv >= 120)
|
if ((USR_LE_SLOW_ADV_TICKS > 0) &&
|
||||||
|
(usr_goto_slow_adv >= USR_LE_SLOW_ADV_TICKS))
|
||||||
{
|
{
|
||||||
usr_goto_slow_adv = 0;
|
usr_goto_slow_adv = 0;
|
||||||
usr_set_adv_interval(80 * 10);
|
usr_set_adv_interval(80 * 10);
|
||||||
usr_var.usr_adv_flag = 1;
|
usr_var.usr_adv_flag = 1;
|
||||||
|
printf("ble switch slow adv, after %us\n",
|
||||||
|
(unsigned)BOARD_BLE_SLOW_ADV_SEC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -313,6 +324,7 @@ void usr_ble_adv_updata(void)
|
|||||||
{
|
{
|
||||||
usr_goto_slow_adv = 0;
|
usr_goto_slow_adv = 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (usr_get_ota_status() == 0)
|
if (usr_get_ota_status() == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,6 +35,18 @@
|
|||||||
#define BOARD_RUNREC_ENABLE 1 /* 31 天运行记录;P2 开 */
|
#define BOARD_RUNREC_ENABLE 1 /* 31 天运行记录;P2 开 */
|
||||||
#define BOARD_NVM_ENABLE 1 /* VM 持久化;P1 开 */
|
#define BOARD_NVM_ENABLE 1 /* VM 持久化;P1 开 */
|
||||||
|
|
||||||
|
/*============================================================================*/
|
||||||
|
/* BLE 广播 */
|
||||||
|
/*============================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 未连接回连快广播(间隔 80)超时后是否切慢广播(间隔 800)。
|
||||||
|
* 本机常供电,默认 0:一直快广播,方便网关回连。
|
||||||
|
* 1=使能;超时秒数见 BOARD_BLE_SLOW_ADV_SEC(usr_ble_adv_updata 每 500ms 计一次)。
|
||||||
|
*/
|
||||||
|
#define BOARD_BLE_SLOW_ADV_ENABLE 0
|
||||||
|
#define BOARD_BLE_SLOW_ADV_SEC 60 /**< 使能为 1 时:快广播持续秒数后再切慢广播 */
|
||||||
|
|
||||||
/*============================================================================*/
|
/*============================================================================*/
|
||||||
/* GPIO */
|
/* GPIO */
|
||||||
/*============================================================================*/
|
/*============================================================================*/
|
||||||
|
|||||||
Reference in New Issue
Block a user