From 985c8b93757867e1ee693ba34c4f6953485e52eb Mon Sep 17 00:00:00 2001 From: jbernavaprah Date: Mon, 15 Jun 2026 22:03:59 +0200 Subject: [PATCH] feat!: adopt phoxal 0.9 domain-first contract enums MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump phoxal 0.6→0.9 and migrate the operator to the domain-first API: topics use `topic::new().()` (no `.v1()`), subscription payloads are contract enums unwrapped through exhaustive `V1` matches (no catch-all), and asset queries wrap `GetRequest::V1(..)` / match `GetResponse::V1(..)`. Rendering/logging keep the inner v1 structs after unwrap; behavior unchanged. Verified: cargo build/test/clippy --workspace --all-features green (17 tests). Co-Authored-By: Claude Opus 4.8 (1M context) --- Cargo.lock | 4 +- Cargo.toml | 2 +- src/assets.rs | 25 ++++--- src/capability/accelerometer.rs | 2 +- src/capability/battery.rs | 2 +- src/capability/camera.rs | 2 +- src/capability/depth.rs | 4 +- src/capability/encoder.rs | 2 +- src/capability/gnss.rs | 2 +- src/capability/gyroscope.rs | 2 +- src/capability/imu.rs | 2 +- src/capability/lidar.rs | 2 +- src/capability/magnetometer.rs | 2 +- src/capability/microphone.rs | 2 +- src/capability/mmwave.rs | 2 +- src/capability/mod.rs | 28 ++++---- src/capability/range.rs | 2 +- src/capability/speaker.rs | 2 +- src/event.rs | 38 +++++----- src/frame_graph.rs | 8 +-- src/logging/drive.rs | 4 +- src/logging/joint.rs | 2 +- src/logging/odometry.rs | 2 +- src/scene.rs | 4 +- src/subscriptions.rs | 119 ++++++++++++++++++-------------- src/system.rs | 2 +- 26 files changed, 143 insertions(+), 125 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 96563e8..dbb784b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3141,9 +3141,9 @@ dependencies = [ [[package]] name = "phoxal" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e03c85717b2412f60f950a7b9256b3deac56da6e72460154910cdddd5b4c418a" +checksum = "c53144d1bcfbfcef30ee5f915f5376b4513199d4ff67b68f31a322661fde0b57" dependencies = [ "anyhow", "arc-swap", diff --git a/Cargo.toml b/Cargo.toml index 51b2166..73b20f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ serde = { version = "1.0.228", features = ["derive"] } tokio = { version = "1", features = ["macros", "rt", "rt-multi-thread", "time", "signal", "sync", "fs"] } tracing = "0.1.44" urdf-rs = "0.9.0" -phoxal = { version = "0.6.0" } +phoxal = { version = "0.9.0" } [workspace.lints.rust] unused = "warn" diff --git a/src/assets.rs b/src/assets.rs index 6d91406..7ab2596 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -1,10 +1,9 @@ use std::collections::{BTreeSet, HashMap}; use anyhow::{Result, anyhow}; -use phoxal::api::v1::{ - asset::{GetRequest as AssetRequest, GetResponse as AssetResponse}, - topic, -}; +use phoxal::api::asset::v1 as asset_v1; +use phoxal::api::asset::{GetRequest as AssetRequest, GetResponse as AssetResponse}; +use phoxal::api::topic; use phoxal::bus::Bus; use phoxal::bus::query::Retry; use phoxal::model::structure::Structure; @@ -15,21 +14,25 @@ use urdf_rs::Geometry; pub(crate) async fn fetch_asset(bus: &Bus, path: &str, retry: &Retry) -> Result> { match bus .request( - &topic::new().v1().asset().get(), - &AssetRequest::new(path), + &topic::new().asset().get(), + &AssetRequest::V1(asset_v1::GetRequest::new(path)), retry, ) .await? { - Some(AssetResponse::Ok { bytes }) => Ok(bytes), - Some(AssetResponse::NotFound) => Err(anyhow!("asset '{path}' was not found")), - Some(AssetResponse::InvalidPath(reason)) => { + Some(AssetResponse::V1(asset_v1::GetResponse::Ok { bytes })) => Ok(bytes), + Some(AssetResponse::V1(asset_v1::GetResponse::NotFound)) => { + Err(anyhow!("asset '{path}' was not found")) + } + Some(AssetResponse::V1(asset_v1::GetResponse::InvalidPath(reason))) => { Err(anyhow!("asset '{path}' has invalid path: {reason:?}")) } - Some(AssetResponse::Unavailable(reason)) => { + Some(AssetResponse::V1(asset_v1::GetResponse::Unavailable(reason))) => { Err(anyhow!("asset '{path}' is unavailable: {reason:?}")) } - Some(AssetResponse::Busy) => Err(anyhow!("asset '{path}' provider is busy")), + Some(AssetResponse::V1(asset_v1::GetResponse::Busy)) => { + Err(anyhow!("asset '{path}' provider is busy")) + } None => Err(anyhow!("asset query '{path}' returned no response")), } } diff --git a/src/capability/accelerometer.rs b/src/capability/accelerometer.rs index 2f37e12..794cd88 100644 --- a/src/capability/accelerometer.rs +++ b/src/capability/accelerometer.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::accelerometer::Sample; +use phoxal::api::component::capability::accelerometer::v1::Sample; use phoxal::bus::typed::Received; use rerun::{Arrows3D, RecordingStream}; diff --git a/src/capability/battery.rs b/src/capability/battery.rs index 8561035..09e72a3 100644 --- a/src/capability/battery.rs +++ b/src/capability/battery.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::battery::State; +use phoxal::api::component::capability::battery::v1::State; use phoxal::bus::typed::Received; use rerun::{RecordingStream, Scalars}; diff --git a/src/capability/camera.rs b/src/capability/camera.rs index e7f38df..df14f41 100644 --- a/src/capability/camera.rs +++ b/src/capability/camera.rs @@ -1,5 +1,5 @@ use anyhow::{Result, anyhow, ensure}; -use phoxal::api::v1::component::capability::camera::{Encoding, Frame}; +use phoxal::api::component::capability::camera::v1::{Encoding, Frame}; use phoxal::bus::typed::Received; use phoxal::model::component::v1::capability::Capability; use rerun::{Image, RecordingStream}; diff --git a/src/capability/depth.rs b/src/capability/depth.rs index 61e5dde..b61e8f9 100644 --- a/src/capability/depth.rs +++ b/src/capability/depth.rs @@ -1,6 +1,6 @@ use anyhow::{Result, anyhow}; use image::{ExtendedColorType, ImageEncoder, codecs::png::PngEncoder}; -use phoxal::api::v1::component::capability::depth::{Depth, MILLIMETERS_PER_METER}; +use phoxal::api::component::capability::depth::v1::{Depth, MILLIMETERS_PER_METER}; use phoxal::bus::typed::Received; use phoxal::model::component::v1::capability::Capability; use rerun::{EncodedDepthImage, RecordingStream, components::MediaType}; @@ -80,7 +80,7 @@ fn samples_to_native_bytes(samples: &[u16]) -> Vec { #[cfg(test)] mod tests { use image::ImageReader; - use phoxal::api::v1::component::capability::depth::Depth; + use phoxal::api::component::capability::depth::v1::Depth; use super::{payload_resolution, samples_to_png}; diff --git a/src/capability/encoder.rs b/src/capability/encoder.rs index f1232aa..725b15c 100644 --- a/src/capability/encoder.rs +++ b/src/capability/encoder.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::encoder::Sample; +use phoxal::api::component::capability::encoder::v1::Sample; use phoxal::bus::typed::Received; use rerun::{RecordingStream, Scalars}; diff --git a/src/capability/gnss.rs b/src/capability/gnss.rs index fe51c43..cf57d4c 100644 --- a/src/capability/gnss.rs +++ b/src/capability/gnss.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::gnss::Sample; +use phoxal::api::component::capability::gnss::v1::Sample; use phoxal::bus::typed::Received; use rerun::{RecordingStream, Scalars}; diff --git a/src/capability/gyroscope.rs b/src/capability/gyroscope.rs index 86af783..5ccaaa9 100644 --- a/src/capability/gyroscope.rs +++ b/src/capability/gyroscope.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::gyroscope::Sample; +use phoxal::api::component::capability::gyroscope::v1::Sample; use phoxal::bus::typed::Received; use rerun::{Arrows3D, RecordingStream}; diff --git a/src/capability/imu.rs b/src/capability/imu.rs index 75f0318..20efe16 100644 --- a/src/capability/imu.rs +++ b/src/capability/imu.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::imu::Sample; +use phoxal::api::component::capability::imu::v1::Sample; use phoxal::bus::typed::Received; use rerun::{Quaternion, RecordingStream, Transform3D}; diff --git a/src/capability/lidar.rs b/src/capability/lidar.rs index d7c283a..d895a16 100644 --- a/src/capability/lidar.rs +++ b/src/capability/lidar.rs @@ -1,5 +1,5 @@ use anyhow::{Result, anyhow}; -use phoxal::api::v1::component::capability::lidar::Scan; +use phoxal::api::component::capability::lidar::v1::Scan; use phoxal::bus::typed::Received; use phoxal::model::component::v1::CapabilityRef; use phoxal::model::component::v1::capability::{Capability, LidarOutput}; diff --git a/src/capability/magnetometer.rs b/src/capability/magnetometer.rs index b5a4804..dd404e5 100644 --- a/src/capability/magnetometer.rs +++ b/src/capability/magnetometer.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::magnetometer::Sample; +use phoxal::api::component::capability::magnetometer::v1::Sample; use phoxal::bus::typed::Received; use rerun::{Arrows3D, RecordingStream}; diff --git a/src/capability/microphone.rs b/src/capability/microphone.rs index ea3640c..757ba99 100644 --- a/src/capability/microphone.rs +++ b/src/capability/microphone.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::microphone::Frame; +use phoxal::api::component::capability::microphone::v1::Frame; use phoxal::bus::typed::Received; use rerun::{RecordingStream, Scalars}; diff --git a/src/capability/mmwave.rs b/src/capability/mmwave.rs index 862852a..2bc0dcd 100644 --- a/src/capability/mmwave.rs +++ b/src/capability/mmwave.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::mmwave::Scan; +use phoxal::api::component::capability::mmwave::v1::Scan; use phoxal::bus::typed::Received; use rerun::{Arrows3D, Clear, Points3D, RecordingStream, Scalars}; diff --git a/src/capability/mod.rs b/src/capability/mod.rs index 0ef3a84..6fd58fa 100644 --- a/src/capability/mod.rs +++ b/src/capability/mod.rs @@ -15,20 +15,20 @@ mod speaker; use crate::scene::SceneModel; use anyhow::Result; -use phoxal::api::v1::component::capability::accelerometer::Sample as AccelerometerSample; -use phoxal::api::v1::component::capability::battery::State as BatteryState; -use phoxal::api::v1::component::capability::camera::Frame as CameraFrame; -use phoxal::api::v1::component::capability::depth::Depth; -use phoxal::api::v1::component::capability::encoder::Sample as EncoderSample; -use phoxal::api::v1::component::capability::gnss::Sample as GnssSample; -use phoxal::api::v1::component::capability::gyroscope::Sample as GyroscopeSample; -use phoxal::api::v1::component::capability::imu::Sample as ImuSample; -use phoxal::api::v1::component::capability::lidar::Scan as LidarScan; -use phoxal::api::v1::component::capability::magnetometer::Sample as MagnetometerSample; -use phoxal::api::v1::component::capability::microphone::Frame as MicrophoneFrame; -use phoxal::api::v1::component::capability::mmwave::Scan as MmwaveScan; -use phoxal::api::v1::component::capability::range::Sample as RangeSample; -use phoxal::api::v1::component::capability::speaker::audio::Audio; +use phoxal::api::component::capability::accelerometer::v1::Sample as AccelerometerSample; +use phoxal::api::component::capability::battery::v1::State as BatteryState; +use phoxal::api::component::capability::camera::v1::Frame as CameraFrame; +use phoxal::api::component::capability::depth::v1::Depth; +use phoxal::api::component::capability::encoder::v1::Sample as EncoderSample; +use phoxal::api::component::capability::gnss::v1::Sample as GnssSample; +use phoxal::api::component::capability::gyroscope::v1::Sample as GyroscopeSample; +use phoxal::api::component::capability::imu::v1::Sample as ImuSample; +use phoxal::api::component::capability::lidar::v1::Scan as LidarScan; +use phoxal::api::component::capability::magnetometer::v1::Sample as MagnetometerSample; +use phoxal::api::component::capability::microphone::v1::Frame as MicrophoneFrame; +use phoxal::api::component::capability::mmwave::v1::Scan as MmwaveScan; +use phoxal::api::component::capability::range::v1::Sample as RangeSample; +use phoxal::api::component::capability::speaker::audio::v1::Audio; use phoxal::bus::typed::Received; use rerun::RecordingStream; diff --git a/src/capability/range.rs b/src/capability/range.rs index 016ecd5..56ad3fa 100644 --- a/src/capability/range.rs +++ b/src/capability/range.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::range::Sample; +use phoxal::api::component::capability::range::v1::Sample; use phoxal::bus::typed::Received; use rerun::{Color, LineStrips3D, Points3D, RecordingStream, TextLog, TextLogLevel}; diff --git a/src/capability/speaker.rs b/src/capability/speaker.rs index bff1b35..58b8778 100644 --- a/src/capability/speaker.rs +++ b/src/capability/speaker.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::component::capability::speaker::audio::Audio; +use phoxal::api::component::capability::speaker::audio::v1::Audio; use phoxal::bus::typed::Received; use rerun::{RecordingStream, Scalars}; diff --git a/src/event.rs b/src/event.rs index 0a40447..02cb285 100644 --- a/src/event.rs +++ b/src/event.rs @@ -1,22 +1,22 @@ -use phoxal::api::v1::component::capability::accelerometer::Sample as AccelerometerSample; -use phoxal::api::v1::component::capability::battery::State as BatteryState; -use phoxal::api::v1::component::capability::camera::Frame as CameraFrame; -use phoxal::api::v1::component::capability::depth::Depth; -use phoxal::api::v1::component::capability::encoder::Sample as EncoderSample; -use phoxal::api::v1::component::capability::gnss::Sample as GnssSample; -use phoxal::api::v1::component::capability::gyroscope::Sample as GyroscopeSample; -use phoxal::api::v1::component::capability::imu::Sample as ImuSample; -use phoxal::api::v1::component::capability::lidar::Scan as LidarScan; -use phoxal::api::v1::component::capability::magnetometer::Sample as MagnetometerSample; -use phoxal::api::v1::component::capability::microphone::Frame as MicrophoneFrame; -use phoxal::api::v1::component::capability::mmwave::Scan as MmwaveScan; -use phoxal::api::v1::component::capability::range::Sample as RangeSample; -use phoxal::api::v1::component::capability::speaker::audio::Audio; -use phoxal::api::v1::drive::State as DriveState; -use phoxal::api::v1::frame::FrameTransform; -use phoxal::api::v1::joint::JointState; -use phoxal::api::v1::odometry::OdometryEstimate; -use phoxal::api::v1::presence::Heartbeat; +use phoxal::api::component::capability::accelerometer::v1::Sample as AccelerometerSample; +use phoxal::api::component::capability::battery::v1::State as BatteryState; +use phoxal::api::component::capability::camera::v1::Frame as CameraFrame; +use phoxal::api::component::capability::depth::v1::Depth; +use phoxal::api::component::capability::encoder::v1::Sample as EncoderSample; +use phoxal::api::component::capability::gnss::v1::Sample as GnssSample; +use phoxal::api::component::capability::gyroscope::v1::Sample as GyroscopeSample; +use phoxal::api::component::capability::imu::v1::Sample as ImuSample; +use phoxal::api::component::capability::lidar::v1::Scan as LidarScan; +use phoxal::api::component::capability::magnetometer::v1::Sample as MagnetometerSample; +use phoxal::api::component::capability::microphone::v1::Frame as MicrophoneFrame; +use phoxal::api::component::capability::mmwave::v1::Scan as MmwaveScan; +use phoxal::api::component::capability::range::v1::Sample as RangeSample; +use phoxal::api::component::capability::speaker::audio::v1::Audio; +use phoxal::api::drive::v1::State as DriveState; +use phoxal::api::frame::v1::FrameTransform; +use phoxal::api::joint::v1::JointState; +use phoxal::api::odometry::v1::OdometryEstimate; +use phoxal::api::presence::v1::Heartbeat; use phoxal::bus::typed::Received; macro_rules! define_event_enum { diff --git a/src/frame_graph.rs b/src/frame_graph.rs index 8cf8d46..21b004b 100644 --- a/src/frame_graph.rs +++ b/src/frame_graph.rs @@ -2,8 +2,8 @@ use std::collections::{HashMap, HashSet}; use anyhow::{Result, anyhow}; use nalgebra::{Isometry3, Quaternion as NaQuaternion, Translation3, UnitQuaternion}; -use phoxal::api::v1::frame::FrameTransform; -use phoxal::api::v1::odometry::OdometryEstimate; +use phoxal::api::frame::v1::FrameTransform; +use phoxal::api::odometry::v1::OdometryEstimate; use rerun::{Quaternion, Transform3D}; #[derive(Debug, Clone)] @@ -124,8 +124,8 @@ mod tests { use std::collections::HashMap; use anyhow::Result; - use phoxal::api::v1::frame::{FrameId, FrameTransform, Source}; - use phoxal::api::v1::odometry::{ + use phoxal::api::frame::v1::{FrameId, FrameTransform, Source}; + use phoxal::api::odometry::v1::{ Covariance, OdometryEstimate, PoseEstimate, Status, StatusMode, VelocityEstimate, }; diff --git a/src/logging/drive.rs b/src/logging/drive.rs index 521dd12..d4ac45b 100644 --- a/src/logging/drive.rs +++ b/src/logging/drive.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::drive::State; +use phoxal::api::drive::v1::State; use phoxal::bus::typed::Received; use rerun::{RecordingStream, Scalars}; @@ -28,7 +28,7 @@ pub(crate) fn log_drive_state_update( fn log_target( rec: &RecordingStream, path_root: &str, - target: phoxal::api::v1::drive::Target, + target: phoxal::api::drive::v1::Target, ) -> Result<()> { rec.log( format!("{path_root}/linear_x_mps"), diff --git a/src/logging/joint.rs b/src/logging/joint.rs index 53c6102..2e4e109 100644 --- a/src/logging/joint.rs +++ b/src/logging/joint.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::joint::JointState as JointData; +use phoxal::api::joint::v1::JointState as JointData; use phoxal::bus::typed::Received; use rerun::{RecordingStream, Scalars}; diff --git a/src/logging/odometry.rs b/src/logging/odometry.rs index a9edac6..b16ab56 100644 --- a/src/logging/odometry.rs +++ b/src/logging/odometry.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::odometry::OdometryEstimate as OdometryData; +use phoxal::api::odometry::v1::OdometryEstimate as OdometryData; use phoxal::bus::typed::Received; use rerun::{RecordingStream, Scalars}; diff --git a/src/scene.rs b/src/scene.rs index 9e11ea9..8e68942 100644 --- a/src/scene.rs +++ b/src/scene.rs @@ -1,8 +1,8 @@ use std::collections::HashMap; use anyhow::{Context, Result, anyhow}; -use phoxal::api::v1::frame::{FrameId, FrameTransform as FrameData, Source}; -use phoxal::api::v1::joint::JointId; +use phoxal::api::frame::v1::{FrameId, FrameTransform as FrameData, Source}; +use phoxal::api::joint::v1::JointId; use phoxal::bus::Bus; use phoxal::bus::query::Retry; use phoxal::model::component::v1::capability::{CameraMode, Capability, StructuralTarget}; diff --git a/src/subscriptions.rs b/src/subscriptions.rs index dd3119e..30b4260 100644 --- a/src/subscriptions.rs +++ b/src/subscriptions.rs @@ -3,7 +3,12 @@ use std::time::Duration; use crate::event::Event; use crate::scene::SceneModel; use crate::selection::ComponentSelection; -use phoxal::api::v1::topic; +use phoxal::api::component::capability::speaker::audio as speaker_audio; +use phoxal::api::component::capability::{ + accelerometer, battery, camera, depth, encoder, gnss, gyroscope, imu, lidar, magnetometer, + microphone, mmwave, range, +}; +use phoxal::api::{drive, frame, joint, odometry, presence, topic}; use phoxal::bus::Bus; use phoxal::bus::topic::{ANY, PubSub, Topic}; use phoxal::bus::typed::Received; @@ -14,6 +19,15 @@ use tracing::warn; const SUBSCRIPTION_RETRY_DELAY: Duration = Duration::from_secs(1); +macro_rules! unwrap_v1_received { + ($message:expr, $module:ident::$type:ident) => {{ + let Received { at_ns, value } = $message; + match value { + $module::$type::V1(value) => Received { at_ns, value }, + } + }}; +} + pub(crate) fn spawn_all( bus: Bus, tx: mpsc::Sender, @@ -22,41 +36,41 @@ pub(crate) fn spawn_all( ) { spawn_subscription_loop( bus.clone(), - topic::new().v1().frame().data(), + topic::new().frame().data(), tx.clone(), - Event::Frame, + |message| Event::Frame(unwrap_v1_received!(message, frame::FrameTransform)), ); for joint in &scene.structure.joints { let joint_id = joint.name.clone(); spawn_subscription_loop( bus.clone(), - topic::new().v1().joint(joint_id.clone()).data(), + topic::new().joint(joint_id.clone()).data(), tx.clone(), move |message| Event::Joint { joint_id: joint_id.clone(), - message, + message: unwrap_v1_received!(message, joint::JointState), }, ); } spawn_subscription_loop( bus.clone(), - topic::new().v1().odometry().estimate(), + topic::new().odometry().estimate(), tx.clone(), - Event::Odometry, + |message| Event::Odometry(unwrap_v1_received!(message, odometry::OdometryEstimate)), ); spawn_subscription_loop( bus.clone(), - topic::new().v1().drive().state(), + topic::new().drive().state(), tx.clone(), - Event::DriveState, + |message| Event::DriveState(unwrap_v1_received!(message, drive::State)), ); spawn_subscription_loop( bus.clone(), - topic::new().v1().presence().heartbeat(), + topic::new().presence().heartbeat(), tx.clone(), - Event::PresenceHeartbeat, + |message| Event::PresenceHeartbeat(unwrap_v1_received!(message, presence::Heartbeat)), ); spawn_capability_subscriptions(bus, tx, scene, component_selection); @@ -69,13 +83,19 @@ fn spawn_capability_subscriptions( component_selection: &ComponentSelection, ) { macro_rules! spawn_capability { - ($component_id:expr, $local_capability_id:expr, $topic:expr, $event_variant:ident) => {{ + ( + $component_id:expr, + $local_capability_id:expr, + $topic:expr, + $event_variant:ident, + $contract_module:ident::$contract_type:ident + ) => {{ let capability_id = format!("{}.{}", $component_id, $local_capability_id); let topic = $topic($component_id.to_string(), $local_capability_id.to_string()); spawn_subscription_loop(bus.clone(), topic, tx.clone(), move |message| { Event::$event_variant { capability_id: capability_id.clone(), - message, + message: unwrap_v1_received!(message, $contract_module::$contract_type), } }); }}; @@ -94,51 +114,51 @@ fn spawn_capability_subscriptions( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .imu(capability_id) .data(), - Imu + Imu, + imu::Sample ), Capability::Accelerometer(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .accelerometer(capability_id) .data(), - Accelerometer + Accelerometer, + accelerometer::Sample ), Capability::Gyroscope(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .gyroscope(capability_id) .data(), - Gyroscope + Gyroscope, + gyroscope::Sample ), Capability::Gnss(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .gnss(capability_id) .data(), - Gnss + Gnss, + gnss::Sample ), Capability::Battery(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .battery(capability_id) .data(), - Battery + Battery, + battery::State ), Capability::EmergencyStop(_) => {} Capability::Motor(_) => {} @@ -146,93 +166,93 @@ fn spawn_capability_subscriptions( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .encoder(capability_id) .data(), - Encoder + Encoder, + encoder::Sample ), Capability::Camera(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .camera(capability_id) .profile(ANY) .data(), - Camera + Camera, + camera::Frame ), Capability::Depth(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .depth(capability_id) .profile(ANY) .data(), - Depth + Depth, + depth::Depth ), Capability::Range(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .range(capability_id) .data(), - Range + Range, + range::Sample ), Capability::Lidar(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .lidar(capability_id) .data(), - Lidar + Lidar, + lidar::Scan ), Capability::Magnetometer(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .magnetometer(capability_id) .data(), - Magnetometer + Magnetometer, + magnetometer::Sample ), Capability::Microphone(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .microphone(capability_id) .data(), - Microphone + Microphone, + microphone::Frame ), Capability::Mmwave(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .mmwave(capability_id) .data(), - Mmwave + Mmwave, + mmwave::Scan ), Capability::Speaker(_) => spawn_capability!( component_id, local_capability_id, |component_id, capability_id| topic::new() - .v1() .component(component_id) .speaker(capability_id) .audio(), - SpeakerData + SpeakerData, + speaker_audio::Audio ), Capability::Led(_) => {} } @@ -278,7 +298,7 @@ fn spawn_subscription_loop( #[cfg(test)] mod tests { - use phoxal::api::v1::topic; + use phoxal::api::topic; use phoxal::bus::topic::{ANY, PubSub, Topic}; fn topic_key(topic: Topic>) -> String { @@ -290,32 +310,29 @@ mod tests { assert_eq!( topic_key( topic::new() - .v1() .component("front_left_tof") .range("range") .data() ), - "v1/component/front_left_tof/range/range/data" + "component/front_left_tof/range/range/data" ); assert_eq!( topic_key( topic::new() - .v1() .component("left_drive") .encoder("encoder") .data() ), - "v1/component/left_drive/encoder/encoder/data" + "component/left_drive/encoder/encoder/data" ); assert_eq!( topic_key( topic::new() - .v1() .component("imu") .accelerometer("accelerometer") .data() ), - "v1/component/imu/accelerometer/accelerometer/data" + "component/imu/accelerometer/accelerometer/data" ); } @@ -324,24 +341,22 @@ mod tests { assert_eq!( topic_key( topic::new() - .v1() .component("front_camera") .camera("rgb") .profile(ANY) .data() ), - "v1/component/front_camera/camera/rgb/profile/*/data" + "component/front_camera/camera/rgb/profile/*/data" ); assert_eq!( topic_key( topic::new() - .v1() .component("front_camera") .depth("depth") .profile(ANY) .data() ), - "v1/component/front_camera/depth/depth/profile/*/data" + "component/front_camera/depth/depth/profile/*/data" ); } } diff --git a/src/system.rs b/src/system.rs index 675ab8e..7ce1c81 100644 --- a/src/system.rs +++ b/src/system.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use phoxal::api::v1::presence::Heartbeat as PresenceHeartbeat; +use phoxal::api::presence::v1::Heartbeat as PresenceHeartbeat; use phoxal::bus::typed::Received; use rerun::{RecordingStream, TextLog};