From 8167fe55a0bf3f66598fa6cf7b0d024e9a5e3f4a Mon Sep 17 00:00:00 2001 From: Adrian Marquis Date: Sat, 14 Oct 2023 12:45:48 +0200 Subject: [PATCH] headless? --- Cargo.lock | 96 ++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 40 ++++++++++------ src/webee.rs | 39 ++++++++++++---- src/webee/simple_vector.rs | 4 ++ 5 files changed, 156 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a75be05..34554b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -25,6 +25,21 @@ dependencies = [ "avr-hal-generic", ] +[[package]] +name = "atomic-polyfill" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28" +dependencies = [ + "critical-section", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "avr-device" version = "0.5.1" @@ -71,6 +86,7 @@ dependencies = [ "arduino-hal", "avr-device", "embedded-hal", + "heapless", "nb 0.1.3", "panic-halt", "ufmt", @@ -82,6 +98,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "cfg-if" version = "0.1.10" @@ -94,6 +116,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "critical-section" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" + [[package]] name = "embedded-hal" version = "0.2.7" @@ -110,6 +138,38 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "723dce4e9f25b6e6c5f35628e144794e5b459216ed7da97b7c4b66cdb3fa82ca" +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "nb" version = "0.1.3" @@ -161,12 +221,48 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rustversion" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +[[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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" + +[[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 = "syn" version = "1.0.109" diff --git a/Cargo.toml b/Cargo.toml index 8e89630..f1b2c3a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ ufmt = "0.1.0" nb = "0.1.2" embedded-hal = "0.2.3" avr-device = "0.5.1" +heapless = "0.7.16" [dependencies.arduino-hal] git = "https://github.com/rahix/avr-hal" diff --git a/src/main.rs b/src/main.rs index ef9b85a..847e9c6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,13 +2,14 @@ #![no_main] mod webee; + use webee::{Webee}; use arduino_hal::{delay_ms, Peripherals}; use arduino_hal::prelude::*; +use ufmt::{uDisplay}; use panic_halt as _; -use crate::webee::SimpleVec; #[arduino_hal::entry] @@ -16,32 +17,41 @@ fn main() -> ! { let dp = Peripherals::take().unwrap(); let pins = arduino_hal::pins!(dp); let _status = pins.d13.into_output(); - let webee_rx = pins.d2; + let webee_rx = pins.d2.forget_imode(); let mut serial = arduino_hal::default_serial!(dp, pins, 57600); let mut test = Webee::new( dp.USART1, pins.d19.forget_imode(), - pins.d18.into_output() + pins.d18.into_output(), ); - ufmt::uwriteln!(&mut serial, "Webee initialized: {}", webee_rx.is_high()).void_unwrap(); + let ready = webee_rx.is_high(); + ufmt::uwriteln!(&mut serial, "Webee initialized: {}", ready).void_unwrap(); delay_ms(1000); - - { - let x = SimpleVec::from_slice(&[0x5a, 0xaa, 0xb1]); - ufmt::uwrite!(&mut serial, "Vector ({}): ", x.len()); - for byte in &x.items()[..x.len()] { - ufmt::uwrite!(&mut serial, "{:02X} ", *byte); - } - ufmt::uwrite!(&mut serial, "\n"); + if (!ready) { + ufmt::uwriteln!(&mut serial, "Webee initialized: {}", webee_rx.is_high()).void_unwrap(); } - let role = test.send(&[0x5a, 0xaa, 0xb1]); + let func = |byte : u8| { + ufmt::uwriteln!(&mut serial, "R {}", byte); + }; + + test.send_void(&[0x5a, 0xaa, 0xb1]); ufmt::uwrite!(&mut serial, "Role: "); - for byte in role.items() { - ufmt::uwrite!(&mut serial, "{:02X}", byte); + let role = test.recv(); + for i in 0..role.len() { + let byte = *role.get(i).unwrap(); + ufmt::uwrite!(&mut serial, "{} ", byte); } + ufmt::uwriteln!(&mut serial, ""); + + let data = test.recv(); + ufmt::uwrite!(&mut serial, "{}", data.len()); + + // for byte in role.items() { + // ufmt::uwrite!(&mut serial, "{:02X}", byte); + // } // for byte in [0x5a, 0xaa, 0xb1].iter() { // webee.write_byte(*byte); diff --git a/src/webee.rs b/src/webee.rs index bf20de5..d4ef731 100644 --- a/src/webee.rs +++ b/src/webee.rs @@ -4,13 +4,15 @@ use arduino_hal::port::mode::{Input, Output}; use arduino_hal::usart::{Usart, UsartOps}; use arduino_hal::prelude::*; -mod simple_vector; -pub use simple_vector::SimpleVec; +use heapless::Vec; + +// mod simple_vector; +// pub use simple_vector::SimpleVec; pub struct Webee, RX, TX> { - webee: Usart, + pub webee: Usart, } enum SendCmd {} @@ -34,7 +36,7 @@ where } } - pub fn send(&mut self, data: &[u8]) -> SimpleVec { + pub fn send(&mut self, data: &[u8]) -> Vec { for byte in data { self.webee.write_byte(*byte); } @@ -42,12 +44,31 @@ where return self.recv(); } - fn recv(&mut self) -> SimpleVec { - let mut byte: u8 = self.webee.read_byte(); - let mut buffer = SimpleVec::new(); + pub fn send_void(&mut self, data: &[u8]) { + for byte in data { + self.webee.write_byte(*byte); + } + } - while byte != STOP { - buffer.push(byte); + pub fn recv(&mut self) -> Vec { + let mut byte: u8 = self.webee.read_byte(); + let mut buffer = Vec::new(); + + while byte != STOP && !buffer.is_full() { + buffer.push(byte).unwrap(); + byte = self.webee.read_byte(); + } + + return buffer; + } + + pub fn recv_debug(&mut self, callback: fn(u8)) -> Vec { + let mut byte: u8 = self.webee.read_byte(); + callback(byte); + let mut buffer = Vec::new(); + + while byte != STOP && !buffer.is_full() { + buffer.push(byte).unwrap(); byte = self.webee.read_byte(); } diff --git a/src/webee/simple_vector.rs b/src/webee/simple_vector.rs index 9b83068..5ad8c33 100644 --- a/src/webee/simple_vector.rs +++ b/src/webee/simple_vector.rs @@ -34,6 +34,10 @@ impl SimpleVec { len } + pub fn full(&self) -> bool { + self.items.len() == self.len() + } + pub fn push(&mut self, value: u8) { let vec_item = VecItem {