append esp timestamp and measurement ID to all START messages

This commit is contained in:
jess 2026-04-03 07:01:30 -07:00
parent bb894b42be
commit 80dc8ef561
3 changed files with 58 additions and 21 deletions

View File

@ -12,9 +12,11 @@
#include "nvs_flash.h" #include "nvs_flash.h"
#include "esp_netif.h" #include "esp_netif.h"
#include "esp_event.h" #include "esp_event.h"
#include "esp_timer.h"
#define AD5941_EXPECTED_ADIID 0x4144 #define AD5941_EXPECTED_ADIID 0x4144
static EISConfig cfg; static EISConfig cfg;
static uint16_t measurement_counter = 0;
static EISPoint results[EIS_MAX_POINTS]; static EISPoint results[EIS_MAX_POINTS];
static LSVPoint lsv_results[ECHEM_MAX_POINTS]; static LSVPoint lsv_results[ECHEM_MAX_POINTS];
static AmpPoint amp_results[ECHEM_MAX_POINTS]; static AmpPoint amp_results[ECHEM_MAX_POINTS];
@ -25,8 +27,10 @@ static void do_sweep(void)
{ {
eis_init(&cfg); eis_init(&cfg);
uint32_t ts_ms = (uint32_t)(esp_timer_get_time() / 1000);
measurement_counter++;
uint32_t n = eis_calc_num_points(&cfg); uint32_t n = eis_calc_num_points(&cfg);
send_sweep_start(n, cfg.freq_start_hz, cfg.freq_stop_hz); send_sweep_start(n, cfg.freq_start_hz, cfg.freq_stop_hz, ts_ms, measurement_counter);
int got = eis_sweep(results, n, send_eis_point); int got = eis_sweep(results, n, send_eis_point);
printf("Sweep complete: %d points\n", got); printf("Sweep complete: %d points\n", got);
send_sweep_end(); send_sweep_end();
@ -132,8 +136,10 @@ void app_main(void)
lsv_cfg.v_start, lsv_cfg.v_stop, lsv_cfg.scan_rate, lsv_cfg.lp_rtia, lsv_cfg.v_start, lsv_cfg.v_stop, lsv_cfg.scan_rate, lsv_cfg.lp_rtia,
(unsigned long)max_pts); (unsigned long)max_pts);
uint32_t ts_ms = (uint32_t)(esp_timer_get_time() / 1000);
measurement_counter++;
uint32_t n = echem_lsv_calc_steps(&lsv_cfg, max_pts); 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, ts_ms, measurement_counter);
int got = echem_lsv(&lsv_cfg, lsv_results, max_pts, 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();
@ -149,7 +155,11 @@ void app_main(void)
printf("Amp: %.0f mV, %.0f ms interval, %.0f s\n", printf("Amp: %.0f mV, %.0f ms interval, %.0f s\n",
amp_cfg.v_hold, amp_cfg.interval_ms, amp_cfg.duration_s); amp_cfg.v_hold, amp_cfg.interval_ms, amp_cfg.duration_s);
send_amp_start(amp_cfg.v_hold); {
uint32_t ts_ms = (uint32_t)(esp_timer_get_time() / 1000);
measurement_counter++;
send_amp_start(amp_cfg.v_hold, ts_ms, measurement_counter);
}
int got = echem_amp(&amp_cfg, amp_results, ECHEM_MAX_POINTS, send_amp_point); int got = echem_amp(&amp_cfg, amp_results, ECHEM_MAX_POINTS, send_amp_point);
printf("Amp complete: %d points\n", got); printf("Amp complete: %d points\n", got);
send_amp_end(); send_amp_end();
@ -171,7 +181,12 @@ void app_main(void)
echem_ph_ocp(&ph_cfg, &ph_result); echem_ph_ocp(&ph_cfg, &ph_result);
printf("pH: OCP=%.1f mV, pH=%.2f\n", printf("pH: OCP=%.1f mV, pH=%.2f\n",
ph_result.v_ocp_mv, ph_result.ph); ph_result.v_ocp_mv, ph_result.ph);
send_ph_result(ph_result.v_ocp_mv, ph_result.ph, ph_result.temp_c); {
uint32_t ts_ms = (uint32_t)(esp_timer_get_time() / 1000);
measurement_counter++;
send_ph_result(ph_result.v_ocp_mv, ph_result.ph, ph_result.temp_c,
ts_ms, measurement_counter);
}
break; break;
} }
@ -197,8 +212,10 @@ void app_main(void)
case CMD_OPEN_CAL: { case CMD_OPEN_CAL: {
printf("Open-circuit cal starting\n"); printf("Open-circuit cal starting\n");
eis_init(&cfg); eis_init(&cfg);
uint32_t ts_ms = (uint32_t)(esp_timer_get_time() / 1000);
measurement_counter++;
uint32_t n = eis_calc_num_points(&cfg); uint32_t n = eis_calc_num_points(&cfg);
send_sweep_start(n, cfg.freq_start_hz, cfg.freq_stop_hz); send_sweep_start(n, cfg.freq_start_hz, cfg.freq_stop_hz, ts_ms, measurement_counter);
int got = eis_open_cal(results, n, send_eis_point); int got = eis_open_cal(results, n, send_eis_point);
printf("Open-circuit cal: %d points\n", got); printf("Open-circuit cal: %d points\n", got);
send_sweep_end(); send_sweep_end();
@ -252,7 +269,11 @@ void app_main(void)
uint32_t n_per = (uint32_t)(cl_cfg.t_meas_ms / 50.0f + 0.5f); uint32_t n_per = (uint32_t)(cl_cfg.t_meas_ms / 50.0f + 0.5f);
if (n_per < 2) n_per = 2; if (n_per < 2) n_per = 2;
send_cl_start(2 * n_per); {
uint32_t ts_ms = (uint32_t)(esp_timer_get_time() / 1000);
measurement_counter++;
send_cl_start(2 * n_per, ts_ms, measurement_counter);
}
ClResult cl_result; ClResult cl_result;
int got = echem_chlorine(&cl_cfg, cl_results, ECHEM_MAX_POINTS, int got = echem_chlorine(&cl_cfg, cl_results, ECHEM_MAX_POINTS,
&cl_result, send_cl_point); &cl_result, send_cl_point);

View File

@ -177,14 +177,17 @@ int send_keepalive(void)
/* ---- outbound: EIS ---- */ /* ---- outbound: EIS ---- */
int send_sweep_start(uint32_t num_points, float freq_start, float freq_stop) int send_sweep_start(uint32_t num_points, float freq_start, float freq_stop,
uint32_t ts_ms, uint16_t meas_id)
{ {
uint8_t sx[20]; uint8_t sx[28];
uint16_t p = 0; uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_SWEEP_START; sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_SWEEP_START;
encode_u16((uint16_t)num_points, &sx[p]); p += 3; encode_u16((uint16_t)num_points, &sx[p]); p += 3;
encode_float(freq_start, &sx[p]); p += 5; encode_float(freq_start, &sx[p]); p += 5;
encode_float(freq_stop, &sx[p]); p += 5; encode_float(freq_stop, &sx[p]); p += 5;
encode_u32(ts_ms, &sx[p]); p += 5;
encode_u16(meas_id, &sx[p]); p += 3;
sx[p++] = 0xF7; sx[p++] = 0xF7;
return send_sysex(sx, p); return send_sysex(sx, p);
} }
@ -232,14 +235,17 @@ int send_config(const EISConfig *cfg)
/* ---- outbound: LSV ---- */ /* ---- outbound: LSV ---- */
int send_lsv_start(uint32_t num_points, float v_start, float v_stop) int send_lsv_start(uint32_t num_points, float v_start, float v_stop,
uint32_t ts_ms, uint16_t meas_id)
{ {
uint8_t sx[20]; uint8_t sx[28];
uint16_t p = 0; uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_LSV_START; sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_LSV_START;
encode_u16((uint16_t)num_points, &sx[p]); p += 3; encode_u16((uint16_t)num_points, &sx[p]); p += 3;
encode_float(v_start, &sx[p]); p += 5; encode_float(v_start, &sx[p]); p += 5;
encode_float(v_stop, &sx[p]); p += 5; encode_float(v_stop, &sx[p]); p += 5;
encode_u32(ts_ms, &sx[p]); p += 5;
encode_u16(meas_id, &sx[p]); p += 3;
sx[p++] = 0xF7; sx[p++] = 0xF7;
return send_sysex(sx, p); return send_sysex(sx, p);
} }
@ -264,12 +270,14 @@ int send_lsv_end(void)
/* ---- outbound: Amperometry ---- */ /* ---- outbound: Amperometry ---- */
int send_amp_start(float v_hold) int send_amp_start(float v_hold, uint32_t ts_ms, uint16_t meas_id)
{ {
uint8_t sx[12]; uint8_t sx[20];
uint16_t p = 0; uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_AMP_START; sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_AMP_START;
encode_float(v_hold, &sx[p]); p += 5; encode_float(v_hold, &sx[p]); p += 5;
encode_u32(ts_ms, &sx[p]); p += 5;
encode_u16(meas_id, &sx[p]); p += 3;
sx[p++] = 0xF7; sx[p++] = 0xF7;
return send_sysex(sx, p); return send_sysex(sx, p);
} }
@ -294,12 +302,14 @@ int send_amp_end(void)
/* ---- outbound: Chlorine ---- */ /* ---- outbound: Chlorine ---- */
int send_cl_start(uint32_t num_points) int send_cl_start(uint32_t num_points, uint32_t ts_ms, uint16_t meas_id)
{ {
uint8_t sx[10]; uint8_t sx[18];
uint16_t p = 0; uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_CL_START; sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_CL_START;
encode_u16((uint16_t)num_points, &sx[p]); p += 3; encode_u16((uint16_t)num_points, &sx[p]); p += 3;
encode_u32(ts_ms, &sx[p]); p += 5;
encode_u16(meas_id, &sx[p]); p += 3;
sx[p++] = 0xF7; sx[p++] = 0xF7;
return send_sysex(sx, p); return send_sysex(sx, p);
} }
@ -349,14 +359,17 @@ int send_ph_cal(float slope, float offset)
/* ---- outbound: pH ---- */ /* ---- outbound: pH ---- */
int send_ph_result(float v_ocp_mv, float ph, float temp_c) int send_ph_result(float v_ocp_mv, float ph, float temp_c,
uint32_t ts_ms, uint16_t meas_id)
{ {
uint8_t sx[20]; uint8_t sx[28];
uint16_t p = 0; uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_PH_RESULT; sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_PH_RESULT;
encode_float(v_ocp_mv, &sx[p]); p += 5; encode_float(v_ocp_mv, &sx[p]); p += 5;
encode_float(ph, &sx[p]); p += 5; encode_float(ph, &sx[p]); p += 5;
encode_float(temp_c, &sx[p]); p += 5; encode_float(temp_c, &sx[p]); p += 5;
encode_u32(ts_ms, &sx[p]); p += 5;
encode_u16(meas_id, &sx[p]); p += 3;
sx[p++] = 0xF7; sx[p++] = 0xF7;
return send_sysex(sx, p); return send_sysex(sx, p);
} }

View File

@ -113,29 +113,32 @@ float decode_float(const uint8_t *d);
uint16_t decode_u16(const uint8_t *d); uint16_t decode_u16(const uint8_t *d);
/* outbound: EIS */ /* outbound: EIS */
int send_sweep_start(uint32_t num_points, float freq_start, float freq_stop); int send_sweep_start(uint32_t num_points, float freq_start, float freq_stop,
uint32_t ts_ms, uint16_t meas_id);
int send_eis_point(uint16_t index, const EISPoint *pt); int send_eis_point(uint16_t index, const EISPoint *pt);
int send_sweep_end(void); int send_sweep_end(void);
int send_config(const EISConfig *cfg); int send_config(const EISConfig *cfg);
/* outbound: LSV */ /* outbound: LSV */
int send_lsv_start(uint32_t num_points, float v_start, float v_stop); int send_lsv_start(uint32_t num_points, float v_start, float v_stop,
uint32_t ts_ms, uint16_t meas_id);
int send_lsv_point(uint16_t index, float v_mv, float i_ua); int send_lsv_point(uint16_t index, float v_mv, float i_ua);
int send_lsv_end(void); int send_lsv_end(void);
/* outbound: Amperometry */ /* outbound: Amperometry */
int send_amp_start(float v_hold); int send_amp_start(float v_hold, uint32_t ts_ms, uint16_t meas_id);
int send_amp_point(uint16_t index, float t_ms, float i_ua); int send_amp_point(uint16_t index, float t_ms, float i_ua);
int send_amp_end(void); int send_amp_end(void);
/* outbound: Chlorine */ /* outbound: Chlorine */
int send_cl_start(uint32_t num_points); int send_cl_start(uint32_t num_points, uint32_t ts_ms, uint16_t meas_id);
int send_cl_point(uint16_t index, float t_ms, float i_ua, uint8_t phase); int send_cl_point(uint16_t index, float t_ms, float i_ua, uint8_t phase);
int send_cl_result(float i_free_ua, float i_total_ua); int send_cl_result(float i_free_ua, float i_total_ua);
int send_cl_end(void); int send_cl_end(void);
/* outbound: pH */ /* outbound: pH */
int send_ph_result(float v_ocp_mv, float ph, float temp_c); int send_ph_result(float v_ocp_mv, float ph, float temp_c,
uint32_t ts_ms, uint16_t meas_id);
/* outbound: temperature */ /* outbound: temperature */
int send_temp(float temp_c); int send_temp(float temp_c);