mirror of
https://github.com/goldenfishs/MRobot.git
synced 2025-09-14 12:54:33 +08:00
给device添加time
This commit is contained in:
parent
71c2e83a7a
commit
f9f0d93b95
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -9,6 +9,7 @@
|
|||||||
"vector": "c",
|
"vector": "c",
|
||||||
"can.h": "c",
|
"can.h": "c",
|
||||||
"device.h": "c",
|
"device.h": "c",
|
||||||
"gpio.h": "c"
|
"gpio.h": "c",
|
||||||
|
"uart.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -155,50 +155,64 @@ class CodeGenerateInterface(QWidget):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def generate_code(self):
|
def generate_code(self):
|
||||||
"""生成代码逻辑 - 修复导入问题并添加配置重载"""
|
"""生成所有代码,包括未加载页面"""
|
||||||
try:
|
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 = []
|
bsp_pages = []
|
||||||
component_pages = []
|
component_pages = []
|
||||||
device_pages = []
|
device_pages = []
|
||||||
|
for class_name in all_class_names:
|
||||||
for i in range(self.stack.count()):
|
widget = self._get_or_create_page(class_name)
|
||||||
widget = self.stack.widget(i)
|
if widget:
|
||||||
# 根据页面类型分类
|
if hasattr(widget, '_generate_bsp_code_internal') and widget not in bsp_pages:
|
||||||
if hasattr(widget, '_generate_bsp_code_internal'):
|
bsp_pages.append(widget)
|
||||||
bsp_pages.append(widget)
|
elif hasattr(widget, '_generate_component_code_internal') and widget not in component_pages:
|
||||||
elif hasattr(widget, '_generate_component_code_internal'):
|
component_pages.append(widget)
|
||||||
component_pages.append(widget)
|
elif hasattr(widget, '_generate_device_code_internal') and widget not in device_pages:
|
||||||
elif hasattr(widget, '_generate_device_code_internal'):
|
device_pages.append(widget)
|
||||||
device_pages.append(widget)
|
|
||||||
|
|
||||||
# 确保导入成功
|
# 确保导入成功
|
||||||
from app.code_page.bsp_interface import bsp
|
from app.code_page.bsp_interface import bsp
|
||||||
from app.code_page.component_interface import component
|
from app.code_page.component_interface import component
|
||||||
from app.code_page.device_interface import device
|
from app.code_page.device_interface import device
|
||||||
|
|
||||||
# 生成 BSP 代码
|
# 生成 BSP 代码
|
||||||
bsp_result = bsp.generate_bsp(self.project_path, bsp_pages)
|
bsp_result = bsp.generate_bsp(self.project_path, bsp_pages)
|
||||||
|
|
||||||
# 生成 Component 代码
|
# 生成 Component 代码
|
||||||
component_result = component.generate_component(self.project_path, component_pages)
|
component_result = component.generate_component(self.project_path, component_pages)
|
||||||
|
|
||||||
# 生成 Device 代码
|
# 生成 Device 代码
|
||||||
device_result = device.generate_device(self.project_path, device_pages)
|
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}"
|
combined_result = f"BSP代码生成:\n{bsp_result}\n\nComponent代码生成:\n{component_result}\n\nDevice代码生成:\n{device_result}"
|
||||||
|
|
||||||
# 用 InfoBar 在主界面弹出
|
|
||||||
InfoBar.success(
|
InfoBar.success(
|
||||||
title="代码生成结果",
|
title="代码生成结果",
|
||||||
content=combined_result,
|
content=combined_result,
|
||||||
parent=self,
|
parent=self,
|
||||||
duration=5000
|
duration=5000
|
||||||
)
|
)
|
||||||
|
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
InfoBar.error(
|
InfoBar.error(
|
||||||
title="导入错误",
|
title="导入错误",
|
||||||
@ -215,8 +229,6 @@ class CodeGenerateInterface(QWidget):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _get_freertos_status(self):
|
def _get_freertos_status(self):
|
||||||
"""获取FreeRTOS状态"""
|
"""获取FreeRTOS状态"""
|
||||||
ioc_files = [f for f in os.listdir(self.project_path) if f.endswith('.ioc')]
|
ioc_files = [f for f in os.listdir(self.project_path) if f.endswith('.ioc')]
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
bsp,can,dwt,gpio,i2c,mm,spi,uart,pwm,time
|
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
|
component,ahrs,ballistics,capacity,cmd,crc8,crc16,error_detect,filter,FreeRTOS_CLI,limiter,mixer,pid,ui,user_math
|
||||||
device,dr16,bmi088
|
device,dr16,bmi088,ist8310
|
||||||
module,chassis,gimbal,arm,shoot
|
module,
|
|
@ -23,6 +23,7 @@ typedef struct {
|
|||||||
} BMI088_Cali_t; /* BMI088校准数据 */
|
} BMI088_Cali_t; /* BMI088校准数据 */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
DEVICE_Header_t header;
|
||||||
AHRS_Accl_t accl;
|
AHRS_Accl_t accl;
|
||||||
AHRS_Gyro_t gyro;
|
AHRS_Gyro_t gyro;
|
||||||
|
|
||||||
|
@ -48,4 +48,29 @@ devices:
|
|||||||
- name: "SIGNAL_BMI088_GYRO_NEW_DATA"
|
- name: "SIGNAL_BMI088_GYRO_NEW_DATA"
|
||||||
files:
|
files:
|
||||||
header: "bmi088.h"
|
header: "bmi088.h"
|
||||||
source: "bmi088.c"
|
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"
|
@ -8,7 +8,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "bsp/uart.h"
|
#include "bsp/uart.h"
|
||||||
|
#include "bsp/time.h"
|
||||||
/* Private define ----------------------------------------------------------- */
|
/* Private define ----------------------------------------------------------- */
|
||||||
#define DR16_CH_VALUE_MIN (364u)
|
#define DR16_CH_VALUE_MIN (364u)
|
||||||
#define DR16_CH_VALUE_MID (1024u)
|
#define DR16_CH_VALUE_MID (1024u)
|
||||||
|
@ -30,6 +30,7 @@ typedef struct __packed {
|
|||||||
} DR16_Data_t;
|
} DR16_Data_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
DEVICE_Header_t header;
|
||||||
DR16_Data_t data;
|
DR16_Data_t data;
|
||||||
} DR16_t;
|
} DR16_t;
|
||||||
|
|
||||||
|
162
assets/User_code/device/ist8310.c
Normal file
162
assets/User_code/device/ist8310.c
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
/*
|
||||||
|
IST8310 地磁传感器。
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ----------------------------------------------------------------- */
|
||||||
|
#include "ist8310.h"
|
||||||
|
|
||||||
|
#include <gpio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
49
assets/User_code/device/ist8310.h
Normal file
49
assets/User_code/device/ist8310.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Includes ----------------------------------------------------------------- */
|
||||||
|
#include <cmsis_os2.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#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
|
Loading…
Reference in New Issue
Block a user