brokenithm leds

pull/13/head
4yn 2022-02-07 03:38:48 +08:00
parent cc24e628aa
commit a5c89f00cb
8 changed files with 72 additions and 35 deletions

View File

@ -1,9 +1,7 @@
# Todo # Todo
- input polling rate counter - input polling rate counter
- led polling rate settings
- settings serializer - settings serializer
- brokenithm server
- ouptut websocket - ouptut websocket
- led websocket - led websocket
- comments - comments

2
src-tauri/Cargo.lock generated
View File

@ -2933,7 +2933,7 @@ checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5"
[[package]] [[package]]
name = "slidershim" name = "slidershim"
version = "0.1.1" version = "0.1.2"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"base64", "base64",

View File

@ -1,6 +1,6 @@
[package] [package]
name = "slidershim" name = "slidershim"
version = "0.1.1" version = "0.1.2"
description = "slidershim" description = "slidershim"
authors = ["4yn"] authors = ["4yn"]
license = "" license = ""

View File

@ -53,7 +53,11 @@ async fn serve_file(path: &str) -> Result<Response<Body>, Infallible> {
} }
} }
async fn handle_brokenithm(ws_stream: WebSocketStream<Upgraded>, state: FullState) { async fn handle_brokenithm(
ws_stream: WebSocketStream<Upgraded>,
state: FullState,
led_enabled: bool,
) {
let (mut ws_write, mut ws_read) = ws_stream.split(); let (mut ws_write, mut ws_read) = ws_stream.split();
let (msg_write, mut msg_read) = mpsc::unbounded_channel::<Message>(); let (msg_write, mut msg_read) = mpsc::unbounded_channel::<Message>();
@ -139,33 +143,42 @@ async fn handle_brokenithm(ws_stream: WebSocketStream<Upgraded>, state: FullStat
// info!("Websocket read task done"); // info!("Websocket read task done");
}; };
let msg_write_handle = msg_write.clone(); match led_enabled {
let state_handle = state.clone(); false => {
let led_task = async move { select! {
loop { _ = read_task => {}
let mut led_data = vec![0; 93]; _ = write_task => {}
{ };
let led_state_handle = state_handle.led_state.lock().unwrap();
(&mut led_data).copy_from_slice(&led_state_handle.led_state);
}
msg_write_handle.send(Message::Binary(led_data)).ok();
sleep(Duration::from_millis(50)).await;
} }
}; true => {
let msg_write_handle = msg_write.clone();
let state_handle = state.clone();
let led_task = async move {
loop {
let mut led_data = vec![0; 93];
{
let led_state_handle = state_handle.led_state.lock().unwrap();
(&mut led_data).copy_from_slice(&led_state_handle.led_state);
}
msg_write_handle.send(Message::Binary(led_data)).ok();
info!("Websocket handling"); sleep(Duration::from_millis(50)).await;
select! { }
_ = read_task => {} };
_ = write_task => {}
_ = led_task => {} select! {
}; _ = read_task => {}
info!("Websocket done"); _ = write_task => {}
_ = led_task => {}
};
}
}
} }
async fn handle_websocket( async fn handle_websocket(
mut request: Request<Body>, mut request: Request<Body>,
state: FullState, state: FullState,
led_enabled: bool,
) -> Result<Response<Body>, Infallible> { ) -> Result<Response<Body>, Infallible> {
let res = match handshake::server::create_response_with_body(&request, || Body::empty()) { let res = match handshake::server::create_response_with_body(&request, || Body::empty()) {
Ok(res) => { Ok(res) => {
@ -179,7 +192,7 @@ async fn handle_websocket(
) )
.await; .await;
handle_brokenithm(ws_stream, state).await; handle_brokenithm(ws_stream, state, led_enabled).await;
} }
Err(e) => { Err(e) => {
@ -206,6 +219,7 @@ async fn handle_request(
remote_addr: SocketAddr, remote_addr: SocketAddr,
state: FullState, state: FullState,
ground_only: bool, ground_only: bool,
led_enabled: bool,
) -> Result<Response<Body>, Infallible> { ) -> Result<Response<Body>, Infallible> {
let method = request.method(); let method = request.method();
let path = request.uri().path(); let path = request.uri().path();
@ -227,7 +241,7 @@ async fn handle_request(
true => serve_file("index-go.html").await, true => serve_file("index-go.html").await,
}, },
(filename, false) => serve_file(&filename[1..]).await, (filename, false) => serve_file(&filename[1..]).await,
("/ws", true) => handle_websocket(request, state).await, ("/ws", true) => handle_websocket(request, state, led_enabled).await,
_ => error_response().await, _ => error_response().await,
} }
} }
@ -235,13 +249,15 @@ async fn handle_request(
pub struct BrokenithmJob { pub struct BrokenithmJob {
state: FullState, state: FullState,
ground_only: bool, ground_only: bool,
led_enabled: bool,
} }
impl BrokenithmJob { impl BrokenithmJob {
pub fn new(state: &FullState, ground_only: &bool) -> Self { pub fn new(state: &FullState, ground_only: &bool, led_enabled: &bool) -> Self {
Self { Self {
state: state.clone(), state: state.clone(),
ground_only: *ground_only, ground_only: *ground_only,
led_enabled: *led_enabled,
} }
} }
} }
@ -251,13 +267,14 @@ impl AsyncJob for BrokenithmJob {
async fn run<F: Future<Output = ()> + Send>(self, stop_signal: F) { async fn run<F: Future<Output = ()> + Send>(self, stop_signal: F) {
let state = self.state.clone(); let state = self.state.clone();
let ground_only = self.ground_only; let ground_only = self.ground_only;
let led_enabled = self.led_enabled;
let make_svc = make_service_fn(|conn: &AddrStream| { let make_svc = make_service_fn(|conn: &AddrStream| {
let remote_addr = conn.remote_addr(); let remote_addr = conn.remote_addr();
let make_svc_state = state.clone(); let make_svc_state = state.clone();
async move { async move {
Ok::<_, Infallible>(service_fn(move |request: Request<Body>| { Ok::<_, Infallible>(service_fn(move |request: Request<Body>| {
let svc_state = make_svc_state.clone(); let svc_state = make_svc_state.clone();
handle_request(request, remote_addr, svc_state, ground_only) handle_request(request, remote_addr, svc_state, ground_only, led_enabled)
})) }))
} }
}); });

View File

@ -13,7 +13,10 @@ pub enum DeviceMode {
TasollerOne, TasollerOne,
TasollerTwo, TasollerTwo,
Yuancon, Yuancon,
Brokenithm { ground_only: bool }, Brokenithm {
ground_only: bool,
led_enabled: bool,
},
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
@ -123,8 +126,22 @@ impl Config {
"tasoller-one" => DeviceMode::TasollerOne, "tasoller-one" => DeviceMode::TasollerOne,
"tasoller-two" => DeviceMode::TasollerTwo, "tasoller-two" => DeviceMode::TasollerTwo,
"yuancon" => DeviceMode::Yuancon, "yuancon" => DeviceMode::Yuancon,
"brokenithm" => DeviceMode::Brokenithm { ground_only: false }, "brokenithm" => DeviceMode::Brokenithm {
"brokenithm-ground" => DeviceMode::Brokenithm { ground_only: true }, ground_only: false,
led_enabled: false,
},
"brokenithm-led" => DeviceMode::Brokenithm {
ground_only: false,
led_enabled: true,
},
"brokenithm-ground" => DeviceMode::Brokenithm {
ground_only: true,
led_enabled: false,
},
"brokenithm-ground-led" => DeviceMode::Brokenithm {
ground_only: true,
led_enabled: true,
},
_ => panic!("Invalid device mode"), _ => panic!("Invalid device mode"),
}, },
output_mode: match v["outputMode"].as_str().unwrap() { output_mode: match v["outputMode"].as_str().unwrap() {

View File

@ -31,11 +31,14 @@ impl Context {
let (device_worker, brokenithm_worker) = match &config.device_mode { let (device_worker, brokenithm_worker) = match &config.device_mode {
DeviceMode::None => (None, None), DeviceMode::None => (None, None),
DeviceMode::Brokenithm { ground_only } => ( DeviceMode::Brokenithm {
ground_only,
led_enabled,
} => (
None, None,
Some(AsyncWorker::new( Some(AsyncWorker::new(
"brokenithm", "brokenithm",
BrokenithmJob::new(&state, ground_only), BrokenithmJob::new(&state, ground_only, led_enabled),
)), )),
), ),
_ => ( _ => (

View File

@ -1,7 +1,7 @@
{ {
"package": { "package": {
"productName": "slidershim", "productName": "slidershim",
"version": "0.1.1" "version": "0.1.2"
}, },
"build": { "build": {
"distDir": "../public", "distDir": "../public",

View File

@ -146,7 +146,9 @@
<option value="tasoller-two">GAMO2 Tasoller, 2.0 HID Firmware</option> <option value="tasoller-two">GAMO2 Tasoller, 2.0 HID Firmware</option>
<option value="yuancon">Yuancon Laverita, HID Firmware</option> <option value="yuancon">Yuancon Laverita, HID Firmware</option>
<option value="brokenithm">Brokenithm</option> <option value="brokenithm">Brokenithm</option>
<option value="brokenithm-led">Brokenithm + Led</option>
<option value="brokenithm-ground">Brokenithm, Ground only</option> <option value="brokenithm-ground">Brokenithm, Ground only</option>
<option value="brokenithm-ground-led">Brokenithm + Led, Ground only</option>
</select> </select>
</div> </div>
</div> </div>