From 860e49de9d63fd388ca61308eb6442f08f53454b Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:43:35 -0500 Subject: [PATCH] play over network --- common/Cargo.lock | 33 +++++++++++++++++++++++ common/Cargo.toml | 1 + common/src/lib.rs | 1 + outside/Cargo.lock | 2 ++ outside/src/music.rs | 2 +- outside/src/server.rs | 3 +++ server/Cargo.lock | 26 ++++++++++++++++-- server/Cargo.toml | 1 + server/src/main.rs | 62 +++++++++++++++++++++++++++++++++++++++---- 9 files changed, 123 insertions(+), 8 deletions(-) diff --git a/common/Cargo.lock b/common/Cargo.lock index 7e6c365..29f5c8e 100644 --- a/common/Cargo.lock +++ b/common/Cargo.lock @@ -11,10 +11,17 @@ dependencies = [ "generic-array", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "common" version = "0.1.0" dependencies = [ + "heapless", "serde", "sha3", ] @@ -58,6 +65,26 @@ dependencies = [ "version_check", ] +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "serde", + "stable_deref_trait", +] + [[package]] name = "keccak" version = "0.1.5" @@ -121,6 +148,12 @@ dependencies = [ "keccak", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "syn" version = "2.0.90" diff --git a/common/Cargo.toml b/common/Cargo.toml index a1f73e8..1a30546 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" [dependencies] sha3 = {version="0.10.0", default-features=false} serde = { version = "1.0.203", default-features = false, features = ["derive"] } +heapless = { version = "0.8.0", features = ["serde"] } diff --git a/common/src/lib.rs b/common/src/lib.rs index 343df5c..bd925b9 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -9,6 +9,7 @@ pub enum Request { SetRecentBadge(Name), SetBadge(Name, u64), SetVolume(u8), + Play(heapless::String<32>), } #[derive(Clone, Copy, Serialize, Deserialize, Debug)] diff --git a/outside/Cargo.lock b/outside/Cargo.lock index 2f072e2..481b583 100644 --- a/outside/Cargo.lock +++ b/outside/Cargo.lock @@ -264,6 +264,7 @@ dependencies = [ name = "common" version = "0.1.0" dependencies = [ + "heapless 0.8.0", "serde", "sha3", ] @@ -1303,6 +1304,7 @@ checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" dependencies = [ "defmt", "hash32 0.3.1", + "serde", "stable_deref_trait", ] diff --git a/outside/src/music.rs b/outside/src/music.rs index a9c1804..35fe81e 100644 --- a/outside/src/music.rs +++ b/outside/src/music.rs @@ -83,7 +83,7 @@ pub enum MusicCommand { Introduce(Name, bool), /// 0-30 SetVolume(u8), - Play(&'static str), + Play(heapless::String<32>), Button(), } diff --git a/outside/src/server.rs b/outside/src/server.rs index ebfe76c..24c1930 100644 --- a/outside/src/server.rs +++ b/outside/src/server.rs @@ -72,6 +72,9 @@ pub async fn server_task(stack: embassy_net::Stack<'static>) { Ok(Request::SetVolume(vol)) => { COMMANDS.send(crate::music::MusicCommand::SetVolume(vol)).await; } + Ok(Request::Play(song)) => { + COMMANDS.send(crate::music::MusicCommand::Play(song)) + } Err(e) => { info!("parse error: {e}") } } } diff --git a/server/Cargo.lock b/server/Cargo.lock index 7012ba7..772c915 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -162,6 +162,7 @@ checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" name = "common" version = "0.1.0" dependencies = [ + "heapless 0.8.0", "serde", "sha3", ] @@ -366,6 +367,15 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + [[package]] name = "heapless" version = "0.7.17" @@ -373,13 +383,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" dependencies = [ "atomic-polyfill", - "hash32", + "hash32 0.2.1", "rustc_version", "serde", "spin", "stable_deref_trait", ] +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32 0.3.1", + "serde", + "stable_deref_trait", +] + [[package]] name = "http" version = "1.2.0" @@ -660,7 +681,7 @@ dependencies = [ "cobs", "embedded-io 0.4.0", "embedded-io 0.6.1", - "heapless", + "heapless 0.7.17", "serde", ] @@ -797,6 +818,7 @@ dependencies = [ "anyhow", "axum", "common", + "heapless 0.8.0", "ping-rs", "postcard", "serde", diff --git a/server/Cargo.toml b/server/Cargo.toml index 14a5936..c62359f 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" anyhow = "1.0.94" axum = "0.7.9" common = {path = "../common"} +heapless = { version = "0.8.0", features = ["serde"] } ping-rs = "0.1.2" postcard = {version = "1.0.0", features = ["alloc"]} serde = "*" diff --git a/server/src/main.rs b/server/src/main.rs index e5409fe..0084552 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,5 +1,5 @@ -use std::{collections::HashMap, net::Ipv4Addr, sync::Arc, time::Duration}; +use std::{collections::HashMap, net::Ipv4Addr, str::FromStr, sync::Arc, time::Duration}; use axum::{extract::State, http::StatusCode, response::Html, routing::{get, post}, serve, Form, Router}; use common::{Name, Request}; @@ -73,11 +73,12 @@ async fn main() -> Result<()>{ let app: Router = Router::new() .route("/names", get(names)) + .route("/soundboard", get(soundboard)) .route("/", get(root)) .route("/admin", get(control)) .route("/phil", get(phil)) .route("/recent", get(recent_badge)) - .route("/setLast", post(set_last)) + .route("/play", post(play)) .route("/openDoor", post(open_door)) .route("/open", get(open_door)) .route("/setVolume", post(set_volume)) @@ -123,9 +124,9 @@ async fn main() -> Result<()>{ let door = Ipv4Addr::new(192,168,0,10).into(); let router = Ipv4Addr::new(192,168,0,50).into(); let (fish,door,router) = join!( - send_ping_async(&fish, Duration::from_millis(1500), Arc::new(&[255,127]), None), - send_ping_async(&door, Duration::from_millis(1500), Arc::new(&[255,127]), None), - send_ping_async(&router, Duration::from_millis(1500), Arc::new(&[255,127]), None) + send_ping_async(&fish, Duration::from_millis(3500), Arc::new(&[255,127]), None), + send_ping_async(&door, Duration::from_millis(3500), Arc::new(&[255,127]), None), + send_ping_async(&router, Duration::from_millis(3500), Arc::new(&[255,127]), None) ); let status = NetStatus { @@ -204,6 +205,36 @@ async fn root() -> Html { "#); Html::from(page) } + +async fn soundboard() -> Html { + let mut page = format!(r#" +

soundboard

+ "#); + + for (name, sound) in [ + ("I'm John the Fish!", "b1"), + ] { + page.push_str(&format!(r#" +
+ +
+ "#)); + } + + page.push_str(&format!(r#" +
+ + +
+
+ + +
+ + "#)); + Html::from(page) +} + async fn names(state: State) -> Html { let last_badge_view = last_badge_view(&state).await; @@ -332,6 +363,27 @@ async fn set_volume( Html::from(format!("

volume is now {}


back", input.volume)) } +#[derive(serde::Deserialize)] +struct SongForm { + name: String, +} + +async fn play( + state: State, + Form(input): Form) -> Html { + + info!("playing {}", input.name); + let _fish = state.fish.acquire().await.unwrap(); + let mut conn = TcpStream::connect(FISH).await.unwrap(); + let name = heapless::String::from_str(&input.name).unwrap(); + let req = Request::Play(name); + conn.write_all(&to_allocvec(&req).unwrap()).await.unwrap(); + conn.flush().await.unwrap(); + + + Html::from(format!("

playing {}

", input.name)) +} + #[derive(serde::Deserialize)] struct NameForm { name: String,