便携式动平衡仪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)保护。
- 实时数据流需通过双核共享内存实现低延迟传输。