libepaper 2.0.0
A C++23 library for controlling Waveshare e-paper displays on Raspberry Pi, featuring transparent sleep/wake management and a fluent builder API.
Loading...
Searching...
No Matches
device.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "epaper/hal/gpio.hpp"
5#include "epaper/hal/spi.hpp"
6#include <cstdint>
7#include <expected>
8#include <gpiod.h>
9#include <span>
10#include <string>
11#include <unordered_map>
12
13namespace epaper {
14
38class Pin {
39public:
40 constexpr explicit Pin(std::uint8_t pin_number) : pin_(pin_number) {}
41
42 [[nodiscard]] constexpr auto number() const noexcept -> std::uint8_t { return pin_; }
43
44private:
45 std::uint8_t pin_;
46};
47
79 std::string gpio_chip = "/dev/gpiochip0";
80 std::string spi_device = "/dev/spidev0.0";
81 std::uint32_t spi_speed_hz = 1953125;
82};
83
94struct PinConfig {
95 unsigned int offset;
97 enum gpiod_line_value initial_value;
98};
99
158class Device {
159public:
168 Device();
169
175 explicit Device(DeviceConfig config);
176
182 ~Device() noexcept;
183
184 // Non-copyable, movable
185 Device(const Device &) = delete;
186 auto operator=(const Device &) -> Device & = delete;
187
194 Device(Device &&other) noexcept;
195
203 auto operator=(Device &&other) noexcept -> Device &;
204
215 [[nodiscard]] auto init() -> std::expected<void, Error>;
216
217 // Check if device is initialized
218 [[nodiscard]] auto is_initialized() const noexcept -> bool;
219
220 // GPIO operations
221 auto set_pin_output(Pin pin) -> void;
222 auto set_pin_input(Pin pin) -> void;
223 auto write_pin(Pin pin, bool value) -> void;
224 [[nodiscard]] auto read_pin(Pin pin) -> bool;
225
226 // SPI operations
227 auto spi_transfer(std::uint8_t value) const -> std::uint8_t;
228 auto spi_write(std::span<const std::byte> data) const -> void;
229
230 // Delay utilities
231 static auto delay_ms(std::uint32_t milliseconds) -> void;
232 static auto delay_us(std::uint32_t microseconds) -> void;
233
234 struct Delay {
235 static auto delay_ms(std::uint32_t ms) -> void { Device::delay_ms(ms); }
236 };
237
238 // -- HAL Adapters --
239
240 class HalOutput {
241 public:
242 HalOutput(Device &dev, Pin pin) : dev_(&dev), pin_(pin) {}
243 auto write(bool level) -> void { dev_->write_pin(pin_, level); }
244
245 private:
246 Device *dev_;
247 Pin pin_;
248 };
249 static_assert(hal::DigitalOutput<HalOutput>);
250
251 class HalInput {
252 public:
253 HalInput(Device &dev, Pin pin) : dev_(&dev), pin_(pin) {}
254 auto read() -> bool { return dev_->read_pin(pin_); }
255
256 private:
257 Device *dev_;
258 Pin pin_;
259 };
260 static_assert(hal::DigitalInput<HalInput>);
261
262 class HalSpi {
263 public:
264 explicit HalSpi(Device &dev) : dev_(&dev) {}
265 auto transfer(std::uint8_t byte) -> std::uint8_t { return dev_->spi_transfer(byte); }
266 auto write(std::span<const std::byte> data) -> void { dev_->spi_write(data); }
267
268 private:
269 Device *dev_;
270 };
271 static_assert(hal::SpiBus<HalSpi>);
272
273 // -- HAL Factory Methods --
274
275 [[nodiscard]] auto get_output(Pin pin) -> HalOutput {
276 set_pin_output(pin);
277 return HalOutput(*this, pin);
278 }
279
280 [[nodiscard]] auto get_input(Pin pin) -> HalInput {
281 set_pin_input(pin);
282 return HalInput(*this, pin);
283 }
284
285 [[nodiscard]] auto get_spi() -> HalSpi { return HalSpi(*this); }
286
287private:
288 auto rebuild_line_request() -> bool;
289 auto cleanup() noexcept -> void;
290
291 struct gpiod_chip *chip_ = nullptr;
292 struct gpiod_line_request *line_request_ = nullptr;
293 std::unordered_map<std::uint8_t, PinConfig> pin_configs_;
294 int spi_fd_ = -1;
295 bool initialized_ = false;
296 bool spi_initialized_ = false;
297 DeviceConfig config_;
298};
299
300} // namespace epaper
Definition device.hpp:251
auto read() -> bool
Definition device.hpp:254
HalInput(Device &dev, Pin pin)
Definition device.hpp:253
Definition device.hpp:240
HalOutput(Device &dev, Pin pin)
Definition device.hpp:242
auto write(bool level) -> void
Definition device.hpp:243
Definition device.hpp:262
auto transfer(std::uint8_t byte) -> std::uint8_t
Definition device.hpp:265
HalSpi(Device &dev)
Definition device.hpp:264
auto write(std::span< const std::byte > data) -> void
Definition device.hpp:266
Definition device.hpp:158
auto spi_transfer(std::uint8_t value) const -> std::uint8_t
Definition device.cpp:277
~Device() noexcept
Destructor. Cleans up GPIO and SPI resources.
Definition device.cpp:118
static auto delay_ms(std::uint32_t milliseconds) -> void
Definition device.cpp:328
auto spi_write(std::span< const std::byte > data) const -> void
Definition device.cpp:302
auto read_pin(Pin pin) -> bool
Definition device.cpp:263
static auto delay_us(std::uint32_t microseconds) -> void
Definition device.cpp:332
auto set_pin_output(Pin pin) -> void
Definition device.cpp:207
Device(const Device &)=delete
auto set_pin_input(Pin pin) -> void
Definition device.cpp:229
auto get_spi() -> HalSpi
Definition device.hpp:285
auto write_pin(Pin pin, bool value) -> void
Definition device.cpp:250
auto get_input(Pin pin) -> HalInput
Definition device.hpp:280
auto operator=(const Device &) -> Device &=delete
auto get_output(Pin pin) -> HalOutput
Definition device.hpp:275
auto is_initialized() const noexcept -> bool
Definition device.cpp:205
Device()
Construct a Device with default configuration.
Definition device.cpp:114
auto init() -> std::expected< void, Error >
Initialize the GPIO (libgpiod) and SPI (SPIdev) interfaces.
Definition device.cpp:152
Definition device.hpp:38
constexpr auto number() const noexcept -> std::uint8_t
Definition device.hpp:42
constexpr Pin(std::uint8_t pin_number)
Definition device.hpp:40
Definition gpio.hpp:145
Definition gpio.hpp:101
Concept for a raw SPI data transfer bus.
Definition spi.hpp:124
GPIO pin concepts for hardware abstraction.
Definition color.hpp:5
SPI bus concept for hardware abstraction.
Definition device.hpp:78
std::uint32_t spi_speed_hz
SPI clock speed in Hz (~1.95MHz)
Definition device.hpp:81
std::string spi_device
Path to SPI device.
Definition device.hpp:80
std::string gpio_chip
Path to GPIO chip device.
Definition device.hpp:79
Definition device.hpp:234
static auto delay_ms(std::uint32_t ms) -> void
Definition device.hpp:235
Pin configuration tracking (internal use).
Definition device.hpp:94
bool is_output
Definition device.hpp:96
enum gpiod_line_value initial_value
Definition device.hpp:97
unsigned int offset
Definition device.hpp:95