#ifndef __BQ4050_H__
#define __BQ4050_H__

#include "driver/i2c.h"
#include "esp_log.h"

static i2c_port_t __BQ4050__I2C_port__;
static uint8_t __BQ4050__I2C_address__;
static void *(esp_err_t)__BQ4050_ERR_CB__;

void bq_Init(i2c_port_t I2C_NUM, uint8_t I2C_address, void *(esp_err_t)bq4050_err_cb);
uint8_t bq_BattState();                  // Return CHG/DSG(0xF?/0x0?), OK/Bad(0x?0/0x?F)
uint16_t bq_GetAdvState();               // Return XDSG/XCHG/PF/SS/FC/FD/TAPR/VCT/CB/SMTH/SU/IN/VDQ/FCCX/EDV2/EDV1
uint16_t bq_GetVoltage();                // Unit: mV
int16_t bq_GetCurrent();                 // Unit: mA
uint8_t bq_GetRSOC();                    // Unit: %
uint16_t bq_GetT2E();                    // Unit: min
uint16_t bq_GetT2F();                    // Unit: min
uint16_t bq_GetPackTemp();               // Unit: 0.1K
uint8_t bq_GetMaxErr();                  // Unit: %
uint8_t bq_GetHealth();                  // Unit: %
uint16_t bq_GetCellVolt(uint8_t cellNo); // Unit: mV
uint16_t bq_GetCycleCnt();
esp_err_t bq4050_register_read(uint8_t reg_addr, uint8_t *data, size_t len);
esp_err_t bq4050_register_write(uint8_t *data, size_t len);
void ESP_I2C_ERROR_CHECK(esp_err_t errcode);

void bq_GetLifetimeBlock(uint8_t blockNo, uint8_t *blockBuf);
void bq_MACReadBlock(uint8_t *inBlock, uint8_t inLen, uint8_t *outBlock, uint8_t outLen);

#endif