Ver1.2 && record layout support

This commit is contained in:
LuChiChick 2025-08-11 14:08:48 +08:00
parent 01d1967c27
commit ee707fda1a
4 changed files with 127 additions and 5 deletions

View File

@ -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

View File

@ -13,6 +13,9 @@ void solve_defines(void);
// 类型解析
void solve_types(void);
// 记录布局解析(标定量使用)
void solve_record_layout(void);
// 处理中间件
void solve_middleware(void);

View File

@ -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'};

View File

@ -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");