Добавлен формирование логов

This commit is contained in:
cfif 2026-07-20 10:03:10 +03:00
parent f3734748f2
commit 2abcaf76b4
2 changed files with 79 additions and 1 deletions

View File

@ -17,6 +17,18 @@ typedef struct {
} tLoggerDataBuf; } tLoggerDataBuf;
typedef struct __attribute__((packed)) {
uint8_t start_pkt; // 0x02
uint8_t type_pkt;
uint8_t len_pkt;
uint32_t timestamp;
uint8_t channel;
uint8_t flags;
uint8_t dlc;
uint32_t id;
uint8_t data[8]; // максимум 8 байт
} CanLogPacket_t;
typedef struct { typedef struct {
tSerialPortIO *serialPortIo_VIRT; tSerialPortIO *serialPortIo_VIRT;
tSerialPortIO *serialPortIo_PHYSIC; tSerialPortIO *serialPortIo_PHYSIC;
@ -35,6 +47,8 @@ typedef struct {
uint8_t bufLoggerNames[MAX_COUNT_BUF_LOG][MAX_LEN_BUF_NAME_LOG]; uint8_t bufLoggerNames[MAX_COUNT_BUF_LOG][MAX_LEN_BUF_NAME_LOG];
uint8_t countBufLoggerNames; uint8_t countBufLoggerNames;
uint8_t bufLoggerCan[32];
osMutexId_t access; osMutexId_t access;
struct { struct {

View File

@ -122,6 +122,68 @@ static uint32_t LoggerToSerialPort_PrintLegend(
return strLen; return strLen;
} }
#include <stddef.h> // для offsetof
static void LoggerCanToSerialPort_Logging(
tLoggerToSerialPort *env,
uint16_t mChannel,
uint8_t mFlags,
uint8_t mDLC,
uint32_t mID,
uint8_t *mData,
uint32_t timestamp
) {
if (osMutexAcquire(env->access, env->timeout) == osOK) {
CanLogPacket_t *pkt = (CanLogPacket_t*)env->bufLoggerCan;
// Заполняем структуру
pkt->start_pkt = 0x02;
pkt->type_pkt = 1;
pkt->timestamp = timestamp;
pkt->channel = mChannel;
pkt->flags = mFlags;
pkt->dlc = mDLC;
pkt->id = mID;
// Копируем данные (только mDLC байт)
if (mData != NULL && mDLC > 0) {
memcpy(pkt->data, mData, mDLC);
}
// Остальные байты data[8] не трогаем они не будут отправлены
// Вычисляем len_pkt = полезная нагрузка (без start, type, len, end)
pkt->len_pkt = (4 + 1 + 1 + 4 + mDLC + 1); // = mDLC + 11 (без CRC)
// Размер данных без завершающих байтов (CRC и 0x03)
size_t data_size = offsetof(CanLogPacket_t, data) + mDLC; // от начала пакета до конца данных
// Вычисляем CRC как сумму всех байтов, кроме pkt->start_pkt,
// т.е. начиная с type_pkt и заканчивая последним байтом данных
uint8_t crc = 0;
uint8_t *crc_start = (uint8_t*)pkt + 1; // пропускаем start_pkt
size_t crc_len = data_size - 1; // размер данных для CRC (без start_pkt)
for (size_t i = 0; i < crc_len; i++) {
crc += crc_start[i];
}
// Записываем CRC после данных
uint8_t *crc_ptr = (uint8_t*)pkt + data_size;
*crc_ptr = crc;
// Записываем байт 0x03 после CRC
uint8_t *end_ptr = (uint8_t*)pkt + data_size + 1;
*end_ptr = 0x03;
// Размер для отправки: от начала до 0x03 включительно
size_t pkt_size = data_size + 2; // данные + CRC + 0x03
// Отправка
SerialPortTransmit(env->serialPortIo_VIRT, env->bufLoggerCan, pkt_size, env->timeout);
osMutexRelease(env->access);
}
}
static void LoggerToSerialPort_Logging( static void LoggerToSerialPort_Logging(
tLoggerToSerialPort *env, tLoggerToSerialPort *env,
char *authorStatic, char *authorStatic,
@ -139,7 +201,6 @@ static void LoggerToSerialPort_Logging(
// if (adr < PERIPH_BASE) { // if (adr < PERIPH_BASE) {
// env->timeout = 0; // env->timeout = 0;
// } // }
char *outStr = NULL; char *outStr = NULL;
uint32_t lenStr; uint32_t lenStr;
@ -193,6 +254,9 @@ void LoggerToSerialPort_Init(
env->logger.env = env; env->logger.env = env;
env->greenwichOffset = greenwichOffset; env->greenwichOffset = greenwichOffset;
env->logger.logging = (LoggerGenericMethod) LoggerToSerialPort_Logging; env->logger.logging = (LoggerGenericMethod) LoggerToSerialPort_Logging;
env->logger.loggingCan = (LoggerGenericCanMethod) LoggerCanToSerialPort_Logging;
env->logger.getMemPrintfBufLog = (getMemPrintfBufLogMethod) getMemLoggerBufLog; env->logger.getMemPrintfBufLog = (getMemPrintfBufLogMethod) getMemLoggerBufLog;
env->rtc = rtc; env->rtc = rtc;
env->flags = flags; env->flags = flags;