diff --git a/bsp_hosted/scheduling.cpp b/bsp_hosted/scheduling.cpp index 19df002f..2e73bbf5 100644 --- a/bsp_hosted/scheduling.cpp +++ b/bsp_hosted/scheduling.cpp @@ -185,7 +185,7 @@ void scheduling::initTasks() { #endif /* OBSW_ADD_TEST_CODE == 1 */ PeriodicTaskIF* dummyTask = factory->createPeriodicTask( - "DUMMY_TASK", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, missedDeadlineFunc); + "DUMMY_TASK", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, missedDeadlineFunc); dummyTask->addComponent(objects::SUS_0_N_LOC_XFYFZM_PT_XF); dummyTask->addComponent(objects::SUS_1_N_LOC_XBYFZM_PT_XB); dummyTask->addComponent(objects::SUS_2_N_LOC_XFYBZB_PT_YB); diff --git a/mission/devices/devicedefinitions/GPSDefinitions.h b/mission/devices/devicedefinitions/GPSDefinitions.h index 7653745f..387d08be 100644 --- a/mission/devices/devicedefinitions/GPSDefinitions.h +++ b/mission/devices/devicedefinitions/GPSDefinitions.h @@ -1,9 +1,9 @@ #ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ #define MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ +#include "eive/eventSubsystemIds.h" #include "fsfw/datapoollocal/StaticLocalDataSet.h" #include "fsfw/devicehandlers/DeviceHandlerIF.h" -#include "eive/eventSubsystemIds.h" namespace GpsHyperion { diff --git a/mission/tmtc/TmStore.cpp b/mission/tmtc/TmStore.cpp index 3033b001..8429491c 100644 --- a/mission/tmtc/TmStore.cpp +++ b/mission/tmtc/TmStore.cpp @@ -3,11 +3,18 @@ #include #include +#include using namespace returnvalue; -TmStore::TmStore(object_id_t objectId, std::string baseName, PacketFilter filter, SdCardMountedIF& sdcMan) - : SystemObject(objectId), filter(filter), sdcMan(sdcMan) {} +TmStore::TmStore(object_id_t objectId, std::string baseName, RolloverInterval interval, + uint8_t intervalFactor, PacketFilter filter, SdCardMountedIF& sdcMan) + : SystemObject(objectId), + filter(filter), + baseName(std::move(baseName)), + interval(interval), + intervalFactor(intervalFactor), + sdcMan(sdcMan) {} ReturnValue_t TmStore::passPacket(PusTmReader& reader) { bool inApidList = false; @@ -44,6 +51,30 @@ ReturnValue_t TmStore::passPacket(PusTmReader& reader) { return returnvalue::OK; } -ReturnValue_t TmStore::storePacket(PusTmReader& reader) { return returnvalue::OK; } +ReturnValue_t TmStore::storePacket(PusTmReader& reader) { + using namespace std::filesystem; + std::string currentPrefix = sdcMan.getCurrentMountPrefix(); + path baseDir = currentPrefix / baseName; + // It is assumed here that the filesystem is usable. + if (not exists(baseDir)) { + create_directory(baseDir); + } + if (not mostRecentFile) { + // TODO: Find most recent file by iterating through all files and remembering the file + // with the most recent timestamp. + for (auto const& file : directory_iterator(baseDir)) { + if (file.is_directory()) { + continue; + } + auto path = file.path(); + // TODO: Scan file timestamp from name somehow. Maybe use scanf or similar? + } + } + // TODO: Need to find the file of the most recent file. + // TODO: If file exists: Determine whether file rolls over: Maximum file size reached? Interval + // since last timestamp exceeds rollover interval? + // TODO: If file does not exist or rollover criteria met: Create new file with current timestamp. + return returnvalue::OK; +} MessageQueueId_t TmStore::getCommandQueue() { return MessageQueueIF::NO_QUEUE; } diff --git a/mission/tmtc/TmStore.h b/mission/tmtc/TmStore.h index 7d8cb144..7402921e 100644 --- a/mission/tmtc/TmStore.h +++ b/mission/tmtc/TmStore.h @@ -13,20 +13,31 @@ struct PacketFilter { std::optional>> serviceSubservices; }; +enum class RolloverInterval { HOURLY, DAILY }; + class TmStore : public SystemObject { public: - TmStore(object_id_t objectId, std::string baseName, PacketFilter filter, SdCardMountedIF& sdcMan); + TmStore(object_id_t objectId, std::string baseName, RolloverInterval interval, + uint8_t intervalFactor, PacketFilter filter, SdCardMountedIF& sdcMan); ReturnValue_t passPacket(PusTmReader& reader); ReturnValue_t storePacket(PusTmReader& reader); private: + static constexpr size_t MAX_FILESIZE = 8192; + /** * To get the queue where commands shall be sent. * @return Id of command queue. */ MessageQueueId_t getCommandQueue(); PacketFilter filter; + std::string baseName; + RolloverInterval interval; + uint8_t intervalFactor; + char NAME_BUF[524] = {}; + std::array fileBuf{}; + std::optional mostRecentFile; SdCardMountedIF& sdcMan; }; diff --git a/unittest/controller/testThermalController.cpp b/unittest/controller/testThermalController.cpp index 1c5f63fe..44fba918 100644 --- a/unittest/controller/testThermalController.cpp +++ b/unittest/controller/testThermalController.cpp @@ -13,7 +13,7 @@ TEST_CASE("Thermal Controller", "[ThermalController]") { const object_id_t THERMAL_CONTROLLER_ID = 0x123; new TemperatureSensorsDummy(); - //new SusDummy(); + // new SusDummy(); // testEnvironment::initialize();