Add handler in AppState to handle relay states
This commit is contained in:
parent
55617dbd7c
commit
27739e2b71
4 changed files with 43 additions and 9 deletions
|
@ -3,7 +3,7 @@ use std::collections::HashMap;
|
||||||
use actix::{Actor, Context, Handler, Message, Recipient};
|
use actix::{Actor, Context, Handler, Message, Recipient};
|
||||||
use emgauwa_lib::errors::EmgauwaError;
|
use emgauwa_lib::errors::EmgauwaError;
|
||||||
use emgauwa_lib::models::Controller;
|
use emgauwa_lib::models::Controller;
|
||||||
use emgauwa_lib::types::{ControllerUid, ControllerWsAction};
|
use emgauwa_lib::types::{ControllerUid, ControllerWsAction, RelayStates};
|
||||||
use futures::executor::block_on;
|
use futures::executor::block_on;
|
||||||
use sqlx::{Pool, Sqlite};
|
use sqlx::{Pool, Sqlite};
|
||||||
|
|
||||||
|
@ -20,6 +20,13 @@ pub struct ConnectController {
|
||||||
pub controller: Controller,
|
pub controller: Controller,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Message)]
|
||||||
|
#[rtype(result = "()")]
|
||||||
|
pub struct UpdateRelayStates {
|
||||||
|
pub controller_uid: ControllerUid,
|
||||||
|
pub relay_states: RelayStates,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Message)]
|
#[derive(Message)]
|
||||||
#[rtype(result = "Result<(), EmgauwaError>")]
|
#[rtype(result = "Result<(), EmgauwaError>")]
|
||||||
pub struct Action {
|
pub struct Action {
|
||||||
|
@ -80,6 +87,16 @@ impl Handler<ConnectController> for AppState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Handler<UpdateRelayStates> for AppState {
|
||||||
|
type Result = ();
|
||||||
|
|
||||||
|
fn handle(&mut self, msg: UpdateRelayStates, _ctx: &mut Self::Context) -> Self::Result {
|
||||||
|
if let Some((controller, _)) = self.connected_controllers.get_mut(&msg.controller_uid) {
|
||||||
|
controller.apply_relay_states(&msg.relay_states);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Handler<Action> for AppState {
|
impl Handler<Action> for AppState {
|
||||||
type Result = Result<(), EmgauwaError>;
|
type Result = Result<(), EmgauwaError>;
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
use std::hash::{Hash, Hasher};
|
|
||||||
|
|
||||||
use actix::{Actor, AsyncContext};
|
use actix::{Actor, AsyncContext};
|
||||||
use emgauwa_lib::db::{DbController, DbJunctionRelaySchedule, DbRelay, DbSchedule};
|
use emgauwa_lib::db::{DbController, DbJunctionRelaySchedule, DbRelay, DbSchedule};
|
||||||
use emgauwa_lib::errors::{DatabaseError, EmgauwaError};
|
use emgauwa_lib::errors::{DatabaseError, EmgauwaError};
|
||||||
use emgauwa_lib::models::{Controller, FromDbModel};
|
use emgauwa_lib::models::{Controller, FromDbModel};
|
||||||
use emgauwa_lib::types::{ControllerUid, RelayStates};
|
use emgauwa_lib::types::{ControllerUid, RelayStates};
|
||||||
|
use emgauwa_lib::utils;
|
||||||
use futures::executor::block_on;
|
use futures::executor::block_on;
|
||||||
use sqlx::pool::PoolConnection;
|
use sqlx::pool::PoolConnection;
|
||||||
use sqlx::Sqlite;
|
use sqlx::Sqlite;
|
||||||
|
|
||||||
use crate::app_state::ConnectController;
|
use crate::app_state::{ConnectController, UpdateRelayStates};
|
||||||
use crate::handlers::v1::ws::controllers::ControllerWs;
|
use crate::handlers::v1::ws::controllers::ControllerWs;
|
||||||
|
|
||||||
impl ControllerWs {
|
impl ControllerWs {
|
||||||
|
@ -87,15 +86,18 @@ impl ControllerWs {
|
||||||
|
|
||||||
pub fn handle_relay_states(
|
pub fn handle_relay_states(
|
||||||
&mut self,
|
&mut self,
|
||||||
ctx: &mut <ControllerWs as Actor>::Context,
|
|
||||||
controller_uid: ControllerUid,
|
controller_uid: ControllerUid,
|
||||||
relay_states: RelayStates,
|
relay_states: RelayStates,
|
||||||
) -> Result<(), EmgauwaError> {
|
) -> Result<(), EmgauwaError> {
|
||||||
log::debug!(
|
log::debug!(
|
||||||
"Received relay states: {:?} for {}",
|
"Received relay states: {} for {}",
|
||||||
relay_states,
|
utils::printable_relay_states(&relay_states),
|
||||||
controller_uid
|
controller_uid
|
||||||
);
|
);
|
||||||
|
block_on(self.app_state.send(UpdateRelayStates {
|
||||||
|
controller_uid,
|
||||||
|
relay_states,
|
||||||
|
}))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ impl ControllerWs {
|
||||||
let action_res = match action {
|
let action_res = match action {
|
||||||
ControllerWsAction::Register(controller) => self.handle_register(conn, ctx, controller),
|
ControllerWsAction::Register(controller) => self.handle_register(conn, ctx, controller),
|
||||||
ControllerWsAction::RelayStates((controller_uid, relay_states)) => {
|
ControllerWsAction::RelayStates((controller_uid, relay_states)) => {
|
||||||
self.handle_relay_states(ctx, controller_uid, relay_states)
|
self.handle_relay_states(controller_uid, relay_states)
|
||||||
}
|
}
|
||||||
_ => Ok(()),
|
_ => Ok(()),
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,7 +8,7 @@ use simple_logger::SimpleLogger;
|
||||||
|
|
||||||
use crate::errors::EmgauwaError;
|
use crate::errors::EmgauwaError;
|
||||||
use crate::settings::Permissions;
|
use crate::settings::Permissions;
|
||||||
use crate::types::Weekday;
|
use crate::types::{RelayStates, Weekday};
|
||||||
|
|
||||||
|
|
||||||
pub fn init_logging(level: &str) -> Result<(), EmgauwaError> {
|
pub fn init_logging(level: &str) -> Result<(), EmgauwaError> {
|
||||||
|
@ -100,3 +100,18 @@ pub fn get_weekday() -> Weekday {
|
||||||
.number_from_monday()
|
.number_from_monday()
|
||||||
- 1) as Weekday
|
- 1) as Weekday
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn printable_relay_states(relay_states: &RelayStates) -> String {
|
||||||
|
let mut relay_debug = String::new();
|
||||||
|
relay_states.iter().for_each(|state| {
|
||||||
|
relay_debug.push_str(&format!(
|
||||||
|
"{}",
|
||||||
|
match state {
|
||||||
|
Some(true) => "+",
|
||||||
|
Some(false) => "-",
|
||||||
|
None => "?",
|
||||||
|
}
|
||||||
|
));
|
||||||
|
});
|
||||||
|
relay_debug
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue