2023-06-03 16:54:41 +00:00
|
|
|
use redis::{Client, Commands, Connection};
|
2023-06-03 13:21:36 +00:00
|
|
|
use ron::de::from_str;
|
2023-06-12 17:23:59 +00:00
|
|
|
use crate::device::Status;
|
|
|
|
use crate::errors::{LJError, LJResult};
|
2023-06-03 13:21:36 +00:00
|
|
|
|
2023-06-03 14:20:35 +00:00
|
|
|
#[repr(u8)]
|
2023-06-03 16:54:41 +00:00
|
|
|
#[derive(Debug, PartialEq)]
|
2023-06-03 14:20:35 +00:00
|
|
|
pub enum Order {
|
2023-06-12 17:23:59 +00:00
|
|
|
Draw = 0,
|
|
|
|
Edh,
|
|
|
|
//homography
|
|
|
|
Black,
|
|
|
|
Grid,
|
|
|
|
Resampler,
|
|
|
|
ClientKey,
|
|
|
|
Intensity,
|
|
|
|
Kpps,
|
|
|
|
ColorBalance,
|
2023-06-03 14:20:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl TryFrom<u8> for Order {
|
2023-06-12 17:23:59 +00:00
|
|
|
type Error = String;
|
2023-06-03 16:54:41 +00:00
|
|
|
|
2023-06-12 17:23:59 +00:00
|
|
|
fn try_from(value: u8) -> Result<Self, Self::Error> {
|
|
|
|
use Order::*;
|
2023-06-03 14:20:35 +00:00
|
|
|
|
2023-06-12 17:23:59 +00:00
|
|
|
if value > 8 {
|
|
|
|
return Err("order out of range".to_string());
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(match value {
|
|
|
|
0 => Draw,
|
|
|
|
1 => Edh,
|
|
|
|
2 => Black,
|
|
|
|
3 => Grid,
|
|
|
|
4 => Resampler,
|
|
|
|
5 => ClientKey,
|
|
|
|
6 => Intensity,
|
|
|
|
7 => Kpps,
|
|
|
|
8 => ColorBalance,
|
|
|
|
_ => unreachable!()
|
|
|
|
})
|
2023-06-03 14:20:35 +00:00
|
|
|
}
|
2023-06-03 16:54:41 +00:00
|
|
|
}
|
2023-06-03 14:20:35 +00:00
|
|
|
|
2023-06-03 16:54:41 +00:00
|
|
|
pub type Line = Vec<(f32, f32, u32)>;
|
2023-06-03 13:21:36 +00:00
|
|
|
|
|
|
|
pub struct RedisCtrl {
|
2023-06-12 17:23:59 +00:00
|
|
|
pub client: Client,
|
|
|
|
pub connection: Connection,
|
|
|
|
laser_id: u8,
|
2023-06-03 13:21:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl RedisCtrl {
|
2023-06-12 17:23:59 +00:00
|
|
|
pub fn new(url: &str, laser_id: &u8) -> LJResult<Self> {
|
|
|
|
let client = Client::open(url)
|
|
|
|
.map_err(LJError::RedisConnect)?;
|
|
|
|
let connection = client.get_connection()
|
|
|
|
.map_err(LJError::RedisConnect)?;
|
|
|
|
Ok(RedisCtrl { client, connection, laser_id: *laser_id })
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn get(&mut self, key: &str) -> LJResult<Line> {
|
|
|
|
let val: String = self.connection.get(key)?;
|
|
|
|
let line: Line = from_str(&val)?;
|
|
|
|
Ok(line)
|
|
|
|
}
|
2023-06-03 13:21:36 +00:00
|
|
|
|
2023-06-12 17:23:59 +00:00
|
|
|
pub fn set(&mut self, key: String, value: String) -> LJResult<()> {
|
|
|
|
self.connection.set(key, value)?;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn get_order(&mut self, id: u8) -> LJResult<Order> {
|
|
|
|
let path = format!("/order/{id}");
|
|
|
|
let val: u8 = self.connection.get(path.clone())?;
|
2023-06-03 14:20:35 +00:00
|
|
|
|
2023-06-12 17:23:59 +00:00
|
|
|
if val == 1 || val >= 4 {
|
|
|
|
self.connection.set(path, 0)?;
|
|
|
|
}
|
2023-06-03 16:54:41 +00:00
|
|
|
|
2023-06-12 17:23:59 +00:00
|
|
|
Ok(val.try_into()?)
|
|
|
|
}
|
2023-06-03 13:21:36 +00:00
|
|
|
|
2023-06-12 17:23:59 +00:00
|
|
|
/**
|
|
|
|
/lstt/lasernumber etherdream last_status.playback_state (0: idle 1: prepare 2: playing)
|
|
|
|
/cap/lasernumber number of empty points sent to fill etherdream buffer (up to 1799)
|
|
|
|
/lack/lasernumber "a": ACK "F": Full "I": invalid. 64 or 35 for no connection.
|
|
|
|
**/
|
|
|
|
pub fn set_status(&mut self, status: Status) -> LJResult<()> {
|
|
|
|
let lstt_key = format!("/lstt/{}", self.laser_id);
|
|
|
|
let cap_key = format!("/cap/{}", self.laser_id);
|
|
|
|
let lack_key = format!("/lack/{}", self.laser_id);
|
|
|
|
self.set(lstt_key, status.playback_state.to_string())?;
|
|
|
|
self.set(cap_key, status.capacity.to_string())?;
|
|
|
|
self.set(lack_key, status.lack.to_string())?;
|
|
|
|
Ok(())
|
|
|
|
}
|
2023-06-03 16:54:41 +00:00
|
|
|
}
|