0 firmware: add num_points parameter to CMD_START_LSV protocol

This commit is contained in:
jess 2026-04-02 23:07:29 -07:00
parent 8e1153585b
commit a21b014d89
3 changed files with 12 additions and 30 deletions

View File

@ -125,12 +125,16 @@ void app_main(void)
lsv_cfg.v_stop = cmd.lsv.v_stop; lsv_cfg.v_stop = cmd.lsv.v_stop;
lsv_cfg.scan_rate = cmd.lsv.scan_rate; lsv_cfg.scan_rate = cmd.lsv.scan_rate;
lsv_cfg.lp_rtia = cmd.lsv.lp_rtia; lsv_cfg.lp_rtia = cmd.lsv.lp_rtia;
printf("LSV: %.0f-%.0f mV, %.0f mV/s, rtia=%u\n", uint32_t max_pts = ECHEM_MAX_POINTS;
lsv_cfg.v_start, lsv_cfg.v_stop, lsv_cfg.scan_rate, lsv_cfg.lp_rtia); 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); 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); printf("LSV complete: %d points\n", got);
send_lsv_end(); send_lsv_end();
break; break;

View File

@ -81,7 +81,7 @@ typedef struct {
uint8_t rtia; uint8_t rtia;
uint8_t rcal; uint8_t rcal;
uint8_t electrode; 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_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 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; struct { float stabilize_s; } ph;

View File

@ -19,14 +19,11 @@
#define UDP_PORT 5941 #define UDP_PORT 5941
#define UDP_BUF_SIZE 128 #define UDP_BUF_SIZE 128
#define MAX_UDP_CLIENTS 10 #define MAX_UDP_CLIENTS 10
#define CLIENT_TIMEOUT_MS 30000
static int udp_sock = -1; static int udp_sock = -1;
static esp_netif_t *ap_netif; static esp_netif_t *ap_netif;
static struct { static struct {
struct sockaddr_in addr; struct sockaddr_in addr;
TickType_t last_seen;
uint8_t mac[6]; uint8_t mac[6];
bool active; bool active;
} clients[MAX_UDP_CLIENTS]; } clients[MAX_UDP_CLIENTS];
@ -35,19 +32,14 @@ static int client_count;
static void client_touch(const struct sockaddr_in *addr) static void client_touch(const struct sockaddr_in *addr)
{ {
TickType_t now = xTaskGetTickCount();
for (int i = 0; i < client_count; i++) { for (int i = 0; i < client_count; i++) {
if (clients[i].addr.sin_addr.s_addr == addr->sin_addr.s_addr && if (clients[i].addr.sin_addr.s_addr == addr->sin_addr.s_addr &&
clients[i].addr.sin_port == addr->sin_port) { clients[i].addr.sin_port == addr->sin_port)
clients[i].last_seen = now;
return; return;
}
} }
if (client_count < MAX_UDP_CLIENTS) { if (client_count < MAX_UDP_CLIENTS) {
clients[client_count].addr = *addr; clients[client_count].addr = *addr;
clients[client_count].last_seen = now;
clients[client_count].active = true; clients[client_count].active = true;
memset(clients[client_count].mac, 0, 6); 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) static void client_remove_by_mac(const uint8_t *mac)
{ {
for (int i = 0; i < client_count; ) { 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.v_stop = decode_float(&data[8]);
cmd.lsv.scan_rate = decode_float(&data[13]); cmd.lsv.scan_rate = decode_float(&data[13]);
cmd.lsv.lp_rtia = data[18]; cmd.lsv.lp_rtia = data[18];
if (len >= 22)
cmd.lsv.num_points = decode_u16(&data[19]);
break; break;
case CMD_START_AMP: case CMD_START_AMP:
if (len < 19) return; if (len < 19) return;
@ -231,7 +210,6 @@ static void udp_rx_task(void *param)
if (n <= 0) continue; if (n <= 0) continue;
client_touch(&src); client_touch(&src);
clients_expire();
parse_udp_sysex(buf, (uint16_t)n); parse_udp_sysex(buf, (uint16_t)n);
} }
} }