add cl_factor UI and state to desktop cue

This commit is contained in:
jess 2026-04-02 18:28:57 -07:00
parent 2e1a2f98f2
commit d84ed33c14
1 changed files with 50 additions and 0 deletions

View File

@ -98,6 +98,8 @@ pub enum Message {
CalBleachChanged(String), CalBleachChanged(String),
CalTempChanged(String), CalTempChanged(String),
CalComputeK, CalComputeK,
ClCalKnownPpmChanged(String),
ClSetFactor,
/* Global */ /* Global */
PollTemp, PollTemp,
NativeMenuTick, NativeMenuTick,
@ -227,6 +229,8 @@ pub struct App {
cal_bleach_pct: String, cal_bleach_pct: String,
cal_temp_c: String, cal_temp_c: String,
cal_cell_constant: Option<f32>, cal_cell_constant: Option<f32>,
cl_factor: Option<f32>,
cl_cal_known_ppm: String,
/* Global */ /* Global */
temp_c: f32, temp_c: f32,
@ -457,6 +461,8 @@ impl App {
cal_bleach_pct: "7.825".into(), cal_bleach_pct: "7.825".into(),
cal_temp_c: "40".into(), cal_temp_c: "40".into(),
cal_cell_constant: None, cal_cell_constant: None,
cl_factor: None,
cl_cal_known_ppm: String::from("5"),
temp_c: 25.0, temp_c: 25.0,
conn_gen: 0, conn_gen: 0,
@ -561,6 +567,7 @@ impl App {
self.connected = true; self.connected = true;
self.send_cmd(&protocol::build_sysex_get_config()); self.send_cmd(&protocol::build_sysex_get_config());
self.send_cmd(&protocol::build_sysex_get_cell_k()); self.send_cmd(&protocol::build_sysex_get_cell_k());
self.send_cmd(&protocol::build_sysex_get_cl_factor());
} }
Message::DeviceStatus(s) => { Message::DeviceStatus(s) => {
if s.contains("Reconnecting") || s.contains("Connecting") { if s.contains("Reconnecting") || s.contains("Connecting") {
@ -734,6 +741,10 @@ impl App {
self.cal_cell_constant = Some(k); self.cal_cell_constant = Some(k);
self.status = format!("Device cell constant: {:.4} cm-1", k); self.status = format!("Device cell constant: {:.4} cm-1", k);
} }
EisMessage::ClFactor(f) => {
self.cl_factor = Some(f);
self.status = format!("Device Cl factor: {:.6}", f);
}
}, },
Message::TabSelected(t) => { Message::TabSelected(t) => {
if t == Tab::Browse { if t == Tab::Browse {
@ -951,6 +962,19 @@ impl App {
self.status = "No valid EIS data for Rs extraction".into(); self.status = "No valid EIS data for Rs extraction".into();
} }
} }
Message::ClCalKnownPpmChanged(s) => { self.cl_cal_known_ppm = s; }
Message::ClSetFactor => {
let known_ppm = self.cl_cal_known_ppm.parse::<f32>().unwrap_or(0.0);
if let Some(r) = &self.cl_result {
let peak = r.i_free_ua.abs();
if peak > 0.0 {
let factor = known_ppm / peak;
self.cl_factor = Some(factor);
self.send_cmd(&protocol::build_sysex_set_cl_factor(factor));
self.status = format!("Cl factor: {:.6} ppm/uA", factor);
}
}
}
/* Clean */ /* Clean */
Message::CleanVChanged(s) => self.clean_v = s, Message::CleanVChanged(s) => self.clean_v = s,
Message::CleanDurChanged(s) => self.clean_dur = s, Message::CleanDurChanged(s) => self.clean_dur = s,
@ -1538,6 +1562,10 @@ impl App {
"Free: {:.3} uA | Total: {:.3} uA | Combined: {:.3} uA", "Free: {:.3} uA | Total: {:.3} uA | Combined: {:.3} uA",
r.i_free_ua, r.i_total_ua, r.i_total_ua - r.i_free_ua r.i_free_ua, r.i_total_ua, r.i_total_ua - r.i_free_ua
)); ));
if let (Some(f), Some(r)) = (self.cl_factor, &self.cl_result) {
let ppm = f * r.i_free_ua.abs();
result_parts.push(format!("Free Cl: {:.2} ppm", ppm));
}
if let Some((_, ref_r)) = &self.cl_ref { if let Some((_, ref_r)) = &self.cl_ref {
let df = r.i_free_ua - ref_r.i_free_ua; let df = r.i_free_ua - ref_r.i_free_ua;
let dt = r.i_total_ua - ref_r.i_total_ua; let dt = r.i_total_ua - ref_r.i_total_ua;
@ -1645,6 +1673,28 @@ impl App {
.on_press(Message::CalComputeK); .on_press(Message::CalComputeK);
results = results.push(compute_btn); results = results.push(compute_btn);
results = results.push(iced::widget::horizontal_rule(1));
results = results.push(text("Chlorine Calibration").size(16));
if let Some(f) = self.cl_factor {
results = results.push(text(format!("Cl factor: {:.6} ppm/uA", f)).size(14));
}
if let Some(r) = &self.cl_result {
results = results.push(text(format!("Last free Cl peak: {:.3} uA", r.i_free_ua)).size(14));
}
results = results.push(
row![
column![
text("Known Cl ppm").size(12),
text_input("5", &self.cl_cal_known_ppm)
.on_input(Message::ClCalKnownPpmChanged).width(80),
].spacing(2),
button(text("Set Cl Factor").size(13))
.style(style_action())
.padding([6, 16])
.on_press(Message::ClSetFactor),
].spacing(10).align_y(iced::Alignment::End)
);
row![ row![
container(inputs).width(Length::FillPortion(2)), container(inputs).width(Length::FillPortion(2)),
iced::widget::vertical_rule(1), iced::widget::vertical_rule(1),