From 2521cec78a018f1f6741603f6c1456d893194315 Mon Sep 17 00:00:00 2001 From: pavlidic <pavlidic@ece.auth.gr> Date: Sun, 1 Jan 2023 19:40:17 +0000 Subject: [PATCH] Separate TC/TM handling --- .idea/vcs.xml | 2 - inc/Services/TimeBasedSchedulingService.hpp | 18 ++++ src/Services/TimeBasedSchedulingService.cpp | 33 ++++--- .../TimeBasedSchedulingServiceTests.cpp | 98 +++++++++++++++++++ 4 files changed, 133 insertions(+), 18 deletions(-) diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 72b50578..388f330c 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -3,10 +3,8 @@ <component name="VcsDirectoryMappings"> <mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="$PROJECT_DIR$/ci/page_style/doxygen_dark_theme" vcs="Git" /> - <mapping directory="$PROJECT_DIR$/doxygen-awesome-css" vcs="Git" /> <mapping directory="$PROJECT_DIR$/lib/Catch2" vcs="Git" /> <mapping directory="$PROJECT_DIR$/lib/etl" vcs="Git" /> <mapping directory="$PROJECT_DIR$/lib/logger" vcs="Git" /> - <mapping directory="$PROJECT_DIR$/lib/logger/lib/etl" vcs="Git" /> </component> </project> \ No newline at end of file diff --git a/inc/Services/TimeBasedSchedulingService.hpp b/inc/Services/TimeBasedSchedulingService.hpp index ad68b795..c0d5c3b6 100644 --- a/inc/Services/TimeBasedSchedulingService.hpp +++ b/inc/Services/TimeBasedSchedulingService.hpp @@ -217,6 +217,15 @@ public: */ void detailReportAllActivities(Message& request); + /** + * @brief TM[11,10] time-based schedule detail report + * + * @details Send a detailed report about the status of the activities listed + * on the provided list. Generates a TM[11,10] response. + * @param listOfActivities Provide the list of activities that need to be reported on + */ + void timeBasedScheduleDetailReport(const etl::list<ScheduledActivity, ECSSMaxNumberOfTimeSchedActivities>& listOfActivities); + /** * @brief TC[11,9] detail-report activities identified by request identifier * @@ -244,6 +253,15 @@ public: */ void summaryReportActivitiesByID(Message& request); + /** + * @brief TM[11,13] time-based schedule summary report + * + * @details Send a summary report about the status of the activities listed + * on the provided list. Generates a TM[11,13] response. + * @param listOfActivities Provide the list of activities that need to be reported on + */ + void timeBasedScheduleSummaryReport(const etl::list<ScheduledActivity, ECSSMaxNumberOfTimeSchedActivities>& listOfActivities); + /** * @brief TC[11,5] delete time-based scheduled activities identified by a request identifier * diff --git a/src/Services/TimeBasedSchedulingService.cpp b/src/Services/TimeBasedSchedulingService.cpp index 811334b9..3af929af 100644 --- a/src/Services/TimeBasedSchedulingService.cpp +++ b/src/Services/TimeBasedSchedulingService.cpp @@ -151,13 +151,16 @@ void TimeBasedSchedulingService::deleteActivitiesByID(Message& request) { void TimeBasedSchedulingService::detailReportAllActivities(Message& request) { request.assertTC(TimeBasedSchedulingService::ServiceType, TimeBasedSchedulingService::MessageType::DetailReportAllScheduledActivities); - Message report = createTM(TimeBasedSchedulingService::MessageType::TimeBasedScheduleReportById); - report.appendUint16(static_cast<uint16_t>(scheduledActivities.size())); + timeBasedScheduleDetailReport(scheduledActivities); +} - for (auto& activity: scheduledActivities) { - // todo: append sub-schedule and group ID if they are defined +void TimeBasedSchedulingService::timeBasedScheduleDetailReport(const etl::list<ScheduledActivity, ECSSMaxNumberOfTimeSchedActivities>& listOfActivities) { + // todo: append sub-schedule and group ID if they are defined + Message report = createTM(TimeBasedSchedulingService::MessageType::TimeBasedScheduleReportById); + report.appendUint16(static_cast<uint16_t>(listOfActivities.size())); - report.appendDefaultCUCTimeStamp(activity.requestReleaseTime); + for (const auto& activity: listOfActivities) { + report.appendDefaultCUCTimeStamp(activity.requestReleaseTime); // todo: Replace with the time parser report.appendString(MessageParser::composeECSS(activity.request)); } storeMessage(report); @@ -166,7 +169,6 @@ void TimeBasedSchedulingService::detailReportAllActivities(Message& request) { void TimeBasedSchedulingService::detailReportActivitiesByID(Message& request) { request.assertTC(TimeBasedSchedulingService::ServiceType, TimeBasedSchedulingService::MessageType::DetailReportActivitiesById); - Message report = createTM(TimeBasedSchedulingService::MessageType::TimeBasedScheduleReportById); etl::list<ScheduledActivity, ECSSMaxNumberOfTimeSchedActivities> matchedActivities; uint16_t iterationCount = request.readUint16(); @@ -190,19 +192,12 @@ void TimeBasedSchedulingService::detailReportActivitiesByID(Message& request) { sortActivitiesReleaseTime(matchedActivities); - // todo: append sub-schedule and group ID if they are defined - report.appendUint16(static_cast<uint16_t>(matchedActivities.size())); - for (auto& match: matchedActivities) { - report.appendDefaultCUCTimeStamp(match.requestReleaseTime); // todo: Replace with the time parser - report.appendString(MessageParser::composeECSS(match.request)); - } - storeMessage(report); + timeBasedScheduleDetailReport(matchedActivities); } void TimeBasedSchedulingService::summaryReportActivitiesByID(Message& request) { request.assertTC(TimeBasedSchedulingService::ServiceType, TimeBasedSchedulingService::MessageType::ActivitiesSummaryReportById); - Message report = createTM(TimeBasedSchedulingService::MessageType::TimeBasedScheduledSummaryReport); etl::list<ScheduledActivity, ECSSMaxNumberOfTimeSchedActivities> matchedActivities; uint16_t iterationCount = request.readUint16(); @@ -225,9 +220,15 @@ void TimeBasedSchedulingService::summaryReportActivitiesByID(Message& request) { } sortActivitiesReleaseTime(matchedActivities); + timeBasedScheduleSummaryReport(matchedActivities); +} + +void TimeBasedSchedulingService::timeBasedScheduleSummaryReport(const etl::list<ScheduledActivity, ECSSMaxNumberOfTimeSchedActivities>& listOfActivities) { + Message report = createTM(TimeBasedSchedulingService::MessageType::TimeBasedScheduledSummaryReport); + // todo: append sub-schedule and group ID if they are defined - report.appendUint16(static_cast<uint16_t>(matchedActivities.size())); - for (auto& match: matchedActivities) { + report.appendUint16(static_cast<uint16_t>(listOfActivities.size())); + for (const auto& match: listOfActivities) { // todo: append sub-schedule and group ID if they are defined report.appendDefaultCUCTimeStamp(match.requestReleaseTime); report.appendUint8(match.requestID.sourceID); diff --git a/test/Services/TimeBasedSchedulingServiceTests.cpp b/test/Services/TimeBasedSchedulingServiceTests.cpp index 52dadcee..a48361e9 100644 --- a/test/Services/TimeBasedSchedulingServiceTests.cpp +++ b/test/Services/TimeBasedSchedulingServiceTests.cpp @@ -340,6 +340,54 @@ TEST_CASE("TC[11,9] Detail report scheduled activities by ID", "[service][st11]" } } +TEST_CASE("TM[11,10] time-based schedule detail report", "[service][st11]") { + Services.reset(); + Message receivedMessage(TimeBasedSchedulingService::ServiceType, TimeBasedSchedulingService::MessageType::DetailReportActivitiesById, Message::TC, 1); + + auto scheduledActivities = activityInsertion(timeBasedService); + + SECTION("Detailed activity report") { + // Verify that everything is in place + CHECK(scheduledActivities.size() == 4); + scheduledActivities.at(0)->requestID.applicationID = 8; // Append a dummy application ID + scheduledActivities.at(2)->requestID.applicationID = 4; // Append a dummy application ID + + receivedMessage.appendUint16(2); // Two instructions in the request + receivedMessage.appendUint8(0); // Source ID is not implemented + receivedMessage.appendUint16(testMessage2.applicationId); // todo: Remove the dummy app ID + receivedMessage.appendUint16(0); // todo: Remove the dummy sequence count + + receivedMessage.appendUint8(0); // Source ID is not implemented + receivedMessage.appendUint16(testMessage1.applicationId); // todo: Remove the dummy app ID + receivedMessage.appendUint16(0); // todo: Remove the dummy sequence count + + timeBasedService.detailReportActivitiesByID(receivedMessage); + REQUIRE(ServiceTests::hasOneMessage()); + + Message response = ServiceTests::get(0); + CHECK(response.serviceType == 11); + CHECK(response.messageType == 10); + + uint16_t iterationCount = response.readUint16(); + CHECK(iterationCount == 2); + for (uint16_t i = 0; i < iterationCount; i++) { + Time::DefaultCUC receivedReleaseTime = response.readDefaultCUCTimeStamp(); + + Message receivedTCPacket; + uint8_t receivedDataStr[ECSSTCRequestStringSize]; + response.readString(receivedDataStr, ECSSTCRequestStringSize); + receivedTCPacket = MessageParser::parseECSSTC(receivedDataStr); + if (i == 0) { + REQUIRE(receivedReleaseTime == scheduledActivities.at(0)->requestReleaseTime); + REQUIRE(receivedTCPacket == scheduledActivities.at(0)->request); + } else { + REQUIRE(receivedReleaseTime == scheduledActivities.at(2)->requestReleaseTime); + REQUIRE(receivedTCPacket == scheduledActivities.at(2)->request); + } + } + } +} + TEST_CASE("TC[11,12] Summary report scheduled activities by ID", "[service][st11]") { Services.reset(); Message receivedMessage(TimeBasedSchedulingService::ServiceType, TimeBasedSchedulingService::MessageType::ActivitiesSummaryReportById, Message::TC, 1); @@ -400,6 +448,56 @@ TEST_CASE("TC[11,12] Summary report scheduled activities by ID", "[service][st11 } } +TEST_CASE("TM[11,13] time-based schedule summary report", "[service][st11]") { + Services.reset(); + Message receivedMessage(TimeBasedSchedulingService::ServiceType, TimeBasedSchedulingService::MessageType::ActivitiesSummaryReportById, Message::TC, 1); + + auto scheduledActivities = activityInsertion(timeBasedService); + + SECTION("Summary report") { + // Verify that everything is in place + CHECK(scheduledActivities.size() == 4); + scheduledActivities.at(0)->requestID.applicationID = 8; // Append a dummy application ID + scheduledActivities.at(2)->requestID.applicationID = 4; // Append a dummy application ID + + receivedMessage.appendUint16(2); // Two instructions in the request + receivedMessage.appendUint8(0); // Source ID is not implemented + receivedMessage.appendUint16(testMessage2.applicationId); // todo: Remove the dummy app ID + receivedMessage.appendUint16(0); // todo: Remove the dummy sequence count + + receivedMessage.appendUint8(0); // Source ID is not implemented + receivedMessage.appendUint16(testMessage1.applicationId); // todo: Remove the dummy app ID + receivedMessage.appendUint16(0); // todo: Remove the dummy sequence count + + timeBasedService.summaryReportActivitiesByID(receivedMessage); + REQUIRE(ServiceTests::hasOneMessage()); + + Message response = ServiceTests::get(0); + CHECK(response.serviceType == 11); + CHECK(response.messageType == 13); + + uint16_t iterationCount = response.readUint16(); + for (uint16_t i = 0; i < iterationCount; i++) { + Time::DefaultCUC receivedReleaseTime = response.readDefaultCUCTimeStamp(); + uint8_t receivedSourceID = response.readUint8(); + uint16_t receivedApplicationID = response.readUint16(); + uint16_t receivedSequenceCount = response.readUint16(); + + if (i == 0) { + REQUIRE(receivedReleaseTime == scheduledActivities.at(0)->requestReleaseTime); + REQUIRE(receivedSourceID == scheduledActivities.at(0)->requestID.sourceID); + REQUIRE(receivedApplicationID == scheduledActivities.at(0)->requestID.applicationID); + REQUIRE(receivedSequenceCount == scheduledActivities.at(0)->requestID.sequenceCount); + } else { + REQUIRE(receivedReleaseTime == scheduledActivities.at(2)->requestReleaseTime); + REQUIRE(receivedSourceID == scheduledActivities.at(2)->requestID.sourceID); + REQUIRE(receivedApplicationID == scheduledActivities.at(2)->requestID.applicationID); + REQUIRE(receivedSequenceCount == scheduledActivities.at(2)->requestID.sequenceCount); + } + } + } +} + TEST_CASE("TC[11,16] Detail report all scheduled activities", "[service][st11]") { Services.reset(); auto scheduledActivities = activityInsertion(timeBasedService); -- GitLab