/*
 * Copyright (c) 2023 Cirrus Logic, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "zephyr/sys/printk.h"
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/charger.h>
#include <sys/errno.h>

static const struct device *chgdev = DEVICE_DT_GET(DT_NODELABEL(charger));

int main(void)
{
	union charger_propval val;
	int ret;

	if (chgdev == NULL) {
		printk("Error: no charger device found.\n");
		return 0;
	}

	if (!device_is_ready(chgdev)) {
		printk("Error: Device \"%s\" is not ready; "
		       "check the driver initialization logs for errors.\n",
		       chgdev->name);
		return 0;
	}

	printk("Found device \"%s\", getting charger data\n", chgdev->name);

	while (1) {
		/* Poll until external power is presented to the charger */
		do {
			ret = charger_get_prop(chgdev, CHARGER_PROP_ONLINE, &val);
			if (ret < 0) {
				return ret;
			}

			k_msleep(100);
		} while (val.online == CHARGER_ONLINE_OFFLINE);

		val.status = CHARGER_STATUS_CHARGING;

		ret = charger_set_prop(chgdev, CHARGER_PROP_STATUS, &val);
		if (ret == -ENOTSUP) {
			printk("Enabling charge not supported, assuming auto charge enable\n");
			continue;
		} else if (ret < 0) {
			return ret;
		}

		k_msleep(500);

		ret = charger_get_prop(chgdev, CHARGER_PROP_STATUS, &val);
		if (ret < 0) {
			return ret;
		}

		switch (val.status) {
		case CHARGER_STATUS_CHARGING:
			printk("Charging in progress...\n");

			ret = charger_get_prop(chgdev, CHARGER_PROP_CHARGE_TYPE, &val);
			if (ret < 0) {
				return ret;
			}

			printk("Device \"%s\" charge type is %d\n", chgdev->name, val.charge_type);
			break;
		case CHARGER_STATUS_NOT_CHARGING:
			printk("Charging halted...\n");

			ret = charger_get_prop(chgdev, CHARGER_PROP_HEALTH, &val);
			if (ret < 0) {
				return ret;
			}

			printk("Device \"%s\" health is %d\n", chgdev->name, val.health);
			break;
		case CHARGER_STATUS_FULL:
			printk("Charging complete!");
			return 0;
		case CHARGER_STATUS_DISCHARGING:
			printk("External power removed, discharging\n");

			ret = charger_get_prop(chgdev, CHARGER_PROP_ONLINE, &val);
			if (ret < 0) {
				return ret;
			}
			break;
		default:
			return -EIO;
		}

		k_msleep(500);
	}
}
