/*
 * Copyright 2021 Matija Tudan
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/drivers/i2c.h>
#include <zephyr/drivers/sensor.h>

#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(max17262, CONFIG_SENSOR_LOG_LEVEL);

#include "max17262.h"

#define DT_DRV_COMPAT maxim_max17262

/**
 * @brief Read a register value
 *
 * Registers have an address and a 16-bit value
 *
 * @param dev MAX17262 device to access
 * @param reg_addr Register address to read
 * @param valp Place to put the value on success
 * @return 0 if successful, or negative error code from I2C API
 */
static int max17262_reg_read(const struct device *dev, uint8_t reg_addr,
			     int16_t *valp)
{
	const struct max17262_config *cfg = dev->config;
	uint8_t i2c_data[2];
	int rc;

	rc = i2c_burst_read(cfg->i2c, cfg->i2c_addr, reg_addr,
			    i2c_data, 2);
	if (rc < 0) {
		LOG_ERR("Unable to read register");
		return rc;
	}
	*valp = ((int16_t)i2c_data[1] << 8) | i2c_data[0];

	return 0;
}

/**
 * @brief Write a register value
 *
 * Registers have an address and a 16-bit value
 *
 * @param dev MAX17262 device to access
 * @param reg_addr Register address to write to
 * @param val Register value to write
 * @return 0 if successful, or negative error code from I2C API
 */
static int max17262_reg_write(const struct device *dev, uint8_t reg_addr,
			     int16_t val)
{
	const struct max17262_config *cfg = dev->config;
	uint8_t i2c_data[3] = {reg_addr, val & 0xFF, (uint16_t)val >> 8};

	return i2c_write(cfg->i2c, i2c_data, sizeof(i2c_data),
		     cfg->i2c_addr);
}

/**
 * @brief Convert sensor value from millis
 *
 * @param val Where to store converted value in sensor_value format
 * @param val_millis Value in millis
 */
static void convert_millis(struct sensor_value *val, int32_t val_millis)
{
	val->val1 = val_millis / 1000;
	val->val2 = (val_millis % 1000) * 1000;
}

/**
 * @brief Convert raw register values for specific channel
 *
 * @param dev MAX17262 device to access
 * @param chan Channel number to read
 * @param valp Returns the sensor value read on success
 * @return 0 if successful
 * @return -ENOTSUP for unsupported channels
 */
static int max17262_channel_get(const struct device *dev,
				enum sensor_channel chan,
				struct sensor_value *valp)
{
	const struct max17262_config *const config = dev->config;
	struct max17262_data *const data = dev->data;
	int32_t tmp;

