Corium 1.1.0
High-Performance Zero-Heap C++20 MPSC Application Runtime
Loading...
Searching...
No Matches
I2cAdapter.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
22enum class I2cOpType : uint8_t {
23 Read = 0,
24 Write = 1,
25 WriteRead = 2
26};
27
30template <size_t MaxPayload = 32>
31struct I2cFrame {
32 uint16_t deviceAddress{0};
33 uint8_t registerAddress{0};
35 uint8_t status{0};
36 uint8_t length{0};
37 std::array<uint8_t, MaxPayload> data{};
38
39 [[nodiscard]] std::span<const uint8_t> payload() const noexcept {
40 return {data.data(), static_cast<size_t>(length > MaxPayload ? MaxPayload : length)};
41 }
42};
43
47template <typename EventVariant>
49public:
51 : m_sink(sink)
52 {}
53
59 template <typename TargetEvent = I2cFrame<32>, size_t MaxPayload = 32>
60 void postFromIsr(const I2cFrame<MaxPayload>& frame, EventPriority priority = EventPriority::Normal) noexcept {
61 if constexpr (std::is_same_v<TargetEvent, I2cFrame<MaxPayload>>) {
62 m_sink.post(EventVariant{frame}, priority);
63 } else {
64 m_sink.post(EventVariant{TargetEvent{frame}}, priority);
65 }
66 }
67
75 template <typename TargetEvent = I2cFrame<32>>
77 uint16_t devAddr,
78 uint8_t regAddr,
79 std::span<const uint8_t> readBytes,
80 uint8_t status = 0,
82 ) noexcept {
83 I2cFrame<32> frame{};
84 frame.deviceAddress = devAddr;
85 frame.registerAddress = regAddr;
86 frame.opType = I2cOpType::Read;
87 frame.status = status;
88 frame.length = static_cast<uint8_t>(readBytes.size() > 32 ? 32 : readBytes.size());
89 std::memcpy(frame.data.data(), readBytes.data(), frame.length);
90
91 if constexpr (std::is_same_v<TargetEvent, I2cFrame<32>>) {
92 m_sink.post(EventVariant{frame}, priority);
93 } else {
94 m_sink.post(EventVariant{TargetEvent{frame}}, priority);
95 }
96 }
97
98private:
100};
101
102} // 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 I2C master/slave controllers. Dispatches completed I2C read/wri...
Definition I2cAdapter.hpp:48
void postReadFromIsr(uint16_t devAddr, uint8_t regAddr, std::span< const uint8_t > readBytes, uint8_t status=0, EventPriority priority=EventPriority::Normal) noexcept
Construct and post an I2C read result frame from ISR context.
Definition I2cAdapter.hpp:76
void postFromIsr(const I2cFrame< MaxPayload > &frame, EventPriority priority=EventPriority::Normal) noexcept
Post an I2C frame from ISR context into the event sink.
Definition I2cAdapter.hpp:60
I2cIsrAdapter(EventSinkT< EventVariant > sink) noexcept
Definition I2cAdapter.hpp:50
Definition CanAdapter.hpp:16
I2cOpType
I2C transaction direction/operation type.
Definition I2cAdapter.hpp:22
EventPriority
Event priority levels for multi-priority queue policies.
Definition QueuePolicies.hpp:32
Zero-heap I2C transaction result frame.
Definition I2cAdapter.hpp:31
I2cOpType opType
Read, Write, or WriteRead.
Definition I2cAdapter.hpp:34
uint16_t deviceAddress
7-bit or 10-bit I2C target slave address
Definition I2cAdapter.hpp:32
uint8_t status
Hardware status (0: ACK/Success, 1: NACK, 2: Bus Error)
Definition I2cAdapter.hpp:35
std::span< const uint8_t > payload() const noexcept
Definition I2cAdapter.hpp:39
uint8_t registerAddress
Internal register address (if applicable)
Definition I2cAdapter.hpp:33
std::array< uint8_t, MaxPayload > data
Payload buffer.
Definition I2cAdapter.hpp:37
uint8_t length
Number of valid data bytes.
Definition I2cAdapter.hpp:36