some docs and helper methods

This commit is contained in:
Robin Müller 2025-01-20 12:15:36 +01:00
parent ecd775c96c
commit a01c806ff2
Signed by: muellerr
GPG Key ID: A649FB78196E3849

View File

@ -159,6 +159,22 @@ impl SubsystemCommandingHelper {
Ok(()) Ok(())
} }
pub fn send_announce_mode_cmd_to_children(
&self,
request_id: RequestId,
req_sender: &impl ModeRequestSender,
recursive: bool,
) -> Result<(), GenericTargetedMessagingError> {
let mut request = ModeRequest::AnnounceMode;
if recursive {
request = ModeRequest::AnnounceModeRecursive;
}
for child in &self.children_mode_store.0 {
req_sender.send_mode_request(request_id, child.id(), request)?;
}
Ok(())
}
pub fn state_machine( pub fn state_machine(
&mut self, &mut self,
opt_reply: Option<GenericMessage<ModeReply>>, opt_reply: Option<GenericMessage<ModeReply>>,
@ -593,23 +609,10 @@ impl ModeRequestHandler for AcsSubsystem {
"TestAssembly: Announcing mode (recursively: {}): {:?}", "TestAssembly: Announcing mode (recursively: {}): {:?}",
recursive, self.subsystem_helper.current_mode recursive, self.subsystem_helper.current_mode
); );
let mut mode_request = ModeRequest::AnnounceMode;
if recursive {
mode_request = ModeRequest::AnnounceModeRecursive;
}
let request_id = requestor_info.map_or(0, |info| info.request_id()); let request_id = requestor_info.map_or(0, |info| info.request_id());
self.mode_node self.subsystem_helper
.request_sender_store .send_announce_mode_cmd_to_children(request_id, &self.mode_node, recursive)
.0 .expect("sending mode request failed");
.iter()
.for_each(|(_, sender)| {
sender
.send(GenericMessage::new(
MessageMetadata::new(request_id, self.mode_node.local_channel_id_generic()),
mode_request,
))
.expect("sending mode request failed");
});
self.mode_req_handler_mock self.mode_req_handler_mock
.announce_mode(requestor_info, recursive); .announce_mode(requestor_info, recursive);
} }
@ -659,6 +662,11 @@ impl ModeRequestHandler for AcsSubsystem {
} }
} }
/// A generic helper for manager components which manage child components in a mode tree.
///
/// Mode commands are usually forwarded to all children components transparently.
/// For example, this could be used in an Assembly component which manages multiple redundant
/// child components. It can also be used inside a manager component which only manages one device.
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct DevManagerCommandingHelper { pub struct DevManagerCommandingHelper {
/// The IDs, modes and reply awaition status of all children are tracked in this data /// The IDs, modes and reply awaition status of all children are tracked in this data
@ -696,6 +704,22 @@ impl DevManagerCommandingHelper {
Ok(()) Ok(())
} }
pub fn send_announce_mode_cmd_to_children(
&self,
request_id: RequestId,
mode_req_sender: &impl ModeRequestSender,
recursive: bool,
) -> Result<(), GenericTargetedMessagingError> {
let mut request = ModeRequest::AnnounceMode;
if recursive {
request = ModeRequest::AnnounceModeRecursive;
}
for child in self.children_mode_store.0.iter() {
mode_req_sender.send_mode_request(request_id, child.id(), request)?;
}
Ok(())
}
pub fn add_mode_child(&mut self, target_id: ComponentId, mode: ModeAndSubmode) { pub fn add_mode_child(&mut self, target_id: ComponentId, mode: ModeAndSubmode) {
self.children_mode_store.add_component(target_id, mode); self.children_mode_store.add_component(target_id, mode);
} }
@ -768,8 +792,6 @@ impl DevManagerCommandingHelper {
} }
} }
// TODO: This assembly requires some helper component to process commands.. Maybe implement it
// manually first?
struct MgmAssembly { struct MgmAssembly {
pub mode_node: ModeRequestorAndHandlerMpscBounded, pub mode_node: ModeRequestorAndHandlerMpscBounded,
pub mode_requestor_info: Option<MessageMetadata>, pub mode_requestor_info: Option<MessageMetadata>,
@ -891,23 +913,10 @@ impl ModeRequestHandler for MgmAssembly {
"TestAssembly: Announcing mode (recursively: {}): {:?}", "TestAssembly: Announcing mode (recursively: {}): {:?}",
recursive, self.mode_and_submode recursive, self.mode_and_submode
); );
let mut mode_request = ModeRequest::AnnounceMode;
if recursive {
mode_request = ModeRequest::AnnounceModeRecursive;
}
let request_id = requestor_info.map_or(0, |info| info.request_id()); let request_id = requestor_info.map_or(0, |info| info.request_id());
self.mode_node self.commanding_helper
.request_sender_store .send_announce_mode_cmd_to_children(request_id, &self.mode_node, recursive)
.0 .expect("sending mode request failed");
.iter()
.for_each(|(_, sender)| {
sender
.send(GenericMessage::new(
MessageMetadata::new(request_id, self.mode_node.local_channel_id_generic()),
mode_request,
))
.expect("sending mode request failed");
});
self.mode_req_mock.announce_mode(requestor_info, recursive); self.mode_req_mock.announce_mode(requestor_info, recursive);
} }
@ -1084,23 +1093,12 @@ impl ModeRequestHandler for DeviceManager {
"{}: announcing mode: {:?}", "{}: announcing mode: {:?}",
self.name, self.mode_and_submode self.name, self.mode_and_submode
); );
let mut mode_request = ModeRequest::AnnounceMode;
if recursive {
mode_request = ModeRequest::AnnounceModeRecursive;
}
let request_id = requestor_info.map_or(0, |info| info.request_id()); let request_id = requestor_info.map_or(0, |info| info.request_id());
self.mode_node self.commanding_helper.send_announce_mode_cmd_to_children(
.request_sender_store request_id,
.0 &self.mode_node,
.iter() recursive,
.for_each(|(_, sender)| { ).expect("sending mode announce request failed");
sender
.send(GenericMessage::new(
MessageMetadata::new(request_id, self.mode_node.local_channel_id_generic()),
mode_request,
))
.expect("sending mode request failed");
});
self.mode_req_mock.announce_mode(requestor_info, recursive); self.mode_req_mock.announce_mode(requestor_info, recursive);
} }
@ -1111,6 +1109,7 @@ impl ModeRequestHandler for DeviceManager {
self.mode_req_mock.handle_mode_reached(requestor).unwrap(); self.mode_req_mock.handle_mode_reached(requestor).unwrap();
Ok(()) Ok(())
} }
fn handle_mode_info( fn handle_mode_info(
&mut self, &mut self,
requestor_info: MessageMetadata, requestor_info: MessageMetadata,
@ -1727,4 +1726,6 @@ fn command_safe_mode() {
tb.mgt_dev.mode_and_submode(), tb.mgt_dev.mode_and_submode(),
ModeAndSubmode::new(DefaultMode::NORMAL as u32, 0) ModeAndSubmode::new(DefaultMode::NORMAL as u32, 0)
); );
// TODO: Check whether the correct amount of mode requests and mode replies
// was sent/received to each component.
} }