	switch (chan) {
	case SENSOR_CHAN_GAUGE_VOLTAGE:
		/* Get voltage in uV */
		tmp = data->voltage * VOLTAGE_MULTIPLIER_UV;
		/* Convert to V */
		valp->val1 = tmp / 1000000;
		valp->val2 = tmp % 1000000;
		break;
	case SENSOR_CHAN_GAUGE_AVG_CURRENT: {
		int current;
		/* Get avg current in nA */
		current = data->avg_current * CURRENT_MULTIPLIER_NA;
		/* Convert to mA */
		valp->val1 = current / 1000000;
		valp->val2 = current % 1000000;
		break;
	}
	case SENSOR_CHAN_GAUGE_STATE_OF_CHARGE:
		valp->val1 = data->state_of_charge / 256;
		valp->val2 = data->state_of_charge % 256 * 1000000 / 256;
		break;
	case SENSOR_CHAN_GAUGE_TEMP:
		valp->val1 = data->internal_temp / 256;
		valp->val2 = data->internal_temp % 256 * 1000000 / 256;
		break;
	case SENSOR_CHAN_GAUGE_FULL_CHARGE_CAPACITY:
		convert_millis(valp, data->full_cap);
		break;
	case SENSOR_CHAN_GAUGE_REMAINING_CHARGE_CAPACITY:
		convert_millis(valp, data->remaining_cap);
		break;
	case SENSOR_CHAN_GAUGE_TIME_TO_EMPTY:
		/* Get time in ms */
		if (data->time_to_empty == 0xffff) {
			valp->val1 = 0;
			valp->val2 = 0;
		} else {
			tmp = data->time_to_empty * TIME_MULTIPLIER_MS;
			convert_millis(valp, tmp);
		}
		break;
	case SENSOR_CHAN_GAUGE_TIME_TO_FULL:
		/* Get time in ms */
		if (data->time_to_full == 0xffff) {
			valp->val1 = 0;
			valp->val2 = 0;
		} else {
			tmp = data->time_to_full * TIME_MULTIPLIER_MS;
			convert_millis(valp, tmp);
		}
		break;
	case SENSOR_CHAN_GAUGE_CYCLE_COUNT:
		valp->val1 = data->cycle_count / 100;
		valp->val2 = data->cycle_count % 100 * 10000;
		break;
	case SENSOR_CHAN_GAUGE_NOM_AVAIL_CAPACITY:
		convert_millis(valp, data->design_cap);
		break;
	case SENSOR_CHAN_GAUGE_DESIGN_VOLTAGE:
		convert_millis(valp, config->design_voltage);
		break;
	case SENSOR_CHAN_GAUGE_DESIRED_VOLTAGE:
		convert_millis(valp, config->desired_voltage);
		break;
	case SENSOR_CHAN_GAUGE_DESIRED_CHARGING_CURRENT:
		valp->val1 = data->ichg_term;
		valp->val2 = 0;
		break;
	case MAX17262_COULOMB_COUNTER:
		/* Get spent capacity in mAh */
		data->coulomb_counter = 0xffff - data->coulomb_counter;
		valp->val1 = data->coulomb_counter / 2;
		valp->val2 = data->coulomb_counter % 2 * 10 / 2;
		break;
	default:
		LOG_ERR("Unsupported channel!");
		return -ENOTSUP;
	}

	return 0;
}

/**
 * @brief Read register values for supported channels
 *
 * @param dev MAX17262 device to access
 * @return 0 if successful, or negative error code from I2C API
 */
static int max17262_sample_fetch(const struct device *dev,
				 enum sensor_channel chan)
{
	struct max17262_data *data = dev->data;
	struct {
		int reg_addr;
		int16_t *dest;
	} regs[] = {
		{ VCELL, &data->voltage },
		{ AVG_CURRENT, &data->avg_current },
		{ ICHG_TERM, &data->ichg_term },
		{ REP_SOC, &data->state_of_charge },
		{ INT_TEMP, &data->internal_temp },
		{ REP_CAP, &data->remaining_cap },
		{ FULL_CAP_REP, &data->full_cap },
		{ TTE, &data->time_to_empty },
		{ TTF, &data->time_to_full },
		{ CYCLES, &data->cycle_count },
		{ DESIGN_CAP, &data->design_cap },
		{ COULOMB_COUNTER, &data->coulomb_counter },
	};

	__ASSERT_NO_MSG(chan == SENSOR_CHAN_ALL);
	for (size_t i = 0; i < ARRAY_SIZE(regs); i++) {
		int rc;

		rc = max17262_reg_read(dev, regs[i].reg_addr, regs[i].dest);
		if (rc != 0) {
			LOG_ERR("Failed to read channel %d", chan);
			return rc;
		}
	}

	return 0;
}

/**
 * @brief Initialise the fuel gauge
 *
 * @param dev MAX17262 device to access
 * @return 0 for success
 * @return -EINVAL if the I2C controller could not be found
 */
