/*#############################################################################
## Author: Shaun Reed                                                        ##
## Legal: All Content (c) 2025 Shaun Reed, all rights reserved               ##
##                                                                           ##
## Contact: shaunrd0@gmail.com  | URL: www.shaunreed.com                     ##
##############################################################################
*/
#ifndef I2C_H
#define I2C_H

#define I2C_BUS_PORT 0
#define I2C_DEFAULT_PIN_RST (-1)
#include <driver/i2c_master.h>
#include <esp_log.h>

/// Tag used for ESP logging.
static const char* I2C_TAG = "I2C component";

/**
 * ESP I2C master bus handle getter.
 */
static i2c_master_bus_handle_t I2C_get()
{
    i2c_master_bus_handle_t i2c = NULL;
    ESP_ERROR_CHECK(i2c_master_get_bus_handle(0, &i2c));
    return i2c;
}

/**
 * Construct an ESP I2C master bus given a specific ESP I2C configuration.
 * An I2C constructor may only be called one time in any application.
 *
 * @param config ESP I2C master bus configuration.
 */
static void I2C_config_init(const i2c_master_bus_config_t config)
{
    i2c_master_bus_handle_t i2c = NULL;
    ESP_LOGI(I2C_TAG, "Initializing new master I2C bus");
    ESP_ERROR_CHECK(i2c_new_master_bus(&config, &i2c));
}

/**
 * Construct and initialize an ESP I2C master bus.
 * An I2C constructor may only be called one time in any application.
 *
 * @param sda GPIO pin for SDA
 * @param scl GPIO pin for SCL
 */
static void I2C_init(gpio_num_t sda, gpio_num_t scl)
{
    I2C_config_init((i2c_master_bus_config_t){
        .i2c_port = I2C_BUS_PORT,
        .sda_io_num = sda,
        .scl_io_num = scl,
        .clk_source = I2C_CLK_SRC_DEFAULT,
        .glitch_ignore_cnt = 7,
        .flags =
            {
                .enable_internal_pullup = true,
            },
    });
}

#endif // I2C_H
