feat(vd960DBN): BLE 读取脱机日志 — OFFLOG_STAT/QUERY/CLEAR (0x25/0x26/0x27)
蓝牙通道补齐脱机日志读取 (此前仅 MQTT V1.06 / TCP JSON V1.02 有 log_* 命令): - 3 条 BLE 命令, 语义对齐 MQTT log_stat/log_query/log_clear - QUERY 直接传 32B OfflogEvt 原始结构 (二进制协议, 无需 JSON), 复用 idx = start_seq - seq_first 定位, 不新增 offlog API - 缓冲扩容: MAX_BLE_TMP_BUF_LEN 100→132, 新增 MAX_BLE_DAT_BUF_LEN=132 (QUERY 响应 1+4x32B=129B), clear_buf_dbn_ble_all memset 同步 - 新协议文档 docs/DLD960_BLE协议.md V1.00 (帧格式+分包+命令+记录结构) - 隔离测试 test_ble_offlog.c 嵌入源文件 3 case 真实文本, 7 例全过; offlog 回归 8 例 ALL PASS - devlog V4.0; README 协议矩阵补 BLE 行
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
#include "storage.h"
|
||||
#include <string.h>
|
||||
#include "net_srv.h"
|
||||
|
||||
#include "offlog.h"
|
||||
|
||||
uint8_t g_flag_notify_temp = 0; //临时通知notify flag, 0 disable, 1 enable
|
||||
|
||||
@@ -65,7 +65,7 @@ void clear_buf_dbn_ble_all(Buf_DBN_BLE * buf)
|
||||
buf->flag = 0;
|
||||
buf->magic = 0;
|
||||
buf->cmd = 0;
|
||||
memset(buf->dat, 0, MAX_BLE_BUF_LEN);
|
||||
memset(buf->dat, 0, MAX_BLE_DAT_BUF_LEN);
|
||||
buf->dat_len = 0;
|
||||
buf->dat_offset = 0;
|
||||
buf->pkg_amount = 0;
|
||||
@@ -876,6 +876,93 @@ void manage_dbn_ble_default(uint8_t *pkg, uint8_t len)
|
||||
}
|
||||
PRINT("Rcv_acs_enable_flag: %d\n", g_dbn_ble_state_acs_enable.flag);
|
||||
} break;
|
||||
case CMD_DBN_OFFLOG_STAT: {
|
||||
/* offlog stat: status(1) boot_seq(2) count(4) capacity(4) seq_first(4) seq_last(4), all LE */
|
||||
uint8_t _i = 0;
|
||||
uint32_t _total = offlog_count();
|
||||
uint32_t _seq_last = offlog_seq_last();
|
||||
uint32_t _seq_first = (_total > 0) ? (_seq_last - _total + 1) : 0;
|
||||
uint32_t _boot = offlog_boot_seq();
|
||||
uint32_t _cap = OFFLOG_MAX_RECORDS;
|
||||
|
||||
if (!offlog_enabled()) {
|
||||
tmp_ble_buf[_i++] = 0x01; /* disabled */
|
||||
} else {
|
||||
tmp_ble_buf[_i++] = 0x00; /* ok */
|
||||
tmp_ble_buf[_i++] = (uint8_t)(_boot & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_boot >> 8) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)(_total & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_total >> 8) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_total >> 16) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_total >> 24) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)(_cap & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_cap >> 8) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_cap >> 16) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_cap >> 24) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)(_seq_first & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_seq_first >> 8) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_seq_first >> 16) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_seq_first >> 24) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)(_seq_last & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_seq_last >> 8) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_seq_last >> 16) & 0xFF);
|
||||
tmp_ble_buf[_i++] = (uint8_t)((_seq_last >> 24) & 0xFF);
|
||||
}
|
||||
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, _i);
|
||||
PRINT("BLE: offlog_stat count=%lu seq_first=%lu seq_last=%lu\n",
|
||||
(unsigned long)_total, (unsigned long)_seq_first, (unsigned long)_seq_last);
|
||||
} break;
|
||||
case CMD_DBN_OFFLOG_QUERY: {
|
||||
/* paged fetch: req pkg[4..7]=start_seq(LE32) pkg[8]=count(1..4)
|
||||
resp: status(1) count(1) + N x 32B OfflogEvt raw (LE) */
|
||||
uint32_t _start_seq = 0;
|
||||
uint32_t _req_count = 0;
|
||||
uint32_t _total = offlog_count();
|
||||
uint32_t _seq_last = offlog_seq_last();
|
||||
uint32_t _seq_first = (_total > 0) ? (_seq_last - _total + 1) : 0;
|
||||
uint8_t _i = 0, _j = 0;
|
||||
|
||||
if (!offlog_enabled()) {
|
||||
tmp_ble_buf[_i++] = 0x01; /* disabled */
|
||||
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, _i);
|
||||
break;
|
||||
}
|
||||
if (len < 11) { /* frame too short: magic+header+len+cmd+5data+2ckb */
|
||||
tmp_ble_buf[_i++] = 0x02; /* bad request */
|
||||
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, _i);
|
||||
break;
|
||||
}
|
||||
_start_seq = (uint32_t)pkg[4] | ((uint32_t)pkg[5] << 8)
|
||||
| ((uint32_t)pkg[6] << 16) | ((uint32_t)pkg[7] << 24);
|
||||
_req_count = pkg[8];
|
||||
if (_req_count > OFFLOG_MAX_QUERY_RECORDS) _req_count = OFFLOG_MAX_QUERY_RECORDS;
|
||||
if (_req_count == 0) _req_count = OFFLOG_MAX_QUERY_RECORDS;
|
||||
|
||||
tmp_ble_buf[_i++] = 0x00; /* status ok */
|
||||
tmp_ble_buf[_i++] = 0; /* count placeholder */
|
||||
if (_total > 0 && _start_seq >= _seq_first && _start_seq <= _seq_last) {
|
||||
uint32_t _idx = _start_seq - _seq_first;
|
||||
while (_j < _req_count && (_idx + _j) < _total) {
|
||||
OfflogEvt _evt;
|
||||
if (offlog_read_idx((uint16_t)(_idx + _j), &_evt) != 0) break;
|
||||
memcpy(&tmp_ble_buf[_i], &_evt, sizeof(OfflogEvt));
|
||||
_i += sizeof(OfflogEvt);
|
||||
_j++;
|
||||
}
|
||||
}
|
||||
tmp_ble_buf[1] = _j;
|
||||
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, _i);
|
||||
PRINT("BLE: offlog_query start_seq=%lu req=%lu fetched=%u\n",
|
||||
(unsigned long)_start_seq, (unsigned long)_req_count, (unsigned)_j);
|
||||
} break;
|
||||
case CMD_DBN_OFFLOG_CLEAR: {
|
||||
/* clear offlog (audit trail). blocking ~2.8s (63 sectors erase), main-loop ctx ok */
|
||||
uint8_t _i = 0;
|
||||
offlog_clear();
|
||||
tmp_ble_buf[_i++] = 0x00; /* ok */
|
||||
set_response_buf(&g_buf_ble_response, MAGIC_BYTE_DBN_DEFAULT, _cmd, tmp_ble_buf, _i);
|
||||
PRINT("BLE: offlog_clear done\n");
|
||||
} break;
|
||||
default:
|
||||
{
|
||||
} break;
|
||||
|
||||
@@ -49,6 +49,10 @@
|
||||
#define CMD_DBN_SET_CJQ_PARAM 0x23 // 设置 车检器参数
|
||||
#define CMD_DBN_GET_CJQ_PARAM 0x24 // 读取 车检器参数
|
||||
|
||||
#define CMD_DBN_OFFLOG_STAT 0x25 // query offlog stat
|
||||
#define CMD_DBN_OFFLOG_QUERY 0x26 // query offlog records by seq
|
||||
#define CMD_DBN_OFFLOG_CLEAR 0x27 // clear offlog (audit trail)
|
||||
|
||||
|
||||
#define CMD_DBN_RW_UART_BAUD 0x31
|
||||
|
||||
@@ -73,7 +77,8 @@
|
||||
#define MAX_BLE_DAT_RESPONSE_LEN (BLE_BUFF_MAX_LEN - 4) // 14 //返回 的所有字节数不能超过20个字节,除去 magic、header和ckb校验字节,剩下数据的字节数为14
|
||||
#define MAX_BLE_Notify_Buf_LEN BLE_BUFF_MAX_LEN //24
|
||||
#define MAX_BLE_BUF_LEN BLE_BUFF_MAX_LEN //128
|
||||
#define MAX_BLE_TMP_BUF_LEN BLE_BUFF_MAX_LEN
|
||||
#define MAX_BLE_TMP_BUF_LEN 132 // offlog QUERY: 1 status + 4x32B records
|
||||
#define MAX_BLE_DAT_BUF_LEN 132 // response data buffer (align tmp buf)
|
||||
|
||||
typedef struct _BLE_Notify_Buf_
|
||||
{
|
||||
@@ -91,7 +96,7 @@ typedef struct _BUF_DBN_BLE_
|
||||
uint8_t dat_offset;
|
||||
uint8_t pkg_amount;
|
||||
uint8_t pkg_seq;
|
||||
uint8_t dat[MAX_BLE_BUF_LEN];
|
||||
uint8_t dat[MAX_BLE_DAT_BUF_LEN];
|
||||
} Buf_DBN_BLE;
|
||||
|
||||
extern Buf_DBN_BLE g_buf_ble_response;
|
||||
|
||||
Reference in New Issue
Block a user