use crate::types::{
attributes::AttributeValue,
database::{CanDatabase, CanNodeKey, CanSignalKey},
signal::CanSignal,
};
use std::{
collections::{BTreeMap, HashMap},
fmt,
};
#[derive(Default, Clone, PartialEq)]
pub struct CanMessage {
pub id_format: IdFormat,
pub id: u32,
pub id_hex: String,
pub name: String,
pub byte_length: u16,
pub msgtype: String,
pub sender_nodes: Vec<CanNodeKey>,
pub receiver_nodes: Vec<CanNodeKey>,
pub signals: Vec<CanSignalKey>,
pub comment: String,
pub mux_multiplexors: Vec<CanSignalKey>,
pub attributes: BTreeMap<String, AttributeValue>,
pub mux_cases: HashMap<CanSignalKey, HashMap<MuxSelector, Vec<CanSignalKey>>>,
}
impl CanMessage {
pub fn clear(&mut self) {
*self = CanMessage::default();
}
pub fn signals<'a>(&'a self, db: &'a CanDatabase) -> impl Iterator<Item = &'a CanSignal> + 'a {
self.signals
.iter()
.filter_map(move |&key| db.get_sig_by_key(key))
}
}
#[derive(Default, Copy, Clone, PartialEq, Debug)]
pub enum IdFormat {
#[default]
Standard,
Extended,
}
impl IdFormat {
pub fn to_str(&self) -> String {
match self {
IdFormat::Standard => "Standard".to_string(),
IdFormat::Extended => "Extended".to_string(),
}
}
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)]
pub enum MuxRole {
#[default]
None,
Multiplexor,
Multiplexed,
}
impl fmt::Display for MuxRole {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
MuxRole::None => f.write_str("None"),
MuxRole::Multiplexor => f.write_str("Multiplexor"),
MuxRole::Multiplexed => f.write_str("Multiplexed"),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum MuxSelector {
Value(u32),
Range { min: u32, max: u32 },
}
impl Default for MuxSelector {
fn default() -> Self {
MuxSelector::Value(0)
}
}
impl fmt::Display for MuxSelector {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
MuxSelector::Value(v) => write!(f, "Value({v})"),
MuxSelector::Range { min, max } => write!(f, "Range({min}..={max})"),
}
}
}
#[derive(Clone, Debug, Default, PartialEq)]
pub enum GenMsgSendType {
Cyclic, NotUsed, IfActive, #[default]
NoMsgSendType, }