This commit is contained in:
parent
1d047f3c92
commit
9023405b96
@ -40,7 +40,7 @@ ReturnValue_t PersistentTmStore::buildDumpSet(uint32_t fromUnixSeconds, uint32_t
|
|||||||
if (not fileOrDir.is_regular_file(e)) {
|
if (not fileOrDir.is_regular_file(e)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
dumpParams.fileSize = std::filesystem::file_size(dumpParams.dirEntry.path(), e);
|
dumpParams.fileSize = std::filesystem::file_size(fileOrDir.path(), e);
|
||||||
if (e) {
|
if (e) {
|
||||||
sif::error << "PersistentTmStore: Could not retrieve file size: " << e.message() << std::endl;
|
sif::error << "PersistentTmStore: Could not retrieve file size: " << e.message() << std::endl;
|
||||||
continue;
|
continue;
|
||||||
@ -54,7 +54,7 @@ ReturnValue_t PersistentTmStore::buildDumpSet(uint32_t fromUnixSeconds, uint32_t
|
|||||||
if (dumpParams.fileSize > fileBuf.size()) {
|
if (dumpParams.fileSize > fileBuf.size()) {
|
||||||
sif::error << "PersistentTmStore: File too large, is deleted" << std::endl;
|
sif::error << "PersistentTmStore: File too large, is deleted" << std::endl;
|
||||||
triggerEvent(persTmStore::FILE_TOO_LARGE, dumpParams.fileSize, fileBuf.size());
|
triggerEvent(persTmStore::FILE_TOO_LARGE, dumpParams.fileSize, fileBuf.size());
|
||||||
std::filesystem::remove(dumpParams.dirEntry.path(), e);
|
std::filesystem::remove(fileOrDir.path(), e);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const path& file = fileOrDir.path();
|
const path& file = fileOrDir.path();
|
||||||
@ -73,9 +73,9 @@ ReturnValue_t PersistentTmStore::buildDumpSet(uint32_t fromUnixSeconds, uint32_t
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Check whether this is a suffixed file.
|
|
||||||
DumpIndex dumpIndex;
|
DumpIndex dumpIndex;
|
||||||
dumpIndex.epoch = fileEpoch;
|
dumpIndex.epoch = fileEpoch;
|
||||||
|
dumpIndex.suffixIdx = extractSuffix(file.string());
|
||||||
dumpParams.orderedDumpFilestamps.emplace(dumpIndex);
|
dumpParams.orderedDumpFilestamps.emplace(dumpIndex);
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
@ -83,6 +83,21 @@ ReturnValue_t PersistentTmStore::buildDumpSet(uint32_t fromUnixSeconds, uint32_t
|
|||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t PersistentTmStore::extractSuffix(const std::string& pathStr) {
|
||||||
|
std::string numberStr;
|
||||||
|
// Find the position of the dot at the end of the file path
|
||||||
|
size_t dotPos = pathStr.find_last_of('.');
|
||||||
|
if (dotPos != std::string::npos && dotPos < pathStr.length() - 1) {
|
||||||
|
// Extract the substring after the dot
|
||||||
|
numberStr = pathStr.substr(dotPos + 1);
|
||||||
|
}
|
||||||
|
int number = std::stoi(numberStr);
|
||||||
|
if (number < 0 or number > std::numeric_limits<uint8_t>::max()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return static_cast<uint8_t>(number);
|
||||||
|
}
|
||||||
|
|
||||||
ReturnValue_t PersistentTmStore::assignAndOrCreateMostRecentFile() {
|
ReturnValue_t PersistentTmStore::assignAndOrCreateMostRecentFile() {
|
||||||
if (not activeFile.has_value()) {
|
if (not activeFile.has_value()) {
|
||||||
return createMostRecentFile(std::nullopt);
|
return createMostRecentFile(std::nullopt);
|
||||||
@ -271,12 +286,14 @@ ReturnValue_t PersistentTmStore::loadNextDumpFile() {
|
|||||||
tv.tv_sec = dumpIndex.epoch;
|
tv.tv_sec = dumpIndex.epoch;
|
||||||
size_t fullPathLength = 0;
|
size_t fullPathLength = 0;
|
||||||
createFileName(tv, dumpIndex.suffixIdx, fullPathLength);
|
createFileName(tv, dumpIndex.suffixIdx, fullPathLength);
|
||||||
path filePath(std::string(reinterpret_cast<const char*>(filePathBuf.data()), fullPathLength));
|
dumpParams.currentFile =
|
||||||
std::ifstream ifile(filePath, std::ios::binary);
|
path(std::string(reinterpret_cast<const char*>(filePathBuf.data()), fullPathLength));
|
||||||
|
std::ifstream ifile(dumpParams.currentFile, std::ios::binary);
|
||||||
if (ifile.bad()) {
|
if (ifile.bad()) {
|
||||||
sif::error << "PersistentTmStore: File is bad" << std::endl;
|
sif::error << "PersistentTmStore: File is bad" << std::endl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
sif::debug << baseName << " dump: Loading " << dumpParams.currentFile << std::endl;
|
||||||
ifile.read(reinterpret_cast<char*>(fileBuf.data()),
|
ifile.read(reinterpret_cast<char*>(fileBuf.data()),
|
||||||
static_cast<std::streamsize>(dumpParams.fileSize));
|
static_cast<std::streamsize>(dumpParams.fileSize));
|
||||||
// Increment iterator for next cycle.
|
// Increment iterator for next cycle.
|
||||||
@ -303,8 +320,8 @@ ReturnValue_t PersistentTmStore::getNextDumpPacket(PusTmReader& reader, bool& fi
|
|||||||
// Delete the file and load next. Could use better algorithm to partially
|
// Delete the file and load next. Could use better algorithm to partially
|
||||||
// restore the file dump, but for now do not trust the file.
|
// restore the file dump, but for now do not trust the file.
|
||||||
std::error_code e;
|
std::error_code e;
|
||||||
std::filesystem::remove(dumpParams.dirEntry.path().c_str(), e);
|
std::filesystem::remove(dumpParams.currentFile.c_str(), e);
|
||||||
if (dumpParams.dirEntry.path() == activeFile) {
|
if (dumpParams.currentFile == activeFile) {
|
||||||
activeFile == std::nullopt;
|
activeFile == std::nullopt;
|
||||||
assignAndOrCreateMostRecentFile();
|
assignAndOrCreateMostRecentFile();
|
||||||
}
|
}
|
||||||
|
@ -117,8 +117,7 @@ class PersistentTmStore : public TmStoreFrontendSimpleIF, public SystemObject {
|
|||||||
uint32_t fromUnixTime = 0;
|
uint32_t fromUnixTime = 0;
|
||||||
uint32_t untilUnixTime = 0;
|
uint32_t untilUnixTime = 0;
|
||||||
uint32_t currentFileUnixStamp = 0;
|
uint32_t currentFileUnixStamp = 0;
|
||||||
// std::filesystem::directory_iterator dirIter;
|
std::filesystem::path currentFile;
|
||||||
std::filesystem::directory_entry dirEntry;
|
|
||||||
std::set<DumpIndex> orderedDumpFilestamps{};
|
std::set<DumpIndex> orderedDumpFilestamps{};
|
||||||
std::set<DumpIndex>::iterator dumpIter;
|
std::set<DumpIndex>::iterator dumpIter;
|
||||||
size_t fileSize = 0;
|
size_t fileSize = 0;
|
||||||
@ -141,6 +140,7 @@ class PersistentTmStore : public TmStoreFrontendSimpleIF, public SystemObject {
|
|||||||
void fileToPackets(const std::filesystem::path& path, uint32_t unixStamp);
|
void fileToPackets(const std::filesystem::path& path, uint32_t unixStamp);
|
||||||
ReturnValue_t loadNextDumpFile();
|
ReturnValue_t loadNextDumpFile();
|
||||||
ReturnValue_t createFileName(timeval& tv, std::optional<uint8_t> suffix, size_t& fullPathLength);
|
ReturnValue_t createFileName(timeval& tv, std::optional<uint8_t> suffix, size_t& fullPathLength);
|
||||||
|
uint8_t extractSuffix(const std::string& pathStr);
|
||||||
bool updateBaseDir();
|
bool updateBaseDir();
|
||||||
ReturnValue_t assignAndOrCreateMostRecentFile();
|
ReturnValue_t assignAndOrCreateMostRecentFile();
|
||||||
};
|
};
|
||||||
|
@ -4,7 +4,7 @@ add_subdirectory(mocks)
|
|||||||
target_sources(${UNITTEST_NAME} PRIVATE
|
target_sources(${UNITTEST_NAME} PRIVATE
|
||||||
main.cpp
|
main.cpp
|
||||||
testEnvironment.cpp
|
testEnvironment.cpp
|
||||||
testStampInFilename.cpp
|
testGenericFilesystem.cpp
|
||||||
hdlcEncodingRw.cpp
|
hdlcEncodingRw.cpp
|
||||||
printChar.cpp
|
printChar.cpp
|
||||||
)
|
)
|
43
unittest/testGenericFilesystem.cpp
Normal file
43
unittest/testGenericFilesystem.cpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
#include <catch2/catch_test_macros.hpp>
|
||||||
|
#include <cinttypes>
|
||||||
|
|
||||||
|
#include "fsfw/timemanager/Clock.h"
|
||||||
|
|
||||||
|
uint8_t extractSuffix(const std::string& pathStr) {
|
||||||
|
std::string numberStr;
|
||||||
|
// Find the position of the dot at the end of the file path
|
||||||
|
size_t dotPos = pathStr.find_last_of('.');
|
||||||
|
if (dotPos != std::string::npos && dotPos < pathStr.length() - 1) {
|
||||||
|
// Extract the substring after the dot
|
||||||
|
numberStr = pathStr.substr(dotPos + 1);
|
||||||
|
}
|
||||||
|
int number = std::stoi(numberStr);
|
||||||
|
if (number < 0 or number > std::numeric_limits<uint8_t>::max()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return static_cast<uint8_t>(number);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Stamp in Filename", "[Stamp In Filename]") {
|
||||||
|
Clock::TimeOfDay_t tod;
|
||||||
|
std::string baseName = "verif";
|
||||||
|
std::string pathStr = "verif_2022-05-25T16:55:23Z.bin";
|
||||||
|
unsigned int underscorePos = pathStr.find_last_of('_');
|
||||||
|
std::string stampStr = pathStr.substr(underscorePos + 1);
|
||||||
|
float seconds = 0.0;
|
||||||
|
char* prefix = nullptr;
|
||||||
|
int count =
|
||||||
|
sscanf(stampStr.c_str(),
|
||||||
|
"%4" SCNu32 "-%2" SCNu32 "-%2" SCNu32 "T%2" SCNu32 ":%2" SCNu32 ":%2" SCNu32 "Z",
|
||||||
|
&tod.year, &tod.month, &tod.day, &tod.hour, &tod.minute, &tod.second);
|
||||||
|
static_cast<void>(count);
|
||||||
|
CHECK(count == 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Suffix Extraction") {
|
||||||
|
std::string pathStr = "/mnt/sd0/tm/hk/hk-some-stamp.bin.0";
|
||||||
|
CHECK(extractSuffix(pathStr) == 0);
|
||||||
|
pathStr = "/mnt/sd0/tm/hk/hk-some-stamp.bin.2";
|
||||||
|
CHECK(extractSuffix(pathStr) == 2);
|
||||||
|
}
|
@ -1,21 +0,0 @@
|
|||||||
|
|
||||||
#include <catch2/catch_test_macros.hpp>
|
|
||||||
#include <cinttypes>
|
|
||||||
|
|
||||||
#include "fsfw/timemanager/Clock.h"
|
|
||||||
|
|
||||||
TEST_CASE("Stamp in Filename", "[Stamp In Filename]") {
|
|
||||||
Clock::TimeOfDay_t tod;
|
|
||||||
std::string baseName = "verif";
|
|
||||||
std::string pathStr = "verif_2022-05-25T16:55:23Z.bin";
|
|
||||||
unsigned int underscorePos = pathStr.find_last_of('_');
|
|
||||||
std::string stampStr = pathStr.substr(underscorePos + 1);
|
|
||||||
float seconds = 0.0;
|
|
||||||
char* prefix = nullptr;
|
|
||||||
int count =
|
|
||||||
sscanf(stampStr.c_str(),
|
|
||||||
"%4" SCNu32 "-%2" SCNu32 "-%2" SCNu32 "T%2" SCNu32 ":%2" SCNu32 ":%2" SCNu32 "Z",
|
|
||||||
&tod.year, &tod.month, &tod.day, &tod.hour, &tod.minute, &tod.second);
|
|
||||||
static_cast<void>(count);
|
|
||||||
CHECK(count == 6);
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user