Corium 1.1.0
High-Performance Zero-Heap C++20 MPSC Application Runtime
Loading...
Searching...
No Matches
SpiAdapter.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include <array>
10#include <cstddef>
11#include <cstdint>
12#include <cstring>
13#include <span>
14#include <type_traits>
15
16#include "corium/EventSink.hpp"
18
19namespace corium::embedded {
20
23template <size_t MaxRxSize = 32>
24struct SpiFrame {
25 uint8_t chipSelectId{0};
26 uint16_t length{0};
27 uint8_t status{0};
28 std::array<uint8_t, MaxRxSize> rxData{};
29
30 [[nodiscard]] std::span<const uint8_t> payload() const noexcept {
31 return {rxData.data(), static_cast<size_t>(length > MaxRxSize ? MaxRxSize : length)};
32 }
33};
34
38template <typename EventVariant>
40public:
42 : m_sink(sink)
43 {}
44
50 template <typename TargetEvent = SpiFrame<32>, size_t MaxRxSize = 32>
51 void postFromIsr(const SpiFrame<MaxRxSize>& frame, EventPriority priority = EventPriority::Normal) noexcept {
52 if constexpr (std::is_same_v<TargetEvent, SpiFrame<MaxRxSize>>) {
53 m_sink.post(EventVariant{frame}, priority);
54 } else {
55 m_sink.post(EventVariant{TargetEvent{frame}}, priority);
56 }
57 }
58
65 template <typename TargetEvent = SpiFrame<32>>
67 uint8_t csId,
68 std::span<const uint8_t> rxBytes,
69 uint8_t status = 0,
71 ) noexcept {
72 SpiFrame<32> frame{};
73 frame.chipSelectId = csId;
74 frame.status = status;
75 frame.length = static_cast<uint16_t>(rxBytes.size() > 32 ? 32 : rxBytes.size());
76 std::memcpy(frame.rxData.data(), rxBytes.data(), frame.length);
77
78 if constexpr (std::is_same_v<TargetEvent, SpiFrame<32>>) {
79 m_sink.post(EventVariant{frame}, priority);
80 } else {
81 m_sink.post(EventVariant{TargetEvent{frame}}, priority);
82 }
83 }
84
85private:
87};
88
89} // namespace corium::embedded
Non-allocating type-erased fat pointer handle for lock-free event posting.
Bounded and multi-tier priority MPSC queueing policies.
Non-blocking hardware ISR adapter for SPI controllers and DMA completion interrupts....
Definition SpiAdapter.hpp:39
void postBufferFromIsr(uint8_t csId, std::span< const uint8_t > rxBytes, uint8_t status=0, EventPriority priority=EventPriority::Normal) noexcept
Ingest raw SPI RX bytes from a DMA buffer into a typed event and post into sink.
Definition SpiAdapter.hpp:66
void postFromIsr(const SpiFrame< MaxRxSize > &frame, EventPriority priority=EventPriority::Normal) noexcept
Post an SPI frame directly from ISR context into the event sink.
Definition SpiAdapter.hpp:51
SpiIsrAdapter(EventSinkT< EventVariant > sink) noexcept
Definition SpiAdapter.hpp:41
Definition CanAdapter.hpp:16
EventPriority
Event priority levels for multi-priority queue policies.
Definition QueuePolicies.hpp:32
Fixed-capacity SPI transfer frame structure for zero-heap ISR and DMA ingestion.
Definition SpiAdapter.hpp:24
uint16_t length
Number of valid received bytes.
Definition SpiAdapter.hpp:26
std::array< uint8_t, MaxRxSize > rxData
Static receive buffer.
Definition SpiAdapter.hpp:28
uint8_t chipSelectId
Chip-select / device channel identifier.
Definition SpiAdapter.hpp:25
uint8_t status
Hardware status flags (0: Success, 1: Error/Timeout)
Definition SpiAdapter.hpp:27
std::span< const uint8_t > payload() const noexcept
Definition SpiAdapter.hpp:30