Mock SPI bus for testing.
Mock SPI bus for testing.Records all transfers and allows configuring responses. Satisfies hal::SpiBus concept without requiring hardware.
MockSpiBus spi;
spi.queue_response(0xAA);
auto result = spi.transfer(0x55);
assert(result == 0xAA);
assert(spi.sent_bytes()[0] == 0x55);
#pragma once
#include <cstddef>
#include <cstdint>
#include <deque>
#include <span>
#include <vector>
class MockSpiBus {
public:
auto transfer(std::uint8_t
byte) -> std::uint8_t {
sent_bytes_.push_back(byte);
if (!response_queue_.empty()) {
auto response = response_queue_.front();
response_queue_.pop_front();
return response;
}
return 0x00;
}
auto write(std::span<const std::byte> data) ->
void {
for (auto byte : data) {
sent_bytes_.push_back(static_cast<std::uint8_t>(byte));
}
}
[[nodiscard]]
auto sent_bytes()
const ->
const std::vector<std::uint8_t> & {
return sent_bytes_; }
[[nodiscard]]
auto transfer_count()
const -> std::size_t {
return sent_bytes_.size(); }
auto queue_response(std::uint8_t
byte) ->
void { response_queue_.push_back(
byte); }
sent_bytes_.clear();
response_queue_.clear();
}
private:
std::vector<std::uint8_t> sent_bytes_;
std::deque<std::uint8_t> response_queue_;
};
static_assert(SpiBus<MockSpiBus>, "MockSpiBus must satisfy SpiBus concept");
}
auto sent_bytes() const -> const std::vector< std::uint8_t > &
Get vector of all bytes sent via transfer() and write().
Definition mock_spi.hpp:64
auto reset() -> void
Reset bus state for new test.
Definition mock_spi.hpp:81
auto transfer(std::uint8_t byte) -> std::uint8_t
Full-duplex byte transfer.
Definition mock_spi.hpp:37
auto transfer_count() const -> std::size_t
Get total number of bytes transferred.
Definition mock_spi.hpp:70
auto queue_response(std::uint8_t byte) -> void
Queue a response byte for next transfer() call.
Definition mock_spi.hpp:76
auto write(std::span< const std::byte > data) -> void
Bulk write operation.
Definition mock_spi.hpp:54
SPI bus concept for hardware abstraction.