#include "preset_ai.h"
#include "FreeRTOS.h"
#include "task.h"
#include "settings_api.h"
#include "triggers.h"
#include "mux.h"
#include "log.h"
#include <stdio.h>

#if defined (MAI_12)

#undef DBG
#define DBG if(1)

extern led_t ai_alarm_led[];


hyst_state_t hyst_state[AI_COMMON_NUMBER];

preset_cur_t preset_cur[AI_COMMON_NUMBER];


// 
void preset_init(void)
{
    for (int i = 0; i < AI_COMMON_NUMBER; i++)
    {
        hyst_state[i] = hyst_idle;
        
        preset_cur[i].max = false;
        preset_cur[i].min = false;
    }
}


//
void preset_set_state(void)
{
    for (int i = 0; i < AI_COMMON_NUMBER; i++)
    {
        if (((settings.preset_state_bits >> i) & 1) != settings.preset[i].state)
        {
            settings.preset[i].state = ((settings.preset_state_bits >> 1) & 1);
        }
    }
}


//
void preset_process(float *data)
{
    bool high = false;
    bool low = false;

    for (int i = 0; i < AI_COMMON_NUMBER; i++)
    {
        if ((settings.preset[i].state == 0) || (settings.ai[i].state == 0))
            continue;
        
        // 0 - тип уставки - фиксированное значение
        if (settings.preset[i].type == 0)
        {
            high = trig_high_value(data[i], 0, settings.preset[i].max, settings.preset[i].hyst, &hyst_state[i]);
            low = trig_low_value(data[i], settings.preset[i].min, 0, settings.preset[i].hyst, &hyst_state[i]);
            
   
            if (preset_cur[i].max != high) {
                // Запись в журнал о срабатывании верхней уставки
                if (high == true) {
                    printf("LOG high level! [%f]\r\n", data[i]);
                    //log_add_entry(LOG_SETPOINT, 1, i + 1, data[i]);
                }
                else {
                    printf("LOF high norm [%f]\r\n", data[i]);
                    //log_add_entry(LOG_SETPOINT, 1, i + 1, data[i]);
                }
            }

            if (preset_cur[i].min != low) {
                // Запись в журнал о срабатывании нижней уставки
                if (low == true) {
                    printf("LOG low level! [%f]\r\n", data[i]);
                    
                }
                else {
                    printf("LOF low norm [%f]\r\n", data[i]);
                    
                }
            }  
            
            preset_cur[i].max = high;
            preset_cur[i].min = low;
            
#if 0            
            // 
            if (high) {
                DBG printf("Chan: %i, val: %f, HIGH\r\n", i, data[i]);
            }
            
            if (low) {
                DBG printf("Chan: %i, val: %f, LOW\r\n", i, data[i]);
            }
#endif            
        }
        
        
    }
}





#endif