便携式动平衡仪Qt应用层详细设计说明书 (DDD)
版本:1.1 日期:2023年10月
一、文档目录
系统概述 应用层架构设计 模块详细设计 接口定义与数据流 关键数据结构 代码框架与实现 测试计划 附录
二、系统概述
2.1 功能需求
开机流程 :长按电源键启动,全屏显示商标动画(快闪3~4次)。主界面 :三栏布局(状态栏、工作区图标、导航栏),支持点击图标跳转。模板系统 :保存/加载动平衡参数模板(.tpl
文件),点击模板直接跳转至测量界面。实时显示 :双圆形仪表盘(相位/角度)、数据表格、实时曲线。
2.2 非功能需求
性能 :界面刷新率≥30 FPS,触摸响应延迟<200ms。兼容性 :适配10英寸触控屏(分辨率1280x800)。安全性 :模板文件加密存储(AES-256)。
三、应用层架构设计
3.1 分层架构
+---------------------+
| UI界面层 | <- QML界面、动画、触摸事件
+---------------------+
| 业务逻辑层 | <- 模板管理、导航控制、数据转发
+---------------------+
| 服务代理层 | <- 与硬件层通信(IPC)、文件读写
+---------------------+
3.2 模块划分
模块 功能 关键组件 启动与主界面模块 开机动画、主界面布局、图标响应 SplashScreen.qml
MainWindow.qml
导航管理模块 页面堆栈控制(前进/后退) StackView
NavigationController
模板系统模块 模板保存/加载、文件关联、桌面快捷方式生成 TemplateManager
FileDialog.qml
实时显示模块 相位/角度仪表盘、数据表格、实时曲线 PhaseMeter.qml
DataTable.qml
配置模块 平衡参数输入、传感器校准界面 ConfigPage.qml
CalibrationWizard
四、模块详细设计
4.1 启动与主界面模块
4.1.1 开机动画实现
// SplashScreen.qml
Image { id: logo source: "qrc:/images/logo.png" anchors.fill: parent SequentialAnimation on opacity { loops: 3 NumberAnimation { from: 1; to: 0.3; duration: 200 } NumberAnimation { from: 0.3; to: 1; duration: 200 } }
}
4.1.2 主界面布局
// MainWindow.qml
ColumnLayout { // 1. 顶部状态栏 StatusBar { RowLayout { Label { text: Qt.formatDateTime(new Date(), "yyyy-MM-dd") } BatteryIndicator { value: Battery.status } } } // 2. 工作区图标网格(2行5列) GridLayout { columns: 5 Repeater { model: 8 delegate: IconButton { icon: modelData.iconPath onClicked: NavigationController.navigateTo(modelData.page) } } } // 3. 底部导航栏 NavigationBar { BackButton { onClicked: StackView.pop() } NextButton { onClicked: StackView.push("BalancePage.qml") } }
}
4.2 模板系统模块
4.2.1 模板文件格式
{ "version" : 1 , "rpm" : 3000 , "plane_mode" : 1 , "calibration" : { "sensor_id" : "SENSOR_001" , "offset" : 0.12 } , "timestamp" : "2023-10-01T14:30:00Z"
}
4.2.2 模板加载逻辑
void TemplateManager :: loadTemplate ( const QString & path) { QFile file ( path) ; if ( ! file. open ( QIODevice:: ReadOnly) ) return ; QByteArray encryptedData = file. readAll ( ) ; QByteArray decryptedData = decryptData ( encryptedData, aesKey) ; QJsonDocument doc = QJsonDocument :: fromJson ( decryptedData) ; BalanceTemplate tpl = parseTemplate ( doc) ; emit templateLoaded ( tpl) ;
}
4.2.3 文件关联与点击响应
// FileBrowser.qml
ListView { model: fileModel delegate: FileItem { onClicked: { if (isTemplateFile(filePath)) { TemplateManager.loadTemplate(filePath); StackView.replace("BalancePage.qml", { template: tpl }); } } }
}
4.3 实时显示模块
4.3.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(); }
}
4.3.2 数据表格动态更新
// DataTable.qml
TableView { columnWidthProvider: (column) => 120 model: BalanceDataModel { updateInterval: 100 // 100ms刷新 }
}
五、接口定义与数据流
5.1 服务代理层接口
接口名称 功能 调用方式 loadTemplate()
加载模板文件 Qt信号槽(跨线程) saveMeasurement()
保存测量结果 异步Promise getBatteryStatus()
获取电池状态 直接调用
5.2 跨核通信协议(A7与M4核)
struct SharedData { volatile float phase; volatile float amplitude; pthread_mutex_t lock;
} ;
六、关键数据结构
6.1 模板参数结构体
struct BalanceTemplate { QString name; int planeMode; QMap< QString, QVariant> params; QByteArray toEncryptedJson ( ) const ; static BalanceTemplate fromEncryptedJson ( const QByteArray & data) ;
} ;
6.2 实时数据缓冲区
class RealtimeDataBuffer {
private : QVector< double > buffer; QReadWriteLock lock;
public : void append ( const QVector< double > & data) ; QVector< double > fetchLatest ( int maxSamples) ;
} ;
七、代码框架与实现
7.1 项目目录结构
项目根目录/
├── src/
│ ├── main.cpp # 应用入口
│ ├── Core/
│ │ ├── TemplateManager.cpp # 模板管理逻辑
│ │ └── DataBuffer.cpp # 实时数据缓冲
│ ├── UI/
│ │ ├── MainWindow.qml # 主界面
│ │ ├── BalancePage.qml # 动平衡界面
│ │ └── SplashScreen.qml # 启动动画
├── resources/
│ ├── images/ # 图标资源
│ └── fonts/ # 字体文件
└── CMakeLists.txt # 构建配置
7.2 核心代码实现
7.2.1 主程序入口(main.cpp)
int main ( int argc, char * argv[ ] ) { QApplication app ( argc, argv) ; SharedMemory :: init ( ) ; QQmlApplicationEngine engine; engine. load ( QUrl ( "qrc:/UI/MainWindow.qml" ) ) ; return app. exec ( ) ;
}
7.2.2 导航控制器(NavigationController.h)
class NavigationController : public QObject { Q_OBJECT
public : Q_INVOKABLE void navigateTo ( const QString & page, const QVariantMap & props = { } ) ;
} ;
void NavigationController :: navigateTo ( const QString & page, const QVariantMap & props) { QQmlEngine * engine = QQmlEngine :: contextForObject ( this ) -> engine ( ) ; QQmlComponent component ( engine, QUrl ( page) ) ; QObject * instance = component. createWithInitialProperties ( props) ; qobject_cast < QQuickItem* > ( instance) -> setParentItem ( parentItem) ;
}
八、测试计划
8.1 单元测试用例
测试项 输入 预期输出 模板加载功能 合法.tpl文件 参数解析正确,跳转至测量界面 实时数据显示 模拟10kHz数据流 界面刷新率≥30 FPS 文件关联响应 双击.tpl文件 触发模板加载信号
8.2 自动化测试脚本
def test_template_loading ( qt bot) : main_window = MainWindow( ) qt bot. mouseClick( main_window. file_button, Qt. LeftButton) qt bot. keyClicks( file_dialog, "test.tpl" ) assert main_window. current_page == "BalancePage"
九、附录
9.1 UML类图
@startuml
class MainWindow { +StackView stackView +void enterConfigPage(int mode)
} class TemplateManager { +BalanceTemplate loadTemplate(QString path)
} class BalancePage { -PhaseMeter phaseMeter -DataTable dataTable
} MainWindow --> TemplateManager : uses
MainWindow --> BalancePage : navigates to
@enduml
9.2 参考文档
《Qt 6.5官方文档》 《ISO 1940-1:2018机械振动平衡标准》 《嵌入式Linux系统开发指南》
十、修订记录
版本 日期 修改内容 1.0 2023-10-01 初版发布 1.1 2023-10-05 补充模板加密与导航控制逻辑
说明 :
本方案基于Qt 6.5和STM32MP157平台设计,完整代码需结合硬件驱动层实现。 模板文件加密密钥需通过安全芯片(如STM32 TrustZone)保护。 实时数据流需通过双核共享内存实现低延迟传输。