Compare commits
4 commits
18f8c24021
...
f7ab1c119a
Author | SHA1 | Date | |
---|---|---|---|
f7ab1c119a | |||
bd7b3fb287 | |||
63bb5b8fea | |||
4945b4d777 |
7 changed files with 551 additions and 106 deletions
31
controller/Cargo.lock
generated
31
controller/Cargo.lock
generated
|
@ -268,6 +268,12 @@ dependencies = [
|
|||
"inout",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cobs"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15"
|
||||
|
||||
[[package]]
|
||||
name = "codespan-reporting"
|
||||
version = "0.11.1"
|
||||
|
@ -278,6 +284,15 @@ dependencies = [
|
|||
"unicode-width",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "common"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"nalgebra",
|
||||
"postcard",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "const-oid"
|
||||
version = "0.9.6"
|
||||
|
@ -290,6 +305,7 @@ version = "0.1.0"
|
|||
dependencies = [
|
||||
"assign-resources",
|
||||
"byte-slice-cast 1.2.2",
|
||||
"common",
|
||||
"cortex-m",
|
||||
"cortex-m-rt",
|
||||
"critical-section",
|
||||
|
@ -326,6 +342,7 @@ dependencies = [
|
|||
"pio 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pio-proc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"portable-atomic",
|
||||
"postcard",
|
||||
"rand",
|
||||
"reqwless",
|
||||
"serde",
|
||||
|
@ -1375,6 +1392,7 @@ dependencies = [
|
|||
"atomic-polyfill",
|
||||
"hash32 0.2.1",
|
||||
"rustc_version 0.4.1",
|
||||
"serde",
|
||||
"spin",
|
||||
"stable_deref_trait",
|
||||
]
|
||||
|
@ -1633,6 +1651,7 @@ dependencies = [
|
|||
"num-complex",
|
||||
"num-rational",
|
||||
"num-traits",
|
||||
"serde",
|
||||
"simba",
|
||||
"typenum",
|
||||
]
|
||||
|
@ -1680,6 +1699,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1944,6 +1964,17 @@ dependencies = [
|
|||
"critical-section",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "postcard"
|
||||
version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8"
|
||||
dependencies = [
|
||||
"cobs",
|
||||
"heapless 0.7.17",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.20"
|
||||
|
|
|
@ -26,6 +26,7 @@ fixed-macro = "1.2"
|
|||
# for web request example
|
||||
reqwless = { version = "0.12.0", features = ["defmt",]}
|
||||
serde = { version = "1.0.203", default-features = false, features = ["derive"] }
|
||||
postcard = "1.0.0"
|
||||
serde-json-core = "0.5.1"
|
||||
|
||||
# for assign resources example
|
||||
|
@ -61,7 +62,8 @@ embedded-sdmmc = "0.7.0"
|
|||
hex = { version = "0.4.3", default-features=false }
|
||||
mpu6050 = { git = "https://git.ank.dev/ank/mpu6050" }
|
||||
vl53l0x = "1.0.1"
|
||||
nalgebra = { version = "0.31.2", default-features=false }
|
||||
nalgebra = { version = "0.31.2", default-features=false, features = ["serde-serialize-no-std"] }
|
||||
common = { path = "../common" }
|
||||
|
||||
|
||||
[profile.release]
|
||||
|
|
|
@ -34,12 +34,14 @@ use embassy_rp::gpio::{Level, Output};
|
|||
use embassy_rp::peripherals::{DMA_CH0, PIO0, USB};
|
||||
use embassy_rp::pio::{InterruptHandler, Pio};
|
||||
use embassy_rp::usb::Driver;
|
||||
use embassy_time::{Delay, Duration, Timer};
|
||||
use embedded_io_async::Write;
|
||||
use embassy_time::{Delay, Duration, Instant, Timer};
|
||||
use embedded_io_async::{Read, Write};
|
||||
use mpu6050::Mpu6050;
|
||||
use nalgebra::clamp;
|
||||
use rand::RngCore;
|
||||
use reqwless::response;
|
||||
use sensor_manager::{sensor_manager, SensorData, SensorHardware};
|
||||
use sensor_manager::{sensor_manager, SensorHardware};
|
||||
use common::{ControlPacket, SensorData, TelemetryPacket};
|
||||
use static_cell::StaticCell;
|
||||
use defmt_rtt as _;
|
||||
|
||||
|
@ -51,7 +53,7 @@ bind_interrupts!(struct Irqs {
|
|||
});
|
||||
|
||||
static mut CORE1_STACK: Stack<4096> = Stack::new();
|
||||
pub static CHANNEL: Channel<CriticalSectionRawMutex, SensorData, 1> = Channel::new();
|
||||
pub static CHANNEL: Channel<CriticalSectionRawMutex, (SensorData, Instant), 1> = Channel::new();
|
||||
|
||||
#[embassy_executor::task]
|
||||
async fn logger_task(driver: Driver<'static, USB>) {
|
||||
|
@ -175,16 +177,17 @@ async fn main(spawner: Spawner) {
|
|||
let mut rx_buffer = [0; 4096];
|
||||
let mut tx_buffer = [0; 4096];
|
||||
let mut buf = [0; 4096];
|
||||
let mut telem_buf = [0; 4096];
|
||||
|
||||
loop {
|
||||
let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
|
||||
socket.set_timeout(Some(Duration::from_secs(3)));
|
||||
|
||||
let mut c: pwm::Config = Default::default();
|
||||
c.divider = 255.into();
|
||||
c.top = 8715;
|
||||
c.compare_b = 0;
|
||||
c.compare_a = 0;
|
||||
c.divider = 40.into();
|
||||
c.top = 62500; // 20ms
|
||||
c.compare_b = 4687; // 1.5ms
|
||||
c.compare_a = 4687; // 1.5ms
|
||||
drive_pwm.set_config(&c);
|
||||
|
||||
flipper.set_low();
|
||||
|
@ -200,59 +203,41 @@ async fn main(spawner: Spawner) {
|
|||
control.gpio_set(0, true).await;
|
||||
|
||||
loop {
|
||||
let mut n = match socket.read(&mut buf).await {
|
||||
Ok(0) => {
|
||||
warn!("read EOF");
|
||||
let mut len: [u8; 4] = [0;4];
|
||||
if let Err(e) = socket.read_exact(&mut len).await {
|
||||
warn!("read err: {e:?}");
|
||||
}
|
||||
let len = u32::from_be_bytes(len) as usize;
|
||||
let data = &mut buf[0..len];
|
||||
if let Err(e) = socket.read_exact(data).await {
|
||||
warn!("read err: {e:?}");
|
||||
break;
|
||||
}
|
||||
Ok(n) => n,
|
||||
Err(e) => {
|
||||
warn!("read error: {:?}", e);
|
||||
break;
|
||||
|
||||
if let Ok(data) = postcard::from_bytes::<ControlPacket>(&data) {
|
||||
info!("got {data:?}");
|
||||
match data {
|
||||
ControlPacket::Twist(forward, right) => {
|
||||
info!("left to {}", clamp(forward+right, -1., 1.));
|
||||
info!("right to {}", clamp(forward-right, -1., 1.));
|
||||
},
|
||||
d => {error!("unimplemented: {d:?}")} // TODO
|
||||
}
|
||||
}
|
||||
|
||||
if let Ok((data, _ts)) = CHANNEL.try_receive() {
|
||||
let telem = TelemetryPacket {
|
||||
sensors: data,
|
||||
voltage: 0.0, // TODO
|
||||
};
|
||||
|
||||
|
||||
info!("rxd {}", from_utf8(&buf[..n]).unwrap());
|
||||
Timer::after_millis(30).await;
|
||||
|
||||
let mut segs = buf[..n].trim_ascii().split(|c| *c == ' ' as u8);
|
||||
|
||||
match char::from_u32(segs.next().unwrap()[0] as u32).unwrap() {
|
||||
'D' => {
|
||||
let left: [u8;2] = hex::FromHex::from_hex(segs.next().unwrap()).unwrap();
|
||||
let right: [u8;2] = hex::FromHex::from_hex(segs.next().unwrap()).unwrap();
|
||||
info!("left {:?}, right {left:?}", right);
|
||||
|
||||
let left = u16::from_be_bytes(left);
|
||||
c.compare_a = left;
|
||||
let right = u16::from_be_bytes(right);
|
||||
c.compare_b = right;
|
||||
info!("left {:?}, right {left:?}", right);
|
||||
drive_pwm.set_config(&c);
|
||||
},
|
||||
'F' => {
|
||||
flipper.set_high();
|
||||
},
|
||||
'L' => {
|
||||
flipper.set_low();
|
||||
},
|
||||
_ => {}
|
||||
|
||||
}
|
||||
|
||||
//let mut response: [u8;2] = [0;2];
|
||||
|
||||
//let _ = bus.read_async(0xC0u16, &mut response).await;
|
||||
//let _ = hex::encode_to_slice(response, &mut buf);
|
||||
|
||||
match socket.write_all(&buf[..n]).await {
|
||||
Ok(()) => {}
|
||||
Err(e) => {
|
||||
if let Ok(telem) = postcard::to_slice(&telem, &mut telem_buf) {
|
||||
if let Err(e) = socket.write_all(&telem).await {
|
||||
warn!("write error: {:?}", e);
|
||||
break;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ use core::sync::atomic::{AtomicU8, Ordering};
|
|||
use core::task::Poll;
|
||||
use core::{cell::RefCell, mem::transmute};
|
||||
|
||||
use common::SensorData;
|
||||
use embassy_executor::Executor;
|
||||
use embassy_rp::peripherals::{I2C0, I2C1};
|
||||
use embassy_time::{Delay, Duration, Instant, Timer};
|
||||
|
@ -37,19 +38,6 @@ enum PollState {
|
|||
Gyro,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct SensorData {
|
||||
/// distance, mm
|
||||
tof1: Option<u16>,
|
||||
/// distance, mm
|
||||
tof2: Option<u16>,
|
||||
/// acceleration, rad/s
|
||||
gyro: Option<Vector3<f32>>,
|
||||
/// acceleration, g
|
||||
accel: Option<Vector3<f32>>,
|
||||
updated: Instant,
|
||||
}
|
||||
|
||||
#[embassy_executor::task]
|
||||
async fn init_sensors(mut hardware: SensorHardware) {
|
||||
let bus = RefCell::new(hardware.bus_tof);
|
||||
|
@ -72,8 +60,8 @@ async fn init_sensors(mut hardware: SensorHardware) {
|
|||
tof2: None,
|
||||
gyro: None,
|
||||
accel: None,
|
||||
updated: Instant::now(),
|
||||
};
|
||||
let mut updated_ts = Instant::now();
|
||||
|
||||
loop {
|
||||
let mut updated = false;
|
||||
|
@ -102,10 +90,10 @@ async fn init_sensors(mut hardware: SensorHardware) {
|
|||
updated = true;
|
||||
}
|
||||
if updated {
|
||||
data.updated = Instant::now();
|
||||
updated_ts = Instant::now();
|
||||
}
|
||||
POLL_STATE.store(PollState::None as u8, Ordering::SeqCst);
|
||||
|
||||
CHANNEL.send(data.clone()).await;
|
||||
CHANNEL.send((data.clone(), updated_ts.clone())).await;
|
||||
}
|
||||
}
|
||||
|
|
378
interface/Cargo.lock
generated
378
interface/Cargo.lock
generated
|
@ -2,6 +2,21 @@
|
|||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "addr2line"
|
||||
version = "0.24.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
|
||||
dependencies = [
|
||||
"gimli",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "adler2"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
|
||||
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "1.1.3"
|
||||
|
@ -48,6 +63,24 @@ version = "1.0.95"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
|
||||
|
||||
[[package]]
|
||||
name = "approx"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atomic-polyfill"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4"
|
||||
dependencies = [
|
||||
"critical-section",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atty"
|
||||
version = "0.2.14"
|
||||
|
@ -65,6 +98,21 @@ version = "1.4.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
|
||||
|
||||
[[package]]
|
||||
name = "backtrace"
|
||||
version = "0.3.74"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
|
||||
dependencies = [
|
||||
"addr2line",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"miniz_oxide",
|
||||
"object",
|
||||
"rustc-demangle",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bindgen"
|
||||
version = "0.70.1"
|
||||
|
@ -101,6 +149,12 @@ version = "3.16.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
||||
|
||||
[[package]]
|
||||
name = "bytes"
|
||||
version = "1.9.0"
|
||||
|
@ -165,6 +219,12 @@ dependencies = [
|
|||
"vec_map",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cobs"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15"
|
||||
|
||||
[[package]]
|
||||
name = "combine"
|
||||
version = "4.6.7"
|
||||
|
@ -175,6 +235,15 @@ dependencies = [
|
|||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "common"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"nalgebra",
|
||||
"postcard",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation-sys"
|
||||
version = "0.8.7"
|
||||
|
@ -224,6 +293,12 @@ dependencies = [
|
|||
"windows",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "critical-section"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
|
||||
|
||||
[[package]]
|
||||
name = "dasp_sample"
|
||||
version = "0.11.0"
|
||||
|
@ -242,18 +317,47 @@ version = "1.0.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||
|
||||
[[package]]
|
||||
name = "gimli"
|
||||
version = "0.31.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
|
||||
|
||||
[[package]]
|
||||
name = "glob"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
|
||||
|
||||
[[package]]
|
||||
name = "hash32"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
|
||||
|
||||
[[package]]
|
||||
name = "heapless"
|
||||
version = "0.7.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f"
|
||||
dependencies = [
|
||||
"atomic-polyfill",
|
||||
"hash32",
|
||||
"rustc_version",
|
||||
"serde",
|
||||
"spin",
|
||||
"stable_deref_trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.3.3"
|
||||
|
@ -287,9 +391,14 @@ name = "interface"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"common",
|
||||
"cpal",
|
||||
"heapless",
|
||||
"pitch-detection",
|
||||
"postcard",
|
||||
"rust-music-theory",
|
||||
"serde",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -364,6 +473,16 @@ dependencies = [
|
|||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"scopeguard",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.25"
|
||||
|
@ -391,6 +510,41 @@ version = "0.2.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
||||
|
||||
[[package]]
|
||||
name = "miniz_oxide"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924"
|
||||
dependencies = [
|
||||
"adler2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mio"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"wasi",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nalgebra"
|
||||
version = "0.31.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "20bd243ab3dbb395b39ee730402d2e5405e448c75133ec49cc977762c4cba3d1"
|
||||
dependencies = [
|
||||
"approx",
|
||||
"num-complex",
|
||||
"num-rational",
|
||||
"num-traits",
|
||||
"serde",
|
||||
"simba",
|
||||
"typenum",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ndk"
|
||||
version = "0.8.0"
|
||||
|
@ -437,6 +591,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -459,6 +614,16 @@ dependencies = [
|
|||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-rational"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.19"
|
||||
|
@ -489,6 +654,15 @@ dependencies = [
|
|||
"syn 2.0.96",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "object"
|
||||
version = "0.36.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "oboe"
|
||||
version = "0.6.1"
|
||||
|
@ -518,6 +692,41 @@ version = "1.20.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.12.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
"parking_lot_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot_core"
|
||||
version = "0.9.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
"smallvec",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "paste"
|
||||
version = "1.0.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.2.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
|
||||
|
||||
[[package]]
|
||||
name = "pitch-detection"
|
||||
version = "0.3.0"
|
||||
|
@ -533,6 +742,17 @@ version = "0.3.31"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
|
||||
|
||||
[[package]]
|
||||
name = "postcard"
|
||||
version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8"
|
||||
dependencies = [
|
||||
"cobs",
|
||||
"heapless",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "primal-check"
|
||||
version = "0.3.4"
|
||||
|
@ -569,6 +789,15 @@ dependencies = [
|
|||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.5.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
|
||||
dependencies = [
|
||||
"bitflags 2.8.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.11.1"
|
||||
|
@ -610,12 +839,27 @@ dependencies = [
|
|||
"strum_macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-demangle"
|
||||
version = "0.1.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
||||
|
||||
[[package]]
|
||||
name = "rustc_version"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
|
||||
dependencies = [
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustfft"
|
||||
version = "6.2.0"
|
||||
|
@ -646,12 +890,96 @@ dependencies = [
|
|||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.217"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.217"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.96",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-registry"
|
||||
version = "1.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "simba"
|
||||
version = "0.7.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2f3fd720c48c53cace224ae62bef1bbff363a70c68c4802a78b5cc6159618176"
|
||||
dependencies = [
|
||||
"approx",
|
||||
"num-complex",
|
||||
"num-traits",
|
||||
"paste",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.13.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
||||
|
||||
[[package]]
|
||||
name = "socket2"
|
||||
version = "0.5.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.9.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
|
||||
|
||||
[[package]]
|
||||
name = "strength_reduce"
|
||||
version = "0.2.4"
|
||||
|
@ -733,6 +1061,35 @@ dependencies = [
|
|||
"syn 2.0.96",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.43.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
|
||||
dependencies = [
|
||||
"backtrace",
|
||||
"bytes",
|
||||
"libc",
|
||||
"mio",
|
||||
"parking_lot",
|
||||
"pin-project-lite",
|
||||
"signal-hook-registry",
|
||||
"socket2",
|
||||
"tokio-macros",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-macros"
|
||||
version = "2.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.96",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.6.8"
|
||||
|
@ -760,6 +1117,12 @@ dependencies = [
|
|||
"strength_reduce",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.14"
|
||||
|
@ -800,6 +1163,12 @@ dependencies = [
|
|||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.0+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.100"
|
||||
|
@ -950,6 +1319,15 @@ dependencies = [
|
|||
"windows-targets 0.42.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
||||
dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.59.0"
|
||||
|
|
|
@ -7,4 +7,9 @@ edition = "2021"
|
|||
anyhow = "1.0.95"
|
||||
cpal = "0.15.3"
|
||||
pitch-detection = "0.3"
|
||||
postcard = "1.1.1"
|
||||
rust-music-theory = {git = "https://github.com/the-drunk-coder/rust-music-theory", rev = "a062d65"}
|
||||
serde = "1.0.217"
|
||||
tokio = { version = "1.43.0", features = ["full"] }
|
||||
common = {path = "../common"}
|
||||
heapless = "0.7.0"
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
#![feature(iter_collect_into)]
|
||||
use std::{sync::mpsc, thread::sleep, time::Duration};
|
||||
use std::{thread::sleep, time::Duration};
|
||||
|
||||
use anyhow::{Context, Ok, Result};
|
||||
use common::{ControlPacket, TelemetryPacket};
|
||||
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
||||
use pitch_detection::{detector::{mcleod::McLeodDetector, PitchDetector}, utils};
|
||||
use rust_music_theory::note::{Note, NoteLetter, Pitch, Tuning};
|
||||
use tokio::{io::{AsyncReadExt, AsyncWriteExt, BufWriter, WriteHalf}, net::{tcp::{OwnedReadHalf, OwnedWriteHalf}, TcpStream}, sync::mpsc};
|
||||
|
||||
fn main() -> Result<()> {
|
||||
// assumes pulseaudio system with f32 samples and 2204 sample packets
|
||||
|
@ -17,10 +19,10 @@ fn main() -> Result<()> {
|
|||
dbg!(config.sample_format());
|
||||
let rate = config.sample_rate();
|
||||
|
||||
let (sender, notes) = mpsc::channel();
|
||||
let (sender, notes) = mpsc::channel(2);
|
||||
|
||||
const POWER_THRESHOLD: f32 = 5.0;
|
||||
const CLARITY_THRESHOLD: f32 = 0.7;
|
||||
const CLARITY_THRESHOLD: f32 = 0.85;
|
||||
const PACKET_LEN: usize = 2204;
|
||||
|
||||
let stream = device.build_input_stream(&config.into(),
|
||||
|
@ -31,7 +33,7 @@ fn main() -> Result<()> {
|
|||
// reinitialized every packet as it is not thread safe
|
||||
let mut detctor = McLeodDetector::new(PACKET_LEN, PACKET_LEN/2);
|
||||
let vol = utils::buffer::square_sum(data);
|
||||
sender.send((detctor.get_pitch(data, rate.0 as usize, POWER_THRESHOLD, CLARITY_THRESHOLD),vol)).unwrap();
|
||||
sender.blocking_send((detctor.get_pitch(data, rate.0 as usize, POWER_THRESHOLD, CLARITY_THRESHOLD),vol)).unwrap();
|
||||
|
||||
},
|
||||
move |err| {eprintln!("{err}")} ,
|
||||
|
@ -39,37 +41,91 @@ fn main() -> Result<()> {
|
|||
|
||||
stream.play()?;
|
||||
|
||||
for (note,vol) in notes {
|
||||
if let Some(note) = note {
|
||||
//dbg!(note.frequency);
|
||||
dbg!(note.clarity);
|
||||
dbg!(vol);
|
||||
let note = Note::from_freq(note.frequency, Tuning::EqualTemperament);
|
||||
match note.pitch {
|
||||
Pitch { letter: NoteLetter::A, accidental: 0} => {
|
||||
println!("forward");
|
||||
}
|
||||
Pitch { letter: NoteLetter::A, accidental: 1} => {
|
||||
println!("backward");
|
||||
}
|
||||
Pitch { letter: NoteLetter::C, accidental: 0} => {
|
||||
println!("right");
|
||||
}
|
||||
Pitch { letter: NoteLetter::C, accidental: 1} => {
|
||||
println!("left");
|
||||
}
|
||||
Pitch { letter: NoteLetter::G, accidental: 0} => {
|
||||
println!("fire");
|
||||
}
|
||||
pitch => {
|
||||
dbg!(pitch);
|
||||
}
|
||||
let executor = tokio::runtime::Runtime::new()?;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let control = executor.block_on(async {
|
||||
let cruisecontrol = TcpStream::connect("169.254.1.1:1234").await?;
|
||||
cruisecontrol.set_nodelay(true)?;
|
||||
let (telem, control) = cruisecontrol.into_split();
|
||||
|
||||
tokio::spawn(telemetry_handler(telem));
|
||||
|
||||
Ok(control)
|
||||
})?;
|
||||
|
||||
|
||||
executor.block_on(controller(notes, control)).unwrap();
|
||||
|
||||
drop(stream);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn telemetry_handler(mut telem: OwnedReadHalf) -> Result<()> {
|
||||
let mut buf = vec![0; 2048];
|
||||
loop {
|
||||
let len = telem.read_u32().await.context("bad length")? as usize;
|
||||
let data = &mut buf[0..len];
|
||||
telem.read_exact(data).await?;
|
||||
let telem: TelemetryPacket = postcard::from_bytes(&data)?;
|
||||
|
||||
println!("telem: {telem:?}");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
async fn controller(mut notes: mpsc::Receiver<(Option<pitch_detection::Pitch<f32>>, f32)>, controller: OwnedWriteHalf) -> Result<()> {
|
||||
let mut controller = BufWriter::new(controller);
|
||||
loop {
|
||||
let mut control = ControlPacket::Stop;
|
||||
|
||||
let (note,vol) = notes.recv().await.context("channel closed")?;
|
||||
if let Some(note) = note {
|
||||
//dbg!(note.frequency);
|
||||
//dbg!(note.clarity);
|
||||
//dbg!(vol);
|
||||
let note = Note::from_freq(note.frequency, Tuning::EqualTemperament);
|
||||
match note.pitch {
|
||||
Pitch { letter: NoteLetter::A, accidental: 0} => {
|
||||
println!("forward");
|
||||
control = ControlPacket::Twist(1.0, 0.0);
|
||||
}
|
||||
Pitch { letter: NoteLetter::A, accidental: 1} => {
|
||||
println!("backward");
|
||||
control = ControlPacket::Twist(-1.0, 0.0);
|
||||
}
|
||||
Pitch { letter: NoteLetter::C, accidental: 0} => {
|
||||
println!("right");
|
||||
control = ControlPacket::Twist(0.0, 1.0);
|
||||
}
|
||||
Pitch { letter: NoteLetter::C, accidental: 1} => {
|
||||
println!("left");
|
||||
control = ControlPacket::Twist(0.0, -1.0);
|
||||
}
|
||||
Pitch { letter: NoteLetter::G, accidental: 0} => {
|
||||
println!("fire");
|
||||
control = ControlPacket::Fire;
|
||||
}
|
||||
Pitch { letter: NoteLetter::E, accidental: 0} => {
|
||||
println!("fire");
|
||||
control = ControlPacket::Fire;
|
||||
}
|
||||
_pitch => {
|
||||
if vol > 3000. {
|
||||
println!("fire");
|
||||
control = ControlPacket::FireOverride(1.0);
|
||||
} else {
|
||||
//dbg!(pitch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let control: heapless::Vec<u8, 2048> = postcard::to_vec(&control)?;
|
||||
controller.write_u32(control.len() as u32).await?;
|
||||
controller.write_all(&control).await?;
|
||||
controller.flush().await?;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue