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

Add abstraction for FRAM ring array #296

Merged
merged 15 commits into from
Sep 15, 2024
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
1 change: 1 addition & 0 deletions .codespell-ignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
tust
fram
framlayout
framBuffer
3 changes: 2 additions & 1 deletion Sts1CobcSw/CobcSoftware/CommandParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
#include <Sts1CobcSw/Serial/Serial.hpp>
#include <Sts1CobcSw/Utility/Debug.hpp>

#include <cinttypes> // IWYU pragma: keep
#include <strong_type/type.hpp>

#include <cinttypes> // IWYU pragma: keep

namespace sts1cobcsw
{
Expand Down
1 change: 1 addition & 0 deletions Sts1CobcSw/CobcSoftware/EduCommunicationErrorThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <Sts1CobcSw/CobcSoftware/TopicsAndSubscribers.hpp>
#include <Sts1CobcSw/Edu/Edu.hpp>
#include <Sts1CobcSw/FramSections/FramLayout.hpp>
#include <Sts1CobcSw/FramSections/PersistentVariables.hpp>
#include <Sts1CobcSw/Utility/Debug.hpp>
#include <Sts1CobcSw/Utility/Time.hpp>

Expand Down
3 changes: 0 additions & 3 deletions Sts1CobcSw/CobcSoftware/EduCommunicationErrorThread.hpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
#pragma once


#include <cstdint>


namespace sts1cobcsw
{
auto ResumeEduCommunicationErrorThread() -> void;
Expand Down
2 changes: 1 addition & 1 deletion Sts1CobcSw/Edu/Edu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ auto ReceiveDataPacket() -> Result<void>
template<typename T>
auto Receive() -> Result<T>
{
auto buffer = Buffer<T>{};
auto buffer = SerialBuffer<T>{};
OUTCOME_TRY(Receive(buffer));
return Deserialize<T>(buffer);
}
Expand Down
2 changes: 2 additions & 0 deletions Sts1CobcSw/Edu/EduMock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#include <Sts1CobcSw/Edu/Types.hpp>
#include <Sts1CobcSw/Utility/Debug.hpp>

#include <strong_type/type.hpp>

#include <cinttypes> // IWYU pragma: keep


Expand Down
32 changes: 32 additions & 0 deletions Sts1CobcSw/Edu/ProgramStatusHistory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,36 @@ auto UpdateProgramStatusHistory(ProgramId programId, RealTime startTime, Program
}
}
}


using sts1cobcsw::DeserializeFrom;
using sts1cobcsw::SerializeTo;


template<std::endian endianness>
auto DeserializeFrom(void const * source, ProgramStatusHistoryEntry * data) -> void const *
{
source = DeserializeFrom<endianness>(source, &(data->programId));
source = DeserializeFrom<endianness>(source, &(data->startTime));
source = DeserializeFrom<endianness>(source, &(data->status));
return source;
}


template<std::endian endianness>
auto SerializeTo(void * destination, ProgramStatusHistoryEntry const & data) -> void *
{
destination = SerializeTo<endianness>(destination, data.programId);
destination = SerializeTo<endianness>(destination, data.startTime);
destination = SerializeTo<endianness>(destination, data.status);
return destination;
}


template auto DeserializeFrom<std::endian::big>(void const *, ProgramStatusHistoryEntry *)
-> void const *;
template auto DeserializeFrom<std::endian::little>(void const *, ProgramStatusHistoryEntry *)
-> void const *;
template auto SerializeTo<std::endian::big>(void *, ProgramStatusHistoryEntry const &) -> void *;
template auto SerializeTo<std::endian::little>(void *, ProgramStatusHistoryEntry const &) -> void *;
}
8 changes: 8 additions & 0 deletions Sts1CobcSw/Edu/ProgramStatusHistory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <rodos/support/support-libs/ringbuffer.h>
// clang-format on

#include <bit>
#include <cstddef>


Expand Down Expand Up @@ -64,5 +65,12 @@ extern RODOS::RingBuffer<ProgramStatusHistoryEntry, nProgramStatusHistoryEntries

auto UpdateProgramStatusHistory(ProgramId programId, RealTime startTime, ProgramStatus newStatus)
-> void;

template<std::endian endianness>
[[nodiscard]] auto DeserializeFrom(void const * source, ProgramStatusHistoryEntry * data)
-> void const *;
template<std::endian endianness>
[[nodiscard]] auto SerializeTo(void * destination, ProgramStatusHistoryEntry const & data)
-> void *;
}
}
7 changes: 1 addition & 6 deletions Sts1CobcSw/FramSections/FramLayout.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,15 @@
namespace sts1cobcsw
{
inline constexpr auto framMemory = Section<fram::Address(0), fram::memorySize>{};
inline constexpr auto persistentVariablesSize = fram::Size(100);
inline constexpr auto framSections =
Subsections<framMemory,
SubsectionInfo<"persistentVariables0", persistentVariablesSize>,
SubsectionInfo<"persistentVariables1", persistentVariablesSize>,
SubsectionInfo<"persistentVariables2", persistentVariablesSize>,
SubsectionInfo<"persistentVariables0", fram::Size(300)>,
SubsectionInfo<"eduProgramQueue", fram::Size(20 * 8)>,
SubsectionInfo<"eduProgramStatusHistory", fram::Size(50 * 7)>,
SubsectionInfo<"testMemory", fram::Size(1000)>,
SubsectionInfo<"telemetry", fram::Size(26'168 * 40)>>{};
inline constexpr auto persistentVariables =
PersistentVariables<framSections.Get<"persistentVariables0">(),
framSections.Get<"persistentVariables1">(),
framSections.Get<"persistentVariables2">(),
PersistentVariableInfo<"nResetsSinceRf", std::uint16_t>,
PersistentVariableInfo<"activeSecondaryFwPartition", std::int8_t>,
PersistentVariableInfo<"backupSecondaryFwPartition", std::int8_t>,
Expand Down
27 changes: 15 additions & 12 deletions Sts1CobcSw/FramSections/PersistentVariables.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,18 @@

namespace sts1cobcsw
{
template<Section parentSection0,
Section parentSection1,
Section parentSection2,
APersistentVariableInfo... PersistentVariableInfos>
requires(sizeof...(PersistentVariableInfos) > 0 && parentSection0.end <= parentSection1.begin
&& parentSection1.end <= parentSection2.begin)
template<Section persistentVariablesSection, APersistentVariableInfo... PersistentVariableInfos>
requires(sizeof...(PersistentVariableInfos) > 0)
class PersistentVariables
{
public:
static constexpr auto section = persistentVariablesSection;

template<StringLiteral name>
using ValueType = std::tuple_element_t<
Subsections<parentSection0, PersistentVariableInfos...>::template Index<name>(),
Subsections<section, PersistentVariableInfos...>::template Index<name>(),
std::tuple<typename PersistentVariableInfos::ValueType...>>;

constexpr PersistentVariables() = default;

template<StringLiteral name>
[[nodiscard]] static auto Load() -> ValueType<name>;
template<StringLiteral name>
Expand All @@ -52,9 +48,16 @@ class PersistentVariables
static std::tuple<typename PersistentVariableInfos::ValueType...> cache1;
static std::tuple<typename PersistentVariableInfos::ValueType...> cache2;

static constexpr auto subsections0 = Subsections<parentSection0, PersistentVariableInfos...>();
static constexpr auto subsections1 = Subsections<parentSection1, PersistentVariableInfos...>();
static constexpr auto subsections2 = Subsections<parentSection2, PersistentVariableInfos...>();
static constexpr auto subsections = Subsections<section,
SubsectionInfo<"0", section.size / 3>,
SubsectionInfo<"1", section.size / 3>,
SubsectionInfo<"2", section.size / 3>>{};
static constexpr auto variables0 =
Subsections<subsections.template Get<"0">(), PersistentVariableInfos...>();
static constexpr auto variables1 =
Subsections<subsections.template Get<"1">(), PersistentVariableInfos...>();
static constexpr auto variables2 =
Subsections<subsections.template Get<"2">(), PersistentVariableInfos...>();

// With a baud rate of 48 MHz we can read 6000 bytes in 1 ms, which should be more than enough
static constexpr auto spiTimeout = 1 * RODOS::MILLISECONDS;
Expand Down
Loading
Loading