diff --git a/Cargo.lock b/Cargo.lock index 8f2cdf6b..2ba446df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2898,21 +2898,31 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "orb-mcu-interface" +version = "0.0.0" +dependencies = [ + "async-trait", + "can-rs", + "color-eyre", + "orb-messages", + "prost", + "tokio", + "tokio-serial", + "tracing", +] + [[package]] name = "orb-mcu-util" version = "0.7.0" dependencies = [ - "anyhow", "async-trait", - "can-rs", "clap", "color-eyre", "crc32fast", "image", - "orb-messages", - "prost", + "orb-mcu-interface", "tokio", - "tokio-serial", "tracing", "tracing-subscriber", ] diff --git a/Cargo.toml b/Cargo.toml index ef68f849..b43c27d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ members = [ "endpoints", "header-parsing", "hil", + "mcu-interface", "mcu-util", "orb-attest", "orb-backend-state", diff --git a/mcu-interface/Cargo.toml b/mcu-interface/Cargo.toml new file mode 100644 index 00000000..42c620f6 --- /dev/null +++ b/mcu-interface/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "orb-mcu-interface" +version = "0.0.0" +authors = ["Cyril Fougeray "] +description = "Higher-level interface used to communicate with the MCUs" +publish = false + +edition.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true + +[dependencies] +async-trait = "0.1.77" +can-rs = { path = "../can", features = ["isotp"] } +color-eyre.workspace = true +orb-messages.workspace = true +prost = "0.12.3" +tokio.workspace = true +tokio-serial = "5.4.1" +tracing.workspace = true + +[package.metadata.orb] +unsupported_targets = [ + "aarch64-apple-darwin", + "x86_64-apple-darwin", +] diff --git a/mcu-interface/README.md b/mcu-interface/README.md new file mode 100644 index 00000000..b289f04f --- /dev/null +++ b/mcu-interface/README.md @@ -0,0 +1,7 @@ +# orb-mcu-interface + +Higher-level interface used to communicate with the MCUs. + +## Platform support notes + +This binary only works on {aarch64,x86_64}-unknown-linux-gnu, due to `can-rs`. diff --git a/mcu-util/src/messaging/can/canfd.rs b/mcu-interface/src/can/canfd.rs similarity index 98% rename from mcu-util/src/messaging/can/canfd.rs rename to mcu-interface/src/can/canfd.rs index c917dbac..7a63c2bf 100644 --- a/mcu-util/src/messaging/can/canfd.rs +++ b/mcu-interface/src/can/canfd.rs @@ -10,8 +10,8 @@ use std::sync::{mpsc, Arc}; use tokio::time::Duration; use tracing::debug; -use crate::messaging::Device::{JetsonFromMain, JetsonFromSecurity, Main, Security}; -use crate::messaging::{ +use crate::Device::{JetsonFromMain, JetsonFromSecurity, Main, Security}; +use crate::{ create_ack, handle_main_mcu_message, handle_sec_mcu_message, Device, McuPayload, MessagingInterface, }; diff --git a/mcu-util/src/messaging/can/isotp.rs b/mcu-interface/src/can/isotp.rs similarity index 99% rename from mcu-util/src/messaging/can/isotp.rs rename to mcu-interface/src/can/isotp.rs index 2dba8d52..fea9b7a7 100644 --- a/mcu-util/src/messaging/can/isotp.rs +++ b/mcu-interface/src/can/isotp.rs @@ -13,7 +13,7 @@ use can_rs::isotp::addr::CanIsotpAddr; use can_rs::isotp::stream::IsotpStream; use can_rs::{Id, CAN_DATA_LEN}; -use crate::messaging::{ +use crate::{ handle_main_mcu_message, handle_sec_mcu_message, McuPayload, MessagingInterface, }; diff --git a/mcu-util/src/messaging/can/mod.rs b/mcu-interface/src/can/mod.rs similarity index 100% rename from mcu-util/src/messaging/can/mod.rs rename to mcu-interface/src/can/mod.rs diff --git a/mcu-util/src/messaging/mod.rs b/mcu-interface/src/lib.rs similarity index 98% rename from mcu-util/src/messaging/mod.rs rename to mcu-interface/src/lib.rs index 6e78c41f..482155d7 100644 --- a/mcu-util/src/messaging/mod.rs +++ b/mcu-interface/src/lib.rs @@ -9,6 +9,8 @@ use tracing::debug; pub mod can; pub mod serial; +pub use orb_messages; + #[derive(Clone, Debug)] pub enum McuPayload { ToMain(orb_messages::mcu_main::jetson_to_mcu::Payload), @@ -39,7 +41,7 @@ impl From for Device { } #[async_trait] -pub(crate) trait MessagingInterface { +pub trait MessagingInterface { async fn send(&mut self, payload: McuPayload) -> Result; } @@ -55,7 +57,7 @@ fn create_ack(counter: u16) -> u32 { /// Check that ack contains the process ID #[inline] -pub fn is_ack_for_us(ack_number: u32) -> bool { +fn is_ack_for_us(ack_number: u32) -> bool { ack_number >> 16 == process::id() } diff --git a/mcu-util/src/messaging/serial/mod.rs b/mcu-interface/src/serial/mod.rs similarity index 98% rename from mcu-util/src/messaging/serial/mod.rs rename to mcu-interface/src/serial/mod.rs index 16ec665f..7b228540 100644 --- a/mcu-util/src/messaging/serial/mod.rs +++ b/mcu-interface/src/serial/mod.rs @@ -1,4 +1,4 @@ -use crate::messaging::{Device, McuPayload, MessagingInterface}; +use crate::{Device, McuPayload, MessagingInterface}; use async_trait::async_trait; use color_eyre::eyre::{eyre, Result}; use orb_messages::CommonAckError; diff --git a/mcu-util/Cargo.toml b/mcu-util/Cargo.toml index c1d117a3..5d619807 100644 --- a/mcu-util/Cargo.toml +++ b/mcu-util/Cargo.toml @@ -11,19 +11,15 @@ repository.workspace = true rust-version.workspace = true [dependencies] -anyhow = "1.0.79" async-trait = "0.1.77" -can-rs = { path = "../can", features = ["isotp"] } clap.workspace = true -crc32fast = "1.3.2" color-eyre.workspace = true +crc32fast = "1.3.2" image = "0.24.8" -orb-messages.workspace = true -prost = "0.12.3" +orb-mcu-interface.path = "../mcu-interface" tokio.workspace = true -tokio-serial = "5.4.1" -tracing.workspace = true tracing-subscriber.workspace = true +tracing.workspace = true [package.metadata.orb] unsupported_targets = [ diff --git a/mcu-util/src/main.rs b/mcu-util/src/main.rs index 2a444914..71c18fe5 100644 --- a/mcu-util/src/main.rs +++ b/mcu-util/src/main.rs @@ -10,7 +10,6 @@ use std::time::Duration; use tracing::{debug, error}; mod logging; -mod messaging; mod orb; /// Utility args diff --git a/mcu-util/src/orb/dfu.rs b/mcu-util/src/orb/dfu.rs index 29112fdf..d004e81c 100644 --- a/mcu-util/src/orb/dfu.rs +++ b/mcu-util/src/orb/dfu.rs @@ -1,6 +1,6 @@ use color_eyre::eyre::{eyre, Result}; -use orb_messages::mcu_main as main_messaging; -use orb_messages::mcu_sec as sec_messaging; +use orb_mcu_interface::orb_messages::mcu_main as main_messaging; +use orb_mcu_interface::orb_messages::mcu_sec as sec_messaging; use std::cmp::min; use std::fs::File; use std::io; diff --git a/mcu-util/src/orb/main_board.rs b/mcu-util/src/orb/main_board.rs index a8d640ea..904d5c13 100644 --- a/mcu-util/src/orb/main_board.rs +++ b/mcu-util/src/orb/main_board.rs @@ -1,16 +1,17 @@ use async_trait::async_trait; use color_eyre::eyre::{eyre, Context, Result}; -use orb_messages::{mcu_main as main_messaging, CommonAckError}; use std::ops::Sub; use std::sync::mpsc; use std::time::Duration; use tokio::time; use tracing::{debug, info, warn}; -use crate::messaging::can::canfd::CanRawMessaging; -use crate::messaging::can::isotp::{CanIsoTpMessaging, IsoTpNodeIdentifier}; -use crate::messaging::serial::SerialMessaging; -use crate::messaging::{Device, McuPayload, MessagingInterface}; +use orb_mcu_interface::can::canfd::CanRawMessaging; +use orb_mcu_interface::can::isotp::{CanIsoTpMessaging, IsoTpNodeIdentifier}; +use orb_mcu_interface::orb_messages::{mcu_main as main_messaging, CommonAckError}; +use orb_mcu_interface::serial::SerialMessaging; +use orb_mcu_interface::{Device, McuPayload, MessagingInterface}; + use crate::orb::dfu::BlockIterator; use crate::orb::revision::OrbRevision; use crate::orb::{dfu, BatteryStatus}; @@ -94,7 +95,7 @@ impl Board for MainBoard { let delay = delay.unwrap_or(REBOOT_DELAY); self.isotp_iface .send(McuPayload::ToMain( - orb_messages::mcu_main::jetson_to_mcu::Payload::Reboot( + main_messaging::jetson_to_mcu::Payload::Reboot( main_messaging::RebootWithDelay { delay }, ), )) diff --git a/mcu-util/src/orb/mod.rs b/mcu-util/src/orb/mod.rs index 32f51b2e..35022938 100644 --- a/mcu-util/src/orb/mod.rs +++ b/mcu-util/src/orb/mod.rs @@ -3,8 +3,9 @@ use std::time::Duration; use async_trait::async_trait; use color_eyre::eyre::Result; -use orb_messages::mcu_main as main_messaging; -use orb_messages::mcu_sec as sec_messaging; + +use orb_mcu_interface::orb_messages::mcu_main as main_messaging; +use orb_mcu_interface::orb_messages::mcu_sec as sec_messaging; use crate::orb::main_board::MainBoard; use crate::orb::revision::OrbRevision; diff --git a/mcu-util/src/orb/revision.rs b/mcu-util/src/orb/revision.rs index 28f1eb09..ad6e566d 100644 --- a/mcu-util/src/orb/revision.rs +++ b/mcu-util/src/orb/revision.rs @@ -1,4 +1,4 @@ -use orb_messages::mcu_main as main_messaging; +use orb_mcu_interface::orb_messages::mcu_main as main_messaging; use std::fmt::{Display, Formatter}; #[derive(Clone, Debug, Default)] @@ -7,7 +7,7 @@ pub struct OrbRevision(pub main_messaging::Hardware); impl Display for OrbRevision { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { if self.0.version - < orb_messages::mcu_main::hardware::OrbVersion::HwVersionDiamondPoc1 as i32 + < main_messaging::hardware::OrbVersion::HwVersionDiamondPoc1 as i32 { write!(f, "EVT{:?}", self.0.version) } else { @@ -15,8 +15,7 @@ impl Display for OrbRevision { f, "Diamond_POC{:?}", self.0.version - - orb_messages::mcu_main::hardware::OrbVersion::HwVersionDiamondPoc1 - as i32 + - main_messaging::hardware::OrbVersion::HwVersionDiamondPoc1 as i32 + 1 ) } diff --git a/mcu-util/src/orb/security_board.rs b/mcu-util/src/orb/security_board.rs index 3739e2cd..cfb2da2c 100644 --- a/mcu-util/src/orb/security_board.rs +++ b/mcu-util/src/orb/security_board.rs @@ -1,16 +1,18 @@ use async_trait::async_trait; use color_eyre::eyre::{eyre, Context, Result}; -use orb_messages::mcu_sec::battery_status::BatteryState; -use orb_messages::{mcu_sec as security_messaging, CommonAckError}; use std::ops::Sub; use std::sync::mpsc; use std::time::Duration; use tokio::time; use tracing::{debug, info, warn}; -use crate::messaging::can::canfd::CanRawMessaging; -use crate::messaging::can::isotp::{CanIsoTpMessaging, IsoTpNodeIdentifier}; -use crate::messaging::{Device, McuPayload, MessagingInterface}; +use orb_mcu_interface::can::canfd::CanRawMessaging; +use orb_mcu_interface::can::isotp::{CanIsoTpMessaging, IsoTpNodeIdentifier}; +use orb_mcu_interface::orb_messages; +use orb_mcu_interface::{Device, McuPayload, MessagingInterface}; +use orb_messages::mcu_sec::battery_status::BatteryState; +use orb_messages::{mcu_sec as security_messaging, CommonAckError}; + use crate::orb::dfu::BlockIterator; use crate::orb::{dfu, BatteryStatus}; use crate::orb::{Board, OrbInfo};