Skip to content

Commit 35b1fd3

Browse files
committed
feat: HURRA_KM_DEBUG datagram tracing for KMBox Net frontend
Gate per-packet diagnostics behind the HURRA_KM_DEBUG env var: log each datagram's size, decoded cmd (with human-readable name), mac, and mouse fields, plus an explicit line when an unknown cmd is dropped. Makes silently-discarded traffic (automove/bezier stubs, unknown codes, short packets) visible when diagnosing 'connects but commands don't register'.
1 parent 45eb3b5 commit 35b1fd3

1 file changed

Lines changed: 33 additions & 0 deletions

File tree

‎src/frontend_kmbox.c‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,33 @@ typedef struct {
1616
/* one-shot "pending firmware" log guards */
1717
bool warned_automove, warned_bezier, warned_monitor, warned_mask;
1818
uint64_t rx_bad;
19+
bool debug; /* HURRA_KM_DEBUG: trace every datagram to stderr */
1920
} kmbox_t;
2021

2122
static void warn_once(bool *flag, const char *cmd) {
2223
if (!*flag) { fprintf(stderr, "kmbox: pending firmware: %s\n", cmd); *flag = true; }
2324
}
2425

26+
/* Human-readable name for a KMBox command code (for diagnostics). */
27+
static const char *km_cmd_name(uint32_t cmd) {
28+
switch (cmd) {
29+
case KM_CMD_CONNECT: return "connect";
30+
case KM_CMD_MOUSE_MOVE: return "mouse_move";
31+
case KM_CMD_MOUSE_LEFT: return "mouse_left";
32+
case KM_CMD_MOUSE_RIGHT: return "mouse_right";
33+
case KM_CMD_MOUSE_MIDDLE: return "mouse_middle";
34+
case KM_CMD_MOUSE_WHEEL: return "mouse_wheel";
35+
case KM_CMD_MOUSE_AUTOMOVE: return "mouse_automove";
36+
case KM_CMD_BEZIER: return "bezier";
37+
case KM_CMD_KEYBOARD_ALL: return "keyboard_all";
38+
case KM_CMD_REBOOT: return "reboot";
39+
case KM_CMD_MONITOR: return "monitor";
40+
case KM_CMD_MASK_MOUSE: return "mask_mouse";
41+
case KM_CMD_UNMASK_ALL: return "unmask_all";
42+
default: return "UNKNOWN";
43+
}
44+
}
45+
2546
static int km_poll(frontend_t *fe) {
2647
kmbox_t *k = (kmbox_t *)fe->impl;
2748
uint8_t buf[256];
@@ -30,6 +51,15 @@ static int km_poll(frontend_t *fe) {
3051
if (n <= 0) return n; /* 0 idle, -1 error */
3152

3253
km_decoded_t d = km_decode(buf, (size_t)n);
54+
if (k->debug) {
55+
if (!d.valid)
56+
fprintf(stderr, "kmbox rx: n=%d TOO SHORT (need >= %d for header)\n",
57+
n, KM_HEAD_SIZE);
58+
else
59+
fprintf(stderr, "kmbox rx: n=%d cmd=0x%08X (%s) mac=0x%08X x=%d y=%d btn=%d\n",
60+
n, d.head.cmd, km_cmd_name(d.head.cmd), d.head.mac,
61+
(int)d.x, (int)d.y, (int)d.button);
62+
}
3363
if (!d.valid) { k->rx_bad++; return 1; }
3464

3565
bool ack = true;
@@ -61,6 +91,8 @@ static int km_poll(frontend_t *fe) {
6191
case KM_CMD_MASK_MOUSE:
6292
case KM_CMD_UNMASK_ALL: warn_once(&k->warned_mask, "mask"); break;
6393
default:
94+
if (k->debug)
95+
fprintf(stderr, "kmbox: unknown cmd 0x%08X dropped (no ACK)\n", d.head.cmd);
6496
ack = false; k->rx_bad++; break;
6597
}
6698

@@ -92,6 +124,7 @@ int frontend_kmbox_open(frontend_t *out, input_sink_t *sink,
92124
if (!k->sock) { free(k); return -1; }
93125
k->sink = sink;
94126
k->mac = mac;
127+
{ const char *dbg = getenv("HURRA_KM_DEBUG"); k->debug = (dbg && *dbg && *dbg != '0'); }
95128
snprintf(k->desc, sizeof k->desc, "UDP %s:%u",
96129
(bind_addr && *bind_addr) ? bind_addr : "0.0.0.0", (unsigned)port);
97130
out->impl = k;

0 commit comments

Comments
 (0)