use crate::curuntime::KeyFrame;
use cu29_traits::CuResult;
use cu29_unifiedlog::{SectionStorage, UnifiedLogWrite};
#[cfg(feature = "std")]
use crate::copperlist::CopperList;
#[cfg(feature = "std")]
use cu29_clock::RobotClockMock;
#[cfg(feature = "std")]
use cu29_traits::CopperListTuple;
#[cfg(not(feature = "std"))]
mod imp {
pub use alloc::string::String;
}
#[cfg(feature = "std")]
mod imp {
pub use crate::config::CuConfig;
pub use crate::simulation::SimOverride;
pub use cu29_clock::RobotClock;
pub use cu29_unifiedlog::memmap::MmapSectionStorage;
pub use std::sync::{Arc, Mutex};
}
use imp::*;
#[cfg(feature = "std")]
pub trait CuStdApplication:
CuApplication<MmapSectionStorage, cu29_unifiedlog::UnifiedLoggerWrite>
{
}
#[cfg(feature = "std")]
impl<T> CuStdApplication for T where
T: CuApplication<MmapSectionStorage, cu29_unifiedlog::UnifiedLoggerWrite>
{
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Subsystem {
id: Option<&'static str>,
code: u16,
}
impl Subsystem {
#[inline]
pub const fn new(id: Option<&'static str>, code: u16) -> Self {
Self { id, code }
}
#[inline]
pub const fn id(self) -> Option<&'static str> {
self.id
}
#[inline]
pub const fn code(self) -> u16 {
self.code
}
}
pub trait CuSubsystemMetadata {
fn subsystem() -> Subsystem;
}
pub trait CuApplication<S: SectionStorage, L: UnifiedLogWrite<S> + 'static> {
fn get_original_config() -> String;
fn start_all_tasks(&mut self) -> CuResult<()>;
fn run_one_iteration(&mut self) -> CuResult<()>;
fn run(&mut self) -> CuResult<()>;
fn stop_all_tasks(&mut self) -> CuResult<()>;
fn restore_keyframe(&mut self, freezer: &KeyFrame) -> CuResult<()>;
}
#[cfg(feature = "std")]
pub trait CuSimApplication<S: SectionStorage, L: UnifiedLogWrite<S> + 'static> {
type Step<'z>;
fn get_original_config() -> String;
fn start_all_tasks(
&mut self,
sim_callback: &mut impl for<'z> FnMut(Self::Step<'z>) -> SimOverride,
) -> CuResult<()>;
fn run_one_iteration(
&mut self,
sim_callback: &mut impl for<'z> FnMut(Self::Step<'z>) -> SimOverride,
) -> CuResult<()>;
fn run(
&mut self,
sim_callback: &mut impl for<'z> FnMut(Self::Step<'z>) -> SimOverride,
) -> CuResult<()>;
fn stop_all_tasks(
&mut self,
sim_callback: &mut impl for<'z> FnMut(Self::Step<'z>) -> SimOverride,
) -> CuResult<()>;
fn restore_keyframe(&mut self, freezer: &KeyFrame) -> CuResult<()>;
}
#[cfg(feature = "std")]
pub trait CuRecordedReplayApplication<S: SectionStorage, L: UnifiedLogWrite<S> + 'static>:
CuSimApplication<S, L>
{
type RecordedDataSet: CopperListTuple;
fn replay_recorded_copperlist(
&mut self,
clock_mock: &RobotClockMock,
copperlist: &CopperList<Self::RecordedDataSet>,
keyframe: Option<&KeyFrame>,
) -> CuResult<()>;
}
#[cfg(feature = "std")]
pub trait CuDistributedReplayApplication<S: SectionStorage, L: UnifiedLogWrite<S> + 'static>:
CuRecordedReplayApplication<S, L> + CuSubsystemMetadata
{
fn build_distributed_replay(
clock: RobotClock,
unified_logger: Arc<Mutex<L>>,
instance_id: u32,
config_override: Option<CuConfig>,
) -> CuResult<Self>
where
Self: Sized;
}