22#include "driver/i2c_types.h"
23#include "driver/i2c_master.h"
24#include "freertos/FreeRTOS.h"
34#define AS_GPIO(pin) static_cast<gpio_num_t>((int)(pin))
36#define AS_PORT(bus) static_cast<i2c_port_num_t>(bus)
38#define GPIO_SET_LEVEL(pin, level) gpio_set_level(static_cast<gpio_num_t>((int)(pin)), (level))
40#define I2C_SLAVE(dev) static_cast<i2c_master_dev_handle_t>(dev)
42#define GPIO_GET_LEVEL(pin) gpio_get_level(static_cast<gpio_num_t>((int)(pin)))
48#define DELAY_TICKS(ticks) vTaskDelay(ticks)
50#define DELAY_MS(ms) vTaskDelay(pdMS_TO_TICKS(ms))
52#define DELAY_TICKS(ticks) std::this_thread::sleep_for(std::chrono::microseconds(ticks))
53#define DELAY_MS(ms) std::this_thread::sleep_for(std::chrono::milliseconds(ms))
60#define NS_PER_LOOP ((4000 + CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ - 1) / CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ)
69#define active_wait_ns(n) \
70 for (uint32_t i = 0; i < n; i += NS_PER_LOOP) \
93 "I2C: unable to initialize bus. SDA=" +
98 std::to_string(bus)) {}
107 : std::runtime_error(
108 "I2C: invalid address " +
109 std::to_string((int)address) +
129 : std::runtime_error(
130 "I2C: device not found, but required. Bus=" +
131 std::to_string(bus) +
132 " Hw/Full address=" +
133 std::to_string(address) +
153 : std::runtime_error(
154 "I2C: unable to detect full address. Bus=" +
155 std::to_string(bus) +
157 std::to_string(hwAddress) +
210 bool enableInternalPullup =
true);
220 I2CBus bus = I2CBus::PRIMARY);
234 uint8_t address7bits,
235 uint8_t max_speed_multiplier,
259 uint8_t address7bits,
260 I2CBus bus = I2CBus::PRIMARY);
270 std::vector<uint8_t> &result,
271 I2CBus bus = I2CBus::PRIMARY);
283 uint8_t address7bits,
284 uint8_t minAddress = 0,
285 uint8_t maxAddress = 127);
305 std::vector<uint8_t> &fullAddressList,
306 uint8_t hardwareAddress,
307 uint8_t hardwareAddressMask = 0b00000111);
362 void setFakeADCReading(
const std::vector<int> &injectedADCValues);
375 void *param =
nullptr);
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.