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


