added uart flush in ploc supervisor handler

This commit is contained in:
Jakob.Meier 2021-07-23 13:27:58 +02:00
parent 995395d11e
commit fab8a75839
2 changed files with 60 additions and 19 deletions

View File

@ -5,8 +5,8 @@
#include <fsfw/datapool/PoolReadGuard.h>
#include <fsfw/timemanager/Clock.h>
PlocSupervisorHandler::PlocSupervisorHandler(object_id_t objectId, object_id_t comIF, CookieIF * comCookie) :
DeviceHandlerBase(objectId, comIF, comCookie), hkset(this) {
PlocSupervisorHandler::PlocSupervisorHandler(object_id_t objectId, object_id_t uartComIFid, CookieIF * comCookie) :
DeviceHandlerBase(objectId, uartComIFid, comCookie), hkset(this) {
if (comCookie == NULL) {
sif::error << "PlocSupervisorHandler: Invalid com cookie" << std::endl;
}
@ -15,6 +15,20 @@ PlocSupervisorHandler::PlocSupervisorHandler(object_id_t objectId, object_id_t c
PlocSupervisorHandler::~PlocSupervisorHandler() {
}
ReturnValue_t PlocSupervisorHandler::initialize() {
ReturnValue_t result = RETURN_OK;
result = DeviceHandlerBase::initialize();
if (result != RETURN_OK) {
return result;
}
uartComIf = dynamic_cast<UartComIF*>(communicationInterface);
if (uartComIf == nullptr) {
sif::warning << "PlocSupervisorHandler::initialize: Invalid uart com if" << std::endl;
return INVALID_UART_COM_IF;
}
return result;
}
void PlocSupervisorHandler::doStartUp(){
#if OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP == 1
@ -41,52 +55,72 @@ ReturnValue_t PlocSupervisorHandler::buildTransitionDeviceCommand(
ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(
DeviceCommandId_t deviceCommand, const uint8_t * commandData,
size_t commandDataLen) {
ReturnValue_t result = RETURN_FAILED;
switch(deviceCommand) {
case(PLOC_SPV::GET_HK_REPORT): {
prepareEmptyCmd(PLOC_SPV::APID_GET_HK_REPORT);
return RETURN_OK;
result = RETURN_OK;
break;
}
case(PLOC_SPV::RESTART_MPSOC): {
prepareEmptyCmd(PLOC_SPV::APID_RESTART_MPSOC);
return RETURN_OK;
result = RETURN_OK;
break;
}
case(PLOC_SPV::START_MPSOC): {
prepareEmptyCmd(PLOC_SPV::APID_START_MPSOC);
return RETURN_OK;
result = RETURN_OK;
break;
}
case(PLOC_SPV::SHUTDOWN_MPSOC): {
prepareEmptyCmd(PLOC_SPV::APID_SHUTWOWN_MPSOC);
return RETURN_OK;
result = RETURN_OK;
break;
}
case(PLOC_SPV::SEL_MPSOC_BOOT_IMAGE): {
prepareSelBootImageCmd(commandData);
return RETURN_OK;
result = RETURN_OK;
break;
}
case(PLOC_SPV::RESET_MPSOC): {
prepareEmptyCmd(PLOC_SPV::APID_RESET_MPSOC);
return RETURN_OK;
result = RETURN_OK;
break;
}
case(PLOC_SPV::SET_TIME_REF): {
return prepareSetTimeRefCmd();
result = prepareSetTimeRefCmd();
break;
}
case(PLOC_SPV::SET_BOOT_TIMEOUT): {
prepareSetBootTimeoutCmd(commandData);
return RETURN_OK;
result = RETURN_OK;
break;
}
case(PLOC_SPV::SET_MAX_RESTART_TRIES): {
prepareRestartTriesCmd(commandData);
return RETURN_OK;
result = RETURN_OK;
break;
}
case(PLOC_SPV::DISABLE_PERIOIC_HK_TRANSMISSION): {
prepareDisableHk();
return RETURN_OK;
result = RETURN_OK;
break;
}
default:
sif::debug << "PlocSupervisorHandler::buildCommandFromCommand: Command not implemented"
<< std::endl;
return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
result = DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
break;
}
return HasReturnvaluesIF::RETURN_FAILED;
if (result == RETURN_OK) {
/**
* Flushing the receive buffer to make sure there are no data left from a faulty reply.
*/
uartComIf->flushUartRxBuffer(comCookie);
}
return result;
}
void PlocSupervisorHandler::fillCommandAndReplyMap() {
@ -222,7 +256,7 @@ ReturnValue_t PlocSupervisorHandler::handleAckReport(const uint8_t* data) {
triggerEvent(SUPV_CRC_FAILURE_EVENT);
sendFailureReport(PLOC_SPV::ACK_REPORT, CRC_FAILURE);
disableAllReplies();
return IGNORE_REPLY_DATA;
return RETURN_OK;
}
uint16_t apid = (*(data) << 8 | *(data + 1)) & APID_MASK;
@ -564,8 +598,8 @@ void PlocSupervisorHandler::disableAllReplies() {
/* If the command expects a telemetry packet the appropriate tm reply will be disabled here */
switch (commandId) {
case PLOC_SPV::HK_REPORT: {
iter = deviceReplyMap.find(PLOC_SPV::HK_REPORT);
case PLOC_SPV::GET_HK_REPORT: {
iter = deviceReplyMap.find(PLOC_SPV::GET_HK_REPORT);
info = &(iter->second);
info->delayCycles = 0;
info->command = deviceCommandMap.end();
@ -608,5 +642,5 @@ void PlocSupervisorHandler::disableExeReportReply() {
info->delayCycles = 0;
info->command = deviceCommandMap.end();
/* Expected replies is set to one here. The value will set to 0 in replyToReply() */
info->command->second.expectedReplies = 0;
info->command->second.expectedReplies = 1;
}

View File

@ -4,6 +4,7 @@
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
#include <mission/devices/devicedefinitions/PlocSupervisorDefinitions.h>
#include <cstring>
#include <fsfw_hal/linux/uart/UartComIF.h>
/**
* @brief This is the device handler for the supervisor of the PLOC which is programmed by
@ -20,9 +21,11 @@
class PlocSupervisorHandler: public DeviceHandlerBase {
public:
PlocSupervisorHandler(object_id_t objectId, object_id_t comIF, CookieIF * comCookie);
PlocSupervisorHandler(object_id_t objectId, object_id_t uartComIFid, CookieIF * comCookie);
virtual ~PlocSupervisorHandler();
virtual ReturnValue_t initialize() override;
protected:
void doStartUp() override;
void doShutDown() override;
@ -58,6 +61,8 @@ private:
static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3);
//! [EXPORT] : [COMMENT] Failed to read current system time
static const ReturnValue_t GET_TIME_FAILURE = MAKE_RETURN_CODE(0xA4);
//! [EXPORT] : [COMMENT] Invalid communication interface specified
static const ReturnValue_t INVALID_UART_COM_IF = MAKE_RETURN_CODE(0xA5);
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_SUPERVISOR_HANDLER;
@ -96,6 +101,8 @@ private:
PLOC_SPV::HkSet hkset;
UartComIF* uartComIf = nullptr;
/**
* @brief This function checks the crc of the received PLOC reply.
*