diff --git a/linux/ipcore/PapbVcInterface.cpp b/linux/ipcore/PapbVcInterface.cpp index 1808d935..5d88de94 100644 --- a/linux/ipcore/PapbVcInterface.cpp +++ b/linux/ipcore/PapbVcInterface.cpp @@ -58,7 +58,7 @@ ReturnValue_t PapbVcInterface::pollPapbBusySignal(uint32_t maxPollRetries) const gpio::Levels papbBusyState = gpio::Levels::LOW; ReturnValue_t result; uint32_t busyIdx = 0; - nextDelay.tv_nsec = 1000; + nextDelay.tv_nsec = 0; while (true) { /** Check if PAPB interface is ready to receive data */ @@ -80,7 +80,9 @@ ReturnValue_t PapbVcInterface::pollPapbBusySignal(uint32_t maxPollRetries) const // Ignore signal handling here for now. nanosleep(&nextDelay, &remDelay); // Adaptive delay. - if (nextDelay.tv_nsec * 2 <= MAX_DELAY_PAPB_POLLING_NS) { + if(nextDelay.tv_nsec == 0) { + nextDelay.tv_nsec = FIRST_NON_NULL_DELAY_NS; + } else if (nextDelay.tv_nsec * 2 <= MAX_DELAY_PAPB_POLLING_NS) { nextDelay.tv_nsec *= 2; } } diff --git a/linux/ipcore/PapbVcInterface.h b/linux/ipcore/PapbVcInterface.h index 484390b2..8545a7ec 100644 --- a/linux/ipcore/PapbVcInterface.h +++ b/linux/ipcore/PapbVcInterface.h @@ -76,6 +76,7 @@ class PapbVcInterface : public VirtualChannelIF { */ static const int DATA_REG_OFFSET = 256; + static constexpr long int FIRST_NON_NULL_DELAY_NS = 1000; static constexpr long int MAX_DELAY_PAPB_POLLING_NS = 4000; LinuxLibgpioIF* gpioComIF = nullptr; @@ -87,7 +88,7 @@ class PapbVcInterface : public VirtualChannelIF { std::string uioFile; int mapNum = 0; - mutable struct timespec nextDelay = {.tv_sec = 0, .tv_nsec = 1000}; + mutable struct timespec nextDelay = {.tv_sec = 0, .tv_nsec = 0}; mutable struct timespec remDelay; volatile uint32_t* vcBaseReg = nullptr; diff --git a/mission/tmtc/PersistentSingleTmStoreTask.cpp b/mission/tmtc/PersistentSingleTmStoreTask.cpp index ae6b8700..ec507a44 100644 --- a/mission/tmtc/PersistentSingleTmStoreTask.cpp +++ b/mission/tmtc/PersistentSingleTmStoreTask.cpp @@ -11,6 +11,7 @@ PersistentSingleTmStoreTask::PersistentSingleTmStoreTask( dumpContext(eventIfDumpDone) {} ReturnValue_t PersistentSingleTmStoreTask::performOperation(uint8_t opCode) { + ReturnValue_t result = returnvalue::OK; while (true) { // Delay done by the check if (not cyclicStoreCheck()) { @@ -18,18 +19,19 @@ ReturnValue_t PersistentSingleTmStoreTask::performOperation(uint8_t opCode) { } bool busy = handleOneStore(storeWithQueue, dumpContext); if (not busy) { - TaskFactory::delayTask(100); + result = TaskFactory::delayTask(100); } else if (dumpContext.vcBusyDuringDump) { - TaskFactory::delayTask(20); - } else if (fileHasSwapped) { - TaskFactory::delayTask(20); + result = TaskFactory::delayTask(10); } else if (dumpContext.packetWasDumped and dumpContext.dumpedBytes - dumpContext.bytesDumpedAtLastDelay >= 2048) { dumpContext.bytesDumpedAtLastDelay = dumpContext.dumpedBytes; - TaskFactory::delayTask(20); + result = TaskFactory::delayTask(10); } else { // TODO: Lower this as much as possible... - TaskFactory::delayTask(5); + result = TaskFactory::delayTask(10); + } + if(result != returnvalue::OK) { + sif::warning << "TmStoreTask: Delay failed" << std::endl; } } } diff --git a/mission/tmtc/TmStoreTaskBase.cpp b/mission/tmtc/TmStoreTaskBase.cpp index 2175b164..d2fff5e7 100644 --- a/mission/tmtc/TmStoreTaskBase.cpp +++ b/mission/tmtc/TmStoreTaskBase.cpp @@ -55,7 +55,7 @@ bool TmStoreTaskBase::handleOneStore(PersistentTmStoreWithTmQueue& store, } else { dumpContext.vcBusyDuringDump = true; dumpContext.ptmeBusyCounter++; - if (dumpContext.ptmeBusyCounter == 50) { + if (dumpContext.ptmeBusyCounter == 100) { // If this happens, something is probably wrong. sif::warning << "PTME busy for longer period. Dumped length so far: " << dumpContext.dumpedBytes << std::endl;