/*
 * oscil_can.h
 *
 *  Created on: 24 мая 2020 г.
 *      Author: yura
 */

#ifndef SRC_LIBS_NIO12_OSCIL_CAN_H_
#define SRC_LIBS_NIO12_OSCIL_CAN_H_


#define OSCIL_CODE_STATUS_LOG_STOP          1   // Лог остановлен
#define OSCIL_CODE_STATUS_LOG_RUN           2   // Лог идет...
#define OSCIL_CODE_STATUS_LOG_RUN_TO_STOP   3   // Лог идет, но идет дозапись, скоро остановится.



#define OSCIL_CAN_NUMBER_CHANNEL            32      // максимальное возможное кол-во каналов для буфера
#define OSCIL_CAN_NUMBER_POINTS             500     // максимальное возможное кол-во точек для буфера (для одного канала)
#define OSCIL_TIME_WAIT                     5000    // период посылки всего массива в CAN (млсек)
#define OSCIL_CAN_NUMBER_POINTS_ADD         100     // запас точек при выполнении функции копирования рабочего буфера во временный. oscil_buffer->temp_oscil_buffer

#define OSCIL_CAN_NUMBER_POINTS_AFTER_STOP  100     // сколько точек записывать после остановки записи буфера по аварии или шиму



typedef struct {
    int oscil_buffer[OSCIL_CAN_NUMBER_CHANNEL][OSCIL_CAN_NUMBER_POINTS+OSCIL_CAN_NUMBER_POINTS_ADD];
    int temp_oscil_buffer[OSCIL_CAN_NUMBER_CHANNEL][OSCIL_CAN_NUMBER_POINTS];
    unsigned int global_enable;
    unsigned int number_ch;
    unsigned int number_points;
    unsigned int step;
    unsigned int send_after_cmd;
    unsigned int cmd_send;
    unsigned int current_step;
    unsigned int enable_rewrite;
    unsigned int current_position;
    unsigned int timer_send;
    unsigned int code_status_log;

    unsigned int status_error;    // статус аварии 0-нет аварии/1- есть
    unsigned int status_pwm;      // статус ШИМа 0-Шим не запущен/1-запущен

    unsigned int stop_update_on_error;    // остановим обновление буфера по аварии
    unsigned int stop_update_on_stop_pwm; // остановим обновление буфера по стопу ШИМа


    int number_can_box_terminal_oscil;
    int number_can_box_terminal_cmd;
    unsigned int pause_can; // пауза между посылками CAN


    void (*clear)();             // Clear buffers
    void (*send)();             // Send buffers
    void (*set_next_position)();             // Set next position in buffers
    void (*prepare_data_can)();             // Set next position in buffers

} OSCIL_CAN;

typedef OSCIL_CAN *OSCIL_CAN_handle;



#define OSCIL_CAN_DEFAULTS {  {0},{0}, \
                                0, \
                                OSCIL_CAN_NUMBER_CHANNEL, \
                                OSCIL_CAN_NUMBER_POINTS, \
                                1, \
                                0, \
                                0, \
                                0, \
                                1, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                1, \
                                1, \
                                0,0, \
                                OSCIL_TIME_WAIT, \
                                oscil_clear_buffer, \
                                oscil_send_buffer, \
                                oscil_next_position, \
                                oscil_prepare_data_can \
}




void oscil_clear_buffer(OSCIL_CAN_handle);
void oscil_send_buffer(OSCIL_CAN_handle);
void oscil_next_position(OSCIL_CAN_handle);
void oscil_prepare_data_can(OSCIL_CAN_handle);



extern OSCIL_CAN oscil_can;

#endif /* SRC_LIBS_NIO12_OSCIL_CAN_H_ */


