From 958af7f4cb83f9c922dd2c965299554fb71b86ab Mon Sep 17 00:00:00 2001 From: coffee Date: Mon, 28 Jul 2025 16:13:18 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E7=BB=9F=E5=90=88=E6=97=A5=E5=BF=97,=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9fpga=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/HDLog.h | 9 ++- src/HDLog.c | 205 +++++++++++++++++++++++++----------------------- 2 files changed, 114 insertions(+), 100 deletions(-) diff --git a/include/HDLog.h b/include/HDLog.h index 52f1d28..2650749 100644 --- a/include/HDLog.h +++ b/include/HDLog.h @@ -56,7 +56,7 @@ #if USE_HD_LOG_DATA #define LogData(data, len) HDLogData((const uint8_t *)data, len, 1) -#define LogFpgaData(data, len, isWrite) do { if (HDLogPrintFpgaHeader((const uint8_t *)data, len, isWrite, 1)) { HDLogHex((const uint8_t *)(data) + 17, (len) - 21, 1, NULL); } } while (0) +#define LogFpgaData(data, len, isWrite) HDLogPrintFpga((const uint8_t *)data, len, isWrite, 1) #define LogHexData(data, len) HDLogHex((const uint8_t *)data, len, 1, NULL) #else #define LogData(data, len) @@ -88,14 +88,15 @@ void HDLogInit(uint32_t (*getTime)()); void HDLogOut(uint8_t ext, uint8_t level, const char *fileName, const char *funcName, int line, const char *format, ...); /** - * @brief 打印FPGA头 - * @param data FPGA头数据 + * @brief 打印FPGA + * @param data FPGA数据 * @param len 数据长度 * @param isWrite 是否是写 * @param checkFpga 是否更新检查FPGA数据 * @return 是fpga数据或者需要打印返回1 否则返回0 */ -uint8_t HDLogPrintFpgaHeader(const uint8_t *data, int len, uint8_t isWrite, uint8_t checkFpga); +uint8_t HDLogPrintFpga(const uint8_t *data, int len, uint8_t isWrite, uint8_t checkFpga); +uint8_t HDLogCheckFpgaHeader(const uint8_t *data, int len); /** * @brief 十六进制格式打印数据 diff --git a/src/HDLog.c b/src/HDLog.c index 3f182ea..156185d 100644 --- a/src/HDLog.c +++ b/src/HDLog.c @@ -46,6 +46,7 @@ static HShellMatch sLogMatch[] = { HSHELL_MATCH_ITEM(kLogLevelError, "logError"), HSHELL_MATCH_ITEM(kLogLevelHex, "logHex"), HSHELL_MATCH_ITEM(kLogLevelStack, "logStack"), + HSHELL_MATCH_ITEM(kLogLevelHeap, "logHeap"), #if USE_HD_FPGA_CHECK HSHELL_MATCH_ITEM(CHECK_FPGA_INFO_ID, "checkFpga"), HSHELL_MATCH_ITEM(CHECK_FPGA_INFO_ID + 1, "clearCheckFpga"), @@ -99,6 +100,73 @@ static uint32_t *GetFpgaType(uint8_t type, uint8_t isWrite) } #endif +static void LogHex(const uint8_t *data, int len, uint8_t checkPrint, uint32_t *offset, uint8_t lock) +{ + if (checkPrint && HBitGet(sLogItem, kLogLevelHex) == 0) + { + return; + } + + if (len <= 0) + { + return; + } + + if (lock) + { + LOG_LOCK(); + } +#define PRINT_HEX(...) printf(__VA_ARGS__); + + if (offset == NULL || *offset == 0) + { + PRINT_HEX(" "); + // 16进制打印, 打印15个换行, 开头打印0A-0F 开头样式, 数据列每行00-FF + for (int i = 0; i < 16; ++i) + { + PRINT_HEX("0%X ", i); + } + + PRINT_HEX("\r\n"); + for (int i = 0; i < 17; ++i) + { + PRINT_HEX("---"); + ; + } + + PRINT_HEX("\r\n"); + } + + int index = offset ? *offset : 0; + for (int i = 0; i < len; ++i, ++index) + { + if (index % 16 == 0) + { + PRINT_HEX("%X%X| ", index / 256, index / 16 % 16); + } + + PRINT_HEX("%02X ", data[i]); + if (index % 16 == 15) + { + PRINT_HEX("\r\n"); + } + } + + if (offset) + { + *offset = index; + } + else + { + PRINT_HEX("\r\n"); + } +#undef PRINT_HEX + + if (lock) + { + LOG_UNLOCK(); + } +} static void LogShell(HSHELL_FUNC_ARGS) { @@ -258,7 +326,36 @@ static void HDLogFpgaError(const uint8_t *data, int len, uint8_t isWrite, uint8_ return ; } -uint8_t HDLogPrintFpgaHeader(const uint8_t *data, int len, uint8_t isWrite, uint8_t checkFpga) +uint8_t HDLogCheckFpgaHeader(const uint8_t *data, int len) +{ + if (len <= 21) + { + return 0; + } + + for (uint8_t i = 0; i < 7; ++i) + { + if (0x55 != data[i]) + { + return 0; + } + } + + const uint16_t effectLen = (uint16_t)((data[15] << 8) | data[16]); + if (effectLen < 16) + { + return 0; + } + + if (len < 21 + effectLen) + { + return 0; + } + + return 1; +} + +uint8_t HDLogPrintFpga(const uint8_t *data, int len, uint8_t isWrite, uint8_t checkFpga) { const HBitType isPrint = HBitGet(sLogItem, kLogLevelHex); @@ -270,50 +367,20 @@ uint8_t HDLogPrintFpgaHeader(const uint8_t *data, int len, uint8_t isWrite, uint printf("[%d:%02d:%02d.%03d]\r\n", ms / 1000 / 60 / 60, ms / 1000 / 60 % 60, ms / 1000 % 60, ms % 1000); } - if (len <= 21) + if (HDLogCheckFpgaHeader(data, len) == 0) { HDLogFpgaError(data, len, isWrite, checkFpga); LOG_UNLOCK(); return 0; } - for (uint8_t i = 0; i < 7; ++i) - { - if (0x55 != data[i]) - { - HDLogFpgaError(data, len, isWrite, checkFpga); - LOG_UNLOCK(); - return 0; - } - } - - if (0xd5 != data[7]) - { - HDLogFpgaError(data, len, isWrite, checkFpga); - LOG_UNLOCK(); - return 0; - } - - uint8_t type = data[8]; - uint8_t sendCard = (data[9] >> 3) & 0x1F; - uint8_t port = data[9]; - uint8_t recvCardNumber = data[10]; - uint16_t subFunc = (uint16_t)((data[11] << 8) | data[12]); - uint16_t group = (uint16_t)((data[13] << 8) | data[14]); - uint16_t effectLen = (uint16_t)((data[15] << 8) | data[16]); - if (effectLen < 16) - { - HDLogFpgaError(data, len, isWrite, checkFpga); - LOG_UNLOCK(); - return 0; - } - - if (len < 21 + effectLen) - { - HDLogFpgaError(data, len, isWrite, checkFpga); - LOG_UNLOCK(); - return 0; - } + const uint8_t type = data[8]; + const uint8_t sendCard = (data[9] >> 3) & 0x1F; + const uint8_t port = data[9]; + const uint8_t recvCardNumber = data[10]; + const uint16_t subFunc = (uint16_t)((data[11] << 8) | data[12]); + const uint16_t group = (uint16_t)((data[13] << 8) | data[14]); + const uint16_t effectLen = (uint16_t)((data[15] << 8) | data[16]); uint32_t count = 0; uint32_t typeCount = 0; @@ -341,69 +408,15 @@ uint8_t HDLogPrintFpgaHeader(const uint8_t *data, int len, uint8_t isWrite, uint const char *opt = isWrite ? "write" : "read"; printf("%s[%u], typeCount[%u] - type[%02X], sendCard[%d], netPort[%d], cardNumber[%d], subFunc[%04X], group[%04X], effectLen[%d]\r\n", opt, count, typeCount, type, sendCard, port, recvCardNumber, subFunc, group, effectLen); + LogHex((const uint8_t *)(data) + 17, (len) - 21, 1, NULL, 0); LOG_UNLOCK(); return 1; } + void HDLogHex(const uint8_t *data, int len, uint8_t checkPrint, uint32_t *offset) { - if (checkPrint && HBitGet(sLogItem, kLogLevelHex) == 0) - { - return; - } - - if (len <= 0) - { - return; - } - - LOG_LOCK(); -#define PRINT_HEX(...) printf(__VA_ARGS__); - - if (offset == NULL || *offset == 0) - { - PRINT_HEX(" "); - // 16进制打印, 打印15个换行, 开头打印0A-0F 开头样式, 数据列每行00-FF - for (int i = 0; i < 16; ++i) - { - PRINT_HEX("0%X ", i); - } - - PRINT_HEX("\r\n"); - for (int i = 0; i < 17; ++i) - { - PRINT_HEX("---"); - ; - } - - PRINT_HEX("\r\n"); - } - - int index = offset ? *offset : 0; - for (int i = 0; i < len; ++i, ++index) - { - if (index % 16 == 0) - { - PRINT_HEX("%X%X| ", index / 256, index / 16 % 16); - } - - PRINT_HEX("%02X ", data[i]); - if (index % 16 == 15) - { - PRINT_HEX("\r\n"); - } - } - - if (offset) - { - *offset = index; - } - else - { - PRINT_HEX("\r\n"); - } -#undef PRINT_HEX - LOG_UNLOCK(); + LogHex(data, len, checkPrint, offset, 1); } void HDLogData(const uint8_t *data, int len, uint8_t checkPrint)