From 61620bfce783b73ac8a8fd69fd5841e0b8c3f043 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Tue, 7 Feb 2023 14:21:30 +0100 Subject: [PATCH] moved TCScheduling Service to use timeval internally --- src/fsfw/pus/Service11TelecommandScheduling.h | 3 +- .../pus/Service11TelecommandScheduling.tpp | 54 +++++++++++++------ 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/fsfw/pus/Service11TelecommandScheduling.h b/src/fsfw/pus/Service11TelecommandScheduling.h index 83b2b4c02..52997a562 100644 --- a/src/fsfw/pus/Service11TelecommandScheduling.h +++ b/src/fsfw/pus/Service11TelecommandScheduling.h @@ -91,7 +91,6 @@ class Service11TelecommandScheduling final : public PusServiceBase { private: struct TelecommandStruct { uint64_t requestId{}; - uint32_t seconds{}; store_address_t storeAddr; // uint16 }; @@ -114,7 +113,7 @@ class Service11TelecommandScheduling final : public PusServiceBase { * The telecommand map uses the exectution time as a Unix time stamp as * the key. This is mapped to a generic telecommand struct. */ - using TelecommandMap = etl::multimap; + using TelecommandMap = etl::multimap; using TcMapIter = typename TelecommandMap::iterator; TelecommandMap telecommandMap; diff --git a/src/fsfw/pus/Service11TelecommandScheduling.tpp b/src/fsfw/pus/Service11TelecommandScheduling.tpp index 540f6c689..b6c2f7310 100644 --- a/src/fsfw/pus/Service11TelecommandScheduling.tpp +++ b/src/fsfw/pus/Service11TelecommandScheduling.tpp @@ -2,6 +2,8 @@ #include +#include "fsfw/globalfunctions/CRC.h" +#include "fsfw/globalfunctions/timevalOperations.h" #include "fsfw/objectmanager/ObjectManager.h" #include "fsfw/serialize/SerializeAdapter.h" #include "fsfw/serviceinterface.h" @@ -150,17 +152,22 @@ inline ReturnValue_t Service11TelecommandScheduling::handleResetCom template inline ReturnValue_t Service11TelecommandScheduling::doInsertActivity( const uint8_t *data, size_t size) { - uint32_t timestamp = 0; - ReturnValue_t result = SerializeAdapter::deSerialize(×tamp, &data, &size, DEF_END); + uint32_t seconds = 0; + ReturnValue_t result = SerializeAdapter::deSerialize(&seconds, &data, &size, DEF_END); if (result != returnvalue::OK) { return result; } + timeval scheduledTime; + scheduledTime.tv_sec = seconds; + scheduledTime.tv_usec = 0; // Insert possible if sched. time is above margin // (See requirement for Time margin) timeval tNow = {}; Clock::getClock_timeval(&tNow); - if (timestamp - tNow.tv_sec <= RELEASE_TIME_MARGIN_SECONDS) { + timeval timeDifference = scheduledTime - tNow; + // round subseconds up + if (timeDifference.tv_sec + 1 <= RELEASE_TIME_MARGIN_SECONDS) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::warning << "Service11TelecommandScheduling::doInsertActivity: Release time too close to " "current time" @@ -197,11 +204,10 @@ inline ReturnValue_t Service11TelecommandScheduling::doInsertActivi // insert into multimap with new store address TelecommandStruct tc; - tc.seconds = timestamp; tc.storeAddr = addr; tc.requestId = getRequestIdFromTc(); // TODO: Missing sanity check of the returned request id - auto it = telecommandMap.insert(std::pair(timestamp, tc)); + auto it = telecommandMap.insert(std::pair(scheduledTime, tc)); if (it == telecommandMap.end()) { return returnvalue::FAILED; } @@ -391,7 +397,8 @@ inline ReturnValue_t Service11TelecommandScheduling::doTimeshiftAct // temporarily hold the item TelecommandStruct tempTc(tcToTimeshiftIt->second); - uint32_t tempKey = tcToTimeshiftIt->first + relativeTime; + timeval tempKey = tcToTimeshiftIt->first; + tempKey.tv_sec += relativeTime; // delete old entry from the mm telecommandMap.erase(tcToTimeshiftIt); @@ -436,7 +443,8 @@ inline ReturnValue_t Service11TelecommandScheduling::doFilterTimesh for (auto it = itBegin; it != itEnd;) { // temporarily hold the item TelecommandStruct tempTc(it->second); - uint32_t tempKey = it->first + relativeTime; + timeval tempKey = it->first; + tempKey.tv_sec += relativeTime; // delete the old entry from the mm telecommandMap.erase(it++); @@ -533,12 +541,16 @@ inline ReturnValue_t Service11TelecommandScheduling::getMapFilterFr } case TypeOfTimeWindow::FROM_TIMETAG: { - uint32_t fromTimestamp = 0; - result = SerializeAdapter::deSerialize(&fromTimestamp, &data, &dataSize, DEF_END); + uint32_t fromSeconds = 0; + result = SerializeAdapter::deSerialize(&fromSeconds, &data, &dataSize, DEF_END); if (result != returnvalue::OK) { return result; } + timeval fromTimestamp; + fromTimestamp.tv_sec = fromSeconds; + fromTimestamp.tv_usec = 0; + itBegin = telecommandMap.begin(); while (itBegin->first < fromTimestamp && itBegin != telecommandMap.end()) { itBegin++; @@ -549,11 +561,15 @@ inline ReturnValue_t Service11TelecommandScheduling::getMapFilterFr } case TypeOfTimeWindow::TO_TIMETAG: { - uint32_t toTimestamp; - result = SerializeAdapter::deSerialize(&toTimestamp, &data, &dataSize, DEF_END); + uint32_t toSeconds = 0; + result = SerializeAdapter::deSerialize(&toSeconds, &data, &dataSize, DEF_END); if (result != returnvalue::OK) { return result; } + timeval toTimestamp; + toTimestamp.tv_sec = toSeconds; + toTimestamp.tv_usec = 0; + itBegin = telecommandMap.begin(); itEnd = telecommandMap.begin(); while (itEnd->first <= toTimestamp && itEnd != telecommandMap.end()) { @@ -563,19 +579,27 @@ inline ReturnValue_t Service11TelecommandScheduling::getMapFilterFr } case TypeOfTimeWindow::FROM_TIMETAG_TO_TIMETAG: { - uint32_t fromTimestamp; - uint32_t toTimestamp; + uint32_t fromSeconds = 0; + uint32_t toSeconds = 0; - result = SerializeAdapter::deSerialize(&fromTimestamp, &data, &dataSize, + result = SerializeAdapter::deSerialize(&fromSeconds, &data, &dataSize, SerializeIF::Endianness::BIG); if (result != returnvalue::OK) { return result; } - result = SerializeAdapter::deSerialize(&toTimestamp, &data, &dataSize, + result = SerializeAdapter::deSerialize(&toSeconds, &data, &dataSize, SerializeIF::Endianness::BIG); if (result != returnvalue::OK) { return result; } + timeval fromTimestamp; + fromTimestamp.tv_sec = fromSeconds; + fromTimestamp.tv_usec = 0; + timeval toTimestamp; + toTimestamp.tv_sec = toSeconds; + toTimestamp.tv_usec = 0; + + if (fromTimestamp > toTimestamp) { return INVALID_TIME_WINDOW; }