diff --git a/linux/ipcore/AxiPtmeConfig.cpp b/linux/ipcore/AxiPtmeConfig.cpp index ead3d691..043fd775 100644 --- a/linux/ipcore/AxiPtmeConfig.cpp +++ b/linux/ipcore/AxiPtmeConfig.cpp @@ -71,6 +71,22 @@ ReturnValue_t AxiPtmeConfig::disableTxclockInversion() { return returnvalue::OK; } +ReturnValue_t AxiPtmeConfig::enableBatPriorityBit() { + ReturnValue_t result = writeBit(COMMON_CONFIG_REG, true, BitPos::EN_BAT_PRIORITY); + if (result != returnvalue::OK) { + return result; + } + return returnvalue::OK; +} + +ReturnValue_t AxiPtmeConfig::disableBatPriorityBit() { + ReturnValue_t result = writeBit(COMMON_CONFIG_REG, false, BitPos::EN_BAT_PRIORITY); + if (result != returnvalue::OK) { + return result; + } + return returnvalue::OK; +} + ReturnValue_t AxiPtmeConfig::writeReg(uint32_t regOffset, uint32_t writeVal) { ReturnValue_t result = returnvalue::OK; result = mutex->lockMutex(timeoutType, mutexTimeout); diff --git a/linux/ipcore/AxiPtmeConfig.h b/linux/ipcore/AxiPtmeConfig.h index 6996988c..420e9a5a 100644 --- a/linux/ipcore/AxiPtmeConfig.h +++ b/linux/ipcore/AxiPtmeConfig.h @@ -54,6 +54,9 @@ class AxiPtmeConfig : public SystemObject { ReturnValue_t enableTxclockInversion(); ReturnValue_t disableTxclockInversion(); + ReturnValue_t enableBatPriorityBit(); + ReturnValue_t disableBatPriorityBit(); + private: // Address of register storing the bitrate configuration parameter static const uint32_t CADU_BITRATE_REG = 0x0; @@ -61,7 +64,7 @@ class AxiPtmeConfig : public SystemObject { static const uint32_t COMMON_CONFIG_REG = 0x4; static const uint32_t ADRESS_DIVIDER = 4; - enum class BitPos : uint32_t { EN_TX_CLK_MANIPULATOR, INVERT_CLOCK }; + enum class BitPos : uint32_t { EN_TX_CLK_MANIPULATOR = 0, INVERT_CLOCK = 1, EN_BAT_PRIORITY = 2 }; std::string axiUio; std::string uioMap; diff --git a/linux/ipcore/PtmeConfig.cpp b/linux/ipcore/PtmeConfig.cpp index 589e5e5f..08f5b979 100644 --- a/linux/ipcore/PtmeConfig.cpp +++ b/linux/ipcore/PtmeConfig.cpp @@ -48,3 +48,11 @@ ReturnValue_t PtmeConfig::configTxManipulator(bool enable) { } return result; } + +ReturnValue_t PtmeConfig::enableBatPriorityBit(bool enable) { + if (enable) { + return axiPtmeConfig->enableBatPriorityBit(); + } else { + return axiPtmeConfig->disableBatPriorityBit(); + } +} diff --git a/linux/ipcore/PtmeConfig.h b/linux/ipcore/PtmeConfig.h index f57f6fb5..446dc95a 100644 --- a/linux/ipcore/PtmeConfig.h +++ b/linux/ipcore/PtmeConfig.h @@ -53,6 +53,8 @@ class PtmeConfig : public SystemObject { */ ReturnValue_t configTxManipulator(bool enable); + ReturnValue_t enableBatPriorityBit(bool enable); + private: static const uint8_t INTERFACE_ID = CLASS_ID::RATE_SETTER; diff --git a/mission/tmtc/CcsdsIpCoreHandler.cpp b/mission/tmtc/CcsdsIpCoreHandler.cpp index 838af4c0..6a3aa329 100644 --- a/mission/tmtc/CcsdsIpCoreHandler.cpp +++ b/mission/tmtc/CcsdsIpCoreHandler.cpp @@ -211,14 +211,11 @@ ReturnValue_t CcsdsIpCoreHandler::checkModeCommand(Mode_t mode, Submode_t submod } void CcsdsIpCoreHandler::startTransition(Mode_t mode, Submode_t submode) { - auto rateHigh = [&]() { - ReturnValue_t result = ptmeConfig.setRate(RATE_500KBPS); - if (result == returnvalue::OK) { - this->mode = HasModesIF::MODE_ON; + auto rateSet = [&](uint32_t rate) { + if (setBatPriorityBitOnTxEnable) { + ptmeConfig.enableBatPriorityBit(true); } - }; - auto rateLow = [&]() { - ReturnValue_t result = ptmeConfig.setRate(RATE_100KBPS); + ReturnValue_t result = ptmeConfig.setRate(rate); if (result == returnvalue::OK) { this->mode = HasModesIF::MODE_ON; } @@ -228,14 +225,14 @@ void CcsdsIpCoreHandler::startTransition(Mode_t mode, Submode_t submode) { if (submode == static_cast(com::CcsdsSubmode::DATARATE_DEFAULT)) { com::Datarate currentDatarate = com::getCurrentDatarate(); if (currentDatarate == com::Datarate::LOW_RATE_MODULATION_BPSK) { - rateLow(); + rateSet(RATE_100KBPS); } else if (currentDatarate == com::Datarate::HIGH_RATE_MODULATION_0QPSK) { - rateHigh(); + rateSet(RATE_500KBPS); } } else if (submode == static_cast(com::CcsdsSubmode::DATARATE_HIGH)) { - rateHigh(); + rateSet(RATE_500KBPS); } else if (submode == static_cast(com::CcsdsSubmode::DATARATE_LOW)) { - rateLow(); + rateSet(RATE_100KBPS); } } else if (mode == HasModesIF::MODE_OFF) { @@ -250,6 +247,7 @@ void CcsdsIpCoreHandler::startTransition(Mode_t mode, Submode_t submode) { void CcsdsIpCoreHandler::announceMode(bool recursive) { triggerEvent(MODE_INFO, mode, submode); } void CcsdsIpCoreHandler::disableTransmit() { + ptmeConfig.enableBatPriorityBit(false); #ifndef TE0720_1CFA gpioIF->pullLow(enTxClock); gpioIF->pullLow(enTxData); diff --git a/mission/tmtc/CcsdsIpCoreHandler.h b/mission/tmtc/CcsdsIpCoreHandler.h index a147a13f..ac6cbb1b 100644 --- a/mission/tmtc/CcsdsIpCoreHandler.h +++ b/mission/tmtc/CcsdsIpCoreHandler.h @@ -138,6 +138,7 @@ class CcsdsIpCoreHandler : public SystemObject, MessageQueueId_t tcDistributorQueueId = MessageQueueIF::NO_QUEUE; PtmeConfig& ptmeConfig; + bool setBatPriorityBitOnTxEnable = true; GpioIF* gpioIF = nullptr; // GPIO to enable RS485 transceiver for TX clock diff --git a/tmtc b/tmtc index 4f48c25b..350e5d77 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 4f48c25bf757b6c056072049fe5965da890b4f5b +Subproject commit 350e5d77b8113cc9e21eb72242fc37536368f541