diff --git a/.vscode/settings.json b/.vscode/settings.json index d8ea43e..524c09c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,7 @@ "vector": "c", "can.h": "c", "device.h": "c", - "gpio.h": "c" + "gpio.h": "c", + "uart.h": "c" } } \ No newline at end of file diff --git a/app/code_generate_interface.py b/app/code_generate_interface.py index 089bcb6..3b70ee9 100644 --- a/app/code_generate_interface.py +++ b/app/code_generate_interface.py @@ -155,50 +155,64 @@ class CodeGenerateInterface(QWidget): - def generate_code(self): - """生成代码逻辑 - 修复导入问题并添加配置重载""" + """生成所有代码,包括未加载页面""" try: - # 收集所有已加载的页面对象,并按类型分类 + # 先收集所有页面名(从CSV配置文件读取) + script_dir = os.path.dirname(os.path.abspath(__file__)) + csv_path = os.path.join(script_dir, "../assets/User_code/config.csv") + csv_path = os.path.abspath(csv_path) + all_class_names = [] + if os.path.exists(csv_path): + with open(csv_path, newline='', encoding='utf-8') as f: + reader = csv.reader(f) + for row in reader: + row = [cell.strip() for cell in row if cell.strip()] + if not row: + continue + main_title = row[0] + for sub in row[1:]: + class_name = f"{main_title}_{sub}".replace("-", "_") + all_class_names.append(class_name) + + # 创建所有页面对象(无论是否点击过) bsp_pages = [] component_pages = [] device_pages = [] - - for i in range(self.stack.count()): - widget = self.stack.widget(i) - # 根据页面类型分类 - if hasattr(widget, '_generate_bsp_code_internal'): - bsp_pages.append(widget) - elif hasattr(widget, '_generate_component_code_internal'): - component_pages.append(widget) - elif hasattr(widget, '_generate_device_code_internal'): - device_pages.append(widget) - + for class_name in all_class_names: + widget = self._get_or_create_page(class_name) + if widget: + if hasattr(widget, '_generate_bsp_code_internal') and widget not in bsp_pages: + bsp_pages.append(widget) + elif hasattr(widget, '_generate_component_code_internal') and widget not in component_pages: + component_pages.append(widget) + elif hasattr(widget, '_generate_device_code_internal') and widget not in device_pages: + device_pages.append(widget) + # 确保导入成功 from app.code_page.bsp_interface import bsp from app.code_page.component_interface import component from app.code_page.device_interface import device - + # 生成 BSP 代码 bsp_result = bsp.generate_bsp(self.project_path, bsp_pages) - + # 生成 Component 代码 component_result = component.generate_component(self.project_path, component_pages) - + # 生成 Device 代码 device_result = device.generate_device(self.project_path, device_pages) - + # 合并结果信息 combined_result = f"BSP代码生成:\n{bsp_result}\n\nComponent代码生成:\n{component_result}\n\nDevice代码生成:\n{device_result}" - - # 用 InfoBar 在主界面弹出 + InfoBar.success( title="代码生成结果", content=combined_result, parent=self, duration=5000 ) - + except ImportError as e: InfoBar.error( title="导入错误", @@ -215,8 +229,6 @@ class CodeGenerateInterface(QWidget): ) - - def _get_freertos_status(self): """获取FreeRTOS状态""" ioc_files = [f for f in os.listdir(self.project_path) if f.endswith('.ioc')] diff --git a/assets/User_code/config.csv b/assets/User_code/config.csv index 8240ccd..51cc2f5 100644 --- a/assets/User_code/config.csv +++ b/assets/User_code/config.csv @@ -1,4 +1,4 @@ bsp,can,dwt,gpio,i2c,mm,spi,uart,pwm,time component,ahrs,ballistics,capacity,cmd,crc8,crc16,error_detect,filter,FreeRTOS_CLI,limiter,mixer,pid,ui,user_math -device,dr16,bmi088 -module,chassis,gimbal,arm,shoot \ No newline at end of file +device,dr16,bmi088,ist8310 +module, \ No newline at end of file diff --git a/assets/User_code/device/bmi088.h b/assets/User_code/device/bmi088.h index 8847cf1..0f33ccc 100644 --- a/assets/User_code/device/bmi088.h +++ b/assets/User_code/device/bmi088.h @@ -23,6 +23,7 @@ typedef struct { } BMI088_Cali_t; /* BMI088校准数据 */ typedef struct { + DEVICE_Header_t header; AHRS_Accl_t accl; AHRS_Gyro_t gyro; diff --git a/assets/User_code/device/config.yaml b/assets/User_code/device/config.yaml index 0b218cb..3c81739 100644 --- a/assets/User_code/device/config.yaml +++ b/assets/User_code/device/config.yaml @@ -48,4 +48,29 @@ devices: - name: "SIGNAL_BMI088_GYRO_NEW_DATA" files: header: "bmi088.h" - source: "bmi088.c" \ No newline at end of file + source: "bmi088.c" + + ist8310: + name: "IST8310" + description: "IST8310 地磁传感器" + dependencies: + bsp: ["i2c", "gpio"] + component: [] + bsp_requirements: + - type: "i2c" + var_name: "BSP_I2C_COMP" + description: "用于与 IST8310 通信的 I2C 总线" + - type: "gpio" + var_name: "CMPS_RST_Pin" + description: "IST8310 复位引脚" + gpio_type: "output" + - type: "gpio" + var_name: "CMPS_INT_Pin" + description: "IST8310 数据中断引脚" + gpio_type: "EXTI" + thread_signals: + - name: "SIGNAL_IST8310_MAGN_RAW_REDY" + - name: "SIGNAL_IST8310_MAGN_NEW_DATA" + files: + header: "ist8310.h" + source: "ist8310.c" \ No newline at end of file diff --git a/assets/User_code/device/dr16.c b/assets/User_code/device/dr16.c index d9c0590..8014653 100644 --- a/assets/User_code/device/dr16.c +++ b/assets/User_code/device/dr16.c @@ -8,7 +8,7 @@ #include #include "bsp/uart.h" - +#include "bsp/time.h" /* Private define ----------------------------------------------------------- */ #define DR16_CH_VALUE_MIN (364u) #define DR16_CH_VALUE_MID (1024u) diff --git a/assets/User_code/device/dr16.h b/assets/User_code/device/dr16.h index 41a7a65..f0c04db 100644 --- a/assets/User_code/device/dr16.h +++ b/assets/User_code/device/dr16.h @@ -30,6 +30,7 @@ typedef struct __packed { } DR16_Data_t; typedef struct { + DEVICE_Header_t header; DR16_Data_t data; } DR16_t; diff --git a/assets/User_code/device/ist8310.c b/assets/User_code/device/ist8310.c new file mode 100644 index 0000000..2b813e4 --- /dev/null +++ b/assets/User_code/device/ist8310.c @@ -0,0 +1,162 @@ +/* + IST8310 地磁传感器。 + +*/ + +/* Includes ----------------------------------------------------------------- */ +#include "ist8310.h" + +#include +#include +#include + +#include "bsp/time.h" +#include "bsp/gpio.h" +#include "bsp/i2c.h" + +/* Private define ----------------------------------------------------------- */ +#define IST8310_WAI (0x00) +#define IST8310_STAT1 (0x02) +#define IST8310_DATAXL (0x03) +#define IST8310_STAT2 (0x09) +#define IST8310_CNTL1 (0x0A) +#define IST8310_CNTL2 (0x0B) +#define IST8310_STR (0x0C) +#define IST8310_TEMPL (0x1C) +#define IST8310_TEMPH (0x1D) +#define IST8310_AVGCNTL (0x41) +#define IST8310_PDCNTL (0x42) + +#define IST8310_CHIP_ID (0x10) + +#define IST8310_IIC_ADDRESS (0x0E << 1) + +#define IST8310_LEN_RX_BUFF (6) +/* Private macro ------------------------------------------------------------ */ +#define IST8310_SET() \ + BSP_GPIO_WritePin(CMPS_RST_Pin, GPIO_PIN_SET) +#define IST8310_RESET() \ + BSP_GPIO_WritePin(CMPS_RST_Pin, GPIO_PIN_RESET) + +/* Private typedef ---------------------------------------------------------- */ +/* Private variables -------------------------------------------------------- */ +uint8_t ist8310_rxbuf[IST8310_LEN_RX_BUFF]; + +static osThreadId_t thread_alert; +static bool inited = false; + +/* Private function -------------------------------------------------------- */ +static void IST8310_WriteSingle(uint8_t reg, uint8_t data) { + BSP_I2C_MemWriteByte(BSP_I2C_COMP, IST8310_IIC_ADDRESS, reg, data); +} + +static uint8_t IST8310_ReadSingle(uint8_t reg) { + return BSP_I2C_MemReadByte(BSP_I2C_COMP, IST8310_IIC_ADDRESS, reg); +} + + +static void IST8310_Read(uint8_t reg, uint8_t *data, uint8_t len) { + if (data == NULL) return; + BSP_I2C_MemRead(BSP_I2C_COMP, IST8310_IIC_ADDRESS, reg, data, len, true); +} + +static void IST8310_MemRxCpltCallback(void) { + osThreadFlagsSet(thread_alert, SIGNAL_IST8310_MAGN_RAW_REDY); +} + +static void IST8310_IntCallback(void) { + osThreadFlagsSet(thread_alert, SIGNAL_IST8310_MAGN_NEW_DATA); +} + +/* Exported functions ------------------------------------------------------- */ +int8_t IST8310_Init(IST8310_t *ist8310, const IST8310_Cali_t *cali) { + if (ist8310 == NULL) return DEVICE_ERR_NULL; + if (cali == NULL) return DEVICE_ERR_NULL; + if (inited) return DEVICE_ERR_INITED; + if ((thread_alert = osThreadGetId()) == NULL) return DEVICE_ERR_NULL; + + ist8310->cali = cali; + + IST8310_RESET(); + BSP_TIME_Delay(50); + IST8310_SET(); + BSP_TIME_Delay(50); + + if (IST8310_ReadSingle(IST8310_WAI) != IST8310_CHIP_ID) + return DEVICE_ERR_NO_DEV; + + BSP_GPIO_DisableIRQ(CMPS_INT_Pin); + + BSP_I2C_RegisterCallback(BSP_I2C_COMP, HAL_I2C_MEM_RX_CPLT_CB, + IST8310_MemRxCpltCallback); + BSP_GPIO_RegisterCallback(CMPS_INT_Pin, IST8310_IntCallback); + + /* Init. */ + /* 0x00: Stand-By mode. 0x01: Single measurement mode. */ + + /* 0x08: Data ready function enable. DRDY signal active low*/ + IST8310_WriteSingle(IST8310_CNTL2, 0x08); + + IST8310_WriteSingle(IST8310_AVGCNTL, 0x09); + IST8310_WriteSingle(IST8310_PDCNTL, 0xC0); + IST8310_WriteSingle(IST8310_CNTL1, 0x0B); + BSP_TIME_Delay(10); + + inited = true; + + BSP_GPIO_EnableIRQ(CMPS_INT_Pin); + return DEVICE_OK; +} + +bool IST8310_WaitNew(uint32_t timeout) { + return (osThreadFlagsWait(SIGNAL_IST8310_MAGN_NEW_DATA, osFlagsWaitAll, + timeout) == SIGNAL_IST8310_MAGN_NEW_DATA); +} + +int8_t IST8310_StartDmaRecv() { + IST8310_Read(IST8310_DATAXL, ist8310_rxbuf, IST8310_LEN_RX_BUFF); + return DEVICE_OK; +} + +uint32_t IST8310_WaitDmaCplt() { + return osThreadFlagsWait(SIGNAL_IST8310_MAGN_RAW_REDY, osFlagsWaitAll, + osWaitForever); +} + +int8_t IST8310_Parse(IST8310_t *ist8310) { + if (ist8310 == NULL) return DEVICE_ERR_NULL; + +#if 1 + /* Magn -> T */ + int16_t raw_x, raw_y, raw_z; + memcpy(&raw_x, ist8310_rxbuf + 0, sizeof(raw_x)); + memcpy(&raw_y, ist8310_rxbuf + 2, sizeof(raw_y)); + memcpy(&raw_z, ist8310_rxbuf + 4, sizeof(raw_z)); + + ist8310->magn.x = (float)raw_x; + ist8310->magn.y = (float)raw_y; + ist8310->magn.z = (float)-raw_z; + +#else + const int16_t *raw_x = (int16_t *)(ist8310_rxbuf + 0); + const int16_t *raw_y = (int16_t *)(ist8310_rxbuf + 2); + const int16_t *raw_z = (int16_t *)(ist8310_rxbuf + 4); + + ist8310->magn.x = (float)*raw_x; + ist8310->magn.y = (float)*raw_y; + ist8310->magn.z = -(float)*raw_z; +#endif + + ist8310->magn.x *= 3.0f / 20.0f; + ist8310->magn.y *= 3.0f / 20.0f; + ist8310->magn.z *= 3.0f / 20.0f; + + ist8310->magn.x = (ist8310->magn.x - ist8310->cali->magn_offset.x) * + ist8310->cali->magn_scale.x; + ist8310->magn.y = (ist8310->magn.y - ist8310->cali->magn_offset.y) * + ist8310->cali->magn_scale.y; + ist8310->magn.z = (ist8310->magn.z - ist8310->cali->magn_offset.y) * + ist8310->cali->magn_scale.z; + + return DEVICE_OK; +} diff --git a/assets/User_code/device/ist8310.h b/assets/User_code/device/ist8310.h new file mode 100644 index 0000000..df16cdd --- /dev/null +++ b/assets/User_code/device/ist8310.h @@ -0,0 +1,49 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ----------------------------------------------------------------- */ +#include +#include +#include + +#include "component/ahrs.h" +#include "device/device.h" + +/* Exported constants ------------------------------------------------------- */ +/* Exported macro ----------------------------------------------------------- */ +/* Exported types ----------------------------------------------------------- */ +typedef struct { + struct { + float x; + float y; + float z; + } magn_offset; /* 磁力计偏置 */ + + struct { + float x; + float y; + float z; + } magn_scale; /* 磁力计缩放 */ +} IST8310_Cali_t; /* IST8310校准数据 */ + +typedef struct { + DEVICE_Header_t header; + AHRS_Magn_t magn; + const IST8310_Cali_t *cali; +} IST8310_t; + +/* Exported functions prototypes -------------------------------------------- */ +int8_t IST8310_Init(IST8310_t *ist8310, const IST8310_Cali_t *cali); +int8_t IST8310_Restart(void); + +bool IST8310_WaitNew(uint32_t timeout); +int8_t IST8310_StartDmaRecv(); +uint32_t IST8310_WaitDmaCplt(); +int8_t IST8310_Parse(IST8310_t *ist8310); + +#ifdef __cplusplus +} +#endif