use crate::curuntime::KeyFrame;
use cu29_clock::RobotClock;
use cu29_traits::CuResult;
use cu29_unifiedlog::{SectionStorage, UnifiedLogWrite};
#[cfg(not(feature = "std"))]
mod imp {
pub use alloc::string::String;
pub use alloc::sync::Arc;
pub use spin::Mutex;
}
#[cfg(feature = "std")]
mod imp {
pub use crate::config::CuConfig;
pub use crate::simulation::SimOverride;
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>
{
}
pub trait CuApplication<S: SectionStorage, L: UnifiedLogWrite<S> + 'static> {
fn get_original_config() -> String;
fn new(
clock: RobotClock,
unified_logger: Arc<Mutex<L>>,
#[cfg(feature = "std")] config_override: Option<CuConfig>, ) -> CuResult<Self>
where
Self: Sized;
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 new(
clock: RobotClock,
unified_logger: Arc<Mutex<L>>,
config_override: Option<CuConfig>,
sim_callback: &mut impl for<'z> FnMut(Self::Step<'z>) -> SimOverride,
) -> CuResult<Self>
where
Self: Sized;
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<()>;
}