ACS system updates #441
13
CHANGELOG.md
13
CHANGELOG.md
@ -16,14 +16,19 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Persistent TM stores will now create new files on each reboot.
|
||||||
|
- Fast ACS subsystem commanding: Command SUS board consecutively with other devices now
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
|
|
||||||
- Allow arbitrary submodes for dual lane boards to avoid FDIR reactions of subsystem components.
|
- Allow arbitrary submodes for dual lane boards to avoid FDIR reactions of subsystem components.
|
||||||
Bump FSFW to allow this.
|
Bump FSFW to allow this.
|
||||||
|
- PUS 15 was not scheduled
|
||||||
## Changed
|
- Transmitter timeout set to 2 minutes instead of 15 minutes. This will prevent to discharge the battery
|
||||||
|
in case the syrlinks starts transmitting due to detection of unintentional bitlock. This happened e.g. on ground
|
||||||
- Fast ACS subsystem commanding: Command SUS board consecutively with other devices now
|
when the uplink to the flying latop was established.
|
||||||
|
|
||||||
# [v1.35.1] 2023-03-04
|
# [v1.35.1] 2023-03-04
|
||||||
|
|
||||||
|
@ -77,6 +77,7 @@ void CoreController::performControlOperation() {
|
|||||||
#if OBSW_THREAD_TRACING == 1
|
#if OBSW_THREAD_TRACING == 1
|
||||||
trace::threadTrace(opCounter, "CORE CTRL");
|
trace::threadTrace(opCounter, "CORE CTRL");
|
||||||
#endif
|
#endif
|
||||||
|
Stopwatch watch;
|
||||||
EventMessage event;
|
EventMessage event;
|
||||||
for (ReturnValue_t result = eventQueue->receiveMessage(&event); result == returnvalue::OK;
|
for (ReturnValue_t result = eventQueue->receiveMessage(&event); result == returnvalue::OK;
|
||||||
result = eventQueue->receiveMessage(&event)) {
|
result = eventQueue->receiveMessage(&event)) {
|
||||||
|
@ -527,6 +527,10 @@ void scheduling::createPusTasks(TaskFactory& factory, TaskDeadlineMissedFunction
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_8", objects::PUS_SERVICE_8_FUNCTION_MGMT);
|
scheduling::printAddObjectError("PUS_8", objects::PUS_SERVICE_8_FUNCTION_MGMT);
|
||||||
}
|
}
|
||||||
|
result = pusMedPrio->addComponent(objects::PUS_SERVICE_15_TM_STORAGE);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("PUS_15", objects::PUS_SERVICE_15_TM_STORAGE);
|
||||||
|
}
|
||||||
result = pusMedPrio->addComponent(objects::PUS_SERVICE_11_TC_SCHEDULER);
|
result = pusMedPrio->addComponent(objects::PUS_SERVICE_11_TC_SCHEDULER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_11", objects::PUS_SERVICE_11_TC_SCHEDULER);
|
scheduling::printAddObjectError("PUS_11", objects::PUS_SERVICE_11_TC_SCHEDULER);
|
||||||
|
@ -11,8 +11,9 @@ extern ComSubsystem SUBSYSTEM;
|
|||||||
|
|
||||||
// The syrlinks must not transmitting longer then 15 minutes otherwise the
|
// The syrlinks must not transmitting longer then 15 minutes otherwise the
|
||||||
// transceiver might be damaged due to overheating
|
// transceiver might be damaged due to overheating
|
||||||
// 15 minutes in milliseconds
|
// This is the initial timeout of 2 minutes. The timeout needs to be incremented
|
||||||
static const uint32_t TRANSMITTER_TIMEOUT = 900000;
|
// before each overpass
|
||||||
|
static const uint32_t TRANSMITTER_TIMEOUT = 120000;
|
||||||
|
|
||||||
Subsystem& init();
|
Subsystem& init();
|
||||||
} // namespace com
|
} // namespace com
|
||||||
|
@ -28,35 +28,6 @@ PersistentTmStore::PersistentTmStore(object_id_t objectId, const char* baseDir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t PersistentTmStore::assignAndOrCreateMostRecentFile() {
|
ReturnValue_t PersistentTmStore::assignAndOrCreateMostRecentFile() {
|
||||||
using namespace std::filesystem;
|
|
||||||
for (auto const& file : directory_iterator(basePath)) {
|
|
||||||
if (file.is_directory()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
auto pathStr = file.path().string();
|
|
||||||
if (pathStr.find(baseName) == std::string::npos) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
unsigned int underscorePos = pathStr.find_last_of('_');
|
|
||||||
std::string stampStr = pathStr.substr(underscorePos + 1);
|
|
||||||
struct tm time {};
|
|
||||||
if (nullptr == strptime(stampStr.c_str(), FILE_DATE_FORMAT, &time)) {
|
|
||||||
sif::error << "PersistentTmStore::assignOrCreateMostRecentFile: Error reading timestamp"
|
|
||||||
<< std::endl;
|
|
||||||
// Delete the file and re-create it.
|
|
||||||
activeFile = std::nullopt;
|
|
||||||
std::filesystem::remove(file.path());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
time_t fileEpoch = timegm(&time);
|
|
||||||
// There is still a file within the active time window, so re-use that file for new TMs to
|
|
||||||
// store.
|
|
||||||
if (fileEpoch + static_cast<time_t>(rolloverDiffSeconds) > currentTv.tv_sec) {
|
|
||||||
activeFileTv.tv_sec = fileEpoch;
|
|
||||||
activeFile = file.path();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (not activeFile.has_value()) {
|
if (not activeFile.has_value()) {
|
||||||
return createMostRecentFile(std::nullopt);
|
return createMostRecentFile(std::nullopt);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user