mod codelet_instance;
mod lifecycle;
mod schedule;
mod sequence;
mod statistics;
mod task_clock;
mod transition;
mod vise;
#[cfg(feature = "instantiate_from_json")]
mod instantiate_from_json;
pub use codelet_instance::*;
pub use lifecycle::*;
pub use schedule::*;
pub use sequence::*;
pub use statistics::*;
pub use task_clock::*;
pub use transition::*;
pub use vise::*;
#[cfg(feature = "instantiate_from_json")]
pub use instantiate_from_json::*;
use crate::{
channels::{RxBundle, TxBundle},
config::Config,
core::DefaultStatus,
prelude::Signals,
};
use eyre::Result;
pub trait Codelet: Send {
type Status: CodeletStatus;
type Config: Config + Send;
type Rx: RxBundle;
type Tx: TxBundle;
type Signals: Signals;
fn build_bundles(cfg: &Self::Config) -> (Self::Rx, Self::Tx);
fn start(
&mut self,
_cx: Context<Self>,
_rx: &mut Self::Rx,
_tx: &mut Self::Tx,
) -> Result<Self::Status> {
Ok(Self::Status::default_implementation_status())
}
fn stop(
&mut self,
_cx: Context<Self>,
_rx: &mut Self::Rx,
_tx: &mut Self::Tx,
) -> Result<Self::Status> {
Ok(Self::Status::default_implementation_status())
}
fn step(
&mut self,
_cx: Context<Self>,
_rx: &mut Self::Rx,
_tx: &mut Self::Tx,
) -> Result<Self::Status> {
Ok(Self::Status::default_implementation_status())
}
fn pause(&mut self) -> Result<Self::Status> {
Ok(Self::Status::default_implementation_status())
}
fn resume(&mut self) -> Result<Self::Status> {
Ok(Self::Status::default_implementation_status())
}
}
pub trait CodeletStatus: 'static + Send + Sync {
fn default_implementation_status() -> Self
where
Self: Sized;
fn is_default_status(&self) -> bool;
fn as_default_status(&self) -> DefaultStatus;
fn label(&self) -> &'static str;
}
impl CodeletStatus for DefaultStatus {
fn default_implementation_status() -> Self {
DefaultStatus::Skipped
}
fn is_default_status(&self) -> bool {
true
}
fn as_default_status(&self) -> DefaultStatus {
*self
}
fn label(&self) -> &'static str {
match self {
DefaultStatus::Skipped => "skipped",
DefaultStatus::Running => "stepped",
}
}
}
pub struct Context<'a, C>
where
C: Codelet + ?Sized,
{
pub clocks: &'a TaskClocks,
pub config: &'a C::Config,
pub config_aux: &'a <C::Config as Config>::Aux,
pub pulse: &'a CodeletPulse,
pub signals: &'a mut C::Signals,
}
pub struct CodeletPulse {
pub step_count: usize,
}
impl CodeletPulse {
pub(crate) fn new() -> Self {
Self { step_count: 0 }
}
pub(crate) fn on_step_post(&mut self) {
self.step_count += 1;
}
}
pub trait IntoInstance: Codelet + Sized {
fn into_instance<S: Into<String>>(self, name: S, config: Self::Config)
-> CodeletInstance<Self>;
}
impl<C> IntoInstance for C
where
C: Codelet,
{
fn into_instance<S: Into<String>>(
self,
name: S,
config: Self::Config,
) -> CodeletInstance<Self> {
CodeletInstance::new(name, self, config)
}
}
pub trait Instantiate: Codelet + Sized {
fn instantiate<S: Into<String>>(name: S, config: Self::Config) -> CodeletInstance<Self>;
}
impl<C> Instantiate for C
where
C: Codelet + Default,
{
fn instantiate<S: Into<String>>(name: S, config: Self::Config) -> CodeletInstance<Self> {
CodeletInstance::new(name, C::default(), config)
}
}