/*
 * 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_ */