便携式动平衡仪Qt应用层详细设计方案
版本:1.0
日期:2023年10月
一、引言
1.1 文档目的
本文档详细描述了便携式动平衡仪软件中Qt应用层的设计实现,涵盖用户界面交互、功能模块划分、数据流管理及核心逻辑实现,确保开发过程规范化和可维护性。
1.2 适用范围
- 开发团队:软件工程师、测试工程师
- 硬件依赖:STM32MP157D(双核)、10英寸电容触控屏
- 软件依赖:Qt 6.5、Linux 5.15、FreeRTOS 10
二、总体设计
2.1 应用层架构图
+---------------------+
| UI界面层 | <- QML界面、交互动画、触摸事件
+---------------------+
| 业务逻辑控制器 | <- 模板管理、导航控制、数据转发
+---------------------+
| 服务代理层 | <- 与Linux服务层通信(IPC)、文件读写
+---------------------+
2.2 模块划分
模块 | 功能 | 关键类/组件 |
---|
启动与主界面模块 | 开机动画、主界面布局、图标响应 | SplashScreen.qml MainWindow.qml |
导航管理模块 | 页面堆栈控制(前进/后退) | StackView NavigationController |
模板系统模块 | 模板保存/加载、文件关联、桌面快捷方式生成 | TemplateManager FileDialog.qml |
实时显示模块 | 相位/角度仪表盘、数据表格、实时曲线 | PhaseMeter.qml DataTable.qml |
配置模块 | 平衡参数输入、传感器校准界面 | ConfigPage.qml CalibrationWizard |
三、模块详细设计
3.1 启动与主界面模块
3.1.1 启动流程
- 长按电源键触发开机:
- 硬件中断唤醒M4核,初始化传感器。
- A7核启动Linux,加载Qt应用。
- 启动动画实现:
// SplashScreen.qml
Image {
source: "logo.png"
SequentialAnimation on opacity {
loops: 3
NumberAnimation { from: 1; to: 0.3; duration: 200 }
NumberAnimation { from: 0.3; to: 1; duration: 200 }
}
}
- 主界面布局:
// MainWindow.qml
ColumnLayout {
// 顶部状态栏
StatusBar {
Label { text: Qt.formatDateTime(new Date(), "yyyy-MM-dd") }
BatteryIndicator { value: Battery.status }
}
// 工作区图标网格
GridLayout {
columns: 5
IconButton { icon: "1-plane.png"; onClicked: enterConfigPage(1) }
IconButton { icon: "2-plane.png"; onClicked: enterConfigPage(2) }
// ...其他6个图标
}
// 底部导航栏
NavigationBar {
BackButton { onClicked: stackView.pop() }
NextButton { onClicked: stackView.push("BalancePage.qml") }
}
}
3.2 导航管理模块
3.2.1 页面堆栈控制
3.3 模板系统模块
3.3.1 模板文件设计
- 文件格式:JSON + AES加密(扩展名
.tpl
)。{
"version": 1,
"rpm": 3000,
"plane_mode": 1,
"calibration": { "sensor_id": "SENSOR_001", "offset": 0.12 },
"timestamp": "2023-10-01T14:30:00Z"
}
- 文件关联:
void TemplateManager::registerFileType() {
QMimeDatabase db;
QMimeType mime = db.mimeTypeForName("application/x-balance-template");
mime.addGlobPattern("*.tpl");
qApp->setProperty("templateMimeType", mime.name());
}
3.3.2 模板加载逻辑
// FileBrowser.qml
ListView {
model: fileModel
delegate: FileItem {
onClicked: {
if (isTemplate(filePath)) {
TemplateManager.loadTemplate(filePath);
stackView.replace("BalancePage.qml", { template: loadedTemplate });
}
}
}
}
3.4 实时显示模块
3.4.1 仪表盘实现
- 相位圆环(OpenGL加速):
// PhaseMeter.qml
Canvas {
renderTarget: Canvas.FramebufferObject
onPaint: {
var ctx = getContext("2d");
ctx.beginPath();
ctx.arc(centerX, centerY, radius, -Math.PI/2, currentAngle);
ctx.strokeStyle = "#FF0000";
ctx.lineWidth = 8;
ctx.stroke();
}
}
3.4.2 数据表格动态更新
// DataTable.qml
TableView {
columnWidthProvider: (column) => 120
model: BalanceDataModel {
updateInterval: 100 // 100ms刷新
}
}
四、接口定义
4.1 服务代理层接口
接口名称 | 功能 | 调用方式 |
---|
loadTemplate() | 从文件系统加载模板 | Qt信号槽(跨线程) |
saveMeasurement() | 保存测量结果到CSV/PDF | 异步Promise |
getBatteryStatus() | 获取电池电量与状态 | 直接调用 |
4.2 与硬件层通信协议
struct SharedData {
volatile float phase;
volatile float amplitude;
volatile uint8_t status;
pthread_mutex_t lock;
};
五、关键数据结构
5.1 模板参数结构体
struct BalanceTemplate {
QString name;
int planeMode;
QMap<QString, QVariant> params;
QByteArray toEncryptedJson() const;
static BalanceTemplate fromEncryptedJson(const QByteArray &data);
};
5.2 实时数据容器
class RealtimeDataBuffer {
private:
QVector<double> buffer;
QReadWriteLock lock;
public:
void append(const QVector<double>& data);
QVector<double> fetchLatest(int maxSamples);
};
六、测试计划
6.1 单元测试用例
测试项 | 输入 | 预期输出 |
---|
模板加载 | 合法.tpl文件 | 正确解析参数并跳转页面 |
文件关联 | 双击.tpl文件 | 触发loadTemplate信号 |
实时数据刷新 | 模拟10kHz数据流 | 界面无卡顿(FPS≥30) |
6.2 自动化测试脚本
def test_template_loading(qtbot):
main_window = MainWindow()
qtbot.mouseClick(main_window.file_button, Qt.LeftButton)
qtbot.keyClicks(file_dialog, "test.tpl")
assert main_window.current_page == "BalancePage"
七、附录
7.1 UML类图
@startuml
class MainWindow {
+StackView stackView
+void enterConfigPage(int mode)
}
class TemplateManager {
+BalanceTemplate loadTemplate(QString path)
+void saveTemplate(BalanceTemplate tpl)
}
class BalancePage {
-PhaseMeter phaseMeter
-DataTable dataTable
+void updateData(QVector<double> samples)
}
MainWindow --> TemplateManager : uses
MainWindow --> BalancePage : navigates to
@enduml
7.2 参考文档
- 《Qt 6.5嵌入式开发指南》
- 《IEC 61326-1:2020 EMC测试标准》
- 《ISO 1940-1:2018机械振动平衡标准》
八、修订记录
版本 | 日期 | 修改内容 |
---|
1.0 | 2023-10-01 | 初版发布 |
该文档完整覆盖了Qt应用层的设计细节,可直接作为开发指南和交付文档。