/*
 * control_station.h
 *
 *  Created on: 1 июн. 2020 г.
 *      Author: Vladislav
 */

#ifndef SRC_LIBS_NIO12_CONTROL_STATION_H_
#define SRC_LIBS_NIO12_CONTROL_STATION_H_

#include <control_station_project.h> // грузим внешние настройки проекта

#include "word_structurs.h"


//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////


#define COUNT_CONTROL_STATION                   CONTROL_STATION_LAST   // кол-во постов управления
//#define COUNT_CMD_ARR_CONTROL_STATION           CONTROL_STATION_LAST   // кол-во постов управления

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////


#define CONTROL_STATION_TIME_WAIT                       250//500         // период опроса мсек

#define CONTROL_STATION_SETUP_TIME_DETECT_ACTIVE            18//12//6           // в тиках от CONTROL_STATION_TIME_WAIT
#define CONTROL_STATION_SETUP_TIME_DETECT_ACTIVE_RESEND_485 2           // в тиках от CONTROL_STATION_TIME_WAIT
#define CONTROL_STATION_SETUP_TIME_SEND_CMD_AFTER_OFF       5           // в тиках от CONTROL_STATION_TIME_WAIT

#define CONTROL_STATION_MAX_RAW_DATA                            256 //128         // максимальное кол-во данных для сырых данных полученных от постов
#define CONTROL_STATION_MAX_RAW_DATA_TEMP                       3 //128         // сколько данных храним для временного буфера

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

typedef struct {

    unsigned int time_detect_active[COUNT_CONTROL_STATION];         // текущий таймер для пропадании связи, сбрасывается при наличии связи
    unsigned int period_detect_active[COUNT_CONTROL_STATION];       // период обмена с постом
    unsigned int time_detect_answer_485[COUNT_CONTROL_STATION];     // текущий таймер для ожидания ответа по Modbus

    unsigned int setup_time_detect_active[COUNT_CONTROL_STATION];       // время до сброса при пропадании связи
    unsigned int setup_time_detect_active_resend_485[COUNT_CONTROL_STATION];  // время до сброса при пропадании связи, должен быть меньше setup_time_detect_active
    unsigned int setup_time_send_cmd_after_off[COUNT_CONTROL_STATION];  // время задержки на переключение команд, например на Go. Чтоб не было дребезга на вкл/выкл.

    unsigned int active_control_station[COUNT_CONTROL_STATION];         // активный пост управления, возможно их может быть несколько одновременно?

    unsigned int detect_get_data_control_station[COUNT_CONTROL_STATION];         // если есть обмен с постом, то выставляем тут флаг, он сбросится при update_timers


    unsigned int alive_control_station[COUNT_CONTROL_STATION];    // флаг о том что связь с постом есть


    int array_cmd[COUNT_CONTROL_STATION][CONTROL_STATION_CMD_LAST]; // массив данных полученных от каждого из постов, данные после parse
    int active_array_cmd[CONTROL_STATION_CMD_LAST];                 // массив данных актуальных для автивного поста, данные после parse

    WORD_UINT2BITS_STRUCT raw_array_data[COUNT_CONTROL_STATION][CONTROL_STATION_MAX_RAW_DATA]; // сырой массив данных полученных от каждого из постов, без parse.
    WORD_UINT2BITS_STRUCT raw_array_data_temp[COUNT_CONTROL_STATION][CONTROL_STATION_MAX_RAW_DATA][CONTROL_STATION_MAX_RAW_DATA_TEMP]; // временный сырой массив данных полученных от каждого из постов, без parse.

    unsigned int flag_message_sent[COUNT_CONTROL_STATION];       // флаг на ожидание ответа по системе запрос-ответ
    unsigned int flag_waiting_answer[COUNT_CONTROL_STATION];       // ожидать ли ответ по системе запрос-ответ

    unsigned int count_ok_modbus[COUNT_CONTROL_STATION];       // счетчик ошибок по команде modbus 15
    unsigned int count_error_modbus[COUNT_CONTROL_STATION];       // счетчик ошибок по команде modbus 15

    unsigned int flag_refresh_array[COUNT_CONTROL_STATION];       // флаг на ожидание обновления данных от modbus

/*
    unsigned int cmd_go_from_control_station[COUNT_CONTROL_STATION];       // cmd_go от поста пуск/стоп ШИМа
    unsigned int set_izad_from_control_station[COUNT_CONTROL_STATION];       // ток от поста
    unsigned int set_rotor_from_control_station[COUNT_CONTROL_STATION];       // обороты от поста
    unsigned int cmd_charge_from_control_station[COUNT_CONTROL_STATION];       // сбор схемы от поста
    unsigned int cmd_uncharge_from_control_station[COUNT_CONTROL_STATION];       // разбор схемы от поста
    unsigned int cmd_checkback_from_control_station[COUNT_CONTROL_STATION];       // квитирование от поста
    unsigned int cmd_test_leds_from_control_station[COUNT_CONTROL_STATION];       // тест ламп от поста
*/
    unsigned int prev_CAN_count_cycle_input_units[COUNT_CONTROL_STATION];   // пред кол-во обновлений из CAN
    unsigned int count_raw_array_data_temp[COUNT_CONTROL_STATION];   // индекс перебора по CONTROL_STATION_MAX_RAW_DATA_TEMP

    void (*clear)();             // Clear buffers
    void (*update_timers)();                       // Обнуляем таймеры на постах с которыми есть обмен
    void (*detect_active_station)();       // определяем какой пост активен

} CONTROL_STATION;

typedef CONTROL_STATION *CONTROL_STATION_handle;



#define CONTROL_STATION_DEFAULTS {  \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                {0}, \
                                control_station_clear, \
                                control_station_update_timers, \
                                control_station_detect_active_station \
}




void control_station_clear(CONTROL_STATION_handle);
void control_station_update_timers(CONTROL_STATION_handle);
void control_station_detect_active_station(CONTROL_STATION_handle);




extern CONTROL_STATION control_station;



#endif /* SRC_LIBS_NIO12_CONTROL_STATION_H_ */
