better PDEC FDIR

This commit is contained in:
2023-04-14 13:11:11 +02:00
parent a7c227f8ea
commit 4e686b4ad0
7 changed files with 146 additions and 83 deletions

View File

@@ -15,6 +15,7 @@
#include "fsfw/serviceinterface/ServiceInterface.h"
#include "fsfw/tmtcservices/TmTcMessage.h"
#include "fsfw_hal/linux/uio/UioMapper.h"
#include "linux/ipcore/PdecConfig.h"
#include "pdec.h"
using namespace pdec;
@@ -103,7 +104,7 @@ ReturnValue_t PdecHandler::firstLoop() {
result = releasePdec();
if (result != returnvalue::OK) {
return returnvalue::FAILED;
return result;
}
// This configuration must be done while the PDEC is not held in reset.
@@ -141,7 +142,7 @@ ReturnValue_t PdecHandler::polledOperation() {
if (newTcReceived()) {
handleNewTc();
}
checkLocks();
doPeriodicWork();
break;
}
case State::PDEC_RESET: {
@@ -182,8 +183,13 @@ ReturnValue_t PdecHandler::irqOperation() {
switch (state) {
case State::INIT: {
result = handleInitState();
if (result == returnvalue::OK) {
openIrqFile(&fd);
if (result != returnvalue::OK) {
break;
}
openIrqFile(&fd);
if (ptmeResetWithReinitializationPending) {
actionHelper.finish(true, commandedBy, pdec::RESET_PDEC_WITH_REINIITALIZATION);
ptmeResetWithReinitializationPending = false;
}
break;
}
@@ -192,11 +198,12 @@ ReturnValue_t PdecHandler::irqOperation() {
if (result != returnvalue::OK) {
triggerEvent(PDEC_RESET_FAILED);
}
usleep(10);
state = State::INIT;
break;
}
case State::RUNNING: {
checkLocks();
doPeriodicWork();
checkAndHandleIrqs(fd, info);
break;
}
@@ -219,18 +226,19 @@ ReturnValue_t PdecHandler::handleInitState() {
ReturnValue_t result = firstLoop();
if (result != returnvalue::OK) {
if (result == LocalParameterHandler::SD_NOT_READY) {
TaskFactory::delayTask(400);
if (initTries == MAX_INIT_TRIES) {
sif::error << "PdecHandler::handleInitState: SD card never "
"becomes ready"
<< std::endl;
state = State::WAIT_FOR_RECOVERY;
} else {
state = State::INIT;
sif::error << "PdecHandler::handleInitState: SD card never becomes ready" << std::endl;
initFailedHandler(result);
return result;
}
state = State::INIT;
initTries++;
TaskFactory::delayTask(400);
return result;
}
state = State::WAIT_FOR_RECOVERY;
sif::error << "PDEC: Init failed with reason 0x" << std::hex << std::setw(4) << result
<< std::endl;
initFailedHandler(result);
return result;
}
state = State::RUNNING;
@@ -335,6 +343,7 @@ MessageQueueId_t PdecHandler::getCommandQueue() const { return commandQueue->get
ReturnValue_t PdecHandler::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
const uint8_t* data, size_t size) {
using namespace pdec;
switch (actionId) {
case PRINT_CLCW:
printClcw();
@@ -342,6 +351,18 @@ ReturnValue_t PdecHandler::executeAction(ActionId_t actionId, MessageQueueId_t c
case PRINT_PDEC_MON:
printPdecMon();
return EXECUTION_FINISHED;
case RESET_PDEC_NO_REINIITALIZATION: {
pdecToReset();
usleep(20);
releasePdec();
return EXECUTION_FINISHED;
}
case RESET_PDEC_WITH_REINIITALIZATION: {
state = State::PDEC_RESET;
ptmeResetWithReinitializationPending = true;
this->commandedBy = commandedBy;
return returnvalue::OK;
}
default:
return COMMAND_NOT_IMPLEMENTED;
}
@@ -449,23 +470,7 @@ bool PdecHandler::newTcReceived() {
return true;
}
void PdecHandler::checkLocks() {
uint32_t clcw = getClcw();
if (not(clcw & NO_RF_MASK) && not carrierLock) {
triggerEvent(CARRIER_LOCK);
carrierLock = true;
} else if ((clcw & NO_RF_MASK) && carrierLock) {
carrierLock = false;
triggerEvent(LOST_CARRIER_LOCK_PDEC);
}
if (not(clcw & NO_BITLOCK_MASK) && not bitLock) {
triggerEvent(BIT_LOCK_PDEC);
bitLock = true;
} else if ((clcw & NO_BITLOCK_MASK) && bitLock) {
bitLock = false;
triggerEvent(LOST_BIT_LOCK_PDEC);
}
}
void PdecHandler::doPeriodicWork() { checkLocks(); }
bool PdecHandler::checkFrameAna(uint32_t pdecFar) {
bool frameValid = false;
@@ -748,6 +753,33 @@ void PdecHandler::resetIrqLimiters() {
interruptCounter = 0;
}
void PdecHandler::checkLocks() {
uint32_t clcw = getClcw();
if (not(clcw & NO_RF_MASK) && not carrierLock) {
triggerEvent(CARRIER_LOCK);
carrierLock = true;
} else if ((clcw & NO_RF_MASK) && carrierLock) {
carrierLock = false;
triggerEvent(LOST_CARRIER_LOCK_PDEC);
}
if (not(clcw & NO_BITLOCK_MASK) && not bitLock) {
triggerEvent(BIT_LOCK_PDEC);
bitLock = true;
} else if ((clcw & NO_BITLOCK_MASK) && bitLock) {
bitLock = false;
triggerEvent(LOST_BIT_LOCK_PDEC);
}
}
void PdecHandler::initFailedHandler(ReturnValue_t reason) {
triggerEvent(pdec::PDEC_INIT_FAILED, reason, 0);
if (ptmeResetWithReinitializationPending) {
actionHelper.finish(false, commandedBy, pdec::RESET_PDEC_WITH_REINIITALIZATION, reason);
ptmeResetWithReinitializationPending = false;
}
state = State::WAIT_FOR_RECOVERY;
}
std::string PdecHandler::getMonStatusString(uint32_t status) {
switch (status) {
case TC_CHANNEL_INACTIVE: