From f3b473ea9921cb2f6bce930e51f667c290165cd2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 13 May 2022 10:27:26 +0200 Subject: [PATCH] some more rtd tweaks --- mission/devices/Max31865PT1000Handler.cpp | 43 ++++++++++++++--------- mission/devices/Max31865PT1000Handler.h | 6 ++-- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/mission/devices/Max31865PT1000Handler.cpp b/mission/devices/Max31865PT1000Handler.cpp index 7ba24bd2..15cfa7f9 100644 --- a/mission/devices/Max31865PT1000Handler.cpp +++ b/mission/devices/Max31865PT1000Handler.cpp @@ -362,7 +362,7 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id, break; } case (MAX31865::REQUEST_HIGH_THRESHOLD): { - uint16_t readHighThreshold = packet[1] << 8 | packet[2]; + uint16_t readHighThreshold = (packet[1] << 8) | packet[2]; if (readHighThreshold != HIGH_THRESHOLD) { #if FSFW_VERBOSE_LEVEL >= 1 #if FSFW_CPP_OSTREAM_ENABLED == 1 @@ -381,11 +381,11 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id, } case (MAX31865::REQUEST_RTD): { // first bit of LSB reply byte is the fault bit - uint8_t faultBit = packet[2] & 0b0000'0001; + bool faultBit = packet[2] & 0b0000'0001; if (resetFaultBit) { internalState = InternalState::CLEAR_FAULT_BYTE; resetFaultBit = false; - } else if (faultBit == 1) { + } else if (shouldFaultStatusBeRequested(faultBit)) { // Maybe we should attempt to restart it? internalState = InternalState::REQUEST_FAULT_BYTE; resetFaultBit = true; @@ -440,16 +440,17 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id, break; } case (MAX31865::REQUEST_FAULT_BYTE): { - faultByte = packet[1]; - bool faultStatusChanged = (faultByte != lastFaultStatus); + currentFaultStatus = packet[1]; + bool faultStatusChanged = (currentFaultStatus != lastFaultStatus); // Spam protection - if (faultStatusChanged or ((faultByte == lastFaultStatus) and (sameFaultStatusCounter < 3))) { + if (faultStatusChanged or + ((currentFaultStatus == lastFaultStatus) and (sameFaultStatusCounter < 3))) { // TODO: Think about triggering an event here #if OBSW_VERBOSE_LEVEL >= 1 #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::warning << "Max31865PT1000Handler::interpretDeviceReply: Object ID: " << std::hex - << this->getObjectId() << ": Fault byte is: 0b" << std::bitset<8>(faultByte) - << std::endl; + << this->getObjectId() << ": Fault byte is: 0b" + << std::bitset<8>(currentFaultStatus) << std::endl; #else sif::printWarning( "Max31865PT1000Handler::interpretDeviceReply: Fault byte" @@ -463,7 +464,10 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id, sameFaultStatusCounter++; } } - lastFaultStatus = faultByte; + if (faultStatusChanged) { + lastFaultStatus = currentFaultStatus; + } + PoolReadGuard pg(&sensorDataset); auto result = pg.getReadResult(); if (result != HasReturnvaluesIF::RETURN_OK) { @@ -478,12 +482,12 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id, } if (faultStatusChanged) { sensorDataset.lastErrorByte.setValid(true); - sensorDataset.lastErrorByte = faultByte; + sensorDataset.lastErrorByte = lastFaultStatus; } sensorDataset.errorByte.setValid(true); - sensorDataset.errorByte = faultByte; + sensorDataset.errorByte = currentFaultStatus; - if (faultByte != 0) { + if (currentFaultStatus != 0) { sensorDataset.temperatureCelcius.setValid(false); } break; @@ -494,11 +498,8 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id, return HasReturnvaluesIF::RETURN_OK; } -void Max31865PT1000Handler::debugInterface(uint8_t positionTracker, object_id_t objectId, - uint32_t parameter) {} - uint32_t Max31865PT1000Handler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { - return 25000; + return 5000; } ReturnValue_t Max31865PT1000Handler::getSwitches(const uint8_t **switches, @@ -524,6 +525,9 @@ void Max31865PT1000Handler::setInstantNormal(bool instantNormal) { void Max31865PT1000Handler::modeChanged() { if (mode == MODE_OFF) { + lastFaultStatus = 0; + currentFaultStatus = 0; + sameFaultStatusCounter = 0; internalState = InternalState::NONE; } } @@ -534,3 +538,10 @@ void Max31865PT1000Handler::setDeviceInfo(uint8_t idx, std::string locString_) { } void Max31865PT1000Handler::setDebugMode(bool enable) { this->debugMode = enable; } + +bool Max31865PT1000Handler::shouldFaultStatusBeRequested(bool faultBit) { + if ((sameFaultStatusCounter < 3) and faultBit) { + return true; + } + return false; +} diff --git a/mission/devices/Max31865PT1000Handler.h b/mission/devices/Max31865PT1000Handler.h index eb7f3372..bdf22213 100644 --- a/mission/devices/Max31865PT1000Handler.h +++ b/mission/devices/Max31865PT1000Handler.h @@ -77,12 +77,10 @@ class Max31865PT1000Handler : public DeviceHandlerBase { ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) override; uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t getSwitches(const uint8_t **switches, uint8_t *numberOfSwitches) override; - - void debugInterface(uint8_t positionTracker = 0, object_id_t objectId = 0, - uint32_t parameter = 0) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) override; void modeChanged() override; + bool shouldFaultStatusBeRequested(bool faultBit); private: uint8_t switchId = 0; @@ -110,10 +108,10 @@ class Max31865PT1000Handler : public DeviceHandlerBase { bool resetFaultBit = false; dur_millis_t startTime = 0; uint8_t currentCfg = 0; + uint8_t currentFaultStatus = 0; uint8_t lastFaultStatus = 0; uint16_t sameFaultStatusCounter = 0; std::string locString; - uint8_t faultByte = 0; uint8_t deviceIdx = 0; std::array commandBuffer{0};