feat(ble): add DrawBoxEnable SET cmd; per-board handshake key; move headers

- event_recorder.c: add SET DRAWBOXENABLE 0/1 BLE command (runtime toggle,
  INI-persistent); expose g_dwDrawBoxEnable extern
- kdp2_host_stream.c: guard draw-box and seg-overlay rendering behind
  g_dwDrawBoxEnable so SET DRAWBOXENABLE 0 cleanly suppresses both
- handshake.c: derive key from runtime VMF_NNM_Get_Kn_Number() instead of
  compile-time constant; each board gets a unique handshake key
- kp_firmware.c: remove startup handshake key print (key is now per-board,
  fixed expected value is no longer meaningful)
- move base64.h / sha256.h / handshake.h from src/host_stream/ to
  include/host_stream/ (proper include path for shared headers)
This commit is contained in:
miketsai 2026-08-04 18:43:54 +08:00
parent 936e547dc3
commit 8fb28087c5
7 changed files with 19 additions and 13 deletions

View File

@ -15,7 +15,6 @@
#include <stddef.h> #include <stddef.h>
#define HANDSHAKE_KEY_LEN 16 #define HANDSHAKE_KEY_LEN 16
#define HANDSHAKE_KN_STR "29C310F5"//"48872dc21ede" /* test vector; restore to "29C310F5" after verification */
#define HANDSHAKE_R_LEN 16 #define HANDSHAKE_R_LEN 16
#define HANDSHAKE_TIMEOUT_SEC 5 #define HANDSHAKE_TIMEOUT_SEC 5

View File

@ -51,6 +51,7 @@ extern VMF_VSRC_HANDLE_T *g_ptVsrcHandle;
/* ── External globals settable via BLE SET command ───────────────────────── */ /* ── External globals settable via BLE SET command ───────────────────────── */
extern unsigned int g_dwSegOverlayEnable; /* defined in kp_firmware.c */ extern unsigned int g_dwSegOverlayEnable; /* defined in kp_firmware.c */
extern unsigned int g_dwDrawBoxEnable; /* defined in kp_firmware.c */
extern unsigned int g_verbose_log; /* defined in kp_firmware.c */ extern unsigned int g_verbose_log; /* defined in kp_firmware.c */
/* ── Speed control via MsgBroker ─────────────────────────────────────────── */ /* ── Speed control via MsgBroker ─────────────────────────────────────────── */
@ -812,6 +813,7 @@ static void persist_ini_int(const char *ini_key, int val)
/* Handle "SET key=value" command — works outside test mode. /* Handle "SET key=value" command — works outside test mode.
* cmd must already be uppercased (as provided by handle_test_cmd). * cmd must already be uppercased (as provided by handle_test_cmd).
* Supported keys (case-insensitive from sender): * Supported keys (case-insensitive from sender):
* DrawBoxEnable 0/1
* SegOverlayEnable 0/1 * SegOverlayEnable 0/1
* speed_normal 1255 * speed_normal 1255
* speed_alert 1255 * speed_alert 1255
@ -861,7 +863,13 @@ static void handle_set_cmd(const char *cmd)
fflush(stdout); fflush(stdout);
char ack[96]; char ack[96];
if (strcmp(key, "SEGOVERLAYENABLE") == 0) { if (strcmp(key, "DRAWBOXENABLE") == 0) {
int v = val ? 1 : 0;
g_dwDrawBoxEnable = (unsigned int)v;
persist_ini_int("DrawBoxEnable", v);
snprintf(ack, sizeof(ack), "SET_ACK DrawBoxEnable=%d", v);
} else if (strcmp(key, "SEGOVERLAYENABLE") == 0) {
int v = val ? 1 : 0; int v = val ? 1 : 0;
printf("[SET] writing g_dwSegOverlayEnable=%d\n", v); printf("[SET] writing g_dwSegOverlayEnable=%d\n", v);
fflush(stdout); fflush(stdout);

View File

@ -13,6 +13,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <vmf_nnm_inference_app.h>
#include "sha256.h" #include "sha256.h"
#include "base64.h" #include "base64.h"
#include "handshake.h" #include "handshake.h"
@ -24,8 +25,14 @@ static time_t s_challenge_send_time = 0;
void handshake_derive_key(uint8_t out_key[HANDSHAKE_KEY_LEN]) void handshake_derive_key(uint8_t out_key[HANDSHAKE_KEY_LEN])
{ {
/* Use runtime Kn chip number as key material (uppercase hex, no "0x" prefix).
* This ensures each board uses its own unique handshake key. */
char kn_str[16];
uint32_t kn = VMF_NNM_Get_Kn_Number();
snprintf(kn_str, sizeof(kn_str), "%08X", kn);
uint8_t digest[32]; uint8_t digest[32];
sha256((const uint8_t *)HANDSHAKE_KN_STR, strlen(HANDSHAKE_KN_STR), digest); sha256((const uint8_t *)kn_str, strlen(kn_str), digest);
for (int i = 0; i < HANDSHAKE_KEY_LEN; i++) for (int i = 0; i < HANDSHAKE_KEY_LEN; i++)
out_key[i] = digest[i] ^ 0x5A; out_key[i] = digest[i] ^ 0x5A;
} }

