Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update COBC-EDU protocol #169

Merged
merged 5 commits into from
Dec 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading