From ee707fda1ae5e9d0ff98d86019cd9375c6dc1048 Mon Sep 17 00:00:00 2001 From: LuChiChick <1084116302@qq.com> Date: Mon, 11 Aug 2025 14:08:48 +0800 Subject: [PATCH] Ver1.2 && record layout support --- Inc/Config.hpp | 8 ++- Inc/Core_Functions.hpp | 3 ++ Src/Core_Functions.cpp | 114 ++++++++++++++++++++++++++++++++++++++++- Src/Main.cpp | 7 ++- 4 files changed, 127 insertions(+), 5 deletions(-) diff --git a/Inc/Config.hpp b/Inc/Config.hpp index 8ad0bab..c2a737c 100644 --- a/Inc/Config.hpp +++ b/Inc/Config.hpp @@ -27,7 +27,11 @@ #define A2L_INSERT_PATTERN_STR "/end MODULE" // 段输出标识串 -#define START_OF_GENERATED_PATTERN_STR "/*********** start of SrcToA2L generated blocks ***********/" -#define END_OF_GENERATED_PATTERN_STR "/*********** end of SrcToA2L generated blocks ***********/" + +#define START_OF_GENERATED_RECORD_LAYOUT_STR "/*********** start of record layout block generated by SrcToA2L ***********/" +#define END_OF_GENERATED_RECORD_LAYOUT_STR "/*********** end of record layout block generated by SrcToA2L ***********/" + +#define START_OF_GENERATED_CALIBRATION_AND_MEASURMENT_STR "/*********** start of calibrations and measurements block generated by SrcToA2L ***********/" +#define END_OF_GENERATED_CALIBRATION_AND_MEASURMENT_STR "/*********** end of calibrations and measurements block generated by SrcToA2L ***********/" #endif \ No newline at end of file diff --git a/Inc/Core_Functions.hpp b/Inc/Core_Functions.hpp index 505cb08..9c6d846 100644 --- a/Inc/Core_Functions.hpp +++ b/Inc/Core_Functions.hpp @@ -13,6 +13,9 @@ void solve_defines(void); // 类型解析 void solve_types(void); +// 记录布局解析(标定量使用) +void solve_record_layout(void); + // 处理中间件 void solve_middleware(void); diff --git a/Src/Core_Functions.cpp b/Src/Core_Functions.cpp index 06c269a..782b0a6 100644 --- a/Src/Core_Functions.cpp +++ b/Src/Core_Functions.cpp @@ -815,10 +815,104 @@ void solve_types(void) } } +// 记录布局解析(标定量使用) +void solve_record_layout(void) +{ + // 记录布局名串 + const char *record_type[8] = + { + "Scalar_UBYTE", + "Scalar_UWORD", + "Scalar_ULONG", + "Scalar_SBYTE", + "Scalar_SWORD", + "Scalar_SLONG", + "Scalar_FLOAT32_IEEE", + "Scalar_FLOAT64_IEEE", + }; + + // 布局存在与否 + bool find_flag[8] = + { + false, + false, + false, + false, + false, + false, + false, + false, + }; + + if (input_reference_A2L_file != nullptr) + { + + // 回到文件起始 + fseek(input_reference_A2L_file, 0, SEEK_SET); + // 段缓冲区 + char segment_buff[SEGMENT_BUFF_LENGTH] = {'\0'}; + + // 从头到尾检查A2L中的RECORD_LAYOUT类型 + while (f_getline(input_reference_A2L_file, segment_buff, sizeof(segment_buff)) != 0) + { + // 当前行为 RECORD_LAYOUT + if (strstr(segment_buff, "RECORD_LAYOUT")) + { + // 指针跳转到RECORD_LAYOUT后第一个有效字符 + char *p_record_str = strstr(segment_buff, "RECORD_LAYOUT") + strlen("RECORD_LAYOUT"); + size_t segment_len = strlen(segment_buff); + while (*p_record_str != '\n' && p_record_str != segment_buff + segment_len) + { + if (isalpha(*p_record_str) || *p_record_str == '_') + break; + p_record_str++; + } + + // 挨个检查 + for (int count = 0; count < 8; count++) + { + if (find_flag[count]) + continue; + if (strstr(p_record_str, record_type[count])) + find_flag[count] = true; + } + } + } + } + + bool all_clear = true; + for (int count = 0; count < 8; count++) + if (!find_flag[count]) + all_clear = false; + + // 补全输出 + if (!all_clear) + { + fprintf(output_middleware_file, "\r\n\r\n"); + fprintf(output_middleware_file, "%s\r\n\r\n\r\n", START_OF_GENERATED_RECORD_LAYOUT_STR); + + for (int count = 0; count < 8; count++) + { + if (find_flag[count]) + continue; + log_printf(LOG_SUCCESS, "Add missing record layout \"%s\"", record_type[count]); + + fprintf(output_middleware_file, "/begin RECORD_LAYOUT %s\r\n", record_type[count]); + fprintf(output_middleware_file, " FNC_VALUES 1 %s COLUMN_DIR DIRECT\r\n", record_type[count] + strlen("Scalar_")); + fprintf(output_middleware_file, "/end RECORD_LAYOUT\r\n\r\n"); + } + + fprintf(output_middleware_file, "\r\n"); + fprintf(output_middleware_file, "%s\r\n", END_OF_GENERATED_RECORD_LAYOUT_STR); + } +} + // 处理中间件 void solve_middleware(void) { - fprintf(output_middleware_file, "\r\n\r\n%s\r\n\r\n", START_OF_GENERATED_PATTERN_STR); + // 抬头输出 + bool head_output = false; + file_node *target_file_node = source_and_header_file_list_head; // 循环处理输入文件 @@ -835,6 +929,12 @@ void solve_middleware(void) // 检测到标定量起始行 if (strstr(segment_buff, START_OF_CALIBRATION_PATTERN_STR)) { + if (!head_output) + { + fprintf(output_middleware_file, "\r\n\r\n%s\r\n\r\n\r\n", START_OF_GENERATED_CALIBRATION_AND_MEASURMENT_STR); + head_output = true; + } + do { // 跳过空白部分 @@ -855,6 +955,12 @@ void solve_middleware(void) // 观测量起始行 if (strstr(segment_buff, START_OF_MEASURMENT_PATTERN_STR)) { + if (!head_output) + { + fprintf(output_middleware_file, "\r\n\r\n%s\r\n\r\n", START_OF_GENERATED_CALIBRATION_AND_MEASURMENT_STR); + head_output = true; + } + do { // 跳过空白部分 @@ -877,12 +983,16 @@ void solve_middleware(void) target_file_node = target_file_node->p_next; } - fprintf(output_middleware_file, "\r\n\r\n%s\r\n\r\n", END_OF_GENERATED_PATTERN_STR); + if (head_output) + fprintf(output_middleware_file, "\r\n\r\n%s\r\n\r\n", END_OF_GENERATED_CALIBRATION_AND_MEASURMENT_STR); } // 处理最终A2L输出 void solve_A2L_output(void) { + // 回到文件起始 + fseek(input_reference_A2L_file, 0, SEEK_SET); + // 段缓冲区 char segment_buff[SEGMENT_BUFF_LENGTH] = {'\0'}; diff --git a/Src/Main.cpp b/Src/Main.cpp index a9f4b9c..a4b8779 100644 --- a/Src/Main.cpp +++ b/Src/Main.cpp @@ -14,7 +14,7 @@ extern "C" int main(int argc, char *argv[]) { printf("\n\n"); - log_printf(LOG_SYS_INFO, "SrcToA2L Ver1.1"); + log_printf(LOG_SYS_INFO, "SrcToA2L Ver1.2"); log_printf(LOG_SYS_INFO, "Auther: LuChiChick"); log_printf(LOG_SYS_INFO, "%s\n%s\n%s\n\n", "Open source links:", " ├─Github: https://git.luchichick.cn/LuChiChick/SrcToA2L", @@ -35,6 +35,11 @@ int main(int argc, char *argv[]) log_printf(LOG_SYS_INFO, "Start compound type definition solve.\n\n"); solve_types(); + // 处理记录布局 + printf("\n\n"); + log_printf(LOG_SYS_INFO, "Start record layout solve.\n\n"); + solve_record_layout(); + // 处理中间件 printf("\n\n"); log_printf(LOG_SYS_INFO, "Start calibration and measurement solve.\n\n");