便携式动平衡仪Qt应用层详细设计说明书

news/2025/2/25 3:35:26

便携式动平衡仪Qt应用层详细设计说明书 (DDD)

版本:1.1
日期:2023年10月


一、文档目录

  1. 系统概述
  2. 应用层架构设计
  3. 模块详细设计
  4. 接口定义与数据流
  5. 关键数据结构
  6. 代码框架与实现
  7. 测试计划
  8. 附录

二、系统概述

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 模板文件格式
  • 文件结构(JSON + AES加密):
{
  "version": 1,
  "rpm": 3000,
  "plane_mode": 1,
  "calibration": { "sensor_id": "SENSOR_001", "offset": 0.12 },
  "timestamp": "2023-10-01T14:30:00Z"
}
4.2.2 模板加载逻辑
// TemplateManager.cpp  
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核)
// 共享内存结构(DDR中定义)  
struct SharedData {  
    volatile float phase;      // 当前相位(rad)  
    volatile float amplitude;  // 振幅(mm)  
    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();  

    // 加载QML主界面  
    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 自动化测试脚本
# pytest示例:测试模板加载流程  
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 参考文档
  1. 《Qt 6.5官方文档》
  2. 《ISO 1940-1:2018机械振动平衡标准》
  3. 《嵌入式Linux系统开发指南》

十、修订记录

版本日期修改内容
1.02023-10-01初版发布
1.12023-10-05补充模板加密与导航控制逻辑

说明

  • 本方案基于Qt 6.5和STM32MP157平台设计,完整代码需结合硬件驱动层实现。
  • 模板文件加密密钥需通过安全芯片(如STM32 TrustZone)保护。
  • 实时数据流需通过双核共享内存实现低延迟传输。

http://www.niftyadmin.cn/n/5864951.html

相关文章

本地安装 Grafana Loki

本地安装 Grafana Loki 一、 安装 Loki1. 下载 Loki2. 创建 Loki 配置文件3. 创建 Loki 服务 二、安装 Promtail1. 下载 Promtail2. 创建 Promtail 配置文件3. 创建 Promtail 服务 三、 安装 Grafana四、启动所有服务五、添加loki 数据源1. 添加仪表板2. 日志查询面板 json 参考…

一篇docker从入门到精通

Docker Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙盒机制&#xff0c;相互之间不会有任何接口&#xff08;类似 iP…

Vulhub靶机 Apache Druid(CVE-2021-25646)(渗透测试详解)

一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 1、漏洞范围 在Druid0.20.0及更低版本中 二、访问靶机IP 8888端口 1、点击Load data进入新界面后&#xff0c;再点击local disk按钮。 2、进入新界面后&#xff0c;在标红框的Base directory栏写上…

Open WebUI本地部署教程

文章目录 1、系统环境配置2、源码下载2.1 github源码地址下载 3、环境启动3.1 后端环境3.2 前端环境 4、问题4.1 浏览器跨域问题4.2 all-MiniLM-L6-v2模型文件下载失败问题4.3 单独部署backend启动报错问题 1、系统环境配置 操作系统&#xff1a;windows/linux/macos Python版…

【NLP算法面经】本科双非,头条+腾讯 NLP 详细面经(★附面题整理★)

【NLP算法面经】本科双非&#xff0c;头条腾讯 NLP 详细面经&#xff08;★附面题整理★&#xff09; &#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 自小刺头深草里&#xff0c;而今渐觉出蓬蒿。 NLP Github 项目推荐&#xff1a; 【AI…

工程师 - VSCode的AI编码插件介绍: MarsCode

豆包 MarsCode MarsCode AI: Coding Assistant Code and Innovate Faster with AI 豆包 MarsCode - 编程助手 安装完成并使能后&#xff0c;会在下方状态栏上显示MarsCode AI。 安装完并重启VSCode后&#xff0c;要使用这个插件&#xff0c;需要注册一下账号。然后授权VSCod…

多人协同创作gitea

多人协同创作gitea 在多台设备上协同使用Gitea&#xff0c;主要是通过网络访问Gitea服务器上的仓库来进行代码管理和协作。以下是一些关键步骤和建议&#xff0c;帮助你在多台设备上高效地使用Gitea进行协作&#xff1a; 1. 确保Gitea服务可访问 首先&#xff0c;你需要确保…

JAVA版本游戏进程读写操作

1.导入游戏进程读写Maven依赖 <dependency><groupId>io.github.2lius</groupId><artifactId>MemoryProcess</artifactId><version>0.1</version></dependency> GitHub地址 2.代码操作游戏读写内存 package com.lius.test;impo…