From 550cccd7a0d96cae1370f38abb48196bdb339bba Mon Sep 17 00:00:00 2001 From: Wuchuyuan <1917507415@qq.com> Date: Thu, 10 Sep 2026 11:02:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=90=E8=A1=8C=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=BA=E6=AF=8F=E5=B7=AE=E5=88=861=E5=88=86?= =?UTF-8?q?=E9=92=9F=E6=88=96=E8=80=85=E8=B7=A8=E5=A4=A9=E6=97=B6=E4=B8=BB?= =?UTF-8?q?=E5=8A=A8=E4=B8=8A=E6=8A=A5=EF=BC=8C=E9=98=B2=E6=AD=A2=E4=B8=8A?= =?UTF-8?q?=E6=8A=A5=E8=BF=87=E5=BF=AB=E6=88=96=E8=BF=87=E6=85=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/喷淋器_固件需求规格书.md | 2 ++ apps/usr_app/app_runrec.c | 2 +- apps/usr_jb_proto/Protocol/jb_protocol.c | 39 +++++++++++++++++++++--- apps/usr_jb_proto/Protocol/jb_protocol.h | 1 + 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/Doc/喷淋器_固件需求规格书.md b/Doc/喷淋器_固件需求规格书.md index c44a314..666f571 100644 --- a/Doc/喷淋器_固件需求规格书.md +++ b/Doc/喷淋器_固件需求规格书.md @@ -593,6 +593,8 @@ plan_en=0 → 不新触发 **日期轴:** 与加热垫 / 风扇相同 —— 未对时只往 slot[0] 加、不旋转;对时后按本地日历左移;掉电再上电先灌 VM。 +**上报:** 今天累计秒数相对上次 0x07 上报满 **60 秒** 才进差分(`JB_RUNREC_DIFF_SEC`);跨天旋转立刻带 DP18。APP 0x05 读、10 分钟全量仍带完整 124B。其它 DP 上报时不刷新运行记录基准。 + **落盘:** 每累计运行满 600 秒写一次 VM。跨天立刻写。拔电接受最多丢不满 10 分钟的秒数。 `BOARD_RUNREC_ENABLE=0`:不累加、DP18 报全 0。 diff --git a/apps/usr_app/app_runrec.c b/apps/usr_app/app_runrec.c index b2140af..b6a4cb4 100644 --- a/apps/usr_app/app_runrec.c +++ b/apps/usr_app/app_runrec.c @@ -197,7 +197,7 @@ void app_runrec_rotate_if_needed(void) } } - /* 每拍灌 DP18:读请求 / 10min 全量能拿到当前秒数;差分上报不带本 DP */ + /* 每拍灌 DP18:0x05 读立刻拿到当前秒;差分满 1 分钟才 0x07;10min 全量仍带 */ app_runrec_pack(gDevData.run_record); if (need_vm) { app_nvm_save_runrec(); /* 满 10 分钟或跨天 / 首次对时才写 flash */ diff --git a/apps/usr_jb_proto/Protocol/jb_protocol.c b/apps/usr_jb_proto/Protocol/jb_protocol.c index ad78893..7d5935d 100644 --- a/apps/usr_jb_proto/Protocol/jb_protocol.c +++ b/apps/usr_jb_proto/Protocol/jb_protocol.c @@ -650,7 +650,15 @@ static void jbUnpackDps(const uint8_t *bitmap, const uint8_t *values, /* ════════════════════════════════════════════════════════════════ * jbBuildDiffMask — 比较上次与当前值,为变化的可上报 DP 置 mask 位 * 返回: 1 = 有 DP 发生变化, 0 = 全部未变化 + * DP18 运行记录:今天累计秒数相对上次上报满 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) @@ -754,11 +762,20 @@ static uint8_t jbBuildDiffMask(const jb_data_point_t *last, mask[DP_ID_TIME_CONFIG7 / 8] |= (1 << (DP_ID_TIME_CONFIG7 % 8)); hasChange = 1; } - /* DP18 运行记录 */ - if (memcmp(last->run_record, cur->run_record, 124)) + /* DP18 运行记录:今天秒数差分满 1 分钟,或后 30 天格变了(跨天) */ { - mask[DP_ID_RUN_RECORD / 8] |= (1 << (DP_ID_RUN_RECORD % 8)); - hasChange = 1; + 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; + } } /* DP20 设备故障使能 */ if (last->fault_en != cur->fault_en) @@ -942,7 +959,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)); + /* 未带 DP18 时保留上次记录基准,避免喷淋开关等上报把 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; diff --git a/apps/usr_jb_proto/Protocol/jb_protocol.h b/apps/usr_jb_proto/Protocol/jb_protocol.h index da80740..96212e3 100644 --- a/apps/usr_jb_proto/Protocol/jb_protocol.h +++ b/apps/usr_jb_proto/Protocol/jb_protocol.h @@ -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 /* DP18 差分:今天秒数相对上次上报满 1 分钟才带 */ /* Device identity: 取自 Excel 设备信息表的 ProdtCode / productCode。 * JB_CATEGORY_CODE: 必须 4 字符 ASCII,供 BLE 广播 prodcode 使用