22#include "driver/i2c_types.h"
23#include "driver/i2c_master.h"
31#define AS_GPIO(pin) static_cast<gpio_num_t>((int)(pin))
33#define AS_PORT(bus) static_cast<i2c_port_num_t>(bus)
35#define GPIO_SET_LEVEL(pin, level) gpio_set_level(static_cast<gpio_num_t>((int)(pin)), (level))
37#define I2C_SLAVE(dev) static_cast<i2c_master_dev_handle_t>(dev)
39#define GPIO_GET_LEVEL(pin) gpio_get_level(static_cast<gpio_num_t>((int)(pin)))
45#define DELAY_TICKS(ticks) vTaskDelay(ticks)
47#define DELAY_MS(ms) vTaskDelay(pdMS_TO_TICKS(ms))
49#define DELAY_TICKS(ticks) std::this_thread::sleep_for(std::chrono::microseconds(ticks))
50#define DELAY_MS(ms) std::this_thread::sleep_for(std::chrono::milliseconds(ms))
57#define NS_PER_LOOP ((4000 + CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ - 1) / CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ)
66#define active_wait_ns(n) \
67 for (uint32_t i = 0; i < n; i += NS_PER_LOOP) \
90 "I2C: unable to initialize bus. SDA=" +
95 std::to_string(bus)) {}
104 : std::runtime_error(
105 "I2C: invalid address " +
106 std::to_string((int)address) +
126 : std::runtime_error(
127 "I2C: device not found, but required. Bus=" +
128 std::to_string(bus) +
129 " Hw/Full address=" +
130 std::to_string(address) +
150 : std::runtime_error(
151 "I2C: unable to detect full address. Bus=" +
152 std::to_string(bus) +
154 std::to_string(hwAddress) +
204 bool enableInternalPullup =
true);
214 I2CBus bus = I2CBus::PRIMARY);
228 uint8_t address7bits,
229 uint8_t max_speed_multiplier,
252 uint8_t address7bits,
253 I2CBus bus = I2CBus::PRIMARY);
263 std::vector<uint8_t> &result,
264 I2CBus bus = I2CBus::PRIMARY);
276 uint8_t address7bits,
277 uint8_t minAddress = 0,
278 uint8_t maxAddress = 127);
296 std::vector<uint8_t> &fullAddressList,
297 uint8_t hardwareAddress,
298 uint8_t hardwareAddressMask = 0b00000111);
352 void setFakeADCReading(
const std::vector<int> &injectedADCValues);
void enableISR(InputGPIO pin, ISRHandler handler, void *param=nullptr)
Enable an interrupt service routine.
void(* ISRHandler)(void *arg)
Interrupt Service Routine.
i2c_master_dev_handle_t add_device(uint8_t address7bits, uint8_t max_speed_multiplier, I2CBus bus)
Add an slave device ensuring the bus is initialized.
void abortOnInvalidAddress(uint8_t address7bits, uint8_t minAddress=0, uint8_t maxAddress=127)
Abort and reboot on an invalid I2C address.
void forOutput(OutputGPIO pin, bool initialLevel, bool openDrain)
Configure a pin for output.
void require(I2CBus bus=I2CBus::PRIMARY)
Ensure the I2C bus is initialized.
int getADCreading(ADC_GPIO pin, int sampleCount=1)
Get the mean of some continuous ADC readings.
void forInput(InputGPIO pin, bool enablePullDown, bool enablePullUp)
Configure a pin for digital input.
void remove_device(i2c_master_dev_handle_t i2c_device)
Remove an slave device.
bool probe(uint8_t address7bits, I2CBus bus=I2CBus::PRIMARY)
Check slave device availability on an I2C bus.
uint8_t findFullAddress(std::vector< uint8_t > &fullAddressList, uint8_t hardwareAddress, uint8_t hardwareAddressMask=0b00000111)
Find the full address of a device.
void initialize(GPIO sda, GPIO scl, I2CBus bus, bool enableInternalPullup=true)
Initialize an I2C bus to certain pins.
Types and constants used everywhere for firmware implementation.
Types and constants required for custom firmware setup.
I2CBus
I2C bus controller.
Exception for I2C devices not found.
i2c_device_not_found(uint8_t address, int bus=0)
Construct a new i2c_device_not_found exception.
Exception for I2C bus initialization failure.
i2c_error(uint8_t address)
Invalid I2C address exception.
i2c_error(int sda, int scl, int bus)
Unable to initialize the I2C bus exception.
Exception for unknown full I2C address.
i2c_full_address_unknown(uint8_t hwAddress, int bus=0)
Construct a new i2c_full_address_unknown exception.
ADC-capable GPIO pin number.
Output-capable GPIO pin number.