FluxSand 1.0
FluxSand - Interactive Digital Hourglass
Loading...
Searching...
No Matches
bsp_i2c.hpp
1#pragma once
2
3#include <fcntl.h>
4#include <linux/i2c-dev.h>
5#include <sys/ioctl.h>
6#include <unistd.h>
7
8#include <cassert>
9#include <cstdint>
10#include <cstring>
11#include <stdexcept>
12#include <string>
13#include <vector>
14
18class I2cDevice {
19 public:
26 I2cDevice(const std::string& device, uint8_t addr)
27 : fd_(open(device.c_str(), O_RDWR)), addr_(addr) {
28 assert(!device.empty()); /* Ensure device string is valid */
29
30 if (fd_ < 0) {
31 std::perror("Failed to open I2C device");
32 }
33
34 if (ioctl(fd_, I2C_SLAVE, addr_) < 0) {
35 close(fd_);
36 std::perror("Failed to configure I2C address");
37 }
38 }
39
42 if (fd_ >= 0) {
43 close(fd_);
44 }
45 }
46
53 uint8_t ReadRegister(uint8_t reg) {
54 if (write(fd_, &reg, 1) != 1) {
55 std::perror("I2C write (set register) failed");
56 }
57
58 uint8_t value = 0;
59 if (read(fd_, &value, 1) != 1) {
60 std::perror("I2C read failed");
61 }
62
63 return value;
64 }
65
72 void WriteRegister(uint8_t reg, uint8_t value) {
73 uint8_t buf[2] = {reg, value};
74 if (write(fd_, buf, 2) != 2) {
75 std::perror("I2C write failed");
76 }
77 }
78
86 void ReadRegisters(uint8_t reg, uint8_t* buffer, size_t length) {
87 assert(buffer);
88
89 if (write(fd_, &reg, 1) != 1) {
90 std::perror("I2C write (set start register) failed");
91 }
92
93 if (read(fd_, buffer, length) != static_cast<ssize_t>(length)) {
94 std::perror("I2C multi-byte read failed");
95 }
96 }
97
104 void WriteRaw(const uint8_t* data, size_t length) {
105 assert(data);
106
107 if (write(fd_, data, length) != static_cast<ssize_t>(length)) {
108 std::perror("I2C raw write failed");
109 }
110 }
111
115 int Fd() const { return fd_; }
116
120 uint8_t Address() const { return addr_; }
121
122 private:
123 int fd_; /* I2C file descriptor */
124 uint8_t addr_; /* I2C device address */
125};
uint8_t Address() const
Definition bsp_i2c.hpp:120
uint8_t ReadRegister(uint8_t reg)
Definition bsp_i2c.hpp:53
I2cDevice(const std::string &device, uint8_t addr)
Definition bsp_i2c.hpp:26
void WriteRaw(const uint8_t *data, size_t length)
Definition bsp_i2c.hpp:104
void ReadRegisters(uint8_t reg, uint8_t *buffer, size_t length)
Definition bsp_i2c.hpp:86
void WriteRegister(uint8_t reg, uint8_t value)
Definition bsp_i2c.hpp:72
int Fd() const
Definition bsp_i2c.hpp:115