15 CommandDispatcherComponentBase(name),
17 m_numCmdsDispatched(0),
20 memset(this->m_entryTable,0,
sizeof(this->m_entryTable));
21 memset(this->m_sequenceTracker,0,
sizeof(this->m_sequenceTracker));
31 CommandDispatcherComponentBase::init(queueDepth);
36 bool slotFound =
false;
38 if ((not this->m_entryTable[slot].used) and (not slotFound)) {
39 this->m_entryTable[slot].opcode = opCode;
40 this->m_entryTable[slot].port = portNum;
41 this->m_entryTable[slot].used =
true;
42 this->log_DIAGNOSTIC_OpCodeRegistered(opCode,portNum,slot);
44 }
else if ((this->m_entryTable[slot].used) &&
45 (this->m_entryTable[slot].opcode == opCode) &&
46 (this->m_entryTable[slot].port == portNum) &&
49 this->log_DIAGNOSTIC_OpCodeReregistered(opCode,portNum);
50 }
else if (this->m_entryTable[slot].used) {
51 FW_ASSERT(this->m_entryTable[slot].opcode != opCode, opCode);
57 void CommandDispatcherImpl::compCmdStat_handler(
NATIVE_INT_TYPE portNum,
FwOpcodeType opCode, U32 cmdSeq, Fw::CommandResponse response) {
59 if (Fw::COMMAND_OK == response) {
60 this->log_COMMAND_OpCodeCompleted(opCode);
62 this->m_numCmdErrors++;
63 this->tlmWrite_CommandErrors(this->m_numCmdErrors);
64 ErrorResponse evrResp = ERR_UNEXP;
66 case Fw::COMMAND_INVALID_OPCODE:
67 evrResp = ERR_INVALID_OPCODE;
69 case Fw::COMMAND_VALIDATION_ERROR:
70 evrResp = ERR_VALIDATION_ERROR;
72 case Fw::COMMAND_FORMAT_ERROR:
73 evrResp = ERR_FORMAT_ERROR;
75 case Fw::COMMAND_EXECUTION_ERROR:
76 evrResp = ERR_EXECUTION_ERROR;
78 case Fw::COMMAND_BUSY:
88 this->log_WARNING_HI_OpCodeError(opCode,evrResp);
95 (this->m_sequenceTracker[pending].seq == cmdSeq) &&
96 (this->m_sequenceTracker[pending].used)
98 portToCall = this->m_sequenceTracker[pending].callerPort;
99 context = this->m_sequenceTracker[pending].context;
100 FW_ASSERT(opCode == this->m_sequenceTracker[pending].opCode);
101 FW_ASSERT(portToCall < this->getNum_seqCmdStatus_OutputPorts());
102 this->m_sequenceTracker[pending].used =
false;
107 if (portToCall != -1) {
109 if (this->isConnected_seqCmdStatus_OutputPort(portToCall)) {
110 this->seqCmdStatus_out(portToCall,opCode,context,response);
121 CmdSerError serErr = ERR_UNEXP_STAT;
124 serErr = ERR_BUFFER_TOO_SMALL;
127 serErr = ERR_BUFFER_FORMAT;
130 serErr = ERR_SIZE_MISMATCH;
133 serErr = ERR_TYPE_MISMATCH;
139 serErr = ERR_UNEXP_STAT;
142 this->log_WARNING_HI_MalformedCommand(serErr);
143 if (this->isConnected_seqCmdStatus_OutputPort(portNum)) {
144 this->seqCmdStatus_out(portNum,cmdPkt.
getOpCode(),context,Fw::COMMAND_VALIDATION_ERROR);
151 bool entryFound =
false;
154 if ((this->m_entryTable[entry].used) and (cmdPkt.
getOpCode() == this->m_entryTable[entry].opcode)) {
159 if (entryFound and this->isConnected_compCmdSend_OutputPort(this->m_entryTable[entry].port)) {
161 if (this->isConnected_seqCmdStatus_OutputPort(portNum)) {
162 bool pendingFound =
false;
165 if (not this->m_sequenceTracker[pending].used) {
167 this->m_sequenceTracker[pending].used =
true;
168 this->m_sequenceTracker[pending].opCode = cmdPkt.
getOpCode();
169 this->m_sequenceTracker[pending].seq = this->m_seq;
170 this->m_sequenceTracker[pending].context = context;
171 this->m_sequenceTracker[pending].callerPort = portNum;
177 if (not pendingFound) {
178 this->log_WARNING_HI_TooManyCommands(cmdPkt.
getOpCode());
179 if (this->isConnected_seqCmdStatus_OutputPort(portNum)) {
180 this->seqCmdStatus_out(portNum,cmdPkt.
getOpCode(),context,Fw::COMMAND_EXECUTION_ERROR);
186 this->compCmdSend_out(this->m_entryTable[entry].port,cmdPkt.
getOpCode(),this->m_seq,cmdPkt.
getArgBuffer());
188 this->log_COMMAND_OpCodeDispatched(cmdPkt.
getOpCode(),this->m_entryTable[entry].port);
191 this->m_numCmdsDispatched++;
193 this->tlmWrite_CommandsDispatched(this->m_numCmdsDispatched);
195 this->log_WARNING_HI_InvalidCommand(cmdPkt.
getOpCode());
196 this->m_numCmdErrors++;
198 if (this->isConnected_seqCmdStatus_OutputPort(portNum)) {
199 this->seqCmdStatus_out(portNum,cmdPkt.
getOpCode(),context,Fw::COMMAND_INVALID_OPCODE);
201 this->tlmWrite_CommandErrors(this->m_numCmdErrors);
208 void CommandDispatcherImpl::CMD_NO_OP_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
211 this->log_ACTIVITY_HI_NoOpReceived();
212 this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_OK);
218 this->log_ACTIVITY_HI_NoOpStringReceived(msg);
219 this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_OK);
222 void CommandDispatcherImpl::CMD_TEST_CMD_1_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq, I32 arg1,
F32 arg2,
U8 arg3) {
223 this->log_ACTIVITY_HI_TestCmd1Args(arg1,arg2,arg3);
224 this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_OK);
227 void CommandDispatcherImpl::CMD_CLEAR_TRACKING_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
230 this->m_sequenceTracker[entry].used =
false;
232 this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_OK);
235 void CommandDispatcherImpl::pingIn_handler(
NATIVE_INT_TYPE portNum, U32 key) {
237 this->pingOut_out(0,key);