13 static constexpr uint8_t REG_DAC_PIN = 0x05;
14 static constexpr uint8_t REG_ADC_PIN = 0x04;
15 static constexpr uint8_t REG_OPENDRAIN = 0x0C;
16 static constexpr uint8_t REG_GPO_ENABLE = 0x08;
17 static constexpr uint8_t REG_GPI_ENABLE = 0x0A;
18 static constexpr uint8_t REG_ADC_SEQ = 0x02;
19 static constexpr uint8_t REG_GENERAL = 0x03;
20 static constexpr uint8_t REG_POWERDOWN = 0x0B;
21 static constexpr uint8_t REG_PULLDOWN = 0x06;
22 static constexpr uint8_t REG_GPO_WRITE = 0x09;
23 static constexpr uint8_t REG_GPI_READ = 0x60;
24 static constexpr uint8_t REG_RESET = 0x0F;
29 i2c_.write_raw(REG_POWERDOWN, 0x2, 0x0);
31 i2c_.write_raw(REG_GENERAL, 0x1, 0x0);
34 void setup_gpi(
int pin,
bool pull_down =
false) {
35 if (pin < 0 || pin > 7)
return;
36 clear_bit(REG_GPO_ENABLE, pin);
37 clear_bit(REG_ADC_PIN, pin);
38 clear_bit(REG_DAC_PIN, pin);
39 set_bit(REG_GPI_ENABLE, pin);
41 set_bit(REG_PULLDOWN, pin);
43 clear_bit(REG_PULLDOWN, pin);
47 void setup_gpo(
int pin,
int value = -1) {
48 if (pin < 0 || pin > 7)
return;
49 clear_bit(REG_GPI_ENABLE, pin);
50 clear_bit(REG_ADC_PIN, pin);
51 clear_bit(REG_DAC_PIN, pin);
53 clear_bit(REG_GPO_WRITE, pin);
55 set_bit(REG_GPO_WRITE, pin);
57 set_bit(REG_GPO_ENABLE, pin);
60 bool is_gpo(
int pin) {
return read_reg(REG_GPO_ENABLE) & (1 << pin); }
62 bool gpo_get_value(
int pin) {
return read_reg(REG_GPO_WRITE) & (1 << pin); }
64 void setup_dac(
int pin,
bool zero =
true) {
65 if (pin < 0 || pin > 7)
return;
66 clear_bit(REG_GPO_ENABLE, pin);
67 clear_bit(REG_GPI_ENABLE, pin);
68 set_bit(REG_ADC_PIN, pin);
69 set_bit(REG_PULLDOWN, pin);
74 set_bit(REG_DAC_PIN, pin);
77 void setup_adc(
int pin) {
78 if (pin < 0 || pin > 7)
return;
80 clear_bit(REG_DAC_PIN, pin);
82 clear_bit(REG_GPI_ENABLE, pin);
84 clear_bit(REG_GPO_ENABLE, pin);
86 clear_bit(REG_PULLDOWN, pin);
88 set_bit(REG_ADC_PIN, pin);
91 int adc_read(
int pin) {
97 i2c_.write_raw(REG_ADC_SEQ, 0x0, (1 << pin));
101 return int(result[1]) + (int(result[0] & 0xF) << 8);
104 float adc_volts(
int pin,
int ave = 10) {
106 for (
int i = 0; i < ave; i++) sum += adc_read(pin);
107 return (sum * 1.0 / ave) * 2.5 / 4096;
110 void dac_write(
int pin, uint16_t value) {
111 if (pin < 0 || pin > 7)
return;
112 i2c_.write_raw(0x10 | pin, ((0x08 | pin) << 4) | ((value & 0xF00) >> 8),
116 void clear_pin(
int pin) {
117 clear_bit(REG_GPO_ENABLE, pin);
118 clear_bit(REG_GPI_ENABLE, pin);
119 clear_bit(REG_ADC_PIN, pin);
120 clear_bit(REG_DAC_PIN, pin);
124 uint16_t read_reg(uint8_t reg) {
125 i2c_.write_raw(0x70 | (reg & 0xF));
127 return (uint16_t(rv[0]) << 8) | (rv[1]);
129 void write_reg(uint8_t reg, uint16_t value) {
130 uint8_t b = uint8_t(value >> 8);
131 uint8_t c = uint8_t(value & 0xFF);
132 i2c_.write_raw((reg & 0xF), b, c);
134 void set_bit(uint8_t reg,
int bit) {
135 uint16_t val = read_reg(reg);
139 void clear_bit(uint8_t reg,
int bit) {
140 uint16_t val = read_reg(reg);