From 8f8416c078165998e77f6a49d20d84ba2f30c861 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 Jan 2023 19:07:37 +0100 Subject: [PATCH 1/4] add modes --- CMakeLists.txt | 2 +- mission/tmtc/CcsdsIpCoreHandler.cpp | 52 +++++++++++++++++++++++++++++ mission/tmtc/CcsdsIpCoreHandler.h | 17 +++++++++- tmtc | 2 +- 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b9e21da6..24a6ab62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,7 +150,7 @@ set(OBSW_ADD_SCEX_DEVICE ${INIT_VAL} CACHE STRING "Add Solar Cell Experiment module") set(OBSW_SYRLINKS_SIMULATED - ${OBSW_Q7S_EM} + 0 CACHE STRING "Syrlinks is simulated") # ############################################################################## diff --git a/mission/tmtc/CcsdsIpCoreHandler.cpp b/mission/tmtc/CcsdsIpCoreHandler.cpp index 350c327f..ba876e84 100644 --- a/mission/tmtc/CcsdsIpCoreHandler.cpp +++ b/mission/tmtc/CcsdsIpCoreHandler.cpp @@ -21,6 +21,7 @@ CcsdsIpCoreHandler::CcsdsIpCoreHandler(object_id_t objectId, object_id_t ptmeId, tcDestination(tcDestination), parameterHelper(this), actionHelper(this, nullptr), + modeHelper(this), ptmeConfig(ptmeConfig), gpioIF(gpioIF), enTxClock(enTxClock), @@ -152,6 +153,10 @@ void CcsdsIpCoreHandler::readCommandQueue(void) { if (result == returnvalue::OK) { return; } + result = modeHelper.handleModeCommand(&commandMessage); + if (result == returnvalue::OK) { + return; + } CommandMessage reply; reply.setReplyRejected(CommandMessage::UNKNOWN_COMMAND, commandMessage.getCommand()); commandQueue->reply(&reply); @@ -218,10 +223,12 @@ ReturnValue_t CcsdsIpCoreHandler::executeAction(ActionId_t actionId, MessageQueu ReturnValue_t result = returnvalue::OK; switch (actionId) { case SET_LOW_RATE: { + submode = static_cast(Submode::DATARATE_LOW); result = ptmeConfig->setRate(RATE_100KBPS); break; } case SET_HIGH_RATE: { + submode = static_cast(Submode::DATARATE_HIGH); result = ptmeConfig->setRate(RATE_500KBPS); break; } @@ -233,10 +240,16 @@ ReturnValue_t CcsdsIpCoreHandler::executeAction(ActionId_t actionId, MessageQueu } case EN_TRANSMITTER: { enableTransmit(); + if (mode == HasModesIF::MODE_OFF) { + mode = HasModesIF::MODE_ON; + } return EXECUTION_FINISHED; } case DISABLE_TRANSMITTER: { disableTransmit(); + if (mode == HasModesIF::MODE_ON) { + mode = HasModesIF::MODE_OFF; + } return EXECUTION_FINISHED; } case ENABLE_TX_CLK_MANIPULATOR: { @@ -339,6 +352,45 @@ void CcsdsIpCoreHandler::checkTxTimer() { } } +void CcsdsIpCoreHandler::getMode(Mode_t* mode, Submode_t* submode) { + *mode = this->mode; + *submode = this->submode; +} + +ReturnValue_t CcsdsIpCoreHandler::checkModeCommand(Mode_t mode, Submode_t submode, + uint32_t* msToReachTheMode) { + if (mode == HasModesIF::MODE_ON) { + if (submode != static_cast(Submode::DATARATE_HIGH) and + submode != static_cast(Submode::DATARATE_LOW)) { + return HasModesIF::INVALID_SUBMODE; + } + } + *msToReachTheMode = 2000; + return returnvalue::FAILED; +} + +void CcsdsIpCoreHandler::startTransition(Mode_t mode, Submode_t submode) { + if (mode == HasModesIF::MODE_ON) { + enableTransmit(); + if (submode == static_cast(Submode::DATARATE_HIGH)) { + ReturnValue_t result = ptmeConfig->setRate(RATE_500KBPS); + if (result == returnvalue::OK) { + mode = HasModesIF::MODE_ON; + } + } else if (submode == static_cast(Submode::DATARATE_LOW)) { + ReturnValue_t result = ptmeConfig->setRate(RATE_500KBPS); + if (result == returnvalue::OK) { + mode = HasModesIF::MODE_ON; + } + } + } else if (mode == HasModesIF::MODE_OFF) { + disableTransmit(); + mode = HasModesIF::MODE_OFF; + } +} + +void CcsdsIpCoreHandler::announceMode(bool recursive) { triggerEvent(MODE_INFO, mode, submode); } + void CcsdsIpCoreHandler::disableTransmit() { #ifndef TE0720_1CFA gpioIF->pullLow(enTxClock); diff --git a/mission/tmtc/CcsdsIpCoreHandler.h b/mission/tmtc/CcsdsIpCoreHandler.h index 9161064b..25075b99 100644 --- a/mission/tmtc/CcsdsIpCoreHandler.h +++ b/mission/tmtc/CcsdsIpCoreHandler.h @@ -1,6 +1,8 @@ #ifndef CCSDSHANDLER_H_ #define CCSDSHANDLER_H_ +#include + #include #include @@ -21,6 +23,8 @@ #include "fsfw_hal/common/gpio/gpioDefinitions.h" #include "linux/ipcore/PtmeConfig.h" +enum class Submode : uint8_t { UNSET = 0, DATARATE_LOW = 1, DATARATE_HIGH = 2 }; + /** * @brief This class handles the data exchange with the CCSDS IP cores implemented in the * programmable logic of the Q7S. @@ -32,6 +36,7 @@ */ class CcsdsIpCoreHandler : public SystemObject, public ExecutableObjectIF, + public HasModesIF, public AcceptsTelemetryIF, public AcceptsTelecommandsIF, public ReceivesParameterMessagesIF, @@ -59,7 +64,14 @@ class CcsdsIpCoreHandler : public SystemObject, ReturnValue_t performOperation(uint8_t operationCode = 0) override; ReturnValue_t initialize(); - MessageQueueId_t getCommandQueue() const; + MessageQueueId_t getCommandQueue() const override; + + // ModesIF + void getMode(Mode_t* mode, Submode_t* submode) override; + ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, + uint32_t* msToReachTheMode) override; + void startTransition(Mode_t mode, Submode_t submode) override; + void announceMode(bool recursive) override; /** * @brief Function to add a virtual channel @@ -126,6 +138,9 @@ class CcsdsIpCoreHandler : public SystemObject, ParameterHelper parameterHelper; ActionHelper actionHelper; + Mode_t mode; + Submode_t submode = static_cast(Submode::UNSET); + ModeHelper modeHelper; MessageQueueId_t tcDistributorQueueId = MessageQueueIF::NO_QUEUE; diff --git a/tmtc b/tmtc index 49f27c99..49ccb4be 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 49f27c9923cfa13a3bafce46c37dd2631550f4af +Subproject commit 49ccb4be8d42d6916be00ff9d8462a1f65481a6c From ce12293dcc7a51682358bb3cfabfe6a7ce571afc Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 Jan 2023 19:47:30 +0100 Subject: [PATCH 2/4] update changelog --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7742cb5..f2cee3e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,20 @@ list yields a list of all related PRs for each release. # [unreleased] +## Fixed + +- The `OBSW_SYRLINKS_SIMULATED` flag is set to 0 for for both EM and FM. + +## Changed + - Startracker temperature set and PCDU switcher set are diagnostic now +## Added + +- The CCSDS handler can accept mode commands now. It accepts ON and OFF commands. Furthermore + it has a submode for low datarate (1) and high datarate (2) for the ON command. + PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/352 + # [v1.20.0] 2023-01-24 ## Added From eef84f4d09167583797ffa0d3e953db57e271f5b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 Jan 2023 14:03:49 +0100 Subject: [PATCH 3/4] fixes from PR --- mission/tmtc/CcsdsIpCoreHandler.cpp | 2 +- mission/tmtc/CcsdsIpCoreHandler.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mission/tmtc/CcsdsIpCoreHandler.cpp b/mission/tmtc/CcsdsIpCoreHandler.cpp index ba876e84..c46c64d3 100644 --- a/mission/tmtc/CcsdsIpCoreHandler.cpp +++ b/mission/tmtc/CcsdsIpCoreHandler.cpp @@ -378,7 +378,7 @@ void CcsdsIpCoreHandler::startTransition(Mode_t mode, Submode_t submode) { mode = HasModesIF::MODE_ON; } } else if (submode == static_cast(Submode::DATARATE_LOW)) { - ReturnValue_t result = ptmeConfig->setRate(RATE_500KBPS); + ReturnValue_t result = ptmeConfig->setRate(RATE_100KBPS); if (result == returnvalue::OK) { mode = HasModesIF::MODE_ON; } diff --git a/mission/tmtc/CcsdsIpCoreHandler.h b/mission/tmtc/CcsdsIpCoreHandler.h index 25075b99..25e15c79 100644 --- a/mission/tmtc/CcsdsIpCoreHandler.h +++ b/mission/tmtc/CcsdsIpCoreHandler.h @@ -138,7 +138,7 @@ class CcsdsIpCoreHandler : public SystemObject, ParameterHelper parameterHelper; ActionHelper actionHelper; - Mode_t mode; + Mode_t mode = HasModesIF::MODE_OFF; Submode_t submode = static_cast(Submode::UNSET); ModeHelper modeHelper; From 1128d355bb89d6fc9b5de6607d42860a2110974c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 26 Jan 2023 12:04:58 +0100 Subject: [PATCH 4/4] added some missing mode helper usage --- mission/tmtc/CcsdsIpCoreHandler.cpp | 10 +++++++++- tmtc | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mission/tmtc/CcsdsIpCoreHandler.cpp b/mission/tmtc/CcsdsIpCoreHandler.cpp index c46c64d3..9a2195eb 100644 --- a/mission/tmtc/CcsdsIpCoreHandler.cpp +++ b/mission/tmtc/CcsdsIpCoreHandler.cpp @@ -82,6 +82,11 @@ ReturnValue_t CcsdsIpCoreHandler::initialize() { return result; } + result = modeHelper.initialize(); + if (result != returnvalue::OK) { + return result; + } + VirtualChannelMapIter iter; for (iter = virtualChannelMap.begin(); iter != virtualChannelMap.end(); iter++) { result = iter->second->initialize(); @@ -364,9 +369,11 @@ ReturnValue_t CcsdsIpCoreHandler::checkModeCommand(Mode_t mode, Submode_t submod submode != static_cast(Submode::DATARATE_LOW)) { return HasModesIF::INVALID_SUBMODE; } + } else if (mode != HasModesIF::MODE_OFF) { + return returnvalue::FAILED; } *msToReachTheMode = 2000; - return returnvalue::FAILED; + return returnvalue::OK; } void CcsdsIpCoreHandler::startTransition(Mode_t mode, Submode_t submode) { @@ -387,6 +394,7 @@ void CcsdsIpCoreHandler::startTransition(Mode_t mode, Submode_t submode) { disableTransmit(); mode = HasModesIF::MODE_OFF; } + modeHelper.modeChanged(mode, submode); } void CcsdsIpCoreHandler::announceMode(bool recursive) { triggerEvent(MODE_INFO, mode, submode); } diff --git a/tmtc b/tmtc index 49ccb4be..c36c7ca5 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 49ccb4be8d42d6916be00ff9d8462a1f65481a6c +Subproject commit c36c7ca5bbe12b74f096414383eedfc16576a9d2