1use super::net_handle;
4pub use crate::wire::EloadState;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum EloadMode {
9 Cc,
11 Cv,
13 Cr,
15 Cp,
17}
18
19impl EloadMode {
20 pub fn as_str(&self) -> &'static str {
22 match self {
23 EloadMode::Cc => "cc",
24 EloadMode::Cv => "cv",
25 EloadMode::Cr => "cr",
26 EloadMode::Cp => "cp",
27 }
28 }
29}
30
31pub(crate) mod ops {
32 use serde_json::json;
33
34 use super::EloadMode;
35 use crate::wire::{net_command, unit, value_as, value_f64, EloadState, Op, Timeout};
36
37 const ROLE: &str = "eload";
38
39 pub(crate) fn state(name: &str) -> Op<EloadState> {
40 Op {
41 req: net_command(name, ROLE, "state", json!({}), Timeout::Default),
42 parse: value_as::<EloadState>,
43 }
44 }
45
46 pub(crate) fn set(name: &str, mode: EloadMode, value: f64) -> Op<()> {
47 Op {
50 req: net_command(
51 name,
52 ROLE,
53 mode.as_str(),
54 json!({ "value": value }),
55 Timeout::Default,
56 ),
57 parse: unit,
58 }
59 }
60
61 pub(crate) fn setpoint(name: &str, mode: EloadMode) -> Op<f64> {
62 Op {
63 req: net_command(name, ROLE, mode.as_str(), json!({}), Timeout::Default),
64 parse: value_f64,
65 }
66 }
67}
68
69net_handle! {
70 sync: Eload,
72 async: AsyncEload,
73 methods: {
74 fn state() -> EloadState = ops::state;
76 fn set(mode: EloadMode, value: f64) -> () = ops::set;
78 fn setpoint(mode: EloadMode) -> f64 = ops::setpoint;
80 }
81}