当前位置: 首页 > article >正文

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


便携式动平衡仪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.kler.cn/a/558604.html

相关文章:

  • uni-app 系统学习,从入门到实战(一)—— 从零开始搭建第一个跨平台应用
  • 谁会是“下一个DeepSeek?”——从技术路线与生态逻辑看AI大模型的未来格局
  • 几道感知机算法(PLA)的例题
  • 数字电子技术基础(二十一)——双极型三极管的开关特性
  • 具备批量卸载、精准搜索等功能的应用工具
  • 愿在线段树中搁浅
  • DataX 抽取 MySQL 数据教程
  • 计算机视觉基础 | 数据增强黑科技——MixUp
  • Kubernetes 中服务注册机制解析:自动化与灵活性的背后
  • 【数据结构】快指针和慢指针
  • k8s部署针对外部服务器的prometheus服务
  • CentOS中shell脚本对多台机器执行下载安装
  • C#初级教程(4)——流程控制:从基础到实践
  • Python中的转义字符
  • Spring注解方式替代原始的applicationContext的Bean配置
  • 【多语言生态篇六】【DeepSeek×Node.js:WebSocket实时服务从入门到“超神“指南(史诗级万字拆解)】
  • 简单易懂,解析Go语言中的Map
  • AI知识架构之RAG
  • 大语言模型(LLM)提示词(Prompt)高阶撰写指南
  • 前端防重复请求终极方案:从Loading地狱到精准拦截的架构升级