Turn power on/off in UI

This commit is contained in:
Oshgnacknak committed 2025-12-25 21:55:08 +01:00
1 parent 1f6f43c7ec
commit 26c91c7ddd
1 file changed
+30 -26
+30 -26
View File
@@ -3,15 +3,13 @@ use anyhow::Result;
use control_core::{modbus::tcp::ModbusTcpDevice, socketio::{event::{BuildEvent, GenericEvent}, namespace::{CacheFn, CacheableEvents, NamespaceCacheingLogic, cache_duration, cache_first_and_last_event}}};
use control_core_derive::BuildEvent;
use serde::*;
use smol::lock::Mutex;
use units::{*, electric_current::milliampere, electric_potential::{millivolt, volt}};
use crate::{MachineChannel, MachineWithChannel};
const MODBUS_DC_OFF: u16 = 0;
const MODBUS_DC_ON: u16 = 1 << 0;
const MODBUS_CONSTANT_POWER: u16 = 1 << 6;
const MODBUS_HUCCUP_POWER: u16 = 1 << 0;
const MODBUS_POWER_PROTECT: u16 = 1 << 9;
const MODBUS_THERMAL_PROTECT: u16 = 1 << 12;
const MODBUS_DC_ON: u16 = 1;
const MODBUS_HICCUP_POWER: u16 = 1 << 8;
#[derive(Serialize, Debug, Clone, BuildEvent)]
pub struct LiveValuesEvent {
@@ -36,6 +34,16 @@ pub enum Mode {
On24V,
}
impl Mode {
pub fn as_u16(&self) -> u16 {
match self {
Mode::Off => MODBUS_DC_OFF,
Mode::On24V => MODBUS_HICCUP_POWER | MODBUS_DC_ON,
}
}
}
#[derive(Serialize, Debug, Clone, BuildEvent)]
pub struct StateEvent {
mode: Mode,
@@ -62,7 +70,7 @@ pub enum Mutation {
pub struct WagoPower {
mode: Mode,
channel: MachineChannel,
device: ModbusTcpDevice,
device: Mutex<ModbusTcpDevice>,
last_emit: Instant,
emitted_default_state: bool,
}
@@ -73,7 +81,7 @@ impl WagoPower {
Ok(Self {
mode: Mode::Off,
channel,
device: ModbusTcpDevice::new(addr).await?,
device: Mutex::new(ModbusTcpDevice::new(addr).await?),
last_emit: Instant::now(),
emitted_default_state: false,
})
@@ -97,13 +105,13 @@ impl WagoPower {
#[cfg(not(feature = "mock-machine"))]
fn get_live_values(&mut self) -> Result<LiveValuesEvent> {
let electric = smol::block_on(
self.device.get_holding_registers(0x0500, 2)
)?;
let electric = smol::block_on(async {
let mut dev = self.device.lock().await;
dev.get_holding_registers(0x0500, 2).await
})?;
let voltage = ElectricPotential::new::<millivolt>(f64::from(electric[0]));
let current = ElectricCurrent::new::<milliampere>(f64::from(electric[1]));
println!("vol: {:?}, cur: {:?}", voltage, current);
Ok(LiveValuesEvent {
voltage: voltage.get::<volt>(),
@@ -130,22 +138,14 @@ impl WagoPower {
}
async fn transmit_voltage(&mut self) -> Result<()> {
let res = self.device.get_holding_registers(0x008A, 1).await?;
let mut control_bits = res[0];
let mut dev = self.device.lock().await;
// control_bits &= !1;
let voltage = 24000;
let warning_threshold = 5000; // For now
let control_bits = self.mode.as_u16();
let delay_ms = 100; // For now
// let voltage = 24000;
// let current_limit = 5000; // For now
// control_bits |= match self.mode {
// Mode::Off => MODBUS_DC_OFF,
// Mode::On24V => MODBUS_DC_ON,
// };
// let delay_ms = 100; // For now
let values = vec![control_bits];
self.device.set_holding_registers(0x008A, &values).await?;
dev.set_holding_registers(0x0088, &[voltage, warning_threshold, control_bits, delay_ms]).await?;
Ok(())
}
@@ -176,11 +176,15 @@ impl MachineWithChannel for WagoPower {
fn update(&mut self, now: Instant) -> Result<()> {
if !self.emitted_default_state {
self.set_mode(Mode::Off)?;
self.emit_state();
self.emitted_default_state = true;
}
if now - self.last_emit < Duration::from_millis(1000 / 30) {
if now - self.last_emit > Duration::from_millis(1000 / 30) {
if let Ok(event) = self.get_live_values() {
self.channel.emit(event);
}