Skip to content
Snippets Groups Projects
config.c 2.7 KiB
Newer Older
Jean-Benoist Leger's avatar
Jean-Benoist Leger committed
#include "config.h"

config_t config;
cconfig_t cconfig;

void config_write()
{
    uint16_t k;
    for(k=0;k<sizeof(config_t);k++)
        eeprom_write_byte(EEPROM_ADDR_CONFIG+k, *(((uint8_t*)&config)+k));
}

void config_read()
{
    uint16_t k;
    for(k=0;k<sizeof(config_t);k++)
        *(((uint8_t*)&config)+k) = eeprom_read_byte(EEPROM_ADDR_CONFIG+k);
}

void config_init()
{
    config_read();
    cconfig_update(&config, &cconfig);
    if(!config_valid(&cconfig))
    {
        config_default(&config);
        cconfig_update(&config, &cconfig);
    }
}

void cconfig_update(config_t * c, cconfig_t * cc)
{
    cc->mode = c->mode;
    cc->vol_cuve = c->vol_cuve;
    cc->Kp = 0.01 * c->Kp;
    cc->ti = c->ti;
    cc->consigne_temperature = 0.01 * c->consigne_temperature;
    cc->debit_max = 0.01 * c->debit_max;
    cc->cst_ev = c->cst_ev;
    cc->debit_min1 = 0.01 * c->debit_min1;
    cc->debit_min2 = 0.01 * c->debit_min2;
    cc->minimum_step = c->minimum_step;
    cc->debit_no_action = cc->minimum_step/cc->cst_ev;
    cc->volume_manque_max = 0.01 * c->volume_manque_max;
    cc->m_rattrapage = c->m_rattrapage;
Jean-Benoist Leger's avatar
Jean-Benoist Leger committed
    cc->consigne_debit = 0.01 * c->consigne_debit;
Jean-Benoist Leger's avatar
Jean-Benoist Leger committed
}

uint8_t config_valid(cconfig_t * cc)
{
    if(cc->mode<1 || cc->mode>5)
        return 0;
    if(cc->vol_cuve<25 || cc->vol_cuve>1000)
        return 0;
    if(cc->Kp<1 || cc->Kp>100)
        return 0;
    if(cc->ti<60 || cc->ti > 86400)
        return 0;
    if(cc->consigne_temperature < 10 || cc->consigne_temperature > 40)
        return 0;
    if(cc->debit_max < 5 || cc->debit_max > 50)
        return 0;
    if(cc->cst_ev < 1 || cc->cst_ev>100)
        return 0;
    if(cc->debit_min1 < 1 || cc->debit_min1 > 40)
        return 0;
    if(cc->debit_min2 < 1 || cc->debit_min2 > 40)
        return 0;
    if(cc->debit_min1 >= cc->debit_min2)
        return 0;
    if(cc->debit_min2 >= cc->debit_max)
        return 0;
    if(cc->minimum_step < 1 || cc->minimum_step > 150)
        return 0;
    if(cc->volume_manque_max < 1 || cc->volume_manque_max)
        return 0;
    if(cc->m_rattrapage < 1 || cc->m_rattrapage > 60)
        return 0;
Jean-Benoist Leger's avatar
Jean-Benoist Leger committed
    if(cc->consigne_debit<0 || cc->consigne_debit>50)
        return 0;
Jean-Benoist Leger's avatar
Jean-Benoist Leger committed
    return 1;
}

void config_default(config_t* c)
{
    c->mode = (uint8_t)MODE_FORCE_CLOSE;
    c->vol_cuve = 300;
    c->Kp = 32*100;
    c->ti = 3600;
    c->consigne_temperature = 2350;
    c->debit_max = 2000;
    c->cst_ev = 10;
    c->debit_min1 = 200;
    c->debit_min2 = 400;
    c->minimum_step = 10;
    c->volume_manque_max = 7500;
    c->m_rattrapage = 15;
Jean-Benoist Leger's avatar
Jean-Benoist Leger committed
    c->consigne_debit = 0;
Jean-Benoist Leger's avatar
Jean-Benoist Leger committed
}
Jean-Benoist Leger's avatar
Jean-Benoist Leger committed

void config_apply_new_config(config_t * pnew_config)
{
    // TODO: si mode change, action
    memcpy(&config, pnew_config, sizeof(config_t));
    config_write();
}