/*
 * Copyright (c) 2023 Google LLC
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Backend APIs for the fuel gauge emulators.
 */

#ifndef ZEPHYR_INCLUDE_DRIVERS_EMUL_FUEL_GAUGE_H_
#define ZEPHYR_INCLUDE_DRIVERS_EMUL_FUEL_GAUGE_H_

#include <stdint.h>
#include <zephyr/drivers/emul.h>
#include <zephyr/drivers/fuel_gauge.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Fuel gauge backend emulator APIs
 * @defgroup fuel_gauge_emulator_backend Fuel gauge backend emulator APIs
 * @ingroup io_interfaces
 * @{
 */

/**
 * @cond INTERNAL_HIDDEN
 *
 * These are for internal use only, so skip these in public documentation.
 */
__subsystem struct fuel_gauge_emul_driver_api {
	int (*set_battery_charging)(const struct emul *emul, uint32_t uV, int uA);
	int (*is_battery_cutoff)(const struct emul *emul, bool *cutoff);
};
/**
 * @endcond
 */

/**
 * @brief Set charging for fuel gauge associated battery.
 *
 * Set how much the battery associated with a fuel gauge IC is charging or discharging. Where
 * voltage is always positive and a positive or negative current denotes charging or discharging,
 * respectively.
 *
 * @param target Pointer to the emulator structure for the fuel gauge emulator instance.
 * @param uV Microvolts describing the battery voltage.
 * @param uA Microamps describing the battery current where negative is discharging.
 *
 * @retval 0 If successful.
 * @retval -EINVAL if mV or mA are 0.
 */
__syscall int emul_fuel_gauge_set_battery_charging(const struct emul *target, uint32_t uV, int uA);
static inline int z_impl_emul_fuel_gauge_set_battery_charging(const struct emul *target,
							      uint32_t uV, int uA)
{
	const struct fuel_gauge_emul_driver_api *backend_api =
		(const struct fuel_gauge_emul_driver_api *)target->backend_api;

	if (backend_api->set_battery_charging == 0) {
		return -ENOTSUP;
	}

	return backend_api->set_battery_charging(target, uV, uA);
}

/**
 * @brief Check if the battery has been cut off.
 *
 * @param target Pointer to the emulator structure for the fuel gauge emulator instance.
 * @param cutoff Pointer to bool storing variable.
 *
 * @retval 0 If successful.
 * @retval -ENOTSUP if not supported by emulator.
 */
__syscall int emul_fuel_gauge_is_battery_cutoff(const struct emul *target, bool *cutoff);
static inline int z_impl_emul_fuel_gauge_is_battery_cutoff(const struct emul *target, bool *cutoff)
{
	const struct fuel_gauge_emul_driver_api *backend_api =
		(const struct fuel_gauge_emul_driver_api *)target->backend_api;

	if (backend_api->is_battery_cutoff == 0) {
		return -ENOTSUP;
	}
	return backend_api->is_battery_cutoff(target, cutoff);
}

#ifdef __cplusplus
}
#endif

#include <syscalls/emul_fuel_gauge.h>

/**
 * @}
 */

#endif /* ZEPHYR_INCLUDE_DRIVERS_EMUL_FUEL_GAUGE_H_*/
