diff --git a/Sts1CobcSw/CommandParser.cpp b/Sts1CobcSw/CommandParser.cpp index 9b6d434a..45fe5212 100644 --- a/Sts1CobcSw/CommandParser.cpp +++ b/Sts1CobcSw/CommandParser.cpp @@ -88,8 +88,7 @@ auto ParseAndAddQueueEntries(std::span queueEntries) -> void Deserialize(queueEntries.first>()); RODOS::PRINTF("Prog ID : %" PRIu16 "\n", entry.programId); - RODOS::PRINTF("Queue ID : %" PRIu16 "\n", entry.queueId); - RODOS::PRINTF("Start Time : %" PRIu32 "\n", entry.startTime); + RODOS::PRINTF("Start Time : %" PRIi32 "\n", entry.startTime); RODOS::PRINTF("Timeout : %" PRIi16 "\n", entry.timeout); edu::programQueue.push_back(entry); diff --git a/Sts1CobcSw/Edu/Edu.cpp b/Sts1CobcSw/Edu/Edu.cpp index 8a2d63c4..548f10f6 100644 --- a/Sts1CobcSw/Edu/Edu.cpp +++ b/Sts1CobcSw/Edu/Edu.cpp @@ -9,6 +9,7 @@ #include #include +#include #include @@ -115,7 +116,7 @@ auto StoreArchive([[maybe_unused]] StoreArchiveData const & data) -> std::int32_ //! -> [DATA] //! -> [Command Header] //! -> [Program ID] -//! -> [Queue ID] +//! -> [Start Time] //! -> [Timeout] //! <- [N/ACK] //! <- [N/ACK] @@ -124,15 +125,15 @@ auto StoreArchive([[maybe_unused]] StoreArchiveData const & data) -> std::int32_ //! the second N/ACK confirms that the program has been started. //! //! @param programId The student program ID -//! @param queueId The student program queue ID +//! @param startTime The student program start time //! @param timeout The available execution time for the student program //! //! @returns A relevant error code auto ExecuteProgram(ExecuteProgramData const & data) -> ErrorCode { - RODOS::PRINTF("ExecuteProgram(programId = %d, queueId = %d, timeout = %d)\n", + RODOS::PRINTF("ExecuteProgram(programId = %d, startTime = %" PRIi32 ", timeout = %d)\n", data.programId, - data.queueId, + data.startTime, data.timeout); // Check if data command was successful auto serialData = Serialize(data); @@ -243,12 +244,12 @@ auto GetStatus() -> Status } while(errorCount++ < maxNNackRetries); RODOS::PRINTF( - " .statusType = %d\n .errorCode = %d\n .programId = %d\n .queueId = %d\n exitCode = " - "%d\n", + " .statusType = %d\n .errorCode = %d\n .programId = %d\n .startTime = %" PRIi32 + "\n exitCode = %d\n", static_cast(status.statusType), static_cast(status.errorCode), status.programId, - status.queueId, + status.startTime, status.exitCode); return status; } @@ -304,7 +305,7 @@ auto GetStatusCommunication() -> Status return Status{.statusType = StatusType::noEvent, .programId = 0, - .queueId = 0, + .startTime = 0, .exitCode = 0, .errorCode = ErrorCode::success}; } @@ -338,7 +339,7 @@ auto GetStatusCommunication() -> Status auto programFinishedData = Deserialize(dataBuffer); return Status{.statusType = StatusType::programFinished, .programId = programFinishedData.programId, - .queueId = programFinishedData.queueId, + .startTime = programFinishedData.startTime, .exitCode = programFinishedData.exitCode, .errorCode = ErrorCode::success}; } @@ -370,7 +371,7 @@ auto GetStatusCommunication() -> Status auto resultsReadyData = Deserialize(dataBuffer); return Status{.statusType = StatusType::resultsReady, .programId = resultsReadyData.programId, - .queueId = resultsReadyData.queueId, + .startTime = resultsReadyData.startTime, .errorCode = ErrorCode::success}; } @@ -536,14 +537,14 @@ auto ReturnResultCommunication() -> ResultInfo //! Update Time: //! -> [DATA] //! -> [Command Header] -//! -> [Timestamp] +//! -> [Current Time] //! <- [N/ACK] //! <- [N/ACK] //! //! The first N/ACK confirms a valid data packet, //! the second N/ACK confirms the time update. //! -//! @param timestamp A unix timestamp +//! @param currentTime A unix timestamp //! //! @returns A relevant error code auto UpdateTime(UpdateTimeData const & data) -> ErrorCode diff --git a/Sts1CobcSw/Edu/EduMock.cpp b/Sts1CobcSw/Edu/EduMock.cpp index 534faf48..74bee4fe 100644 --- a/Sts1CobcSw/Edu/EduMock.cpp +++ b/Sts1CobcSw/Edu/EduMock.cpp @@ -1,6 +1,8 @@ #include #include +#include + namespace sts1cobcsw { @@ -62,9 +64,9 @@ auto StoreArchive(StoreArchiveData const & data) -> std::int32_t auto ExecuteProgram(ExecuteProgramData const & data) -> ErrorCode { PrintFormattedSystemUtc(); - PRINTF("Call to ExecuteProgram(programId = %d, queueId = %d, timeout = %d)\n", + PRINTF("Call to ExecuteProgram(programId = %d, startTime = %" PRIi32 ", timeout = %d)\n", data.programId, - data.queueId, + data.startTime, data.timeout); return ErrorCode::success; } @@ -86,7 +88,7 @@ auto GetStatus() -> Status PRINTF("Call to GetStatus()\n"); return {.statusType = StatusType::invalid, .programId = 0, - .queueId = 0, + .startTime = 0, .exitCode = 0, .errorCode = ErrorCode::success}; } @@ -96,7 +98,7 @@ auto GetStatus() -> Status auto UpdateTime(UpdateTimeData const & data) -> ErrorCode { PrintFormattedSystemUtc(); - PRINTF("Call to UpdateTime(timestamp = %d)\n", data.timestamp); + PRINTF("Call to UpdateTime(currentTime = %" PRIi32 ")\n", data.currentTime); return ErrorCode::success; } diff --git a/Sts1CobcSw/Edu/ProgramQueue.cpp b/Sts1CobcSw/Edu/ProgramQueue.cpp index bea242a8..2313f796 100644 --- a/Sts1CobcSw/Edu/ProgramQueue.cpp +++ b/Sts1CobcSw/Edu/ProgramQueue.cpp @@ -18,7 +18,6 @@ template auto DeserializeFrom(void const * source, QueueEntry * data) -> void const * { source = DeserializeFrom(source, &(data->programId)); - source = DeserializeFrom(source, &(data->queueId)); source = DeserializeFrom(source, &(data->startTime)); source = DeserializeFrom(source, &(data->timeout)); return source; @@ -33,7 +32,6 @@ template auto SerializeTo(void * destination, QueueEntry const & data) -> void * { destination = SerializeTo(destination, data.programId); - destination = SerializeTo(destination, data.queueId); destination = SerializeTo(destination, data.startTime); destination = SerializeTo(destination, data.timeout); return destination; diff --git a/Sts1CobcSw/Edu/ProgramQueue.hpp b/Sts1CobcSw/Edu/ProgramQueue.hpp index c2bb4f9f..3440328a 100644 --- a/Sts1CobcSw/Edu/ProgramQueue.hpp +++ b/Sts1CobcSw/Edu/ProgramQueue.hpp @@ -23,7 +23,6 @@ namespace edu struct QueueEntry { std::uint16_t programId = 0; - std::uint16_t queueId = 0; std::int32_t startTime = 0; std::int16_t timeout = 0; }; @@ -33,7 +32,6 @@ struct QueueEntry template<> inline constexpr std::size_t serialSize = totalSerialSize; diff --git a/Sts1CobcSw/Edu/ProgramStatusHistory.cpp b/Sts1CobcSw/Edu/ProgramStatusHistory.cpp index 37b82b21..925f4e27 100644 --- a/Sts1CobcSw/Edu/ProgramStatusHistory.cpp +++ b/Sts1CobcSw/Edu/ProgramStatusHistory.cpp @@ -9,7 +9,7 @@ RODOS::RingBuffer programSt auto UpdateProgramStatusHistory(std::uint16_t programId, - std::uint16_t queueId, + std::int32_t startTime, ProgramStatus newStatus) -> void { // TODO: Check that there is only one entry matching program/queue ID, or should it be the case @@ -17,7 +17,7 @@ auto UpdateProgramStatusHistory(std::uint16_t programId, for(std::uint32_t i = 0; i < programStatusHistory.occupiedCnt; ++i) { - if(programStatusHistory.vals[i].queueId == queueId + if(programStatusHistory.vals[i].startTime == startTime and programStatusHistory.vals[i].programId == programId) { programStatusHistory.vals[i].status = newStatus; diff --git a/Sts1CobcSw/Edu/ProgramStatusHistory.hpp b/Sts1CobcSw/Edu/ProgramStatusHistory.hpp index a6b7a7c8..01ca465c 100644 --- a/Sts1CobcSw/Edu/ProgramStatusHistory.hpp +++ b/Sts1CobcSw/Edu/ProgramStatusHistory.hpp @@ -26,7 +26,7 @@ enum class ProgramStatus : std::uint8_t struct ProgramStatusHistoryEntry { std::uint16_t programId = 0; - std::uint16_t queueId = 0; + std::int32_t startTime = 0; ProgramStatus status = ProgramStatus::programRunning; }; @@ -38,6 +38,6 @@ extern RODOS::RingBuffer pr auto UpdateProgramStatusHistory(std::uint16_t programId, - std::uint16_t queueId, + std::int32_t startTime, ProgramStatus newStatus) -> void; } diff --git a/Sts1CobcSw/Edu/Structs.hpp b/Sts1CobcSw/Edu/Structs.hpp index 408bc305..fe4ff2a2 100644 --- a/Sts1CobcSw/Edu/Structs.hpp +++ b/Sts1CobcSw/Edu/Structs.hpp @@ -38,7 +38,7 @@ struct ExecuteProgramData { static constexpr auto id = executeProgramId; std::uint16_t programId; - std::uint16_t queueId; + std::int32_t startTime; std::int16_t timeout; }; @@ -46,7 +46,7 @@ struct ExecuteProgramData struct UpdateTimeData { static constexpr auto id = updateTimeId; - std::int32_t timestamp; + std::int32_t currentTime; }; @@ -54,7 +54,7 @@ struct Status { StatusType statusType = StatusType::invalid; std::uint16_t programId = 0; - std::uint16_t queueId = 0; + std::int32_t startTime = 0; std::uint8_t exitCode = 0; ErrorCode errorCode = ErrorCode::noErrorCodeSet; }; @@ -63,14 +63,14 @@ struct Status struct ResultsReadyStatus { std::uint16_t programId; - std::uint16_t queueId; + std::int32_t startTime; }; struct ProgramFinishedStatus { std::uint16_t programId; - std::uint16_t queueId; + std::int32_t startTime; std::uint8_t exitCode; }; @@ -90,13 +90,13 @@ inline constexpr std::size_t serialSize = template<> inline constexpr std::size_t serialSize = totalSerialSize; template<> inline constexpr std::size_t serialSize = totalSerialSize; + decltype(edu::ResultsReadyStatus::startTime)>; template<> inline constexpr std::size_t serialSize = @@ -107,12 +107,12 @@ template<> inline constexpr std::size_t serialSize = totalSerialSize; template<> inline constexpr std::size_t serialSize = - totalSerialSize; + totalSerialSize; namespace edu diff --git a/Sts1CobcSw/Edu/Structs.ipp b/Sts1CobcSw/Edu/Structs.ipp index 7f6d8d57..8c99a2d1 100644 --- a/Sts1CobcSw/Edu/Structs.ipp +++ b/Sts1CobcSw/Edu/Structs.ipp @@ -23,7 +23,7 @@ template auto DeserializeFrom(void const * source, ProgramFinishedStatus * data) -> void const * { source = DeserializeFrom(source, &(data->programId)); - source = DeserializeFrom(source, &(data->queueId)); + source = DeserializeFrom(source, &(data->startTime)); source = DeserializeFrom(source, &(data->exitCode)); return source; } @@ -33,7 +33,7 @@ template auto DeserializeFrom(void const * source, ResultsReadyStatus * data) -> void const * { source = DeserializeFrom(source, &(data->programId)); - source = DeserializeFrom(source, &(data->queueId)); + source = DeserializeFrom(source, &(data->startTime)); return source; } @@ -52,7 +52,7 @@ auto SerializeTo(void * destination, ExecuteProgramData const & data) -> void * { destination = SerializeTo(destination, ExecuteProgramData::id); destination = SerializeTo(destination, data.programId); - destination = SerializeTo(destination, data.queueId); + destination = SerializeTo(destination, data.startTime); destination = SerializeTo(destination, data.timeout); return destination; } @@ -62,7 +62,7 @@ template auto SerializeTo(void * destination, UpdateTimeData const & data) -> void * { destination = SerializeTo(destination, UpdateTimeData::id); - destination = SerializeTo(destination, data.timestamp); + destination = SerializeTo(destination, data.currentTime); return destination; } } diff --git a/Sts1CobcSw/EduHeartbeatThread.cpp b/Sts1CobcSw/EduHeartbeatThread.cpp index 5d0bacbd..185ab97f 100644 --- a/Sts1CobcSw/EduHeartbeatThread.cpp +++ b/Sts1CobcSw/EduHeartbeatThread.cpp @@ -179,11 +179,11 @@ class DummyThread : public RODOS::StaticThread<> RODOS::PRINTF("Hello From DummyThread Timeloop\n"); auto programId = 0_u16; - auto queueId = 5_u16; + auto timestamp = 5_u16; auto timeout = 10_i16; auto executeProgramData = ExecuteProgramData{ - .programId = programId, .queueId = queueId, .timeout = timeout}; + .programId = programId, .timestamp = timestamp, .timeout = timeout}; edu.ExecuteProgram(executeProgramData); RODOS::AT(RODOS::NOW() + 11 * RODOS::SECONDS); diff --git a/Sts1CobcSw/EduListenerThread.cpp b/Sts1CobcSw/EduListenerThread.cpp index 562d42d1..04e74bdf 100644 --- a/Sts1CobcSw/EduListenerThread.cpp +++ b/Sts1CobcSw/EduListenerThread.cpp @@ -83,14 +83,14 @@ class EduListenerThread : public RODOS::StaticThread<> { edu::UpdateProgramStatusHistory( status.programId, - status.queueId, + status.startTime, edu::ProgramStatus::programExecutionSucceeded); } else { edu::UpdateProgramStatusHistory( status.programId, - status.queueId, + status.startTime, edu::ProgramStatus::programExecutionFailed); } ResumeEduProgramQueueThread(); @@ -125,7 +125,7 @@ class EduListenerThread : public RODOS::StaticThread<> // break; edu::UpdateProgramStatusHistory(status.programId, - status.queueId, + status.startTime, edu::ProgramStatus::resultFileTransfered); break; } diff --git a/Sts1CobcSw/EduProgramQueueThread.cpp b/Sts1CobcSw/EduProgramQueueThread.cpp index 76aaacf2..22657c5f 100644 --- a/Sts1CobcSw/EduProgramQueueThread.cpp +++ b/Sts1CobcSw/EduProgramQueueThread.cpp @@ -45,10 +45,10 @@ class EduProgramQueueThread : public RODOS::StaticThread edu::Initialize(); // auto queueEntry1 = EduQueueEntry{ - // .programId = 0, .queueId = 1, .startTime = 946'684'807, .timeout = 10}; // NOLINT + // .programId = 0, .timestamp = 1, .startTime = 946'684'807, .timeout = 10}; // NOLINT // auto queueEntry2 = EduQueueEntry{ - // .programId = 0, .queueId = 2, .startTime = 946'684'820, .timeout = 20}; // NOLINT + // .programId = 0, .timestamp = 2, .startTime = 946'684'820, .timeout = 20}; // NOLINT // eduProgramQueue.push_back(queueEntry1); // eduProgramQueue.push_back(queueEntry2); @@ -94,7 +94,7 @@ class EduProgramQueueThread : public RODOS::StaticThread utility::PrintFormattedSystemUtc(); auto errorCode = - edu::UpdateTime(edu::UpdateTimeData{.timestamp = utility::GetUnixUtc()}); + edu::UpdateTime(edu::UpdateTimeData{.currentTime = utility::GetUnixUtc()}); if(errorCode != edu::ErrorCode::success) { RODOS::PRINTF("UpdateTime error code : %d\n", static_cast(errorCode)); @@ -118,13 +118,13 @@ class EduProgramQueueThread : public RODOS::StaticThread // Never reached RODOS::PRINTF("Done suspending for the second time\n"); - auto queueId = edu::programQueue[edu::queueIndex].queueId; + auto startTime = edu::programQueue[edu::queueIndex].startTime; auto programId = edu::programQueue[edu::queueIndex].programId; auto timeout = edu::programQueue[edu::queueIndex].timeout; RODOS::PRINTF("Executing program %d\n", programId); auto executeProgramData = edu::ExecuteProgramData{ - .programId = programId, .queueId = queueId, .timeout = timeout}; + .programId = programId, .startTime = startTime, .timeout = timeout}; // Start Process errorCode = edu::ExecuteProgram(executeProgramData); // errorCode = edu::ErrorCode::success; @@ -140,7 +140,7 @@ class EduProgramQueueThread : public RODOS::StaticThread { edu::programStatusHistory.put( edu::ProgramStatusHistoryEntry{.programId = programId, - .queueId = queueId, + .startTime = startTime, .status = edu::ProgramStatus::programRunning}); // Suspend Self for execution time diff --git a/Tests/GoldenTests/DispatchCommand.test.cpp b/Tests/GoldenTests/DispatchCommand.test.cpp index 567481c1..0b512ecd 100644 --- a/Tests/GoldenTests/DispatchCommand.test.cpp +++ b/Tests/GoldenTests/DispatchCommand.test.cpp @@ -35,12 +35,12 @@ class DispatchCommandTest : public RODOS::StaticThread<> .length = 2 * serialSize}); command.insert(command.end(), header.begin(), header.end()); - auto entry1 = Serialize( - edu::QueueEntry{.programId = 1, .queueId = 16, .startTime = 1048577, .timeout = 1}); + auto entry1 = + Serialize(edu::QueueEntry{.programId = 1, .startTime = 1048577, .timeout = 1}); command.insert(command.end(), entry1.begin(), entry1.end()); - auto entry2 = Serialize( - edu::QueueEntry{.programId = 2, .queueId = 32, .startTime = 2097154, .timeout = 2}); + auto entry2 = + Serialize(edu::QueueEntry{.programId = 2, .startTime = 2097154, .timeout = 2}); command.insert(command.end(), entry2.begin(), entry2.end()); while(not command.full()) diff --git a/Tests/GoldenTests/ExpectedOutputs/DispatchCommand.txt b/Tests/GoldenTests/ExpectedOutputs/DispatchCommand.txt index 512509fa..fbe248f1 100644 --- a/Tests/GoldenTests/ExpectedOutputs/DispatchCommand.txt +++ b/Tests/GoldenTests/ExpectedOutputs/DispatchCommand.txt @@ -1,16 +1,14 @@ Header start character : a Header commandID : 52 Header utc : 1704067200 -Header length : 20 +Header length : 16 DateUTC(DD/MM/YYYY HH:MIN:SS) : 01/01/2024 00:00:00. Entering build queue command parsing Printing and parsing Prog ID : 1 -Queue ID : 16 Start Time : 1048577 Timeout : 1 Prog ID : 2 -Queue ID : 32 Start Time : 2097154 Timeout : 2 Queue index reset. Current size of EDU program queue is 2. diff --git a/Tests/GoldenTests/UpdateRingBuffer.test.cpp b/Tests/GoldenTests/UpdateRingBuffer.test.cpp index 5f486104..e6e679ad 100644 --- a/Tests/GoldenTests/UpdateRingBuffer.test.cpp +++ b/Tests/GoldenTests/UpdateRingBuffer.test.cpp @@ -52,13 +52,13 @@ class UpdateRingBufferTest : public RODOS::StaticThread<> printfMask = 1; edu::programStatusHistory.put(edu::ProgramStatusHistoryEntry{ - .programId = 1, .queueId = 1, .status = edu::ProgramStatus::programExecutionFailed}); + .programId = 1, .startTime = 1, .status = edu::ProgramStatus::programExecutionFailed}); edu::programStatusHistory.put(edu::ProgramStatusHistoryEntry{ - .programId = 2, .queueId = 1, .status = edu::ProgramStatus::programRunning}); + .programId = 2, .startTime = 1, .status = edu::ProgramStatus::programRunning}); edu::programStatusHistory.put(edu::ProgramStatusHistoryEntry{ - .programId = 3, .queueId = 1, .status = edu::ProgramStatus::programRunning}); + .programId = 3, .startTime = 1, .status = edu::ProgramStatus::programRunning}); edu::programStatusHistory.put(edu::ProgramStatusHistoryEntry{ - .programId = 4, .queueId = 1, .status = edu::ProgramStatus::programRunning}); + .programId = 4, .startTime = 1, .status = edu::ProgramStatus::programRunning}); auto readCnt = edu::programStatusHistory.readCnt; @@ -70,7 +70,7 @@ class UpdateRingBufferTest : public RODOS::StaticThread<> edu::UpdateProgramStatusHistory(2, 1, edu::ProgramStatus::programExecutionSucceeded); edu::UpdateProgramStatusHistory(4, 1, edu::ProgramStatus::programExecutionFailed); edu::programStatusHistory.put(edu::ProgramStatusHistoryEntry{ - .programId = 5, .queueId = 1, .status = edu::ProgramStatus::programRunning}); + .programId = 5, .startTime = 1, .status = edu::ProgramStatus::programRunning}); edu::UpdateProgramStatusHistory(5, 1, edu::ProgramStatus::programExecutionSucceeded); // 1, because we did not read anything diff --git a/Tests/HardwareTests/EduCommandTests/EduCommands.test.cpp b/Tests/HardwareTests/EduCommandTests/EduCommands.test.cpp index ee2d6f50..4cbe5116 100644 --- a/Tests/HardwareTests/EduCommandTests/EduCommands.test.cpp +++ b/Tests/HardwareTests/EduCommandTests/EduCommands.test.cpp @@ -10,6 +10,7 @@ #include #include +#include #include @@ -60,9 +61,9 @@ class EduCommandsTest : public RODOS::StaticThread<> { case 'u': { - auto timestamp = utility::GetUnixUtc(); - PRINTF("Sending UpdateTime(timestamp = %d)\n", static_cast(timestamp)); - auto errorCode = edu::UpdateTime({.timestamp = timestamp}); + auto currentTime = utility::GetUnixUtc(); + PRINTF("Sending UpdateTime(currentTime = %d)\n", static_cast(currentTime)); + auto errorCode = edu::UpdateTime({.currentTime = currentTime}); PRINTF("Returned error code: %d\n", static_cast(errorCode)); break; } @@ -75,10 +76,10 @@ class EduCommandsTest : public RODOS::StaticThread<> std::uint16_t programId = 0; std::from_chars(begin(userInput), end(userInput), programId); - PRINTF("Please enter a queue ID (1 character)\n"); + PRINTF("Please enter a start time (1 character)\n"); hal::ReadFrom(&uciUart, std::span(userInput)); - std::uint16_t queueId = 0; - std::from_chars(begin(userInput), end(userInput), queueId); + std::int32_t startTime = 0; + std::from_chars(begin(userInput), end(userInput), startTime); PRINTF("Please enter a timeout (1 character)\n"); hal::ReadFrom(&uciUart, std::span(userInput)); @@ -86,12 +87,13 @@ class EduCommandsTest : public RODOS::StaticThread<> std::from_chars(begin(userInput), end(userInput), timeout); PRINTF("\n"); - PRINTF("Sending ExecuteProgram(programId = %d, queueId = %d, timeout = %d)\n", - static_cast(programId), - static_cast(queueId), - static_cast(timeout)); + PRINTF("Sending ExecuteProgram(programId = %" PRIu16 ", startTime = %" PRIi32 + ", timeout = %" PRIi16 ")\n", + programId, + startTime, + timeout); auto errorCode = edu::ExecuteProgram( - {.programId = programId, .queueId = queueId, .timeout = timeout}); + {.programId = programId, .startTime = startTime, .timeout = timeout}); PRINTF("Returned error code: %d\n", static_cast(errorCode)); break; } @@ -102,7 +104,7 @@ class EduCommandsTest : public RODOS::StaticThread<> PRINTF("Returned status:\n"); PRINTF(" type = %d\n", static_cast(status.statusType)); PRINTF(" program ID = %d\n", static_cast(status.programId)); - PRINTF(" queue ID = %d\n", static_cast(status.queueId)); + PRINTF(" startTime = %d\n", static_cast(status.startTime)); PRINTF(" exit code = %d\n", static_cast(status.exitCode)); PRINTF(" error code = %d\n", static_cast(status.errorCode)); break;