diff --git a/Cargo.lock b/Cargo.lock index 5a45f58..b8099aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -146,7 +146,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" dependencies = [ - "rustc_version 0.2.3", + "rustc_version", ] [[package]] @@ -197,12 +197,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - [[package]] name = "colored" version = "1.9.4" @@ -214,12 +208,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - [[package]] name = "cortex-m" version = "0.7.7" @@ -373,18 +361,6 @@ dependencies = [ "nb 1.1.0", ] -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - [[package]] name = "embedded-storage" version = "0.3.1" @@ -512,15 +488,6 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - [[package]] name = "hash32" version = "0.3.1" @@ -536,28 +503,13 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -[[package]] -name = "heapless" -version = "0.7.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" -dependencies = [ - "atomic-polyfill", - "hash32 0.2.1", - "rustc_version 0.4.1", - "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 = [ - "defmt", - "hash32 0.3.1", + "hash32", "serde", "stable_deref_trait", ] @@ -676,16 +628,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "io-kit-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" -dependencies = [ - "core-foundation-sys", - "mach2", -] - [[package]] name = "is-terminal" version = "0.4.12" @@ -721,26 +663,6 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" -[[package]] -name = "libudev" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b324152da65df7bb95acfcaab55e3097ceaab02fb19b228a9eb74d55f135e0" -dependencies = [ - "libc", - "libudev-sys", -] - -[[package]] -name = "libudev-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" -dependencies = [ - "libc", - "pkg-config", -] - [[package]] name = "litrs" version = "0.4.1" @@ -763,15 +685,6 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] - [[package]] name = "matchit" version = "0.7.3" @@ -842,17 +755,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", -] - [[package]] name = "nom" version = "7.1.3" @@ -1033,32 +935,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - [[package]] name = "portable-atomic" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" -[[package]] -name = "postcard" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7f0a8d620d71c457dd1d47df76bb18960378da56af4527aaa10f515eee732e" -dependencies = [ - "cobs", - "defmt", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "heapless 0.7.17", - "serde", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -1126,20 +1008,15 @@ dependencies = [ "defmt-brtt", "defmt-rtt", "embedded-hal 1.0.0", - "heapless 0.8.0", "nb 1.1.0", "num", "num-traits", "panic-probe", - "postcard", "qmc5883l", - "radomctl-protocol", "rtic", "rtic-monotonics", "stm32f4xx-hal", "ufmt", - "usb-device", - "usbd-serial", "xca9548a", ] @@ -1147,7 +1024,7 @@ dependencies = [ name = "radomctl-protocol" version = "0.1.0" dependencies = [ - "heapless 0.8.0", + "heapless", "serde", ] @@ -1161,10 +1038,7 @@ dependencies = [ "humantime", "log", "nom", - "postcard", - "radomctl-protocol", "serde_json", - "serialport", "tokio", "tokio-macros 0.2.6", "tower-http", @@ -1268,16 +1142,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver 0.9.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.23", + "semver", ] [[package]] @@ -1307,12 +1172,6 @@ dependencies = [ "semver-parser", ] -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - [[package]] name = "semver-parser" version = "0.7.0" @@ -1372,24 +1231,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serialport" -version = "4.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ba776acc8c373b9175829206229366273225436845c04f9c20aab8099960e2e" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "core-foundation-sys", - "io-kit-sys", - "libudev", - "mach2", - "nix", - "scopeguard", - "unescaper", - "winapi", -] - [[package]] name = "sharded-slab" version = "0.1.7" @@ -1424,15 +1265,6 @@ dependencies = [ "windows-sys", ] -[[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" @@ -1472,7 +1304,6 @@ dependencies = [ "nb 1.1.0", "rand_core", "stm32f4", - "synopsys-usb-otg", "time", "vcell", "void", @@ -1512,18 +1343,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" -[[package]] -name = "synopsys-usb-otg" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e948d523b316939545d8b21a48c27aef150ce25321b9f95ff7978647a806a6fe" -dependencies = [ - "cortex-m", - "embedded-hal 0.2.7", - "usb-device", - "vcell", -] - [[package]] name = "thiserror" version = "1.0.63" @@ -1763,15 +1582,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" -[[package]] -name = "unescaper" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c878a167baa8afd137494101a688ef8c67125089ff2249284bd2b5f9bfedb815" -dependencies = [ - "thiserror", -] - [[package]] name = "unicase" version = "2.7.0" @@ -1787,28 +1597,6 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" -[[package]] -name = "usb-device" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98816b1accafbb09085168b90f27e93d790b4bfa19d883466b5e53315b5f06a6" -dependencies = [ - "heapless 0.8.0", - "portable-atomic", -] - -[[package]] -name = "usbd-serial" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065e4eaf93db81d5adac82d9cef8f8da314cb640fa7f89534b972383f1cf80fc" -dependencies = [ - "embedded-hal 0.2.7", - "embedded-io 0.6.1", - "nb 1.1.0", - "usb-device", -] - [[package]] name = "valuable" version = "0.1.0" diff --git a/daemon/Cargo.toml b/daemon/Cargo.toml index bdcee7f..8f34f13 100644 --- a/daemon/Cargo.toml +++ b/daemon/Cargo.toml @@ -11,11 +11,8 @@ humantime = "2.1.0" log = "0.4.21" nom = "7.1.3" serde_json = "1.0.118" -serialport = "4.5.1" tokio = {version = "1.37.0", features = ["full"]} tokio-macros = { version = "0.2.0-alpha.6" } tower-http = { version = "0.5.2", features = ["fs", "trace"] } tracing = "0.1.40" tracing-subscriber = "0.3.18" -radomctl-protocol = { path = "../protocol" } -postcard = {version = "1.0.10", features = ["use-std"]} diff --git a/daemon/src/bin/trigger-dfu.rs b/daemon/src/bin/trigger-dfu.rs deleted file mode 100644 index 472f081..0000000 --- a/daemon/src/bin/trigger-dfu.rs +++ /dev/null @@ -1,16 +0,0 @@ -use std::time::Duration; - -use postcard::{from_bytes_cobs, to_stdvec_cobs}; -use radomctl_protocol::*; -use radomctld::logger::setup_logger; - -pub fn main() -> () { - let mut port = serialport::new("/dev/ttyACM0", 115_200) - .timeout(Duration::from_millis(10)) - .open() - .expect("Failed to open port"); - - let host_msg = HostMessage::TriggerDFUBootloader; - let msg_bytes = to_stdvec_cobs(&host_msg).unwrap(); - port.write_all(&msg_bytes).unwrap(); -} diff --git a/daemon/src/lib.rs b/daemon/src/lib.rs deleted file mode 100644 index 85f9e01..0000000 --- a/daemon/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod logger; -pub mod rotctlprotocol; -pub mod rotor; diff --git a/daemon/src/main.rs b/daemon/src/main.rs index e52eece..5698a6c 100644 --- a/daemon/src/main.rs +++ b/daemon/src/main.rs @@ -1,3 +1,7 @@ +mod logger; +mod rotctlprotocol; +mod rotor; + use anyhow::Result; use fern::colors::{Color, ColoredLevelConfig}; use log::{debug, error, info, warn, Level}; @@ -22,11 +26,10 @@ use tower_http::{ trace::TraceLayer, }; -use radomctld::{ - logger::setup_logger, - rotctlprotocol::{parse_command, Command}, - rotor::control_rotor, -}; +use logger::setup_logger; +use rotor::control_rotor; + +use rotctlprotocol::{parse_command, Command}; async fn process_socket( socket: TcpStream, diff --git a/firmware/.cargo/config.toml b/firmware/.cargo/config.toml index f289182..d190172 100644 --- a/firmware/.cargo/config.toml +++ b/firmware/.cargo/config.toml @@ -1,6 +1,6 @@ [target.'cfg(all(target_arch = "arm", target_os = "none"))'] # TODO(2) replace `$CHIP` with your chip's name (see `probe-run --list-chips` output) -runner = "probe-rs run --chip STM32F401CCUx" +runner = "probe-run --chip STM32F401CCU6" rustflags = [ "-C", "linker=flip-link", "-C", "link-arg=-Tlink.x", diff --git a/firmware/Cargo.toml b/firmware/Cargo.toml index 67eb530..ff5f101 100644 --- a/firmware/Cargo.toml +++ b/firmware/Cargo.toml @@ -10,7 +10,7 @@ defmt-brtt = { version = "0.1", default-features = false, features = ["rtt"] } panic-probe = { version = "0.3", features = ["print-defmt"] } rtic = { version = "2.0.1", features = [ "thumbv7-backend" ] } defmt-rtt = "0.4" -stm32f4xx-hal = { version = "0.21.0", features = ["stm32f401", "usb_fs"] } +stm32f4xx-hal = { version = "0.21.0", features = ["stm32f401"] } embedded-hal = {version = "1.0.0"} nb = "1.0.0" num-traits = { version = "0.2", default-features = false, features = ["libm"] } @@ -20,12 +20,6 @@ qmc5883l = "0.0.1" rtic-monotonics = {version = "2.0.2", features = ["cortex-m-systick"]} xca9548a = "0.2.1" as5048a = { git = "https://github.com/LongHairedHacker/as5048a", rev="b15d716bf47ce4975a6cefebf82006c9b09e8fea"} -usb-device = "0.3.2" -usbd-serial = "0.2.2" -postcard = {version = "1.0.10", features = ["use-defmt"]} -heapless = {version = "0.8.0", features = ["defmt-03"]} -radomctl-protocol = { path = "../protocol" } - [features] # set logging levels here diff --git a/firmware/src/bootloader.rs b/firmware/src/bootloader.rs deleted file mode 100644 index 382e442..0000000 --- a/firmware/src/bootloader.rs +++ /dev/null @@ -1,59 +0,0 @@ -use core::ptr::addr_of_mut; - -use stm32f4xx_hal::pac; - -fn jump_to_bootloader() { - unsafe { - cortex_m::interrupt::disable(); - - let address: u32 = 0x1FFF0000; - - let device = pac::Peripherals::steal(); - device.SYSCFG.memrm.modify(|_, w| w.bits(0x01)); - - let mut p = cortex_m::Peripherals::steal(); - p.SCB.invalidate_icache(); - p.SCB.vtor.write(address as u32); - - cortex_m::interrupt::enable(); - - cortex_m::asm::bootload(address as *const u32); - } -} - -const BOOTLOADER_REQUESTED: u32 = 0xdecafbad; - -fn magic_mut_ptr() -> *mut u32 { - extern "C" { - #[link_name = "_dfu_magic"] - static mut magic: u32; - } - - unsafe { addr_of_mut!(magic) } -} - -fn get_bootloader_flag() -> u32 { - unsafe { magic_mut_ptr().read_volatile() } -} - -fn set_bootloader_flag() { - unsafe { magic_mut_ptr().write_volatile(BOOTLOADER_REQUESTED) }; -} - -fn clear_bootloader_flag() { - unsafe { magic_mut_ptr().write_volatile(BOOTLOADER_REQUESTED) }; -} - -pub fn init() { - let requested = get_bootloader_flag() == BOOTLOADER_REQUESTED; - if requested { - clear_bootloader_flag(); - jump_to_bootloader(); - } -} - -pub fn reboot_to_bootloader() -> ! { - defmt::info!("Rebooting into the bootloader"); - set_bootloader_flag(); - cortex_m::peripheral::SCB::sys_reset(); -} diff --git a/firmware/src/main.rs b/firmware/src/main.rs index 01f3204..ac5a199 100644 --- a/firmware/src/main.rs +++ b/firmware/src/main.rs @@ -6,8 +6,6 @@ use defmt_brtt as _; // global logger use panic_probe as _; use stm32f4xx_hal as _; -mod bootloader; - // same panicking *behavior* as `panic-probe` but doesn't print a panic message // this prevents the panic message being printed *twice* when `defmt::panic` is invoked #[defmt::panic_handler] @@ -15,44 +13,35 @@ fn panic() -> ! { cortex_m::asm::udf() } + #[rtic::app( device = stm32f4xx_hal::pac, dispatchers = [SPI3] )] mod app { - use as5048a::AS5048A; + - use core::fmt::Write; - use heapless::{String, Vec}; - use num_traits::{Float, FloatConst}; - use postcard::{from_bytes_cobs, to_vec_cobs}; + use as5048a::AS5048A; + use stm32f4xx_hal::{ gpio::{gpioa, gpiob, gpioc, Output, PushPull}, i2c, - otg_fs::{UsbBus, UsbBusType, USB}, pac::{I2C1, SPI1}, prelude::*, - signature, spi, + spi, }; - use usb_device::prelude::*; - use usb_device::{class_prelude::UsbBusAllocator, device}; - use usbd_serial::SerialPort; + + use num_traits::{Float, FloatConst}; use xca9548a::{SlaveAddr, Xca9548a}; use qmc5883l::{self, QMC5883L}; - use radomctl_protocol::*; - use rtic_monotonics::systick::prelude::*; - use crate::bootloader; - systick_monotonic!(Mono, 1000); - const USB_BUFFER_SIZE: usize = 64; - // Shared resources go here #[shared] struct Shared { @@ -71,23 +60,17 @@ mod app { spi_cs3: gpiob::PB15>, spi1: spi::Spi, - az_enable: gpioa::PA10>, + az_enable: gpioa::PA12>, az_dir: gpioa::PA15>, az_step: gpiob::PB3>, el_enable: gpiob::PB4>, el_dir: gpioa::PA8>, el_step: gpioa::PA9>, - - usb_dev: UsbDevice<'static, UsbBusType>, - usb_serial: SerialPort<'static, UsbBusType>, - usb_buffer: Vec, } #[init] fn init(cx: init::Context) -> (Shared, Local) { - bootloader::init(); - defmt::info!("init"); let rcc = cx.device.RCC.constrain(); @@ -97,14 +80,19 @@ mod app { let clocks = rcc .cfgr .use_hse(25.MHz()) - .sysclk(84.MHz()) .require_pll48clk() + .sysclk(84.MHz()) + .hclk(84.MHz()) + .pclk1(42.MHz()) + .pclk2(84.MHz()) .freeze(); Mono::start(cx.core.SYST, clocks.sysclk().to_Hz()); defmt::info!("Clock Setup done"); + defmt::info!("Clock Setup done"); + // Acquire the GPIO peripherials let gpioa = cx.device.GPIOA.split(); let gpiob = cx.device.GPIOB.split(); @@ -112,47 +100,6 @@ mod app { let board_led = gpioc.pc13.into_push_pull_output(); - defmt::info!("Basic gpio setup done"); - - static mut EP_MEMORY: [u32; 1024] = [0; 1024]; - static mut USB_BUS: Option> = None; - - let usb = USB::new( - ( - cx.device.OTG_FS_GLOBAL, - cx.device.OTG_FS_DEVICE, - cx.device.OTG_FS_PWRCLK, - ), - (gpioa.pa11, gpioa.pa12), - &clocks, - ); - - unsafe { - USB_BUS.replace(UsbBus::new(usb, &mut EP_MEMORY)); - } - - let usb_serial = usbd_serial::SerialPort::new(unsafe { USB_BUS.as_ref().unwrap() }); - - let uid = signature::Uid::get(); - - static mut SERIAL: String<16> = String::new(); - unsafe { - write!(SERIAL, "{}{:x}{:x}", uid.lot_num(), uid.x(), uid.y()).unwrap(); - } - - let usb_dev = unsafe { - UsbDeviceBuilder::new(USB_BUS.as_ref().unwrap(), UsbVidPid(0x16c0, 0x27dd)) - .device_class(usbd_serial::USB_CLASS_CDC) - .strings(&[StringDescriptors::default() - .manufacturer("Amteurfunk Forschungs Gruppe") - .product("Radom Controler") - .serial_number(SERIAL.as_ref())]) - .unwrap() - .build() - }; - - defmt::info!("USB Setup done"); - // Todo: Check if internal pullups work here let scl = gpiob.pb6.into_alternate_open_drain(); let sda = gpiob.pb7.into_alternate_open_drain(); @@ -168,7 +115,7 @@ mod app { defmt::info!("I2C Setup done"); let mut i2cmux = Xca9548a::new(i2c, SlaveAddr::default()); - //i2cmux.select_channels(0b0000_0001).unwrap(); + i2cmux.select_channels(0b0000_0001).unwrap(); defmt::info!("I2C MUX Setup done"); @@ -197,7 +144,7 @@ mod app { defmt::info!("SPI Setup done"); - let az_enable = gpioa.pa10.into_push_pull_output(); + let az_enable = gpioa.pa12.into_push_pull_output(); let az_dir = gpioa.pa15.into_push_pull_output(); let az_step = gpiob.pb3.into_push_pull_output(); @@ -207,8 +154,8 @@ mod app { defmt::info!("Motor Setup done"); - //poll_i2c::spawn().ok(); - //poll_spi::spawn().ok(); + poll_i2c::spawn().ok(); + poll_spi::spawn().ok(); ( Shared { az_angle: 0 }, @@ -228,10 +175,6 @@ mod app { el_enable, el_dir, el_step, - - usb_dev, - usb_serial, - usb_buffer: Vec::new(), }, ) } @@ -363,66 +306,4 @@ mod app { } } } - - #[task(binds=OTG_FS, local=[usb_dev, usb_serial, usb_buffer])] - fn usb_fs(cx: usb_fs::Context) { - let usb_dev = cx.local.usb_dev; - let serial = cx.local.usb_serial; - let buffer = cx.local.usb_buffer; - - if !usb_dev.poll(&mut [serial]) { - return; - } - - let mut tmp = [0u8; 16]; - match serial.read(&mut tmp) { - Ok(count) if count > 0 => { - if buffer.extend_from_slice(&tmp[0..count]).is_err() { - buffer.clear(); - defmt::error!("Buffer overflow while waiting for the end of the packet"); - } - } - _ => {} - } - - loop { - if let Some(idx) = buffer.iter().position(|&x| x == 0) { - let (msg, rest) = buffer.split_at(idx + 1); - - let mut message = [0u8; 128]; - message[0..msg.len()].clone_from_slice(msg); - let host_msg = from_bytes_cobs::(&mut message); - - match host_msg { - Ok(host_msg) => match host_msg { - HostMessage::RequestStatus => { - let status = StatusMessage { - position: Position { - az: 42.0, - el: 23.0, - az_endcoder: 0.0, - el_encoder: 0.0, - az_magnetic: 0.0, - el_magnetic: 0.0, - }, - alarms: Vec::new(), - }; - let device_msg = RadomMessage::Status(status); - let bytes = - to_vec_cobs::(&device_msg).unwrap(); - serial.write(bytes.as_slice()).unwrap(); - } - HostMessage::TriggerDFUBootloader => { - bootloader::reboot_to_bootloader(); - } - }, - Err(err) => defmt::error!("Unable to parse host message"), - }; - - *buffer = Vec::::from_slice(rest).unwrap(); - } else { - break; - } - } - } } diff --git a/memory.x b/memory.x index 606d5fd..dfe3ff3 100644 --- a/memory.x +++ b/memory.x @@ -1,23 +1,10 @@ MEMORY { + /* NOTE K = KiBi = 1024 bytes */ FLASH : ORIGIN = 0x08000000, LENGTH = 256K - UNINIT: ORIGIN = 0x20000000, LENGTH = 0x10 - RAM : ORIGIN = 0x20000010, LENGTH = 64K - LENGTH(UNINIT) + RAM : ORIGIN = 0x20000000, LENGTH = 64K } -SECTIONS { - .uninit_flags (NOLOAD) : ALIGN(4) - { - . = ALIGN(4); - __suninit_flags = .; - _dfu_magic = .; . += 4; - *(.uninit_flags .uninit_flags.*) - . = ALIGN(4); - __euninit_flags = .; - } > UNINIT -} - - /* This is where the call stack will be allocated. */ /* The stack is of the full descending type. */ /* NOTE Do NOT modify `_stack_start` unless you know what you are doing */ diff --git a/protocol/src/lib.rs b/protocol/src/lib.rs index 9ae57a1..4793873 100644 --- a/protocol/src/lib.rs +++ b/protocol/src/lib.rs @@ -16,18 +16,18 @@ pub enum HostMessage { #[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] pub struct StatusMessage { - pub position: Position, - pub alarms: Vec, + position: Position, + alarms: Vec, } #[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] pub struct Position { - pub az: f32, - pub el: f32, - pub az_endcoder: f32, - pub el_encoder: f32, - pub az_magnetic: f32, - pub el_magnetic: f32, + az: f32, + el: f32, + az_endcoder: f32, + el_encoder: f32, + az_magnetic: f32, + el_magnetic: f32, } #[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]