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