From 5a82fe93d9524004e339d6d35f26c2d68d75d390 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 11 May 2022 17:02:57 +0200 Subject: [PATCH 01/24] core ctrl remount sd handling --- bsp_q7s/core/CoreController.cpp | 36 ++++++++++++++++---- bsp_q7s/core/CoreController.h | 3 +- bsp_q7s/memory/SdCardManager.cpp | 56 ++++++++++++++++++++++++++++++++ bsp_q7s/memory/SdCardManager.h | 6 ++++ fsfw | 2 +- 5 files changed, 95 insertions(+), 8 deletions(-) diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 208999c2..00175067 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -1235,18 +1235,42 @@ void CoreController::performWatchdogControlOperation() { void CoreController::performMountedSdCardOperations() { currMntPrefix = sdcMan->getCurrentMountPrefix(); - if (doPerformMountedSdCardOps) { + if (performMountedSdCardOpsSwitch) { bool sdCardMounted = false; + bool mountedReadOnly = false; + ReturnValue_t result = sdcMan->isSdCardMountedReadOnly(sdInfo.pref, mountedReadOnly); + if (result != HasReturnvaluesIF::RETURN_OK) { + sif::error << "CoreController::performMountedSdCardOperations: Could not check " + "read-only mount state" << std::endl; + mountedReadOnly = true; + } + if (mountedReadOnly) { + int linuxErrno = 0; + result = sdcMan->performFsck(sdInfo.pref, true, linuxErrno); + if(result != HasReturnvaluesIF::RETURN_OK) { + sif::error << "CoreController::performMountedSdCardOperations: fsck command on SD Card " + << sdInfo.prefChar << " failed with code " << linuxErrno << " | " << strerror(linuxErrno); + } + result = sdcMan->remountReadWrite(sdInfo.pref); + if(result == HasReturnvaluesIF::RETURN_OK) { + sif::warning << "CoreController::performMountedSdCardOperations: Remounted SD Card " << + sdInfo.prefChar << " read-write"; + } else { + sif::error << "CoreController::performMountedSdCardOperations: Remounting SD Card " << + sdInfo.prefChar << " read-write failed"; + } + } sdCardMounted = sdcMan->isSdCardMounted(sdInfo.pref); - if (sdCardMounted) { - std::string path = currMntPrefix + "/" + CONF_FOLDER; - if (not std::filesystem::exists(path)) { - std::filesystem::create_directory(path); + if (sdCardMounted and not performOneShotSdCardOpsSwitch) { + std::ostringstream path; + path << currMntPrefix << "/" << CONF_FOLDER; + if (not std::filesystem::exists(path.str())) { + std::filesystem::create_directory(path.str()); } initVersionFile(); initClockFromTimeFile(); performRebootFileHandling(false); - doPerformMountedSdCardOps = false; + performOneShotSdCardOpsSwitch = true; } } timeFileHandler(); diff --git a/bsp_q7s/core/CoreController.h b/bsp_q7s/core/CoreController.h index fb4f02b0..dd817bff 100644 --- a/bsp_q7s/core/CoreController.h +++ b/bsp_q7s/core/CoreController.h @@ -179,7 +179,8 @@ class CoreController : public ExtendedControllerBase { } sdInfo; RebootFile rebootFile = {}; std::string currMntPrefix; - bool doPerformMountedSdCardOps = true; + bool performOneShotSdCardOpsSwitch = true; + bool performMountedSdCardOpsSwitch = true; /** * Index 0: Chip 0 Copy 0 diff --git a/bsp_q7s/memory/SdCardManager.cpp b/bsp_q7s/memory/SdCardManager.cpp index 4ca11787..d5a91dac 100644 --- a/bsp_q7s/memory/SdCardManager.cpp +++ b/bsp_q7s/memory/SdCardManager.cpp @@ -466,3 +466,59 @@ bool SdCardManager::isSdCardMounted(sd::SdCard sdCard) { } return false; } + +ReturnValue_t SdCardManager::isSdCardMountedReadOnly(sd::SdCard sdcard, bool& readOnly) { + std::ostringstream command; + if(sdcard == sd::SdCard::SLOT_0) { + command << "grep -q \"" << SD_0_DEV_NAME << " vfat ro, \" /proc/mounts"; + } else { + command << "grep -q \"" << SD_1_DEV_NAME << " vfat ro, \" /proc/mounts"; + } + ReturnValue_t result = cmdExecutor.load(command.str(), true, false); + if (result != HasReturnvaluesIF::RETURN_OK) { + return result; + } + result = cmdExecutor.execute(); + if (result != HasReturnvaluesIF::RETURN_OK) { + return result; + } + auto& readVec = cmdExecutor.getReadVector(); + size_t readLen = strnlen(readVec.data(), readVec.size()); + if(readLen == 0) { + readOnly = false; + } + readOnly = true; + return HasReturnvaluesIF::RETURN_OK; +} + +ReturnValue_t SdCardManager::remountReadWrite(sd::SdCard sdcard) { + std::ostringstream command; + if(sdcard == sd::SdCard::SLOT_0) { + command << "mount -o remount,rw " << SD_0_DEV_NAME << " " << SD_0_MOUNT_POINT; + } else { + command << "mount -o remount,rw " << SD_1_DEV_NAME << " " << SD_1_MOUNT_POINT; + } + ReturnValue_t result = cmdExecutor.load(command.str(), true, false); + if (result != HasReturnvaluesIF::RETURN_OK) { + return result; + } + return cmdExecutor.execute(); +} + +ReturnValue_t SdCardManager::performFsck(sd::SdCard sdcard, bool printOutput, int& linuxError) { + std::ostringstream command; + if(sdcard == sd::SdCard::SLOT_0) { + command << "fsck -y " << SD_0_DEV_NAME; + } else { + command << "fsck -y " << SD_1_DEV_NAME; + } + ReturnValue_t result = cmdExecutor.load(command.str(), true, printOutput); + if (result != HasReturnvaluesIF::RETURN_OK) { + return result; + } + result = cmdExecutor.execute(); + if(result != HasReturnvaluesIF::RETURN_OK) { + linuxError = cmdExecutor.getLastError(); + } + return result; +} diff --git a/bsp_q7s/memory/SdCardManager.h b/bsp_q7s/memory/SdCardManager.h index 37660f75..01a50050 100644 --- a/bsp_q7s/memory/SdCardManager.h +++ b/bsp_q7s/memory/SdCardManager.h @@ -194,6 +194,12 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { */ bool isSdCardMounted(sd::SdCard sdCard) override; + ReturnValue_t isSdCardMountedReadOnly(sd::SdCard sdcard, bool& readOnly); + + ReturnValue_t remountReadWrite(sd::SdCard sdcard); + + ReturnValue_t performFsck(sd::SdCard sdcard, bool printOutput, int& linuxError); + private: CommandExecutor cmdExecutor; Operations currentOp = Operations::IDLE; diff --git a/fsfw b/fsfw index dafcaa60..d1ff32bf 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit dafcaa60079ba8e57753d389e6a569ee3eb0b7cb +Subproject commit d1ff32bf968cbf769ca8daa37265af70e050d9c0 From 3bdad61ac0797e5488928c0e4961dab410060d02 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 10:42:57 +0200 Subject: [PATCH 02/24] split ACU HK set --- mission/devices/ACUHandler.cpp | 310 ++++++------------ mission/devices/ACUHandler.h | 5 +- .../devicedefinitions/GomspaceDefinitions.h | 229 ++++--------- tmtc | 2 +- 4 files changed, 159 insertions(+), 387 deletions(-) diff --git a/mission/devices/ACUHandler.cpp b/mission/devices/ACUHandler.cpp index f881479d..bbb22f86 100644 --- a/mission/devices/ACUHandler.cpp +++ b/mission/devices/ACUHandler.cpp @@ -6,7 +6,7 @@ ACUHandler::ACUHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCoo FailureIsolationBase *customFdir) : GomspaceDeviceHandler(objectId, comIF, comCookie, customFdir, ACU::MAX_CONFIGTABLE_ADDRESS, ACU::MAX_HKTABLE_ADDRESS, ACU::HK_TABLE_REPLY_SIZE), - acuHkTableDataset(this) {} + coreHk(this), auxHk(this) {} ACUHandler::~ACUHandler() {} @@ -22,236 +22,141 @@ void ACUHandler::fillCommandAndReplyMap() { void ACUHandler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *packet) { parseHkTableReply(packet); - handleDeviceTM(&acuHkTableDataset, id, true); - if (debugMode) { #if OBSW_VERBOSE_LEVEL >= 1 - acuHkTableDataset.read(); - float temperatureC_1 = acuHkTableDataset.temperature1.value * 0.1; - float temperatureC_2 = acuHkTableDataset.temperature2.value * 0.1; - float temperatureC_3 = acuHkTableDataset.temperature3.value * 0.1; - sif::info << "ACU: Temperature 1: " << temperatureC_1 << " °C" << std::endl; - sif::info << "ACU: Temperature 2: " << temperatureC_2 << " °C" << std::endl; - sif::info << "ACU: Temperature 3: " << temperatureC_3 << " °C" << std::endl; - sif::info << "ACU: Ground Watchdog Timer Count: " << acuHkTableDataset.wdtCntGnd.value + PoolReadGuard pg0(&auxHk); + PoolReadGuard pg1(&coreHk); + if(pg0.getReadResult() != RETURN_OK or pg1.getReadResult() != RETURN_OK) { + return; + } + for(size_t idx = 0; idx < 3; idx++) { + float tempC = coreHk.temperatures[idx] * 0.1; + sif::info << "ACU: Temperature " << idx << ": " << tempC << " °C" << std::endl; + } + sif::info << "ACU: Ground Watchdog Timer Count: " << auxHk.wdtCntGnd.value << std::endl; sif::info << "ACU: Ground watchdog timer, seconds left before reboot: " - << acuHkTableDataset.wdtGndLeft.value << std::endl; - acuHkTableDataset.commit(); + << auxHk.wdtGndLeft.value << std::endl; #endif } } LocalPoolDataSetBase *ACUHandler::getDataSetHandle(sid_t sid) { - if (sid == acuHkTableDataset.getSid()) { - return &acuHkTableDataset; + if (sid == coreHk.getSid()) { + return &coreHk; + } else if(sid == auxHk.getSid()) { + return &auxHk; } return nullptr; } -void ACUHandler::parseHkTableReply(const uint8_t *packet) { +ReturnValue_t ACUHandler::parseHkTableReply(const uint8_t *packet) { uint16_t dataOffset = 0; - acuHkTableDataset.read(); + PoolReadGuard pg0(&coreHk); + PoolReadGuard pg1(&auxHk); + auto res0 = pg0.getReadResult(); + auto res1 = pg1.getReadResult(); + if(res0 != RETURN_OK) { + return res0; + } + if(res1 != RETURN_OK) { + return res1; + } dataOffset += 12; - acuHkTableDataset.currentInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); + for(size_t idx = 0; idx < 6; idx++) { + coreHk.currentInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } + for(size_t idx = 0; idx < 6; idx++) { + coreHk.voltageInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } + + + coreHk.vcc = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; - acuHkTableDataset.currentInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.currentInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.currentInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.currentInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.currentInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); + coreHk.vbat = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; - acuHkTableDataset.voltageInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.voltageInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.voltageInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.voltageInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.voltageInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.voltageInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; + for(size_t idx = 0; idx < 3; idx++) { + coreHk.temperatures[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } - acuHkTableDataset.vcc = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vbat = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - - acuHkTableDataset.temperature1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.temperature2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.temperature3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - - acuHkTableDataset.mpptMode = *(packet + dataOffset); + coreHk.mpptMode = packet[dataOffset]; dataOffset += 3; - acuHkTableDataset.vboostInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vboostInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vboostInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vboostInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vboostInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vboostInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; + for(size_t idx = 0; idx < 6; idx++) { + coreHk.vboostInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } + for(size_t idx = 0; idx < 6; idx++) { + coreHk.powerInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } + for(size_t idx = 0; idx < 3; idx++) { + auxHk.dacEnables[idx] = packet[dataOffset]; + dataOffset += 3; + } + for(size_t idx = 0; idx < 6; idx++) { + auxHk.dacRawChannelVal0[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } - acuHkTableDataset.powerInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.powerInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.powerInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.powerInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.powerInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.powerInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - - acuHkTableDataset.dac0Enable = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.dac1Enable = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.dac2Enable = *(packet + dataOffset); - dataOffset += 3; - - acuHkTableDataset.dacRawChannelVal0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.dacRawChannelVal1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.dacRawChannelVal2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.dacRawChannelVal3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.dacRawChannelVal4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.dacRawChannelVal5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - - acuHkTableDataset.bootCause = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | + auxHk.bootCause = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; - acuHkTableDataset.bootcnt = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | + coreHk.bootcnt = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; - acuHkTableDataset.uptime = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | + coreHk.uptime = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; - acuHkTableDataset.resetCause = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); + auxHk.resetCause = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; - acuHkTableDataset.mpptTime = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); + coreHk.mpptTime = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); /* +12 because here starts the second csp packet */ dataOffset += 2 + 12; - acuHkTableDataset.mpptPeriod = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); + coreHk.mpptPeriod = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; - acuHkTableDataset.device0 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device1 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device2 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device3 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device4 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device5 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device6 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device7 = *(packet + dataOffset); - dataOffset += 3; + for(size_t idx = 0; idx < 8; idx++) { + auxHk.deviceTypes[idx] = packet[dataOffset]; + dataOffset += 3; + } + for(size_t idx = 0; idx < 8; idx++) { + auxHk.devicesStatus[idx] = packet[dataOffset]; + dataOffset += 3; + } - acuHkTableDataset.device0Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device1Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device2Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device3Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device4Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device5Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device6Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device7Status = *(packet + dataOffset); - dataOffset += 3; - - acuHkTableDataset.wdtCntGnd = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | + auxHk.wdtCntGnd = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; - acuHkTableDataset.wdtGndLeft = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | + auxHk.wdtGndLeft = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; - - acuHkTableDataset.commit(); + return RETURN_OK; } ReturnValue_t ACUHandler::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { using namespace P60System; - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL5, new PoolEntry({0})); - - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL5, new PoolEntry({0})); + localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNELS, new PoolEntry(6)); + localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNELS, new PoolEntry(6)); localDataPoolMap.emplace(pool::ACU_VCC, new PoolEntry({0})); localDataPoolMap.emplace(pool::ACU_VBAT, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_TEMPERATURE_1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_TEMPERATURE_2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_TEMPERATURE_3, new PoolEntry({0})); + localDataPoolMap.emplace(pool::ACU_TEMPERATURES, new PoolEntry(3)); localDataPoolMap.emplace(pool::ACU_MPPT_MODE, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL5, new PoolEntry({0})); + localDataPoolMap.emplace(pool::ACU_VBOOST_IN_CHANNELS, new PoolEntry(6)); + localDataPoolMap.emplace(pool::ACU_POWER_IN_CHANNELS, new PoolEntry(6)); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL5, new PoolEntry({0})); - - localDataPoolMap.emplace(pool::ACU_DAC_EN_0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_EN_1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_EN_2, new PoolEntry({0})); - - localDataPoolMap.emplace(pool::ACU_DAC_RAW_0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_RAW_1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_RAW_2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_RAW_3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_RAW_4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_RAW_5, new PoolEntry({0})); + localDataPoolMap.emplace(pool::ACU_DAC_ENABLES, new PoolEntry(3)); + localDataPoolMap.emplace(pool::ACU_DAC_RAW_CHANNELS, new PoolEntry(6)); localDataPoolMap.emplace(pool::ACU_BOOTCAUSE, new PoolEntry({0})); localDataPoolMap.emplace(pool::ACU_BOOTCNT, new PoolEntry({0})); @@ -260,28 +165,14 @@ ReturnValue_t ACUHandler::initializeLocalDataPool(localpool::DataPool &localData localDataPoolMap.emplace(pool::ACU_MPPT_TIME, new PoolEntry({0})); localDataPoolMap.emplace(pool::ACU_MPPT_PERIOD, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_5, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_6, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_7, new PoolEntry({0})); - - localDataPoolMap.emplace(pool::ACU_DEVICE_0_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_1_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_2_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_3_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_4_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_5_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_6_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_7_STATUS, new PoolEntry({0})); + localDataPoolMap.emplace(pool::ACU_DEVICES, new PoolEntry(8)); + localDataPoolMap.emplace(pool::ACU_DEVICES_STATUS, new PoolEntry(8)); localDataPoolMap.emplace(pool::ACU_WDT_CNT_GND, new PoolEntry({0})); localDataPoolMap.emplace(pool::ACU_WDT_GND_LEFT, new PoolEntry({0})); - poolManager.subscribeForPeriodicPacket(acuHkTableDataset.getSid(), false, 30.0, false); + poolManager.subscribeForPeriodicPacket(coreHk.getSid(), false, 10.0, true); + poolManager.subscribeForPeriodicPacket(auxHk.getSid(), false, 30.0, false); return HasReturnvaluesIF::RETURN_OK; } @@ -299,26 +190,13 @@ ReturnValue_t ACUHandler::childCommandHook(DeviceCommandId_t cmd, const uint8_t } void ACUHandler::printChannelStats() { - PoolReadGuard pg(&acuHkTableDataset); + PoolReadGuard pg(&coreHk); sif::info << "ACU Info: Current [mA], Voltage [mV]" << std::endl; - sif::info << std::setw(8) << std::left << "Ch0" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel0.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel0.value << std::endl; - sif::info << std::setw(8) << std::left << "Ch1" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel1.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel1.value << std::endl; - sif::info << std::setw(8) << std::left << "Ch2" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel2.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel2.value << std::endl; - sif::info << std::setw(8) << std::left << "Ch3" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel3.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel3.value << std::endl; - sif::info << std::setw(8) << std::left << "Ch4" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel4.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel4.value << std::endl; - sif::info << std::setw(8) << std::left << "Ch5" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel5.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel5.value << std::endl; + for(size_t idx = 0; idx < 6; idx++) { + sif::info << std::setw(8) << std::left << "Channel " << idx << std::dec << "| " + << static_cast(coreHk.currentInChannels[idx]) << std::setw(15) + << std::right << coreHk.voltageInChannels[idx] << std::endl; + } } void ACUHandler::setDebugMode(bool enable) { this->debugMode = enable; } diff --git a/mission/devices/ACUHandler.h b/mission/devices/ACUHandler.h index 16a7c6db..ca0ccd2d 100644 --- a/mission/devices/ACUHandler.h +++ b/mission/devices/ACUHandler.h @@ -39,14 +39,15 @@ class ACUHandler : public GomspaceDeviceHandler { private: static const DeviceCommandId_t PRINT_CHANNEL_STATS = 51; - ACU::HkTableDataset acuHkTableDataset; + ACU::CoreHk coreHk; + ACU::AuxHk auxHk; bool debugMode = false; /** * @brief Function extracts the hk table information from the received csp packet and stores * the values in the acuHkTableDataset. */ - void parseHkTableReply(const uint8_t* packet); + ReturnValue_t parseHkTableReply(const uint8_t* packet); /** * @brief Prints channel statistics (current and voltage) to console diff --git a/mission/devices/devicedefinitions/GomspaceDefinitions.h b/mission/devices/devicedefinitions/GomspaceDefinitions.h index 5c59d3d8..5314a280 100644 --- a/mission/devices/devicedefinitions/GomspaceDefinitions.h +++ b/mission/devices/devicedefinitions/GomspaceDefinitions.h @@ -55,7 +55,8 @@ enum class SetIds : uint32_t { PDU_2_AUX = 4, P60_CORE = 5, P60_AUX = 6, - ACU = 7 + ACU_CORE = 7, + ACU_AUX = 8 }; namespace pool { @@ -129,67 +130,24 @@ enum Ids : lp_id_t { PDU_WDT_CSP_LEFT2, /** ACU Ids */ - ACU_CURRENT_IN_CHANNEL0, - ACU_CURRENT_IN_CHANNEL1, - ACU_CURRENT_IN_CHANNEL2, - ACU_CURRENT_IN_CHANNEL3, - ACU_CURRENT_IN_CHANNEL4, - ACU_CURRENT_IN_CHANNEL5, - ACU_VOLTAGE_IN_CHANNEL0, - ACU_VOLTAGE_IN_CHANNEL1, - ACU_VOLTAGE_IN_CHANNEL2, - ACU_VOLTAGE_IN_CHANNEL3, - ACU_VOLTAGE_IN_CHANNEL4, - ACU_VOLTAGE_IN_CHANNEL5, + ACU_CURRENT_IN_CHANNELS, + ACU_VOLTAGE_IN_CHANNELS, ACU_VCC, ACU_VBAT, - ACU_TEMPERATURE_1, - ACU_TEMPERATURE_2, - ACU_TEMPERATURE_3, + ACU_TEMPERATURES, ACU_MPPT_MODE, - ACU_VBOOST_CHANNEL0, - ACU_VBOOST_CHANNEL1, - ACU_VBOOST_CHANNEL2, - ACU_VBOOST_CHANNEL3, - ACU_VBOOST_CHANNEL4, - ACU_VBOOST_CHANNEL5, - ACU_POWER_CHANNEL0, - ACU_POWER_CHANNEL1, - ACU_POWER_CHANNEL2, - ACU_POWER_CHANNEL3, - ACU_POWER_CHANNEL4, - ACU_POWER_CHANNEL5, - ACU_DAC_EN_0, - ACU_DAC_EN_1, - ACU_DAC_EN_2, - ACU_DAC_RAW_0, - ACU_DAC_RAW_1, - ACU_DAC_RAW_2, - ACU_DAC_RAW_3, - ACU_DAC_RAW_4, - ACU_DAC_RAW_5, + ACU_VBOOST_IN_CHANNELS, + ACU_POWER_IN_CHANNELS, + ACU_DAC_ENABLES, + ACU_DAC_RAW_CHANNELS, ACU_BOOTCAUSE, ACU_BOOTCNT, ACU_UPTIME, ACU_RESET_CAUSE, ACU_MPPT_TIME, ACU_MPPT_PERIOD, - ACU_DEVICE_0, - ACU_DEVICE_1, - ACU_DEVICE_2, - ACU_DEVICE_3, - ACU_DEVICE_4, - ACU_DEVICE_5, - ACU_DEVICE_6, - ACU_DEVICE_7, - ACU_DEVICE_0_STATUS, - ACU_DEVICE_1_STATUS, - ACU_DEVICE_2_STATUS, - ACU_DEVICE_3_STATUS, - ACU_DEVICE_4_STATUS, - ACU_DEVICE_5_STATUS, - ACU_DEVICE_6_STATUS, - ACU_DEVICE_7_STATUS, + ACU_DEVICES, + ACU_DEVICES_STATUS, ACU_WDT_CNT_GND, ACU_WDT_GND_LEFT, }; @@ -592,138 +550,73 @@ static const uint16_t MAX_HKTABLE_ADDRESS = 120; static const uint8_t HK_TABLE_ENTRIES = 64; static const uint16_t HK_TABLE_REPLY_SIZE = 262; -/** - * @brief This class defines a dataset for the hk table of the ACU. - */ -class HkTableDataset : public StaticLocalDataSet { - public: - HkTableDataset(HasLocalDataPoolIF* owner) - : StaticLocalDataSet(owner, static_cast(::P60System::SetIds::ACU)) {} +class CoreHk: public StaticLocalDataSet<14> { +public: + CoreHk(HasLocalDataPoolIF* owner) + : StaticLocalDataSet(owner, static_cast(::P60System::SetIds::ACU_CORE)) {} - HkTableDataset(object_id_t objectId) - : StaticLocalDataSet(sid_t(objectId, static_cast(::P60System::SetIds::ACU))) {} - - lp_var_t currentInChannel0 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL0, this); - lp_var_t currentInChannel1 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL1, this); - lp_var_t currentInChannel2 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL2, this); - lp_var_t currentInChannel3 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL3, this); - lp_var_t currentInChannel4 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL4, this); - lp_var_t currentInChannel5 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL5, this); - - lp_var_t voltageInChannel0 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL0, this); - lp_var_t voltageInChannel1 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL1, this); - lp_var_t voltageInChannel2 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL2, this); - lp_var_t voltageInChannel3 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL3, this); - lp_var_t voltageInChannel4 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL4, this); - lp_var_t voltageInChannel5 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL5, this); - - lp_var_t vcc = lp_var_t(sid.objectId, P60System::pool::ACU_VCC, this); - lp_var_t vbat = lp_var_t(sid.objectId, P60System::pool::ACU_VBAT, this); - - lp_var_t temperature1 = - lp_var_t(sid.objectId, P60System::pool::ACU_TEMPERATURE_1, this); - lp_var_t temperature2 = - lp_var_t(sid.objectId, P60System::pool::ACU_TEMPERATURE_2, this); - lp_var_t temperature3 = - lp_var_t(sid.objectId, P60System::pool::ACU_TEMPERATURE_3, this); + CoreHk(object_id_t objectId) + : StaticLocalDataSet(sid_t(objectId, static_cast(::P60System::SetIds::ACU_CORE))) {} lp_var_t mpptMode = lp_var_t(sid.objectId, P60System::pool::ACU_MPPT_MODE, this); - lp_var_t vboostInChannel0 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL0, this); - lp_var_t vboostInChannel1 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL1, this); - lp_var_t vboostInChannel2 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL2, this); - lp_var_t vboostInChannel3 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL3, this); - lp_var_t vboostInChannel4 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL4, this); - lp_var_t vboostInChannel5 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL5, this); + lp_vec_t currentInChannels = + lp_vec_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNELS, this); + lp_vec_t voltageInChannels = + lp_vec_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNELS, this); - lp_var_t powerInChannel0 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL0, this); - lp_var_t powerInChannel1 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL1, this); - lp_var_t powerInChannel2 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL2, this); - lp_var_t powerInChannel3 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL3, this); - lp_var_t powerInChannel4 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL4, this); - lp_var_t powerInChannel5 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL5, this); + lp_var_t vcc = lp_var_t(sid.objectId, P60System::pool::ACU_VCC, this); + lp_var_t vbat = lp_var_t(sid.objectId, P60System::pool::ACU_VBAT, this); - lp_var_t dac0Enable = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_EN_0, this); - lp_var_t dac1Enable = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_EN_1, this); - lp_var_t dac2Enable = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_EN_2, this); + lp_vec_t vboostInChannels = + lp_vec_t(sid.objectId, P60System::pool::ACU_VBOOST_IN_CHANNELS, this); + lp_vec_t powerInChannels = + lp_vec_t(sid.objectId, P60System::pool::ACU_POWER_IN_CHANNELS, this); - lp_var_t dacRawChannelVal0 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_0, this); - lp_var_t dacRawChannelVal1 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_1, this); - lp_var_t dacRawChannelVal2 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_2, this); - lp_var_t dacRawChannelVal3 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_3, this); - lp_var_t dacRawChannelVal4 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_4, this); - lp_var_t dacRawChannelVal5 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_5, this); + lp_vec_t temperatures = + lp_vec_t(sid.objectId, P60System::pool::ACU_TEMPERATURES, this); - lp_var_t bootCause = - lp_var_t(sid.objectId, P60System::pool::ACU_BOOTCAUSE, this); lp_var_t bootcnt = lp_var_t(sid.objectId, P60System::pool::ACU_BOOTCNT, this); lp_var_t uptime = lp_var_t(sid.objectId, P60System::pool::ACU_UPTIME, this); - lp_var_t resetCause = - lp_var_t(sid.objectId, P60System::pool::ACU_RESET_CAUSE, this); lp_var_t mpptTime = lp_var_t(sid.objectId, P60System::pool::ACU_MPPT_TIME, this); lp_var_t mpptPeriod = lp_var_t(sid.objectId, P60System::pool::ACU_MPPT_PERIOD, this); - lp_var_t device0 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_0, this); - lp_var_t device1 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_1, this); - lp_var_t device2 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_2, this); - lp_var_t device3 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_3, this); - lp_var_t device4 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_4, this); - lp_var_t device5 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_5, this); - lp_var_t device6 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_6, this); - lp_var_t device7 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_7, this); +}; +/** + * @brief This class defines a dataset for the hk table of the ACU. + */ +class AuxHk : public StaticLocalDataSet<12> { + public: + AuxHk(HasLocalDataPoolIF* owner) + : StaticLocalDataSet(owner, static_cast(::P60System::SetIds::ACU_AUX)) {} - lp_var_t device0Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_0_STATUS, this); - lp_var_t device1Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_1_STATUS, this); - lp_var_t device2Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_2_STATUS, this); - lp_var_t device3Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_3_STATUS, this); - lp_var_t device4Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_4_STATUS, this); - lp_var_t device5Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_5_STATUS, this); - lp_var_t device6Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_6_STATUS, this); - lp_var_t device7Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_7_STATUS, this); + AuxHk(object_id_t objectId) + : StaticLocalDataSet(sid_t(objectId, static_cast(::P60System::SetIds::ACU_AUX))) {} + + + lp_vec_t dacEnables = + lp_vec_t(sid.objectId, P60System::pool::ACU_DAC_ENABLES, this); + + lp_vec_t dacRawChannelVal0 = + lp_vec_t(sid.objectId, P60System::pool::ACU_DAC_RAW_CHANNELS, this); + + lp_var_t bootCause = + lp_var_t(sid.objectId, P60System::pool::ACU_BOOTCAUSE, this); + lp_var_t resetCause = + lp_var_t(sid.objectId, P60System::pool::ACU_RESET_CAUSE, this); + + /** + * There are 8 devices on the PDU. FRAM, ADCs, temperature sensor etc. Each device is + * identified by an ID. Refer also to gs-man-nanopower-p60-pdu-200-1.pdf on pages 17 and 18. + */ + lp_vec_t deviceTypes = + lp_vec_t(sid.objectId, P60System::pool::ACU_DEVICES, this); + /** The status of each device. 0 = None, 1 = Ok, 2 = Error, 3 = Not found */ + lp_vec_t devicesStatus = + lp_vec_t(sid.objectId, P60System::pool::ACU_DEVICES_STATUS, this); lp_var_t wdtCntGnd = lp_var_t(sid.objectId, P60System::pool::ACU_WDT_CNT_GND, this); diff --git a/tmtc b/tmtc index 480e0f07..ff66dd5d 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 480e0f07e03edeb55a3d6e3d629e7601b6bf90a2 +Subproject commit ff66dd5dd2bc2ee3150ce45160303bc79ed2599d From 99e27a5a635b0a47adf5fff9c581be7bb6a77b0c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 11:25:58 +0200 Subject: [PATCH 03/24] run afmt --- bsp_q7s/em/emObjectFactory.cpp | 1 + bsp_q7s/obsw.cpp | 2 +- mission/devices/ACUHandler.cpp | 87 ++++++++++--------- mission/devices/ACUHandler.h | 7 +- mission/devices/P60DockHandler.cpp | 2 +- mission/devices/PDU1Handler.cpp | 2 +- mission/devices/PDU2Handler.cpp | 2 +- .../devicedefinitions/GomspaceDefinitions.h | 9 +- tmtc | 2 +- 9 files changed, 58 insertions(+), 56 deletions(-) diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp index d4500e0b..327e7b87 100644 --- a/bsp_q7s/em/emObjectFactory.cpp +++ b/bsp_q7s/em/emObjectFactory.cpp @@ -1,4 +1,5 @@ #include + #include "OBSWConfig.h" #include "bsp_q7s/core/CoreController.h" #include "bsp_q7s/core/ObjectFactory.h" diff --git a/bsp_q7s/obsw.cpp b/bsp_q7s/obsw.cpp index 1da60783..530c4904 100644 --- a/bsp_q7s/obsw.cpp +++ b/bsp_q7s/obsw.cpp @@ -4,11 +4,11 @@ #include #include "OBSWConfig.h" -#include "q7sConfig.h" #include "commonConfig.h" #include "core/InitMission.h" #include "fsfw/tasks/TaskFactory.h" #include "fsfw/version.h" +#include "q7sConfig.h" #include "watchdog/definitions.h" static int OBSW_ALREADY_RUNNING = -2; diff --git a/mission/devices/ACUHandler.cpp b/mission/devices/ACUHandler.cpp index bbb22f86..77386610 100644 --- a/mission/devices/ACUHandler.cpp +++ b/mission/devices/ACUHandler.cpp @@ -6,7 +6,8 @@ ACUHandler::ACUHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCoo FailureIsolationBase *customFdir) : GomspaceDeviceHandler(objectId, comIF, comCookie, customFdir, ACU::MAX_CONFIGTABLE_ADDRESS, ACU::MAX_HKTABLE_ADDRESS, ACU::HK_TABLE_REPLY_SIZE), - coreHk(this), auxHk(this) {} + coreHk(this), + auxHk(this) {} ACUHandler::~ACUHandler() {} @@ -15,10 +16,7 @@ ReturnValue_t ACUHandler::buildNormalDeviceCommand(DeviceCommandId_t *id) { return buildCommandFromCommand(*id, NULL, 0); } -void ACUHandler::fillCommandAndReplyMap() { - GomspaceDeviceHandler::fillCommandAndReplyMap(); - this->insertInCommandMap(PRINT_CHANNEL_STATS); -} +void ACUHandler::fillCommandAndReplyMap() { GomspaceDeviceHandler::fillCommandAndReplyMap(); } void ACUHandler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *packet) { parseHkTableReply(packet); @@ -26,15 +24,14 @@ void ACUHandler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *pack #if OBSW_VERBOSE_LEVEL >= 1 PoolReadGuard pg0(&auxHk); PoolReadGuard pg1(&coreHk); - if(pg0.getReadResult() != RETURN_OK or pg1.getReadResult() != RETURN_OK) { + if (pg0.getReadResult() != RETURN_OK or pg1.getReadResult() != RETURN_OK) { return; } - for(size_t idx = 0; idx < 3; idx++) { + for (size_t idx = 0; idx < 3; idx++) { float tempC = coreHk.temperatures[idx] * 0.1; sif::info << "ACU: Temperature " << idx << ": " << tempC << " °C" << std::endl; } - sif::info << "ACU: Ground Watchdog Timer Count: " << auxHk.wdtCntGnd.value - << std::endl; + sif::info << "ACU: Ground Watchdog Timer Count: " << auxHk.wdtCntGnd.value << std::endl; sif::info << "ACU: Ground watchdog timer, seconds left before reboot: " << auxHk.wdtGndLeft.value << std::endl; #endif @@ -44,7 +41,7 @@ void ACUHandler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *pack LocalPoolDataSetBase *ACUHandler::getDataSetHandle(sid_t sid) { if (sid == coreHk.getSid()) { return &coreHk; - } else if(sid == auxHk.getSid()) { + } else if (sid == auxHk.getSid()) { return &auxHk; } return nullptr; @@ -56,29 +53,28 @@ ReturnValue_t ACUHandler::parseHkTableReply(const uint8_t *packet) { PoolReadGuard pg1(&auxHk); auto res0 = pg0.getReadResult(); auto res1 = pg1.getReadResult(); - if(res0 != RETURN_OK) { + if (res0 != RETURN_OK) { return res0; } - if(res1 != RETURN_OK) { + if (res1 != RETURN_OK) { return res1; } dataOffset += 12; - for(size_t idx = 0; idx < 6; idx++) { + for (size_t idx = 0; idx < 6; idx++) { coreHk.currentInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; dataOffset += 4; } - for(size_t idx = 0; idx < 6; idx++) { + for (size_t idx = 0; idx < 6; idx++) { coreHk.voltageInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; dataOffset += 4; } - coreHk.vcc = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; coreHk.vbat = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; - for(size_t idx = 0; idx < 3; idx++) { + for (size_t idx = 0; idx < 3; idx++) { coreHk.temperatures[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; dataOffset += 4; } @@ -86,31 +82,31 @@ ReturnValue_t ACUHandler::parseHkTableReply(const uint8_t *packet) { coreHk.mpptMode = packet[dataOffset]; dataOffset += 3; - for(size_t idx = 0; idx < 6; idx++) { + for (size_t idx = 0; idx < 6; idx++) { coreHk.vboostInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; dataOffset += 4; } - for(size_t idx = 0; idx < 6; idx++) { + for (size_t idx = 0; idx < 6; idx++) { coreHk.powerInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; dataOffset += 4; } - for(size_t idx = 0; idx < 3; idx++) { + for (size_t idx = 0; idx < 3; idx++) { auxHk.dacEnables[idx] = packet[dataOffset]; dataOffset += 3; } - for(size_t idx = 0; idx < 6; idx++) { + for (size_t idx = 0; idx < 6; idx++) { auxHk.dacRawChannelVal0[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; dataOffset += 4; } auxHk.bootCause = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | - *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); + *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; coreHk.bootcnt = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | - *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); + *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; coreHk.uptime = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | - *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); + *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; auxHk.resetCause = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; @@ -121,20 +117,20 @@ ReturnValue_t ACUHandler::parseHkTableReply(const uint8_t *packet) { coreHk.mpptPeriod = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; - for(size_t idx = 0; idx < 8; idx++) { + for (size_t idx = 0; idx < 8; idx++) { auxHk.deviceTypes[idx] = packet[dataOffset]; dataOffset += 3; } - for(size_t idx = 0; idx < 8; idx++) { + for (size_t idx = 0; idx < 8; idx++) { auxHk.devicesStatus[idx] = packet[dataOffset]; dataOffset += 3; } auxHk.wdtCntGnd = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | - *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); + *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; auxHk.wdtGndLeft = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | - *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); + *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; return RETURN_OK; } @@ -176,23 +172,10 @@ ReturnValue_t ACUHandler::initializeLocalDataPool(localpool::DataPool &localData return HasReturnvaluesIF::RETURN_OK; } -ReturnValue_t ACUHandler::childCommandHook(DeviceCommandId_t cmd, const uint8_t *commandData, - size_t commandDataLen) { - switch (cmd) { - case PRINT_CHANNEL_STATS: { - printChannelStats(); - return RETURN_OK; - } - default: { - return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; - } - } -} - void ACUHandler::printChannelStats() { PoolReadGuard pg(&coreHk); sif::info << "ACU Info: Current [mA], Voltage [mV]" << std::endl; - for(size_t idx = 0; idx < 6; idx++) { + for (size_t idx = 0; idx < 6; idx++) { sif::info << std::setw(8) << std::left << "Channel " << idx << std::dec << "| " << static_cast(coreHk.currentInChannels[idx]) << std::setw(15) << std::right << coreHk.voltageInChannels[idx] << std::endl; @@ -200,3 +183,25 @@ void ACUHandler::printChannelStats() { } void ACUHandler::setDebugMode(bool enable) { this->debugMode = enable; } + +ReturnValue_t ACUHandler::printStatus(DeviceCommandId_t cmd) { + ReturnValue_t result = RETURN_OK; + switch (cmd) { + case (GOMSPACE::PRINT_SWITCH_V_I): { + PoolReadGuard pg(&coreHk); + result = pg.getReadResult(); + if (result != HasReturnvaluesIF::RETURN_OK) { + break; + } + printChannelStats(); + break; + } + default: { + return DeviceHandlerIF::COMMAND_NOT_SUPPORTED; + } + } + if (result != HasReturnvaluesIF::RETURN_OK) { + sif::warning << "Reading PDU1 HK table failed!" << std::endl; + } + return result; +} diff --git a/mission/devices/ACUHandler.h b/mission/devices/ACUHandler.h index ca0ccd2d..3154e547 100644 --- a/mission/devices/ACUHandler.h +++ b/mission/devices/ACUHandler.h @@ -29,16 +29,13 @@ class ACUHandler : public GomspaceDeviceHandler { */ virtual ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override; - virtual void fillCommandAndReplyMap() override; + ReturnValue_t printStatus(DeviceCommandId_t cmd) override; - virtual ReturnValue_t childCommandHook(DeviceCommandId_t cmd, const uint8_t* commandData, - size_t commandDataLen) override; + virtual void fillCommandAndReplyMap() override; LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override; private: - static const DeviceCommandId_t PRINT_CHANNEL_STATS = 51; - ACU::CoreHk coreHk; ACU::AuxHk auxHk; bool debugMode = false; diff --git a/mission/devices/P60DockHandler.cpp b/mission/devices/P60DockHandler.cpp index f1df649d..25fb238f 100644 --- a/mission/devices/P60DockHandler.cpp +++ b/mission/devices/P60DockHandler.cpp @@ -251,7 +251,7 @@ ReturnValue_t P60DockHandler::printStatus(DeviceCommandId_t cmd) { return HasReturnvaluesIF::RETURN_OK; } default: { - return HasReturnvaluesIF::RETURN_FAILED; + return DeviceHandlerIF::COMMAND_NOT_SUPPORTED; } } sif::warning << "Reading P60 Dock HK table failed" << std::endl; diff --git a/mission/devices/PDU1Handler.cpp b/mission/devices/PDU1Handler.cpp index 44f8fb04..fca0fbeb 100644 --- a/mission/devices/PDU1Handler.cpp +++ b/mission/devices/PDU1Handler.cpp @@ -122,7 +122,7 @@ ReturnValue_t PDU1Handler::printStatus(DeviceCommandId_t cmd) { break; } default: { - return HasReturnvaluesIF::RETURN_FAILED; + return DeviceHandlerIF::COMMAND_NOT_SUPPORTED; } } if (result != HasReturnvaluesIF::RETURN_OK) { diff --git a/mission/devices/PDU2Handler.cpp b/mission/devices/PDU2Handler.cpp index 1476f95d..d0cef3f5 100644 --- a/mission/devices/PDU2Handler.cpp +++ b/mission/devices/PDU2Handler.cpp @@ -76,7 +76,7 @@ ReturnValue_t PDU2Handler::printStatus(DeviceCommandId_t cmd) { break; } default: { - return HasReturnvaluesIF::RETURN_FAILED; + return DeviceHandlerIF::COMMAND_NOT_SUPPORTED; } } if (result != HasReturnvaluesIF::RETURN_OK) { diff --git a/mission/devices/devicedefinitions/GomspaceDefinitions.h b/mission/devices/devicedefinitions/GomspaceDefinitions.h index 5314a280..0c7cc2d7 100644 --- a/mission/devices/devicedefinitions/GomspaceDefinitions.h +++ b/mission/devices/devicedefinitions/GomspaceDefinitions.h @@ -38,7 +38,8 @@ static const DeviceCommandId_t PARAM_GET = 0; //!< [EXPORT] : [COMMAND] static const DeviceCommandId_t PARAM_SET = 255; //!< [EXPORT] : [COMMAND] static const DeviceCommandId_t REQUEST_HK_TABLE = 16; //!< [EXPORT] : [COMMAND] -//!< [EXPORT] : [COMMAND] Print switch states, voltages and currents to the console +//! [EXPORT] : [COMMAND] Print switch states, voltages and currents to the console +//! For the ACU device, only print voltages and currents of the 6 ACU channels static const DeviceCommandId_t PRINT_SWITCH_V_I = 32; static const DeviceCommandId_t PRINT_LATCHUPS = 33; @@ -550,8 +551,8 @@ static const uint16_t MAX_HKTABLE_ADDRESS = 120; static const uint8_t HK_TABLE_ENTRIES = 64; static const uint16_t HK_TABLE_REPLY_SIZE = 262; -class CoreHk: public StaticLocalDataSet<14> { -public: +class CoreHk : public StaticLocalDataSet<14> { + public: CoreHk(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, static_cast(::P60System::SetIds::ACU_CORE)) {} @@ -583,7 +584,6 @@ public: lp_var_t(sid.objectId, P60System::pool::ACU_MPPT_TIME, this); lp_var_t mpptPeriod = lp_var_t(sid.objectId, P60System::pool::ACU_MPPT_PERIOD, this); - }; /** * @brief This class defines a dataset for the hk table of the ACU. @@ -596,7 +596,6 @@ class AuxHk : public StaticLocalDataSet<12> { AuxHk(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, static_cast(::P60System::SetIds::ACU_AUX))) {} - lp_vec_t dacEnables = lp_vec_t(sid.objectId, P60System::pool::ACU_DAC_ENABLES, this); diff --git a/tmtc b/tmtc index ff66dd5d..c01f1d01 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit ff66dd5dd2bc2ee3150ce45160303bc79ed2599d +Subproject commit c01f1d01916160888cf745ee3db6a2c46d795408 From 4e62f3b11218ec3575d15ce6216498ec17725fc3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 11:35:55 +0200 Subject: [PATCH 04/24] bugfixes for cp script --- scripts/q7s-cp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/q7s-cp.py b/scripts/q7s-cp.py index a189e3e6..d0543b45 100755 --- a/scripts/q7s-cp.py +++ b/scripts/q7s-cp.py @@ -27,7 +27,7 @@ def prompt_ssh_key_removal(): print("Invalid port detected") else: break - cmd = f'ssh-keygen -f "${{HOME}}/.ssh/known_hosts" -R "[localhost]:${port}"' + cmd = f'ssh-keygen -f "$HOME/.ssh/known_hosts" -R "[localhost]:{port}"' print(f"Removing problematic SSH key with command {cmd}..") os.system(cmd) From 8ae6fe0be5fa7f14526b16be922760738a9e4615 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 12:39:10 +0200 Subject: [PATCH 05/24] moved HK defs --- .../devices/devicedefinitions/GomspaceDefinitions.h | 10 +++++----- tmtc | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mission/devices/devicedefinitions/GomspaceDefinitions.h b/mission/devices/devicedefinitions/GomspaceDefinitions.h index 0c7cc2d7..4faf5299 100644 --- a/mission/devices/devicedefinitions/GomspaceDefinitions.h +++ b/mission/devices/devicedefinitions/GomspaceDefinitions.h @@ -607,6 +607,11 @@ class AuxHk : public StaticLocalDataSet<12> { lp_var_t resetCause = lp_var_t(sid.objectId, P60System::pool::ACU_RESET_CAUSE, this); + lp_var_t wdtCntGnd = + lp_var_t(sid.objectId, P60System::pool::ACU_WDT_CNT_GND, this); + lp_var_t wdtGndLeft = + lp_var_t(sid.objectId, P60System::pool::ACU_WDT_GND_LEFT, this); + /** * There are 8 devices on the PDU. FRAM, ADCs, temperature sensor etc. Each device is * identified by an ID. Refer also to gs-man-nanopower-p60-pdu-200-1.pdf on pages 17 and 18. @@ -616,11 +621,6 @@ class AuxHk : public StaticLocalDataSet<12> { /** The status of each device. 0 = None, 1 = Ok, 2 = Error, 3 = Not found */ lp_vec_t devicesStatus = lp_vec_t(sid.objectId, P60System::pool::ACU_DEVICES_STATUS, this); - - lp_var_t wdtCntGnd = - lp_var_t(sid.objectId, P60System::pool::ACU_WDT_CNT_GND, this); - lp_var_t wdtGndLeft = - lp_var_t(sid.objectId, P60System::pool::ACU_WDT_GND_LEFT, this); }; } // namespace ACU diff --git a/tmtc b/tmtc index c01f1d01..580b3818 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit c01f1d01916160888cf745ee3db6a2c46d795408 +Subproject commit 580b3818489a87f9ea1b31754c7b0285c2bb6a10 From e522aadd44dc865257418fb36da6134a0dd79ca2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 14:04:46 +0200 Subject: [PATCH 06/24] set HKs valid --- mission/devices/ACUHandler.cpp | 2 ++ tmtc | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mission/devices/ACUHandler.cpp b/mission/devices/ACUHandler.cpp index 77386610..15b2c2a0 100644 --- a/mission/devices/ACUHandler.cpp +++ b/mission/devices/ACUHandler.cpp @@ -132,6 +132,8 @@ ReturnValue_t ACUHandler::parseHkTableReply(const uint8_t *packet) { auxHk.wdtGndLeft = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; + coreHk.setValidity(true, true); + auxHk.setValidity(true, true); return RETURN_OK; } diff --git a/tmtc b/tmtc index 580b3818..b9de13ff 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 580b3818489a87f9ea1b31754c7b0285c2bb6a10 +Subproject commit b9de13ffe7a4f8112e2e7732049816833f89d17d From 660f0d2dcd6195b5d1428e35fe8cf9c5412e337d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 14:19:57 +0200 Subject: [PATCH 07/24] some minor fixes --- mission/devices/ACUHandler.cpp | 2 +- mission/devices/devicedefinitions/GomspaceDefinitions.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mission/devices/ACUHandler.cpp b/mission/devices/ACUHandler.cpp index 15b2c2a0..a3b5eeee 100644 --- a/mission/devices/ACUHandler.cpp +++ b/mission/devices/ACUHandler.cpp @@ -95,7 +95,7 @@ ReturnValue_t ACUHandler::parseHkTableReply(const uint8_t *packet) { dataOffset += 3; } for (size_t idx = 0; idx < 6; idx++) { - auxHk.dacRawChannelVal0[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + auxHk.dacRawChannelVals[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; dataOffset += 4; } diff --git a/mission/devices/devicedefinitions/GomspaceDefinitions.h b/mission/devices/devicedefinitions/GomspaceDefinitions.h index 4faf5299..18059fc8 100644 --- a/mission/devices/devicedefinitions/GomspaceDefinitions.h +++ b/mission/devices/devicedefinitions/GomspaceDefinitions.h @@ -599,7 +599,7 @@ class AuxHk : public StaticLocalDataSet<12> { lp_vec_t dacEnables = lp_vec_t(sid.objectId, P60System::pool::ACU_DAC_ENABLES, this); - lp_vec_t dacRawChannelVal0 = + lp_vec_t dacRawChannelVals = lp_vec_t(sid.objectId, P60System::pool::ACU_DAC_RAW_CHANNELS, this); lp_var_t bootCause = From 62ef9c7e70a7b0662818573332e1f47299abe837 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:25:39 +0200 Subject: [PATCH 08/24] set datapool entries of rad sensor valid --- mission/devices/RadiationSensorHandler.cpp | 2 +- tmtc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mission/devices/RadiationSensorHandler.cpp b/mission/devices/RadiationSensorHandler.cpp index b3a9954a..19f72d68 100644 --- a/mission/devices/RadiationSensorHandler.cpp +++ b/mission/devices/RadiationSensorHandler.cpp @@ -169,7 +169,7 @@ ReturnValue_t RadiationSensorHandler::interpretDeviceReply(DeviceCommandId_t id, dataset.ain6 = (*(packet + offset) << 8 | *(packet + offset + 1)); offset += 2; dataset.ain7 = (*(packet + offset) << 8 | *(packet + offset + 1)); - + dataset.setValidity(true, true); if (printPeriodicData) { sif::info << "Radiation sensor temperature: " << dataset.temperatureCelcius << " °C" << std::dec << std::endl; diff --git a/tmtc b/tmtc index fe36485e..4de3e7d1 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit fe36485e854c4433ee98efe15616b9baa528316f +Subproject commit 4de3e7d107ae16c7c89eae340419ec92097fb92f From a2fad6061a89efd6f4c2593b191a00cba5c25935 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:36:38 +0200 Subject: [PATCH 09/24] repoint tmtc --- tmtc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtc b/tmtc index 4de3e7d1..e7cb7ca0 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 4de3e7d107ae16c7c89eae340419ec92097fb92f +Subproject commit e7cb7ca0963663a9674591c2945c5f24647cb00c From 2f155d835098f36bd63f47509f79b2021e7bf708 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:39:13 +0200 Subject: [PATCH 10/24] bump changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2128a01d..6d963b7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,11 @@ list yields a list of all related PRs for each release. username appended at the end is created as a side-product now PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/248 +## Fixed + +- `q7s-cp.py` bugfix + PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/256 + ### Heater - Adds `HealthIF` to heaters. Heaters are own system object with queues now which allows to set them faulty. From 5df905182c0577404ebc0c6f4a06b0b242b63b34 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:40:17 +0200 Subject: [PATCH 11/24] these brackets are less confusing --- mission/devices/RadiationSensorHandler.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mission/devices/RadiationSensorHandler.cpp b/mission/devices/RadiationSensorHandler.cpp index 19f72d68..f2694476 100644 --- a/mission/devices/RadiationSensorHandler.cpp +++ b/mission/devices/RadiationSensorHandler.cpp @@ -158,17 +158,17 @@ ReturnValue_t RadiationSensorHandler::interpretDeviceReply(DeviceCommandId_t id, int16_t tempRaw = ((packet[offset] & 0x0f) << 8) | packet[offset + 1]; dataset.temperatureCelcius = tempRaw * 0.125; offset += 2; - dataset.ain0 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain0 = (*(packet + offset) << 8) | *(packet + offset + 1); offset += 2; - dataset.ain1 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain1 = (*(packet + offset) << 8) | *(packet + offset + 1); offset += 6; - dataset.ain4 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain4 = (*(packet + offset) << 8) | *(packet + offset + 1); offset += 2; - dataset.ain5 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain5 = (*(packet + offset) << 8) | *(packet + offset + 1); offset += 2; - dataset.ain6 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain6 = (*(packet + offset) << 8) | *(packet + offset + 1); offset += 2; - dataset.ain7 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain7 = (*(packet + offset) << 8) | *(packet + offset + 1); dataset.setValidity(true, true); if (printPeriodicData) { sif::info << "Radiation sensor temperature: " << dataset.temperatureCelcius << " °C" From f111001572c0c582aad7a8576cd43aea5c522cfe Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:59:31 +0200 Subject: [PATCH 12/24] bump tmtc --- tmtc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtc b/tmtc index e7cb7ca0..7f03dcb3 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit e7cb7ca0963663a9674591c2945c5f24647cb00c +Subproject commit 7f03dcb3a613d26462ac2571140ed6ecb91dd9f0 From b2c286cd7ebe7c7b18405c452b0d462277e18ce0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 00:20:23 +0200 Subject: [PATCH 13/24] improve and optimize SD card handling --- bsp_q7s/core/CoreController.cpp | 126 ++++++++++--------- bsp_q7s/core/CoreController.h | 7 +- bsp_q7s/memory/FileSystemHandler.cpp | 11 +- bsp_q7s/memory/SdCardManager.cpp | 89 ++++++++----- bsp_q7s/memory/SdCardManager.h | 30 ++++- linux/devices/Max31865RtdLowlevelHandler.cpp | 2 +- mission/devices/Max31865EiveHandler.cpp | 2 +- mission/devices/PayloadPcduHandler.cpp | 7 +- mission/memory/SdCardMountedIF.h | 7 +- tmtc | 2 +- 10 files changed, 168 insertions(+), 115 deletions(-) diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 4181778f..8c617ab4 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -56,6 +56,7 @@ CoreController::CoreController(object_id_t objectId) } catch (const std::filesystem::filesystem_error &e) { sif::error << "CoreController::CoreController: Failed with exception " << e.what() << std::endl; } + sdCardCheckCd.timeOut(); eventQueue = QueueFactory::instance()->createMessageQueue(5, EventMessage::MAX_MESSAGE_SIZE); } @@ -77,6 +78,10 @@ void CoreController::performControlOperation() { performWatchdogControlOperation(); sdStateMachine(); performMountedSdCardOperations(); + if (sdCardCheckCd.hasTimedOut()) { + performSdCardCheck(); + sdCardCheckCd.resetTimer(); + } readHkData(); opDivider5.checkAndIncrement(); opDivider10.checkAndIncrement(); @@ -134,6 +139,8 @@ ReturnValue_t CoreController::initialize() { ReturnValue_t CoreController::initializeAfterTaskCreation() { ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; + sdInfo.pref = sdcMan->getPreferredSdCard(); + sdcMan->setActiveSdCard(sdInfo.pref); if (BLOCKING_SD_INIT) { ReturnValue_t result = initSdCardBlocking(); if (result != HasReturnvaluesIF::RETURN_OK and result != SdCardManager::ALREADY_MOUNTED) { @@ -165,7 +172,7 @@ ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_ if (size < 1) { return HasActionsIF::INVALID_PARAMETERS; } - std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + REBOOT_FILE; + std::string path = sdcMan->getCurrentMountPrefix() + REBOOT_FILE; // Disable the reboot file mechanism parseRebootFile(path, rebootFile); if (data[0] == 0) { @@ -205,7 +212,7 @@ ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_ if (size < 1) { return HasActionsIF::INVALID_PARAMETERS; } - std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + REBOOT_FILE; + std::string path = sdcMan->getCurrentMountPrefix() + REBOOT_FILE; // Disable the reboot file mechanism parseRebootFile(path, rebootFile); rebootFile.maxCount = data[0]; @@ -237,13 +244,12 @@ ReturnValue_t CoreController::initSdCardBlocking() { return HasReturnvaluesIF::RETURN_OK; #else - result = sdcMan->getSdCardActiveStatus(sdInfo.currentState); + result = sdcMan->getSdCardsStatus(sdInfo.currentState); if (result != HasReturnvaluesIF::RETURN_OK) { sif::warning << "Getting SD card activity status failed" << std::endl; } #if Q7S_SD_CARD_CONFIG == Q7S_SD_COLD_REDUNDANT - determinePreferredSdCard(); updateSdInfoOther(); sif::info << "Cold redundant SD card configuration, preferred SD card: " << static_cast(sdInfo.pref) << std::endl; @@ -324,8 +330,8 @@ ReturnValue_t CoreController::sdStateMachine() { if (sdInfo.state == SdStates::SET_STATE_SELF) { if (not sdInfo.commandExecuted) { - result = sdcMan->getSdCardActiveStatus(sdInfo.currentState); - determinePreferredSdCard(); + result = sdcMan->getSdCardsStatus(sdInfo.currentState); + sdInfo.pref = sdcMan->getPreferredSdCard(); updateSdInfoOther(); if (sdInfo.pref != sd::SdCard::SLOT_0 and sdInfo.pref != sd::SdCard::SLOT_1) { sif::warning << "Preferred SD card invalid. Setting to card 0.." << std::endl; @@ -468,7 +474,7 @@ ReturnValue_t CoreController::sdStateMachine() { sdInfo.state = SdStates::IDLE; sdInfo.cycleCount = 0; sdcMan->setBlocking(false); - sdcMan->getSdCardActiveStatus(sdInfo.currentState); + sdcMan->getSdCardsStatus(sdInfo.currentState); if (not sdInfo.initFinished) { updateSdInfoOther(); sdInfo.initFinished = true; @@ -933,25 +939,6 @@ ReturnValue_t CoreController::actionPerformReboot(const uint8_t *data, size_t si CoreController::~CoreController() {} -void CoreController::determinePreferredSdCard() { - if (sdInfo.pref == sd::SdCard::NONE) { - ReturnValue_t result = sdcMan->getPreferredSdCard(sdInfo.pref); - if (result != HasReturnvaluesIF::RETURN_OK) { - if (result == scratch::KEY_NOT_FOUND) { - sif::warning << "CoreController::sdCardInit: " - "Preferred SD card not set. Setting to 0" - << std::endl; - sdcMan->setPreferredSdCard(sd::SdCard::SLOT_0); - sdInfo.pref = sd::SdCard::SLOT_0; - } else { - sif::warning << "CoreController::sdCardInit: Could not get preferred SD card" - "information from the scratch buffer" - << std::endl; - } - } - } -} - void CoreController::updateSdInfoOther() { if (sdInfo.pref == sd::SdCard::SLOT_0) { sdInfo.prefChar = "0"; @@ -1235,46 +1222,71 @@ void CoreController::performWatchdogControlOperation() { } void CoreController::performMountedSdCardOperations() { - currMntPrefix = sdcMan->getCurrentMountPrefix(); - if (performMountedSdCardOpsSwitch) { - bool sdCardMounted = false; - bool mountedReadOnly = false; - ReturnValue_t result = sdcMan->isSdCardMountedReadOnly(sdInfo.pref, mountedReadOnly); + auto mountedSdCardOp = [&](bool& mntSwitch, sd::SdCard sdCard, std::string mntPoint) { + if (mntSwitch) { + bool sdCardMounted = sdcMan->isSdCardMounted(sdCard); + if (sdCardMounted and not performOneShotSdCardOpsSwitch) { + std::ostringstream path; + path << mntPoint << "/" << CONF_FOLDER; + if (not std::filesystem::exists(path.str())) { + std::filesystem::create_directory(path.str()); + } + initVersionFile(); + initClockFromTimeFile(); + performRebootFileHandling(false); + performOneShotSdCardOpsSwitch = true; + } + mntSwitch = false; + } + }; + if(sdInfo.pref == sd::SdCard::SLOT_1) { + mountedSdCardOp(sdInfo.mountSwitch.second, sd::SdCard::SLOT_1, SdCardManager::SD_1_MOUNT_POINT); + mountedSdCardOp(sdInfo.mountSwitch.first, sd::SdCard::SLOT_0, SdCardManager::SD_0_MOUNT_POINT); + } else { + mountedSdCardOp(sdInfo.mountSwitch.first, sd::SdCard::SLOT_0, SdCardManager::SD_0_MOUNT_POINT); + mountedSdCardOp(sdInfo.mountSwitch.second, sd::SdCard::SLOT_1, SdCardManager::SD_1_MOUNT_POINT); + } + timeFileHandler(); +} + +ReturnValue_t CoreController::performSdCardCheck() { + bool mountedReadOnly = false; + SdCardManager::SdStatePair active; + sdcMan->getSdCardsStatus(active); + auto sdCardCheck = [&](sd::SdCard sdCard) { + ReturnValue_t result = sdcMan->isSdCardMountedReadOnly(sdCard, mountedReadOnly); if (result != HasReturnvaluesIF::RETURN_OK) { - sif::error << "CoreController::performMountedSdCardOperations: Could not check " - "read-only mount state" << std::endl; + sif::error << "CoreController::performSdCardCheck: Could not check " + "read-only mount state" + << std::endl; mountedReadOnly = true; } if (mountedReadOnly) { int linuxErrno = 0; - result = sdcMan->performFsck(sdInfo.pref, true, linuxErrno); - if(result != HasReturnvaluesIF::RETURN_OK) { - sif::error << "CoreController::performMountedSdCardOperations: fsck command on SD Card " - << sdInfo.prefChar << " failed with code " << linuxErrno << " | " << strerror(linuxErrno); + result = sdcMan->performFsck(sdCard, true, linuxErrno); + if (result != HasReturnvaluesIF::RETURN_OK) { + sif::error << "CoreController::performSdCardCheck: fsck command on SD Card " + << static_cast(sdCard) << " failed with code " << linuxErrno << " | " + << strerror(linuxErrno); } - result = sdcMan->remountReadWrite(sdInfo.pref); - if(result == HasReturnvaluesIF::RETURN_OK) { - sif::warning << "CoreController::performMountedSdCardOperations: Remounted SD Card " << - sdInfo.prefChar << " read-write"; + result = sdcMan->remountReadWrite(sdCard); + if (result == HasReturnvaluesIF::RETURN_OK) { + sif::warning << "CoreController::performSdCardCheck: Remounted SD Card " + << static_cast(sdCard) << " read-write"; } else { - sif::error << "CoreController::performMountedSdCardOperations: Remounting SD Card " << - sdInfo.prefChar << " read-write failed"; + sif::error << "CoreController::performSdCardCheck: Remounting SD Card " + << static_cast(sdCard) << " read-write failed"; } } - sdCardMounted = sdcMan->isSdCardMounted(sdInfo.pref); - if (sdCardMounted and not performOneShotSdCardOpsSwitch) { - std::ostringstream path; - path << currMntPrefix << "/" << CONF_FOLDER; - if (not std::filesystem::exists(path.str())) { - std::filesystem::create_directory(path.str()); - } - initVersionFile(); - initClockFromTimeFile(); - performRebootFileHandling(false); - performOneShotSdCardOpsSwitch = true; - } + }; + if (active.first == sd::SdState::MOUNTED) { + sdCardCheck(sd::SdCard::SLOT_0); } - timeFileHandler(); + if (active.second == sd::SdState::MOUNTED) { + sdCardCheck(sd::SdCard::SLOT_1); + } + + return RETURN_OK; } void CoreController::performRebootFileHandling(bool recreateFile) { @@ -1702,7 +1714,7 @@ void CoreController::rewriteRebootFile(RebootFile file) { } void CoreController::setRebootMechanismLock(bool lock, xsc::Chip tgtChip, xsc::Copy tgtCopy) { - std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + REBOOT_FILE; + std::string path = currMntPrefix + REBOOT_FILE; // Disable the reboot file mechanism parseRebootFile(path, rebootFile); if (tgtChip == xsc::CHIP_0) { diff --git a/bsp_q7s/core/CoreController.h b/bsp_q7s/core/CoreController.h index dd817bff..a82280c8 100644 --- a/bsp_q7s/core/CoreController.h +++ b/bsp_q7s/core/CoreController.h @@ -159,11 +159,12 @@ class CoreController : public ExtendedControllerBase { struct SdInfo { sd::SdCard pref = sd::SdCard::NONE; - sd::SdState prefState = sd::SdState::OFF; sd::SdCard other = sd::SdCard::NONE; + sd::SdState prefState = sd::SdState::OFF; sd::SdState otherState = sd::SdState::OFF; std::string prefChar = "0"; std::string otherChar = "1"; + std::pair mountSwitch = {true, true}; SdStates state = SdStates::START; // Used to track whether a command was executed bool commandExecuted = true; @@ -180,7 +181,6 @@ class CoreController : public ExtendedControllerBase { RebootFile rebootFile = {}; std::string currMntPrefix; bool performOneShotSdCardOpsSwitch = true; - bool performMountedSdCardOpsSwitch = true; /** * Index 0: Chip 0 Copy 0 @@ -196,12 +196,14 @@ class CoreController : public ExtendedControllerBase { ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; + Countdown sdCardCheckCd = Countdown(10000); LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override; ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, uint32_t* msToReachTheMode); void performMountedSdCardOperations(); ReturnValue_t initVersionFile(); ReturnValue_t initClockFromTimeFile(); + ReturnValue_t performSdCardCheck(); ReturnValue_t timeFileHandler(); ReturnValue_t initBootCopy(); ReturnValue_t initWatchdogFifo(); @@ -215,7 +217,6 @@ class CoreController : public ExtendedControllerBase { ReturnValue_t sdColdRedundantBlockingInit(); void currentStateSetter(sd::SdCard sdCard, sd::SdState newState); - void determinePreferredSdCard(); void executeNextExternalSdCommand(); void checkExternalSdCommandStatus(); void performRebootFileHandling(bool recreateFile); diff --git a/bsp_q7s/memory/FileSystemHandler.cpp b/bsp_q7s/memory/FileSystemHandler.cpp index 7a4a791c..33849fbe 100644 --- a/bsp_q7s/memory/FileSystemHandler.cpp +++ b/bsp_q7s/memory/FileSystemHandler.cpp @@ -70,9 +70,8 @@ void FileSystemHandler::fileSystemHandlerLoop() { void FileSystemHandler::fileSystemCheckup() { SdCardManager::SdStatePair statusPair; - sdcMan->getSdCardActiveStatus(statusPair); - sd::SdCard preferredSdCard; - sdcMan->getPreferredSdCard(preferredSdCard); + sdcMan->getSdCardsStatus(statusPair); + sd::SdCard preferredSdCard = sdcMan->getPreferredSdCard(); if ((preferredSdCard == sd::SdCard::SLOT_0) and (statusPair.first == sd::SdState::MOUNTED)) { currentMountPrefix = SdCardManager::SD_0_MOUNT_POINT; } else if ((preferredSdCard == sd::SdCard::SLOT_1) and @@ -109,11 +108,7 @@ ReturnValue_t FileSystemHandler::initialize() { << std::endl; } sdcMan = SdCardManager::instance(); - sd::SdCard preferredSdCard; - ReturnValue_t result = sdcMan->getPreferredSdCard(preferredSdCard); - if (result != HasReturnvaluesIF::RETURN_OK) { - return result; - } + sd::SdCard preferredSdCard = sdcMan->getPreferredSdCard(); if (preferredSdCard == sd::SdCard::SLOT_0) { currentMountPrefix = SdCardManager::SD_0_MOUNT_POINT; } else if (preferredSdCard == sd::SdCard::SLOT_1) { diff --git a/bsp_q7s/memory/SdCardManager.cpp b/bsp_q7s/memory/SdCardManager.cpp index d5a91dac..156d8ba8 100644 --- a/bsp_q7s/memory/SdCardManager.cpp +++ b/bsp_q7s/memory/SdCardManager.cpp @@ -16,23 +16,44 @@ #include "linux/utility/utility.h" #include "scratchApi.h" -SdCardManager* SdCardManager::factoryInstance = nullptr; +SdCardManager* SdCardManager::INSTANCE = nullptr; SdCardManager::SdCardManager() : SystemObject(objects::SDC_MANAGER), cmdExecutor(256) { mutex = MutexFactory::instance()->createMutex(); + MutexGuard mg(mutex); + uint8_t prefSdRaw = 0; + ReturnValue_t result = scratch::readNumber(scratch::PREFERED_SDC_KEY, prefSdRaw); + + if (result != HasReturnvaluesIF::RETURN_OK) { + if (result == scratch::KEY_NOT_FOUND) { + sif::warning << "CoreController::sdCardInit: " + "Preferred SD card not set. Setting to 0" + << std::endl; + setPreferredSdCard(sd::SdCard::SLOT_0); + sdInfo.pref = sd::SdCard::SLOT_0; + } else { + // Should not happen. + // TODO: Maybe trigger event? + sif::error << "SdCardManager::SdCardManager: Reading preferred SD card from scratch" + "buffer failed" + << std::endl; + sdInfo.pref = sd::SdCard::SLOT_0; + } + } + sdInfo.pref = static_cast(prefSdRaw); } SdCardManager::~SdCardManager() {} void SdCardManager::create() { - if (factoryInstance == nullptr) { - factoryInstance = new SdCardManager(); + if (INSTANCE == nullptr) { + INSTANCE = new SdCardManager(); } } SdCardManager* SdCardManager::instance() { SdCardManager::create(); - return SdCardManager::factoryInstance; + return SdCardManager::INSTANCE; } ReturnValue_t SdCardManager::switchOnSdCard(sd::SdCard sdCard, bool doMountSdCard, @@ -51,7 +72,7 @@ ReturnValue_t SdCardManager::switchOnSdCard(sd::SdCard sdCard, bool doMountSdCar if (statusPair == nullptr) { sdStatusPtr = std::make_unique(); statusPair = sdStatusPtr.get(); - result = getSdCardActiveStatus(*statusPair); + result = getSdCardsStatus(*statusPair); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } @@ -98,7 +119,7 @@ ReturnValue_t SdCardManager::switchOnSdCard(sd::SdCard sdCard, bool doMountSdCar ReturnValue_t SdCardManager::switchOffSdCard(sd::SdCard sdCard, bool doUnmountSdCard, SdStatePair* statusPair) { std::pair active; - ReturnValue_t result = getSdCardActiveStatus(active); + ReturnValue_t result = getSdCardsStatus(active); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } @@ -165,7 +186,7 @@ ReturnValue_t SdCardManager::setSdCardState(sd::SdCard sdCard, bool on) { return result; } -ReturnValue_t SdCardManager::getSdCardActiveStatus(SdStatePair& active) { +ReturnValue_t SdCardManager::getSdCardsStatus(SdStatePair& active) { using namespace std; MutexGuard mg(mutex); if (not filesystem::exists(SD_STATE_FILE)) { @@ -273,14 +294,14 @@ ReturnValue_t SdCardManager::sanitizeState(SdStatePair* statusPair, sd::SdCard p resetNonBlockingState = true; } if (prefSdCard == sd::SdCard::NONE) { - result = getPreferredSdCard(prefSdCard); + result = getPreferredSdCard(); if (result != HasReturnvaluesIF::RETURN_OK) { } } if (statusPair == nullptr) { sdStatusPtr = std::make_unique(); statusPair = sdStatusPtr.get(); - getSdCardActiveStatus(*statusPair); + getSdCardsStatus(*statusPair); } if (statusPair->first == sd::SdState::ON) { @@ -351,20 +372,21 @@ void SdCardManager::processSdStatusLine(std::pair& act idx++; } -ReturnValue_t SdCardManager::getPreferredSdCard(sd::SdCard& sdCard) const { - uint8_t prefSdCard = 0; - ReturnValue_t result = scratch::readNumber(scratch::PREFERED_SDC_KEY, prefSdCard); - if (result != HasReturnvaluesIF::RETURN_OK) { - return result; +sd::SdCard SdCardManager::getPreferredSdCard() const { + MutexGuard mg(mutex); + auto res = mg.getLockResult(); + if (res != RETURN_OK) { + sif::error << "SdCardManager::getPreferredSdCard: Lock error" << std::endl; } - sdCard = static_cast(prefSdCard); - return HasReturnvaluesIF::RETURN_OK; + return sdInfo.pref; } ReturnValue_t SdCardManager::setPreferredSdCard(sd::SdCard sdCard) { + MutexGuard mg(mutex); if (sdCard == sd::SdCard::BOTH) { return HasReturnvaluesIF::RETURN_FAILED; } + sdInfo.pref = sdCard; return scratch::writeNumber(scratch::PREFERED_SDC_KEY, static_cast(sdCard)); } @@ -383,14 +405,9 @@ ReturnValue_t SdCardManager::updateSdCardStateFile() { return result; } -std::string SdCardManager::getCurrentMountPrefix(sd::SdCard prefSdCard) { - if (prefSdCard == sd::SdCard::NONE) { - ReturnValue_t result = getPreferredSdCard(prefSdCard); - if (result != HasReturnvaluesIF::RETURN_OK) { - return SD_0_MOUNT_POINT; - } - } - if (prefSdCard == sd::SdCard::SLOT_0) { +std::string SdCardManager::getCurrentMountPrefix() const { + MutexGuard mg(mutex); + if (sdInfo.active == sd::SdCard::SLOT_0) { return SD_0_MOUNT_POINT; } else { return SD_1_MOUNT_POINT; @@ -443,7 +460,7 @@ void SdCardManager::setPrintCommandOutput(bool print) { this->printCmdOutput = p bool SdCardManager::isSdCardMounted(sd::SdCard sdCard) { SdCardManager::SdStatePair active; - ReturnValue_t result = this->getSdCardActiveStatus(active); + ReturnValue_t result = this->getSdCardsStatus(active); if (result != HasReturnvaluesIF::RETURN_OK) { sif::debug << "SdCardManager::isSdCardMounted: Failed to get SD card active state"; @@ -469,10 +486,10 @@ bool SdCardManager::isSdCardMounted(sd::SdCard sdCard) { ReturnValue_t SdCardManager::isSdCardMountedReadOnly(sd::SdCard sdcard, bool& readOnly) { std::ostringstream command; - if(sdcard == sd::SdCard::SLOT_0) { - command << "grep -q \"" << SD_0_DEV_NAME << " vfat ro, \" /proc/mounts"; + if (sdcard == sd::SdCard::SLOT_0) { + command << "grep -q \"" << SD_0_DEV_NAME << " vfat ro, \" /proc/mounts"; } else { - command << "grep -q \"" << SD_1_DEV_NAME << " vfat ro, \" /proc/mounts"; + command << "grep -q \"" << SD_1_DEV_NAME << " vfat ro, \" /proc/mounts"; } ReturnValue_t result = cmdExecutor.load(command.str(), true, false); if (result != HasReturnvaluesIF::RETURN_OK) { @@ -484,7 +501,7 @@ ReturnValue_t SdCardManager::isSdCardMountedReadOnly(sd::SdCard sdcard, bool& re } auto& readVec = cmdExecutor.getReadVector(); size_t readLen = strnlen(readVec.data(), readVec.size()); - if(readLen == 0) { + if (readLen == 0) { readOnly = false; } readOnly = true; @@ -493,7 +510,7 @@ ReturnValue_t SdCardManager::isSdCardMountedReadOnly(sd::SdCard sdcard, bool& re ReturnValue_t SdCardManager::remountReadWrite(sd::SdCard sdcard) { std::ostringstream command; - if(sdcard == sd::SdCard::SLOT_0) { + if (sdcard == sd::SdCard::SLOT_0) { command << "mount -o remount,rw " << SD_0_DEV_NAME << " " << SD_0_MOUNT_POINT; } else { command << "mount -o remount,rw " << SD_1_DEV_NAME << " " << SD_1_MOUNT_POINT; @@ -507,7 +524,7 @@ ReturnValue_t SdCardManager::remountReadWrite(sd::SdCard sdcard) { ReturnValue_t SdCardManager::performFsck(sd::SdCard sdcard, bool printOutput, int& linuxError) { std::ostringstream command; - if(sdcard == sd::SdCard::SLOT_0) { + if (sdcard == sd::SdCard::SLOT_0) { command << "fsck -y " << SD_0_DEV_NAME; } else { command << "fsck -y " << SD_1_DEV_NAME; @@ -517,8 +534,16 @@ ReturnValue_t SdCardManager::performFsck(sd::SdCard sdcard, bool printOutput, in return result; } result = cmdExecutor.execute(); - if(result != HasReturnvaluesIF::RETURN_OK) { + if (result != HasReturnvaluesIF::RETURN_OK) { linuxError = cmdExecutor.getLastError(); } return result; } + +void SdCardManager::setActiveSdCard(sd::SdCard sdCard) { + sdInfo.active = sdCard; +} + +sd::SdCard SdCardManager::getActiveSdCard() const { + return sdInfo.active; +} diff --git a/bsp_q7s/memory/SdCardManager.h b/bsp_q7s/memory/SdCardManager.h index 01a50050..84d2d97b 100644 --- a/bsp_q7s/memory/SdCardManager.h +++ b/bsp_q7s/memory/SdCardManager.h @@ -24,7 +24,7 @@ class MutexIF; * @brief Manages handling of SD cards like switching them on or off or getting the current * state */ -class SdCardManager : public SystemObject, public SdCardMountedIF { +class SdCardManager : public SystemObject, public HasReturnvaluesIF, public SdCardMountedIF { friend class SdCardAccess; public: @@ -36,6 +36,12 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { using SdStatePair = std::pair; + struct SdInfo { + sd::SdCard pref = sd::SdCard::NONE; + sd::SdCard other = sd::SdCard::NONE; + sd::SdCard active = sd::SdCard::NONE; + } sdInfo; + static constexpr uint8_t INTERFACE_ID = CLASS_ID::SD_CARD_MANAGER; static constexpr ReturnValue_t OP_ONGOING = HasReturnvaluesIF::makeReturnCode(INTERFACE_ID, 0); @@ -91,7 +97,7 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { * @param sdCard * @return */ - ReturnValue_t getPreferredSdCard(sd::SdCard& sdCard) const override; + sd::SdCard getPreferredSdCard() const override; /** * Switch on the specified SD card. @@ -138,7 +144,7 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { * should call #updateSdCardStateFile again in that case * - STATUS_FILE_NEXISTS if the status file does not exist */ - ReturnValue_t getSdCardActiveStatus(SdStatePair& active); + ReturnValue_t getSdCardsStatus(SdStatePair& active); /** * Mount the specified SD card. This is necessary to use it. @@ -146,6 +152,20 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { * @return */ ReturnValue_t mountSdCard(sd::SdCard sdCard); + + /** + * Set the currently active SD card. This does not necessarily mean that the SD card is on or + * mounted + * @param sdCard + */ + void setActiveSdCard(sd::SdCard sdCard) override; + /** + * Get the currently active SD card. This does not necessarily mean that the SD card is on or + * mounted + * @return + */ + sd::SdCard getActiveSdCard() const override; + /** * Unmount the specified SD card. This is recommended before switching it off. The SD card * can't be used after it has been unmounted. @@ -173,7 +193,7 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { * @param prefSdCardPtr * @return */ - std::string getCurrentMountPrefix(sd::SdCard prefSdCardPtr = sd::SdCard::NONE) override; + std::string getCurrentMountPrefix() const override; OpStatus checkCurrentOp(Operations& currentOp); @@ -216,7 +236,7 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { std::string currentPrefix; - static SdCardManager* factoryInstance; + static SdCardManager* INSTANCE; }; #endif /* BSP_Q7S_MEMORY_SDCARDACCESSMANAGER_H_ */ diff --git a/linux/devices/Max31865RtdLowlevelHandler.cpp b/linux/devices/Max31865RtdLowlevelHandler.cpp index 6a3af90e..ea038c8b 100644 --- a/linux/devices/Max31865RtdLowlevelHandler.cpp +++ b/linux/devices/Max31865RtdLowlevelHandler.cpp @@ -114,7 +114,7 @@ bool Max31865RtdReader::periodicInitHandling() { #if OBSW_RTD_AUTO_MODE == 0 result = writeBiasSel(Bias::ON, rtd->spiCookie, BASE_CFG); #endif - someRtdUsable = true; + someRtdUsable = true; } } return someRtdUsable; diff --git a/mission/devices/Max31865EiveHandler.cpp b/mission/devices/Max31865EiveHandler.cpp index 7075b685..a77bbd51 100644 --- a/mission/devices/Max31865EiveHandler.cpp +++ b/mission/devices/Max31865EiveHandler.cpp @@ -123,7 +123,7 @@ void Max31865EiveHandler::fillCommandAndReplyMap() { ReturnValue_t Max31865EiveHandler::scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId, size_t* foundLen) { - if(mode == _MODE_POWER_ON or mode == _MODE_WAIT_ON) { + if (mode == _MODE_POWER_ON or mode == _MODE_WAIT_ON) { return IGNORE_FULL_PACKET; } if (remainingSize != structLen) { diff --git a/mission/devices/PayloadPcduHandler.cpp b/mission/devices/PayloadPcduHandler.cpp index 85cf62fa..3e18a94e 100644 --- a/mission/devices/PayloadPcduHandler.cpp +++ b/mission/devices/PayloadPcduHandler.cpp @@ -490,10 +490,9 @@ void PayloadPcduHandler::checkAdcValues() { void PayloadPcduHandler::checkJsonFileInit() { if (not jsonFileInitComplete) { - sd::SdCard prefSd; - sdcMan->getPreferredSdCard(prefSd); - if (sdcMan->isSdCardMounted(prefSd)) { - params.initialize(sdcMan->getCurrentMountPrefix(prefSd)); + sd::SdCard activeSd = sdcMan->getActiveSdCard(); + if (sdcMan->isSdCardMounted(activeSd)) { + params.initialize(sdcMan->getCurrentMountPrefix()); jsonFileInitComplete = true; } } diff --git a/mission/memory/SdCardMountedIF.h b/mission/memory/SdCardMountedIF.h index ff6aace3..77fe97e1 100644 --- a/mission/memory/SdCardMountedIF.h +++ b/mission/memory/SdCardMountedIF.h @@ -8,10 +8,11 @@ class SdCardMountedIF { public: virtual ~SdCardMountedIF(){}; - virtual std::string getCurrentMountPrefix(sd::SdCard prefSdCardPtr = sd::SdCard::NONE) = 0; + virtual std::string getCurrentMountPrefix() const = 0; virtual bool isSdCardMounted(sd::SdCard sdCard) = 0; - virtual ReturnValue_t getPreferredSdCard(sd::SdCard& sdCard) const = 0; - + virtual sd::SdCard getPreferredSdCard() const = 0; + virtual void setActiveSdCard(sd::SdCard sdCard) = 0; + virtual sd::SdCard getActiveSdCard() const = 0; private: }; diff --git a/tmtc b/tmtc index 9332fb86..51bbeaa6 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 9332fb8690de200070e712a70b1fa339d5b6b8d8 +Subproject commit 51bbeaa693a11bfc4d2cb342354041972dd93c1e From 1519b13b78454024dcfee8390cd185b73cac31e6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 00:52:08 +0200 Subject: [PATCH 14/24] appears to work now --- bsp_q7s/core/CoreController.cpp | 5 +++-- bsp_q7s/memory/SdCardManager.cpp | 17 +++++++++-------- mission/memory/SdCardMountedIF.h | 1 + 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 8c617ab4..6719a6ee 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -141,6 +141,7 @@ ReturnValue_t CoreController::initializeAfterTaskCreation() { ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; sdInfo.pref = sdcMan->getPreferredSdCard(); sdcMan->setActiveSdCard(sdInfo.pref); + currMntPrefix = sdcMan->getCurrentMountPrefix(); if (BLOCKING_SD_INIT) { ReturnValue_t result = initSdCardBlocking(); if (result != HasReturnvaluesIF::RETURN_OK and result != SdCardManager::ALREADY_MOUNTED) { @@ -1222,7 +1223,7 @@ void CoreController::performWatchdogControlOperation() { } void CoreController::performMountedSdCardOperations() { - auto mountedSdCardOp = [&](bool& mntSwitch, sd::SdCard sdCard, std::string mntPoint) { + auto mountedSdCardOp = [&](bool &mntSwitch, sd::SdCard sdCard, std::string mntPoint) { if (mntSwitch) { bool sdCardMounted = sdcMan->isSdCardMounted(sdCard); if (sdCardMounted and not performOneShotSdCardOpsSwitch) { @@ -1239,7 +1240,7 @@ void CoreController::performMountedSdCardOperations() { mntSwitch = false; } }; - if(sdInfo.pref == sd::SdCard::SLOT_1) { + if (sdInfo.pref == sd::SdCard::SLOT_1) { mountedSdCardOp(sdInfo.mountSwitch.second, sd::SdCard::SLOT_1, SdCardManager::SD_1_MOUNT_POINT); mountedSdCardOp(sdInfo.mountSwitch.first, sd::SdCard::SLOT_0, SdCardManager::SD_0_MOUNT_POINT); } else { diff --git a/bsp_q7s/memory/SdCardManager.cpp b/bsp_q7s/memory/SdCardManager.cpp index 156d8ba8..1b03ad75 100644 --- a/bsp_q7s/memory/SdCardManager.cpp +++ b/bsp_q7s/memory/SdCardManager.cpp @@ -487,9 +487,9 @@ bool SdCardManager::isSdCardMounted(sd::SdCard sdCard) { ReturnValue_t SdCardManager::isSdCardMountedReadOnly(sd::SdCard sdcard, bool& readOnly) { std::ostringstream command; if (sdcard == sd::SdCard::SLOT_0) { - command << "grep -q \"" << SD_0_DEV_NAME << " vfat ro, \" /proc/mounts"; + command << "grep -q '" << SD_0_MOUNT_POINT << " vfat ro,' /proc/mounts"; } else { - command << "grep -q \"" << SD_1_DEV_NAME << " vfat ro, \" /proc/mounts"; + command << "grep -q '" << SD_1_MOUNT_POINT << " vfat ro,' /proc/mounts"; } ReturnValue_t result = cmdExecutor.load(command.str(), true, false); if (result != HasReturnvaluesIF::RETURN_OK) { @@ -497,6 +497,11 @@ ReturnValue_t SdCardManager::isSdCardMountedReadOnly(sd::SdCard sdcard, bool& re } result = cmdExecutor.execute(); if (result != HasReturnvaluesIF::RETURN_OK) { + int exitStatus = cmdExecutor.getLastError(); + if (exitStatus == 1) { + readOnly = false; + return RETURN_OK; + } return result; } auto& readVec = cmdExecutor.getReadVector(); @@ -540,10 +545,6 @@ ReturnValue_t SdCardManager::performFsck(sd::SdCard sdcard, bool printOutput, in return result; } -void SdCardManager::setActiveSdCard(sd::SdCard sdCard) { - sdInfo.active = sdCard; -} +void SdCardManager::setActiveSdCard(sd::SdCard sdCard) { sdInfo.active = sdCard; } -sd::SdCard SdCardManager::getActiveSdCard() const { - return sdInfo.active; -} +sd::SdCard SdCardManager::getActiveSdCard() const { return sdInfo.active; } diff --git a/mission/memory/SdCardMountedIF.h b/mission/memory/SdCardMountedIF.h index 77fe97e1..853c7e8d 100644 --- a/mission/memory/SdCardMountedIF.h +++ b/mission/memory/SdCardMountedIF.h @@ -13,6 +13,7 @@ class SdCardMountedIF { virtual sd::SdCard getPreferredSdCard() const = 0; virtual void setActiveSdCard(sd::SdCard sdCard) = 0; virtual sd::SdCard getActiveSdCard() const = 0; + private: }; From 2ebdb5c79714bb9bd3d0634fc63b8a6d9ed14662 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 00:53:29 +0200 Subject: [PATCH 15/24] tweak sd card check countdown --- bsp_q7s/core/CoreController.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp_q7s/core/CoreController.h b/bsp_q7s/core/CoreController.h index a82280c8..60c1f94e 100644 --- a/bsp_q7s/core/CoreController.h +++ b/bsp_q7s/core/CoreController.h @@ -196,7 +196,7 @@ class CoreController : public ExtendedControllerBase { ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; - Countdown sdCardCheckCd = Countdown(10000); + Countdown sdCardCheckCd = Countdown(120000); LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override; ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, uint32_t* msToReachTheMode); void performMountedSdCardOperations(); From 3fff3ba21e1aa9a690cd3c880d00dc020f05ad13 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 15:21:37 +0200 Subject: [PATCH 16/24] add and schedule PUS11 --- CMakeLists.txt | 2 ++ bsp_q7s/core/InitMission.cpp | 17 +++++++++++------ common/config/commonConfig.h.in | 3 +++ .../fsfwconfig => common/config}/tmtc/pusIds.h | 7 ++++--- fsfw | 2 +- mission/core/GenericFactory.cpp | 6 +++++- tmtc | 2 +- 7 files changed, 27 insertions(+), 12 deletions(-) rename {linux/fsfwconfig => common/config}/tmtc/pusIds.h (74%) diff --git a/CMakeLists.txt b/CMakeLists.txt index eb44bd41..ef87352e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,8 @@ include(EiveHelpers) option(EIVE_ADD_ETL_LIB "Add ETL library" ON) option(EIVE_ADD_JSON_LIB "Add JSON library" ON) +set(OBSW_MAX_SCHEDULED_TCS 500) + if(EIVE_Q7S_EM) set(OBSW_Q7S_EM 1 diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp index 1b9cc374..d824bb95 100644 --- a/bsp_q7s/core/InitMission.cpp +++ b/bsp_q7s/core/InitMission.cpp @@ -424,13 +424,22 @@ void initmission::createPusTasks(TaskFactory& factory, PeriodicTaskIF* pusMedPrio = factory.createPeriodicTask( "PUS_MED_PRIO", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, missedDeadlineFunc); + + result = pusMedPrio->addComponent(objects::PUS_SERVICE_3_HOUSEKEEPING); + if (result != HasReturnvaluesIF::RETURN_OK) { + initmission::printAddObjectError("PUS_3", objects::PUS_SERVICE_3_HOUSEKEEPING); + } result = pusMedPrio->addComponent(objects::PUS_SERVICE_8_FUNCTION_MGMT); if (result != HasReturnvaluesIF::RETURN_OK) { initmission::printAddObjectError("PUS_8", objects::PUS_SERVICE_8_FUNCTION_MGMT); } - result = pusMedPrio->addComponent(objects::PUS_SERVICE_3_HOUSEKEEPING); + result = pusMedPrio->addComponent(objects::PUS_SERVICE_11_TC_SCHEDULER); if (result != HasReturnvaluesIF::RETURN_OK) { - sif::error << "Object add component failed" << std::endl; + initmission::printAddObjectError("PUS_11", objects::PUS_SERVICE_11_TC_SCHEDULER); + } + result = pusMedPrio->addComponent(objects::PUS_SERVICE_20_PARAMETERS); + if (result != HasReturnvaluesIF::RETURN_OK) { + initmission::printAddObjectError("PUS_20", objects::PUS_SERVICE_20_PARAMETERS); } result = pusMedPrio->addComponent(objects::PUS_SERVICE_200_MODE_MGMT); if (result != HasReturnvaluesIF::RETURN_OK) { @@ -440,10 +449,6 @@ void initmission::createPusTasks(TaskFactory& factory, if (result != HasReturnvaluesIF::RETURN_OK) { initmission::printAddObjectError("PUS_201", objects::PUS_SERVICE_201_HEALTH); } - result = pusMedPrio->addComponent(objects::PUS_SERVICE_20_PARAMETERS); - if (result != HasReturnvaluesIF::RETURN_OK) { - initmission::printAddObjectError("PUS_20", objects::PUS_SERVICE_20_PARAMETERS); - } taskVec.push_back(pusMedPrio); PeriodicTaskIF* pusLowPrio = factory.createPeriodicTask( diff --git a/common/config/commonConfig.h.in b/common/config/commonConfig.h.in index ad19e135..9581e751 100644 --- a/common/config/commonConfig.h.in +++ b/common/config/commonConfig.h.in @@ -33,6 +33,9 @@ static constexpr uint8_t OBSW_VERSION_REVISION = @OBSW_VERSION_REVISION@; // CST: Commits since tag static const char OBSW_VERSION_CST_GIT_SHA1[] = "@OBSW_VERSION_CST_GIT_SHA1@"; + +static constexpr uint32_t OBSW_MAX_SCHEDULED_TCS = @OBSW_MAX_SCHEDULED_TCS@; + extern const fsfw::Version OBSW_VERSION; extern const uint16_t PUS_PACKET_ID; diff --git a/linux/fsfwconfig/tmtc/pusIds.h b/common/config/tmtc/pusIds.h similarity index 74% rename from linux/fsfwconfig/tmtc/pusIds.h rename to common/config/tmtc/pusIds.h index 37503786..75c40176 100644 --- a/linux/fsfwconfig/tmtc/pusIds.h +++ b/common/config/tmtc/pusIds.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_TMTC_PUSIDS_HPP_ -#define CONFIG_TMTC_PUSIDS_HPP_ +#ifndef CONFIG_TMTC_PUSIDS_H_ +#define CONFIG_TMTC_PUSIDS_H_ namespace pus { enum Ids { @@ -11,6 +11,7 @@ enum Ids { PUS_SERVICE_6 = 6, PUS_SERVICE_8 = 8, PUS_SERVICE_9 = 9, + PUS_SERVICE_11 = 11, PUS_SERVICE_17 = 17, PUS_SERVICE_19 = 19, PUS_SERVICE_20 = 20, @@ -20,4 +21,4 @@ enum Ids { }; }; -#endif /* CONFIG_TMTC_PUSIDS_HPP_ */ +#endif /* CONFIG_TMTC_PUSIDS_H_ */ diff --git a/fsfw b/fsfw index 4b128d24..d11bf5ff 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 4b128d243569e0c87ae8868c545bdd80a354a2e6 +Subproject commit d11bf5ffe3d67525cf681f5592e29d1be130053e diff --git a/mission/core/GenericFactory.cpp b/mission/core/GenericFactory.cpp index 3ab598f3..416ea199 100644 --- a/mission/core/GenericFactory.cpp +++ b/mission/core/GenericFactory.cpp @@ -13,6 +13,7 @@ #include #include #include +#include "fsfw/pus/Service11TelecommandScheduling.h" #include #include #include @@ -73,7 +74,7 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_) { new PoolManager(objects::IPC_STORE, poolCfg); } - new CCSDSDistributor(apid::EIVE_OBSW, objects::CCSDS_PACKET_DISTRIBUTOR); + auto* ccsdsDistrib = new CCSDSDistributor(apid::EIVE_OBSW, objects::CCSDS_PACKET_DISTRIBUTOR); new PUSDistributor(apid::EIVE_OBSW, objects::PUS_PACKET_DISTRIBUTOR, objects::CCSDS_PACKET_DISTRIBUTOR); @@ -96,6 +97,9 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_) { new Service8FunctionManagement(objects::PUS_SERVICE_8_FUNCTION_MGMT, apid::EIVE_OBSW, pus::PUS_SERVICE_8, 3, 60); new Service9TimeManagement(objects::PUS_SERVICE_9_TIME_MGMT, apid::EIVE_OBSW, pus::PUS_SERVICE_9); + + new Service11TelecommandScheduling(objects::PUS_SERVICE_11_TC_SCHEDULER, + apid::EIVE_OBSW, pus::PUS_SERVICE_11, ccsdsDistrib); new Service17Test(objects::PUS_SERVICE_17_TEST, apid::EIVE_OBSW, pus::PUS_SERVICE_17); new Service20ParameterManagement(objects::PUS_SERVICE_20_PARAMETERS, apid::EIVE_OBSW, pus::PUS_SERVICE_20); diff --git a/tmtc b/tmtc index 9332fb86..4b902ce0 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 9332fb8690de200070e712a70b1fa339d5b6b8d8 +Subproject commit 4b902ce01b444908ae5c0bf47b7eb018bbb10f81 From 3eb85254197d52064432f517303895c18ae26fcf Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 15:22:45 +0200 Subject: [PATCH 17/24] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95ec7400..5d52e2a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ list yields a list of all related PRs for each release. ## Added +- PUS11 TC scheduler + PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/259 - Commands for individual RTD devices PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/84 - `RwAssembly` added to system components. Assembly works in principle, From 59d0d880bb6e4156d44b8508b088f752b6d3d80f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 15:45:12 +0200 Subject: [PATCH 18/24] bump fsfw --- fsfw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fsfw b/fsfw index d11bf5ff..40cc5579 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit d11bf5ffe3d67525cf681f5592e29d1be130053e +Subproject commit 40cc557978de5b50cf51909206620f05b101e5f5 From c0da8aef2ea18514c5df3b8560a6bdc41d90608b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 15:50:39 +0200 Subject: [PATCH 19/24] delete obsolete folder --- bsp_hosted/fsfwconfig/tmtc/apid.h | 18 ------------------ bsp_hosted/fsfwconfig/tmtc/pusIds.h | 23 ----------------------- common/config/tmtc/pusIds.h | 6 +++--- 3 files changed, 3 insertions(+), 44 deletions(-) delete mode 100644 bsp_hosted/fsfwconfig/tmtc/apid.h delete mode 100644 bsp_hosted/fsfwconfig/tmtc/pusIds.h diff --git a/bsp_hosted/fsfwconfig/tmtc/apid.h b/bsp_hosted/fsfwconfig/tmtc/apid.h deleted file mode 100644 index 9d5c9ed5..00000000 --- a/bsp_hosted/fsfwconfig/tmtc/apid.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef FSFWCONFIG_TMTC_APID_H_ -#define FSFWCONFIG_TMTC_APID_H_ - -#include - -/** - * Application Process Definition: entity, uniquely identified by an - * application process ID (APID), capable of generating telemetry source - * packets and receiving telecommand packets - * - * SOURCE APID: 0x73 / 115 / s - * APID is a 11 bit number - */ -namespace apid { -static const uint16_t EIVE_OBSW = 0x65; -} - -#endif /* FSFWCONFIG_TMTC_APID_H_ */ diff --git a/bsp_hosted/fsfwconfig/tmtc/pusIds.h b/bsp_hosted/fsfwconfig/tmtc/pusIds.h deleted file mode 100644 index 37503786..00000000 --- a/bsp_hosted/fsfwconfig/tmtc/pusIds.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef CONFIG_TMTC_PUSIDS_HPP_ -#define CONFIG_TMTC_PUSIDS_HPP_ - -namespace pus { -enum Ids { - PUS_SERVICE_1 = 1, - PUS_SERVICE_2 = 2, - PUS_SERVICE_3 = 3, - PUS_SERVICE_3_PSB = 3, - PUS_SERVICE_5 = 5, - PUS_SERVICE_6 = 6, - PUS_SERVICE_8 = 8, - PUS_SERVICE_9 = 9, - PUS_SERVICE_17 = 17, - PUS_SERVICE_19 = 19, - PUS_SERVICE_20 = 20, - PUS_SERVICE_23 = 23, - PUS_SERVICE_200 = 200, - PUS_SERVICE_201 = 201, -}; -}; - -#endif /* CONFIG_TMTC_PUSIDS_HPP_ */ diff --git a/common/config/tmtc/pusIds.h b/common/config/tmtc/pusIds.h index 75c40176..0891992d 100644 --- a/common/config/tmtc/pusIds.h +++ b/common/config/tmtc/pusIds.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_TMTC_PUSIDS_H_ -#define CONFIG_TMTC_PUSIDS_H_ +#ifndef COMMON_CONFIG_TMTC_PUSIDS_H_ +#define COMMON_CONFIG_TMTC_PUSIDS_H_ namespace pus { enum Ids { @@ -21,4 +21,4 @@ enum Ids { }; }; -#endif /* CONFIG_TMTC_PUSIDS_H_ */ +#endif /* COMMON_CONFIG_TMTC_PUSIDS_H_ */ From 88faf8f87d071f0642037205673b401301f3f00b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 16:23:00 +0200 Subject: [PATCH 20/24] bump fsfw --- fsfw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fsfw b/fsfw index 40cc5579..24069dfd 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 40cc557978de5b50cf51909206620f05b101e5f5 +Subproject commit 24069dfd78a5905b3e327fab3528baacbc913757 From 01bac87afbd607e77b5936071f0745a97eb2272e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 May 2022 10:59:20 +0200 Subject: [PATCH 21/24] update reset pin handling --- bsp_q7s/callbacks/gnssCallback.cpp | 14 +++++++++----- bsp_q7s/callbacks/gnssCallback.h | 3 +-- bsp_q7s/core/ObjectFactory.cpp | 11 +++++++++-- linux/devices/GPSHyperionLinuxController.cpp | 4 ++-- linux/devices/GPSHyperionLinuxController.h | 2 +- mission/devices/devicedefinitions/GPSDefinitions.h | 2 +- 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/bsp_q7s/callbacks/gnssCallback.cpp b/bsp_q7s/callbacks/gnssCallback.cpp index d5dbc3b0..3d29ca4c 100644 --- a/bsp_q7s/callbacks/gnssCallback.cpp +++ b/bsp_q7s/callbacks/gnssCallback.cpp @@ -1,9 +1,14 @@ #include "gnssCallback.h" +#include "fsfw/action/HasActionsIF.h" #include "devices/gpioIds.h" #include "fsfw/tasks/TaskFactory.h" -ReturnValue_t gps::triggerGpioResetPin(void* args) { +ReturnValue_t gps::triggerGpioResetPin(const uint8_t* actionData, size_t len, void* args) { + // At least one byte which denotes which GPS to reset is required + if(len < 1 or actionData == nullptr) { + return HasActionsIF::INVALID_PARAMETERS; + } ResetArgs* resetArgs = reinterpret_cast(args); if (args == nullptr) { return HasReturnvaluesIF::RETURN_FAILED; @@ -12,11 +17,10 @@ ReturnValue_t gps::triggerGpioResetPin(void* args) { return HasReturnvaluesIF::RETURN_FAILED; } gpioId_t gpioId; - if (resetArgs->gnss1) { - gpioId = gpioIds::GNSS_1_NRESET; - - } else { + if (actionData[0] == 0) { gpioId = gpioIds::GNSS_0_NRESET; + } else { + gpioId = gpioIds::GNSS_1_NRESET; } resetArgs->gpioComIF->pullLow(gpioId); TaskFactory::delayTask(resetArgs->waitPeriodMs); diff --git a/bsp_q7s/callbacks/gnssCallback.h b/bsp_q7s/callbacks/gnssCallback.h index 3e769899..cd69f5a6 100644 --- a/bsp_q7s/callbacks/gnssCallback.h +++ b/bsp_q7s/callbacks/gnssCallback.h @@ -5,14 +5,13 @@ #include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h" struct ResetArgs { - bool gnss1 = false; LinuxLibgpioIF* gpioComIF = nullptr; uint32_t waitPeriodMs = 100; }; namespace gps { -ReturnValue_t triggerGpioResetPin(void* args); +ReturnValue_t triggerGpioResetPin(const uint8_t* actionData, size_t len, void* args); } diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 490b5251..8b057b2f 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -93,8 +93,7 @@ #include "mission/tmtc/VirtualChannel.h" #include "mission/utility/TmFunnel.h" -ResetArgs resetArgsGnss0; -ResetArgs resetArgsGnss1; +ResetArgs RESET_ARGS_GNSS; void Factory::setStaticFrameworkObjectIds() { PusServiceBase::packetSource = objects::PUS_PACKET_DISTRIBUTOR; @@ -462,6 +461,7 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI #if OBSW_DEBUG_GPS == 1 debugGps = true; #endif +<<<<<<< Updated upstream resetArgsGnss1.gnss1 = true; resetArgsGnss1.gpioComIF = gpioComIF; resetArgsGnss1.waitPeriodMs = 100; @@ -471,6 +471,13 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI auto gpsHandler0 = new GPSHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps); gpsHandler0->setResetPinTriggerFunction(gps::triggerGpioResetPin, &resetArgsGnss0); +======= + RESET_ARGS_GNSS.gpioComIF = gpioComIF; + RESET_ARGS_GNSS.waitPeriodMs = 100; + auto gpsCtrl = + new GPSHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps); + gpsCtrl->setResetPinTriggerFunction(gps::triggerGpioResetPin, &RESET_ARGS_GNSS); +>>>>>>> Stashed changes AcsBoardHelper acsBoardHelper = AcsBoardHelper( objects::MGM_0_LIS3_HANDLER, objects::MGM_1_RM3100_HANDLER, objects::MGM_2_LIS3_HANDLER, diff --git a/linux/devices/GPSHyperionLinuxController.cpp b/linux/devices/GPSHyperionLinuxController.cpp index dee3c9af..5d97554a 100644 --- a/linux/devices/GPSHyperionLinuxController.cpp +++ b/linux/devices/GPSHyperionLinuxController.cpp @@ -57,12 +57,12 @@ ReturnValue_t GPSHyperionLinuxController::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t *data, size_t size) { switch (actionId) { - case (GpsHyperion::TRIGGER_RESET_PIN): { + case (GpsHyperion::TRIGGER_RESET_PIN_GNSS): { if (resetCallback != nullptr) { PoolReadGuard pg(&gpsSet); // Set HK entries invalid gpsSet.setValidity(false, true); - resetCallback(resetCallbackArgs); + resetCallback(data, size, resetCallbackArgs); return HasActionsIF::EXECUTION_FINISHED; } return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; diff --git a/linux/devices/GPSHyperionLinuxController.h b/linux/devices/GPSHyperionLinuxController.h index 94e82023..35ce0a63 100644 --- a/linux/devices/GPSHyperionLinuxController.h +++ b/linux/devices/GPSHyperionLinuxController.h @@ -30,7 +30,7 @@ class GPSHyperionLinuxController : public ExtendedControllerBase { bool debugHyperionGps = false); virtual ~GPSHyperionLinuxController(); - using gpioResetFunction_t = ReturnValue_t (*)(void* args); + using gpioResetFunction_t = ReturnValue_t (*)(const uint8_t* actionData, size_t len, void* args); void setResetPinTriggerFunction(gpioResetFunction_t resetCallback, void* args); ReturnValue_t handleCommandMessage(CommandMessage* message) override; diff --git a/mission/devices/devicedefinitions/GPSDefinitions.h b/mission/devices/devicedefinitions/GPSDefinitions.h index f953da22..e842f54b 100644 --- a/mission/devices/devicedefinitions/GPSDefinitions.h +++ b/mission/devices/devicedefinitions/GPSDefinitions.h @@ -14,7 +14,7 @@ static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::GPS_HANDLER; static constexpr Event GPS_FIX_CHANGE = event::makeEvent(SUBSYSTEM_ID, 0, severity::INFO); static constexpr DeviceCommandId_t GPS_REPLY = 0; -static constexpr DeviceCommandId_t TRIGGER_RESET_PIN = 5; +static constexpr DeviceCommandId_t TRIGGER_RESET_PIN_GNSS = 5; static constexpr uint32_t DATASET_ID = 0; From bb1e1d80cc20f25e333ed140bcf30e967189f6f7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 May 2022 11:00:18 +0200 Subject: [PATCH 22/24] resolve merge conflict --- bsp_q7s/core/ObjectFactory.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 8b057b2f..b5b5f06d 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -461,23 +461,11 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI #if OBSW_DEBUG_GPS == 1 debugGps = true; #endif -<<<<<<< Updated upstream - resetArgsGnss1.gnss1 = true; - resetArgsGnss1.gpioComIF = gpioComIF; - resetArgsGnss1.waitPeriodMs = 100; - resetArgsGnss0.gnss1 = false; - resetArgsGnss0.gpioComIF = gpioComIF; - resetArgsGnss0.waitPeriodMs = 100; - auto gpsHandler0 = - new GPSHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps); - gpsHandler0->setResetPinTriggerFunction(gps::triggerGpioResetPin, &resetArgsGnss0); -======= RESET_ARGS_GNSS.gpioComIF = gpioComIF; RESET_ARGS_GNSS.waitPeriodMs = 100; auto gpsCtrl = new GPSHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps); gpsCtrl->setResetPinTriggerFunction(gps::triggerGpioResetPin, &RESET_ARGS_GNSS); ->>>>>>> Stashed changes AcsBoardHelper acsBoardHelper = AcsBoardHelper( objects::MGM_0_LIS3_HANDLER, objects::MGM_1_RM3100_HANDLER, objects::MGM_2_LIS3_HANDLER, From ae434853aa994b91c3bfbadb1e49d9bbc6d467b7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 May 2022 13:14:36 +0200 Subject: [PATCH 23/24] bump number stored packets --- mission/core/GenericFactory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mission/core/GenericFactory.cpp b/mission/core/GenericFactory.cpp index 3ab598f3..1a57a502 100644 --- a/mission/core/GenericFactory.cpp +++ b/mission/core/GenericFactory.cpp @@ -120,6 +120,6 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_) { tcpServer->enableWiretapping(true); #endif /* OBSW_TCP_SERVER_WIRETAPPING == 1 */ #endif /* OBSW_USE_TMTC_TCP_BRIDGE == 0 */ - tmtcBridge->setMaxNumberOfPacketsStored(70); + tmtcBridge->setMaxNumberOfPacketsStored(300); #endif /* OBSW_ADD_TCPIP_BRIDGE == 1 */ } From 335d3ba3b02a83f221000925b5d1dda7339c3477 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 25 May 2022 15:45:11 +0200 Subject: [PATCH 24/24] bump submodules --- fsfw | 2 +- tmtc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fsfw b/fsfw index c8355251..76a459a0 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit c8355251967009559ea790b63c3ebfc67a27efef +Subproject commit 76a459a02c9374d3edcb5c52d5c71e94c69d2f0f diff --git a/tmtc b/tmtc index 6a209e1a..8a008557 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 6a209e1a0badc0db91a03e1ef32d43de54d58958 +Subproject commit 8a008557983d496239a0afe252c8bb38983d2f11