diff --git a/components/Cargo.lock b/components/Cargo.lock index d61d03a..60edfe6 100644 --- a/components/Cargo.lock +++ b/components/Cargo.lock @@ -984,6 +984,7 @@ version = "0.1.0-SNAPSHOT" dependencies = [ "async-trait", "clap", + "duration-str", "env_logger 0.11.1", "fms-proto", "futures", @@ -2340,9 +2341,9 @@ dependencies = [ [[package]] name = "protobuf" -version = "3.3.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65f4a8ec18723a734e5dc09c173e0abf9690432da5340285d536edcb4dac190" +checksum = "3018844a02746180074f621e847703737d27d89d7f0721a7a4da317f88b16385" dependencies = [ "once_cell", "protobuf-support", @@ -2351,9 +2352,9 @@ dependencies = [ [[package]] name = "protobuf-codegen" -version = "3.3.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e85514a216b1c73111d9032e26cc7a5ecb1bb3d4d9539e91fb72a4395060f78" +checksum = "411c15a212b4de05eb8bc989fd066a74c86bd3c04e27d6e86bd7703b806d7734" dependencies = [ "anyhow", "once_cell", @@ -2366,12 +2367,12 @@ dependencies = [ [[package]] name = "protobuf-parse" -version = "3.3.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77d6fbd6697c9e531873e81cec565a85e226b99a0f10e1acc079be057fe2fcba" +checksum = "06f45f16b522d92336e839b5e40680095a045e36a1e7f742ba682ddc85236772" dependencies = [ "anyhow", - "indexmap 1.9.3", + "indexmap 2.0.0", "log", "protobuf", "protobuf-support", @@ -2382,9 +2383,9 @@ dependencies = [ [[package]] name = "protobuf-support" -version = "3.3.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6872f4d4f4b98303239a2b5838f5bbbb77b01ffc892d627957f37a22d7cfe69c" +checksum = "faf96d872914fcda2b66d66ea3fff2be7c66865d31c7bb2790cff32c0e714880" dependencies = [ "thiserror", ] diff --git a/components/Cargo.toml b/components/Cargo.toml index e05c496..6dc4313 100644 --- a/components/Cargo.toml +++ b/components/Cargo.toml @@ -41,8 +41,8 @@ fms-proto = { path = "fms-proto" } influx-client = { path = "influx-client", default-features = false } influxrs = { version = "2.0" } log = { version = "0.4" } -protobuf = { version = "3.3" } -protobuf-codegen = { version = "3.3" } +protobuf = { version = "3.5" } +protobuf-codegen = { version = "3.5" } protoc-bin-vendored = { version = "3.0" } # prost has no features prost = { version = "0.12" } diff --git a/components/fms-consumer/Cargo.toml b/components/fms-consumer/Cargo.toml index 682a6d1..e9829ed 100644 --- a/components/fms-consumer/Cargo.toml +++ b/components/fms-consumer/Cargo.toml @@ -39,6 +39,7 @@ clap = { workspace = true, features = [ "error-context", "suggestions", ] } +duration-str = { workspace = true } env_logger = { workspace = true } fms-proto = { workspace = true } futures = { version = "0.3" } diff --git a/components/fms-consumer/src/main.rs b/components/fms-consumer/src/main.rs index 9217015..c73d1d8 100644 --- a/components/fms-consumer/src/main.rs +++ b/components/fms-consumer/src/main.rs @@ -82,7 +82,10 @@ fn parse_zenoh_args(args: &ArgMatches) -> Config { .set_enabled(Some(*values)) .unwrap(); } - + if let Some(values) = args.get_one::("session-timeout") { + let millis = u64::try_from(values.as_millis()).unwrap_or(u64::MAX); + config.scouting.set_timeout(Some(millis)).unwrap(); + } config } @@ -310,10 +313,20 @@ async fn run_async_processor_zenoh(args: &ArgMatches) { let config = parse_zenoh_args(zenoh_args); info!("Opening session..."); - let session = zenoh::open(config).res().await.unwrap(); + let session = zenoh::open(config).res().await.unwrap_or_else(|e| { + error!("failed to open Zenoh session: {e}"); + process::exit(1); + }); info!("Declaring Subscriber on '{}'...", &KEY_EXPR); - let subscriber = session.declare_subscriber(KEY_EXPR).res().await.unwrap(); + let subscriber = session + .declare_subscriber(KEY_EXPR) + .res() + .await + .unwrap_or_else(|e| { + error!("failed to create Zenoh subscriber: {e}"); + process::exit(1); + }); loop { select!( sample = subscriber.recv_async() => { @@ -342,69 +355,79 @@ pub async fn main() { .subcommand_required(true) .subcommand( Command::new(SUBCOMMAND_HONO) - .about("Forwards VSS data to an Influx DB server from Hono's north bound Kafka API").arg( - Arg::new(PARAM_KAFKA_PROPERTIES_FILE) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_KAFKA_PROPERTIES_FILE) - .help("The path to a file containing Kafka client properties for connecting to the Kafka broker(s).") - .action(ArgAction::Set) - .value_name("PATH") - .env("KAFKA_PROPERTIES_FILE") - .required(true), - ) - .arg( - Arg::new(PARAM_KAFKA_TOPIC_NAME) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_KAFKA_TOPIC_NAME) - .alias("topic") - .help("The name of the Kafka topic to consume VSS data from.") - .value_name("TOPIC") - .required(true) - .env("KAFKA_TOPIC_NAME"), - ), + .about("Forwards VSS data to an Influx DB server from Hono's north bound Kafka API") + .arg( + Arg::new(PARAM_KAFKA_PROPERTIES_FILE) + .value_parser(clap::builder::NonEmptyStringValueParser::new()) + .long(PARAM_KAFKA_PROPERTIES_FILE) + .help("The path to a file containing Kafka client properties for connecting to the Kafka broker(s).") + .action(ArgAction::Set) + .value_name("PATH") + .env("KAFKA_PROPERTIES_FILE") + .required(true), + ) + .arg( + Arg::new(PARAM_KAFKA_TOPIC_NAME) + .value_parser(clap::builder::NonEmptyStringValueParser::new()) + .long(PARAM_KAFKA_TOPIC_NAME) + .alias("topic") + .help("The name of the Kafka topic to consume VSS data from.") + .value_name("TOPIC") + .required(true) + .env("KAFKA_TOPIC_NAME"), + ), ) .subcommand( Command::new(SUBCOMMAND_ZENOH) .about("Forwards VSS data to an Influx DB server from Eclipse Zenoh") - .arg( - Arg::new("mode") - .value_parser(clap::value_parser!(WhatAmI)) - .long("mode") - .short('m') - .help("The Zenoh session mode (peer by default).") - .required(false), - ) - .arg( - Arg::new("connect") - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long("connect") - .short('e') - .help("Endpoints to connect to.") - .required(false), - ) - .arg( - Arg::new("listen") - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long("listen") - .short('l') - .help("Endpoints to listen on.") - .required(false), - ) - .arg( - Arg::new("no-multicast-scouting") - .long("no-multicast-scouting") - .help("Disable the multicast-based scouting mechanism.") - .action(clap::ArgAction::SetFalse) - .required(false), - ) - .arg( - Arg::new("config") - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long("config") - .short('c') - .help("A configuration file.") - .required(false), - ), + .arg( + Arg::new("mode") + .value_parser(clap::value_parser!(WhatAmI)) + .long("mode") + .short('m') + .help("The Zenoh session mode (peer by default).") + .required(false), + ) + .arg( + Arg::new("connect") + .value_parser(clap::builder::NonEmptyStringValueParser::new()) + .long("connect") + .short('e') + .help("Endpoints to connect to.") + .required(false), + ) + .arg( + Arg::new("listen") + .value_parser(clap::builder::NonEmptyStringValueParser::new()) + .long("listen") + .short('l') + .help("Endpoints to listen on.") + .required(false), + ) + .arg( + Arg::new("no-multicast-scouting") + .long("no-multicast-scouting") + .help("Disable the multicast-based scouting mechanism.") + .action(clap::ArgAction::SetFalse) + .required(false), + ) + .arg( + Arg::new("config") + .value_parser(clap::builder::NonEmptyStringValueParser::new()) + .long("config") + .short('c') + .help("A configuration file.") + .required(false), + ) + .arg( + Arg::new("session-timeout") + .value_parser(|s: &str| duration_str::parse(s)) + .long("session-timeout") + .help("The time to wait for establishment of a Zenoh session, e.g. 10s.") + .value_name("DURATION_SPEC") + .required(false) + .default_value("20s") + ), ); let args = parser.get_matches(); diff --git a/components/fms-forwarder/src/mqtt_connection.rs b/components/fms-forwarder/src/mqtt_connection.rs index e90c228..da20a85 100644 --- a/components/fms-forwarder/src/mqtt_connection.rs +++ b/components/fms-forwarder/src/mqtt_connection.rs @@ -27,7 +27,6 @@ const PARAM_CA_PATH: &str = "ca-path"; const PARAM_DEVICE_CERT: &str = "device-cert"; const PARAM_DEVICE_KEY: &str = "device-key"; const PARAM_ENABLE_HOSTNAME_VERIFICATION: &str = "enable-hostname-verification"; -const PARAM_MQTT_CLIENT_ID: &str = "mqtt-client-id"; const PARAM_MQTT_URI: &str = "mqtt-uri"; const PARAM_MQTT_USERNAME: &str = "mqtt-username"; const PARAM_MQTT_PASSWORD: &str = "mqtt-password"; @@ -40,7 +39,6 @@ const PARAM_TRUST_STORE_PATH: &str = "trust-store-path"; /// /// | Long Name | Environment Variable | Default Value | /// |------------------------------|------------------------------|---------------| -/// | mqtt-client-id | MQTT_CLIENT_ID | - | /// | mqtt-uri | MQTT_URI | - | /// | mqtt-username | MQTT_USERNAME | - | /// | mqtt-password | MQTT_PASSWORD | - | @@ -52,15 +50,6 @@ const PARAM_TRUST_STORE_PATH: &str = "trust-store-path"; /// pub fn add_command_line_args(command: Command) -> Command { command - .arg( - Arg::new(PARAM_MQTT_CLIENT_ID) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_MQTT_CLIENT_ID) - .help("The client identifier to use in the MQTT Connect Packet.") - .value_name("ID") - .required(false) - .env("MQTT_CLIENT_ID"), - ) .arg( Arg::new(PARAM_MQTT_URI) .value_parser(clap::builder::NonEmptyStringValueParser::new()) @@ -142,7 +131,6 @@ pub fn add_command_line_args(command: Command) -> Command { pub struct MqttConnection { pub mqtt_client: AsyncClient, pub uri: String, - pub client_id: String, } impl MqttConnection { @@ -221,17 +209,12 @@ impl MqttConnection { pub async fn new(args: &ArgMatches) -> Result> { let connect_options = MqttConnection::get_connect_options(args)?; let mqtt_uri = args.get_one::(PARAM_MQTT_URI).unwrap().to_owned(); - let client_id = args - .get_one::(PARAM_MQTT_CLIENT_ID) - .unwrap_or(&"".to_string()) - .to_owned(); info!("connecting to MQTT endpoint at {}", mqtt_uri); match CreateOptionsBuilder::new() .server_uri(&mqtt_uri) .max_buffered_messages(50) .send_while_disconnected(true) .delete_oldest_messages(true) - .client_id(&client_id) .create_client() { Err(e) => { @@ -247,7 +230,6 @@ impl MqttConnection { Ok(MqttConnection { mqtt_client: client, uri: mqtt_uri, - client_id, }) } } @@ -289,9 +271,6 @@ mod tests { matches.get_one::(super::PARAM_MQTT_URI).unwrap(), "mqtts://non-existing.host.io" ); - assert!(matches - .get_one::(super::PARAM_MQTT_CLIENT_ID) - .is_none()); assert!(matches .get_one::(super::PARAM_MQTT_USERNAME) .is_none()); diff --git a/components/fms-server/src/models/mod.rs b/components/fms-server/src/models/mod.rs index 9110b9f..daf4033 100644 --- a/components/fms-server/src/models/mod.rs +++ b/components/fms-server/src/models/mod.rs @@ -25,7 +25,6 @@ pub mod vehicle; /// This description is placed here due to limitations of describing references in OpenAPI Property __driverId__: The driver id of driver. (independant whether it is driver or Co-driver) This is only set if the TriggerType = DRIVER_LOGIN, DRIVER_LOGOUT, DRIVER_1_WORKING_STATE_CHANGED or DRIVER_2_WORKING_STATE_CHANGED For DRIVER_LOGIN it is the id of the driver that logged in For DRIVER_LOGOUT it is the id of the driver that logged out For DRIVER_1_WORKING_STATE_CHANGED it is the id of driver 1 For DRIVER_2_WORKING_STATE_CHANGED it is the id of driver 2 Property __tellTaleInfo__: The tell tale(s) that triggered this message. This is only set if the TriggerType = TELL_TALE #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct TriggerObject { /// Trigger types for Context=RFMS: TIMER - Data was sent due to a timer trigger. (Timer value set outside rFMS scope) IGNITION_ON - Data was sent due to an ignition on IGNITION_OFF - Data was sent due to an ignition off PTO_ENABLED - Data was sent due to that a PTO was enabled, will be sent for each PTO that gets enabled PTO_DISABLED - Data was sent due to that a PTO was disabled, will be sent for each PTO that gets disabled. DRIVER_LOGIN - Data was sent due to a successful driver login. DRIVER_LOGOUT - Data was sent due to a driver logout TELL_TALE - Data was sent due to that at least one tell tale changed state ENGINE_ON - Data was sent due to an engine on. For electric motor crank is on ENGINE_OFF - Data was sent due to an engine off. For electric motor crank is off DRIVER_1_WORKING_STATE_CHANGED - Data was sent due to that driver 1 changed working state DRIVER_2_WORKING_STATE_CHANGED - Data was sent due to that driver 2 changed working state DISTANCE_TRAVELLED - Data was sent due to that a set distance was travelled. (Distance set outside rFMS scope) FUEL_TYPE_CHANGE - Data was sent due to that the type of fuel currently being utilized by the vehicle changed PARKING_BRAKE_SWITCH_CHANGE - Data was sent due to that the parking brake state has changed BATTERY_PACK_CHARGING_STATUS_CHANGE - Data was sent due to a change in the battery pack charging status. BATTERY_PACK_CHARGING_CONNECTION_STATUS_CHANGE - Data was sent due to a change in the battery pack charging connection status. TRAILER_CONNECTED - One or several trailers were connected TRAILER_DISCONNECTED - One or several trailers were disconnected #[serde(rename = "triggerType")] @@ -79,7 +78,6 @@ impl TriggerObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct DriverIdObject { #[serde(rename = "tachoDriverIdentification")] #[serde(skip_serializing_if = "Option::is_none")] @@ -91,7 +89,6 @@ pub struct DriverIdObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct TellTaleObject { // Note: inline enums are not fully supported by openapi-generator #[serde(rename = "tellTale")] @@ -110,7 +107,6 @@ pub struct TellTaleObject { /// Additional information can be provided if the trigger type is BATTERY_PACK_CHARGING_STATUS_CHANGE. #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct TriggerObjectChargingStatusInfo { /// CHARGING_STARTED - Charging has started CHARGING_COMPLETED - Charging is completed CHARGING_INTERRUPTED - Charging has been interrupted (no error) ERROR - An error occurred when charging ESTIMATED_COMPLETION_TIME_CHANGED - The estimated time for completed charging has changed. (Threshold is outside scope of rFMS) TIMER - A predefined time has passed since last charge status update. (Frequency is outside the scope of rFMS) CHARGING_LEVEL - The charging level has reached a predefined level. (Charging levels are outside the scope of rFMS) // Note: inline enums are not fully supported by openapi-generator @@ -126,7 +122,6 @@ pub struct TriggerObjectChargingStatusInfo { /// Additional information can be provided if the trigger type is BATTERY_PACK_CHARGING_CONNECTION_STATUS_CHANGE. #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct TriggerObjectChargingConnectionStatusInfo { /// CONNECTING - Vehicle is being connected to a charger CONNECTED - Vehicle is connected to a charger DISCONNECTING - Vehicle is being disconnected from the charger DISCONNECTED - Vehicle is not connected to a charger ERROR - An error occurred // Note: inline enums are not fully supported by openapi-generator @@ -141,7 +136,6 @@ pub struct TriggerObjectChargingConnectionStatusInfo { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct DriverIdObjectTachoDriverIdentification { /// The unique identification of a driver in a Member State. This fields is formatted according the definition for driverIdentification in COMMISSION REGULATION (EC) No 1360/2002 Annex 1b #[serde(rename = "driverIdentification")] @@ -169,7 +163,6 @@ pub struct DriverIdObjectTachoDriverIdentification { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct DriverIdObjectOemDriverIdentification { /// Contains an optional id type (e.g. pin, USB, encrypted EU id...) #[serde(rename = "idType")] diff --git a/components/fms-server/src/models/position.rs b/components/fms-server/src/models/position.rs index 5312966..89974ae 100644 --- a/components/fms-server/src/models/position.rs +++ b/components/fms-server/src/models/position.rs @@ -23,7 +23,6 @@ use crate::models; //use serde::Serialize; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehiclePositionObject { /// vehicle identification number. See ISO 3779 (17 characters) #[serde(rename = "vin")] @@ -56,7 +55,6 @@ pub struct VehiclePositionObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct GnssPositionObject { /// Latitude (WGS84 based) #[serde(rename = "latitude")] @@ -87,7 +85,6 @@ pub struct GnssPositionObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehiclePositionResponseObject { #[serde(rename = "vehiclePositionResponse")] pub vehicle_position_response: VehiclePositionResponseObjectVehiclePositionResponse, @@ -107,7 +104,6 @@ pub struct VehiclePositionResponseObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehiclePositionResponseObjectVehiclePositionResponse { #[serde(rename = "vehiclePositions")] #[serde(skip_serializing_if = "Option::is_none")] diff --git a/components/fms-server/src/models/status.rs b/components/fms-server/src/models/status.rs index 81e3cc3..d8850ae 100644 --- a/components/fms-server/src/models/status.rs +++ b/components/fms-server/src/models/status.rs @@ -20,7 +20,6 @@ use crate::models; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehicleStatusResponseObject { #[serde(rename = "vehicleStatusResponse")] pub vehicle_status_response: VehicleStatusResponseObjectVehicleStatusResponse, @@ -40,7 +39,6 @@ pub struct VehicleStatusResponseObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehicleStatusResponseObjectVehicleStatusResponse { #[serde(rename = "vehicleStatuses")] #[serde(skip_serializing_if = "Option::is_none")] @@ -48,7 +46,6 @@ pub struct VehicleStatusResponseObjectVehicleStatusResponse { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehicleStatusObject { /// vehicle identification number. See ISO 3779 (17 characters) #[serde(rename = "vin")] @@ -129,7 +126,6 @@ pub struct VehicleStatusObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehicleStatusObjectDoorStatusInner { // Note: inline enums are not fully supported by openapi-generator #[serde(rename = "DoorEnabledStatus")] @@ -152,7 +148,6 @@ pub struct VehicleStatusObjectDoorStatusInner { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct AccumulatedDataObject { /// The time the vehicle speed has been over zero. #[serde(rename = "durationWheelbasedSpeedOverZero")] @@ -341,7 +336,6 @@ pub struct AccumulatedDataObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct LabelObject { #[serde(rename = "label")] #[serde(skip_serializing_if = "Option::is_none")] @@ -369,7 +363,6 @@ pub struct LabelObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct FromToClassObject { #[serde(rename = "from")] #[serde(skip_serializing_if = "Option::is_none")] @@ -401,7 +394,6 @@ pub struct FromToClassObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct FromToClassObjectCombustion { #[serde(rename = "from")] #[serde(skip_serializing_if = "Option::is_none")] @@ -429,7 +421,6 @@ pub struct FromToClassObjectCombustion { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct FromToClassObjectElectrical { #[serde(rename = "from")] #[serde(skip_serializing_if = "Option::is_none")] @@ -453,7 +444,6 @@ pub struct FromToClassObjectElectrical { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct SnapshotDataObject { #[serde(rename = "gnssPosition")] #[serde(skip_serializing_if = "Option::is_none")] @@ -577,7 +567,6 @@ pub struct SnapshotDataObject { #[derive( Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, serde::Serialize, serde::Deserialize, )] -#[cfg_attr(feature = "conversion", derive(frunk_enum_derive::LabelledGenericEnum))] pub enum DriverWorkingStateProperty { #[serde(rename = "REST")] Rest, @@ -595,7 +584,6 @@ pub enum DriverWorkingStateProperty { /// Estimated distance to empty (tanks and/or battery packs) in meters #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct SnapshotDataObjectEstimatedDistanceToEmpty { /// Estimated distance to empty, summarizing fuel, gas and battery in meters #[serde(rename = "total")] @@ -619,7 +607,6 @@ pub struct SnapshotDataObjectEstimatedDistanceToEmpty { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct SnapshotDataObjectVehicleAxlesInner { /// Axle position from 1 to 15, 1 being in the front of the truck #[serde(rename = "vehicleAxlePosition")] @@ -633,7 +620,6 @@ pub struct SnapshotDataObjectVehicleAxlesInner { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct SnapshotDataObjectTrailersInner { /// Trailer number from 1 to 5, 1 being closest to the truck, according to ISO 11992-2. #[serde(rename = "trailerNo")] @@ -673,7 +659,6 @@ pub struct SnapshotDataObjectTrailersInner { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct SnapshotDataObjectTrailersInnerTrailerAxlesInner { /// Axle position from 1 to 15, 1 being in the front closest to the truck, according to ISO 11992-2. #[serde(rename = "trailerAxlePosition")] @@ -687,7 +672,6 @@ pub struct SnapshotDataObjectTrailersInnerTrailerAxlesInner { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct UptimeDataObject { /// List of tell tales with the actual status for each tell tale. #[serde(rename = "tellTaleInfo")] @@ -755,7 +739,6 @@ pub struct UptimeDataObject { /// The alternator status of the up to 4 alternators. Used mainly for buses. #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct UptimeDataObjectAlternatorInfo { // Note: inline enums are not fully supported by openapi-generator #[serde(rename = "alternatorStatus")] diff --git a/components/fms-server/src/models/vehicle.rs b/components/fms-server/src/models/vehicle.rs index 6fd0f01..f9dd322 100644 --- a/components/fms-server/src/models/vehicle.rs +++ b/components/fms-server/src/models/vehicle.rs @@ -41,7 +41,6 @@ pub enum VehiclesGetResponse { /// Optional responses for error codes, detailing the error if needed #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct ErrorObject { /// An identifier for this error #[serde(rename = "error")] @@ -60,7 +59,6 @@ pub struct ErrorObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehicleResponseObject { #[serde(rename = "vehicleResponse")] pub vehicle_response: VehicleResponseObjectVehicleResponse, @@ -76,7 +74,6 @@ pub struct VehicleResponseObject { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehicleResponseObjectVehicleResponse { #[serde(rename = "vehicles")] #[serde(skip_serializing_if = "Option::is_none")] @@ -84,7 +81,6 @@ pub struct VehicleResponseObjectVehicleResponse { } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehicleObject { /// vehicle identification number. See ISO 3779 (17 characters) #[serde(rename = "vin")] @@ -187,7 +183,6 @@ pub struct VehicleObject { /// Indicates when the vehicle was produced. #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] pub struct VehicleObjectProductionDate { /// Day of the month where first day of the month is 1 #[serde(rename = "day")] diff --git a/fms-blueprint-compose-zenoh.yaml b/fms-blueprint-compose-zenoh.yaml index 37327b0..81df493 100644 --- a/fms-blueprint-compose-zenoh.yaml +++ b/fms-blueprint-compose-zenoh.yaml @@ -25,22 +25,20 @@ services: image: eclipse/zenoh:0.10.1-rc container_name: "fms-zenoh-router" networks: - - "fms-backend" - - "fms-vehicle" + - "fms-backend" + - "fms-vehicle" ports: - - 7447:7447/tcp - - 1883:1883/tcp - - 8000:8000/tcp + - 7447:7447/tcp restart: unless-stopped volumes: - - ./zenoh-config.json5:/zenoh-config.json5 - + - ./zenoh-config.json5:/zenoh-config.json5 + fms-forwarder: command: "zenoh -m client" depends_on: zenoh: condition: service_started - + fms-consumer: command: "zenoh -m client" image: "ghcr.io/eclipse-sdv-blueprints/fleet-management/fms-consumer:main" @@ -49,23 +47,23 @@ services: dockerfile: "Dockerfile.fms-consumer" container_name: "fms-consumer" cap_drop: - - CAP_MKNOD - - CAP_NET_RAW - - CAP_AUDIT_WRITE + - CAP_MKNOD + - CAP_NET_RAW + - CAP_AUDIT_WRITE networks: - - "fms-backend" + - "fms-backend" depends_on: influxdb: condition: service_healthy zenoh: condition: service_started env_file: - - "./influxdb/fms-demo.env" + - "./influxdb/fms-demo.env" environment: INFLUXDB_TOKEN_FILE: "/tmp/fms-demo.token" RUST_LOG: "${FMS_CONSUMER_LOG_CONFIG:-info,fms_consumer=debug,influx_client=debug}" volumes: - - type: "volume" - source: "influxdb-auth" - target: "/tmp" - read_only: true + - type: "volume" + source: "influxdb-auth" + target: "/tmp" + read_only: true diff --git a/zenoh-config.json5 b/zenoh-config.json5 index aef7828..4acf318 100644 --- a/zenoh-config.json5 +++ b/zenoh-config.json5 @@ -25,7 +25,7 @@ //// MQTT related configuration //// All settings are optional and are unset by default - uncomment the ones you want to set //// - mqtt: { + // mqtt: { //// //// port: The address to bind the MQTT server. Default: "0.0.0.0:1883". Accepted values:' //// - a port number ("0.0.0.0" will be used as IP to bind, meaning any interface of the host) @@ -62,14 +62,14 @@ //// // generalise_subs: ["PUB1", "PUB2"], - }, + // }, //// //// REST API configuration (active only if this part is defined) //// // Optionally, add the REST plugin - rest: { http_port: 8000 }, + // rest: { http_port: 8000 }, },