From aa724c67586bfdcb034e4a21764f21ced37ce363 Mon Sep 17 00:00:00 2001 From: Wuchuyuan <1917507415@qq.com> Date: Wed, 19 Aug 2026 15:26:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E4=BE=A7=E8=83=BD=E5=8A=9B?= =?UTF-8?q?=EF=BC=9ARTC=E3=80=81=E5=BC=80=E6=9C=BA=E9=94=81=E9=94=AE?= =?UTF-8?q?=E4=B8=8E=20BLE=20=E5=8D=8F=E8=AE=AE=E6=94=B6=E6=95=9B=201?= =?UTF-8?q?=E3=80=81=E6=96=B0=E5=A2=9E=20usr=5Fperiph=20RTC=EF=BC=8CDEVICE?= =?UTF-8?q?INFO=20=E8=87=AA=E5=8A=A8=E5=AF=B9=E6=97=B6=EF=BC=9B=E5=AF=B9?= =?UTF-8?q?=E5=A4=96=E7=B2=BE=E7=AE=80=E4=B8=BA=20get=5Ftime(sys=5Ftime*)?= =?UTF-8?q?=EF=BC=8C=E5=BC=80=E5=8F=91=E6=9D=BF=20RTC=20=E6=97=B6=E9=92=9F?= =?UTF-8?q?=E6=94=B9=E7=94=A8=20LRC=202=E3=80=81iokey=20=E5=BC=80=E6=9C=BA?= =?UTF-8?q?=E9=94=81=E9=94=AE=E6=94=B9=E4=B8=BA=E5=85=AC=E5=BC=80=20start/?= =?UTF-8?q?stop=20=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=9D=BF=E7=BA=A7=E5=AE=8F?= =?UTF-8?q?=20TCFG=5FIOKEY=5FBOOT=5FLOCK=5FENABLE=20=E5=8F=AF=E5=85=B3?= =?UTF-8?q?=E9=97=AD=203=E3=80=81=E5=AF=B9=E9=BD=90=E6=A8=A1=E7=BB=84=20BL?= =?UTF-8?q?E=20=E6=94=B6=E5=8F=91/=E7=BB=84=E5=8C=85=E4=B8=8E=E5=85=AC?= =?UTF-8?q?=E5=BC=80=20API=EF=BC=8C=E6=9B=B4=E6=96=B0=20libusr=5Fle=5Fcode?= =?UTF-8?q?.a=EF=BC=9BRelease=20=E5=8C=85=E5=91=BD=E5=90=8D=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=B8=BA=20JBao=5FJL7016=5FSOC=5FSDK=5FVx.x.x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AC701N.cbp | 5 + Makefile | 2 + apps/common/device/key/iokey.c | 87 ++- .../bt_trans_data/le_rcsp_adv_module.c | 25 +- apps/earphone/app_main.c | 2 + apps/earphone/board/br28/board_jl701n_demo.c | 2 +- .../board/br28/board_jl701n_demo_cfg.h | 1 + apps/usr_le_code/ble_proto.c | 69 +- apps/usr_le_code/bleproto.c | 67 +- apps/usr_le_code/bleproto_packer.c | 61 +- apps/usr_le_code/bleproto_packer.h | 23 +- apps/usr_le_code/lib/libusr_le_code.a | Bin 262894 -> 257070 bytes apps/usr_le_code/usr_le_adv.c | 303 +++++---- apps/usr_le_code/usr_le_api.h | 22 +- apps/usr_le_code/usr_le_recieve.c | 597 +++++++----------- apps/usr_periph/usr_rtc.c | 363 +++++++++++ apps/usr_periph/usr_rtc.h | 64 ++ .../download/earphone/download_app_ota.bat | 5 +- include_lib/system/device/iokey.h | 17 + tools/package_release.py | 1 + version.txt | 2 +- 21 files changed, 1118 insertions(+), 600 deletions(-) create mode 100644 apps/usr_periph/usr_rtc.c create mode 100644 apps/usr_periph/usr_rtc.h diff --git a/AC701N.cbp b/AC701N.cbp index 32008f5..f2b466b 100644 --- a/AC701N.cbp +++ b/AC701N.cbp @@ -176,6 +176,7 @@ + @@ -778,6 +779,10 @@ + + + diff --git a/Makefile b/Makefile index 88b7db4..87fb460 100644 --- a/Makefile +++ b/Makefile @@ -250,6 +250,7 @@ INCLUDES := \ -Iapps/usr_le_code/thirdpart/mjson \ -Iapps/usr_jb_proto/Protocol \ -Iapps/usr_jb_proto/Utils \ + -Iapps/usr_periph \ -I$(SYS_INC_DIR) \ @@ -619,6 +620,7 @@ c_SRC_FILES := \ apps/usr_jb_proto/Utils/jb_common.c \ apps/usr_jb_proto/Utils/jb_ringbuffer.c \ apps/usr_jb_proto/usr_jb_main.c \ + apps/usr_periph/usr_rtc.c \ # usr_le_code 静态库(协议编解码 + 广播/收发) diff --git a/apps/common/device/key/iokey.c b/apps/common/device/key/iokey.c index 03ee5e0..95d6b13 100644 --- a/apps/common/device/key/iokey.c +++ b/apps/common/device/key/iokey.c @@ -157,7 +157,77 @@ __attribute__((weak)) u8 iokey_filter_hook(u8 io_state) { return 0; } -u8 usr_first_power=0; + +/* 开机锁键剩余确认次数;非 0 时扫描一律返回 NO_KEY */ +static u8 s_boot_lock_cnt; + +/** + * @brief 启动/关闭开机锁键 + * @param release_cnt >0:松开后连续确认次数;0:关闭 + */ +void iokey_boot_lock_start(u8 release_cnt) +{ +#if TCFG_IOKEY_BOOT_LOCK_ENABLE + s_boot_lock_cnt = release_cnt; +#else + (void)release_cnt; + s_boot_lock_cnt = 0; +#endif +} + +/** + * @brief 立即关闭开机锁键 + */ +void iokey_boot_lock_stop(void) +{ + s_boot_lock_cnt = 0; +} + +/** + * @brief 扫描路径更新锁键:监视 port[0],松开则递减计数 + * @return 1=仍锁定(应返回 NO_KEY),0=已解锁可正常扫描 + */ +static u8 iokey_boot_lock_update(void) +{ +#if !TCFG_IOKEY_BOOT_LOCK_ENABLE + return 0; +#else + u8 key_io; + u8 io_level; + u8 released; + + if (!s_boot_lock_cnt) + { + return 0; + } + if (!__this || (__this->num == 0)) + { + return 1; + } + + key_io = __this->port[0].key_type.one_io.port; + io_level = gpio_read(key_io); + if (__this->port[0].connect_way == ONE_PORT_TO_LOW) + { + released = io_level; /* 上拉输入,松开为高 */ + } + else + { + released = !io_level; /* 下拉输入,松开为低 */ + } + + if (released) + { + s_boot_lock_cnt--; + if (s_boot_lock_cnt == 0) + { + puts("iokey boot lock released\n"); + } + } + return 1; /* 本拍仍屏蔽;计数到 0 后下一拍才开放 */ +#endif +} + u8 io_get_key_value(void) { int i; @@ -173,12 +243,7 @@ u8 io_get_key_value(void) if (!__this->enable) { return NO_KEY; } - if(usr_first_power) - { - if(gpio_read(IO_PORTB_01)) - { - usr_first_power--; - } + if (iokey_boot_lock_update()) { return NO_KEY; } //先扫描单IO接按键方式 @@ -266,7 +331,7 @@ _iokey_get_value_end: int iokey_init(const struct iokey_platform_data *iokey_data) { int i; - usr_first_power=10; + __this = iokey_data; if (__this == NULL) { return -EINVAL; @@ -275,6 +340,12 @@ int iokey_init(const struct iokey_platform_data *iokey_data) return KEY_NOT_SUPPORT; } + /* 长按开机场景:等电源键(port[0])松开后再开放按键扫描 */ +#if TCFG_IOKEY_BOOT_LOCK_ENABLE + iokey_boot_lock_start(IOKEY_BOOT_LOCK_DEFAULT_CNT); +#else + iokey_boot_lock_stop(); +#endif key_io_reset(); return 0; diff --git a/apps/common/third_party_profile/jieli/JL_rcsp/bt_trans_data/le_rcsp_adv_module.c b/apps/common/third_party_profile/jieli/JL_rcsp/bt_trans_data/le_rcsp_adv_module.c index 5354771..0edd9c6 100644 --- a/apps/common/third_party_profile/jieli/JL_rcsp/bt_trans_data/le_rcsp_adv_module.c +++ b/apps/common/third_party_profile/jieli/JL_rcsp/bt_trans_data/le_rcsp_adv_module.c @@ -57,6 +57,7 @@ #include "chgbox_box.h" #endif +/* usr_le_code 库钩子:由静态库导出,供 RCSP BLE 栈回调,非应用层公开 API */ extern void usr_le_data_recieve(u8* data,u16 len); extern void usr_ble_adv_init(); #if 1 @@ -526,19 +527,15 @@ static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_h void usr_ble_send_data(u8* data,u16 len) { + /* CCC 未写时 ATT 发数会失败(常见 app_send_fail:-93),等主机使能通知再发 */ + if (get_ble_work_state() != BLE_ST_NOTIFY_IDICATE) { + log_info("ble send skip, wait CCC"); + return; + } if (app_send_user_data_check(len)) { app_send_user_data(ATT_CHARACTERISTIC_15f1e601_a277_43fc_a484_dd39ef8a9100_01_VALUE_HANDLE, data, len, ATT_OP_AUTO_READ_CCC); } - //printf("send rsp:"); - // printf_buf(data,len); - printf("\n"); - for(u8 i=0;ibytes_data = (pkt->device_bytes_len > 0) ? p : NULL; - - printf("cmd = %d", pkt->cmd); - printf("reserved = %d", pkt->reserved); - printf("gateway_int_cnt = %d", pkt->gateway_int_cnt); - printf("device_int_len = %d", pkt->device_int_len); - printf("device_str_len = %d", pkt->device_str_len); - printf("device_bytes_len = %d", pkt->device_bytes_len); + // printf("cmd = %d", pkt->cmd); + // printf("reserved = %d", pkt->reserved); + // printf("gateway_int_cnt = %d", pkt->gateway_int_cnt); + // printf("device_int_len = %d", pkt->device_int_len); + // printf("device_str_len = %d", pkt->device_str_len); + // printf("device_bytes_len = %d", pkt->device_bytes_len); - /* int_data 指向 buf 内部,地址未必 4 字节对齐, - * 不能直接解引用 int32_t*(对齐访问会触发硬件异常); - * 必须按字节读取,用 get_be32 还原数值 */ - if (pkt->int_data && pkt->device_int_len >= 4) { - const uint8_t *ip = (const uint8_t *)pkt->int_data; - printf("int_data = "); - for (uint16_t i = 0; i < pkt->device_int_len / 4u; i++) { - printf("%08X ", (unsigned int)get_be32(ip + (uint32_t)i * 4u)); - } - printf("\n"); - } - /* str_data / bytes_data 不保证有 '\0',用 printf_buf 打印 hex */ - if (pkt->str_data && pkt->device_str_len > 0) { - printf("str_data = "); - for (size_t i = 0; i < pkt->device_str_len; i++) { - printf("%02X ", *(pkt->str_data + i)); - } - printf("\n"); - } - if (pkt->bytes_data && pkt->device_bytes_len > 0) { - printf("bytes_data = "); - for (size_t i = 0; i < pkt->device_bytes_len; i++) { - printf("%02X ", *(pkt->bytes_data + i)); - } - printf("\n"); - } - printf("crc = %04X", crc_recv); - printf("\n"); + // /* int_data 指向 buf 内部,地址未必 4 字节对齐, + // * 不能直接解引用 int32_t*(对齐访问会触发硬件异常); + // * 必须按字节读取,用 get_be32 还原数值 */ + // if (pkt->int_data && pkt->device_int_len >= 4) { + // const uint8_t *ip = (const uint8_t *)pkt->int_data; + // printf("int_data = "); + // for (uint16_t i = 0; i < pkt->device_int_len / 4u; i++) { + // printf("%08X ", (unsigned int)get_be32(ip + (uint32_t)i * 4u)); + // } + // printf("\n"); + // } + // /* str_data / bytes_data 不保证有 '\0',用 printf_buf 打印 hex */ + // if (pkt->str_data && pkt->device_str_len > 0) { + // printf("str_data = "); + // for (size_t i = 0; i < pkt->device_str_len; i++) { + // printf("%02X ", *(pkt->str_data + i)); + // } + // printf("\n"); + // } + // if (pkt->bytes_data && pkt->device_bytes_len > 0) { + // printf("bytes_data = "); + // for (size_t i = 0; i < pkt->device_bytes_len; i++) { + // printf("%02X ", *(pkt->bytes_data + i)); + // } + // printf("\n"); + // } + // printf("crc = %04X", crc_recv); + // printf("\n"); return BLE_PROTO_OK; } diff --git a/apps/usr_le_code/bleproto.c b/apps/usr_le_code/bleproto.c index b53474d..89992ad 100644 --- a/apps/usr_le_code/bleproto.c +++ b/apps/usr_le_code/bleproto.c @@ -222,106 +222,113 @@ int bleproto_appdata_encode(uint8_t *txbuf, int rc; uint16_t txbuf_size = size; - bleproto_appdata_t appdata; + /* + * appdata.data[] 在 SMALL 模式下约 2.3KB,供 JSON/OTA 编码中间缓冲。 + * JB 55AA 透传可走 bleproto_appdata_wrap_raw,不必经本函数。 + * 此处用 static,避免在调用方任务栈上临时分配。 + */ + static bleproto_appdata_t s_enc_appdata; + bleproto_appdata_t *appdata = &s_enc_appdata; + /* header */ { - appdata.header = desc->header; + appdata->header = desc->header; } /* data */ - if (appdata.header.msgtype == BLEPROTO_APPDATA_MSGTYPE_REQ) + if (appdata->header.msgtype == BLEPROTO_APPDATA_MSGTYPE_REQ) { - switch (appdata.header.serviceid) + switch (appdata->header.serviceid) { case E_BLEPROTO_SERVICE_ID_DEVICEINFO: rc = bleproto_encjson_deviceinfo_req(&desc->datast.deviceinfo_req, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_AUTHSETUP: rc = bleproto_encjson_authsetup_req(&desc->datast.authsetup_req, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_AUTHDELETE: rc = bleproto_encjson_authdelete_req(&desc->datast.authdelete_req, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_RUNCMD: rc = bleproto_encjson_runcmd_req(&desc->datast.runcmd_req, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_REPORTCMD: rc = bleproto_encjson_reportcmd_req(&desc->datast.reportcmd_req, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_DOACTION: rc = bleproto_encjson_doaction_req(&desc->datast.doaction_req, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_OTANOTIFY: rc = bleproto_encjson_otanotify_req(&desc->datast.otanotify_req, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_OTADATA: rc = bleproto_encjson_otadata_req(&desc->datast.otadata_req, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_RUNCMD_V2: - rc = ble_proto_pack(&desc->datast.runcmd_v2_req, appdata.data, sizeof(appdata.data)); + rc = ble_proto_pack(&desc->datast.runcmd_v2_req, appdata->data, sizeof(appdata->data)); break; case E_BLEPROTO_SERVICE_ID_REPORTCMD_V2: - rc = ble_proto_pack(&desc->datast.reportcmd_v2_req, appdata.data, sizeof(appdata.data)); + rc = ble_proto_pack(&desc->datast.reportcmd_v2_req, appdata->data, sizeof(appdata->data)); break; case E_BLEPROTO_SERVICE_ID_OTADATA_V2: - rc = ble_proto_pack(&desc->datast.otadata_v2_req, appdata.data, sizeof(appdata.data)); + rc = ble_proto_pack(&desc->datast.otadata_v2_req, appdata->data, sizeof(appdata->data)); break; default: /* unkown serviceid */ return (-1); } } - else if (appdata.header.msgtype == BLEPROTO_APPDATA_MSGTYPE_RSP) + else if (appdata->header.msgtype == BLEPROTO_APPDATA_MSGTYPE_RSP) { - switch (appdata.header.serviceid) + switch (appdata->header.serviceid) { case E_BLEPROTO_SERVICE_ID_DEVICEINFO: rc = bleproto_encjson_deviceinfo_rsp(&desc->datast.deviceinfo_rsp, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_AUTHSETUP: rc = bleproto_encjson_authsetup_rsp(&desc->datast.authsetup_rsp, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_AUTHDELETE: rc = bleproto_encjson_authdelete_rsp(&desc->datast.authdelete_rsp, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_RUNCMD: rc = bleproto_encjson_runcmd_rsp(&desc->datast.runcmd_rsp, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_REPORTCMD: rc = bleproto_encjson_reportcmd_rsp(&desc->datast.reportcmd_rsp, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_DOACTION: rc = bleproto_encjson_doaction_rsp(&desc->datast.doaction_rsp, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_OTANOTIFY: rc = bleproto_encjson_otanotify_rsp(&desc->datast.otanotify_rsp, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_OTADATA: rc = bleproto_encbin_otadata_rsp(&desc->datast.otadata_rsp, - appdata.data); + appdata->data); break; case E_BLEPROTO_SERVICE_ID_RUNCMD_V2: - rc = ble_proto_pack(&desc->datast.runcmd_v2_rsp, appdata.data, sizeof(appdata.data)); + rc = ble_proto_pack(&desc->datast.runcmd_v2_rsp, appdata->data, sizeof(appdata->data)); break; case E_BLEPROTO_SERVICE_ID_REPORTCMD_V2: - rc = ble_proto_pack(&desc->datast.reportcmd_v2_rsp, appdata.data, sizeof(appdata.data)); + rc = ble_proto_pack(&desc->datast.reportcmd_v2_rsp, appdata->data, sizeof(appdata->data)); break; case E_BLEPROTO_SERVICE_ID_OTADATA_V2: - rc = ble_proto_pack(&desc->datast.otadata_v2_rsp, appdata.data, sizeof(appdata.data)); + rc = ble_proto_pack(&desc->datast.otadata_v2_rsp, appdata->data, sizeof(appdata->data)); break; default: /* unkown serviceid */ @@ -340,10 +347,10 @@ int bleproto_appdata_encode(uint8_t *txbuf, } /* datalen */ - appdata.header.datalen = (uint16_t)rc; + appdata->header.datalen = (uint16_t)rc; /* appdata_serialize */ - return bleproto_appdata_serialize(&appdata, packetlen, txbuf, txbuf_size); + return bleproto_appdata_serialize(appdata, packetlen, txbuf, txbuf_size); } int bleproto_appdata_decode(uint8_t *rxbuf, diff --git a/apps/usr_le_code/bleproto_packer.c b/apps/usr_le_code/bleproto_packer.c index c82c16b..b1c6159 100644 --- a/apps/usr_le_code/bleproto_packer.c +++ b/apps/usr_le_code/bleproto_packer.c @@ -671,6 +671,55 @@ int bleproto_appdata_serialize(bleproto_appdata_t *appdata, return (offset); } +int bleproto_appdata_wrap_raw(uint8_t *txbuf, + uint16_t txbuf_size, + const bleproto_appdata_header_t *header, + const uint8_t *payload, + uint16_t payload_len) +{ + uint16_t total; + + if (!txbuf || !header) { + BLEPROTO_T_E("Invalid parameters"); + return -1; + } + if (payload_len > 0 && !payload) { + BLEPROTO_T_E("Invalid payload"); + return -1; + } + /* 单帧 this_frame_len 为 uint8,超过 255 需走分包 serialize */ + if (payload_len > 255u) { + BLEPROTO_T_E("payload too long for single frame"); + return -1; + } + + total = (uint16_t)(BLEPROTO_APPDATA_HEADR_LEN + payload_len); + if (txbuf_size < total) { + BLEPROTO_T_E("txbuf too short"); + return -1; + } + + /* buf[0]: version[2:0] | datafmt[3:3] | msgtype[7:4] */ + txbuf[0] = UTILS_BITFIELD_SET(header->version, 2, 0) | + UTILS_BITFIELD_SET(header->datafmt, 3, 3) | + UTILS_BITFIELD_SET(header->msgtype, 7, 4); + /* buf[1]: msgid[3:0] | encrypt[4:4] | reserve[7:5] */ + txbuf[1] = UTILS_BITFIELD_SET(header->msgid, 3, 0) | + UTILS_BITFIELD_SET(header->encrypt, 4, 4) | + UTILS_BITFIELD_SET(header->reserve, 7, 5); + txbuf[2] = 1; /* totalframe */ + txbuf[3] = 0; /* frameseq:单帧为 0 */ + txbuf[4] = (uint8_t)payload_len; /* this frame payload len */ + txbuf[5] = header->serviceid; + proto_bytes_put_le16(&txbuf[6], payload_len); + + if (payload_len > 0) { + memcpy(&txbuf[BLEPROTO_APPDATA_HEADR_LEN], payload, payload_len); + } + + return (int)total; +} + int bleproto_appdata_deserialize(uint8_t * buf, uint16_t len, bleproto_appdata_t *appdata) @@ -1958,8 +2007,12 @@ int bleproto_encbin_otadata_rsp(const bleproto_otadata_rsp_t *p, data[offset++] = (uint8_t)((p->len >> 16) & 0xFF); data[offset++] = (uint8_t)((p->len >> 24) & 0xFF); - /* serialize data */ + /* serialize data(data 为外部指针,不再内嵌数组) */ if (p->len > 0 && p->len <= BLEPROTO_APPDATA_OTADATA_SZ) { + if (!p->data) { + BLEPROTO_T_E("otadata_rsp.data is NULL"); + return -1; + } memcpy(&data[offset], p->data, p->len); offset += p->len; } @@ -2984,10 +3037,12 @@ int bleproto_debin_otadata_rsp(const uint8_t * data, return -1; } - /* deserialize data */ + /* 零拷贝:指向输入缓冲,调用方须在下次 decode 前用完 */ if (rsp->len > 0) { - memcpy(rsp->data, &data[offset], rsp->len); + rsp->data = &data[offset]; offset += rsp->len; + } else { + rsp->data = NULL; } return offset; diff --git a/apps/usr_le_code/bleproto_packer.h b/apps/usr_le_code/bleproto_packer.h index 9b5661f..8ec82c1 100644 --- a/apps/usr_le_code/bleproto_packer.h +++ b/apps/usr_le_code/bleproto_packer.h @@ -483,7 +483,12 @@ typedef struct bleproto_otadata_rsp { int id; ///< file_id int32_t offset; ///< 当前读取到的数据偏移 uint32_t len; ///< 当次读取数据的大小 - uint8_t data[BLEPROTO_APPDATA_OTADATA_SZ]; ///< 读取的数据 + /** + * 固件数据指针(不内嵌大数组,避免 bleproto_appdata_desc_t 膨胀到 2KB+) + * - decode:指向 appdata 内部缓冲(零拷贝),下次 decode 前有效 + * - encode:由调用方提供可读缓冲 + */ + const uint8_t *data; } bleproto_otadata_rsp_t; /****************************************************************************/ /* Public Data */ @@ -580,6 +585,22 @@ int bleproto_appdata_serialize(bleproto_appdata_t *appdata, uint8_t * buf, uint16_t size); +/** + * @brief 将已打包好的 payload 包装成单帧 appdata(不分包) + * @param txbuf 输出缓冲 + * @param txbuf_size 输出缓冲大小 + * @param header 应用层头(datalen/totalframe/frameseq 由本函数填写) + * @param payload 已序列化的 service 数据;可为 NULL(payload_len==0) + * @param payload_len payload 长度,须 <=255(单帧 pthis_frame_len 为 u8) + * @return >0 总字节数;<0 失败 + * @note 小包场景(JB 55AA 透传等)用此接口,避免 bleproto_appdata_t 大缓冲 + */ +int bleproto_appdata_wrap_raw(uint8_t *txbuf, + uint16_t txbuf_size, + const bleproto_appdata_header_t *header, + const uint8_t *payload, + uint16_t payload_len); + /** * @brief 反序列化应用数据 * diff --git a/apps/usr_le_code/lib/libusr_le_code.a b/apps/usr_le_code/lib/libusr_le_code.a index 550990761c5aea09c09921dd9bffaf15c826d4a6..f33797959f0a70c829a8ef4f73d50dff839087f6 100644 GIT binary patch delta 134782 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 TUtVhnJS~gmFaN<{^y2q#-J-X= delta 139996 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

    l7=(O& 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 Ixkb+VUna^3)&Kwi diff --git a/apps/usr_le_code/usr_le_adv.c b/apps/usr_le_code/usr_le_adv.c index befd16e..9faa88c 100644 --- a/apps/usr_le_code/usr_le_adv.c +++ b/apps/usr_le_code/usr_le_adv.c @@ -1,102 +1,163 @@ +/****************************************************************************** + * @file usr_le_adv.c + * @brief BLE 广播 / 配对 / OTA 广播切换 + * @author cyWu <1917507415@qq.com> + * @date 2026.08.19 + * @version V1.1.0 + * @history + * - V1.0.0, 2026.08.03, cyWu, 首次发布 + * - V1.1.0, 2026.08.19, cyWu, 对齐模组注释与助手;保留 SOC 上电绑广播策略 + ******************************************************************************/ + #include "system/includes.h" #include "app_config.h" -#include "asm/pwm_led.h" -#include "tone_player.h" -#include "ui_manage.h" #include "app_main.h" -#include "app_task.h" -#include "asm/charge.h" -#include "app_power_manage.h" -#include "app_charge.h" -#include "user_cfg.h" - -#include "audio.h" #include "vm.h" #include "bleproto.h" #include "bleproto_api.h" #include "usr_le_product.h" -#define LOG_TAG_CONST APP -#define LOG_TAG "[APP]" + +#define LOG_TAG_CONST APP +#define LOG_TAG "[LE_ADV]" #define LOG_ERROR_ENABLE #define LOG_DEBUG_ENABLE #define LOG_INFO_ENABLE -/* #define LOG_DUMP_ENABLE */ -#define LOG_CLI_ENABLE #include "debug.h" -extern u8 muti_adv_data[31];//={0}; +/****************************************************************************** + * 广播相关三个标志(务必区分): + * + * 1) usr_auth_data.paired_flag —— 配网结果(存 VM,掉电保持) + * - 0:未配网 + * - 1:已配网(三元组已保存) + * + * 2) usr_var.usr_goto_pair —— 是否主动进入配网流程(RAM,掉电丢失) + * - 0:非配网流程 + * - 1:app_main 上电 / usr_goto_pair_mode() 触发,发【绑定广播】 + * + * 3) usr_var.usr_adv_flag —— 广播内容是否需要刷新到协议栈(一次性) + * - 1:usr_ble_adv_updata() 会重新 set adv data 并 enable + * - 0:本周期不刷新 + * + * SOC 决策表(与模组不同:未配网也发绑定广播,便于上电配网): + * usr_goto_pair==1 → 绑定广播 + * paired_flag==0 → 绑定广播 + * paired_flag==1 → 回连广播 + ******************************************************************************/ + +extern u8 muti_adv_data[31]; extern u8 muti_adv_data_len; /* 定义在 usr_le_recieve.c,库内共用,不对外导出 */ extern bleproto_authsetup_req_t usr_auth_data; -extern u8 usr_get_full(); -extern u16 usr_get_conn_service(); -extern int muti_make_set_adv_data(u8* data,u8 data_len); -extern u8 usr_get_ldoin_all(); +extern u16 usr_get_conn_service(void); +extern int muti_make_set_adv_data(u8 *data, u8 data_len); +extern int muti_make_set_adv_data_updata(void); +extern void usr_set_adv_interval(u16 val); +extern u16 usr_get_adv_interval(void); +extern void ble_multi_trans_disconnect(void); +extern void ble_trans_module_enable(u8 flag); +extern void usr_timer_loop(void); +extern u8 usr_get_ota_status(void); +extern void usr_ota_exit(void); -void usr_ble_adv_updata(); +void usr_ble_adv_init(void); +void usr_ble_adv_updata(void); -static int le_timer_handle=0; -static int le_timer_handle2=0; +static int le_timer_handle = 0; - -extern u8 get_ldo5v_online_hw(void); -extern u8 usr_get_work_status(); -extern void usr_printf_sta(); -extern int muti_make_set_adv_data_updata(); - -void usr_get_pair_info() +/** + * @brief BLE 是否已连接 + * @return 1=已连接,0=未连接 + */ +uint8_t usr_ble_is_connected(void) { - int ret = 0xffff; + return (usr_get_conn_service() != 0) ? 1u : 0u; +} + +/** + * @brief 从 VM 读取配对信息到 usr_auth_data + * @note 失败则清零,并将 paired_flag 置 0 写回 + */ +void usr_get_pair_info(void) +{ + int ret; + ret = syscfg_read(CFG_USER_PAIR_INFO, (u8 *)&usr_auth_data, sizeof(usr_auth_data)); - if(ret<=0) + if (ret <= 0) { - memset(&usr_auth_data,0x00,sizeof(usr_auth_data)); - usr_auth_data.paired_flag=0; + memset(&usr_auth_data, 0x00, sizeof(usr_auth_data)); + usr_auth_data.paired_flag = 0; syscfg_write(CFG_USER_PAIR_INFO, (u8 *)&usr_auth_data, sizeof(usr_auth_data)); } } -void usr_write_pair_info() + +/** + * @brief 标记已配网并保存三元组到 VM + * @note AUTHSETUP 成功后调用,paired_flag = 1 + */ +void usr_write_pair_info(void) { - usr_auth_data.paired_flag=1; + usr_auth_data.paired_flag = 1; syscfg_write(CFG_USER_PAIR_INFO, (u8 *)&usr_auth_data, sizeof(usr_auth_data)); } -void usr_clear_pair_info() +/** + * @brief 清除配对信息并延时复位 + */ +void usr_clear_pair_info(void) { - printf("usr_clear_pair_info\n"); - memset(&usr_auth_data,0x00,sizeof(usr_auth_data)); - usr_auth_data.paired_flag=0; + printf("usr_clear_pair_info_reset\n"); + memset(&usr_auth_data, 0x00, sizeof(usr_auth_data)); + usr_auth_data.paired_flag = 0; syscfg_write(CFG_USER_PAIR_INFO, (u8 *)&usr_auth_data, sizeof(usr_auth_data)); - sys_timeout_add(NULL,cpu_reset,600); + sys_timeout_add(NULL, cpu_reset, 600); } -void usr_clear_pair_info_noreset() + +/** + * @brief 清除配对信息但不复位(用于重新配网) + */ +void usr_clear_pair_info_noreset(void) { - printf("usr_clear_pair_info2\n"); - memset(&usr_auth_data,0x00,sizeof(usr_auth_data)); - usr_auth_data.paired_flag=0; + printf("usr_clear_pair_info_noreset\n"); + memset(&usr_auth_data, 0x00, sizeof(usr_auth_data)); + usr_auth_data.paired_flag = 0; syscfg_write(CFG_USER_PAIR_INFO, (u8 *)&usr_auth_data, sizeof(usr_auth_data)); } -extern void usr_set_adv_interval(u16 val); -extern u16 usr_get_adv_interval(); -extern void ble_multi_trans_disconnect(void); -void usr_ble_adv_init(); -void usr_goto_pair_mode() +/** + * @brief 进入配网模式:清配对 + 置 usr_goto_pair + 发绑定广播 + */ +void usr_goto_pair_mode(void) { ble_multi_trans_disconnect(); usr_clear_pair_info_noreset(); - usr_var.usr_goto_pair=1; + usr_var.usr_goto_pair = 1; os_time_dly(5); usr_ble_adv_init(); } - -void usr_ble_adv_init() +/** + * @brief 断开 BLE 并停止广播(复位/重启前) + */ +void usr_ble_disconnect_and_stop_adv(void) { - int8_t txpower = 0; - uint8_t manucode[BLEPROTO_ADV_TLV_LENGTH_MANUCODE] = { 0 }; + printf("usr_ble_disconnect_and_stop_adv\n"); + ble_multi_trans_disconnect(); + usr_var.usr_goto_pair = 0; + usr_var.usr_adv_flag = 0; + ble_trans_module_enable(0); +} + +/** + * @brief 按当前标志刷新广播策略并启动周期更新 + * @note 见文件头「三个标志」;SOC 未配网也发绑定广播 + */ +void usr_ble_adv_init(void) +{ + int8_t txpower = 0; + uint8_t manucode[BLEPROTO_ADV_TLV_LENGTH_MANUCODE] = {0}; uint8_t prodcode[BLEPROTO_ADV_TLV_LENGTH_PRODCODE]; uint8_t gmac[6] = {0}; uint8_t pcode[BLE_PROTO_ADV_LENGTH_PCODE]; @@ -106,106 +167,111 @@ void usr_ble_adv_init() memcpy(pcode, g_usr_le_pcode, BLE_PROTO_ADV_LENGTH_PCODE); usr_set_adv_interval(80); - if(usr_var.usr_ota_succ_flag)return; - //muti_adv_data - if(usr_var.usr_goto_pair) + if (usr_var.usr_ota_succ_flag) + { + return; + } + + if (usr_var.usr_goto_pair) { /* app_main 上电已置 usr_goto_pair=1 并清配对信息,此处发绑定广播供网关配网 */ usr_clear_pair_info_noreset(); - printf("power on force to par flag= %d\n",usr_auth_data.paired_flag); - { - muti_adv_data_len=bleproto_advdata_encode4bind(muti_adv_data,txpower,manucode,pcode,prodcode); - } - usr_var.usr_adv_flag=1; + printf("goto pair bind adv, paired_flag=%d\n", usr_auth_data.paired_flag); + muti_adv_data_len = bleproto_advdata_encode4bind(muti_adv_data, txpower, + manucode, pcode, prodcode); + usr_var.usr_adv_flag = 1; } else { usr_get_pair_info(); - if(usr_auth_data.paired_flag==0) + if (usr_auth_data.paired_flag == 0) { - muti_adv_data_len=bleproto_advdata_encode4bind(muti_adv_data,txpower,manucode,pcode,prodcode); - usr_var.usr_adv_flag=0; + /* SOC:未配网也发绑定广播(模组此处为不广播) */ + muti_adv_data_len = bleproto_advdata_encode4bind(muti_adv_data, txpower, + manucode, pcode, prodcode); + usr_var.usr_adv_flag = 0; } else { - memcpy(gmac,usr_auth_data.gwmac,6); - muti_adv_data_len=bleproto_advdata_encode4reconn(muti_adv_data,txpower,gmac,manucode,pcode,prodcode); - usr_var.usr_adv_flag=1; + memcpy(gmac, usr_auth_data.gwmac, 6); + muti_adv_data_len = bleproto_advdata_encode4reconn(muti_adv_data, txpower, gmac, + manucode, pcode, prodcode); + usr_var.usr_adv_flag = 1; } } usr_ble_adv_updata(); - if(le_timer_handle==0)le_timer_handle = sys_timer_add(NULL, usr_ble_adv_updata, 500); + if (le_timer_handle == 0) + { + le_timer_handle = sys_timer_add(NULL, usr_ble_adv_updata, 500); + } } -u8 usr_get_pair_flag() +/** + * @brief 获取是否已配网 + * @return 1=已配网,0=未配网 + */ +u8 usr_get_pair_flag(void) { return usr_auth_data.paired_flag; } -/* -void usr_reconn_adv() + +/** + * @brief 周期处理广播刷新(由 500ms 定时器调用) + * @note 仅当 usr_adv_flag==1 时:停广播 → 写入 muti_adv_data → 再开广播 + */ +void usr_ble_adv_updata(void) { - int8_t txpower = 0; - uint8_t gmac[6]={0}; - uint8_t manucode[BLEPROTO_ADV_TLV_LENGTH_MANUCODE] = { 0 }; - uint8_t prodcode[BLEPROTO_ADV_TLV_LENGTH_PRODCODE] = {'C', 'B', 'F', 'D'}; - uint8_t pcode[6]={'P','C','B','F','D','0'}; - memcpy(gmac,usr_auth_data.gwmac,6); - muti_adv_data_len=bleproto_advdata_encode4reconn(muti_adv_data,txpower,gmac,manucode,pcode,prodcode); - usr_adv_flag=1; -}*/ -extern void ble_trans_module_enable(u8 flag); -extern void usr_timer_loop(); -extern u8 usr_get_ota_status(); -void usr_ble_adv_updata() -{ - //printf("usr_ble_adv_updata\n"); - static u16 usr_goto_slow_adv=0; - if(usr_var.usr_adv_flag) + static u16 usr_goto_slow_adv = 0; + + if (usr_var.usr_adv_flag) { ble_trans_module_enable(0); - usr_var.usr_adv_flag=0; - muti_make_set_adv_data(muti_adv_data,muti_adv_data_len); + usr_var.usr_adv_flag = 0; + muti_make_set_adv_data(muti_adv_data, muti_adv_data_len); printf("###muti_adv_data = "); - printf_buf(muti_adv_data,muti_adv_data_len); + printf_buf(muti_adv_data, muti_adv_data_len); ble_trans_module_enable(1); } - if(usr_get_conn_service()==0) + if (!usr_ble_is_connected()) { - if(usr_get_adv_interval()==80) + /* 未连接:回连快广播(80)持续约 60s(500ms×120)后切慢广播 */ + 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) { - if(usr_var.usr_ota_succ_flag==0) + if (usr_var.usr_ota_succ_flag == 0) { usr_goto_slow_adv++; - printf("usr_goto_slow_adv = %d\n",usr_goto_slow_adv); + printf("usr_goto_slow_adv = %d\n", usr_goto_slow_adv); } - if(usr_goto_slow_adv>=120) + if (usr_goto_slow_adv >= 120) { - usr_goto_slow_adv=0; - usr_set_adv_interval(80*10); - usr_var.usr_adv_flag=1; + usr_goto_slow_adv = 0; + usr_set_adv_interval(80 * 10); + usr_var.usr_adv_flag = 1; } } } else { - usr_goto_slow_adv=0; + usr_goto_slow_adv = 0; } } else { - usr_goto_slow_adv=0; + usr_goto_slow_adv = 0; } - - if(usr_get_ota_status()==0) + if (usr_get_ota_status() == 0) { - if(usr_get_conn_service()==0) + if (!usr_ble_is_connected()) { - if(usr_var.usr_ota_succ_flag==0)usr_ota_exit(); + if (usr_var.usr_ota_succ_flag == 0) + { + usr_ota_exit(); + } } } @@ -213,36 +279,36 @@ void usr_ble_adv_updata() usr_timer_loop(); } -void usr_soft_off() +void usr_soft_off(void) { sys_enter_soft_poweroff(NULL); } -void usr_ble_adv_updata_OTA() +void usr_ble_adv_updata_OTA(void) { - //printf("usr_ble_adv_updata\n"); ble_trans_module_enable(0); - usr_var.usr_adv_flag=0; + usr_var.usr_adv_flag = 0; extern u8 usr_mac_addr[6]; extern int le_controller_set_mac(void *addr); - usr_mac_addr[0]=usr_mac_addr[0]+1; - le_controller_set_mac(usr_mac_addr); //修改BLE地址 + usr_mac_addr[0] = usr_mac_addr[0] + 1; + le_controller_set_mac(usr_mac_addr); muti_make_set_adv_data_updata(); printf("###muti_adv_data = "); - printf_buf(muti_adv_data,muti_adv_data_len); + printf_buf(muti_adv_data, muti_adv_data_len); ble_trans_module_enable(1); } -void usr_ota_process() +void usr_ota_process(void) { static u8 cnt = 0; + if (cnt == 0) { ble_multi_trans_disconnect(); } - if (usr_get_conn_service() == 0) + if (!usr_ble_is_connected()) { cnt++; if (cnt == 2) @@ -261,7 +327,10 @@ void usr_ota_process() } } -void usr_app_ota_init() +/** + * @brief 旧版 RCSP/JSON OTA 入口;产品 JB 0x30/0x32 路径不要调用 + */ +void usr_app_ota_init(void) { usr_var.usr_goto_updata = 1; if (usr_var.ota_timer == 0) diff --git a/apps/usr_le_code/usr_le_api.h b/apps/usr_le_code/usr_le_api.h index 5e5b20f..4ccb3ba 100644 --- a/apps/usr_le_code/usr_le_api.h +++ b/apps/usr_le_code/usr_le_api.h @@ -1,11 +1,15 @@ /****************************************************************************** * @file usr_le_api.h - * @brief usr_le_code 静态库对外 API(广播 / 收发 / 配网) + * @brief usr_le_code 静态库对外应用 API(配网 / 配对 / OTA) * @author cyWu <1917507415@qq.com> * @date 2026.08.03 - * @version V1.0.0 + * @version V1.0.1 * @history * - V1.0.0, 2026.08.03, cyWu, 首次发布 + * - V1.0.1, 2026.08.19, cyWu, 收敛公开 API,移除 BLE 栈钩子声明 + * + * @note usr_ble_adv_init / usr_le_data_recieve 为 BLE/RCSP 协议栈链接钩子, + * 由库内部实现并导出符号,不作为应用层公开接口。 ******************************************************************************/ #ifndef __USR_LE_API_H__ @@ -17,20 +21,6 @@ extern "C" { #endif -/** - * @brief 初始化 BLE 广播数据(绑定广播或重连广播) - * @note 根据配对状态与 usr_goto_pair 选择 bind/reconn 广播,并启动 500ms 周期更新 - */ -void usr_ble_adv_init(void); - -/** - * @brief BLE 协议栈接收数据入口 - * @param data 接收缓冲区 - * @param len 本次接收长度 - * @note 组包后解析 bleproto,并分发 DEVICEINFO/AUTH/RUNCMD/OTA 等服务 - */ -void usr_le_data_recieve(uint8_t *data, uint16_t len); - /** * @brief 进入配对/配网模式 * @note 断开当前连接、清除配对信息(不复位),重新发绑定广播 diff --git a/apps/usr_le_code/usr_le_recieve.c b/apps/usr_le_code/usr_le_recieve.c index 5a28e16..9c6eaa1 100644 --- a/apps/usr_le_code/usr_le_recieve.c +++ b/apps/usr_le_code/usr_le_recieve.c @@ -1,181 +1,202 @@ +/****************************************************************************** + * @file usr_le_recieve.c + * @brief BLE 收包入口:bleproto 解析后分发配网 / 对时 / JB 协议 / 组应答 + * @author cyWu <1917507415@qq.com> + * @date 2026.08.19 + * @version V1.1.0 + * @history + * - V1.0.0, 2026.08.03, cyWu, 首次发布 + * - V1.1.0, 2026.08.19, cyWu, 对齐模组结构;废弃 JSON OTA;修 AUTHDELETE serviceid + ******************************************************************************/ + #include "system/includes.h" #include "app_config.h" -#include "asm/pwm_led.h" -#include "tone_player.h" -#include "ui_manage.h" #include "app_main.h" -#include "app_task.h" -#include "asm/charge.h" -#include "app_power_manage.h" -#include "app_charge.h" -#include "user_cfg.h" -#include "key_event_deal.h" -#include "audio.h" -#include "update.h" #include "vm.h" #include "bleproto.h" #include "bleproto_api.h" #include "ble_proto.h" +#include "usr_rtc.h" +#include "usr_le_api.h" +#include "jb_protocol.h" + #define LOG_TAG_CONST APP -#define LOG_TAG "[APP]" +#define LOG_TAG "[USR_LE]" #define LOG_ERROR_ENABLE #define LOG_DEBUG_ENABLE #define LOG_INFO_ENABLE -/* #define LOG_DUMP_ENABLE */ -#define LOG_CLI_ENABLE #include "debug.h" -#define FIRM_PACK_LEN 2048 // 128 +/* 拼 GATT 分包:业务包 ≈ bleproto头 + V2 开销 + JB 帧(<=128),1024 足够 */ +#define USR_LE_RX_BUF_LEN 1024 +#define USR_LE_V2_WRAP_OVERHEAD 32u /* V2 头开销,JB 帧最大 128 → 约 160 */ +#define USR_LE_V2_CMD_REPORT 100u /* REPORTCMD_V2 内层 cmd */ +#define USR_LE_V2_CMD_RUN 110u /* RUNCMD_V2 内层 cmd */ +#define USR_LE_JB_CMD_OFF 4u /* 55 AA | LEN_H LEN_L | CMD */ -static u8 start_data[10] = {0x55, 0xAA, 0xFE, 0x61, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}; -static u8 end_data[2] = {0xaa, 0x55}; -static int encode_len = 0x00; +static int encode_len = 0; static u8 txbuf[384] = {0}; -static u8 rxbuf[FIRM_PACK_LEN + 1024] = {0}; -static u8 ota_source_data[FIRM_PACK_LEN * 2] = {0}; - -extern u16 usr_get_conn_service(); -extern void ble_multi_trans_disconnect(void); -extern void usr_ble_send_data(u8 *data, u16 len); /// BLE发送接口,MTU 244 -extern void usr_write_pair_info(); -extern void usr_clear_pair_info(); -extern void app_audio_volume_set(u8 value); -extern int dual_ota_app_data_deal(u32 msg, u8 *buf, u32 len); -extern int uart_tr_send_data(u8 *data, u32 len); -extern void usr_intterupt_close(); -extern void usr_jb_le_recieve_data(u8 *data, u16 len); -extern int8_t jbReportAckCheck(u16 cmd, u8 gateway_int_cnt, int32_t gateway_int0); - -void usr_ota_deal_task(); -void usr_data_ana(bleproto_appdata_desc_t *desc); -void usr_run_cmd_code_v2(ble_proto_packet_t *runcmd_par, u8 usr_msg_id); +static u8 rxbuf[USR_LE_RX_BUF_LEN] = {0}; +static u8 s_last_runcmd_msgid = 0; /* RUNCMD_V2 应答须回填最近 msgid */ bleproto_authsetup_req_t usr_auth_data; -void usr_le_data_recieve(u8 *data, u16 len) /// BLE数据接收 -{ - // log_info("le recieve: %d",len); - // printf_buf(data, len); - static u16 usr_len = 0; - bleproto_appdata_desc_t desc; +extern void usr_ble_send_data(u8 *data, u16 len); +extern u8 usr_ble_is_notify_ready(void); +extern void usr_write_pair_info(void); +extern void usr_clear_pair_info(void); +extern void usr_jb_le_recieve_data(u8 *data, u16 len); +extern int8_t jbReportAckCheck(u16 cmd, u8 gateway_int_cnt, int32_t gateway_int0); +static void usr_data_ana(bleproto_appdata_desc_t *desc); +static void usr_run_cmd_code_v2(ble_proto_packet_t *runcmd_par, u8 usr_msg_id); + +/** + * @brief 填 bleproto 应答头 + * @param out 输出 desc + * @param in 请求 desc(取 msgid) + * @param serviceid 服务号 + */ +static void usr_le_fill_rsp_header(bleproto_appdata_desc_t *out, + const bleproto_appdata_desc_t *in, + uint8_t serviceid) +{ + out->header.version = 0; + out->header.datafmt = BLEPROTO_APPDATA_DATAFMT_JSON; + out->header.msgtype = BLEPROTO_APPDATA_MSGTYPE_RSP; + out->header.msgid = in->header.msgid; + out->header.encrypt = 0; + out->header.serviceid = serviceid; +} + +/** + * @brief 编码并经 BLE 发出 + * @param desc 已填好的应答 + */ +static void usr_le_encode_and_send(bleproto_appdata_desc_t *desc) +{ + encode_len = bleproto_appdata_encode(txbuf, sizeof(txbuf), sizeof(txbuf), desc); + if (encode_len > 0) + { + printf("encode_len = %d\n", encode_len); + usr_ble_send_data(txbuf, encode_len); + } + else + { + printf("encode_len fail %d\n", encode_len); + } +} + +/** + * @brief 是否走网关主动上报(REPORTCMD_V2) + * @param jb_cmd 55AA 命令字 + * @return 1=主动上报,0=RUNCMD 应答 + */ +static uint8_t usr_le_is_gateway_report_cmd(uint8_t jb_cmd) +{ + return (jb_cmd == CMD_REPORT || + jb_cmd == CMD_OTA_COMPLETE || + jb_cmd == CMD_OTA_STOP_MCU) + ? 1u + : 0u; +} + +/** + * @brief BLE 收包入口 + * @param data 收包数据 + * @param len 数据长度 + */ +void usr_le_data_recieve(u8 *data, u16 len) +{ + static u16 usr_len = 0; + /* desc 含 ycmd 等 union,放 static,避免每次收包在栈上开大块 */ + static bleproto_appdata_desc_t s_rx_desc; int rc_result = 0; + if (!data || len == 0) + { + return; + } + if ((u32)usr_len + len > sizeof(rxbuf)) + { + printf("### rxbuf overflow, usr_len=%u len=%u, reset\n", usr_len, len); + usr_len = 0; + return; + } + memcpy(&rxbuf[usr_len], data, len); usr_len += len; - rc_result = bleproto_appdata_decode(rxbuf, usr_len, &desc); - // printf("rc_result_le## = %d\n",rc_result); + rc_result = bleproto_appdata_decode(rxbuf, usr_len, &s_rx_desc); if (rc_result < 0) { - // 接收到了非法的数据包,无法解析 printf("### invild pack\n"); usr_len = 0; } else if (rc_result == 0) { - // 接收的数据不完整,继续接收数据 printf("### keep recieving\n"); } - else //(rc_result > 0) + else { - // 数据解析成功 printf("### pack recieved ok\n"); usr_len = 0; - usr_data_ana(&desc); + usr_data_ana(&s_rx_desc); } } -void usr_data_ana(bleproto_appdata_desc_t *desc) +/** + * @brief 解析 bleproto 服务并分发 + * @param desc 已 decode 的包 + */ +static void usr_data_ana(bleproto_appdata_desc_t *desc) { - bleproto_appdata_desc_t encode_desc = {0}; - printf("#############334 desc->header.serviceid = %d\n", desc->header.serviceid); - if (desc->header.msgtype /*desc.header.msgtype*/ == BLEPROTO_APPDATA_MSGTYPE_REQ) + static bleproto_appdata_desc_t s_encode_desc; + + memset(&s_encode_desc, 0, sizeof(s_encode_desc)); + printf("desc serviceid=%d msgtype=%d\n", + desc->header.serviceid, desc->header.msgtype); + + if (desc->header.msgtype == BLEPROTO_APPDATA_MSGTYPE_REQ) { switch (desc->header.serviceid) { + case E_BLEPROTO_SERVICE_ID_DEVICEINFO: { + bleproto_deviceinfo_req_t *req = &desc->datast.deviceinfo_req; + bleproto_deviceinfo_rsp_t *rsp = &s_encode_desc.datast.deviceinfo_rsp; - case E_BLEPROTO_SERVICE_ID_DEVICEINFO: + /* 网关从子设备连上开始计时,每 12 小时经 DEVICEINFO 同步一次 */ + usr_rtc_set_from_unix(req->t, (int32_t)req->gmtoff); - encode_desc.header.version = 0; - encode_desc.header.datafmt = BLEPROTO_APPDATA_DATAFMT_JSON; - encode_desc.header.msgtype = BLEPROTO_APPDATA_MSGTYPE_RSP; - encode_desc.header.msgid = desc->header.msgid; // 这里的msg_id为上面解析到的包的msg_id; - encode_desc.header.encrypt = 0; - encode_desc.header.serviceid = E_BLEPROTO_SERVICE_ID_DEVICEINFO; - - // deviceinfo rsp序列化 - bleproto_deviceinfo_rsp_t *rsp = &encode_desc.datast.deviceinfo_rsp; - { - // 填写设备相关信息 - rsp->hbcycle = 1000; - strcpy(rsp->swv, "V1.0.0.00"); - strcpy(rsp->hwv, "V1.0.0.00"); - rsp->longcon = 1; - rsp->prototype = 4; - } - encode_len = bleproto_appdata_encode(txbuf, sizeof(txbuf), sizeof(txbuf), &encode_desc); - if (encode_len > 0) - { - printf("encode_len = %d\n", encode_len); - // 调用蓝牙协议栈发送数据接口,将数据一包一包的发送出去 - // 第一包:packetlen - // 第二包:packetlen - // ...... - // 第N包: totallen - (packetlen * (N -1)) - usr_ble_send_data(txbuf, encode_len); - } - else - { - printf("2encode_len = %d\n", encode_len); - } - // printf("E_BLEPROTO_SERVICE_ID_DEVICEINFO\n"); + usr_le_fill_rsp_header(&s_encode_desc, desc, E_BLEPROTO_SERVICE_ID_DEVICEINFO); + rsp->hbcycle = 1000; + strcpy(rsp->swv, "V1.0.0.00"); + strcpy(rsp->hwv, "V1.0.0.00"); + rsp->longcon = 1; + rsp->prototype = 4; + usr_le_encode_and_send(&s_encode_desc); break; - case E_BLEPROTO_SERVICE_ID_AUTHSETUP: - // 设备处理,回复响应 + } + case E_BLEPROTO_SERVICE_ID_AUTHSETUP: { + bleproto_authsetup_rsp_t *au_rsp = &s_encode_desc.datast.authsetup_rsp; + printf("E_BLEPROTO_SERVICE_ID_AUTHSETUP\n"); - encode_desc.header.version = 0; - encode_desc.header.datafmt = BLEPROTO_APPDATA_DATAFMT_JSON; - encode_desc.header.msgtype = BLEPROTO_APPDATA_MSGTYPE_RSP; - encode_desc.header.msgid = desc->header.msgid; // 这里的msg_id为上面解析到的包的msg_id; - encode_desc.header.encrypt = 0; - encode_desc.header.serviceid = E_BLEPROTO_SERVICE_ID_AUTHSETUP; - - bleproto_authsetup_rsp_t *au_rsp = &encode_desc.datast.authsetup_rsp; + usr_le_fill_rsp_header(&s_encode_desc, desc, E_BLEPROTO_SERVICE_ID_AUTHSETUP); au_rsp->errcode = 0; - memcpy(&usr_auth_data, &desc->datast.authsetup_req, sizeof(usr_auth_data)); + if (usr_auth_data.paired_flag == 0) { - // 保存三元组 - if (usr_auth_data.paired_flag == 0) - { - usr_write_pair_info(); - printf("usr_auth_data %s %s ", usr_auth_data.authcode, usr_auth_data.devid); - printf_buf(usr_auth_data.gwmac, 6); - } - } - - encode_len = bleproto_appdata_encode(txbuf, sizeof(txbuf), sizeof(txbuf), &encode_desc); - if (encode_len > 0) - { - printf("encode_len = %d\n", encode_len); - usr_ble_send_data(txbuf, encode_len); - } - else - { - printf("2encode_len = %d\n", encode_len); + usr_write_pair_info(); + printf("usr_auth_data %s %s ", usr_auth_data.authcode, usr_auth_data.devid); + printf_buf(usr_auth_data.gwmac, 6); } + usr_le_encode_and_send(&s_encode_desc); break; - case E_BLEPROTO_SERVICE_ID_AUTHDELETE: - // 设备处理,回复响应 - printf("E_BLEPROTO_SERVICE_ID_AUTHDELETE\n"); - encode_desc.header.version = 0; - encode_desc.header.datafmt = BLEPROTO_APPDATA_DATAFMT_JSON; - encode_desc.header.msgtype = BLEPROTO_APPDATA_MSGTYPE_RSP; - encode_desc.header.msgid = desc->header.msgid; // 这里的msg_id为上面解析到的包的msg_id; - encode_desc.header.encrypt = 0; - encode_desc.header.serviceid = E_BLEPROTO_SERVICE_ID_AUTHSETUP; + } + case E_BLEPROTO_SERVICE_ID_AUTHDELETE: { + bleproto_authdelete_rsp_t *aude_rsp = &s_encode_desc.datast.authdelete_rsp; - bleproto_authdelete_rsp_t *aude_rsp = &encode_desc.datast.authdelete_rsp; + printf("E_BLEPROTO_SERVICE_ID_AUTHDELETE\n"); + usr_le_fill_rsp_header(&s_encode_desc, desc, E_BLEPROTO_SERVICE_ID_AUTHDELETE); memcpy(aude_rsp->gwmac, usr_auth_data.gwmac, 6); if (!memcmp(usr_auth_data.authcode, desc->datast.authdelete_req.authcode, 32)) { @@ -186,20 +207,10 @@ void usr_data_ana(bleproto_appdata_desc_t *desc) { aude_rsp->errcode = 501; } - - encode_len = bleproto_appdata_encode(txbuf, sizeof(txbuf), sizeof(txbuf), &encode_desc); - if (encode_len > 0) - { - printf("encode_len = %d\n", encode_len); - usr_ble_send_data(txbuf, encode_len); - } - else - { - printf("2encode_len = %d\n", encode_len); - } + usr_le_encode_and_send(&s_encode_desc); break; + } case E_BLEPROTO_SERVICE_ID_RUNCMD: - // 设备处理,回复响应 printf("E_BLEPROTO_SERVICE_ID_RUNCMD\n"); break; case E_BLEPROTO_SERVICE_ID_RUNCMD_V2: @@ -207,108 +218,31 @@ void usr_data_ana(bleproto_appdata_desc_t *desc) usr_run_cmd_code_v2(&desc->datast.runcmd_v2_req, desc->header.msgid); break; case E_BLEPROTO_SERVICE_ID_OTANOTIFY: - printf("E_BLEPROTO_SERVICE_ID_OTANOTIFY\n"); - encode_desc.header.version = 0; - encode_desc.header.datafmt = BLEPROTO_APPDATA_DATAFMT_JSON; - encode_desc.header.msgtype = BLEPROTO_APPDATA_MSGTYPE_RSP; - encode_desc.header.msgid = desc->header.msgid; // 这里的msg_id为上面解析到的包的msg_id; - encode_desc.header.encrypt = 0; - encode_desc.header.serviceid = E_BLEPROTO_SERVICE_ID_OTANOTIFY; - encode_desc.datast.doaction_rsp.errcode = 0; - - bleproto_otanotify_rsp_t *in_ota_rsp = &encode_desc.datast.otanotify_rsp; - - bleproto_otanotify_req_t *in_ota_data2 = &desc->datast.otanotify_req; - printf("in_ota_data id = %d\n", in_ota_data2->id); - printf("in_ota_data ver = %s\n", in_ota_data2->version); - printf("in_ota_data size= %d\n", in_ota_data2->size); - printf("in_ota_data md5 = %s\n", in_ota_data2->md5); - { - in_ota_rsp->errcode = 0; - // 执行命令 - } - - usr_var.usr_ota_data_id = in_ota_data2->id; // int - usr_var.usr_ota_data_size = in_ota_data2->size; - encode_len = bleproto_appdata_encode(txbuf, sizeof(txbuf), sizeof(txbuf), &encode_desc); - if (encode_len > 0) - { - printf("encode_len = %d\n", encode_len); - usr_ble_send_data(txbuf, encode_len); - } - else - { - printf("2encode_len = %d\n", encode_len); - } - - usr_var.usr_allow_to_flash = 0; - usr_var.usr_data_index = 0; - start_data[2] = usr_var.usr_ota_data_size & 0x000000ff; - start_data[3] = (usr_var.usr_ota_data_size >> 8) & 0x000000ff; - start_data[4] = (usr_var.usr_ota_data_size >> 16) & 0x000000ff; - start_data[5] = (usr_var.usr_ota_data_size >> 24) & 0x000000ff; - dual_ota_app_data_deal(0, start_data, 10); - printf("#### buf total size = %d\n", usr_var.usr_ota_data_size); - printf_buf(start_data, 10); - - encode_desc.header.version = 0; - encode_desc.header.datafmt = BLEPROTO_APPDATA_DATAFMT_JSON; - encode_desc.header.msgtype = BLEPROTO_APPDATA_MSGTYPE_REQ; - encode_desc.header.msgid = 0; // desc->header.msgid; - encode_desc.header.encrypt = 0; - encode_desc.header.serviceid = E_BLEPROTO_SERVICE_ID_OTADATA; - encode_desc.datast.doaction_rsp.errcode = 0; - - encode_desc.datast.otadata_req.id = usr_var.usr_ota_data_id; - encode_desc.datast.otadata_req.offset = usr_var.usr_data_index; - encode_desc.datast.otadata_req.maxsize = FIRM_PACK_LEN; - encode_len = bleproto_appdata_encode(txbuf, sizeof(txbuf), sizeof(txbuf), &encode_desc); - if (encode_len > 0) - { - usr_ble_send_data(txbuf, encode_len); - } - else - { - printf("2encode_len err = %d\n", encode_len); - } - - if (usr_var.usr_double_ota_timer_id == 0) - { - clk_set("sys", 48 * 1000000L); - usr_var.usr_double_ota_timer_id = 1; - // clk_set("sys", 120 * 1000000L); - os_task_create(usr_ota_deal_task, NULL, 31, FIRM_PACK_LEN, 0, "usr_ota"); - } - - break; case E_BLEPROTO_SERVICE_ID_OTADATA: - printf("E_BLEPROTO_SERVICE_ID_OTADATA\n"); - break; case E_BLEPROTO_SERVICE_ID_OTADATA_V2: - printf("E_BLEPROTO_SERVICE_ID_OTADATA\n"); + /* JSON OTA 已废弃,SOC 走 JB 0x30/0x32 */ + printf("JSON OTA deprecated, use JB 0x30/0x32\n"); break; - default: - printf("err !!! default event desc->header.serviceid =%d\n", desc->header.serviceid); + printf("err !!! default event desc->header.serviceid =%d\n", + desc->header.serviceid); break; } + return; } - else if (desc->header.msgtype == BLEPROTO_APPDATA_MSGTYPE_RSP) + + if (desc->header.msgtype == BLEPROTO_APPDATA_MSGTYPE_RSP) { - printf("BLEPROTO_APPDATA_MSGTYPE_RSP\n"); switch (desc->header.serviceid) { case E_BLEPROTO_SERVICE_ID_REPORTCMD: - // 主控回复的响应,设备处理 - printf("E_BLEPROTO_SERVICE_ID_REPORTCMD\n"); - printf("cmd id = %d", desc->datast.reportcmd_rsp.errcode); + printf("E_BLEPROTO_SERVICE_ID_REPORTCMD errcode=%d\n", + desc->datast.reportcmd_rsp.errcode); break; - case E_BLEPROTO_SERVICE_ID_REPORTCMD_V2: - { - /* 网关对主动上报 / OTA 的应答(非 55AA): - * cmd==0 && gateway_int_cnt==1 && gateway_int[0]==0 → 应答成功 */ + case E_BLEPROTO_SERVICE_ID_REPORTCMD_V2: { ble_proto_packet_t *rpt_ack = &desc->datast.reportcmd_v2_rsp; - printf("E_BLEPROTO_SERVICE_ID_REPORTCMD_V2 cmd=%u cnt=%u int0=%ld\n", + + printf("REPORTCMD_V2 cmd=%u cnt=%u int0=%ld\n", (unsigned)rpt_ack->cmd, (unsigned)rpt_ack->gateway_int_cnt, (long)((rpt_ack->gateway_int_cnt > 0) ? rpt_ack->gateway_int[0] : 0)); @@ -318,120 +252,23 @@ void usr_data_ana(bleproto_appdata_desc_t *desc) break; } case E_BLEPROTO_SERVICE_ID_OTADATA: - bleproto_otadata_rsp_t *ota_data_rsp = &desc->datast.otadata_rsp; - // printf("errcode = %d offset = %d len = %d\n",ota_data_rsp->errcode,ota_data_rsp->offset,ota_data_rsp->len); - uart_tr_send_data(ota_data_rsp->data, ota_data_rsp->len); - memcpy(&ota_source_data[usr_var.usr_allow_to_flash], ota_data_rsp->data, ota_data_rsp->len); - usr_var.usr_allow_to_flash += ota_data_rsp->len; - usr_var.usr_start_write_flash = 0; - if (usr_var.usr_allow_to_flash >= (FIRM_PACK_LEN * 2)) // 0 - 1024 - // 1024 - 2048 - // 2048 - 3072 - // 3072 - 4096 - { - usr_var.usr_start_write_flash = 1; - } - else - { - usr_var.usr_data_index += FIRM_PACK_LEN; - if (usr_var.usr_data_index >= usr_var.usr_ota_data_size) - { - usr_var.usr_start_write_flash = 2; - break; - } - // bleproto_appdata_desc_t encode_desc = { 0 }; - encode_desc.header.version = 0; - encode_desc.header.datafmt = BLEPROTO_APPDATA_DATAFMT_JSON; - encode_desc.header.msgtype = BLEPROTO_APPDATA_MSGTYPE_REQ; - encode_desc.header.msgid = 0; // desc->header.msgid; - encode_desc.header.encrypt = 0; - encode_desc.header.serviceid = E_BLEPROTO_SERVICE_ID_OTADATA; - encode_desc.datast.doaction_rsp.errcode = 0; - - encode_desc.datast.otadata_req.id = usr_var.usr_ota_data_id; - encode_desc.datast.otadata_req.offset = usr_var.usr_data_index; - encode_desc.datast.otadata_req.maxsize = FIRM_PACK_LEN; - encode_len = bleproto_appdata_encode(txbuf, sizeof(txbuf), sizeof(txbuf), &encode_desc); - if (encode_len > 0) - { - usr_ble_send_data(txbuf, encode_len); - } - else - { - printf("2encode_len err = %d\n", encode_len); - } - } + printf("JSON OTA deprecated, use JB 0x32\n"); break; default: - printf("E_BLEPROTO_SERVICE_ID_REPORTCMD\n"); + printf("unhandled RSP serviceid=%d\n", desc->header.serviceid); break; } } } -void usr_ota_deal_task() +/** + * @brief APP RUNCMD_V2:55AA 字节流转交 JB 协议层 + * @param runcmd_par 内层包 + * @param usr_msg_id bleproto msgid + */ +static void usr_run_cmd_code_v2(ble_proto_packet_t *runcmd_par, u8 usr_msg_id) { - os_time_dly(5); - bleproto_appdata_desc_t encode_desc = {0}; - while (1) - { - if (usr_var.usr_ota_succ_flag == 0) - { - if (usr_var.usr_start_write_flash == 1) - { - // OS_ENTER_CRITICAL(); - usr_var.usr_data_index += FIRM_PACK_LEN; - usr_var.usr_start_write_flash = 0; - dual_ota_app_data_deal(0, ota_source_data, usr_var.usr_allow_to_flash); - os_time_dly(1); - // OS_EXIT_CRITICAL(); - // printf("usr_var.usr_allow_to_flash = %d\n",usr_var.usr_allow_to_flash); - usr_var.usr_allow_to_flash = 0; - - encode_desc.header.version = 0; - encode_desc.header.datafmt = BLEPROTO_APPDATA_DATAFMT_JSON; - encode_desc.header.msgtype = BLEPROTO_APPDATA_MSGTYPE_REQ; - encode_desc.header.msgid = 0; // desc->header.msgid; - encode_desc.header.encrypt = 0; - encode_desc.header.serviceid = E_BLEPROTO_SERVICE_ID_OTADATA; - encode_desc.datast.doaction_rsp.errcode = 0; - - encode_desc.datast.otadata_req.id = usr_var.usr_ota_data_id; - encode_desc.datast.otadata_req.offset = usr_var.usr_data_index; - encode_desc.datast.otadata_req.maxsize = FIRM_PACK_LEN; - encode_len = bleproto_appdata_encode(txbuf, sizeof(txbuf), sizeof(txbuf), &encode_desc); - if (encode_len > 0) - { - usr_ble_send_data(txbuf, encode_len); - } - else - { - printf("2encode_len err = %d\n", encode_len); - } - } - else if (usr_var.usr_start_write_flash == 2) - { - printf("usr_start_write_flash = %d\n", usr_var.usr_start_write_flash); - usr_var.usr_start_write_flash = 0; - // OS_ENTER_CRITICAL(); - dual_ota_app_data_deal(0, ota_source_data, usr_var.usr_allow_to_flash); - // OS_EXIT_CRITICAL(); - printf("usr_var.usr_allow_to_flash = %d\n", usr_var.usr_allow_to_flash); - usr_var.usr_allow_to_flash = 0; - os_time_dly(30); - dual_ota_app_data_deal(0, end_data, 2); - } - } - os_time_dly(10); - // putchar('6'); - } -} - -/* 最近一次收到 RUNCMD_V2 请求的 msgid,应答时回填 */ -static u8 s_last_runcmd_msgid = 0; -void usr_run_cmd_code_v2(ble_proto_packet_t *runcmd_par, u8 usr_msg_id) -{ - u8 jb_frame[128]; /* 与 jb_protocol.h MAX_PACKAGE_LEN 一致 */ + u8 jb_frame[MAX_PACKAGE_LEN]; u16 copy_len; if (!runcmd_par || !runcmd_par->bytes_data || runcmd_par->device_bytes_len == 0) @@ -444,7 +281,6 @@ void usr_run_cmd_code_v2(ble_proto_packet_t *runcmd_par, u8 usr_msg_id) printf("runcmd_par id = %d, bytes_len = %u\n", runcmd_par->cmd, runcmd_par->device_bytes_len); - /* 先拷到本地再入 JB 环缓,避免零拷贝指针被后续逻辑覆盖 */ copy_len = runcmd_par->device_bytes_len; if (copy_len > sizeof(jb_frame)) { @@ -461,16 +297,17 @@ void usr_run_cmd_code_v2(ble_proto_packet_t *runcmd_par, u8 usr_msg_id) * @brief 将 JB 协议帧封装为 bleproto V2 后通过 BLE 发送 * @param data JB 协议原始帧(55 AA | LEN | CMD | ...) * @param len 帧长度 - * @note 根据 JB CMD 区分主动上报 / 应答: - * - 主动(0x07/0x34/0x38): REPORTCMD_V2 + REQ + cmd=100 - * - 应答(其余): RUNCMD_V2 + RSP + cmd=110 + * @note 主动上报(0x07/0x34/0x38) → REPORTCMD_V2;其余 → RUNCMD_V2 应答 + * 对外符号名保持 ble_send_data,供 jb_protocol 调用 */ void ble_send_data(u8 *data, u16 len) { - bleproto_appdata_desc_t encode_desc = {0}; - ble_proto_packet_t *pkt = NULL; + ble_proto_packet_t pkt; + bleproto_appdata_header_t hdr; + u8 v2_buf[MAX_PACKAGE_LEN + USR_LE_V2_WRAP_OVERHEAD]; u8 jb_cmd; u8 is_active_send; + int plen; int elen; if (!data || len < 5) @@ -478,54 +315,62 @@ void ble_send_data(u8 *data, u16 len) printf("ble_send_data invalid param, len=%d\n", len); return; } + if (len > MAX_PACKAGE_LEN) + { + printf("ble_send_data frame too long %u\n", len); + return; + } + if (!usr_ble_is_notify_ready()) + { + printf("ble_send_data wait CCC cmd=0x%02X\n", data[USR_LE_JB_CMD_OFF]); + return; + } - /* JB帧: 55 AA | LEN_H LEN_L | CMD | SN | ...,CMD 在偏移 4 */ - jb_cmd = data[4]; - /* 主动上报 0x07;MCU 主动 OTA 完成/停止 0x34/0x38;其余按应答 */ - is_active_send = (jb_cmd == 0x07) || (jb_cmd == 0x34) || (jb_cmd == 0x38); + jb_cmd = data[USR_LE_JB_CMD_OFF]; + is_active_send = usr_le_is_gateway_report_cmd(jb_cmd); - encode_desc.header.version = 0; - encode_desc.header.datafmt = BLEPROTO_APPDATA_DATAFMT_JSON; - encode_desc.header.encrypt = 0; + memset(&pkt, 0, sizeof(pkt)); + memset(&hdr, 0, sizeof(hdr)); + hdr.version = 0; + hdr.datafmt = BLEPROTO_APPDATA_DATAFMT_JSON; + hdr.encrypt = 0; if (is_active_send) { - /* 主动发送:REPORTCMD_V2 / REQ / cmd=100 */ - encode_desc.header.msgtype = BLEPROTO_APPDATA_MSGTYPE_REQ; - encode_desc.header.msgid = 0; - encode_desc.header.serviceid = E_BLEPROTO_SERVICE_ID_REPORTCMD_V2; - - pkt = &encode_desc.datast.reportcmd_v2_req; - pkt->cmd = 100; - pkt->reserved = 0; - pkt->gateway_int_cnt = 0; + hdr.msgtype = BLEPROTO_APPDATA_MSGTYPE_REQ; + hdr.msgid = 0; + hdr.serviceid = E_BLEPROTO_SERVICE_ID_REPORTCMD_V2; + pkt.cmd = USR_LE_V2_CMD_REPORT; + pkt.gateway_int_cnt = 0; } else { - /* 应答命令:RUNCMD_V2 / RSP / cmd=110,回填最新 msgid */ - encode_desc.header.msgtype = BLEPROTO_APPDATA_MSGTYPE_RSP; - encode_desc.header.msgid = s_last_runcmd_msgid; - encode_desc.header.serviceid = E_BLEPROTO_SERVICE_ID_RUNCMD_V2; - - pkt = &encode_desc.datast.runcmd_v2_rsp; - pkt->cmd = 110; - pkt->reserved = 0; - pkt->gateway_int_cnt = 2; - pkt->gateway_int[0] = 0; - pkt->gateway_int[1] = 0; + hdr.msgtype = BLEPROTO_APPDATA_MSGTYPE_RSP; + hdr.msgid = s_last_runcmd_msgid; + hdr.serviceid = E_BLEPROTO_SERVICE_ID_RUNCMD_V2; + pkt.cmd = USR_LE_V2_CMD_RUN; + pkt.gateway_int_cnt = 2; + pkt.gateway_int[0] = 0; + pkt.gateway_int[1] = 0; } - pkt->device_int_len = 0; - pkt->device_str_len = 0; - pkt->device_bytes_len = len; - pkt->bytes_data = data; + pkt.device_bytes_len = len; + pkt.bytes_data = data; - elen = bleproto_appdata_encode(txbuf, sizeof(txbuf), sizeof(txbuf), &encode_desc); - printf("ble_send_data jb_cmd=0x%02X active=%d encode_len=%d msgid=%d\n", - jb_cmd, is_active_send, elen, encode_desc.header.msgid); - if (elen > 0) + plen = ble_proto_pack(&pkt, v2_buf, sizeof(v2_buf)); + if (plen <= 0) { - usr_ble_send_data(txbuf, elen); - printf_buf(txbuf, elen); + printf("ble_send_data pack fail %d\n", plen); + return; } + + elen = bleproto_appdata_wrap_raw(txbuf, sizeof(txbuf), &hdr, v2_buf, (uint16_t)plen); + printf("ble_send_data jb_cmd=0x%02X active=%d encode_len=%d msgid=%d\n", + jb_cmd, is_active_send, elen, hdr.msgid); + if (elen <= 0) + { + return; + } + usr_ble_send_data(txbuf, elen); + printf_buf(txbuf, elen); } diff --git a/apps/usr_periph/usr_rtc.c b/apps/usr_periph/usr_rtc.c new file mode 100644 index 0000000..d44dbe4 --- /dev/null +++ b/apps/usr_periph/usr_rtc.c @@ -0,0 +1,363 @@ +/****************************************************************************** + * @file usr_rtc.c + * @brief 板级 RTC 外设实现(BR28 硬件 rtc_dev_ops) + * @author cyWu <1917507415@qq.com> + * @date 2026.08.19 + * @version V1.1.0 + * @history + * - V1.0.0, 2026.08.19, cyWu, 从模组固件移植至 SOC SDK + * - V1.1.0, 2026.08.19, cyWu, 精简公共接口与缓存逻辑 + ******************************************************************************/ + +#include "system/includes.h" +#include "app_config.h" +#include "usr_rtc.h" +#include "asm/rtc.h" + +#define LOG_TAG_CONST APP +#define LOG_TAG "[USR_RTC]" +#define LOG_ERROR_ENABLE +#define LOG_DEBUG_ENABLE +#define LOG_INFO_ENABLE +#include "debug.h" + +/*============================================================================*/ +/* 私有宏 / 类型 */ +/*============================================================================*/ + +#define USR_RTC_TZ_MAGIC (0x52544331u) /**< 'RTC1',校验 VM 时区 */ + +typedef struct { + uint32_t magic; + int32_t tz_s; +} UsrRtcTzVm_t; + +typedef struct { + uint8_t inited; + uint8_t tz_valid; + int32_t tz_s; + void *dev; +} UsrRtc_t; + +/*============================================================================*/ +/* 私有变量 */ +/*============================================================================*/ + +static UsrRtc_t s_rtc; + +/*============================================================================*/ +/* 私有函数声明 */ +/*============================================================================*/ + +static uint8_t usr_rtc_is_leap(uint16_t year); +static uint8_t usr_rtc_days_in_month(uint16_t year, uint8_t month); +static uint8_t usr_rtc_year_ok(uint16_t year); +static void usr_rtc_unix_to_calendar(uint32_t unix_utc, int32_t tz_s, + struct sys_time *t); +static UsrRtc_Ret_t usr_rtc_write(const struct sys_time *t); +static void usr_rtc_load_tz(void); +static void usr_rtc_save_tz(int32_t tz_s); + +/*============================================================================*/ +/* 公有函数 */ +/*============================================================================*/ + +/** + * @brief 打开 rtc 设备并加载时区 + * @return UsrRtc_Ret_t + */ +UsrRtc_Ret_t usr_rtc_init(void) +{ + struct sys_time t; + + if (s_rtc.inited) + { + return USR_RTC_OK; + } + +#if TCFG_APP_RTC_EN + s_rtc.dev = dev_open("rtc", NULL); + if (!s_rtc.dev) + { + log_error("open rtc fail"); + return USR_RTC_ERR_NOT_INIT; + } +#else + log_error("TCFG_APP_RTC_EN=0"); + return USR_RTC_ERR_NOT_INIT; +#endif + + usr_rtc_load_tz(); + s_rtc.inited = 1; + + memset(&t, 0, sizeof(t)); + read_sys_time(&t); + log_info("rtc open %u-%02u-%02u %02u:%02u:%02u tz=%ld tz_ok=%u", + t.year, t.month, t.day, t.hour, t.min, t.sec, + (long)s_rtc.tz_s, s_rtc.tz_valid); + return USR_RTC_OK; +} + +/** + * @brief 获取当前本地时间 + * @param t 成功时赋值;失败不改动 + * @return 1/0 + */ +uint8_t usr_rtc_get_time(struct sys_time *t) +{ + struct sys_time tmp; + + if (!t || !s_rtc.inited || !s_rtc.tz_valid) + { + return 0; + } + + memset(&tmp, 0, sizeof(tmp)); + read_sys_time(&tmp); + if (!usr_rtc_year_ok(tmp.year)) + { + return 0; + } + + *t = tmp; + return 1; +} + +/** + * @brief UTC 秒 + 时区 → 本地日历写入 RTC + * @param unix_utc UTC 秒 + * @param tz_s 时区偏移秒 + * @return UsrRtc_Ret_t + */ +UsrRtc_Ret_t usr_rtc_set_from_unix(uint64_t unix_utc, int32_t tz_s) +{ + struct sys_time t; + UsrRtc_Ret_t ret; + + if (!s_rtc.inited) + { + return USR_RTC_ERR_NOT_INIT; + } + if (unix_utc == 0) + { + log_debug("unix=0, ignore"); + return USR_RTC_ERR_PARAM; + } + + /* 网关采样到写入大约慢 1s,在 UTC 上补偿 */ + unix_utc += USR_RTC_SYNC_COMPENSATE_S; + if ((tz_s > USR_RTC_TZ_ABS_MAX_S) || (tz_s < -USR_RTC_TZ_ABS_MAX_S)) + { + log_error("tz out of range %ld", (long)tz_s); + return USR_RTC_ERR_PARAM; + } + if (unix_utc > 0xFFFFFFFFull) + { + log_error("unix too large"); + return USR_RTC_ERR_PARAM; + } + + usr_rtc_unix_to_calendar((uint32_t)unix_utc, tz_s, &t); + if (!usr_rtc_year_ok(t.year)) + { + log_error("year %u not in %u~%u, wait sync", + t.year, USR_RTC_YEAR_MIN, USR_RTC_YEAR_MAX); + return USR_RTC_ERR_INVALID; + } + + ret = usr_rtc_write(&t); + if (ret != USR_RTC_OK) + { + return ret; + } + + usr_rtc_save_tz(tz_s); + log_info("set rtc %u-%02u-%02u %02u:%02u:%02u tz=%ld", + t.year, t.month, t.day, t.hour, t.min, t.sec, (long)tz_s); + return USR_RTC_OK; +} + +/*============================================================================*/ +/* 私有函数 */ +/*============================================================================*/ + +/** + * @brief 写硬件日历 + * @param t 本地日历 + * @return UsrRtc_Ret_t + */ +static UsrRtc_Ret_t usr_rtc_write(const struct sys_time *t) +{ + struct sys_time tmp; + + if (!t) + { + return USR_RTC_ERR_PARAM; + } + if (!s_rtc.inited) + { + return USR_RTC_ERR_NOT_INIT; + } + if (!usr_rtc_year_ok(t->year) || (t->month < 1) || (t->month > 12) || + (t->day < 1) || (t->hour > 23) || (t->min > 59) || (t->sec > 59)) + { + return USR_RTC_ERR_PARAM; + } + if (t->day > usr_rtc_days_in_month(t->year, t->month)) + { + return USR_RTC_ERR_PARAM; + } + + tmp = *t; + write_sys_time(&tmp); + return USR_RTC_OK; +} + +/** + * @brief 是否闰年 + * @param year 公历年 + * @return 1/0 + */ +static uint8_t usr_rtc_is_leap(uint16_t year) +{ + if ((year % 400u) == 0) + { + return 1; + } + if ((year % 100u) == 0) + { + return 0; + } + return ((year % 4u) == 0) ? 1 : 0; +} + +/** + * @brief 某月天数 + * @param year 年 + * @param month 月 1~12 + * @return 天数,非法月返回 0 + */ +static uint8_t usr_rtc_days_in_month(uint16_t year, uint8_t month) +{ + static const uint8_t days[12] = { + 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + + if ((month < 1) || (month > 12)) + { + return 0; + } + if ((month == 2) && usr_rtc_is_leap(year)) + { + return 29; + } + return days[month - 1]; +} + +/** + * @brief 年份是否在合法窗口 + * @param year 年 + * @return 1/0 + */ +static uint8_t usr_rtc_year_ok(uint16_t year) +{ + return ((year >= USR_RTC_YEAR_MIN) && (year <= USR_RTC_YEAR_MAX)) ? 1 : 0; +} + +/** + * @brief UTC 秒 + 时区 → 本地日历 + * @param unix_utc UTC 秒 + * @param tz_s 时区偏移 + * @param t 输出 + */ +static void usr_rtc_unix_to_calendar(uint32_t unix_utc, int32_t tz_s, + struct sys_time *t) +{ + int64_t local; + uint32_t days; + uint32_t tod; + uint16_t y; + uint8_t m; + uint8_t dim; + + memset(t, 0, sizeof(*t)); + local = (int64_t)unix_utc + (int64_t)tz_s; + if (local < 0) + { + local = 0; + } + + tod = (uint32_t)(local % 86400); + days = (uint32_t)(local / 86400); + t->sec = (uint8_t)(tod % 60u); + t->min = (uint8_t)((tod / 60u) % 60u); + t->hour = (uint8_t)(tod / 3600u); + + y = 1970; + while (1) + { + uint32_t diy = usr_rtc_is_leap(y) ? 366u : 365u; + if (days < diy) + { + break; + } + days -= diy; + y++; + if (y > 4095u) + { + break; + } + } + t->year = y; + + for (m = 1; m <= 12u; m++) + { + dim = usr_rtc_days_in_month(y, m); + if (days < dim) + { + break; + } + days -= dim; + } + t->month = m; + t->day = (uint8_t)(days + 1u); +} + +/** + * @brief 从 VM 加载时区 + */ +static void usr_rtc_load_tz(void) +{ + UsrRtcTzVm_t vm; + int ret; + + s_rtc.tz_valid = 0; + s_rtc.tz_s = 0; + memset(&vm, 0, sizeof(vm)); + ret = syscfg_read(CFG_USER_TIM_FLAG, (u8 *)&vm, sizeof(vm)); + if ((ret == (int)sizeof(vm)) && (vm.magic == USR_RTC_TZ_MAGIC)) + { + if ((vm.tz_s <= USR_RTC_TZ_ABS_MAX_S) && (vm.tz_s >= -USR_RTC_TZ_ABS_MAX_S)) + { + s_rtc.tz_s = vm.tz_s; + s_rtc.tz_valid = 1; + log_info("tz from vm %ld", (long)s_rtc.tz_s); + return; + } + } + log_debug("tz vm empty"); +} + +/** + * @brief 时区写入 VM + * @param tz_s 时区偏移秒 + */ +static void usr_rtc_save_tz(int32_t tz_s) +{ + UsrRtcTzVm_t vm; + + s_rtc.tz_s = tz_s; + s_rtc.tz_valid = 1; + vm.magic = USR_RTC_TZ_MAGIC; + vm.tz_s = tz_s; + syscfg_write(CFG_USER_TIM_FLAG, (u8 *)&vm, sizeof(vm)); +} diff --git a/apps/usr_periph/usr_rtc.h b/apps/usr_periph/usr_rtc.h new file mode 100644 index 0000000..9c5de7e --- /dev/null +++ b/apps/usr_periph/usr_rtc.h @@ -0,0 +1,64 @@ +/****************************************************************************** + * @file usr_rtc.h + * @brief 板级 RTC:硬件对时 + 客户读本地日历 + * @author cyWu <1917507415@qq.com> + * @date 2026.08.19 + * @version V1.1.0 + * @history + * - V1.0.0, 2026.08.19, cyWu, 从模组固件移植至 SOC SDK + * - V1.1.0, 2026.08.19, cyWu, 精简接口;usr_rtc_get_time 返回本地日历 + ******************************************************************************/ + +#ifndef __USR_RTC_H__ +#define __USR_RTC_H__ + +#include +#include "system/sys_time.h" + +/*============================================================================*/ +/* 宏定义 */ +/*============================================================================*/ + +#define USR_RTC_YEAR_MIN (2026u) /**< 合法年份下限 */ +#define USR_RTC_YEAR_MAX (2098u) /**< 合法年份上限 */ +#define USR_RTC_TZ_ABS_MAX_S (57600) /**< 时区偏移绝对值上限(±16h) */ +#define USR_RTC_SYNC_COMPENSATE_S (1u) /**< 网关对时延迟补偿(秒) */ + +/*============================================================================*/ +/* 错误码(init / set_from_unix) */ +/*============================================================================*/ + +typedef enum { + USR_RTC_OK = 0, + USR_RTC_ERR_PARAM, + USR_RTC_ERR_NOT_INIT, + USR_RTC_ERR_INVALID, /**< 年份非法,等待 App 对时 */ +} UsrRtc_Ret_t; + +/*============================================================================*/ +/* 外部接口 */ +/*============================================================================*/ + +/** + * @brief 打开 "rtc" 设备并加载时区 + * @return UsrRtc_Ret_t + * @note app_main 启动时调用一次即可 + */ +UsrRtc_Ret_t usr_rtc_init(void); + +/** + * @brief 获取当前本地时间(客户常用) + * @param t 成功时写入年月日时分秒;失败时不改动 + * @return 1=已对时且读成功,0=未初始化/未对时/参数非法 + */ +uint8_t usr_rtc_get_time(struct sys_time *t); + +/** + * @brief App/网关 DEVICEINFO:UTC 秒 + 时区写入 RTC + * @param unix_utc UTC Unix 秒;0 无效 + * @param tz_s 时区偏移秒(东八区 28800) + * @return UsrRtc_Ret_t + */ +UsrRtc_Ret_t usr_rtc_set_from_unix(uint64_t unix_utc, int32_t tz_s); + +#endif /* __USR_RTC_H__ */ diff --git a/cpu/br28/tools/download/earphone/download_app_ota.bat b/cpu/br28/tools/download/earphone/download_app_ota.bat index 1e15e05..bb583c5 100644 --- a/cpu/br28/tools/download/earphone/download_app_ota.bat +++ b/cpu/br28/tools/download/earphone/download_app_ota.bat @@ -10,10 +10,9 @@ copy ..\..\ota.bin . copy ..\..\anc_coeff.bin . copy ..\..\anc_gains.bin . -..\..\isd_download.exe ..\..\isd_config.ini -tonorflash -dev br28 -boot 0x120000 -div8 -wait 300 -uboot ..\..\uboot.boot -app ..\..\app.bin -res ..\..\cfg_tool.bin tone.cfg p11_code.bin -uboot_compress -key RS-5B88.key +..\..\isd_download.exe ..\..\isd_config.ini -tonorflash -dev br28 -boot 0x120000 -div8 -wait 300 -uboot ..\..\uboot.boot -app ..\..\app.bin -res ..\..\cfg_tool.bin tone.cfg p11_code.bin -uboot_compress - -:: -format all +:: -format all -key RS-5B88.key ::-reboot 2500 @rem ɾʱļ-format all diff --git a/include_lib/system/device/iokey.h b/include_lib/system/device/iokey.h index c9f0082..e9c7374 100644 --- a/include_lib/system/device/iokey.h +++ b/include_lib/system/device/iokey.h @@ -48,6 +48,23 @@ struct iokey_platform_data { extern int iokey_init(const struct iokey_platform_data *iokey_data); extern u8 io_get_key_value(void); +/* 开机锁键:长按开机不松手时屏蔽全部按键,避免误触长按关机。 + * 默认监视 port[0](请把电源键配成第 0 个)。 + * 松开并连续确认 release_cnt 次扫描后解锁(扫描约 10ms 一次,默认 10 ≈ 100ms)。 + * + * 关闭方式: + * 1) 编译关闭:在 board/app_config 里 #define TCFG_IOKEY_BOOT_LOCK_ENABLE 0 + * 2) 运行关闭:iokey_boot_lock_stop() 或 iokey_boot_lock_start(0) + */ +#ifndef TCFG_IOKEY_BOOT_LOCK_ENABLE +#define TCFG_IOKEY_BOOT_LOCK_ENABLE 1 +#endif +#ifndef IOKEY_BOOT_LOCK_DEFAULT_CNT +#define IOKEY_BOOT_LOCK_DEFAULT_CNT 10 +#endif +void iokey_boot_lock_start(u8 release_cnt); /* >0 启动;0=关闭 */ +void iokey_boot_lock_stop(void); /* 立即关闭锁键 */ + #endif diff --git a/tools/package_release.py b/tools/package_release.py index 18ec760..b586101 100644 --- a/tools/package_release.py +++ b/tools/package_release.py @@ -492,6 +492,7 @@ def write_readme(readme_path: Path, version: str, module_stats: List[dict]) -> N "│ ├── common/ # SDK 公共模块", "│ ├── earphone/ # 耳机应用", "│ ├── usr_jb_proto/ # 应用协议层", + "│ ├── usr_periph/ # 板级外设(RTC 等,源码开放)", "│ └── usr_le_code/ # BLE 协议库(库文件 + 公开头文件)", "├── cpu/ # 芯片相关代码与工具", "├── include_lib/ # SDK 头文件", diff --git a/version.txt b/version.txt index 3eefcb9..7dea76e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.0 +1.0.1