/*
 * optical_bus.h
 *
 *  Created on: 18 авг. 2020 г.
 *      Author: stud
 */

#ifndef SRC_MAIN_OPTICAL_BUS_H_
#define SRC_MAIN_OPTICAL_BUS_H_

#include "xp_cds_tk_23550.h"

enum
{
CODE_READY_CMD_NOT_READY=0,  //// 0 - not ready
CODE_READY_CMD_READY1,      //1-ready1
CODE_READY_CMD_READY1TO2,   //2-ready1to2
CODE_READY_CMD_READY2       //3 -ready2
};

enum
{
    CODE_RASCEPITEL_CMD_ENABLE_ON_AND_THIS_OFF=0,   //0 - можно включать расцепитель, свой выключен
    CODE_RASCEPITEL_CMD_ENABLE_ON_AND_THIS_ON,      // 1 - можно включать расцепитель, свой включен
    CODE_RASCEPITEL_CMD_REQUEST_AND_THIS_OFF,       // 2 - запрос на включение, свой выключен
    CODE_RASCEPITEL_CMD_DISABLE_THIS_ON             // 3  - запрет подключения расцепителя, свой включен
};


    typedef union {
        struct {
            unsigned int wdog_tick      :1; //посылаем 0_1_0 и т.д.
            unsigned int statusQTV      :1; //1-QTV On, QTV - off
            unsigned int master         :1; // 1 -Master, 0 - not Master
            unsigned int slave          :1; // 1 -Slave,  0 - not Slave

            unsigned int sync_line_detect  :1; // 1 - yes, 0 - no  синхросигнал принимается
            unsigned int sync_1_2       :1; // 1 - yes, 0 - no  есть синхронизация между ПЧ
            unsigned int alarm          :1; // 1 - yes, 0 - no  авария
            unsigned int ready_cmd      :2; // 00 - not ready,01-ready1,10-ready1to2, 11 -ready2

            unsigned int prepare_stop_PWM :1; // 0 - regul turns; 1 - power  режим работы
//            unsigned int ready_to_go    :1; // 1 - yes, 0 - no  схема собрана, готовы давать шим
            unsigned int start_pwm      :1; // 1 - yes, 0 - no  идет команда на запуск шима
            unsigned int stop_pwm       :1; // 1 - yes, 0 - no  идет команда на стоп шима

            unsigned int pwm_status     :1; // 1 -On, 0 - Off   текущее значение шима
//            unsigned int can_on_rascepitel :1; // 1 - yes, 0 - no  можно подключать расцепитель
            unsigned int maybe_master   :1; // 1 - yes, 0 - no  запрос на захват режима Master
            unsigned int rascepitel_cmd :2; //
            // 00 - можно включать расцепитель, свой выключен
            // 01 - можно включать расцепитель, свой включен
            // 10 - запрос на включение, свой выключен
            // 11 - запрет подключения расцепителя, свой включен
        } bit;
        unsigned int all;
    } OPTICAL_BUS_DATA_LOW_CMD;


//    typedef union {
//            struct {
//                unsigned int ready      :1; // данные готовы
//                unsigned int overfull   :1; //данные потеряны
//                unsigned int recive_error      :1; //данные пришли с ошибкой
//                unsigned int send_error      :1; //данные ушли с ошибкой
//                unsigned int wait       :1; //данные ожидаются
//                unsigned int timeout    :1; //данных давно не было
//            } bit;
//            unsigned int all;
//        } OPTICAL_BUS_CODE_STATUS;


typedef struct {
    int pzad_or_wzad;      //given turns or power, depends on controlMode;
    int angle_pwm;      //current rotor turns
    int iq_zad_i_zad;      // Iq_zadan or Izad
    OPTICAL_BUS_DATA_LOW_CMD cmd;
} OPTICAL_BUS_DATA_LOW;

typedef struct {
    OPTICAL_BUS_DATA_LOW raw;
    OPTICAL_BUS_DATA_LOW data;
    unsigned int status;
    unsigned int overfull_data;
    unsigned int timer;
    unsigned int flag_clear;
    unsigned int data_was_update_between_pwm_int;
    unsigned int error_wdog;
    unsigned int count_error_wdog;
    unsigned int count_read_optical_bus_old_data; // счетчик времени сколько данные не обновлялись


//    OPTICAL_BUS_CODE_STATUS code_status;
} OPTICAL_BUS_DATA;


#define OPTICAL_BUS_DATA_DEFAULT {{0,0,0,0},{0,0,0,0},0,0,0,0,0,0,0,0}

extern OPTICAL_BUS_DATA optical_write_data;
extern OPTICAL_BUS_DATA optical_read_data;


void optical_bus_read(void);
STATUS_DATA_READ_OPT_BUS optical_bus_get_status_and_read(void);
void  optical_bus_write(void);
void optical_bus_read_clear_count_error(void);
void  optical_bus_update_data_write(void);

#endif /* SRC_MAIN_OPTICAL_BUS_H_ */
