/*
 * oscil_can.h
 *
 *  Created on: 24 ìàÿ 2020 ã.
 *      Author: yura
 */

#ifndef SRC_LIBS_NIO12_ALARM_LOG_CAN_H_
#define SRC_LIBS_NIO12_ALARM_LOG_CAN_H_

#define CAN_BOX_PRIORITY_LOW_MAX_SIZE_BLOCKS 195L //3330L  // 9999L


#define ALARM_LOG_NUMBER_BOX_IN_CAN                    0

#define ALARM_LOG_CODE_STATUS_LOG_STOP          1   // Ëîã îñòàíîâëåí
#define ALARM_LOG_CODE_STATUS_LOG_RUN           2   // Ëîã èäåò...
#define ALARM_LOG_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 {
    unsigned int global_enable;             // ðàçðåøåíèå ïåðåäà÷è ëîãîâ
    unsigned int copy2temp;                 // êîïèðîâàòü ëîãè â temp ïåðåä ïåðåäà÷åé
    unsigned int stage;

    int cmd_fffc[3];
    int cmd_fffd[3];
    int cmd_fffe[3];
    int cmd_ffff[3];

    unsigned int post_points;               // êîë-âî òî÷åê ïîñëå àâàðèè
    unsigned int step;                      // øàã îäíîé òî÷êè, ìêñåê
    unsigned int start;                     // êîä êîìàíäû START
    unsigned int oscills;                   // êîë-âî êàíàëîâ - êîëîíîê

    unsigned long real_points;              // âñåãî êîë-âî òî÷åê, ïîëíûé ðàçìåð äàííûõ ïîëó÷èì = points*oscills
                                            //  íóæíûé êóñîê äëÿ êîïèè, äàííîå êîëè÷åñòâî ñêîïèðóåòñÿ èç öèêëè÷åñêîãî áóôåðà âî âðåìåííûé ëîã.

    unsigned int stop;                      // êîä êîìàíäû START
    unsigned int crc16;                     // crc16 äàííûõ

    int *start_adr_real_logs;               // íà÷àëî ìàññèâà äàííûõ, äî êîïèðîâàíèÿ
                                            // àäðåñ íà÷àëà ðåàëüíûõ ëîãîâ â öèêëè÷åñêîì áóôåðå

    int *start_adr_temp;                    // íà÷àëî ìàññèâà äàííûõ, ïîñëå êîïèðîâàíèÿ
                                            //  àäðåñ äëÿ âðåìåííîãî ðàçìåùåíèÿ êîïèè ëîãà, ëîã ñêîïèðóåòñÿ èç öèêëè÷åñêîãî áóôåðà â ýòîò ðàçâåðíóâøèñü.

    int *finish_adr_real_log;               // îêîí÷àíèå áëîêà ëîãîâ, äî êîïèðîâàíèÿ
                                            // êîíåö ëîãîâ â öèêëè÷åñêîì áóôåðå

    int *current_adr_real_log;              // óêàçàòåëü íà àäðåñ ãäå îñòàíîâèëâñü çàïèñü ëîãîâ â öèêëè÷åñêîì áóôåðå

 //   int *finish_adr_temp;                   // êîíåö ëîãà â temp áóôåðå
    unsigned long temp_points;              // âñåãî êîë-âî òî÷åê, ïîëíûé ðàçìåð äàííûõ ïîëó÷èì = temp_points*oscills
                                            // ðåàëüíûé ðàçìåð öèêëè÷åñêãî áóôåðà â òî÷êàõ.

    unsigned long progress_can;             // îáðàòíûé ñ÷åò÷èê, ñêîëüêî îñòàëîñü ïåðåäàòü
    unsigned int prev_status_alarm;         // ïðåä. ñîñòîÿíèå status_alarm
    unsigned int status_alarm;              // êîä àâàðèè, ëîã àâòîìàòè÷åñêè ïåðåäàåòñÿ ïðè èçìåíåíèè ýòîãî ñòàòóñà èç 0->1

    unsigned int timer_send;                // âðåìÿ ïåðåäà÷è âñåãî áëîêà

    unsigned int temp_log_ready;            // ãîòîâíîñòü äàííûõ temp äëÿ ñ÷èòûâàíèÿ ïî CAN

    unsigned long can_max_size_one_block;    // ðàçìåð îäíîãî áëîêà ïåðåäàâàåìîãî çà ðàç, íàäî êðàòíîå 3.

    void (*clear)();                        // Clear buffers
    void (*send)();                         // Send buffers
    void (*copy_temp_buffer)();             // Copy work buffers to temp buffers
    void (*prepare_data_can)();             // Ïðåäâàðèòåëüíàÿ ïîäãîòîâêà ïåðåä ïåðåäà÷åé

} ALARM_LOG_CAN;

typedef ALARM_LOG_CAN *ALARM_LOG_CAN_handle;



#define ALARM_LOG_CAN_CAN_DEFAULTS {  \
                                0, \
                                0, \
                                0, \
                                {0,0,0}, \
                                {0,0,0}, \
                                {0,0,0}, \
                                {0,0,0}, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                0, \
                                CAN_BOX_PRIORITY_LOW_MAX_SIZE_BLOCKS, \
                                alarm_log_clear_buffer, \
                                alarm_log_send_buffer, \
                                alarm_log_copy_temp_buffer, \
                                alarm_log_prepare_data_can \
}




void alarm_log_clear_buffer(ALARM_LOG_CAN_handle);
void alarm_log_send_buffer(ALARM_LOG_CAN_handle);
//void alarm_log_next_position(ALARM_LOG_CAN_handle);
void alarm_log_prepare_data_can(ALARM_LOG_CAN_handle);
void alarm_log_copy_temp_buffer(ALARM_LOG_CAN_handle);



extern ALARM_LOG_CAN alarm_log_can;

#endif /* SRC_LIBS_NIO12_ALARM_LOG_CAN_H_ */