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