/*
 * Copyright (c) 2026 Martin Javier Klöckner <mklockner@fi.uba.ar>
 *
 * See file `LICENSE` for full details
 */

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

#include "main.h"
#include "app.h"

#include "task_temp_sensor.h"
#include "logger.h"

#include "ds18b20.h"

#define G_TASK_TEMP_SEN_TICK_INI            0ul
#define G_TASK_TEMP_SEN_TEMP_UPDATE_RATE_MS 1000ul
#define G_TASK_TEMP_SEN_OFFSET              0      // correction factor

uint32_t g_task_temp_sensor_tick;

// this variable is incremented by 1 on every ms by HAL_SysTick
volatile uint32_t g_task_temp_sensor_tick_cnt;

void task_temp_sensor_init(void *parameters)
{
    LOGGER_INFO("Initializing `task_temp_sensor`...");

    g_task_temp_sensor_tick = G_TASK_TEMP_SEN_TICK_INI;
    ds18b20_init();

    LOGGER_INFO("Done initializing `task_temp_sensor`");
}

void task_temp_sensor_update(void *parameters)
{
    bool b_time_update_required = false;
    shared_data_type *p_shared_data = (shared_data_type *)parameters;

    __asm("CPSID i");
    if (G_TASK_TEMP_SEN_TICK_INI < g_task_temp_sensor_tick_cnt)
    {
        g_task_temp_sensor_tick_cnt--;
        b_time_update_required = true;
    }
    __asm("CPSIE i");

    while (b_time_update_required)
    {
        __asm("CPSID i");
        if (G_TASK_TEMP_SEN_TICK_INI < g_task_temp_sensor_tick_cnt)
        {
            g_task_temp_sensor_tick_cnt--;
            b_time_update_required = true;
        }
        else
        {
            b_time_update_required = false;
        }
        __asm("CPSIE i");

        ds18b20_async_tick();

        if (0 == g_task_temp_sensor_tick)
        {
            g_task_temp_sensor_tick = G_TASK_TEMP_SEN_TEMP_UPDATE_RATE_MS;
            ds18b20_async_read_temp();
        }
        else
        {
            g_task_temp_sensor_tick--;
        }

        if (ds18b20_async_temp_ready())
        {
            p_shared_data->temp_sensor = ds18b20_async_get_temp() + G_TASK_TEMP_SEN_OFFSET;
        }
    }
}
