#include "at32f403a_407.h"
#include "modbus_dio_params.h"
#include "modbus_params.h"
#include "digital_input.h"
#include "digital_output.h"
#include "settings_api.h"
#include "io.h"

extern mb_param_t mb_param[];

#if defined (MDIO_88)


//
uint16_t mb_init_dio_params(uint16_t i)
{
    uint16_t index = i;
    uint16_t addr = 0;  
  
    // Статус дискретных входов (вкл./выкл.)
    mb_param[index].reg = 0x0100;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&settings.di_state_bits;  
	mb_param[index].set = mb_set_di_state;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
  
    // Текущее состояние входов
    mb_param[index].reg = 0x0101;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&di_state_bit;  
	mb_param[index].set = NULL;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // Счетчики импульсов. Регистры 0x0102 - 0x0111
    addr = 0x0102;
    for (int i = 0; i < DI_NUMBER; i++)
    {
        mb_param[index].reg = addr;
        mb_param[index].size = 2;
        mb_param[index].param = (uint8_t*)&di_cnt[i]; 
        mb_param[index].set = NULL;
        mb_param[index].get = NULL;
        mb_param[index].check_handler = mb_check_dummy;
        
        addr += 2;
        index++;
    }
    
    // Режим работы входов
    mb_param[index].reg = 0x0120;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&settings.di_mode_bits;  
	mb_param[index].set = mb_set_din_mode;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // Нормальное состояние входов
    mb_param[index].reg = 0x0122;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&settings.di_norm_state_bits;  
	mb_param[index].set = NULL;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
 
    // Время антидребезга
    addr = 0x0124;
    for (int i = 0; i < DI_NUMBER; i++)
    {
        mb_param[index].reg = addr;
        mb_param[index].size = 1;
        mb_param[index].param = (uint8_t*)&settings.di_debounce[i];
        mb_param[index].set = NULL;
        mb_param[index].get = NULL;
        mb_param[index].check_handler = mb_check_dummy;
        
        addr++;
        index++;
    }

    // Текущее состояние датчиков нагрузки
    mb_param[index].reg = 0x0130;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&di_load_state_bit;
	mb_param[index].set = NULL;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // Текущее датчиков неисправности выходов
    mb_param[index].reg = 0x0131;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&di_output_state_bit;
	mb_param[index].set = NULL;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // Слово достоверности датчиков нагрузки [1 - показания достоверны, 0 - нет]
    mb_param[index].reg = 0x0131;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&di_credibility_state_bit;
	mb_param[index].set = NULL;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // -------------------------------------------------------------------------
    // Параметры дискретных выходов
    
    // Статус выходов вкл./выкл.
    mb_param[index].reg = 0x0200;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&output_state_bit;
	mb_param[index].set = mb_set_do;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // Статус выходов вкл./выкл. в безопасном режиме
    mb_param[index].reg = 0x0201;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&output_state_save_bit;
	mb_param[index].set = mb_set_do;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // Текущее состояние выходов
    mb_param[index].reg = 0x0202;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&output_value_bit;  
	mb_param[index].set = mb_set_do;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // Состояние выходов в безопасном режиме
    mb_param[index].reg = 0x0203;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&output_value_save_bit;  
	mb_param[index].set = mb_set_do;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // Режим работы выходов
    mb_param[index].reg = 0x0204;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&output_mode_bit;  
	mb_param[index].set = mb_set_do;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // Режим работы выходов в безопасном режиме
    mb_param[index].reg = 0x0205;
	mb_param[index].size = 1;
	mb_param[index].param = (uint8_t*)&output_mode_save_bit;  
	mb_param[index].set = mb_set_do;
    mb_param[index].get = NULL;
    mb_param[index].check_handler = mb_check_dummy;
    
    index++;
    
    // Заполнение PWM. Регистры 0x0210 - 0x0217
    addr = 0x0210;
    for (int i = 0; i < DO_NUMBER; i++)
    {
        mb_param[index].reg = addr;
        mb_param[index].size = 1;
        mb_param[index].param = (uint8_t*)&output_pwm[i];  
        mb_param[index].set = mb_set_do;
        mb_param[index].get = NULL;
        mb_param[index].check_handler = mb_check_dummy;
        
        addr++;
        index++;
    }
    
    // Заполнение PWM в безопасном режиме. Регистры 0x0220 - 0x0227
    addr = 0x0220;
    for (int i = 0; i < DO_NUMBER; i++)
    {
        mb_param[index].reg = addr;
        mb_param[index].size = 1;
        mb_param[index].param = (uint8_t*)&output_pwm_save[i];
        mb_param[index].set = mb_set_do;
        mb_param[index].get = NULL;
        mb_param[index].check_handler = mb_check_dummy;
        
        addr++;
        index++;
    }
    
    // Период PWM. Регистры 0x0220 - 0x0227
    addr = 0x0230;
    for (int i = 0; i < DO_NUMBER; i++)
    {
        mb_param[index].reg = addr;
        mb_param[index].size = 1;
        mb_param[index].param = (uint8_t*)&output_pwm_period[i];
        mb_param[index].set = mb_set_do;
        mb_param[index].get = NULL;
        mb_param[index].check_handler = mb_check_dummy;
        
        addr++;
        index++;
    }
    
    // Период PWM в безопасном режиме. Регистры 0x0220 - 0x0227
    addr = 0x0240;
    for (int i = 0; i < DO_NUMBER; i++)
    {
        mb_param[index].reg = addr;
        mb_param[index].size = 1;
        mb_param[index].param = (uint8_t*)&output_pwm_period_save[i];  // Счетчик ипульсов
        mb_param[index].set = mb_set_do;
        mb_param[index].get = NULL;
        mb_param[index].check_handler = mb_check_dummy;
        
        addr++;
        index++;
    }
    
    return index;
}



// -------------------------------------------------------------------------- //
//                          Установка параметров
// -------------------------------------------------------------------------- //

//
mb_delay_action_t mb_set_di_state(void)
{
    di_set_state();
    return MB_SAVE_SETTINGS;
}

//
mb_delay_action_t mb_set_din_mode(void)
{
    di_set();
    return MB_NO_ACTION;
}


// -------------------------------------------------------------------------
// Параметры дискретных выходов

//
mb_delay_action_t mb_set_do(void)
{
    do_set_common();
    return MB_NO_ACTION;
}


#endif