static int max17262_gauge_init(const struct device *dev)
{
	const struct max17262_config *const config = dev->config;
	int16_t tmp, hibcfg;

	if (!device_is_ready(config->i2c)) {
		LOG_ERR("Could not get pointer to %s device", config->i2c->name);
		return -EINVAL;
	}

	/* Read Status register */
	max17262_reg_read(dev, STATUS, &tmp);

	if (!(tmp & STATUS_POR)) {
		/*
		 * Status.POR bit is set to 1 when MAX17262 detects that
		 * a software or hardware POR event has occurred and
		 * therefore a custom configuration needs to be set...
		 * If POR event did not happen (Status.POR == 0), skip
		 * init and continue with measurements.
		 */
		LOG_DBG("No POR event detected - skip device configuration");
		return 0;
	}
	LOG_DBG("POR detected, setting custom device configuration...");

	/** STEP 1 */
	max17262_reg_read(dev, FSTAT, &tmp);

	/* Do not continue until FSTAT.DNR bit is cleared */
	while (tmp & FSTAT_DNR) {
		k_sleep(K_MSEC(10));
		max17262_reg_read(dev, FSTAT, &tmp);
	}

	/** STEP 2 */
	/* Store original HibCFG value */
	max17262_reg_read(dev, HIBCFG, &hibcfg);

	/* Exit Hibernate Mode step 1 */
	max17262_reg_write(dev, SOFT_WAKEUP, 0x0090);
	/* Exit Hibernate Mode step 2 */
	max17262_reg_write(dev, HIBCFG, 0x0000);
	/* Exit Hibernate Mode step 3 */
	max17262_reg_write(dev, SOFT_WAKEUP, 0x0000);

	/** STEP 2.1 --> OPTION 1 EZ Config (No INI file is needed) */
	/* Write DesignCap */
	max17262_reg_write(dev, DESIGN_CAP, config->design_cap);

	/* Write IChgTerm */
	max17262_reg_write(dev, ICHG_TERM, config->desired_charging_current);

	/* Write VEmpty */
	max17262_reg_write(dev, VEMPTY, ((config->empty_voltage / 10) << 7) |
					  ((config->recovery_voltage / 40) & 0x7F));

	/* Write ModelCFG */
	if (config->charge_voltage > 4275) {
		max17262_reg_write(dev, MODELCFG, 0x8400);
	} else {
		max17262_reg_write(dev, MODELCFG, 0x8000);
	}

	/*
	 * Read ModelCFG.Refresh (highest bit),
	 * proceed to Step 3 when ModelCFG.Refresh == 0
	 */
	max17262_reg_read(dev, MODELCFG, &tmp);

	/* Do not continue until ModelCFG.Refresh == 0 */
	while (tmp & MODELCFG_REFRESH) {
		k_sleep(K_MSEC(10));
		max17262_reg_read(dev, MODELCFG, &tmp);
	}

	/* Restore Original HibCFG value */
	max17262_reg_write(dev, HIBCFG, hibcfg);

	/** STEP 3 */
	/* Read Status register */
	max17262_reg_read(dev, STATUS, &tmp);

	/* Clear PowerOnReset bit */
	tmp &= ~STATUS_POR;
	max17262_reg_write(dev, STATUS, tmp);

	return 0;
}

static const struct sensor_driver_api max17262_battery_driver_api = {
	.sample_fetch = max17262_sample_fetch,
	.channel_get = max17262_channel_get,
};

#define MAX17262_INIT(n)						\
	static struct max17262_data max17262_data_##n;			\
									\
	static const struct max17262_config max17262_config_##n = {	\
		.i2c = DEVICE_DT_GET(DT_INST_BUS(n)),			\
		.i2c_addr = DT_INST_REG_ADDR(n),			\
		.design_voltage = DT_INST_PROP(n, design_voltage),	\
		.desired_voltage = DT_INST_PROP(n, desired_voltage),	\
		.desired_charging_current =				\
			DT_INST_PROP(n, desired_charging_current),	\
		.design_cap = DT_INST_PROP(n, design_cap),		\
		.empty_voltage = DT_INST_PROP(n, empty_voltage),	\
		.recovery_voltage = DT_INST_PROP(n, recovery_voltage),	\
		.charge_voltage = DT_INST_PROP(n, charge_voltage),	\
	};								\
									\
	DEVICE_DT_INST_DEFINE(n, &max17262_gauge_init,			\
			    NULL,					\
			    &max17262_data_##n,				\
			    &max17262_config_##n, POST_KERNEL,		\
			    CONFIG_SENSOR_INIT_PRIORITY,		\
			    &max17262_battery_driver_api);

DT_INST_FOREACH_STATUS_OKAY(MAX17262_INIT)
