From 572c8b61d663e06bee81c6842be9fd743fd47844 Mon Sep 17 00:00:00 2001 From: Robofish <1683502971@qq.com> Date: Thu, 1 Jan 2026 22:13:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbsp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 6148 bytes app/code_page/bsp_interface.py | 56 +++++++++++++++++++++++++--- app/code_page/device_interface.py | 24 ++++++++++++ app/code_page/module_interface.py | 14 ++----- assets/User_code/device/config.yaml | 16 ++++++++ 5 files changed, 94 insertions(+), 16 deletions(-) diff --git a/.DS_Store b/.DS_Store index b51dd0f0bf3727da3c0a1947fc3a0f9f1bd015db..258cca211185071b80fb647a97d18af54e275bbb 100644 GIT binary patch delta 116 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50$jG@dU^g=(=VTrM2{uMqpxSqv zwFE9PZDthXW?an9!6C>DR1E|I+(5z=q;X^6cjn3bGM*q~7?>bNf^1>f9M3a{82~j8 B5uN}5 delta 441 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8E20o2aMA$h$FMH}hr%jz7$c**Q2SHn1@A zPUc~eU}J~_s&d?{#d3+sl8qsep%@5L8A=$6J#+GtlXCKtK!yN~wgM^p4+cOM0|ScM z$u=wv97bklItnHRmXnXL*z=-FbFrE-NlQ(3WW6IDk(r#I7o1s@8ZW?KoRMGd3FHP8 zrIux;mQS`|vld$bHa#RSKQEP2*&zVTW8j?J$)+eNz^KHi&1k}C%V^K&!RW~t#hA>P z!I;TdH2E-_GOCT6-?B+DPHgxs$P6(+f*VM?f`VhSAjfy+$^0Uoll^%(I2a)z#V|RZ OXX@mCtn&1A-VXrut!6F& diff --git a/app/code_page/bsp_interface.py b/app/code_page/bsp_interface.py index 0a12798..8faacdc 100644 --- a/app/code_page/bsp_interface.py +++ b/app/code_page/bsp_interface.py @@ -235,7 +235,15 @@ class BspPeripheralBase(QWidget): return True def _generate_source_file(self, configs, template_dir): - template_path = os.path.join(template_dir, self.template_names['source']) + # 从子文件夹加载模板(与_generate_header_file保持一致) + periph_folder = self.peripheral_name.lower() + template_base_dir = CodeGenerator.get_assets_dir("User_code/bsp") + template_path = os.path.join(template_base_dir, periph_folder, self.template_names['source']) + + if not os.path.exists(template_path): + # 如果子文件夹不存在,尝试从根目录加载(向后兼容) + template_path = os.path.join(template_base_dir, self.template_names['source']) + template_content = CodeGenerator.load_template(template_path) if not template_content: return False @@ -398,7 +406,15 @@ class bsp_can(BspPeripheralBase): ) def _generate_source_file(self, configs, template_dir): - template_path = os.path.join(template_dir, self.template_names['source']) + # 从子文件夹加载模板(与_generate_header_file保持一致) + periph_folder = self.peripheral_name.lower() + template_base_dir = CodeGenerator.get_assets_dir("User_code/bsp") + template_path = os.path.join(template_base_dir, periph_folder, self.template_names['source']) + + if not os.path.exists(template_path): + # 如果子文件夹不存在,尝试从根目录加载(向后兼容) + template_path = os.path.join(template_base_dir, self.template_names['source']) + template_content = CodeGenerator.load_template(template_path) if not template_content: return False @@ -1048,7 +1064,14 @@ class bsp_gpio(QWidget): return True def _generate_header_file(self, configs, template_dir): - template_path = os.path.join(template_dir, "gpio.h") + # 从子文件夹加载模板 + template_base_dir = CodeGenerator.get_assets_dir("User_code/bsp") + template_path = os.path.join(template_base_dir, "gpio", "gpio.h") + + if not os.path.exists(template_path): + # 向后兼容:从根目录加载 + template_path = os.path.join(template_base_dir, "gpio.h") + template_content = CodeGenerator.load_template(template_path) if not template_content: return False @@ -1067,7 +1090,14 @@ class bsp_gpio(QWidget): return True def _generate_source_file(self, configs, template_dir): - template_path = os.path.join(template_dir, "gpio.c") + # 从子文件夹加载模板 + template_base_dir = CodeGenerator.get_assets_dir("User_code/bsp") + template_path = os.path.join(template_base_dir, "gpio", "gpio.c") + + if not os.path.exists(template_path): + # 向后兼容:从根目录加载 + template_path = os.path.join(template_base_dir, "gpio.c") + template_content = CodeGenerator.load_template(template_path) if not template_content: return False @@ -1305,7 +1335,14 @@ class bsp_pwm(QWidget): return True def _generate_header_file(self, configs, template_dir): - template_path = os.path.join(template_dir, "pwm.h") + # 从子文件夹加载模板 + template_base_dir = CodeGenerator.get_assets_dir("User_code/bsp") + template_path = os.path.join(template_base_dir, "pwm", "pwm.h") + + if not os.path.exists(template_path): + # 向后兼容:从根目录加载 + template_path = os.path.join(template_base_dir, "pwm.h") + template_content = CodeGenerator.load_template(template_path) if not template_content: return False @@ -1324,7 +1361,14 @@ class bsp_pwm(QWidget): return True def _generate_source_file(self, configs, template_dir): - template_path = os.path.join(template_dir, "pwm.c") + # 从子文件夹加载模板 + template_base_dir = CodeGenerator.get_assets_dir("User_code/bsp") + template_path = os.path.join(template_base_dir, "pwm", "pwm.c") + + if not os.path.exists(template_path): + # 向后兼容:从根目录加载 + template_path = os.path.join(template_base_dir, "pwm.c") + template_content = CodeGenerator.load_template(template_path) if not template_content: return False diff --git a/app/code_page/device_interface.py b/app/code_page/device_interface.py index af2f8b5..56d2fa3 100644 --- a/app/code_page/device_interface.py +++ b/app/code_page/device_interface.py @@ -243,8 +243,13 @@ class DeviceSimple(QWidget): # 使用设备名称作为子文件夹名(小写) device_folder = self.device_name.lower() template_base_dir = CodeGenerator.get_assets_dir("User_code/device") + device_template_dir = os.path.join(template_base_dir, device_folder) files = self.device_config.get('files', {}) + # 收集需要替换BSP配置的文件列表 + files_to_process = list(files.values()) + + # 处理配置中定义的主要文件(需要BSP替换) for file_type, filename in files.items(): # 先尝试从子文件夹加载 src_path = os.path.join(template_base_dir, device_folder, filename) @@ -273,6 +278,25 @@ class DeviceSimple(QWidget): with open(dst_path, 'w', encoding='utf-8') as f: f.write(content) + # 复制设备文件夹下的其他文件(如 lcd_lib.h) + if os.path.exists(device_template_dir): + import shutil + for item in os.listdir(device_template_dir): + # 跳过已处理的文件 + if item in files_to_process: + continue + + src_file = os.path.join(device_template_dir, item) + dst_file = os.path.join(self.project_path, f"User/device/{item}") + + # 只复制文件,不复制子目录 + if os.path.isfile(src_file): + # 检查文件是否已存在,避免覆盖 + if not os.path.exists(dst_file): + os.makedirs(os.path.dirname(dst_file), exist_ok=True) + shutil.copy2(src_file, dst_file) + print(f"复制额外文件: {dst_file}") + self._save_config() return True diff --git a/app/code_page/module_interface.py b/app/code_page/module_interface.py index 3bd26cf..a186557 100644 --- a/app/code_page/module_interface.py +++ b/app/code_page/module_interface.py @@ -28,7 +28,7 @@ class ModulePage(QWidget): module_dir = CodeGenerator.get_assets_dir("User_code/module") if subtype: self.module_path = os.path.join(module_dir, module_type, subtype) - self.module_key = subtype + self.module_key = module_type # 使用类型名作为目标文件夹 else: self.module_path = os.path.join(module_dir, module_type) self.module_key = module_type @@ -139,10 +139,7 @@ class ModulePage(QWidget): def _check_generated_status(self): """检查模块是否已生成""" - if self.subtype: - dst_dir = os.path.join(self.project_path, "User/module", self.module_type, self.subtype) - else: - dst_dir = os.path.join(self.project_path, "User/module", self.module_type) + dst_dir = os.path.join(self.project_path, "User/module", self.module_key) if os.path.exists(dst_dir): has_code = any( @@ -165,11 +162,8 @@ class ModulePage(QWidget): # 首先生成 config(如果不存在) self._generate_config() - # 目标目录 - if self.subtype: - dst_dir = os.path.join(self.project_path, "User/module", self.module_type, self.subtype) - else: - dst_dir = os.path.join(self.project_path, "User/module", self.module_type) + # 目标目录:展平到 User/module/{module_key} + dst_dir = os.path.join(self.project_path, "User/module", self.module_key) # 检查是否已存在 if os.path.exists(dst_dir): diff --git a/assets/User_code/device/config.yaml b/assets/User_code/device/config.yaml index e240946..f02ad18 100644 --- a/assets/User_code/device/config.yaml +++ b/assets/User_code/device/config.yaml @@ -240,6 +240,22 @@ devices: description: "lcd驱动(SPI)" dependencies: bsp: ["gpio", "spi"] + bsp_requirements: + - type: "spi" + var_name: "BSP_SPI_LCD" + description: "用于LCD通信的SPI总线" + - type: "gpio" + var_name: "BSP_GPIO_LCD_CS" + description: "LCD片选引脚" + gpio_type: "output" + - type: "gpio" + var_name: "BSP_GPIO_LCD_DC" + description: "LCD数据/命令控制引脚" + gpio_type: "output" + - type: "gpio" + var_name: "BSP_GPIO_LCD_RST" + description: "LCD复位引脚" + gpio_type: "output" thread_signals: [] files: header: "lcd.h"