View File

@ -855,7 +855,7 @@ void* kdp2_host_stream_draw_box(void *arg)
int need_flush = 0; int need_flush = 0;
if (g_dwResultCounts != 0) { if (g_dwDrawBoxEnable && g_dwResultCounts != 0) {
tYuvInfo.pcYuvBuff = tWriterSsmBuffer.buffer + vsrc_ssm_reader_info.dwOffset[0]; tYuvInfo.pcYuvBuff = tWriterSsmBuffer.buffer + vsrc_ssm_reader_info.dwOffset[0];
tYuvInfo.dwWidth = dwWidth; tYuvInfo.dwWidth = dwWidth;
tYuvInfo.dwHeight = dwHeight; tYuvInfo.dwHeight = dwHeight;
@ -866,7 +866,7 @@ void* kdp2_host_stream_draw_box(void *arg)
/* Paint STDC segmentation colour overlay (50% alpha blend into YM12). /* Paint STDC segmentation colour overlay (50% alpha blend into YM12).
* Requires SegOverlayEnable=1 in host_stream.ini (default 0 = outline only). */ * Requires SegOverlayEnable=1 in host_stream.ini (default 0 = outline only). */
if (g_dwSegOverlayEnable && g_stdc_seg_w > 0) { if (g_dwDrawBoxEnable && g_dwSegOverlayEnable && g_stdc_seg_w > 0) {
stdc_paint_seg_overlay(tWriterSsmBuffer.buffer, &vsrc_ssm_reader_info, stdc_paint_seg_overlay(tWriterSsmBuffer.buffer, &vsrc_ssm_reader_info,
dwWidth, dwHeight); dwWidth, dwHeight);
need_flush = 1; need_flush = 1;

View File

@ -510,14 +510,6 @@ int main (int argc, char* argv[])
VMF_NNM_Get_Version(&major, &minor, &patch, &build); VMF_NNM_Get_Version(&major, &minor, &patch, &build);
uint32_t kn_number = VMF_NNM_Get_Kn_Number(); uint32_t kn_number = VMF_NNM_Get_Kn_Number();
/* Derive and print BLE handshake key for startup verification.
* Expected: 58 48 c8 ff b2 eb b1 b8 69 92 b5 20 48 8d 1d 61 */
{
uint8_t hs_key[HANDSHAKE_KEY_LEN];
handshake_derive_key(hs_key);
printf("[INIT] handshake key: ");
handshake_print_key(hs_key);
}
printf("\n\n**********************************************************\n"); printf("\n\n**********************************************************\n");
printf("Kneron Firmware\n"); printf("Kneron Firmware\n");