0 firmware: add num_points parameter to CMD_START_LSV protocol
This commit is contained in:
parent
8e1153585b
commit
a21b014d89
12
main/eis4.c
12
main/eis4.c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue