From 06c331080e2bff1f134b1c399982150074869990 Mon Sep 17 00:00:00 2001 From: Linghtiin <1012722378@qq.com> Date: Mon, 4 Nov 2024 01:39:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8F=82=E6=95=B0=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E5=9D=97=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E9=80=BB=E8=BE=91;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 4 +- .vscode/tasks.json | 4 +- sample/text_selector_rules.md | 23 +++++++ source/CBB/Param.py | 31 +++++++-- source/CBB/templates/param_defination.templet | 68 +++++++++++++++++++ 5 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 sample/text_selector_rules.md create mode 100644 source/CBB/templates/param_defination.templet diff --git a/.vscode/launch.json b/.vscode/launch.json index a898e70..e187247 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,7 +11,7 @@ "program": "source/main.py", "console": "integratedTerminal", "args": [ - "test/param_input.xlsx", + "test/CBB_Param/param_input.xlsx", "-t=CBB_Param", "-d=PV_INV30", ] @@ -24,7 +24,7 @@ "console": "integratedTerminal", "args": [ // "${command:pickArgs}", - "test/光伏逆变器2.1_通信地址表_V01.xlsx", + "test/PV_Inverter/光伏逆变器2.1_通信地址表_V33.xlsx", "-t=COMM_ARM", "-d=PV_INV30" ], diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 0fd8e4a..f769bec 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -13,7 +13,7 @@ "type": "shell", "command": "de_encrypt", "args": [ - "test/光伏逆变器2.1_通信地址表_V01.xlsx", + "${command:pickArgs}", ], "problemMatcher": [], @@ -34,7 +34,7 @@ "type": "shell", "command": "rm", "args": [ - "test/光伏逆变器2.1_通信地址表_V01_dec.dec", + "${command:pickArgs}", ], "problemMatcher": [], diff --git a/sample/text_selector_rules.md b/sample/text_selector_rules.md new file mode 100644 index 0000000..946a9fe --- /dev/null +++ b/sample/text_selector_rules.md @@ -0,0 +1,23 @@ +# 文本选择器规则 + +## 简介 + +1. 为实现基于模板文件生成代码的功能, 需要实现一套模板文件解析规则; +2. 代码生成过程中, 解析数据表格获得代码数据, 解析模板文本获得代码实现的样式, 通过将代码样式中需要的信息填入代码数据, 完成代码生成; +3. 模板文本包含以下内容: + 1. 一般文本: 在代码生成中保持原样; + 2. 生成内容: 通过解析内部字符串, 对数据进行替换; + 1. 单行生成内容; `{{}}` + 2. 多行生成内容; `<<>>` + 1. 包含一段代码, 通过`ast`模块解析实现更复杂的代码生成; + +## 解析规则 + + +- 数据选择器: `variable[.member][:index][#function]` + 1. 变量指定(`variable`): 确定需要替换的变量信息 + 2. 成员选择(`.member`): 取得数据的成员信息 + 3. 索引选择(`:index`): 序列数据的内容指定; + 4. 键选择(`@key`): 字典数据的内容指定; + 3. 函数后处理(`#function`): 依次解析函数名, 通过pandas或自定义函数实现生成文本的后处理; + diff --git a/source/CBB/Param.py b/source/CBB/Param.py index f1acf90..3ef5484 100644 --- a/source/CBB/Param.py +++ b/source/CBB/Param.py @@ -9,13 +9,32 @@ ''' import numpy as np -from pandas import DataFrame +from pandas import Series, DataFrame -def code_cbb_param(sheet: DataFrame) -> str|None: - """ 参数页代码生成 """ - pass - def code_cbb_params(sheets: dict[str, DataFrame]) -> str|None: """ 完整参数模块配置代码生成 """ - pass \ No newline at end of file + pass + + param_pages = [] + for name, sheet in sheets.items(): + """ 解析表格文件页为代码结构体 """ + print(sheet.head()) + page_meta = sheet.iloc[:9, 3:4].T.reset_index() + page_meta.columns = sheet.iloc[:9, 2:3].T.reset_index().loc[0] + page_data = sheet.iloc[10:, :].reset_index(drop=True) + page_data.columns = sheet.iloc[9,:] + param_page = { + 'name': name, + 'info': page_meta.loc[0], + 'data': page_data + } + param_pages.append(param_page) + + for info in param_pages: + """ 依据结构体生成参数页代码 """ + file_name = f"param_{info['name'].lower()}_defination.h" + file_text = + + +def file_header(): \ No newline at end of file diff --git a/source/CBB/templates/param_defination.templet b/source/CBB/templates/param_defination.templet new file mode 100644 index 0000000..88e380c --- /dev/null +++ b/source/CBB/templates/param_defination.templet @@ -0,0 +1,68 @@ +/* + * ===================================================================================== + * + * Filename: {{info@name#lower}} + * + * Description: + * + * Version: 1.0 + * Created: {{`time.ctime()`}} + * Revision: none + * Compiler: gcc + * + * Author: Linghtiin + * Organization: Topscomm + * + * ===================================================================================== + */ + +#ifndef __PARAM_{{info@name#upper}}_DEFINATION_H__ +#define __PARAM_{{info@name#upper}}_DEFINATION_H__ + +#include +#include + + +#define {{info@name#upper}}_PARAM_NUM ({{info@data.shape:0}}) + +<> +#define {{info@name#upper}}_PARAM_{{info@data#upper}}_SIZE (4) +#define COMM_PARAM_REMOTE_PORT_SIZE (sizeof(uint16_t)) +#define COMM_PARAM_INTERACTIVE_CYCLE_4G_SIZE (sizeof(uint16_t)) +#define COMM_PARAM_GPRS_COM_OVER_TIME_SIZE (sizeof(uint16_t)) +#define COMM_PARAM_CAN_ENABLE_SIZE (sizeof(uint8_t)) +#define COMM_PARAM_CAN_DEV_ID_SIZE (sizeof(uint16_t)) +#define COMM_PARAM_CAN_PARALLEL_NUM_SIZE (sizeof(uint16_t)) +#define COMM_PARAM_COM_OVER_TIME_SIZE (sizeof(uint16_t)) +#define COMM_PARAM_LOG_LEVEL_SIZE (sizeof(uint8_t)) +#define COMM_PARAM_LOG_OUTPUT_SIZE (sizeof(uint8_t)) +#define COMM_PARAM_LOG_CHANNEL_SIZE (sizeof(uint8_t)) +#define COMM_PARAM_LOG_FILE_SIZE_SIZE (sizeof(uint16_t)) +#define COMM_PARAM_LOG_FILE_CNT_SIZE (sizeof(uint16_t)) +#define COMM_PARAM_LOG_UDP_PORT_SIZE (sizeof(uint16_t)) +#define COMM_PARAM_LOG_UDP_ETH_IP_SIZE (4) +#define COMM_PARAM_PLC_CHECK_COMM_PERIOD_SIZE (sizeof(uint16_t)) + + +typedef struct +{ + uint8_t remote_ip[COMM_PARAM_REMOTE_IP_SIZE]; /* 主站IP */ + uint16_t remote_port; /* 主站端口号 */ + uint16_t interactive_cycle_4g; /* 4G交互周期 */ + uint16_t gprs_com_over_time; /* 4G通信超时阈值 */ + uint8_t can_enable; /* CAN使能 */ + uint16_t can_dev_id; /* CAN并机ID */ + uint16_t can_parallel_num; /* CAN并机数量 */ + uint16_t com_over_time; /* 通信故障判定时间 */ + uint8_t log_level; /* 日志级别 */ + uint8_t log_output; /* 日志输出模式 */ + uint8_t log_channel; /* 日志监控通道 */ + uint16_t log_file_size; /* 日志文件大小 */ + uint16_t log_file_cnt; /* 日志文件数量 */ + uint16_t log_udp_port; /* 日志网络端口 */ + uint8_t log_udp_eth_ip[COMM_PARAM_LOG_UDP_ETH_IP_SIZE]; /* 日志网络地址 */ + uint16_t plc_check_comm_period; /* 载波通信超时判断周期 */ +} comm_param_t; + + +#endif /* ----- #ifndef __PARAM_{{info@name#upper}}_DEFINATION_H__ ----- */