15 "Opcode table limited to opcode range");
17 "Sequencer table limited to range of U32");
22 memset(this->m_entryTable, 0,
sizeof(this->m_entryTable));
23 memset(this->m_sequenceTracker, 0,
sizeof(this->m_sequenceTracker));
30 bool slotFound =
false;
32 if ((not this->m_entryTable[slot].used) and (not slotFound)) {
33 this->m_entryTable[slot].opcode = opCode;
34 this->m_entryTable[slot].port = portNum;
35 this->m_entryTable[slot].used =
true;
38 }
else if ((this->m_entryTable[slot].used) && (this->m_entryTable[slot].opcode == opCode) &&
39 (this->m_entryTable[slot].port == portNum) && (not slotFound)) {
42 }
else if (this->m_entryTable[slot].used) {
43 FW_ASSERT(this->m_entryTable[slot].opcode != opCode, static_cast<FwAssertArgType>(opCode));
46 FW_ASSERT(slotFound, static_cast<FwAssertArgType>(opCode));
49 void CommandDispatcherImpl::compCmdStat_handler(
FwIndexType portNum,
57 this->m_numCmdErrors++;
65 if ((this->m_sequenceTracker[pending].seq == cmdSeq) && (this->m_sequenceTracker[pending].used)) {
66 portToCall = this->m_sequenceTracker[pending].callerPort;
67 context = this->m_sequenceTracker[pending].context;
68 FW_ASSERT(opCode == this->m_sequenceTracker[pending].opCode);
70 this->m_sequenceTracker[pending].used =
false;
75 if (portToCall != -1) {
101 bool entryFound =
false;
104 if ((this->m_entryTable[entry].used) and (cmdPkt.
getOpCode() == this->m_entryTable[entry].opcode)) {
112 bool pendingFound =
false;
115 if (not this->m_sequenceTracker[pending].used) {
117 this->m_sequenceTracker[pending].used =
true;
118 this->m_sequenceTracker[pending].opCode = cmdPkt.
getOpCode();
119 this->m_sequenceTracker[pending].seq = this->m_seq;
120 this->m_sequenceTracker[pending].context = context;
121 this->m_sequenceTracker[pending].callerPort = portNum;
127 if (not pendingFound) {
141 this->m_numCmdsDispatched++;
144 this->m_numCmdErrors++;
155 void CommandDispatcherImpl ::run_handler(
FwIndexType portNum, U32 context) {
161 void CommandDispatcherImpl::CMD_NO_OP_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
175 void CommandDispatcherImpl::CMD_TEST_CMD_1_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq, I32 arg1,
F32 arg2,
U8 arg3) {
180 void CommandDispatcherImpl::CMD_CLEAR_TRACKING_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
183 this->m_sequenceTracker[entry].used =
false;
188 void CommandDispatcherImpl::pingIn_handler(
FwIndexType portNum, U32 key) {
204 this->m_numCmdsDropped++;
Serialization/Deserialization operation was successful.
FwIdType FwOpcodeType
The type of a command opcode.
void log_ACTIVITY_HI_NoOpReceived() const
void log_WARNING_HI_CommandDroppedQueueOverflow(FwOpcodeType OpCode, U32 Context)
Invalid opcode dispatched.
void log_ACTIVITY_HI_TestCmd1Args(I32 arg1, F32 arg2, U8 arg3) const
void pingOut_out(FwIndexType portNum, U32 key)
Invoke output port pingOut.
Enum representing a command response.
void compCmdSend_out(FwIndexType portNum, FwOpcodeType opCode, U32 cmdSeq, Fw::CmdArgBuffer &args)
Invoke output port compCmdSend.
void log_DIAGNOSTIC_OpCodeReregistered(FwOpcodeType Opcode, I32 port) const
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())
void log_WARNING_HI_MalformedCommand(Fw::DeserialStatus Status) const
void tlmWrite_CommandsDropped(U32 arg, Fw::Time _tlmTime=Fw::Time())
Component responsible for dispatching incoming commands to registered components. ...
virtual ~CommandDispatcherImpl()
Component destructor.
void tlmWrite_CommandErrors(U32 arg, Fw::Time _tlmTime=Fw::Time())
CommandDispatcherImpl(const char *name)
Command Dispatcher constructor.
FwOpcodeType getOpCode() const
void log_WARNING_HI_InvalidCommand(FwOpcodeType Opcode) const
Command successfully executed.
SerializeStatus deserializeFrom(SerializeBufferBase &buffer)
deserialize contents from buffer
uint8_t U8
8-bit unsigned integer
void log_COMMAND_OpCodeError(FwOpcodeType Opcode, Fw::CmdResponse error) const
CmdArgBuffer & getArgBuffer()
Command had execution error.
const char * toChar() const
FwIndexType getNum_seqCmdStatus_OutputPorts() const
void seqCmdStatus_out(FwIndexType portNum, FwOpcodeType opCode, U32 cmdSeq, const Fw::CmdResponse &response)
Invoke output port seqCmdStatus.
PlatformIndexType FwIndexType
void log_DIAGNOSTIC_OpCodeRegistered(FwOpcodeType Opcode, I32 port, I32 slot) const
Log event OpCodeRegistered.
#define FW_NUM_ARRAY_ELEMENTS(a)
number of elements in an array
Auto-generated base for CommandDispatcher component.
bool isConnected_seqCmdStatus_OutputPort(FwIndexType portNum)
Command failed validation.
RateGroupDivider component implementation.
void log_WARNING_HI_TooManyCommands(FwOpcodeType Opcode) const
bool isConnected_compCmdSend_OutputPort(FwIndexType portNum)
void cmdResponse_out(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdResponse response)
Emit command response.
void log_COMMAND_OpCodeDispatched(FwOpcodeType Opcode, I32 port) const