2023-03-09 19:42:20 +01:00
|
|
|
#ifndef MISSION_TMTC_TMSTORETASKBASE_H_
|
|
|
|
#define MISSION_TMTC_TMSTORETASKBASE_H_
|
|
|
|
|
2023-03-09 20:16:00 +01:00
|
|
|
#include <fsfw/timemanager/Countdown.h>
|
2023-03-09 19:42:20 +01:00
|
|
|
#include <mission/tmtc/PersistentTmStoreWithTmQueue.h>
|
|
|
|
#include <mission/tmtc/VirtualChannel.h>
|
|
|
|
|
2023-03-28 15:03:34 +02:00
|
|
|
/**
|
|
|
|
* Generic class which composes a Virtual Channel and a persistent TM stores. This allows dumping
|
|
|
|
* the TM store into the virtual channel directly.
|
|
|
|
*/
|
2023-03-09 19:42:20 +01:00
|
|
|
class TmStoreTaskBase : public SystemObject {
|
|
|
|
public:
|
2023-03-11 14:59:55 +01:00
|
|
|
struct DumpContext {
|
2023-03-28 15:15:38 +02:00
|
|
|
DumpContext(Event eventIfDone, Event eventIfCancelled)
|
|
|
|
: eventIfDone(eventIfDone), eventIfCancelled(eventIfCancelled) {}
|
2023-03-11 14:59:55 +01:00
|
|
|
void reset() {
|
|
|
|
numberOfDumpedPackets = 0;
|
|
|
|
dumpedBytes = 0;
|
2023-03-27 21:39:37 +02:00
|
|
|
vcBusyDuringDump = false;
|
|
|
|
packetWasDumped = false;
|
2023-03-27 21:46:12 +02:00
|
|
|
bytesDumpedAtLastDelay = 0;
|
2023-03-27 21:39:37 +02:00
|
|
|
ptmeBusyCounter = 0;
|
2023-03-11 14:59:55 +01:00
|
|
|
}
|
|
|
|
const Event eventIfDone;
|
2023-03-28 15:15:38 +02:00
|
|
|
const Event eventIfCancelled;
|
2023-03-27 21:46:12 +02:00
|
|
|
size_t numberOfDumpedPackets = 0;
|
|
|
|
size_t bytesDumpedAtLastDelay = 0;
|
|
|
|
size_t dumpedBytes = 0;
|
2023-03-23 18:31:47 +01:00
|
|
|
uint32_t ptmeBusyCounter = 0;
|
2023-03-27 21:23:09 +02:00
|
|
|
bool packetWasDumped = false;
|
|
|
|
bool vcBusyDuringDump = false;
|
2023-03-11 14:59:55 +01:00
|
|
|
};
|
|
|
|
|
2023-03-09 20:16:00 +01:00
|
|
|
TmStoreTaskBase(object_id_t objectId, StorageManagerIF& ipcStore, VirtualChannel& channel,
|
|
|
|
SdCardMountedIF& sdcMan);
|
|
|
|
|
|
|
|
protected:
|
2023-03-28 22:04:40 +02:00
|
|
|
|
2023-03-28 15:03:34 +02:00
|
|
|
StorageManagerIF& ipcStore;
|
|
|
|
Countdown sdCardCheckCd = Countdown(800);
|
|
|
|
// 20 minutes are allowed as maximum dump time.
|
|
|
|
Countdown cancelDumpCd = Countdown(60 * 20 * 1000);
|
|
|
|
// If the TM sink is busy for 1 minute for whatever reason, cancel the dump.
|
2023-03-28 21:59:38 +02:00
|
|
|
Countdown tmSinkBusyCd = Countdown(60 * 1000);
|
2023-03-28 15:03:34 +02:00
|
|
|
VirtualChannel& channel;
|
|
|
|
bool storesInitialized = false;
|
|
|
|
bool fileHasSwapped = false;
|
|
|
|
SdCardMountedIF& sdcMan;
|
|
|
|
|
|
|
|
void cancelDump(DumpContext& ctx, PersistentTmStore& store, bool isTxOn);
|
2023-03-09 19:42:20 +01:00
|
|
|
/**
|
2023-03-28 15:03:34 +02:00
|
|
|
*
|
2023-03-09 19:42:20 +01:00
|
|
|
* Handling for one store. Returns if anything was done.
|
|
|
|
* @param store
|
|
|
|
* @return
|
|
|
|
*/
|
2023-03-11 14:59:55 +01:00
|
|
|
bool handleOneStore(PersistentTmStoreWithTmQueue& store, DumpContext& dumpContext);
|
2023-03-09 19:42:20 +01:00
|
|
|
|
2023-03-28 14:59:31 +02:00
|
|
|
ReturnValue_t handleOneDump(PersistentTmStoreWithTmQueue& store, DumpContext& dumpContext,
|
|
|
|
bool& dumpPerformed);
|
|
|
|
|
2023-03-09 20:16:00 +01:00
|
|
|
/**
|
|
|
|
* Occasionally check whether SD card is okay to be used. If not, poll whether it is ready to
|
|
|
|
* be used again and re-initialize stores. Returns whether store is okay to be used.
|
|
|
|
*/
|
|
|
|
bool cyclicStoreCheck();
|
|
|
|
|
2023-03-10 02:05:51 +01:00
|
|
|
virtual bool initStoresIfPossible() = 0;
|
2023-03-09 19:42:20 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* MISSION_TMTC_TMSTORETASKBASE_H_ */
|