Skip to content

Commit

Permalink
Update COBC-EDU protocol (#169)
Browse files Browse the repository at this point in the history
  • Loading branch information
PatrickKa authored Dec 10, 2023
2 parents 84fda26 + b62a297 commit 5a4e625
Show file tree
Hide file tree
Showing 16 changed files with 72 additions and 74 deletions.
3 changes: 1 addition & 2 deletions Sts1CobcSw/CommandParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,7 @@ auto ParseAndAddQueueEntries(std::span<Byte const> queueEntries) -> void
Deserialize<edu::QueueEntry>(queueEntries.first<serialSize<edu::QueueEntry>>());

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);
Expand Down
25 changes: 13 additions & 12 deletions Sts1CobcSw/Edu/Edu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include <algorithm>
#include <array>
#include <cinttypes>
#include <cstddef>


Expand Down Expand Up @@ -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]
Expand All @@ -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);
Expand Down Expand Up @@ -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<int>(status.statusType),
static_cast<int>(status.errorCode),
status.programId,
status.queueId,
status.startTime,
status.exitCode);
return status;
}
Expand Down Expand Up @@ -304,7 +305,7 @@ auto GetStatusCommunication() -> Status

return Status{.statusType = StatusType::noEvent,
.programId = 0,
.queueId = 0,
.startTime = 0,
.exitCode = 0,
.errorCode = ErrorCode::success};
}
Expand Down Expand Up @@ -338,7 +339,7 @@ auto GetStatusCommunication() -> Status
auto programFinishedData = Deserialize<ProgramFinishedStatus>(dataBuffer);
return Status{.statusType = StatusType::programFinished,
.programId = programFinishedData.programId,
.queueId = programFinishedData.queueId,
.startTime = programFinishedData.startTime,
.exitCode = programFinishedData.exitCode,
.errorCode = ErrorCode::success};
}
Expand Down Expand Up @@ -370,7 +371,7 @@ auto GetStatusCommunication() -> Status
auto resultsReadyData = Deserialize<ResultsReadyStatus>(dataBuffer);
return Status{.statusType = StatusType::resultsReady,
.programId = resultsReadyData.programId,
.queueId = resultsReadyData.queueId,
.startTime = resultsReadyData.startTime,
.errorCode = ErrorCode::success};
}

Expand Down Expand Up @@ -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
Expand Down
10 changes: 6 additions & 4 deletions Sts1CobcSw/Edu/EduMock.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#include <Sts1CobcSw/Edu/Edu.hpp>
#include <Sts1CobcSw/Utility/Time.hpp>

#include <cinttypes>


namespace sts1cobcsw
{
Expand Down Expand Up @@ -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;
}
Expand All @@ -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};
}
Expand All @@ -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;
}

Expand Down
2 changes: 0 additions & 2 deletions Sts1CobcSw/Edu/ProgramQueue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ template<std::endian endianness>
auto DeserializeFrom(void const * source, QueueEntry * data) -> void const *
{
source = DeserializeFrom<endianness>(source, &(data->programId));
source = DeserializeFrom<endianness>(source, &(data->queueId));
source = DeserializeFrom<endianness>(source, &(data->startTime));
source = DeserializeFrom<endianness>(source, &(data->timeout));
return source;
Expand All @@ -33,7 +32,6 @@ template<std::endian endianness>
auto SerializeTo(void * destination, QueueEntry const & data) -> void *
{
destination = SerializeTo<endianness>(destination, data.programId);
destination = SerializeTo<endianness>(destination, data.queueId);
destination = SerializeTo<endianness>(destination, data.startTime);
destination = SerializeTo<endianness>(destination, data.timeout);
return destination;
Expand Down
2 changes: 0 additions & 2 deletions Sts1CobcSw/Edu/ProgramQueue.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand All @@ -33,7 +32,6 @@ struct QueueEntry
template<>
inline constexpr std::size_t serialSize<edu::QueueEntry> =
totalSerialSize<decltype(edu::QueueEntry::programId),
decltype(edu::QueueEntry::queueId),
decltype(edu::QueueEntry::startTime),
decltype(edu::QueueEntry::timeout)>;

Expand Down
4 changes: 2 additions & 2 deletions Sts1CobcSw/Edu/ProgramStatusHistory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@ RODOS::RingBuffer<ProgramStatusHistoryEntry, programStatusHistorySize> 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
// by construction ?

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;
Expand Down
4 changes: 2 additions & 2 deletions Sts1CobcSw/Edu/ProgramStatusHistory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand All @@ -38,6 +38,6 @@ extern RODOS::RingBuffer<ProgramStatusHistoryEntry, programStatusHistorySize> pr


auto UpdateProgramStatusHistory(std::uint16_t programId,
std::uint16_t queueId,
std::int32_t startTime,
ProgramStatus newStatus) -> void;
}
18 changes: 9 additions & 9 deletions Sts1CobcSw/Edu/Structs.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,23 +38,23 @@ struct ExecuteProgramData
{
static constexpr auto id = executeProgramId;
std::uint16_t programId;
std::uint16_t queueId;
std::int32_t startTime;
std::int16_t timeout;
};


struct UpdateTimeData
{
static constexpr auto id = updateTimeId;
std::int32_t timestamp;
std::int32_t currentTime;
};


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;
};
Expand All @@ -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;
};

