some docs and helper methods
This commit is contained in:
parent
ecd775c96c
commit
a01c806ff2
@ -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.
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user