便携式动平衡仪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(qtbot):
main_window = MainWindow()
qtbot.mouseClick(main_window.file_button, Qt.LeftButton)
qtbot.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)保护。
- 实时数据流需通过双核共享内存实现低延迟传输。