Expand All @@ -90,13 +90,13 @@ inline constexpr std::size_t serialSize<edu::HeaderData> =
template<>
inline constexpr std::size_t serialSize<edu::ProgramFinishedStatus> =
totalSerialSize<decltype(edu::ProgramFinishedStatus::programId),
decltype(edu::ProgramFinishedStatus::queueId),
decltype(edu::ProgramFinishedStatus::startTime),
decltype(edu::ProgramFinishedStatus::exitCode)>;

template<>
inline constexpr std::size_t serialSize<edu::ResultsReadyStatus> =
totalSerialSize<decltype(edu::ResultsReadyStatus::programId),
decltype(edu::ResultsReadyStatus::queueId)>;
decltype(edu::ResultsReadyStatus::startTime)>;

template<>
inline constexpr std::size_t serialSize<edu::StoreArchiveData> =
Expand All @@ -107,12 +107,12 @@ template<>
inline constexpr std::size_t serialSize<edu::ExecuteProgramData> =
totalSerialSize<decltype(edu::ExecuteProgramData::id),
decltype(edu::ExecuteProgramData::programId),
decltype(edu::ExecuteProgramData::queueId),
decltype(edu::ExecuteProgramData::startTime),
decltype(edu::ExecuteProgramData::timeout)>;

template<>
inline constexpr std::size_t serialSize<edu::UpdateTimeData> =
totalSerialSize<decltype(edu::UpdateTimeData::id), decltype(edu::UpdateTimeData::timestamp)>;
totalSerialSize<decltype(edu::UpdateTimeData::id), decltype(edu::UpdateTimeData::currentTime)>;


namespace edu
Expand Down
8 changes: 4 additions & 4 deletions Sts1CobcSw/Edu/Structs.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ template<std::endian endianness>
auto DeserializeFrom(void const * source, ProgramFinishedStatus * data) -> void const *
{
source = DeserializeFrom<endianness>(source, &(data->programId));
source = DeserializeFrom<endianness>(source, &(data->queueId));
source = DeserializeFrom<endianness>(source, &(data->startTime));
source = DeserializeFrom<endianness>(source, &(data->exitCode));
return source;
}
Expand All @@ -33,7 +33,7 @@ template<std::endian endianness>
auto DeserializeFrom(void const * source, ResultsReadyStatus * data) -> void const *
{
source = DeserializeFrom<endianness>(source, &(data->programId));
source = DeserializeFrom<endianness>(source, &(data->queueId));
source = DeserializeFrom<endianness>(source, &(data->startTime));
return source;
}

Expand All @@ -52,7 +52,7 @@ auto SerializeTo(void * destination, ExecuteProgramData const & data) -> void *
{
destination = SerializeTo<endianness>(destination, ExecuteProgramData::id);
destination = SerializeTo<endianness>(destination, data.programId);
destination = SerializeTo<endianness>(destination, data.queueId);
destination = SerializeTo<endianness>(destination, data.startTime);
destination = SerializeTo<endianness>(destination, data.timeout);
return destination;
}
Expand All @@ -62,7 +62,7 @@ template<std::endian endianness>
auto SerializeTo(void * destination, UpdateTimeData const & data) -> void *
{
destination = SerializeTo<endianness>(destination, UpdateTimeData::id);
destination = SerializeTo<endianness>(destination, data.timestamp);
destination = SerializeTo<endianness>(destination, data.currentTime);
return destination;
}
}
4 changes: 2 additions & 2 deletions Sts1CobcSw/EduHeartbeatThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 3 additions & 3 deletions Sts1CobcSw/EduListenerThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -125,7 +125,7 @@ class EduListenerThread : public RODOS::StaticThread<>
// break;

edu::UpdateProgramStatusHistory(status.programId,
status.queueId,
status.startTime,
edu::ProgramStatus::resultFileTransfered);
break;
}
Expand Down
Loading

0 comments on commit 5a4e625

Please sign in to comment.