209 lines
6.2 KiB
C
209 lines
6.2 KiB
C
/**
|
||
* @file main.c
|
||
* @brief Пример использования библиотеки blf для создания BLF-файла.
|
||
* @details Демонстрирует создание контейнера с CAN, LIN, LIN Error и ENV_DATA объектами.
|
||
* Показывает использование как старого формата CAN, так и расширенного VBLCANMessage2.
|
||
* Контекст создаётся на стеке (без динамической памяти).
|
||
*
|
||
* Компиляция для обычного ПК:
|
||
* gcc -o create_blf main.c blf.c -std=c99 -D_GNU_SOURCE
|
||
* Компиляция для встраиваемой системы с FatFS:
|
||
* arm-none-eabi-gcc -DUSE_FATFS -Ipath/to/fatfs -o create_blf main.c blf.c
|
||
*
|
||
* @author (Ваше имя)
|
||
* @date 2026-03-20
|
||
*/
|
||
|
||
#include "blf.h"
|
||
|
||
/* Вспомогательная структура для хранения семплов АЦП (используется только в примере) */
|
||
typedef struct {
|
||
uint16_t channel1;
|
||
uint16_t channel2;
|
||
uint16_t channel3;
|
||
uint16_t channel4;
|
||
uint16_t channel5;
|
||
} AdcSample;
|
||
|
||
|
||
int main() {
|
||
BLFContext ctx;
|
||
int ret;
|
||
|
||
SYSTEMTIME startTime = {2025, 1, 3, 1, 0, 0, 0, 0};
|
||
|
||
// Открываем файл со старым форматом CAN (VBLCANMessage)
|
||
ret = blf_open_ex(&ctx, "log.blf", &startTime, 1);
|
||
if (ret != 0) {
|
||
BLF_ERROR_PRINTF("Failed to open file, exiting.\n");
|
||
return 1;
|
||
}
|
||
|
||
// Начинаем контейнер
|
||
if (blf_start_container(&ctx, 0) != 0) {
|
||
BLF_ERROR_PRINTF("Failed to start container\n");
|
||
blf_close(&ctx);
|
||
return 1;
|
||
}
|
||
|
||
// Добавляем CAN сообщения в старом формате
|
||
CanMessageStruct canMsg = {
|
||
.channel = 2,
|
||
.id = 0x3F1,
|
||
.flags = CAN_MSG_FLAGS(CAN_DIR_RX, 0),
|
||
.dlc = 8,
|
||
.data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||
.timestamp = 0
|
||
// frameLength и bitCount не используются в старом формате
|
||
};
|
||
|
||
int j = 0;
|
||
int k = 0;
|
||
|
||
for (uint32_t i = 0; i < 10000; ++i) {
|
||
|
||
// Заполняем данные
|
||
canMsg.data[0] = j;
|
||
canMsg.data[1] = j / 2;
|
||
canMsg.data[2] = j / 3;
|
||
canMsg.data[3] = j / 4;
|
||
canMsg.data[4] = j / 5;
|
||
canMsg.data[5] = j / 6;
|
||
canMsg.data[6] = j / 7;
|
||
canMsg.data[7] = j / 8;
|
||
|
||
canMsg.timestamp += 100;
|
||
|
||
if (blf_add_can_message_struct(&ctx, &canMsg) != 0) {
|
||
return 1;
|
||
}
|
||
|
||
++k;
|
||
|
||
if (k > 100) {
|
||
k = 0;
|
||
++j;
|
||
if (j >= 100) {
|
||
j = 0;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
// Завершаем контейнер
|
||
if (blf_end_container(&ctx) != 0) {
|
||
BLF_ERROR_PRINTF("Failed to end container\n");
|
||
blf_close(&ctx);
|
||
return 1;
|
||
}
|
||
|
||
// Закрываем файл
|
||
ret = blf_close(&ctx);
|
||
if (ret != 0) {
|
||
BLF_ERROR_PRINTF("Failed to close file\n");
|
||
return 1;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
/*
|
||
int main() {
|
||
BLFContext ctx;
|
||
int ret;
|
||
|
||
// Время начала измерения (1 января 2025 года, 00:00:00.000)
|
||
SYSTEMTIME startTime = {
|
||
.year = 2025,
|
||
.month = 1,
|
||
.dayOfWeek = 3,
|
||
.day = 1,
|
||
.hour = 0,
|
||
.minute = 0,
|
||
.second = 0,
|
||
.milliseconds = 0
|
||
};
|
||
|
||
// Открываем файл с поддержкой расширенного формата CAN (VBLCANMessage2)
|
||
ret = blf_open_ex(&ctx, "log.blf", &startTime, 1);
|
||
if (ret != 0) {
|
||
BLF_ERROR_PRINTF("Failed to open file, exiting.\n");
|
||
return 1;
|
||
}
|
||
|
||
BLF_ERROR_PRINTF("Using extended CAN format (VBLCANMessage2)\n");
|
||
|
||
// Начинаем контейнер
|
||
if (blf_start_container(&ctx, 0) != 0) {
|
||
BLF_ERROR_PRINTF("Failed to start container\n");
|
||
blf_close(&ctx);
|
||
return 1;
|
||
}
|
||
|
||
// Добавляем CAN-сообщения с дополнительной информацией о длительности кадра
|
||
CanMessageStruct canMsg = {
|
||
.channel = 1,
|
||
.id = 0x3F1,
|
||
.flags = CAN_MSG_FLAGS(CAN_DIR_RX, 0),
|
||
.dlc = 8,
|
||
.data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||
.timestamp = 0,
|
||
.frameLength = 6200, // 6.2 мкс длительность сообщения
|
||
.bitCount = 108 // 108 бит общее количество
|
||
};
|
||
|
||
uint8_t j = 0;
|
||
|
||
for (uint32_t i = 0; i < 10000; ++i) {
|
||
// Заполняем данные
|
||
canMsg.data[0] = j;
|
||
canMsg.data[1] = j / 2;
|
||
canMsg.data[2] = j / 3;
|
||
canMsg.data[3] = j / 4;
|
||
canMsg.data[4] = j / 5;
|
||
canMsg.data[5] = j / 6;
|
||
canMsg.data[6] = j / 7;
|
||
canMsg.data[7] = j / 8;
|
||
|
||
canMsg.timestamp += 100; // каждые 100 мс
|
||
|
||
// Используем расширенную функцию добавления CAN-сообщения
|
||
if (blf_add_can_message2_struct(&ctx, &canMsg) != 0) {
|
||
BLF_ERROR_PRINTF("Failed to add CAN message2\n");
|
||
blf_close(&ctx);
|
||
return 1;
|
||
}
|
||
|
||
++j;
|
||
if (j >= 100) {
|
||
j = 0;
|
||
}
|
||
|
||
// Периодически выводим прогресс
|
||
if (i % 10000 == 0) {
|
||
BLF_ERROR_PRINTF("Added %u messages (frameLength=%u ns, bitCount=%u)\n",
|
||
i, canMsg.frameLength, canMsg.bitCount);
|
||
}
|
||
}
|
||
|
||
|
||
// Завершаем контейнер
|
||
if (blf_end_container(&ctx) != 0) {
|
||
BLF_ERROR_PRINTF("Failed to end container\n");
|
||
blf_close(&ctx);
|
||
return 1;
|
||
}
|
||
|
||
// Закрываем файл
|
||
ret = blf_close(&ctx);
|
||
if (ret != 0) {
|
||
BLF_ERROR_PRINTF("Failed to close file\n");
|
||
return 1;
|
||
}
|
||
|
||
BLF_ERROR_PRINTF("File log_extended.blf created successfully!\n");
|
||
BLF_ERROR_PRINTF("Top-level objects: %d\n", ctx.objectCount);
|
||
BLF_ERROR_PRINTF("Used extended CAN format (ObjectType=%d)\n", BL_OBJ_TYPE_CAN_MESSAGE2);
|
||
|
||
return 0;
|
||
}
|
||
*/ |