use zencan_common::nmt::NmtState;
use zencan_common::AtomicCell;
use crate::object_dict::ObjectFlagSync;
use crate::pdo::Pdo;
use crate::storage::StorageContext;
pub trait NmtStateAccess: Send + Sync {
fn nmt_state(&self) -> NmtState;
}
impl NmtStateAccess for AtomicCell<NmtState> {
fn nmt_state(&self) -> NmtState {
self.load()
}
}
#[allow(missing_debug_implementations)]
pub struct NodeState<'a> {
rpdos: &'a [Pdo<'a>],
tpdos: &'a [Pdo<'a>],
object_flag_sync: ObjectFlagSync,
storage_context: StorageContext,
nmt_state: AtomicCell<NmtState>,
}
impl NmtStateAccess for NodeState<'_> {
fn nmt_state(&self) -> NmtState {
self.nmt_state.load()
}
}
impl<'a> NodeState<'a> {
pub const fn new(rpdos: &'a [Pdo<'a>], tpdos: &'a [Pdo<'a>]) -> Self {
let object_flag_sync = ObjectFlagSync::new();
let storage_context = StorageContext::new();
Self {
rpdos,
tpdos,
object_flag_sync,
storage_context,
nmt_state: AtomicCell::new(NmtState::Bootup),
}
}
pub const fn rpdos(&self) -> &'a [Pdo<'a>] {
self.rpdos
}
pub const fn tpdos(&self) -> &'a [Pdo<'a>] {
self.tpdos
}
pub const fn object_flag_sync(&'a self) -> &'a ObjectFlagSync {
&self.object_flag_sync
}
pub const fn storage_context(&'a self) -> &'a StorageContext {
&self.storage_context
}
pub(crate) fn set_nmt_state(&self, nmt_state: NmtState) {
self.nmt_state.store(nmt_state);
}
}