#include "TmStoreTaskBase.h" #include TmStoreTaskBase::TmStoreTaskBase(object_id_t objectId, StorageManagerIF& ipcStore, VirtualChannel& channel, SdCardMountedIF& sdcMan) : SystemObject(objectId), ipcStore(ipcStore), channel(channel), sdcMan(sdcMan) {} bool TmStoreTaskBase::handleOneStore(PersistentTmStoreWithTmQueue& store) { bool tmToStoreReceived = true; bool tcRequestReceived = true; bool dumpsPerformed = false; // Store TM persistently ReturnValue_t result = store.handleNextTm(); if (result == MessageQueueIF::NO_QUEUE) { tmToStoreReceived = false; } // Handle TC requests, for example deletion or retrieval requests. result = store.handleCommandQueue(ipcStore); if (result == MessageQueueIF::NO_QUEUE) { tcRequestReceived = false; } // Dump TMs when applicable if (store.getState() == PersistentTmStore::State::DUMPING) { size_t dumpedLen; bool fileHasSwapped; // TODO: Maybe do a bit of a delay every 100-200 packets? // TODO: We could continously dump until a file swap during active downlink.. // TODO: handle returnvalue? result = store.dumpNextPacket(channel, dumpedLen, fileHasSwapped); if (result == returnvalue::OK) { dumpsPerformed = true; } } if (tcRequestReceived or tmToStoreReceived or dumpsPerformed) { return true; } return false; } bool TmStoreTaskBase::cyclicStoreCheck() { if (not storesInitialized) { initStoresIfPossible(); if (not storesInitialized) { TaskFactory::delayTask(400); return false; } } else if (sdCardCheckCd.hasTimedOut()) { if (not sdcMan.isSdCardUsable(std::nullopt)) { // Might be due to imminent shutdown or SD card switch. storesInitialized = false; TaskFactory::delayTask(100); return false; } sdCardCheckCd.resetTimer(); } return true; }