From a21b014d89a63757d3e5b4d8a4a99a45e848f8fe Mon Sep 17 00:00:00 2001 From: jess Date: Thu, 2 Apr 2026 23:07:29 -0700 Subject: [PATCH] 0 firmware: add num_points parameter to CMD_START_LSV protocol --- main/eis4.c | 12 ++++++++---- main/protocol.h | 2 +- main/wifi_transport.c | 28 +++------------------------- 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/main/eis4.c b/main/eis4.c index a502119..22bd4fb 100644 --- a/main/eis4.c +++ b/main/eis4.c @@ -125,12 +125,16 @@ void app_main(void) lsv_cfg.v_stop = cmd.lsv.v_stop; lsv_cfg.scan_rate = cmd.lsv.scan_rate; lsv_cfg.lp_rtia = cmd.lsv.lp_rtia; - printf("LSV: %.0f-%.0f mV, %.0f mV/s, rtia=%u\n", - lsv_cfg.v_start, lsv_cfg.v_stop, lsv_cfg.scan_rate, lsv_cfg.lp_rtia); + uint32_t max_pts = ECHEM_MAX_POINTS; + if (cmd.lsv.num_points > 0 && cmd.lsv.num_points < ECHEM_MAX_POINTS) + max_pts = cmd.lsv.num_points; + printf("LSV: %.0f-%.0f mV, %.0f mV/s, rtia=%u, max_pts=%lu\n", + lsv_cfg.v_start, lsv_cfg.v_stop, lsv_cfg.scan_rate, lsv_cfg.lp_rtia, + (unsigned long)max_pts); - uint32_t n = echem_lsv_calc_steps(&lsv_cfg, ECHEM_MAX_POINTS); + uint32_t n = echem_lsv_calc_steps(&lsv_cfg, max_pts); send_lsv_start(n, lsv_cfg.v_start, lsv_cfg.v_stop); - int got = echem_lsv(&lsv_cfg, lsv_results, ECHEM_MAX_POINTS, send_lsv_point); + int got = echem_lsv(&lsv_cfg, lsv_results, max_pts, send_lsv_point); printf("LSV complete: %d points\n", got); send_lsv_end(); break; diff --git a/main/protocol.h b/main/protocol.h index 59308f7..fa57d3c 100644 --- a/main/protocol.h +++ b/main/protocol.h @@ -81,7 +81,7 @@ typedef struct { uint8_t rtia; uint8_t rcal; uint8_t electrode; - struct { float v_start, v_stop, scan_rate; uint8_t lp_rtia; } lsv; + struct { float v_start, v_stop, scan_rate; uint8_t lp_rtia; uint16_t num_points; } lsv; struct { float v_hold, interval_ms, duration_s; uint8_t lp_rtia; } amp; struct { float v_cond, t_cond_ms, v_free, v_total, t_dep_ms, t_meas_ms; uint8_t lp_rtia; } cl; struct { float stabilize_s; } ph; diff --git a/main/wifi_transport.c b/main/wifi_transport.c index 3bb56e3..277e995 100644 --- a/main/wifi_transport.c +++ b/main/wifi_transport.c @@ -19,14 +19,11 @@ #define UDP_PORT 5941 #define UDP_BUF_SIZE 128 #define MAX_UDP_CLIENTS 10 -#define CLIENT_TIMEOUT_MS 30000 - static int udp_sock = -1; static esp_netif_t *ap_netif; static struct { struct sockaddr_in addr; - TickType_t last_seen; uint8_t mac[6]; bool active; } clients[MAX_UDP_CLIENTS]; @@ -35,19 +32,14 @@ static int client_count; static void client_touch(const struct sockaddr_in *addr) { - TickType_t now = xTaskGetTickCount(); - for (int i = 0; i < client_count; i++) { if (clients[i].addr.sin_addr.s_addr == addr->sin_addr.s_addr && - clients[i].addr.sin_port == addr->sin_port) { - clients[i].last_seen = now; + clients[i].addr.sin_port == addr->sin_port) return; - } } if (client_count < MAX_UDP_CLIENTS) { clients[client_count].addr = *addr; - clients[client_count].last_seen = now; clients[client_count].active = true; memset(clients[client_count].mac, 0, 6); @@ -68,21 +60,6 @@ static void client_touch(const struct sockaddr_in *addr) } } -static void clients_expire(void) -{ - TickType_t now = xTaskGetTickCount(); - TickType_t timeout = pdMS_TO_TICKS(CLIENT_TIMEOUT_MS); - - for (int i = 0; i < client_count; ) { - if ((now - clients[i].last_seen) > timeout) { - clients[i] = clients[--client_count]; - printf("UDP: client expired (%d/%d)\n", client_count, MAX_UDP_CLIENTS); - } else { - i++; - } - } -} - static void client_remove_by_mac(const uint8_t *mac) { for (int i = 0; i < client_count; ) { @@ -135,6 +112,8 @@ static void parse_udp_sysex(const uint8_t *data, uint16_t len) cmd.lsv.v_stop = decode_float(&data[8]); cmd.lsv.scan_rate = decode_float(&data[13]); cmd.lsv.lp_rtia = data[18]; + if (len >= 22) + cmd.lsv.num_points = decode_u16(&data[19]); break; case CMD_START_AMP: if (len < 19) return; @@ -231,7 +210,6 @@ static void udp_rx_task(void *param) if (n <= 0) continue; client_touch(&src); - clients_expire(); parse_udp_sysex(buf, (uint16_t)n); } }