HardFOC Core
API reference
Loading...
Searching...
No Matches
MockI2c.h
Go to the documentation of this file.
1
20#pragma once
21
22#include "base/BaseI2c.h"
23
24#include <array>
25#include <cstdint>
26#include <deque>
27#include <functional>
28#include <vector>
29
30namespace hf::host {
31
33 enum class Kind : uint8_t { Write, Read, WriteRead };
35 uint16_t address;
36 std::vector<uint8_t> tx;
37 uint16_t rx_length;
38 std::vector<uint8_t> rx;
39 hf_i2c_err_t result;
40};
41
42class MockI2c : public BaseI2c {
43public:
45 using Responder = std::function<hf_i2c_err_t(const I2cTransaction& txn, uint8_t* rx)>;
46
47 explicit MockI2c(uint16_t device_address = 0x20) noexcept;
48 ~MockI2c() noexcept override = default;
49
50 // ── BaseI2c ───────────────────────────────────────────────────────────
51 bool Initialize() noexcept override;
52 bool Deinitialize() noexcept override;
53 hf_i2c_err_t Write(const hf_u8_t* data, hf_u16_t length, hf_u32_t timeout_ms = 0) noexcept override;
54 hf_i2c_err_t Read(hf_u8_t* data, hf_u16_t length, hf_u32_t timeout_ms = 0) noexcept override;
55 hf_i2c_err_t WriteRead(const hf_u8_t* tx_data, hf_u16_t tx_length, hf_u8_t* rx_data,
56 hf_u16_t rx_length, hf_u32_t timeout_ms = 0) noexcept override;
57 hf_u16_t GetDeviceAddress() const noexcept override { return address_; }
58
59 // ── Scripting ─────────────────────────────────────────────────────────
60 void SetDeviceAddress(uint16_t address) noexcept { address_ = address; }
61 void SetInitializeResult(bool ok) noexcept { init_result_ = ok; }
62 void QueueRead(std::vector<uint8_t> bytes, hf_i2c_err_t result = hf_i2c_err_t::I2C_SUCCESS);
63 void FailNext(hf_i2c_err_t error, size_t count = 1) noexcept;
64 void SetResponder(Responder responder) { responder_ = std::move(responder); }
65
66 void EnableRegisterModel(bool enable = true) noexcept { register_model_ = enable; }
67 void SetRegister(uint8_t reg, uint8_t value) noexcept { registers_[reg] = value; }
68 [[nodiscard]] uint8_t GetRegister(uint8_t reg) const noexcept { return registers_[reg]; }
70 void SetReadOnly(uint8_t reg, bool read_only = true) noexcept { read_only_[reg] = read_only; }
71
72 // ── Inspection ────────────────────────────────────────────────────────
73 [[nodiscard]] const std::vector<I2cTransaction>& Transactions() const noexcept { return log_; }
74 void ClearTransactions() noexcept { log_.clear(); }
75 [[nodiscard]] size_t CountOf(I2cTransaction::Kind kind) const noexcept;
77 [[nodiscard]] size_t WritesTo(uint8_t reg) const noexcept;
78 [[nodiscard]] int InitializeCalls() const noexcept { return init_calls_; }
79
80private:
81 hf_i2c_err_t Complete(I2cTransaction& txn, uint8_t* rx);
82 void ModelWrite(const std::vector<uint8_t>& tx) noexcept;
83 void ModelRead(uint8_t* rx, uint16_t length) noexcept;
84
85 uint16_t address_;
86 bool init_result_{true};
88 bool register_model_{false};
89 uint8_t reg_pointer_{0};
90 std::array<uint8_t, 256> registers_{};
91 std::array<bool, 256> read_only_{};
92 struct Queued {
93 std::vector<uint8_t> bytes;
94 hf_i2c_err_t result;
95 };
96 std::deque<Queued> queued_;
97 hf_i2c_err_t fail_error_{hf_i2c_err_t::I2C_ERR_FAILURE};
98 size_t fail_count_{0};
100 std::vector<I2cTransaction> log_;
101};
102
103} // namespace hf::host
Definition MockI2c.h:42
hf_i2c_err_t Read(hf_u8_t *data, hf_u16_t length, hf_u32_t timeout_ms=0) noexcept override
Definition MockI2c.cpp:109
int InitializeCalls() const noexcept
Definition MockI2c.h:78
uint8_t GetRegister(uint8_t reg) const noexcept
Definition MockI2c.h:68
bool Initialize() noexcept override
Definition MockI2c.cpp:16
void QueueRead(std::vector< uint8_t > bytes, hf_i2c_err_t result=hf_i2c_err_t::I2C_SUCCESS)
Definition MockI2c.cpp:23
void SetReadOnly(uint8_t reg, bool read_only=true) noexcept
Definition MockI2c.h:70
void FailNext(hf_i2c_err_t error, size_t count=1) noexcept
Definition MockI2c.cpp:27
void SetRegister(uint8_t reg, uint8_t value) noexcept
Definition MockI2c.h:67
uint16_t address_
Definition MockI2c.h:85
bool register_model_
Definition MockI2c.h:88
uint8_t reg_pointer_
Definition MockI2c.h:89
bool init_result_
Definition MockI2c.h:86
void SetDeviceAddress(uint16_t address) noexcept
Definition MockI2c.h:60
void SetResponder(Responder responder)
Definition MockI2c.h:64
hf_i2c_err_t Write(const hf_u8_t *data, hf_u16_t length, hf_u32_t timeout_ms=0) noexcept override
Definition MockI2c.cpp:100
std::vector< I2cTransaction > log_
Definition MockI2c.h:100
size_t CountOf(I2cTransaction::Kind kind) const noexcept
Definition MockI2c.cpp:32
void ClearTransactions() noexcept
Definition MockI2c.h:74
std::array< uint8_t, 256 > registers_
Definition MockI2c.h:90
std::array< bool, 256 > read_only_
Definition MockI2c.h:91
hf_u16_t GetDeviceAddress() const noexcept override
Definition MockI2c.h:57
std::function< hf_i2c_err_t(const I2cTransaction &txn, uint8_t *rx)> Responder
Definition MockI2c.h:45
hf_i2c_err_t Complete(I2cTransaction &txn, uint8_t *rx)
Definition MockI2c.cpp:63
void ModelWrite(const std::vector< uint8_t > &tx) noexcept
Definition MockI2c.cpp:44
hf_i2c_err_t WriteRead(const hf_u8_t *tx_data, hf_u16_t tx_length, hf_u8_t *rx_data, hf_u16_t rx_length, hf_u32_t timeout_ms=0) noexcept override
Definition MockI2c.cpp:117
const std::vector< I2cTransaction > & Transactions() const noexcept
Definition MockI2c.h:73
Responder responder_
Definition MockI2c.h:99
int init_calls_
Definition MockI2c.h:87
void EnableRegisterModel(bool enable=true) noexcept
Definition MockI2c.h:66
size_t WritesTo(uint8_t reg) const noexcept
Definition MockI2c.cpp:37
bool Deinitialize() noexcept override
Definition MockI2c.cpp:21
void SetInitializeResult(bool ok) noexcept
Definition MockI2c.h:61
size_t fail_count_
Definition MockI2c.h:98
hf_i2c_err_t fail_error_
Definition MockI2c.h:97
std::deque< Queued > queued_
Definition MockI2c.h:96
void ModelRead(uint8_t *rx, uint16_t length) noexcept
Definition MockI2c.cpp:57
Definition FakeClock.cpp:21
Definition MockI2c.h:32
uint16_t address
Device address at the time of the call.
Definition MockI2c.h:35
Kind
Definition MockI2c.h:33
uint16_t rx_length
Bytes requested (0 for Write).
Definition MockI2c.h:37
Kind kind
Definition MockI2c.h:34
std::vector< uint8_t > rx
Bytes returned to the caller.
Definition MockI2c.h:38
hf_i2c_err_t result
Value returned to the caller.
Definition MockI2c.h:39
std::vector< uint8_t > tx
Bytes written (empty for Read).
Definition MockI2c.h:36
Definition MockI2c.h:92
hf_i2c_err_t result
Definition MockI2c.h:94
std::vector< uint8_t > bytes
Definition MockI2c.h:93