some docs and helper methods
This commit is contained in:
parent
ecd775c96c
commit
a01c806ff2
@ -159,6 +159,22 @@ impl SubsystemCommandingHelper {
|
||||
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(
|
||||
&mut self,
|
||||
opt_reply: Option<GenericMessage<ModeReply>>,
|
||||
@ -593,23 +609,10 @@ impl ModeRequestHandler for AcsSubsystem {
|
||||
"TestAssembly: Announcing mode (recursively: {}): {:?}",
|
||||
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());
|
||||
self.mode_node
|
||||
.request_sender_store
|
||||
.0
|
||||
.iter()
|
||||
.for_each(|(_, sender)| {
|
||||
sender
|
||||
.send(GenericMessage::new(
|
||||
MessageMetadata::new(request_id, self.mode_node.local_channel_id_generic()),
|
||||
mode_request,
|
||||
))
|
||||
self.subsystem_helper
|
||||
.send_announce_mode_cmd_to_children(request_id, &self.mode_node, recursive)
|
||||
.expect("sending mode request failed");
|
||||
});
|
||||
self.mode_req_handler_mock
|
||||
.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)]
|
||||
pub struct DevManagerCommandingHelper {
|
||||
/// The IDs, modes and reply awaition status of all children are tracked in this data
|
||||
@ -696,6 +704,22 @@ impl DevManagerCommandingHelper {
|
||||
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) {
|
||||
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 {
|
||||
pub mode_node: ModeRequestorAndHandlerMpscBounded,
|
||||
pub mode_requestor_info: Option<MessageMetadata>,
|
||||
@ -891,23 +913,10 @@ impl ModeRequestHandler for MgmAssembly {
|
||||
"TestAssembly: Announcing mode (recursively: {}): {:?}",
|
||||
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());
|
||||
self.mode_node
|
||||
.request_sender_store
|
||||
.0
|
||||
.iter()
|
||||
.for_each(|(_, sender)| {
|
||||
sender
|
||||
.send(GenericMessage::new(
|
||||
MessageMetadata::new(request_id, self.mode_node.local_channel_id_generic()),
|
||||
mode_request,
|
||||
))
|
||||
self.commanding_helper
|
||||
.send_announce_mode_cmd_to_children(request_id, &self.mode_node, recursive)
|
||||
.expect("sending mode request failed");
|
||||
});
|
||||
self.mode_req_mock.announce_mode(requestor_info, recursive);
|
||||
}
|
||||
|
||||
@ -1084,23 +1093,12 @@ impl ModeRequestHandler for DeviceManager {
|
||||
"{}: announcing mode: {:?}",
|
||||
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());
|
||||
self.mode_node
|
||||
.request_sender_store
|
||||
.0
|
||||
.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.commanding_helper.send_announce_mode_cmd_to_children(
|
||||
request_id,
|
||||
&self.mode_node,
|
||||
recursive,
|
||||
).expect("sending mode announce request failed");
|
||||
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();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_mode_info(
|
||||
&mut self,
|
||||
requestor_info: MessageMetadata,
|
||||
@ -1727,4 +1726,6 @@ fn command_safe_mode() {
|
||||
tb.mgt_dev.mode_and_submode(),
|
||||
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.
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user