diff --git a/CHANGELOG.md b/CHANGELOG.md index e8fd799e..e075c5f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,16 +8,33 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/). The [milestone](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/milestones) list yields a list of all related PRs for each release. -Starting at v2.0.0, the following changes will consitute of a breaking -change warranting a new major release: +Starting at v2.0.0, this project will adhere to semantic versioning and the the following changes +will consitute of a breaking change warranting a new major release: - The TMTC interface changes in any shape of form. -- The behavour of the OBSW changes in a major shape or form relevant - for operations +- The behavour of the OBSW changes in a major shape or form relevant for operations # [unreleased] -## Added +## Changed + +COM PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/364 + +* Moved transmitter timer and handling of carrier and bitlock event from CCSDS handler to COM + subsystem +* Added parameter command to be able to change the transmitter timeout +* Solves [#362](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/362) +* Solves [#360](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/360) +* Solves [#361](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/361) +* Solves [#386](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/386) + +# [v1.30.0] + +eive-tmtc: v2.14.0 + +Event IDs for PDEC handler have changed in a breaking manner. + +## Added and Fixed - PDEC: Added basic FDIR to limit the number of allowed TC interrupts and to allow complete task lockups in the case an IRQ is immediately re-raised by the PDEC module. This is done by only diff --git a/CMakeLists.txt b/CMakeLists.txt index 076c9ae7..44dce9b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ cmake_minimum_required(VERSION 3.13) set(OBSW_VERSION_MAJOR 1) -set(OBSW_VERSION_MINOR 29) -set(OBSW_VERSION_REVISION 1) +set(OBSW_VERSION_MINOR 30) +set(OBSW_VERSION_REVISION 0) # set(CMAKE_VERBOSE TRUE) diff --git a/bsp_hosted/fsfwconfig/events/translateEvents.cpp b/bsp_hosted/fsfwconfig/events/translateEvents.cpp index 71f28a31..39d4c89a 100644 --- a/bsp_hosted/fsfwconfig/events/translateEvents.cpp +++ b/bsp_hosted/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 257 translations. + * @brief Auto-generated event translation file. Contains 258 translations. * @details - * Generated on: 2023-02-21 10:44:59 + * Generated on: 2023-02-22 15:00:34 */ #include "translateEvents.h" @@ -151,6 +151,7 @@ const char *CARRIER_LOCK_STRING = "CARRIER_LOCK"; const char *BIT_LOCK_PDEC_STRING = "BIT_LOCK_PDEC"; const char *LOST_CARRIER_LOCK_PDEC_STRING = "LOST_CARRIER_LOCK_PDEC"; const char *LOST_BIT_LOCK_PDEC_STRING = "LOST_BIT_LOCK_PDEC"; +const char *TOO_MANY_IRQS_STRING = "TOO_MANY_IRQS"; const char *POLL_SYSCALL_ERROR_PDEC_STRING = "POLL_SYSCALL_ERROR_PDEC"; const char *WRITE_SYSCALL_ERROR_PDEC_STRING = "WRITE_SYSCALL_ERROR_PDEC"; const char *IMAGE_UPLOAD_FAILED_STRING = "IMAGE_UPLOAD_FAILED"; @@ -553,8 +554,10 @@ const char *translateEvents(Event event) { case (12406): return LOST_BIT_LOCK_PDEC_STRING; case (12407): - return POLL_SYSCALL_ERROR_PDEC_STRING; + return TOO_MANY_IRQS_STRING; case (12408): + return POLL_SYSCALL_ERROR_PDEC_STRING; + case (12409): return WRITE_SYSCALL_ERROR_PDEC_STRING; case (12500): return IMAGE_UPLOAD_FAILED_STRING; diff --git a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp index 08b7ac62..4a9083e3 100644 --- a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp +++ b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 148 translations. - * Generated on: 2023-02-21 10:44:59 + * Generated on: 2023-02-22 15:00:34 */ #include "translateObjects.h" diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index d3264b73..cce653ee 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -389,7 +389,7 @@ ReturnValue_t CoreController::sdStateMachine() { sdInfo.cycleCount = 0; return true; } else if (sdInfo.cycleCount > 4) { - sif::warning << "CoreController::sdInitStateMachine: " << opPrintout << " takes too long" + sif::warning << "CoreController::sdStateMachine: " << opPrintout << " takes too long" << std::endl; return false; } @@ -401,7 +401,7 @@ ReturnValue_t CoreController::sdStateMachine() { // Create updated status file result = sdcMan->updateSdCardStateFile(); if (result != returnvalue::OK) { - sif::warning << "CoreController::initialize: Updating SD card state file failed" + sif::warning << "CoreController::sdStateMachine: Updating SD card state file failed" << std::endl; } sdInfo.commandExecuted = true; diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index b3378221..30fecf60 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -575,7 +575,6 @@ void ObjectFactory::createSyrlinksComponents(PowerSwitchIF* pwrSwitcher) { new SyrlinksHandler(objects::SYRLINKS_HANDLER, objects::UART_COM_IF, syrlinksUartCookie, pcdu::PDU1_CH1_SYRLINKS_12V, syrlinksFdir); syrlinksHandler->setPowerSwitcher(pwrSwitcher); - syrlinksHandler->setStartUpImmediately(); syrlinksHandler->connectModeTreeParent(satsystem::com::SUBSYSTEM); #if OBSW_DEBUG_SYRLINKS == 1 syrlinksHandler->setDebugMode(true); @@ -759,9 +758,9 @@ ReturnValue_t ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF, new AxiPtmeConfig(objects::AXI_PTME_CONFIG, q7s::UIO_PTME, q7s::uiomapids::PTME_CONFIG); PtmeConfig* ptmeConfig = new PtmeConfig(objects::PTME_CONFIG, axiPtmeConfig); - *ipCoreHandler = new CcsdsIpCoreHandler( - objects::CCSDS_HANDLER, objects::PTME, objects::CCSDS_PACKET_DISTRIBUTOR, ptmeConfig, - gpioComIF, gpioIds::RS485_EN_TX_CLOCK, gpioIds::RS485_EN_TX_DATA); + *ipCoreHandler = new CcsdsIpCoreHandler(objects::CCSDS_HANDLER, objects::PTME, + objects::CCSDS_PACKET_DISTRIBUTOR, ptmeConfig, gpioComIF, + gpioIds::RS485_EN_TX_CLOCK, gpioIds::RS485_EN_TX_DATA); VirtualChannel* vc = nullptr; vc = new VirtualChannel(ccsds::VC0, config::VC0_QUEUE_SIZE, objects::CCSDS_HANDLER); (*ipCoreHandler)->addVirtualChannel(ccsds::VC0, vc); diff --git a/bsp_q7s/memory/LocalParameterHandler.cpp b/bsp_q7s/memory/LocalParameterHandler.cpp index b24a3e08..90c15f39 100644 --- a/bsp_q7s/memory/LocalParameterHandler.cpp +++ b/bsp_q7s/memory/LocalParameterHandler.cpp @@ -8,6 +8,26 @@ LocalParameterHandler::~LocalParameterHandler() { } ReturnValue_t LocalParameterHandler::initialize() { + ReturnValue_t result = updateFullName(); + if (result != returnvalue::OK) { + return result; + } + result = readJsonFile(); + if (result != returnvalue::OK) { + return result; + } + return returnvalue::OK; +} + +ReturnValue_t LocalParameterHandler::writeJsonFile() { + ReturnValue_t result = updateFullName(); + if (result != returnvalue::OK) { + return result; + } + return NVMParameterBase::writeJsonFile(); +} + +ReturnValue_t LocalParameterHandler::updateFullName() { std::string mountPrefix; auto activeSd = sdcMan->getActiveSdCard(); if (activeSd and sdcMan->isSdCardUsable(activeSd.value())) { @@ -15,13 +35,8 @@ ReturnValue_t LocalParameterHandler::initialize() { } else { return SD_NOT_READY; } - mountPrefix = sdcMan->getCurrentMountPrefix(); std::string fullname = mountPrefix + "/" + sdRelativeName; - setFullName(fullname); - ReturnValue_t result = readJsonFile(); - if (result != returnvalue::OK) { - return result; - } + NVMParameterBase::setFullName(fullname); return returnvalue::OK; } diff --git a/bsp_q7s/memory/LocalParameterHandler.h b/bsp_q7s/memory/LocalParameterHandler.h index 37fa7f2c..bb5eae55 100644 --- a/bsp_q7s/memory/LocalParameterHandler.h +++ b/bsp_q7s/memory/LocalParameterHandler.h @@ -65,6 +65,16 @@ class LocalParameterHandler : public NVMParameterBase { std::string sdRelativeName; SdCardMountedIF* sdcMan; + + virtual ReturnValue_t writeJsonFile(); + + /** + * @brief This function sets the name of the json file dependent on the + * currently active SD card + * + * @return OK if successful, otherwise error return value + */ + ReturnValue_t updateFullName(); }; template inline ReturnValue_t LocalParameterHandler::addParameter(std::string key, T value) { diff --git a/fsfw b/fsfw index 2efff4d2..bd208038 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 2efff4d2c5ef82b5b62567ab1bb0ee53aeed6a5a +Subproject commit bd208038dd85a94dce8c763397ad5ac7eae76402 diff --git a/generators/bsp_hosted_events.csv b/generators/bsp_hosted_events.csv index 09afd861..f1188b4e 100644 --- a/generators/bsp_hosted_events.csv +++ b/generators/bsp_hosted_events.csv @@ -145,8 +145,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/ipcore/PdecHandler.h 12405;0x3075;LOST_CARRIER_LOCK_PDEC;INFO;Lost carrier lock;linux/ipcore/PdecHandler.h 12406;0x3076;LOST_BIT_LOCK_PDEC;INFO;Lost bit lock;linux/ipcore/PdecHandler.h -12407;0x3077;POLL_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h -12408;0x3078;WRITE_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h +12407;0x3077;TOO_MANY_IRQS;MEDIUM;Too many IRQs over the time window of one second. P1: Allowed TCs;linux/ipcore/PdecHandler.h +12408;0x3078;POLL_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h +12409;0x3079;WRITE_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h 12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrHelper.h 12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrHelper.h 12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrHelper.h diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index 09afd861..f1188b4e 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -145,8 +145,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/ipcore/PdecHandler.h 12405;0x3075;LOST_CARRIER_LOCK_PDEC;INFO;Lost carrier lock;linux/ipcore/PdecHandler.h 12406;0x3076;LOST_BIT_LOCK_PDEC;INFO;Lost bit lock;linux/ipcore/PdecHandler.h -12407;0x3077;POLL_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h -12408;0x3078;WRITE_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h +12407;0x3077;TOO_MANY_IRQS;MEDIUM;Too many IRQs over the time window of one second. P1: Allowed TCs;linux/ipcore/PdecHandler.h +12408;0x3078;POLL_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h +12409;0x3079;WRITE_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h 12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrHelper.h 12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrHelper.h 12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrHelper.h diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index 71f28a31..39d4c89a 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 257 translations. + * @brief Auto-generated event translation file. Contains 258 translations. * @details - * Generated on: 2023-02-21 10:44:59 + * Generated on: 2023-02-22 15:00:34 */ #include "translateEvents.h" @@ -151,6 +151,7 @@ const char *CARRIER_LOCK_STRING = "CARRIER_LOCK"; const char *BIT_LOCK_PDEC_STRING = "BIT_LOCK_PDEC"; const char *LOST_CARRIER_LOCK_PDEC_STRING = "LOST_CARRIER_LOCK_PDEC"; const char *LOST_BIT_LOCK_PDEC_STRING = "LOST_BIT_LOCK_PDEC"; +const char *TOO_MANY_IRQS_STRING = "TOO_MANY_IRQS"; const char *POLL_SYSCALL_ERROR_PDEC_STRING = "POLL_SYSCALL_ERROR_PDEC"; const char *WRITE_SYSCALL_ERROR_PDEC_STRING = "WRITE_SYSCALL_ERROR_PDEC"; const char *IMAGE_UPLOAD_FAILED_STRING = "IMAGE_UPLOAD_FAILED"; @@ -553,8 +554,10 @@ const char *translateEvents(Event event) { case (12406): return LOST_BIT_LOCK_PDEC_STRING; case (12407): - return POLL_SYSCALL_ERROR_PDEC_STRING; + return TOO_MANY_IRQS_STRING; case (12408): + return POLL_SYSCALL_ERROR_PDEC_STRING; + case (12409): return WRITE_SYSCALL_ERROR_PDEC_STRING; case (12500): return IMAGE_UPLOAD_FAILED_STRING; diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index b8deca09..a5100ae1 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 153 translations. - * Generated on: 2023-02-21 10:44:59 + * Generated on: 2023-02-22 15:00:34 */ #include "translateObjects.h" diff --git a/linux/devices/CMakeLists.txt b/linux/devices/CMakeLists.txt index 17d842ea..22b39840 100644 --- a/linux/devices/CMakeLists.txt +++ b/linux/devices/CMakeLists.txt @@ -3,8 +3,9 @@ if(EIVE_BUILD_GPSD_GPS_HANDLER) endif() target_sources( - ${OBSW_NAME} PRIVATE Max31865RtdPolling.cpp ScexUartReader.cpp ImtqPollingTask.cpp - ScexDleParser.cpp ScexHelper.cpp RwPollingTask.cpp) + ${OBSW_NAME} + PRIVATE Max31865RtdPolling.cpp ScexUartReader.cpp ImtqPollingTask.cpp + ScexDleParser.cpp ScexHelper.cpp RwPollingTask.cpp) add_subdirectory(ploc) diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index 71f28a31..39d4c89a 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 257 translations. + * @brief Auto-generated event translation file. Contains 258 translations. * @details - * Generated on: 2023-02-21 10:44:59 + * Generated on: 2023-02-22 15:00:34 */ #include "translateEvents.h" @@ -151,6 +151,7 @@ const char *CARRIER_LOCK_STRING = "CARRIER_LOCK"; const char *BIT_LOCK_PDEC_STRING = "BIT_LOCK_PDEC"; const char *LOST_CARRIER_LOCK_PDEC_STRING = "LOST_CARRIER_LOCK_PDEC"; const char *LOST_BIT_LOCK_PDEC_STRING = "LOST_BIT_LOCK_PDEC"; +const char *TOO_MANY_IRQS_STRING = "TOO_MANY_IRQS"; const char *POLL_SYSCALL_ERROR_PDEC_STRING = "POLL_SYSCALL_ERROR_PDEC"; const char *WRITE_SYSCALL_ERROR_PDEC_STRING = "WRITE_SYSCALL_ERROR_PDEC"; const char *IMAGE_UPLOAD_FAILED_STRING = "IMAGE_UPLOAD_FAILED"; @@ -553,8 +554,10 @@ const char *translateEvents(Event event) { case (12406): return LOST_BIT_LOCK_PDEC_STRING; case (12407): - return POLL_SYSCALL_ERROR_PDEC_STRING; + return TOO_MANY_IRQS_STRING; case (12408): + return POLL_SYSCALL_ERROR_PDEC_STRING; + case (12409): return WRITE_SYSCALL_ERROR_PDEC_STRING; case (12500): return IMAGE_UPLOAD_FAILED_STRING; diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index b8deca09..a5100ae1 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 153 translations. - * Generated on: 2023-02-21 10:44:59 + * Generated on: 2023-02-22 15:00:34 */ #include "translateObjects.h" diff --git a/linux/ipcore/PdecHandler.cpp b/linux/ipcore/PdecHandler.cpp index ebf9376a..3ac9a465 100644 --- a/linux/ipcore/PdecHandler.cpp +++ b/linux/ipcore/PdecHandler.cpp @@ -82,6 +82,11 @@ ReturnValue_t PdecHandler::initialize() { return result; } + result = paramHelper.initialize(); + if (result != returnvalue::OK) { + return result; + } + return returnvalue::OK; } @@ -128,15 +133,25 @@ ReturnValue_t PdecHandler::polledOperation() { readCommandQueue(); switch (state) { - case State::INIT: + case State::INIT: { handleInitState(); break; - case State::RUNNING: + } + case State::RUNNING: { if (newTcReceived()) { handleNewTc(); } checkLocks(); break; + } + case State::PDEC_RESET: { + ReturnValue_t result = pdecToReset(); + if (result != returnvalue::OK) { + triggerEvent(PDEC_RESET_FAILED); + } + state = State::INIT; + break; + } case State::WAIT_FOR_RECOVERY: break; default: @@ -170,9 +185,19 @@ ReturnValue_t PdecHandler::irqOperation() { info = 1; readCommandQueue(); switch (state) { - case State::INIT: + case State::INIT: { handleInitState(); + checkLocks(); break; + } + case State::PDEC_RESET: { + ReturnValue_t result = pdecToReset(); + if (result != returnvalue::OK) { + triggerEvent(PDEC_RESET_FAILED); + } + state = State::INIT; + break; + } case State::RUNNING: { checkAndHandleIrqs(fd, info); break; @@ -337,6 +362,8 @@ ReturnValue_t PdecHandler::getParameter(uint8_t domainId, uint8_t uniqueIdentifi sif::warning << "PdecHandler::getParameter: Failed to set positive window" << std::endl; return returnvalue::FAILED; } + // PDEC needs reset to apply this parameter change + state = State::PDEC_RESET; return returnvalue::OK; } else if ((domainId == 0) and (uniqueIdentifier == ParameterId::NEGATIVE_WINDOW)) { uint8_t newVal = 0; @@ -352,11 +379,13 @@ ReturnValue_t PdecHandler::getParameter(uint8_t domainId, uint8_t uniqueIdentifi return returnvalue::FAILED; } parameterWrapper->set(negativeWindow); - result = pdecConfig.setNegativeWindow(negativeWindow); + result = pdecConfig.setNegativeWindow(newVal); if (result != returnvalue::OK) { sif::warning << "PdecHandler::getParameter: Failed to set negative window" << std::endl; return returnvalue::FAILED; } + // PDEC needs reset to apply this parameter change + state = State::PDEC_RESET; return returnvalue::OK; } return returnvalue::OK; @@ -388,6 +417,16 @@ ReturnValue_t PdecHandler::releasePdec() { return result; } +ReturnValue_t PdecHandler::pdecToReset() { + ReturnValue_t result = returnvalue::OK; + result = gpioComIF->pullLow(pdecReset); + if (result != returnvalue::OK) { + sif::error << "PdecHandler::pdecToReset: Failed to pull PDEC reset line" + " to low" << std::endl; + } + return result; +} + bool PdecHandler::newTcReceived() { uint32_t pdecFar = readFar(); diff --git a/linux/ipcore/PdecHandler.h b/linux/ipcore/PdecHandler.h index d43c86e3..b15736c1 100644 --- a/linux/ipcore/PdecHandler.h +++ b/linux/ipcore/PdecHandler.h @@ -99,9 +99,12 @@ class PdecHandler : public SystemObject, //! [EXPORT] : [COMMENT] Too many IRQs over the time window of one second. P1: Allowed TCs static constexpr Event TOO_MANY_IRQS = MAKE_EVENT(7, severity::MEDIUM); static constexpr Event POLL_SYSCALL_ERROR_PDEC = - event::makeEvent(SUBSYSTEM_ID, 7, severity::MEDIUM); - static constexpr Event WRITE_SYSCALL_ERROR_PDEC = event::makeEvent(SUBSYSTEM_ID, 8, severity::MEDIUM); + static constexpr Event WRITE_SYSCALL_ERROR_PDEC = + event::makeEvent(SUBSYSTEM_ID, 9, severity::MEDIUM); + //! [EXPORT] : [COMMENT] Failed to pull PDEC reset to low + static constexpr Event PDEC_RESET_FAILED = + event::makeEvent(SUBSYSTEM_ID, 10, severity::HIGH); private: static const uint8_t INTERFACE_ID = CLASS_ID::PDEC_HANDLER; @@ -203,7 +206,7 @@ class PdecHandler : public SystemObject, INCORRECT_BC_CC }; - enum class State : uint8_t { INIT, RUNNING, WAIT_FOR_RECOVERY }; + enum class State : uint8_t { INIT, PDEC_RESET, RUNNING, WAIT_FOR_RECOVERY }; static uint32_t CURRENT_FAR; @@ -303,6 +306,14 @@ class PdecHandler : public SystemObject, */ ReturnValue_t releasePdec(); + /** + * @brief Will set PDEC in reset state. Use releasePdec() to release PDEC + * from reset state + * + * @return OK if successful, otherwise error return value + */ + ReturnValue_t pdecToReset(); + /** * @brief Reads the FAR register and checks if a new TC has been received. */ diff --git a/mission/devices/ImtqHandler.cpp b/mission/devices/ImtqHandler.cpp index 18c002c4..aa935ce5 100644 --- a/mission/devices/ImtqHandler.cpp +++ b/mission/devices/ImtqHandler.cpp @@ -256,7 +256,7 @@ ReturnValue_t ImtqHandler::scanForReply(const uint8_t* start, size_t remainingSi ReturnValue_t ImtqHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { ReturnValue_t result; ReturnValue_t status = returnvalue::OK; - if(getMode() != MODE_NORMAL) { + if (getMode() != MODE_NORMAL) { // Ignore replies during transitions. return returnvalue::OK; } diff --git a/mission/memory/NVMParameterBase.h b/mission/memory/NVMParameterBase.h index 7d73c776..ba5c57da 100644 --- a/mission/memory/NVMParameterBase.h +++ b/mission/memory/NVMParameterBase.h @@ -31,7 +31,7 @@ class NVMParameterBase { virtual ReturnValue_t writeJsonFile(); - void setFullName(std::string fullName); + virtual void setFullName(std::string fullName); std::string getFullName() const; template @@ -69,7 +69,7 @@ inline ReturnValue_t NVMParameterBase::insertValue(std::string key, T value) { template inline ReturnValue_t NVMParameterBase::setValue(std::string key, T value) { - json[key] = value; + json[key] = value; return returnvalue::OK; } diff --git a/mission/system/objects/ComSubsystem.cpp b/mission/system/objects/ComSubsystem.cpp index bbe14af0..a30f441b 100644 --- a/mission/system/objects/ComSubsystem.cpp +++ b/mission/system/objects/ComSubsystem.cpp @@ -1,5 +1,3 @@ -#include - #include "ComSubsystem.h" #include @@ -7,12 +5,10 @@ #include #include #include +#include #include -extern std::pair> COM_SEQUENCE_RX_ONLY; -extern std::pair> COM_SEQUENCE_RX_AND_TX_DEFAULT_RATE; -extern std::pair> COM_SEQUENCE_RX_AND_TX_LOW_RATE; -extern std::pair> COM_SEQUENCE_RX_AND_TX_HIGH_RATE; +#include ComSubsystem::ComSubsystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables, uint32_t transmitterTimeout) @@ -26,7 +22,15 @@ ComSubsystem::ComSubsystem(object_id_t setObjectId, uint32_t maxNumberOfSequence void ComSubsystem::performChildOperation() { readEventQueue(); - checkTransmitterCountdown(); + // Execute default rate sequence after transition has been completed + if (rememberBitLock and not isInTransition) { + startRxAndTxLowRateSeq(); + rememberBitLock = false; + } + if (countdownActive) { + checkTransmitterCountdown(); + } + Subsystem::performChildOperation(); } MessageQueueId_t ComSubsystem::getCommandQueue() const { return Subsystem::getCommandQueue(); } @@ -46,17 +50,17 @@ ReturnValue_t ComSubsystem::getParameter(uint8_t domainId, uint8_t uniqueIdentif parameterWrapper->set(datarateCfg); com::setCurrentDatarate(static_cast(newVal)); return returnvalue::OK; - } - else if ((domainId == 0) and (uniqueIdentifier == static_cast(com::ParameterId::TRANSMITTER_TIMEOUT))) { - uint8_t newVal = 0; - ReturnValue_t result = newValues->getElement(&newVal); - if (result != returnvalue::OK) { - return result; - } - parameterWrapper->set(transmitterTimeout); - transmitterTimeout = newVal; - transmitterCountdown.setTimeout(transmitterTimeout); - return returnvalue::OK; + } else if ((domainId == 0) and + (uniqueIdentifier == static_cast(com::ParameterId::TRANSMITTER_TIMEOUT))) { + uint32_t newVal = 0; + ReturnValue_t result = newValues->getElement(&newVal); + if (result != returnvalue::OK) { + return result; + } + parameterWrapper->set(transmitterTimeout); + transmitterTimeout = newVal; + transmitterCountdown.setTimeout(transmitterTimeout); + return returnvalue::OK; } return returnvalue::OK; } @@ -74,44 +78,48 @@ ReturnValue_t ComSubsystem::initialize() { if (result != returnvalue::OK) { return result; } - EventManagerIF* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER); - if (manager == nullptr) { + EventManagerIF *manager = ObjectManager::instance()->get(objects::EVENT_MANAGER); + if (manager == nullptr) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "ComSubsystem::initialize: Invalid event manager" << std::endl; + sif::error << "ComSubsystem::initialize: Invalid event manager" << std::endl; #endif - return ObjectManagerIF::CHILD_INIT_FAILED; - } - result = manager->registerListener(eventQueue->getId()); - if (result != returnvalue::OK) { + return ObjectManagerIF::CHILD_INIT_FAILED; + } + result = manager->registerListener(eventQueue->getId()); + if (result != returnvalue::OK) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::warning << "ComSubsystem::initialize: Failed to register Com Subsystem as event " - "listener" << std::endl; + sif::warning << "ComSubsystem::initialize: Failed to register Com Subsystem as event " + "listener" + << std::endl; #endif - return ObjectManagerIF::CHILD_INIT_FAILED; - } - result = manager->subscribeToEventRange(eventQueue->getId(), - event::getEventId(PdecHandler::CARRIER_LOCK), - event::getEventId(PdecHandler::BIT_LOCK_PDEC)); - if (result != returnvalue::OK) { + return ObjectManagerIF::CHILD_INIT_FAILED; + } + result = manager->subscribeToEventRange(eventQueue->getId(), + event::getEventId(PdecHandler::CARRIER_LOCK), + event::getEventId(PdecHandler::BIT_LOCK_PDEC)); + if (result != returnvalue::OK) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "ComSubsystem::initialize: Failed to subscribe to events from PDEC " - "handler" - << std::endl; + sif::error << "ComSubsystem::initialize: Failed to subscribe to events from PDEC " + "handler" + << std::endl; #endif - return result; - } + return result; + } return Subsystem::initialize(); } void ComSubsystem::startTransition(Mode_t mode, Submode_t submode) { - // Depending on the mode the transmitter timeout is enabled or + // Depending on the submode the transmitter timeout is enabled or // disabled here - if (mode == COM_SEQUENCE_RX_ONLY.first) { + if (mode == com::Submode::RX_ONLY) { transmitterCountdown.timeOut(); - } else if ((mode == COM_SEQUENCE_RX_AND_TX_DEFAULT_RATE.first) || - (mode == COM_SEQUENCE_RX_AND_TX_LOW_RATE.first) || - (mode == COM_SEQUENCE_RX_AND_TX_HIGH_RATE.first)) { - transmitterCountdown.resetTimer(); + countdownActive = false; + } else if (isTxMode(mode)) { + // Only start transmitter countdown if transmitter is not already on + if (not isTxMode(this->mode)) { + transmitterCountdown.resetTimer(); + countdownActive = true; + } } Subsystem::startTransition(mode, submode); } @@ -149,22 +157,42 @@ void ComSubsystem::handleEventMessage(EventMessage *eventMessage) { } } -void ComSubsystem::handleBitLockEvent() { startRxAndTxDefaultSeq(); } +void ComSubsystem::handleBitLockEvent() { + if (isTxMode(mode)) { + // Tx already on + return; + } + if (isInTransition) { + rememberBitLock = true; + return; + } + startRxAndTxLowRateSeq(); +} void ComSubsystem::handleCarrierLockEvent() { if (!enableTxWhenCarrierLock) { return; } - startRxAndTxDefaultSeq(); + startRxAndTxLowRateSeq(); } -void ComSubsystem::startRxAndTxDefaultSeq() { +void ComSubsystem::startRxAndTxLowRateSeq() { // Turns transmitter on - startTransition(COM_SEQUENCE_RX_AND_TX_DEFAULT_RATE.first, SUBMODE_NONE); + startTransition(com::Submode::RX_AND_TX_LOW_DATARATE, SUBMODE_NONE); } void ComSubsystem::checkTransmitterCountdown() { if (transmitterCountdown.hasTimedOut()) { - startTransition(COM_SEQUENCE_RX_ONLY.first, SUBMODE_NONE); + startTransition(com::Submode::RX_ONLY, SUBMODE_NONE); + countdownActive = false; } } + +bool ComSubsystem::isTxMode(Mode_t mode) { + if ((mode == com::Submode::RX_AND_TX_DEFAULT_DATARATE) || + (mode == com::Submode::RX_AND_TX_LOW_DATARATE) || + (mode == com::Submode::RX_AND_TX_HIGH_DATARATE)) { + return true; + } + return false; +} diff --git a/mission/system/objects/ComSubsystem.h b/mission/system/objects/ComSubsystem.h index b1bbeed9..85bb4273 100644 --- a/mission/system/objects/ComSubsystem.h +++ b/mission/system/objects/ComSubsystem.h @@ -1,24 +1,25 @@ #ifndef MISSION_SYSTEM_COMSUBSYSTEM_H_ #define MISSION_SYSTEM_COMSUBSYSTEM_H_ +#include #include #include #include -#include #include "mission/comDefs.h" class ComSubsystem : public Subsystem, public ReceivesParameterMessagesIF { public: - /** - * @brief Constructor - * - * @param setObjectId - * @param maxNumberOfSequences - * @param maxNumberOfTables - * @param transmitterTimeout Maximum time the transmitter of the syrlinks - * will be enabled - */ + /** + * @brief Constructor + * + * @param setObjectId + * @param maxNumberOfSequences + * @param maxNumberOfTables + * @param transmitterTimeout Maximum time the transmitter of the syrlinks + * will be + * enabled + */ ComSubsystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables, uint32_t transmitterTimeout); virtual ~ComSubsystem() = default; @@ -30,6 +31,8 @@ class ComSubsystem : public Subsystem, public ReceivesParameterMessagesIF { virtual void performChildOperation() override; private: + static const Mode_t INITIAL_MODE = 0; + ReturnValue_t handleCommandMessage(CommandMessage *message) override; ReturnValue_t initialize() override; @@ -37,28 +40,42 @@ class ComSubsystem : public Subsystem, public ReceivesParameterMessagesIF { void startTransition(Mode_t mode, Submode_t submode) override; void readEventQueue(); - void handleEventMessage(EventMessage* eventMessage); + void handleEventMessage(EventMessage *eventMessage); void handleBitLockEvent(); void handleCarrierLockEvent(); void checkTransmitterCountdown(); /** - * @brief Enables transmitter in default (low) rate mode + * @brief Enables transmitter in low rate mode */ - void startRxAndTxDefaultSeq(); + void startRxAndTxLowRateSeq(); + + /** + * @brief Returns true if mode is a mode where the transmitter is on + */ + bool isTxMode(Mode_t mode); uint8_t datarateCfg = static_cast(com::Datarate::LOW_RATE_MODULATION_BPSK); - // Maximum time after which the transmitter will be turned of. This is a - // protection mechanism due prevent the syrlinks from overheating - uint32_t transmitterTimeout = 0; + // Maximum time after which the transmitter will be turned of. This is a + // protection mechanism due prevent the syrlinks from overheating + uint32_t transmitterTimeout = 0; ParameterHelper paramHelper; - MessageQueueIF* eventQueue = nullptr; + MessageQueueIF *eventQueue = nullptr; bool enableTxWhenCarrierLock = false; // Countdown will be started as soon as the transmitter was enabled Countdown transmitterCountdown; + + // Transmitter countdown only active when sysrlinks transmitter is on (modes: + // rx and tx low rate, rx and tx high rate, rx and tx default rate) + bool countdownActive = false; + + // True when bit lock occurred while COM subsystem is in a transition. This + // variable is used to remember the bit lock and execute the default rate + // sequence after the active transition has been completed + bool rememberBitLock = false; }; #endif /* MISSION_SYSTEM_COMSUBSYSTEM_H_ */ diff --git a/mission/system/tree/comModeTree.cpp b/mission/system/tree/comModeTree.cpp index 22f51379..9dc85a78 100644 --- a/mission/system/tree/comModeTree.cpp +++ b/mission/system/tree/comModeTree.cpp @@ -10,7 +10,8 @@ const auto check = subsystem::checkInsert; -ComSubsystem satsystem::com::SUBSYSTEM = ComSubsystem(objects::COM_SUBSYSTEM, 12, 24, TRANSMITTER_TIMEOUT); +ComSubsystem satsystem::com::SUBSYSTEM = + ComSubsystem(objects::COM_SUBSYSTEM, 12, 24, TRANSMITTER_TIMEOUT); static const auto OFF = HasModesIF::MODE_OFF; static const auto ON = HasModesIF::MODE_ON; @@ -18,39 +19,48 @@ static const auto NML = DeviceHandlerIF::MODE_NORMAL; auto COM_SEQUENCE_RX_ONLY = std::make_pair(::com::Submode::RX_ONLY, FixedArrayList()); -auto COM_TABLE_RX_ONLY_TGT = - std::make_pair((::com::Submode::RX_ONLY << 24) | 1, FixedArrayList()); -auto COM_TABLE_RX_ONLY_TRANS_0 = - std::make_pair((::com::Submode::RX_ONLY << 24) | 2, FixedArrayList()); -auto COM_TABLE_RX_ONLY_TRANS_1 = - std::make_pair((::com::Submode::RX_ONLY << 24) | 3, FixedArrayList()); +auto COM_TABLE_RX_ONLY_TGT = std::make_pair( + static_cast(::com::Submode::RX_ONLY << 24) | 1, FixedArrayList()); +auto COM_TABLE_RX_ONLY_TRANS_0 = std::make_pair( + static_cast(::com::Submode::RX_ONLY << 24) | 2, FixedArrayList()); +auto COM_TABLE_RX_ONLY_TRANS_1 = std::make_pair( + static_cast(::com::Submode::RX_ONLY << 24) | 3, FixedArrayList()); auto COM_SEQUENCE_RX_AND_TX_LOW_RATE = std::make_pair(::com::Submode::RX_AND_TX_LOW_DATARATE, FixedArrayList()); -auto COM_TABLE_RX_AND_TX_LOW_RATE_TGT = std::make_pair( - (::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 1, FixedArrayList()); -auto COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_0 = std::make_pair( - (::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 2, FixedArrayList()); -auto COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1 = std::make_pair( - (::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 3, FixedArrayList()); +auto COM_TABLE_RX_AND_TX_LOW_RATE_TGT = + std::make_pair(static_cast(::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 1, + FixedArrayList()); +auto COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_0 = + std::make_pair(static_cast(::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 2, + FixedArrayList()); +auto COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1 = + std::make_pair(static_cast(::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 3, + FixedArrayList()); auto COM_SEQUENCE_RX_AND_TX_HIGH_RATE = std::make_pair(::com::Submode::RX_AND_TX_HIGH_DATARATE, FixedArrayList()); -auto COM_TABLE_RX_AND_TX_HIGH_RATE_TGT = std::make_pair( - (::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 1, FixedArrayList()); -auto COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_0 = std::make_pair( - (::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 2, FixedArrayList()); -auto COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1 = std::make_pair( - (::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 3, FixedArrayList()); +auto COM_TABLE_RX_AND_TX_HIGH_RATE_TGT = + std::make_pair(static_cast(::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 1, + FixedArrayList()); +auto COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_0 = + std::make_pair(static_cast(::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 2, + FixedArrayList()); +auto COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1 = + std::make_pair(static_cast(::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 3, + FixedArrayList()); auto COM_SEQUENCE_RX_AND_TX_DEFAULT_RATE = std::make_pair(::com::Submode::RX_AND_TX_DEFAULT_DATARATE, FixedArrayList()); -auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TGT = std::make_pair( - (::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 1, FixedArrayList()); -auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_0 = std::make_pair( - (::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 2, FixedArrayList()); -auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1 = std::make_pair( - (::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 3, FixedArrayList()); +auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TGT = + std::make_pair(static_cast(::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 1, + FixedArrayList()); +auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_0 = + std::make_pair(static_cast(::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 2, + FixedArrayList()); +auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1 = + std::make_pair(static_cast(::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 3, + FixedArrayList()); namespace { @@ -67,7 +77,7 @@ Subsystem& satsystem::com::init() { buildTxAndRxLowRateSequence(SUBSYSTEM, entry); buildTxAndRxHighRateSequence(SUBSYSTEM, entry); buildTxAndRxDefaultRateSequence(SUBSYSTEM, entry); - SUBSYSTEM.setInitialMode(NML, ::com::Submode::RX_ONLY); + SUBSYSTEM.setInitialMode(COM_SEQUENCE_RX_ONLY.first); return SUBSYSTEM; } diff --git a/mission/system/tree/comModeTree.h b/mission/system/tree/comModeTree.h index 34e9c15a..9260e3ea 100644 --- a/mission/system/tree/comModeTree.h +++ b/mission/system/tree/comModeTree.h @@ -1,8 +1,8 @@ #ifndef MISSION_SYSTEM_TREE_COMMODETREE_H_ #define MISSION_SYSTEM_TREE_COMMODETREE_H_ -#include #include +#include namespace satsystem { @@ -11,7 +11,9 @@ extern ComSubsystem SUBSYSTEM; // The syrlinks must not transmitting longer then 15 minutes otherwise the // transceiver might be damaged due to overheating -static const uint32_t TRANSMITTER_TIMEOUT = 900000; // 15 minutes +// 15 minutes in milliseconds +static const uint32_t TRANSMITTER_TIMEOUT = 900000; + Subsystem& init(); } // namespace com diff --git a/mission/system/tree/system.cpp b/mission/system/tree/system.cpp index 69345bf3..5ec10a8c 100644 --- a/mission/system/tree/system.cpp +++ b/mission/system/tree/system.cpp @@ -7,6 +7,7 @@ #include "acsModeTree.h" #include "comModeTree.h" #include "eive/objects.h" +#include "mission/comDefs.h" #include "payloadModeTree.h" #include "tcsModeTree.h" #include "util.h" @@ -85,6 +86,7 @@ void buildSafeSequence(Subsystem& ss, ModeListEntry& eh) { // Build SAFE transition 0. Two transitions to reduce number of consecutive events and because // consecutive commanding of TCS and ACS can lead to SPI issues. iht(objects::TCS_SUBSYSTEM, NML, 0, EIVE_TABLE_SAFE_TRANS_0.second); + iht(objects::COM_SUBSYSTEM, com::RX_ONLY, 0, EIVE_TABLE_SAFE_TRANS_0.second); check(ss.addTable(TableEntry(EIVE_TABLE_SAFE_TRANS_0.first, &EIVE_TABLE_SAFE_TRANS_0.second)), ctxc); diff --git a/mission/tmtc/CcsdsIpCoreHandler.cpp b/mission/tmtc/CcsdsIpCoreHandler.cpp index 0b6a210d..b462f236 100644 --- a/mission/tmtc/CcsdsIpCoreHandler.cpp +++ b/mission/tmtc/CcsdsIpCoreHandler.cpp @@ -97,10 +97,6 @@ ReturnValue_t CcsdsIpCoreHandler::initialize() { return ObjectManagerIF::CHILD_INIT_FAILED; } - if (result != returnvalue::OK) { - return ObjectManagerIF::CHILD_INIT_FAILED; - } - #if OBSW_SYRLINKS_SIMULATED == 1 // Update data on rising edge ptmeConfig->invertTxClock(false); diff --git a/mission/tmtc/CfdpTmFunnel.cpp b/mission/tmtc/CfdpTmFunnel.cpp index 779e9aa8..32dba7fe 100644 --- a/mission/tmtc/CfdpTmFunnel.cpp +++ b/mission/tmtc/CfdpTmFunnel.cpp @@ -21,7 +21,7 @@ ReturnValue_t CfdpTmFunnel::performOperation(uint8_t) { break; } count++; - if(count == 500) { + if (count == 500) { sif::error << "CfdpTmFunnel: Possible message storm detected" << std::endl; break; } diff --git a/mission/tmtc/PusTmFunnel.cpp b/mission/tmtc/PusTmFunnel.cpp index e239afc9..974cdca0 100644 --- a/mission/tmtc/PusTmFunnel.cpp +++ b/mission/tmtc/PusTmFunnel.cpp @@ -21,7 +21,7 @@ ReturnValue_t PusTmFunnel::performOperation(uint8_t) { break; } count++; - if(count == 500) { + if (count == 500) { sif::error << "PusTmFunnel: Possible message storm detected" << std::endl; break; } diff --git a/mission/tmtc/VirtualChannel.cpp b/mission/tmtc/VirtualChannel.cpp index 64c7b006..6a24cc09 100644 --- a/mission/tmtc/VirtualChannel.cpp +++ b/mission/tmtc/VirtualChannel.cpp @@ -50,7 +50,7 @@ ReturnValue_t VirtualChannel::performOperation() { } count++; - if(count == 500) { + if (count == 500) { sif::error << "VirtualChannel: Possible message storm detected" << std::endl; break; }