From 0419561ff81aa1f30d316e72eb19693db1342404 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 Jan 2023 15:35:43 +0100 Subject: [PATCH 1/2] some syrlinks tweakd and fixes --- mission/devices/SyrlinksHkHandler.cpp | 44 +++++++------------ mission/devices/SyrlinksHkHandler.h | 28 +++++++++++- .../devicedefinitions/SyrlinksDefinitions.h | 2 +- tmtc | 2 +- 4 files changed, 43 insertions(+), 33 deletions(-) diff --git a/mission/devices/SyrlinksHkHandler.cpp b/mission/devices/SyrlinksHkHandler.cpp index b07d665e..a004a479 100644 --- a/mission/devices/SyrlinksHkHandler.cpp +++ b/mission/devices/SyrlinksHkHandler.cpp @@ -33,7 +33,10 @@ void SyrlinksHkHandler::doStartUp() { } } -void SyrlinksHkHandler::doShutDown() { setMode(_MODE_POWER_DOWN); } +void SyrlinksHkHandler::doShutDown() { + setMode(_MODE_POWER_DOWN); + temperatureSet.setValidity(false, true); +} ReturnValue_t SyrlinksHkHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { switch (nextCommand) { @@ -363,6 +366,7 @@ ReturnValue_t SyrlinksHkHandler::interpretDeviceReply(DeviceCommandId_t id, cons tempBasebandBoard = calcTempVal(rawTempBasebandBoard); PoolReadGuard rg(&temperatureSet); temperatureSet.temperatureBasebandBoard = tempBasebandBoard; + temperatureSet.temperatureBasebandBoard.setValid(true); if (debugMode) { sif::info << "Syrlinks temperature baseband board: " << tempBasebandBoard << " °C" << std::endl; @@ -394,6 +398,7 @@ ReturnValue_t SyrlinksHkHandler::interpretDeviceReply(DeviceCommandId_t id, cons tempPowerAmplifier = calcTempVal(rawTempPowerAmplifier); PoolReadGuard rg(&temperatureSet); temperatureSet.temperaturePowerAmplifier = tempPowerAmplifier; + temperatureSet.temperaturePowerAmplifier.setValid(true); if (debugMode) { sif::info << "Syrlinks temperature power amplifier board: " << tempPowerAmplifier << " °C" << std::endl; @@ -443,29 +448,6 @@ uint16_t SyrlinksHkHandler::convertHexStringToUint16(const char* fourChars) { return value; } -uint32_t SyrlinksHkHandler::convertHexStringToUint32(const char* characters, - uint8_t numberOfChars) { - uint32_t value = 0; - - switch (numberOfChars) { - case 6: - value = convertHexStringToUint8(characters) << 16 | - convertHexStringToUint8(characters + 2) << 8 | - convertHexStringToUint8(characters + 4); - return value; - case 8: - value = convertHexStringToUint8(characters) << 24 | - convertHexStringToUint8(characters + 2) << 16 | - convertHexStringToUint8(characters + 4) << 8 | - convertHexStringToUint8(characters + 4); - return value; - default: - sif::debug << "SyrlinksHkHandler::convertHexStringToUint32: Invalid number of characters. " - << "Must be either 6 or 8" << std::endl; - return 0; - } -} - ReturnValue_t SyrlinksHkHandler::parseReplyStatus(const char* status) { switch (*status) { case '0': @@ -524,22 +506,23 @@ void SyrlinksHkHandler::parseRxStatusRegistersReply(const uint8_t* packet) { rxDataset.rxStatus = convertHexStringToUint8(reinterpret_cast(packet + offset)); offset += 2; rxDataset.rxSensitivity = - convertHexStringToUint32(reinterpret_cast(packet + offset), 6); + convertHexStringToRaw(reinterpret_cast(packet + offset), 6); offset += 6; rxDataset.rxFrequencyShift = - convertHexStringToUint32(reinterpret_cast(packet + offset), 6); + convertHexStringToRaw(reinterpret_cast(packet + offset), 6); offset += 6; rxDataset.rxIqPower = convertHexStringToUint16(reinterpret_cast(packet + offset)); offset += 4; rxDataset.rxAgcValue = convertHexStringToUint16(reinterpret_cast(packet + offset)); offset += 4; offset += 2; // reserved register - rxDataset.rxDemodEb = convertHexStringToUint32(reinterpret_cast(packet + offset), 6); + rxDataset.rxDemodEb = convertHexStringToRaw(reinterpret_cast(packet + offset), 6); offset += 6; - rxDataset.rxDemodN0 = convertHexStringToUint32(reinterpret_cast(packet + offset), 6); + rxDataset.rxDemodN0 = convertHexStringToRaw(reinterpret_cast(packet + offset), 6); offset += 6; rxDataset.rxDataRate = convertHexStringToUint8(reinterpret_cast(packet + offset)); + rxDataset.setValidity(true, true); if (debugMode) { #if OBSW_VERBOSE_LEVEL >= 1 sif::info << "Syrlinks RX Status: 0x" << std::hex << (unsigned int)rxDataset.rxStatus.value @@ -568,6 +551,7 @@ void SyrlinksHkHandler::parseTxStatusReply(const uint8_t* packet) { PoolReadGuard readHelper(&txDataset); uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE; txDataset.txStatus = convertHexStringToUint8(reinterpret_cast(packet + offset)); + txDataset.txStatus.setValid(true); if (debugMode) { sif::info << "Syrlinks TX Status: 0x" << std::hex << (unsigned int)txDataset.txStatus.value << std::endl; @@ -578,6 +562,7 @@ void SyrlinksHkHandler::parseTxWaveformReply(const uint8_t* packet) { PoolReadGuard readHelper(&txDataset); uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE; txDataset.txWaveform = convertHexStringToUint8(reinterpret_cast(packet + offset)); + txDataset.txWaveform.setValid(true); if (debugMode) { sif::info << "Syrlinks TX Waveform: 0x" << std::hex << (unsigned int)txDataset.txWaveform.value << std::endl; @@ -589,6 +574,7 @@ void SyrlinksHkHandler::parseAgcLowByte(const uint8_t* packet) { uint16_t offset = syrlinks::MESSAGE_HEADER_SIZE; txDataset.txAgcValue = agcValueHighByte << 8 | convertHexStringToUint8(reinterpret_cast(packet + offset)); + txDataset.txAgcValue.setValid(true); if (debugMode) { sif::info << "Syrlinks TX AGC Value: " << txDataset.txAgcValue << std::endl; } @@ -608,7 +594,7 @@ ReturnValue_t SyrlinksHkHandler::initializeLocalDataPool(localpool::DataPool& lo LocalDataPoolManager& poolManager) { localDataPoolMap.emplace(syrlinks::RX_STATUS, new PoolEntry({0})); localDataPoolMap.emplace(syrlinks::RX_SENSITIVITY, new PoolEntry({0})); - localDataPoolMap.emplace(syrlinks::RX_FREQUENCY_SHIFT, new PoolEntry({0})); + localDataPoolMap.emplace(syrlinks::RX_FREQUENCY_SHIFT, new PoolEntry({0})); localDataPoolMap.emplace(syrlinks::RX_IQ_POWER, new PoolEntry({0})); localDataPoolMap.emplace(syrlinks::RX_AGC_VALUE, new PoolEntry({0})); localDataPoolMap.emplace(syrlinks::RX_DEMOD_EB, new PoolEntry({0})); diff --git a/mission/devices/SyrlinksHkHandler.h b/mission/devices/SyrlinksHkHandler.h index a3bf0a67..225d5f43 100644 --- a/mission/devices/SyrlinksHkHandler.h +++ b/mission/devices/SyrlinksHkHandler.h @@ -154,8 +154,9 @@ class SyrlinksHkHandler : public DeviceHandlerBase { * * @return The uint32_t value. */ - uint32_t convertHexStringToUint32(const char* characters, uint8_t numberOfChars); - + // uint32_t convertHexStringToUint32(const char* characters, uint8_t numberOfChars); + template + T convertHexStringToRaw(const char* characters, uint8_t numberOfChars); /** * @brief This function parses the status reply * @param status Pointer to the status information. @@ -214,4 +215,27 @@ class SyrlinksHkHandler : public DeviceHandlerBase { void prepareCommand(std::string command, DeviceCommandId_t commandId); }; +template +T SyrlinksHkHandler::convertHexStringToRaw(const char* characters, + uint8_t numberOfChars) { + T value = 0; + + switch (numberOfChars) { + case 6: + value = ((convertHexStringToUint8(characters) << 24) | + (convertHexStringToUint8(characters + 2) << 16) | + (convertHexStringToUint8(characters + 4) << 8)) >> 8; + return value; + case 8: + value = convertHexStringToUint8(characters) << 24 | + convertHexStringToUint8(characters + 2) << 16 | + convertHexStringToUint8(characters + 4) << 8 | + convertHexStringToUint8(characters + 4); + return value; + default: + sif::debug << "SyrlinksHkHandler::convertHexStringToUint32: Invalid number of characters. " + << "Must be either 6 or 8" << std::endl; + return 0; + } +} #endif /* MISSION_DEVICES_SYRLINKSHKHANDLER_H_ */ diff --git a/mission/devices/devicedefinitions/SyrlinksDefinitions.h b/mission/devices/devicedefinitions/SyrlinksDefinitions.h index 96ea1157..14d5b621 100644 --- a/mission/devices/devicedefinitions/SyrlinksDefinitions.h +++ b/mission/devices/devicedefinitions/SyrlinksDefinitions.h @@ -86,7 +86,7 @@ class RxDataset : public StaticLocalDataSet { lp_var_t rxStatus = lp_var_t(sid.objectId, RX_STATUS, this); lp_var_t rxSensitivity = lp_var_t(sid.objectId, RX_SENSITIVITY, this); - lp_var_t rxFrequencyShift = lp_var_t(sid.objectId, RX_FREQUENCY_SHIFT, this); + lp_var_t rxFrequencyShift = lp_var_t(sid.objectId, RX_FREQUENCY_SHIFT, this); lp_var_t rxIqPower = lp_var_t(sid.objectId, RX_IQ_POWER, this); lp_var_t rxAgcValue = lp_var_t(sid.objectId, RX_AGC_VALUE, this); lp_var_t rxDemodEb = lp_var_t(sid.objectId, RX_DEMOD_EB, this); diff --git a/tmtc b/tmtc index 033c8927..d2320146 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 033c8927c0d817e3e562d1d199d217f4bdf45ce7 +Subproject commit d23201466c279c410fd421b1584c46a439827ad5 From c1b9a0f4ffad4312a179e1210136a1c31f108489 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 Jan 2023 16:18:06 +0100 Subject: [PATCH 2/2] some improvements, docs and smaller stuff --- CHANGELOG.md | 4 ++++ mission/devices/SyrlinksHkHandler.cpp | 14 ++++++++------ mission/devices/SyrlinksHkHandler.h | 22 ++++++++++++++-------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a407d96..9dc21472 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ list yields a list of all related PRs for each release. PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/340. - Basic TCS Subsystem component. PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/319 + ## Changed - Moved some PDEC/PTME configuration to `common/config/eive/definitions.h` @@ -42,6 +43,9 @@ list yields a list of all related PRs for each release. previous range setting was wrong. Also fixed a small error properly set internal state on shut-down. PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/342 +- Syrlinks Handler: Read RX frequency shift as 24 bit signed number now. Also include + validity handling for datasets. + PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/350 # [v1.19.0] 2023-01-10 diff --git a/mission/devices/SyrlinksHkHandler.cpp b/mission/devices/SyrlinksHkHandler.cpp index a004a479..52cf862d 100644 --- a/mission/devices/SyrlinksHkHandler.cpp +++ b/mission/devices/SyrlinksHkHandler.cpp @@ -34,8 +34,8 @@ void SyrlinksHkHandler::doStartUp() { } void SyrlinksHkHandler::doShutDown() { - setMode(_MODE_POWER_DOWN); - temperatureSet.setValidity(false, true); + setMode(_MODE_POWER_DOWN); + temperatureSet.setValidity(false, true); } ReturnValue_t SyrlinksHkHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { @@ -506,19 +506,21 @@ void SyrlinksHkHandler::parseRxStatusRegistersReply(const uint8_t* packet) { rxDataset.rxStatus = convertHexStringToUint8(reinterpret_cast(packet + offset)); offset += 2; rxDataset.rxSensitivity = - convertHexStringToRaw(reinterpret_cast(packet + offset), 6); + convertHexStringTo32bit(reinterpret_cast(packet + offset), 6); offset += 6; rxDataset.rxFrequencyShift = - convertHexStringToRaw(reinterpret_cast(packet + offset), 6); + convertHexStringTo32bit(reinterpret_cast(packet + offset), 6); offset += 6; rxDataset.rxIqPower = convertHexStringToUint16(reinterpret_cast(packet + offset)); offset += 4; rxDataset.rxAgcValue = convertHexStringToUint16(reinterpret_cast(packet + offset)); offset += 4; offset += 2; // reserved register - rxDataset.rxDemodEb = convertHexStringToRaw(reinterpret_cast(packet + offset), 6); + rxDataset.rxDemodEb = + convertHexStringTo32bit(reinterpret_cast(packet + offset), 6); offset += 6; - rxDataset.rxDemodN0 = convertHexStringToRaw(reinterpret_cast(packet + offset), 6); + rxDataset.rxDemodN0 = + convertHexStringTo32bit(reinterpret_cast(packet + offset), 6); offset += 6; rxDataset.rxDataRate = convertHexStringToUint8(reinterpret_cast(packet + offset)); diff --git a/mission/devices/SyrlinksHkHandler.h b/mission/devices/SyrlinksHkHandler.h index 225d5f43..f19610f0 100644 --- a/mission/devices/SyrlinksHkHandler.h +++ b/mission/devices/SyrlinksHkHandler.h @@ -147,16 +147,16 @@ class SyrlinksHkHandler : public DeviceHandlerBase { uint16_t convertHexStringToUint16(const char* fourChars); /** - * @brief Function converts a hex number represented by 6 or 8 characters to an uint32_t. + * @brief Function converts a hex number represented by 6 or 8 characters to an uint32_t or + * int32_t, depending on the template parameter. * * @param characters Pointer to the hex characters array. * @param numberOfChars Number of characters representing the hex value. Must be 6 or 8. * - * @return The uint32_t value. + * @return The value. */ - // uint32_t convertHexStringToUint32(const char* characters, uint8_t numberOfChars); template - T convertHexStringToRaw(const char* characters, uint8_t numberOfChars); + T convertHexStringTo32bit(const char* characters, uint8_t numberOfChars); /** * @brief This function parses the status reply * @param status Pointer to the status information. @@ -216,15 +216,21 @@ class SyrlinksHkHandler : public DeviceHandlerBase { }; template -T SyrlinksHkHandler::convertHexStringToRaw(const char* characters, - uint8_t numberOfChars) { +T SyrlinksHkHandler::convertHexStringTo32bit(const char* characters, uint8_t numberOfChars) { + if (sizeof(T) < 4) { + sif::error << "SyrlinksHkHandler::convertHexStringToRaw: Only works for 32-bit conversion" + << std::endl; + } T value = 0; switch (numberOfChars) { case 6: + // The bitshift trickery required is necessary when creating an int32_t from a + // 24 bit signed value. value = ((convertHexStringToUint8(characters) << 24) | - (convertHexStringToUint8(characters + 2) << 16) | - (convertHexStringToUint8(characters + 4) << 8)) >> 8; + (convertHexStringToUint8(characters + 2) << 16) | + (convertHexStringToUint8(characters + 4) << 8)) >> + 8; return value; case 8: value = convertHexStringToUint8(characters) << 24 |