17 "Opcode table limited to opcode range");
19 "Sequencer table limited to range of U32");
27 m_numCmdsDispatched(0),
29 m_numCmdsDropped(0) {}
34 this->m_executeWhenSequenceTableFull = executeWhenSequenceTableFull;
37 void CommandDispatcherImpl::advanceSequenceNumber() {
38 if (this->m_seq == std::numeric_limits<U32>::max()) {
39 this->m_seqWrapped =
true;
44 U32 CommandDispatcherImpl::allocateSequenceNumber() {
46 if (this->m_seqWrapped) {
47 SequenceTrackerEntry trackedCmd;
51 for (
FwSizeType i = 0; i < numTrackedCommands; ++i) {
55 this->advanceSequenceNumber();
59 const U32 sequenceNumber = this->m_seq;
60 this->advanceSequenceNumber();
61 return sequenceNumber;
68 FW_ASSERT(existingPort == portNum, static_cast<FwAssertArgType>(opCode));
71 const I32 slot =
static_cast<I32
>(this->m_entryTable.
getSize());
78 void CommandDispatcherImpl::compCmdStat_handler(
FwIndexType portNum,
86 this->m_numCmdErrors++;
91 SequenceTrackerEntry trackedCmd;
92 const Fw::Success removeStatus = this->m_sequenceTracker.
remove(cmdSeq, trackedCmd);
94 const FwIndexType portToCall = trackedCmd.callerPort;
95 const U32 context = trackedCmd.context;
117 if (portIsConnected) {
128 const U32 sequenceNumber = this->allocateSequenceNumber();
131 if (portIsConnected) {
132 SequenceTrackerEntry pendingCmd;
134 pendingCmd.context = context;
135 pendingCmd.callerPort = portNum;
137 pendingInsertStatus = this->m_sequenceTracker.
insert(sequenceNumber, pendingCmd);
152 this->m_numCmdsDispatched++;
161 this->m_numCmdErrors++;
163 if (portIsConnected) {
167 this->advanceSequenceNumber();
171 void CommandDispatcherImpl ::run_handler(
FwIndexType portNum, U32 context) {
177 void CommandDispatcherImpl::CMD_NO_OP_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
191 void CommandDispatcherImpl::CMD_TEST_CMD_1_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq, I32 arg1,
F32 arg2,
U8 arg3) {
196 void CommandDispatcherImpl::CMD_CLEAR_TRACKING_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
198 SequenceTrackerEntry selfEntry = {};
202 for (
const auto& entry : this->m_sequenceTracker) {
203 if (entry.getKey() == cmdSeq) {
206 const SequenceTrackerEntry& trackedCmd = entry.getValue();
207 FW_ASSERT(trackedCmd.callerPort < this->getNum_seqCmdStatus_OutputPorts());
209 this->
seqCmdStatus_out(trackedCmd.callerPort, trackedCmd.opCode, trackedCmd.context,
214 this->m_sequenceTracker.clear();
216 const Fw::Success status = this->m_sequenceTracker.insert(cmdSeq, selfEntry);
222 void CommandDispatcherImpl::pingIn_handler(
FwIndexType portNum, U32 key) {
239 this->m_numCmdsDropped.fetch_add(1, std::memory_order_relaxed);
constexpr FwOpcodeType getEventOpcode(const FwOpcodeType opcode)
Serialization/Deserialization operation was successful.
void seqCmdStatus_out(FwIndexType portNum, FwOpcodeType opCode, U32 cmdSeq, const Fw::CmdResponse &response) const
Invoke output port seqCmdStatus.
FwIdType FwOpcodeType
The type of a command opcode.
constexpr bool IncludeCommandOpcodesInEvents
void log_ACTIVITY_HI_NoOpReceived() const
PlatformSizeType FwSizeType
void log_WARNING_HI_CommandDroppedQueueOverflow(FwOpcodeType OpCode, U32 Context)
void log_COMMAND_OpCodeError(FwOpcodeType Opcode, const Fw::CmdResponse &error) const
Invalid opcode dispatched.
enum T e
The raw enum value.
FwSizeType getSize() const override
void log_ACTIVITY_HI_TestCmd1Args(I32 arg1, F32 arg2, U8 arg3) const
void compCmdSend_out(FwIndexType portNum, FwOpcodeType opCode, U32 cmdSeq, Fw::CmdArgBuffer &args) const
Invoke output port compCmdSend.
Enum representing a command response.
Success find(const K &key, V &value) const override
void log_DIAGNOSTIC_OpCodeReregistered(FwOpcodeType Opcode, I32 port) const
Command tracking was cleared before the command completed.
SerializeStatus
forward declaration for string
float F32
32-bit floating point
void log_COMMAND_OpCodeCompleted(FwOpcodeType Opcode) const
void log_ACTIVITY_HI_NoOpStringReceived(const Fw::StringBase &message) const
void tlmWrite_CommandsDispatched(U32 arg, Fw::Time _tlmTime=Fw::Time())
Success insert(const K &key, const V &value) override
SerializeStatus deserializeFrom(SerialBufferBase &buffer, Fw::Endianness mode=Fw::Endianness::BIG) override
Deserialize the contents of this object from a buffer.
Success remove(const K &key, V &value) override
void tlmWrite_CommandsDropped(U32 arg, Fw::Time _tlmTime=Fw::Time())
Component responsible for dispatching incoming commands to registered components. ...
bool isConnected_compCmdSend_OutputPort(FwIndexType portNum) const
virtual ~CommandDispatcherImpl()
Component destructor.
void tlmWrite_CommandErrors(U32 arg, Fw::Time _tlmTime=Fw::Time())
CommandDispatcherImpl(const char *name)
Command Dispatcher constructor.
void pingOut_out(FwIndexType portNum, U32 key) const
Invoke output port pingOut.
const char * toChar() const
Convert to a C-style char*.
FwOpcodeType getOpCode() const
void log_WARNING_HI_InvalidCommand(FwOpcodeType Opcode) const
Command successfully executed.
constexpr bool EXECUTE_WHEN_SEQUENCE_TABLE_FULL_DEFAULT
uint8_t U8
8-bit unsigned integer
CmdArgBuffer & getArgBuffer()
Command had execution error.
Success find(const K &key, V &value) const override
PlatformIndexType FwIndexType
void log_DIAGNOSTIC_OpCodeRegistered(FwOpcodeType Opcode, I32 port, I32 slot) const
Log event OpCodeRegistered.
void log_WARNING_HI_MalformedCommand(const Fw::DeserialStatus &Status) const
bool isConnected_seqCmdStatus_OutputPort(FwIndexType portNum) const
Auto-generated base for CommandDispatcher component.
Command failed validation.
RateGroupDivider component implementation.
void configure(bool executeWhenSequenceTableFull=CmdDispatcherCfg::EXECUTE_WHEN_SEQUENCE_TABLE_FULL_DEFAULT)
Configure behavior when the sequence tracker table is full.
Command was dispatched but the response tracking failed, indicating unknown state.
FwSizeType getSize() const override
Success insert(const K &key, const V &value) override
static constexpr FwIndexType getNum_seqCmdStatus_OutputPorts()
void log_WARNING_HI_TooManyCommands(FwOpcodeType Opcode) const
void cmdResponse_out(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdResponse response)
Emit command response.
void log_COMMAND_OpCodeDispatched(FwOpcodeType Opcode, I32 port) const