185 lines
7.2 KiB
C
185 lines
7.2 KiB
C
/**
|
||
* @file blf.h
|
||
* @brief Заголовочный файл библиотеки для создания BLF-файлов (экспортная версия).
|
||
*/
|
||
|
||
#ifndef BLF_H
|
||
#define BLF_H
|
||
|
||
#include <stdint.h>
|
||
#include <stddef.h>
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/* -------------------------------------------------------------------------
|
||
* Экспорт символов для разделяемой библиотеки
|
||
* ------------------------------------------------------------------------- */
|
||
#if defined(_WIN32) || defined(_WIN64)
|
||
#ifdef BLF_BUILD_DLL
|
||
#define BLF_API __declspec(dllexport)
|
||
#else
|
||
#define BLF_API __declspec(dllimport)
|
||
#endif
|
||
#else
|
||
#ifdef BLF_BUILD_DLL
|
||
#define BLF_API __attribute__((visibility("default")))
|
||
#else
|
||
#define BLF_API
|
||
#endif
|
||
#endif
|
||
|
||
/* -------------------------------------------------------------------------
|
||
* Константы формата BLF
|
||
* ------------------------------------------------------------------------- */
|
||
#define BL_FILE_SIGNATURE 0x47474F4Cu /* "LOGG" */
|
||
#define BL_OBJ_SIGNATURE 0x4A424F4Cu /* "LOBJ" */
|
||
#define BL_OBJ_TYPE_CAN_MESSAGE 1
|
||
#define BL_OBJ_TYPE_LIN_MESSAGE 11
|
||
#define BL_OBJ_TYPE_LIN_SND_ERROR 15
|
||
#define BL_OBJ_TYPE_LOG_CONTAINER 10
|
||
#define BL_OBJ_TYPE_ENV_DATA 9
|
||
#define BL_OBJ_FLAG_TIME_ONE_NANS 0x00000002
|
||
|
||
/* Флаги CAN-сообщения */
|
||
#define CAN_MSG_FLAGS(dir, rtr) \
|
||
((uint8_t)(((uint8_t)(rtr & 0x01) << 7) | ((uint8_t)(dir & 0x0F))))
|
||
#define CAN_DIR_TX 1
|
||
#define CAN_DIR_RX 0
|
||
|
||
/* Направления LIN */
|
||
#define LIN_DIR_RX 0
|
||
#define LIN_DIR_TX 1
|
||
|
||
/* -------------------------------------------------------------------------
|
||
* Структура времени (SYSTEMTIME) – такая же, как в оригинале
|
||
* ------------------------------------------------------------------------- */
|
||
typedef struct {
|
||
uint16_t year;
|
||
uint16_t month;
|
||
uint16_t dayOfWeek;
|
||
uint16_t day;
|
||
uint16_t hour;
|
||
uint16_t minute;
|
||
uint16_t second;
|
||
uint16_t milliseconds;
|
||
} SYSTEMTIME;
|
||
|
||
/* -------------------------------------------------------------------------
|
||
* API библиотеки
|
||
* ------------------------------------------------------------------------- */
|
||
|
||
/**
|
||
* @brief Открывает (создаёт) BLF-файл.
|
||
* @param filename Имя файла.
|
||
* @param startTime Время начала измерения (может быть NULL – будет использовано текущее системное время).
|
||
* @return Указатель на контекст (handle) или NULL в случае ошибки.
|
||
*/
|
||
BLF_API void* blf_open(const char* filename, const SYSTEMTIME* startTime);
|
||
|
||
/**
|
||
* @brief Устанавливает время начала измерения (если не было задано при открытии).
|
||
* @param handle Указатель на контекст.
|
||
* @param startTime Время начала.
|
||
* @return 0 при успехе, -1 при ошибке.
|
||
*/
|
||
BLF_API int blf_set_start_time(void* handle, const SYSTEMTIME* startTime);
|
||
|
||
/**
|
||
* @brief Начинает новый контейнер (объект LOG_CONTAINER).
|
||
* @param handle Указатель на контекст.
|
||
* @param timestamp Временная метка контейнера в наносекундах.
|
||
* @return 0 при успехе, -1 при ошибке.
|
||
*/
|
||
BLF_API int blf_start_container(void* handle, uint64_t timestamp);
|
||
|
||
/**
|
||
* @brief Завершает текущий контейнер.
|
||
* @param handle Указатель на контекст.
|
||
* @return 0 при успехе, -1 при ошибке.
|
||
*/
|
||
BLF_API int blf_end_container(void* handle);
|
||
|
||
/**
|
||
* @brief Добавляет CAN-сообщение.
|
||
* @param handle Указатель на контекст.
|
||
* @param channel Номер канала.
|
||
* @param id Идентификатор.
|
||
* @param flags Флаги (направление, RTR).
|
||
* @param dlc Длина данных (0-8).
|
||
* @param data Указатель на данные (если NULL, заполняет нулями).
|
||
* @param timestamp Временная метка в наносекундах.
|
||
* @return 0 при успехе, -1 при ошибке.
|
||
*/
|
||
BLF_API int blf_add_can_message(void* handle,
|
||
uint16_t channel,
|
||
uint32_t id,
|
||
uint8_t flags,
|
||
uint8_t dlc,
|
||
const uint8_t* data,
|
||
uint64_t timestamp);
|
||
|
||
/**
|
||
* @brief Добавляет LIN-сообщение (устаревший тип).
|
||
* @param handle Указатель на контекст.
|
||
* @param channel Номер канала.
|
||
* @param id Идентификатор (6 бит).
|
||
* @param dlc Длина данных.
|
||
* @param data Указатель на данные.
|
||
* @param dir Направление (LIN_DIR_RX / LIN_DIR_TX).
|
||
* @param timestamp Временная метка в наносекундах.
|
||
* @param checksum Контрольная сумма.
|
||
* @return 0 при успехе, -1 при ошибке.
|
||
*/
|
||
BLF_API int blf_add_lin_message_obsolete(void* handle,
|
||
uint16_t channel,
|
||
uint8_t id,
|
||
uint8_t dlc,
|
||
const uint8_t* data,
|
||
uint8_t dir,
|
||
uint64_t timestamp,
|
||
uint16_t checksum);
|
||
|
||
/**
|
||
* @brief Добавляет событие отсутствия ответа LIN.
|
||
* @param handle Указатель на контекст.
|
||
* @param channel Номер канала.
|
||
* @param id Идентификатор.
|
||
* @param dlc Ожидаемая длина данных.
|
||
* @param timestamp Временная метка в наносекундах.
|
||
* @return 0 при успехе, -1 при ошибке.
|
||
*/
|
||
BLF_API int blf_add_lin_send_error(void* handle,
|
||
uint16_t channel,
|
||
uint8_t id,
|
||
uint8_t dlc,
|
||
uint64_t timestamp);
|
||
|
||
/**
|
||
* @brief Добавляет данные окружения (ENV_DATA).
|
||
* @param handle Указатель на контекст.
|
||
* @param name Имя переменной (строка).
|
||
* @param data Указатель на данные.
|
||
* @param data_len Длина данных в байтах.
|
||
* @param timestamp Временная метка в наносекундах.
|
||
* @return 0 при успехе, -1 при ошибке.
|
||
*/
|
||
BLF_API int blf_add_env_data(void* handle,
|
||
const char* name,
|
||
const uint8_t* data,
|
||
uint32_t data_len,
|
||
uint64_t timestamp);
|
||
|
||
/**
|
||
* @brief Закрывает BLF-файл, обновляет заголовок и освобождает память контекста.
|
||
* @param handle Указатель на контекст.
|
||
* @return 0 при успехе, -1 при ошибке.
|
||
*/
|
||
BLF_API int blf_close(void* handle);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* BLF_H */ |