diff --git a/boards/dongle/loopback-nousb.rs b/boards/dongle/loopback-nousb.rs deleted file mode 100644 index 2283049..0000000 --- a/boards/dongle/loopback-nousb.rs +++ /dev/null @@ -1,35 +0,0 @@ -#![deny(unused_must_use)] -#![no_main] -#![no_std] - -use hal::{radio::{self, Channel}, led}; -use panic_abort as _; - -#[no_mangle] -fn main() -> ! { - let (mut rtx, mut rrx) = radio::claim(Channel::_21); // <- change this - let led = led::Green; - - let task = async { - let mut packet = radio::Packet::new().await; - let mut on = true; - - loop { - let crcres = rrx.read(&mut packet).await; - // togle LED on each new packet - if on { - led.on(); - } else { - led.off(); - } - on = !on; - - if crcres.is_ok() { - packet.reverse(); - rtx.write(&packet).await.ok(); - } - } - }; - - executor::run!(task) -} diff --git a/boards/dongle/loopback.rs b/boards/dongle/loopback.rs deleted file mode 100644 index 65a886c..0000000 --- a/boards/dongle/loopback.rs +++ /dev/null @@ -1,125 +0,0 @@ -#![deny(unused_must_use)] -#![no_main] -#![no_std] - -use core::{convert::TryFrom, fmt::Write as _}; - -use async_core::unsync::Mutex; -use hal::{ - radio::{self, Channel}, - usbd, -}; -use heapless::{consts, String}; -use panic_abort as _; - -#[no_mangle] -fn main() -> ! { - let stx = Mutex::new(usbd::serial()); - let (mut hidout, _) = usbd::hid(); - let (rtx, mut rrx) = radio::claim(Channel::_20); - - let mut output = String::::new(); - - output.push_str("deviceid=").ok(); - write!(output, "{:08x}{:08x}", hal::deviceid1(), hal::deviceid0()).ok(); - write!( - output, - " channel={} TxPower=+8dBm app=loopback.hex\n", - rtx.channel() - ) - .ok(); - - let rtx = Mutex::new(rtx); - - let t1 = async { - let mut output = String::::new(); - let mut hidbuf = usbd::Packet::new().await; - let zlp = radio::Packet::new().await; - - loop { - hidout.recv(&mut hidbuf).await; - semidap::info!("HID: {}", *hidbuf); - - let arg = if hidbuf.len() == 1 { - // Linux / macOS - Some(hidbuf[0]) - } else if hidbuf.len() == 64 { - // Windows (it zero pads the packet) - Some(hidbuf[0]) - } else { - None - }; - - if let Some(arg) = arg { - if let Ok(chan) = Channel::try_from(arg) { - let mut rtx = rtx.lock().await; - rtx.set_channel(chan); - // send a zero-length packet to force the radio to listen on the new channel - rtx.write(&zlp).await.ok(); - drop(rtx); - - output.clear(); - writeln!(output, "now listening on channel {}", chan).ok(); - stx.lock().await.write(output.as_bytes()); - } else { - stx.lock() - .await - .write(b"requested channel is out of range (11-26)\n"); - } - } else { - stx.lock().await.write(b"invalid HID packet\n"); - } - } - }; - - let t2 = async { - let mut packet = radio::Packet::new().await; - stx.lock().await.write(output.as_bytes()); - - loop { - let crcres = rrx.read(&mut packet).await; - let len = packet.len(); - let lqi = if len >= 3 { - Some(packet.lqi()) - } else { - // packet is too small; LQI is not valid - None - }; - - let mut busy = false; - if crcres.is_ok() { - packet.reverse(); - busy = rtx.lock().await.write(&packet).await.is_err(); - } - - output.clear(); - write!( - &mut output, - "received {} byte{}", - len, - if len == 1 { "" } else { "s" } - ) - .ok(); - - let (res, crc) = match crcres { - Ok(x) => ("Ok", x), - Err(x) => ("Err", x), - }; - - write!(&mut output, " (CRC={}({:#06x})", res, crc).ok(); - if let Some(lqi) = lqi { - write!(&mut output, ", LQI={}", lqi).ok(); - } - output.push_str(")\n").ok(); - - if busy { - output.push_str("didn't reply -- channel was busy\n").ok(); - stx.lock().await.write(output.as_bytes()); - } - - stx.lock().await.write(output.as_bytes()); - } - }; - - executor::run!(t1, t2) -} diff --git a/boards/dongle/puzzle-nousb.rs b/boards/dongle/puzzle-nousb.rs deleted file mode 100644 index b1962c8..0000000 --- a/boards/dongle/puzzle-nousb.rs +++ /dev/null @@ -1,80 +0,0 @@ -#![deny(unused_must_use)] -#![no_main] -#![no_std] - -use hal::{ - led, - radio::{self, Channel, Packet}, -}; -use heapless::{consts, LinearMap}; -use panic_abort as _; - -const CHANNEL: Channel = Channel::_26; - -static FROM: &[u8] = &[ - // -]; - -static TO: &[u8] = &[ - // -]; - -// store the secret rather than the plaintext -- otherwise `strings $elf` will reveal the answer -static SECRET: &[u8] = b""; - -#[no_mangle] -fn main() -> ! { - let (mut rtx, mut rrx) = radio::claim(CHANNEL); - let led = led::Green; - - let mut dict = LinearMap::<_, _, consts::U128>::new(); - for (&from, &to) in FROM.iter().zip(TO.iter()) { - dict.insert(from, to).ok(); - } - - let task = async { - let mut packet = Packet::new().await; - let mut on = true; - - loop { - let crcres = rrx.read(&mut packet).await; - // toggle LED on each new packet - if on { - led.on(); - } else { - led.off(); - } - on = !on; - - if crcres.is_ok() { - if packet.is_empty() { - packet.copy_from_slice(SECRET); - } else if packet.len() == 1 { - let p = packet[0]; - let c = dict.get(&p).unwrap_or(&p); - packet.copy_from_slice(&[*c]); - } else { - // encrypt - for slot in packet.iter_mut() { - if let Some(c) = dict.get(slot) { - *slot = *c; - } - } - - let matches = &packet[..] == SECRET; - packet.copy_from_slice(if matches { - led::Blue.on(); - b"correct" - } else { - led::Blue.off(); - b"incorrect" - }); - } - - rtx.write(&packet).await.ok(); - } - } - }; - - executor::run!(task) -} diff --git a/boards/dongle/puzzle.rs b/boards/dongle/puzzle.rs deleted file mode 100644 index c2b9727..0000000 --- a/boards/dongle/puzzle.rs +++ /dev/null @@ -1,156 +0,0 @@ -#![deny(unused_must_use)] -#![no_main] -#![no_std] - -use core::{fmt::Write as _, convert::TryFrom}; - -use async_core::unsync::Mutex; -use hal::{radio::{self, Packet, Channel}, usbd, led}; -use heapless::{consts, LinearMap, String}; -use panic_abort as _; - -static FROM: &[u8] = &[ - // -]; - -static TO: &[u8] = &[ - // -]; - -// store the secret rather than the plaintext -- otherwise `strings $elf` will reveal the answer -static SECRET: &[u8] = b""; - -#[no_mangle] -fn main() -> ! { - // so we can visually differentiate this one from `loopback.hex` - led::Green.on(); - - let stx = Mutex::new(usbd::serial()); - let (mut hidout, _) = usbd::hid(); - let (rtx, mut rrx) = radio::claim(Channel::_25); - let mut output = String::::new(); - - let mut dict = LinearMap::<_, _, consts::U128>::new(); - for (&from, &to) in FROM.iter().zip(TO.iter()) { - dict.insert(from, to).ok(); - } - - output.push_str("deviceid=").ok(); - write!(output, "{:08x}{:08x}", hal::deviceid1(), hal::deviceid0()).ok(); - write!(output, " channel={} TxPower=+8dBm app=puzzle.hex\n", rtx.channel()).ok(); - - let rtx = Mutex::new(rtx); - - let t1 = async { - let mut output = String::::new(); - let mut hidbuf = usbd::Packet::new().await; - let zlp = radio::Packet::new().await; - - loop { - hidout.recv(&mut hidbuf).await; - semidap::info!("HID: {}", *hidbuf); - - let arg = if hidbuf.len() == 1 { - // Linux / macOS - Some(hidbuf[0]) - } else if hidbuf.len() == 64 { - // Windows (it zero pads the packet) - Some(hidbuf[0]) - } else { - None - }; - - if let Some(arg) = arg { - if let Ok(chan) = Channel::try_from(arg) { - let mut rtx = rtx.lock().await; - rtx.set_channel(chan); - // send a zero-length packet to force the radio to listen on the new channel - rtx.write(&zlp).await.ok(); - drop(rtx); - - output.clear(); - writeln!(output, "now listening on channel {}", chan).ok(); - stx.lock().await.write(output.as_bytes()); - } else { - stx.lock() - .await - .write(b"requested channel is out of range (11-26)\n"); - } - } else { - stx.lock().await.write(b"invalid HID packet\n"); - } - } - }; - - let t2 = async { - let mut packet = Packet::new().await; - stx.lock().await.write(output.as_bytes()); - - loop { - let crcres = rrx.read(&mut packet).await; - let len = packet.len(); - let lqi = if len >= 3 { - Some(packet.lqi()) - } else { - // packet is too small; LQI is not valid - None - }; - - let mut busy = false; - if crcres.is_ok() { - if packet.is_empty() { - packet.copy_from_slice(SECRET); - } else if packet.len() == 1 { - let p = packet[0]; - let c = dict.get(&p).unwrap_or(&p); - packet.copy_from_slice(&[*c]); - } else { - // encrypt - for slot in packet.iter_mut() { - if let Some(c) = dict.get(slot) { - *slot = *c; - } - } - - let matches = &packet[..] == SECRET; - packet.copy_from_slice(if matches { - b"correct" - } else { - b"incorrect" - }); - } - - busy = rtx.lock().await.write(&packet).await.is_err(); - } - - output.clear(); - write!( - &mut output, - "received {} byte{}", - len, - if len == 1 { "" } else { "s" } - ) - .ok(); - - let (res, crc) = match crcres { - Ok(x) => ("Ok", x), - Err(x) => ("Err", x), - }; - - write!(&mut output, " (CRC={}({:#06x})", res, crc).ok(); - if let Some(lqi) = lqi { - write!(&mut output, ", LQI={}", lqi).ok(); - } - output.push_str(")\n").ok(); - - if busy { - output.push_str("didn't reply -- channel was busy\n").ok(); - stx.lock().await.write(output.as_bytes()); - } - - stx.lock().await.write(output.as_bytes()); - } - }; - - executor::run!(t1, t2) -}