diff --git a/main/echem.c b/main/echem.c index cb20334..964029f 100644 --- a/main/echem.c +++ b/main/echem.c @@ -327,7 +327,14 @@ int echem_clean(float v_mv, float duration_s) AD5940_LPDAC0WriteS(code, VZERO_CODE); printf("Clean: %.0f mV for %.0f s\n", v_mv, duration_s); - vTaskDelay(pdMS_TO_TICKS((uint32_t)(duration_s * 1000.0f))); + + uint32_t remain_ms = (uint32_t)(duration_s * 1000.0f); + while (remain_ms > 0) { + uint32_t chunk = remain_ms > 3000 ? 3000 : remain_ms; + vTaskDelay(pdMS_TO_TICKS(chunk)); + remain_ms -= chunk; + if (remain_ms > 0) send_keepalive(); + } echem_shutdown_lp(); AD5940_AFECtrlS(AFECTRL_ALL, bFALSE); @@ -497,7 +504,15 @@ static uint32_t sample_phase(float v_mv, float t_dep_ms, float t_meas_ms, AD5940_LPDAC0WriteS(mv_to_vbias_code(v_mv), VZERO_CODE); /* settling — no samples recorded */ - vTaskDelay(pdMS_TO_TICKS((uint32_t)t_dep_ms)); + { + uint32_t remain_ms = (uint32_t)t_dep_ms; + while (remain_ms > 0) { + uint32_t chunk = remain_ms > 3000 ? 3000 : remain_ms; + vTaskDelay(pdMS_TO_TICKS(chunk)); + remain_ms -= chunk; + if (remain_ms > 0) send_keepalive(); + } + } /* measurement — sample at ~50ms intervals */ uint32_t n_samples = (uint32_t)(t_meas_ms / 50.0f + 0.5f); @@ -541,7 +556,15 @@ int echem_chlorine(const ClConfig *cfg, ClPoint *out, uint32_t max_points, printf("Cl: conditioning at %.0f mV for %.0f ms\n", cfg->v_cond, cfg->t_cond_ms); AD5940_LPDAC0WriteS(mv_to_vbias_code(cfg->v_cond), VZERO_CODE); - vTaskDelay(pdMS_TO_TICKS((uint32_t)cfg->t_cond_ms)); + { + uint32_t remain_ms = (uint32_t)cfg->t_cond_ms; + while (remain_ms > 0) { + uint32_t chunk = remain_ms > 3000 ? 3000 : remain_ms; + vTaskDelay(pdMS_TO_TICKS(chunk)); + remain_ms -= chunk; + if (remain_ms > 0) send_keepalive(); + } + } printf("Cl: free chlorine at %.0f mV\n", cfg->v_free); idx = sample_phase(cfg->v_free, cfg->t_dep_ms, cfg->t_meas_ms, @@ -579,7 +602,14 @@ int echem_ph_ocp(const PhConfig *cfg, PhResult *result) AD5940_ADCBaseCfgS(&adc); printf("pH: stabilizing %0.f s\n", cfg->stabilize_s); - vTaskDelay(pdMS_TO_TICKS((uint32_t)(cfg->stabilize_s * 1000.0f))); + + uint32_t remain_ms = (uint32_t)(cfg->stabilize_s * 1000.0f); + while (remain_ms > 0) { + uint32_t chunk = remain_ms > 3000 ? 3000 : remain_ms; + vTaskDelay(pdMS_TO_TICKS(chunk)); + remain_ms -= chunk; + if (remain_ms > 0) send_keepalive(); + } /* average N readings of V(SE0) and V(RE0) */ #define PH_AVG_N 10