Introduces structured child identity for organs
Establishes a `ChildIdentity` struct to encapsulate an organ's ID alongside its parent's ID. Refactors the `Parenchyma` trait to return this new structured identity, enhancing context for each organ. Updates the `impl_identifiable` macro and `LedPump` implementation to adopt the new model. Adds a basic heartbeat logging mechanism to `LedPump`, leveraging the richer identity for monitoring.
This commit is contained in:
parent
ef10ab5998
commit
09f75f97eb
5 changed files with 35 additions and 13 deletions
14
src/rustylee/src/child_identity.rs
Normal file
14
src/rustylee/src/child_identity.rs
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct ChildIdentity {
|
||||
id: u32,
|
||||
parent_id: u32,
|
||||
}
|
||||
|
||||
impl ChildIdentity {
|
||||
pub fn new(id: u32, parent_id: u32) -> Self {
|
||||
Self {
|
||||
id,
|
||||
parent_id
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,8 +2,8 @@
|
|||
macro_rules! impl_identifiable {
|
||||
($target:ident, { $($body:tt)* }) => {
|
||||
impl Parenchyma for $target {
|
||||
fn id(&self) -> u32 {
|
||||
self.id
|
||||
fn identity(&self) -> child_identity::ChildIdentity {
|
||||
self.identity
|
||||
}
|
||||
|
||||
$($body)*
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ pub mod coordinates;
|
|||
pub mod protocols;
|
||||
pub mod system;
|
||||
pub mod macros;
|
||||
pub mod child_identity;
|
||||
|
||||
use std::fmt::Alignment::Left;
|
||||
use tracing::{debug, info};
|
||||
|
|
|
|||
|
|
@ -1,16 +1,22 @@
|
|||
use crate::impl_identifiable;
|
||||
use crate::child_identity::ChildIdentity;
|
||||
use crate::organs::parenchyma::Parenchyma;
|
||||
use crate::protocols::{OrganCommand, OrganCommandEnvelope, OrganResponse};
|
||||
|
||||
use crate::system::time::Time;
|
||||
use crate::{child_identity, impl_identifiable};
|
||||
use tracing::{info};
|
||||
pub struct LedPump {
|
||||
id: u32,
|
||||
parent_organ_id: u32,
|
||||
identity: child_identity::ChildIdentity,
|
||||
last_beat: u64,
|
||||
}
|
||||
|
||||
impl_identifiable!(LedPump, {
|
||||
fn do_work(&mut self, _envelope: OrganCommandEnvelope) -> OrganResponse {
|
||||
// Your logic here
|
||||
let now = Time::time_stamp_millis();
|
||||
if now > self.last_beat + 500 {
|
||||
info!("LED Pump heart beat at {} {:?}", now, self.identity);
|
||||
self.last_beat = now;
|
||||
}
|
||||
OrganResponse::Ok
|
||||
}
|
||||
|
||||
|
|
@ -22,9 +28,8 @@ impl_identifiable!(LedPump, {
|
|||
impl LedPump {
|
||||
pub fn new(id: u32, parent_organ_id: u32) -> Self {
|
||||
Self {
|
||||
id,
|
||||
parent_organ_id,
|
||||
last_beat: 0
|
||||
identity: ChildIdentity::new(id, parent_organ_id),
|
||||
last_beat: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +1,15 @@
|
|||
use crate::child_identity::ChildIdentity;
|
||||
use crate::protocols::{OrganCommand, OrganCommandEnvelope, OrganResponse};
|
||||
|
||||
/*
|
||||
Parenchyma: The essential and distinctive functional tissue of an organ,
|
||||
as distinguished from its connective tissue, blood vessels,
|
||||
and nerves (the stroma)
|
||||
*/
|
||||
use crate::protocols::{OrganCommand, OrganCommandEnvelope, OrganResponse};
|
||||
|
||||
pub trait Parenchyma: Send {
|
||||
fn id(&self) -> u32;
|
||||
fn identity(&self) -> ChildIdentity;
|
||||
|
||||
fn do_work (&mut self, command_envelope: OrganCommandEnvelope) -> OrganResponse;
|
||||
|
||||
fn get_supported_commands(&self) -> Vec<OrganCommand>;
|
||||
}
|
||||
Loading…
Reference in a new issue