roo_display
API Documentation for roo_display
Loading...
Searching...
No Matches
i2c.h
Go to the documentation of this file.
1#pragma once
2
3#if defined(ARDUINO) || defined(ROO_TESTING)
4#include <Arduino.h>
5
6#include "roo_backport.h"
7#include "roo_backport/byte.h"
8
9// Generic Arduino implementation.
10
11#include <Wire.h>
12
13#include "roo_logging.h"
14
15namespace roo_display {
16
17// I2C master bus, using the default <Wire.h> from the Arduino framework.
18class ArduinoI2cMasterBusHandle {
19 public:
20 // Creates the I2C master bus handle that references the specified Wire.
21 ArduinoI2cMasterBusHandle(decltype(Wire)& wire = Wire) : wire_(wire) {}
22
23 void init() { wire_.begin(); }
24
25 void init(int sda, int scl, uint32_t frequency = 0) {
26 wire_.begin(sda, scl, frequency);
27 }
28
29 private:
30 friend class ArduinoI2cSlaveDevice;
31
32 decltype(Wire)& wire_;
33};
34
35class ArduinoI2cSlaveDevice {
36 public:
37 ArduinoI2cSlaveDevice(ArduinoI2cMasterBusHandle& bus_handle,
38 uint8_t slave_address)
39 : wire_(bus_handle.wire_), slave_address_(slave_address) {}
40
41 void init() {}
42
43 bool transmit(const roo::byte* data, size_t len) {
44 wire_.beginTransmission(slave_address_);
45 size_t written = wire_.write((const uint8_t*)data, len);
46 if (written < len) return false;
47 uint8_t result = wire_.endTransmission();
48 return (result == 0);
49 }
50
51 size_t receive(roo::byte* data, size_t len) {
52 size_t received = wire_.requestFrom(slave_address_, len);
53 for (size_t i = 0; i < received; ++i) {
54 *data++ = static_cast<roo::byte>(wire_.read());
55 }
56 return received;
57 }
58
59 private:
60 decltype(Wire)& wire_;
61 uint8_t slave_address_;
62};
63
64} // namespace roo_display
65
66#endif // defined(ARDUINO) || defined(ROO_TESTING)
Defines 140 opaque HTML named colors.