From 28d73ad8660e27f9c7b20b6e978d3d0c412dec00 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 7 Nov 2022 12:01:29 +1100 Subject: Split driver-y things into a separate component --- src/drivers/i2c.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/drivers/i2c.cpp (limited to 'src/drivers/i2c.cpp') diff --git a/src/drivers/i2c.cpp b/src/drivers/i2c.cpp new file mode 100644 index 00000000..d3bfaa59 --- /dev/null +++ b/src/drivers/i2c.cpp @@ -0,0 +1,51 @@ +#include "i2c.hpp" +#include + +#include "assert.h" +#include "driver/i2c.h" + +namespace gay_ipod { + +static constexpr int kCmdLinkSize = I2C_LINK_RECOMMENDED_SIZE(12); + +I2CTransaction::I2CTransaction() { + // Use a fixed size buffer to avoid many many tiny allocations. + buffer_ = (uint8_t*)calloc(sizeof(uint8_t), kCmdLinkSize); + handle_ = i2c_cmd_link_create_static(buffer_, kCmdLinkSize); + assert(handle_ != NULL && "failed to create command link"); +} + +I2CTransaction::~I2CTransaction() { + free(buffer_); +} + +esp_err_t I2CTransaction::Execute() { + return i2c_master_cmd_begin(I2C_NUM_0, handle_, kI2CTimeout); +} + +I2CTransaction& I2CTransaction::start() { + ESP_ERROR_CHECK(i2c_master_start(handle_)); + return *this; +} + +I2CTransaction& I2CTransaction::stop() { + ESP_ERROR_CHECK(i2c_master_stop(handle_)); + return *this; +} + +I2CTransaction& I2CTransaction::write_addr(uint8_t addr, uint8_t op) { + write_ack(addr << 1 | op); + return *this; +} + +I2CTransaction& I2CTransaction::write_ack(uint8_t data) { + ESP_ERROR_CHECK(i2c_master_write_byte(handle_, data, true)); + return *this; +} + +I2CTransaction& I2CTransaction::read(uint8_t* dest, i2c_ack_type_t ack) { + ESP_ERROR_CHECK(i2c_master_read_byte(handle_, dest, ack)); + return *this; +} + +} // namespace gay_ipod -- cgit v1.2.3