修改运行时间为每差分1分钟或者跨天时主动上报,防止上报过快或过慢

This commit is contained in:
2026-09-10 11:09:58 +08:00
parent 91cdc23bdc
commit babfc2f4c7
4 changed files with 41 additions and 3 deletions
@@ -475,6 +475,8 @@ VM magic 必须用灯罩自己的值(建议 `0xCB00`),**禁止**复用加
**日期轴:** 未对时只往 slot[0] 加、不旋转;对时后按本地日历左移;掉电再上电先灌 VM。
**上报:** 今天累计秒数相对上次 0x07 上报满 **60 秒** 才进差分(`JB_RUNREC_DIFF_SEC`);跨天旋转立刻带 DP20。APP 0x05 读、10 分钟全量仍带完整 124B。其它 DP 上报时不刷新运行记录基准。
**落盘:** 每累计运行满 600 秒写一次 VM。跨天立刻写。拔电接受最多丢不满 10 分钟的秒数。
`BOARD_RUNREC_ENABLE=0`:不累加、DP20 报全 0。
+2 -1
View File
@@ -18,6 +18,7 @@
* - app_runrec_rotate_if_needed500ms 任务):收下 pending 加到
* slot[0]、每拍灌 DP20、跨天旋转、满 600s / 跨天 / 首次对时才
* 写 VM。拔电没有软关机钩子,接受最多丢不满 10 分钟的秒数。
* 差分上报:今天秒数满 1 分钟或跨天才走 0x07JB_RUNREC_DIFF_SEC)。
******************************************************************************/
#include <string.h>
@@ -200,7 +201,7 @@ void app_runrec_rotate_if_needed(void)
}
}
/* 每拍灌 DP20读请求 / 10min 全量能拿到当前秒数;差分上报不带本 DP */
/* 每拍灌 DP200x05 读立刻拿到当前秒;差分满 1 分钟才 0x07;10min 全量仍带 */
app_runrec_pack(gDevData.run_record);
if (need_vm) {
app_nvm_save_runrec(); /* 满 10 分钟或跨天 / 首次对时才写 flash */
+36 -2
View File
@@ -701,7 +701,15 @@ static void jbUnpackDps(const uint8_t *bitmap, const uint8_t *values,
/* ════════════════════════════════════════════════════════════════
* jbBuildDiffMask — 比较上次与当前值,为变化的可上报 DP 置 mask 位
* 返回: 1 = 有 DP 发生变化, 0 = 全部未变化
* DP20 运行记录:今天累计秒数相对上次上报满 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,
const jb_data_point_t *cur,
uint8_t *mask)
@@ -818,7 +826,21 @@ static uint8_t jbBuildDiffMask(const jb_data_point_t *last,
mask[DP_ID_TIME_CONFIG7 / 8] |= (1 << (DP_ID_TIME_CONFIG7 % 8));
hasChange = 1;
}
/* DP20 运行记录:不进差分(秒累加会刷 0x07);0x05 读 / 10min 全量仍带 */
/* DP20 运行记录:今天秒数差分满 1 分钟,或后 30 天格变了(跨天) */
{
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;
}
}
/* DP22 设备故障使能 */
if (last->fault_en != cur->fault_en)
{
@@ -1001,7 +1023,19 @@ static void jbReportPolicy(jb_data_point_t *data)
(now - jbProtocol.lastChangeTime > REPORT_DEBOUNCE))
{
jbSendReport(data, diffMask);
memcpy(&jbProtocol.lastData, data, sizeof(jb_data_point_t));
/* 未带 DP20 时保留上次记录基准,避免开关等上报把 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.run_record, keep, 124);
}
else
{
memcpy(&jbProtocol.lastData, data, sizeof(jb_data_point_t));
}
jbProtocol.lastChangeTime = now;
jbProtocol.lastReportTime = now;
return;
+1
View File
@@ -33,6 +33,7 @@
#define SEND_MAX_NUM 3 /* 最大重传次数 */
#define REPORT_DEBOUNCE 2000 /* 变化上报防抖时间(ms) */
#define REPORT_PERIOD 600000 /* 定时全量上报周期(ms) */
#define JB_RUNREC_DIFF_SEC 60 /* DP20 差分:今天秒数相对上次上报满 1 分钟才带 */
/* Device identity: 取自 Excel 设备信息表的 ProdtCode / productCode。
* JB_CATEGORY_CODE: 必须 4 字符 ASCII,供 BLE 广播 prodcode 使用