Add drivers for gpio and piface

This commit is contained in:
Tobias Reisinger 2024-04-28 01:13:22 +02:00
parent 61a3c6093b
commit 4ed1cd3182
Signed by: serguzim
GPG key ID: 13AD60C237A28DFE
14 changed files with 259 additions and 17 deletions
emgauwa-controller/src

View file

@ -3,6 +3,7 @@ use std::time::{Duration, Instant};
use actix::{Actor, Context, Handler, Message};
use emgauwa_lib::constants;
use emgauwa_lib::drivers::RelayDriver;
use emgauwa_lib::errors::EmgauwaError;
use emgauwa_lib::models::Controller;
use emgauwa_lib::types::RelayStates;
@ -45,16 +46,23 @@ pub struct AppState {
pub pool: Pool<Sqlite>,
pub this: Controller,
pub settings: Settings,
pub drivers: Vec<Box<dyn RelayDriver>>,
pub controller_notifier: Arc<Notify>,
pub relay_notifier: Arc<Notify>,
}
impl AppState {
pub fn new(pool: Pool<Sqlite>, this: Controller, settings: Settings) -> AppState {
pub fn new(
pool: Pool<Sqlite>,
this: Controller,
settings: Settings,
drivers: Vec<Box<dyn RelayDriver>>,
) -> AppState {
AppState {
pool,
this,
settings,
drivers,
controller_notifier: Arc::new(Notify::new()),
relay_notifier: Arc::new(Notify::new()),
}
@ -93,6 +101,14 @@ impl Handler<UpdateRelayStates> for AppState {
fn handle(&mut self, msg: UpdateRelayStates, _ctx: &mut Self::Context) -> Self::Result {
self.this.apply_relay_states(&msg.relay_states);
self.drivers
.iter_mut()
.zip(msg.relay_states.iter())
.for_each(|(driver, state)| {
if let Err(e) = driver.set(state.unwrap_or(false)) {
log::error!("Error setting relay: {}", e);
}
});
self.notify_relay_change();
}