/*
 * Copyright (c) 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 *   This file implements the thermometer abstraction that uses Zephyr sensor
 *   API for the die thermometer.
 *
 */

#include "platform/nrf_802154_temperature.h"

#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>

/** @brief Default temperature [C] reported if NRF_802154_TEMPERATURE_UPDATE is disabled. */
#define DEFAULT_TEMPERATURE 20

#define LOG_LEVEL LOG_LEVEL_INFO
#define LOG_MODULE_NAME nrf_802154_temperature
LOG_MODULE_REGISTER(LOG_MODULE_NAME);

static int8_t value = DEFAULT_TEMPERATURE;


#if defined(CONFIG_NRF_802154_TEMPERATURE_UPDATE)

static const struct device *device = DEVICE_DT_GET(DT_NODELABEL(temp));
static struct k_work_delayable dwork;

static void work_handler(struct k_work *work)
{
	struct sensor_value val;
	int err;

	err = sensor_sample_fetch(device);
	if (!err) {
		err = sensor_channel_get(device, SENSOR_CHAN_DIE_TEMP, &val);
	}

	if (!err && (value != val.val1)) {
		value = val.val1;

		nrf_802154_temperature_changed();
	}

	k_work_reschedule(&dwork, K_MSEC(CONFIG_NRF_802154_TEMPERATURE_UPDATE_PERIOD));
}

static int temperature_update_init(const struct device *dev)
{
	ARG_UNUSED(dev);

	__ASSERT_NO_MSG(device_is_ready(device));

	k_work_init_delayable(&dwork, work_handler);
	k_work_schedule(&dwork, K_NO_WAIT);

	return 0;
}

SYS_INIT(temperature_update_init, POST_KERNEL, CONFIG_NRF_802154_TEMPERATURE_UPDATE_INIT_PRIO);
BUILD_ASSERT(CONFIG_SENSOR_INIT_PRIORITY < CONFIG_NRF_802154_TEMPERATURE_UPDATE_INIT_PRIO,
	     "CONFIG_SENSOR_INIT_PRIORITY must be lower than CONFIG_NRF_802154_TEMPERATURE_UPDATE_INIT_PRIO");
#endif /* defined(CONFIG_NRF_802154_TEMPERATURE_UPDATE) */

void nrf_802154_temperature_init(void)
{
	/* Intentionally empty. */
}

void nrf_802154_temperature_deinit(void)
{
	/* Intentionally empty. */
}

int8_t nrf_802154_temperature_get(void)
{
	return value;
}
