Unify cache polling on CACHE_STATUS and split API docs.

Replace separate accel/tap snapshot UART commands with one clients[] response
that omits unsubscribed fields; remove snapshot handlers and CLI commands.
Add goTool/docs for WebSocket streams and REST; tap-snapshot REST uses CACHE_STATUS.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-29 21:23:09 +02:00
co-authored by Cursor
parent a85d48320e
commit 31e539052a
25 changed files with 1243 additions and 1269 deletions
+9 -12
View File
@@ -54,33 +54,30 @@ PB_BIND(alox_BatterySample, alox_BatterySample, AUTO)
PB_BIND(alox_BatteryStatusResponse, alox_BatteryStatusResponse, 2)
PB_BIND(alox_AccelSnapshotRequest, alox_AccelSnapshotRequest, AUTO)
PB_BIND(alox_AccelSample, alox_AccelSample, AUTO)
PB_BIND(alox_AccelSnapshotResponse, alox_AccelSnapshotResponse, 2)
PB_BIND(alox_TapNotifyRequest, alox_TapNotifyRequest, AUTO)
PB_BIND(alox_TapNotifyResponse, alox_TapNotifyResponse, AUTO)
PB_BIND(alox_TapSnapshotRequest, alox_TapSnapshotRequest, AUTO)
PB_BIND(alox_TapEvent, alox_TapEvent, AUTO)
PB_BIND(alox_TapSnapshotResponse, alox_TapSnapshotResponse, 2)
PB_BIND(alox_CacheStatusRequest, alox_CacheStatusRequest, AUTO)
PB_BIND(alox_CacheClientAccel, alox_CacheClientAccel, AUTO)
PB_BIND(alox_CacheClientTap, alox_CacheClientTap, AUTO)
PB_BIND(alox_CacheClientStatus, alox_CacheClientStatus, AUTO)
PB_BIND(alox_CacheStatusResponse, alox_CacheStatusResponse, 2)
+87 -103
View File
@@ -28,11 +28,9 @@ typedef enum _alox_MessageType {
alox_MessageType_OTA_SLAVE_PROGRESS = 21,
alox_MessageType_FIND_ME = 22,
alox_MessageType_RESTART = 23,
alox_MessageType_ACCEL_SNAPSHOT = 24,
alox_MessageType_ACCEL_STREAM = 25,
alox_MessageType_BATTERY_STATUS = 26,
alox_MessageType_TAP_NOTIFY = 27,
alox_MessageType_TAP_SNAPSHOT = 28,
/* * Combined cached accel + tap poll (one UART round-trip, ~16 ms cadence). */
alox_MessageType_CACHE_STATUS = 29
} alox_MessageType;
@@ -154,12 +152,7 @@ typedef struct _alox_BatteryStatusResponse {
alox_BatterySample samples[17];
} alox_BatteryStatusResponse;
/* Host → master: read cached accel samples from slaves (only while stream enabled).
client_id 0 = all registered slaves; otherwise one slave. */
typedef struct _alox_AccelSnapshotRequest {
uint32_t client_id;
} alox_AccelSnapshotRequest;
/* * Legacy host-side sample shape (dashboard helpers); use CACHE_STATUS on the wire. */
typedef struct _alox_AccelSample {
uint32_t client_id;
bool valid;
@@ -170,11 +163,6 @@ typedef struct _alox_AccelSample {
uint32_t age_ms;
} alox_AccelSample;
typedef struct _alox_AccelSnapshotResponse {
pb_size_t samples_count;
alox_AccelSample samples[16];
} alox_AccelSnapshotResponse;
/* * Host → master: enable/disable tap ESP-NOW notify per slave (single/double/triple). */
typedef struct _alox_TapNotifyRequest {
bool write;
@@ -194,11 +182,7 @@ typedef struct _alox_TapNotifyResponse {
bool triple;
} alox_TapNotifyResponse;
/* * Host → master: read cached tap events (discarded after reply or when age > 16 ms). */
typedef struct _alox_TapSnapshotRequest {
uint32_t client_id;
} alox_TapSnapshotRequest;
/* * Legacy tap event shape (dashboard helpers); use CACHE_STATUS on the wire. */
typedef struct _alox_TapEvent {
uint32_t client_id;
bool valid;
@@ -206,23 +190,39 @@ typedef struct _alox_TapEvent {
uint32_t age_ms;
} alox_TapEvent;
typedef struct _alox_TapSnapshotResponse {
pb_size_t events_count;
alox_TapEvent events[16];
} alox_TapSnapshotResponse;
/* * Host → master: one-shot read of subscribed cached slave data (no request body). */
typedef struct _alox_CacheStatusRequest {
char dummy_field;
} alox_CacheStatusRequest;
/* * Accel slice inside CACHE_STATUS (no client_id — use parent CacheClientStatus). */
typedef struct _alox_CacheClientAccel {
bool valid;
int32_t x;
int32_t y;
int32_t z;
uint32_t age_ms;
} alox_CacheClientAccel;
/* * Tap slice inside CACHE_STATUS; only present when a pending tap was consumed. */
typedef struct _alox_CacheClientTap {
alox_TapKind kind;
uint32_t age_ms;
} alox_CacheClientTap;
/* * One slave with accel and/or tap notify enabled; only subscribed fields are set. */
typedef struct _alox_CacheClientStatus {
uint32_t client_id;
bool has_accel;
alox_CacheClientAccel accel;
bool has_tap;
alox_CacheClientTap tap;
} alox_CacheClientStatus;
typedef struct _alox_CacheStatusResponse {
/* * Slaves with accel_stream_enabled. */
pb_size_t accel_count;
alox_AccelSample accel[16];
/* * Slaves with any tap notify flag; pending taps are consumed (like TAP_SNAPSHOT). */
pb_size_t taps_count;
alox_TapEvent taps[16];
/* * Slaves with accel_stream and/or tap notify; omitted fields are not subscribed. */
pb_size_t clients_count;
alox_CacheClientStatus clients[16];
} alox_CacheStatusResponse;
typedef struct _alox_EspNowUnicastTestRequest {
@@ -363,16 +363,12 @@ typedef struct _alox_UartMessage {
alox_EspNowFindMeResponse espnow_find_me_response;
alox_RestartRequest restart_request;
alox_RestartResponse restart_response;
alox_AccelSnapshotRequest accel_snapshot_request;
alox_AccelSnapshotResponse accel_snapshot_response;
alox_AccelStreamRequest accel_stream_request;
alox_AccelStreamResponse accel_stream_response;
alox_BatteryStatusRequest battery_status_request;
alox_BatteryStatusResponse battery_status_response;
alox_TapNotifyRequest tap_notify_request;
alox_TapNotifyResponse tap_notify_response;
alox_TapSnapshotRequest tap_snapshot_request;
alox_TapSnapshotResponse tap_snapshot_response;
alox_CacheStatusRequest cache_status_request;
alox_CacheStatusResponse cache_status_response;
} payload;
@@ -410,15 +406,15 @@ extern "C" {
#define alox_TapEvent_kind_ENUMTYPE alox_TapKind
#define alox_CacheClientTap_kind_ENUMTYPE alox_TapKind
@@ -453,16 +449,15 @@ extern "C" {
#define alox_LipoReading_init_default {0, 0}
#define alox_BatterySample_init_default {0, false, alox_LipoReading_init_default, false, alox_LipoReading_init_default, 0}
#define alox_BatteryStatusResponse_init_default {0, 0, {alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default, alox_BatterySample_init_default}}
#define alox_AccelSnapshotRequest_init_default {0}
#define alox_AccelSample_init_default {0, 0, 0, 0, 0, 0}
#define alox_AccelSnapshotResponse_init_default {0, {alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default}}
#define alox_TapNotifyRequest_init_default {0, 0, 0, 0, 0, 0}
#define alox_TapNotifyResponse_init_default {0, 0, 0, 0, 0, 0}
#define alox_TapSnapshotRequest_init_default {0}
#define alox_TapEvent_init_default {0, 0, _alox_TapKind_MIN, 0}
#define alox_TapSnapshotResponse_init_default {0, {alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default}}
#define alox_CacheStatusRequest_init_default {0}
#define alox_CacheStatusResponse_init_default {0, {alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default, alox_AccelSample_init_default}, 0, {alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default, alox_TapEvent_init_default}}
#define alox_CacheClientAccel_init_default {0, 0, 0, 0, 0}
#define alox_CacheClientTap_init_default {_alox_TapKind_MIN, 0}
#define alox_CacheClientStatus_init_default {0, false, alox_CacheClientAccel_init_default, false, alox_CacheClientTap_init_default}
#define alox_CacheStatusResponse_init_default {0, {alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default, alox_CacheClientStatus_init_default}}
#define alox_EspNowUnicastTestRequest_init_default {0, 0}
#define alox_EspNowUnicastTestResponse_init_default {0, 0}
#define alox_LedRingProgressRequest_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
@@ -494,16 +489,15 @@ extern "C" {
#define alox_LipoReading_init_zero {0, 0}
#define alox_BatterySample_init_zero {0, false, alox_LipoReading_init_zero, false, alox_LipoReading_init_zero, 0}
#define alox_BatteryStatusResponse_init_zero {0, 0, {alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero, alox_BatterySample_init_zero}}
#define alox_AccelSnapshotRequest_init_zero {0}
#define alox_AccelSample_init_zero {0, 0, 0, 0, 0, 0}
#define alox_AccelSnapshotResponse_init_zero {0, {alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero}}
#define alox_TapNotifyRequest_init_zero {0, 0, 0, 0, 0, 0}
#define alox_TapNotifyResponse_init_zero {0, 0, 0, 0, 0, 0}
#define alox_TapSnapshotRequest_init_zero {0}
#define alox_TapEvent_init_zero {0, 0, _alox_TapKind_MIN, 0}
#define alox_TapSnapshotResponse_init_zero {0, {alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero}}
#define alox_CacheStatusRequest_init_zero {0}
#define alox_CacheStatusResponse_init_zero {0, {alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero, alox_AccelSample_init_zero}, 0, {alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero, alox_TapEvent_init_zero}}
#define alox_CacheClientAccel_init_zero {0, 0, 0, 0, 0}
#define alox_CacheClientTap_init_zero {_alox_TapKind_MIN, 0}
#define alox_CacheClientStatus_init_zero {0, false, alox_CacheClientAccel_init_zero, false, alox_CacheClientTap_init_zero}
#define alox_CacheStatusResponse_init_zero {0, {alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero, alox_CacheClientStatus_init_zero}}
#define alox_EspNowUnicastTestRequest_init_zero {0, 0}
#define alox_EspNowUnicastTestResponse_init_zero {0, 0}
#define alox_LedRingProgressRequest_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
@@ -568,14 +562,12 @@ extern "C" {
#define alox_BatterySample_age_ms_tag 4
#define alox_BatteryStatusResponse_success_tag 1
#define alox_BatteryStatusResponse_samples_tag 2
#define alox_AccelSnapshotRequest_client_id_tag 1
#define alox_AccelSample_client_id_tag 1
#define alox_AccelSample_valid_tag 2
#define alox_AccelSample_x_tag 3
#define alox_AccelSample_y_tag 4
#define alox_AccelSample_z_tag 5
#define alox_AccelSample_age_ms_tag 6
#define alox_AccelSnapshotResponse_samples_tag 1
#define alox_TapNotifyRequest_write_tag 1
#define alox_TapNotifyRequest_client_id_tag 2
#define alox_TapNotifyRequest_all_clients_tag 3
@@ -588,14 +580,21 @@ extern "C" {
#define alox_TapNotifyResponse_single_tag 4
#define alox_TapNotifyResponse_double_tap_tag 5
#define alox_TapNotifyResponse_triple_tag 6
#define alox_TapSnapshotRequest_client_id_tag 1
#define alox_TapEvent_client_id_tag 1
#define alox_TapEvent_valid_tag 2
#define alox_TapEvent_kind_tag 3
#define alox_TapEvent_age_ms_tag 4
#define alox_TapSnapshotResponse_events_tag 1
#define alox_CacheStatusResponse_accel_tag 1
#define alox_CacheStatusResponse_taps_tag 2
#define alox_CacheClientAccel_valid_tag 1
#define alox_CacheClientAccel_x_tag 2
#define alox_CacheClientAccel_y_tag 3
#define alox_CacheClientAccel_z_tag 4
#define alox_CacheClientAccel_age_ms_tag 5
#define alox_CacheClientTap_kind_tag 1
#define alox_CacheClientTap_age_ms_tag 2
#define alox_CacheClientStatus_client_id_tag 1
#define alox_CacheClientStatus_accel_tag 2
#define alox_CacheClientStatus_tap_tag 3
#define alox_CacheStatusResponse_clients_tag 1
#define alox_EspNowUnicastTestRequest_client_id_tag 1
#define alox_EspNowUnicastTestRequest_seq_tag 2
#define alox_EspNowUnicastTestResponse_success_tag 1
@@ -664,16 +663,12 @@ extern "C" {
#define alox_UartMessage_espnow_find_me_response_tag 20
#define alox_UartMessage_restart_request_tag 21
#define alox_UartMessage_restart_response_tag 22
#define alox_UartMessage_accel_snapshot_request_tag 23
#define alox_UartMessage_accel_snapshot_response_tag 24
#define alox_UartMessage_accel_stream_request_tag 25
#define alox_UartMessage_accel_stream_response_tag 26
#define alox_UartMessage_battery_status_request_tag 27
#define alox_UartMessage_battery_status_response_tag 28
#define alox_UartMessage_tap_notify_request_tag 29
#define alox_UartMessage_tap_notify_response_tag 30
#define alox_UartMessage_tap_snapshot_request_tag 31
#define alox_UartMessage_tap_snapshot_response_tag 32
#define alox_UartMessage_cache_status_request_tag 33
#define alox_UartMessage_cache_status_response_tag 34
@@ -701,16 +696,12 @@ X(a, STATIC, ONEOF, MESSAGE, (payload,espnow_find_me_request,payload.espno
X(a, STATIC, ONEOF, MESSAGE, (payload,espnow_find_me_response,payload.espnow_find_me_response), 20) \
X(a, STATIC, ONEOF, MESSAGE, (payload,restart_request,payload.restart_request), 21) \
X(a, STATIC, ONEOF, MESSAGE, (payload,restart_response,payload.restart_response), 22) \
X(a, STATIC, ONEOF, MESSAGE, (payload,accel_snapshot_request,payload.accel_snapshot_request), 23) \
X(a, STATIC, ONEOF, MESSAGE, (payload,accel_snapshot_response,payload.accel_snapshot_response), 24) \
X(a, STATIC, ONEOF, MESSAGE, (payload,accel_stream_request,payload.accel_stream_request), 25) \
X(a, STATIC, ONEOF, MESSAGE, (payload,accel_stream_response,payload.accel_stream_response), 26) \
X(a, STATIC, ONEOF, MESSAGE, (payload,battery_status_request,payload.battery_status_request), 27) \
X(a, STATIC, ONEOF, MESSAGE, (payload,battery_status_response,payload.battery_status_response), 28) \
X(a, STATIC, ONEOF, MESSAGE, (payload,tap_notify_request,payload.tap_notify_request), 29) \
X(a, STATIC, ONEOF, MESSAGE, (payload,tap_notify_response,payload.tap_notify_response), 30) \
X(a, STATIC, ONEOF, MESSAGE, (payload,tap_snapshot_request,payload.tap_snapshot_request), 31) \
X(a, STATIC, ONEOF, MESSAGE, (payload,tap_snapshot_response,payload.tap_snapshot_response), 32) \
X(a, STATIC, ONEOF, MESSAGE, (payload,cache_status_request,payload.cache_status_request), 33) \
X(a, STATIC, ONEOF, MESSAGE, (payload,cache_status_response,payload.cache_status_response), 34)
#define alox_UartMessage_CALLBACK NULL
@@ -736,16 +727,12 @@ X(a, STATIC, ONEOF, MESSAGE, (payload,cache_status_response,payload.cache_
#define alox_UartMessage_payload_espnow_find_me_response_MSGTYPE alox_EspNowFindMeResponse
#define alox_UartMessage_payload_restart_request_MSGTYPE alox_RestartRequest
#define alox_UartMessage_payload_restart_response_MSGTYPE alox_RestartResponse
#define alox_UartMessage_payload_accel_snapshot_request_MSGTYPE alox_AccelSnapshotRequest
#define alox_UartMessage_payload_accel_snapshot_response_MSGTYPE alox_AccelSnapshotResponse
#define alox_UartMessage_payload_accel_stream_request_MSGTYPE alox_AccelStreamRequest
#define alox_UartMessage_payload_accel_stream_response_MSGTYPE alox_AccelStreamResponse
#define alox_UartMessage_payload_battery_status_request_MSGTYPE alox_BatteryStatusRequest
#define alox_UartMessage_payload_battery_status_response_MSGTYPE alox_BatteryStatusResponse
#define alox_UartMessage_payload_tap_notify_request_MSGTYPE alox_TapNotifyRequest
#define alox_UartMessage_payload_tap_notify_response_MSGTYPE alox_TapNotifyResponse
#define alox_UartMessage_payload_tap_snapshot_request_MSGTYPE alox_TapSnapshotRequest
#define alox_UartMessage_payload_tap_snapshot_response_MSGTYPE alox_TapSnapshotResponse
#define alox_UartMessage_payload_cache_status_request_MSGTYPE alox_CacheStatusRequest
#define alox_UartMessage_payload_cache_status_response_MSGTYPE alox_CacheStatusResponse
@@ -862,11 +849,6 @@ X(a, STATIC, REPEATED, MESSAGE, samples, 2)
#define alox_BatteryStatusResponse_DEFAULT NULL
#define alox_BatteryStatusResponse_samples_MSGTYPE alox_BatterySample
#define alox_AccelSnapshotRequest_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, client_id, 1)
#define alox_AccelSnapshotRequest_CALLBACK NULL
#define alox_AccelSnapshotRequest_DEFAULT NULL
#define alox_AccelSample_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, client_id, 1) \
X(a, STATIC, SINGULAR, BOOL, valid, 2) \
@@ -877,12 +859,6 @@ X(a, STATIC, SINGULAR, UINT32, age_ms, 6)
#define alox_AccelSample_CALLBACK NULL
#define alox_AccelSample_DEFAULT NULL
#define alox_AccelSnapshotResponse_FIELDLIST(X, a) \
X(a, STATIC, REPEATED, MESSAGE, samples, 1)
#define alox_AccelSnapshotResponse_CALLBACK NULL
#define alox_AccelSnapshotResponse_DEFAULT NULL
#define alox_AccelSnapshotResponse_samples_MSGTYPE alox_AccelSample
#define alox_TapNotifyRequest_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, BOOL, write, 1) \
X(a, STATIC, SINGULAR, UINT32, client_id, 2) \
@@ -903,11 +879,6 @@ X(a, STATIC, SINGULAR, BOOL, triple, 6)
#define alox_TapNotifyResponse_CALLBACK NULL
#define alox_TapNotifyResponse_DEFAULT NULL
#define alox_TapSnapshotRequest_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, client_id, 1)
#define alox_TapSnapshotRequest_CALLBACK NULL
#define alox_TapSnapshotRequest_DEFAULT NULL
#define alox_TapEvent_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, client_id, 1) \
X(a, STATIC, SINGULAR, BOOL, valid, 2) \
@@ -916,24 +887,40 @@ X(a, STATIC, SINGULAR, UINT32, age_ms, 4)
#define alox_TapEvent_CALLBACK NULL
#define alox_TapEvent_DEFAULT NULL
#define alox_TapSnapshotResponse_FIELDLIST(X, a) \
X(a, STATIC, REPEATED, MESSAGE, events, 1)
#define alox_TapSnapshotResponse_CALLBACK NULL
#define alox_TapSnapshotResponse_DEFAULT NULL
#define alox_TapSnapshotResponse_events_MSGTYPE alox_TapEvent
#define alox_CacheStatusRequest_FIELDLIST(X, a) \
#define alox_CacheStatusRequest_CALLBACK NULL
#define alox_CacheStatusRequest_DEFAULT NULL
#define alox_CacheClientAccel_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, BOOL, valid, 1) \
X(a, STATIC, SINGULAR, SINT32, x, 2) \
X(a, STATIC, SINGULAR, SINT32, y, 3) \
X(a, STATIC, SINGULAR, SINT32, z, 4) \
X(a, STATIC, SINGULAR, UINT32, age_ms, 5)
#define alox_CacheClientAccel_CALLBACK NULL
#define alox_CacheClientAccel_DEFAULT NULL
#define alox_CacheClientTap_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UENUM, kind, 1) \
X(a, STATIC, SINGULAR, UINT32, age_ms, 2)
#define alox_CacheClientTap_CALLBACK NULL
#define alox_CacheClientTap_DEFAULT NULL
#define alox_CacheClientStatus_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, client_id, 1) \
X(a, STATIC, OPTIONAL, MESSAGE, accel, 2) \
X(a, STATIC, OPTIONAL, MESSAGE, tap, 3)
#define alox_CacheClientStatus_CALLBACK NULL
#define alox_CacheClientStatus_DEFAULT NULL
#define alox_CacheClientStatus_accel_MSGTYPE alox_CacheClientAccel
#define alox_CacheClientStatus_tap_MSGTYPE alox_CacheClientTap
#define alox_CacheStatusResponse_FIELDLIST(X, a) \
X(a, STATIC, REPEATED, MESSAGE, accel, 1) \
X(a, STATIC, REPEATED, MESSAGE, taps, 2)
X(a, STATIC, REPEATED, MESSAGE, clients, 1)
#define alox_CacheStatusResponse_CALLBACK NULL
#define alox_CacheStatusResponse_DEFAULT NULL
#define alox_CacheStatusResponse_accel_MSGTYPE alox_AccelSample
#define alox_CacheStatusResponse_taps_MSGTYPE alox_TapEvent
#define alox_CacheStatusResponse_clients_MSGTYPE alox_CacheClientStatus
#define alox_EspNowUnicastTestRequest_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, client_id, 1) \
@@ -1059,15 +1046,14 @@ extern const pb_msgdesc_t alox_BatteryStatusRequest_msg;
extern const pb_msgdesc_t alox_LipoReading_msg;
extern const pb_msgdesc_t alox_BatterySample_msg;
extern const pb_msgdesc_t alox_BatteryStatusResponse_msg;
extern const pb_msgdesc_t alox_AccelSnapshotRequest_msg;
extern const pb_msgdesc_t alox_AccelSample_msg;
extern const pb_msgdesc_t alox_AccelSnapshotResponse_msg;
extern const pb_msgdesc_t alox_TapNotifyRequest_msg;
extern const pb_msgdesc_t alox_TapNotifyResponse_msg;
extern const pb_msgdesc_t alox_TapSnapshotRequest_msg;
extern const pb_msgdesc_t alox_TapEvent_msg;
extern const pb_msgdesc_t alox_TapSnapshotResponse_msg;
extern const pb_msgdesc_t alox_CacheStatusRequest_msg;
extern const pb_msgdesc_t alox_CacheClientAccel_msg;
extern const pb_msgdesc_t alox_CacheClientTap_msg;
extern const pb_msgdesc_t alox_CacheClientStatus_msg;
extern const pb_msgdesc_t alox_CacheStatusResponse_msg;
extern const pb_msgdesc_t alox_EspNowUnicastTestRequest_msg;
extern const pb_msgdesc_t alox_EspNowUnicastTestResponse_msg;
@@ -1102,15 +1088,14 @@ extern const pb_msgdesc_t alox_OtaSlaveProgressResponse_msg;
#define alox_LipoReading_fields &alox_LipoReading_msg
#define alox_BatterySample_fields &alox_BatterySample_msg
#define alox_BatteryStatusResponse_fields &alox_BatteryStatusResponse_msg
#define alox_AccelSnapshotRequest_fields &alox_AccelSnapshotRequest_msg
#define alox_AccelSample_fields &alox_AccelSample_msg
#define alox_AccelSnapshotResponse_fields &alox_AccelSnapshotResponse_msg
#define alox_TapNotifyRequest_fields &alox_TapNotifyRequest_msg
#define alox_TapNotifyResponse_fields &alox_TapNotifyResponse_msg
#define alox_TapSnapshotRequest_fields &alox_TapSnapshotRequest_msg
#define alox_TapEvent_fields &alox_TapEvent_msg
#define alox_TapSnapshotResponse_fields &alox_TapSnapshotResponse_msg
#define alox_CacheStatusRequest_fields &alox_CacheStatusRequest_msg
#define alox_CacheClientAccel_fields &alox_CacheClientAccel_msg
#define alox_CacheClientTap_fields &alox_CacheClientTap_msg
#define alox_CacheClientStatus_fields &alox_CacheClientStatus_msg
#define alox_CacheStatusResponse_fields &alox_CacheStatusResponse_msg
#define alox_EspNowUnicastTestRequest_fields &alox_EspNowUnicastTestRequest_msg
#define alox_EspNowUnicastTestResponse_fields &alox_EspNowUnicastTestResponse_msg
@@ -1139,16 +1124,17 @@ extern const pb_msgdesc_t alox_OtaSlaveProgressResponse_msg;
#define alox_AccelDeadzoneRequest_size 16
#define alox_AccelDeadzoneResponse_size 20
#define alox_AccelSample_size 32
#define alox_AccelSnapshotRequest_size 6
#define alox_AccelSnapshotResponse_size 544
#define alox_AccelStreamRequest_size 12
#define alox_AccelStreamResponse_size 16
#define alox_Ack_size 0
#define alox_BatterySample_size 32
#define alox_BatteryStatusRequest_size 8
#define alox_BatteryStatusResponse_size 580
#define alox_CacheClientAccel_size 26
#define alox_CacheClientStatus_size 44
#define alox_CacheClientTap_size 8
#define alox_CacheStatusRequest_size 0
#define alox_CacheStatusResponse_size 832
#define alox_CacheStatusResponse_size 736
#define alox_ClientInput_size 22
#define alox_EspNowFindMeRequest_size 6
#define alox_EspNowFindMeResponse_size 8
@@ -1169,8 +1155,6 @@ extern const pb_msgdesc_t alox_OtaSlaveProgressResponse_msg;
#define alox_TapEvent_size 16
#define alox_TapNotifyRequest_size 16
#define alox_TapNotifyResponse_size 20
#define alox_TapSnapshotRequest_size 6
#define alox_TapSnapshotResponse_size 288
#ifdef __cplusplus
} /* extern "C" */
+28 -29
View File
@@ -22,11 +22,11 @@ enum MessageType {
OTA_SLAVE_PROGRESS = 21;
FIND_ME = 22;
RESTART = 23;
ACCEL_SNAPSHOT = 24;
reserved 24;
ACCEL_STREAM = 25;
BATTERY_STATUS = 26;
TAP_NOTIFY = 27;
TAP_SNAPSHOT = 28;
reserved 28;
/** Combined cached accel + tap poll (one UART round-trip, ~16 ms cadence). */
CACHE_STATUS = 29;
}
@@ -55,16 +55,12 @@ message UartMessage {
EspNowFindMeResponse espnow_find_me_response = 20;
RestartRequest restart_request = 21;
RestartResponse restart_response = 22;
AccelSnapshotRequest accel_snapshot_request = 23;
AccelSnapshotResponse accel_snapshot_response = 24;
AccelStreamRequest accel_stream_request = 25;
AccelStreamResponse accel_stream_response = 26;
BatteryStatusRequest battery_status_request = 27;
BatteryStatusResponse battery_status_response = 28;
TapNotifyRequest tap_notify_request = 29;
TapNotifyResponse tap_notify_response = 30;
TapSnapshotRequest tap_snapshot_request = 31;
TapSnapshotResponse tap_snapshot_response = 32;
CacheStatusRequest cache_status_request = 33;
CacheStatusResponse cache_status_response = 34;
}
@@ -174,12 +170,7 @@ message BatteryStatusResponse {
repeated BatterySample samples = 2 [(nanopb).max_count = 17];
}
// Host → master: read cached accel samples from slaves (only while stream enabled).
// client_id 0 = all registered slaves; otherwise one slave.
message AccelSnapshotRequest {
uint32 client_id = 1;
}
/** Legacy host-side sample shape (dashboard helpers); use CACHE_STATUS on the wire. */
message AccelSample {
uint32 client_id = 1;
bool valid = 2;
@@ -190,10 +181,6 @@ message AccelSample {
uint32 age_ms = 6;
}
message AccelSnapshotResponse {
repeated AccelSample samples = 1 [(nanopb).max_count = 16];
}
/** Host → master: enable/disable tap ESP-NOW notify per slave (single/double/triple). */
message TapNotifyRequest {
bool write = 1;
@@ -220,11 +207,7 @@ enum TapKind {
TAP_TRIPLE = 3;
}
/** Host → master: read cached tap events (discarded after reply or when age > 16 ms). */
message TapSnapshotRequest {
uint32 client_id = 1;
}
/** Legacy tap event shape (dashboard helpers); use CACHE_STATUS on the wire. */
message TapEvent {
uint32 client_id = 1;
bool valid = 2;
@@ -232,18 +215,34 @@ message TapEvent {
uint32 age_ms = 4;
}
message TapSnapshotResponse {
repeated TapEvent events = 1 [(nanopb).max_count = 16];
}
/** Host → master: one-shot read of subscribed cached slave data (no request body). */
message CacheStatusRequest {}
/** Accel slice inside CACHE_STATUS (no client_id — use parent CacheClientStatus). */
message CacheClientAccel {
bool valid = 1;
sint32 x = 2;
sint32 y = 3;
sint32 z = 4;
uint32 age_ms = 5;
}
/** Tap slice inside CACHE_STATUS; only present when a pending tap was consumed. */
message CacheClientTap {
TapKind kind = 1;
uint32 age_ms = 2;
}
/** One slave with accel and/or tap notify enabled; only subscribed fields are set. */
message CacheClientStatus {
uint32 client_id = 1;
CacheClientAccel accel = 2;
CacheClientTap tap = 3;
}
message CacheStatusResponse {
/** Slaves with accel_stream_enabled. */
repeated AccelSample accel = 1 [(nanopb).max_count = 16];
/** Slaves with any tap notify flag; pending taps are consumed (like TAP_SNAPSHOT). */
repeated TapEvent taps = 2 [(nanopb).max_count = 16];
/** Slaves with accel_stream and/or tap notify; omitted fields are not subscribed. */
repeated CacheClientStatus clients = 1 [(nanopb).max_count = 16];
}
message EspNowUnicastTestRequest {