Neptune 3 UI - Qt 安全渲染器集成

在 Neptune 3 UI 中,Qt 安全渲染器以两种方式包含在内:

  • 常规 UI 部分作为 QML 组件
  • 关键安全 UI 部分作为一个示例应用,neptune3-ui-qsr-cluster

下方的图示说明了这两个集成是如何完成的。

启用 Qt 安全渲染器支持

要在这些 开发环境中使用 Qt 安全渲染器,请按照安装 Qt 安全渲染器中描述的步骤构建和安装 Qt 安全渲染器。

使用 Qt 安全渲染器构建 Neptune 3 UI 完成以下操作

  • 包括 neptune3-ui-qsr-cluster 到构建树中
  • neptune3-ui.pro 文件中启用 Qt 安全布局工具,它将在 BUILD_FOLDER/qsr-safelayout 位置生成布局文件,包括一个 SafeTelltalesPanel.srl 文件,这是 neptune3-ui-qsr-cluster 使用的

注意:如果 qmake 找不到已安装的 qtsaferenderer,则在构建步骤中将显示以下警告信息:"qtsaferenderer 模块不可用:请确保 QtSafeRenderer 已正确安装和配置"

Neptune 向 中间件的客户端提供安全 UI 的值来源:指示器状态、速度等。 neptune3-ui-qsr-cluster 应用连接到相同的远程中间件服务,并利用与 Neptune 3 UI 相同的自自动生成的 QtIVI 接口和机制。 neptune3-ui-qsr-cluster 应用期望在相同的地址上运行这两个服务。默认情况下,它假定 tcp://127.0.0.1 地址,驱动数据模拟服务器端口为 9998,遥远设置服务器端口为 9999。要覆盖这些默认参数,修改应用设置文件以添加地址和端口的值,如下所示。 [lastUrls] 组中的第一个 url 属性用于连接。

[lastUrls]
1\url=tcp://127.0.0.1:9999
2\url=tcp://192.168.0.1:1111
size=2
[ports]
remoteSettingsPort=9999
driveDataPort=9998

这些设置基于 QSettings,公司名称为 "Luxoft Sweden AB",应用程序名称为 "NeptuneCompanionApp";有关定位文件的说明,请参阅QSettings 平台特定说明

为了使 neptune3-ui-qsr-clusterneptune3-ui 应用进行通信,我们使用 TCP 连接。TCP 客户端位于非安全分区,服务器位于安全 UI 部分。TCP 客户端是 Qt 安全渲染器 QML 插件的一部分。Qt 安全渲染器需要设置以下环境变量以进行通信

QT_SAFERENDER_IPADDRESS=127.0.0.1
QT_SAFERENDER_PORT=1111

它们在 neptune3-ui 中设置,使用下表中描述的 am-config-... 相关文件中的公共系统属性

参数名称类型说明
qsrEnabledbool如果设置为 yes,则启用在 Cluster 应用程序内加载 Safe Telltales(《SafeTellatales.qml》)。默认情况下是禁用的。
qsrServerAddress字符串neptune3-ui-qsr-cluster 服务器地址
qsrServerPort字符串neptune3-ui-qsr-cluster 服务器端口

以下是在 {am-config-...} 相关文件中 Qt Safe Renderer 设置的示例

systemProperties:
    public:
        qsrEnabled: yes
        qsrServerAddress: '127.0.0.1'
        qsrServerPort: '1111'

对于 neptune3-ui-qsr-cluster 应用程序,TCP 服务器监听端口在基于 QSettings 的设置文件中设置,公司名称为 "Luxoft Sweden AB",应用程序名称为 "QSRCluster";要找到该文件,请参阅QSettings 平台特定说明。默认端口为 1111

[connection]
listen_port=1111

NUC 目标上的非安全到安全 UI 切换

在 NUC 目标上,您可以通过使用 OnFailure 属性的系统服务监控来在非安全和安全 UI 之间切换。当 neptune3-ui 停止时,systemd 会启动 neptune3-ui-qsr-cluster 应用程序。

以下代码显示了位于 /lib/systemd/system/neptune.serviceNeptune 3 UI 服务文件的 "OnFailure" 部分

[Unit]
Conflicts=neptune-qsr.service
Before=neptune-qsr.service
OnFailure=neptune-qsr.service

位于 /lib/systemd/system/neptune-qsr.serviceSafe UI 服务文件包含

[Service]
ExecStart=/opt/neptune3/neptune3-ui-qsr-cluster
workingDirectory=/opt/neptune3
Environment=QT_QPA_EGLFS_KMS_CONFIG=/etc/kms-qsr.conf
Environment=QSR_SHOW_TEXT_ON_STARTUP=1
Environment=QSR_FILL_BLACK_BACKGROUND=1

相应的 EGLFS 设置 JSON 文件(/etc/kms-qsr.conf)包含

{
    "hwcursor": false,
    "outputs": [
        {
            "name": "DP3",
            "virtualIndex": 0,
            "primary": true
        }
    ]
}

安全 UI 应用程序

neptune3-ui-qsr-cluster 是 Qt Safe Renderer 在 Neptune 3 UI 项目的 "安全 UI 部分" 的示例实现。它基于 Qt Safe Renderer 示例的桌面部分《Telltales:渲染关键安全 UI》(Telltales: Rendering Safety-Critical UI),该示例说明了如何在桌面环境中使用 Qt Safe Renderer 进行开发。

注意:由于该样本依赖于 Qt 类,因此没有按照Misra C++ 2008 或 ISO26262 功能安全标准实现。

本样本介绍了 Qt Safe Renderer 工作的各个方面

  • 加载生成于 QML 文件中的布局,其中包含告警图像、速度、功率和警告文本
  • 通过继承自 Qt Safe Renderer 的 AbstractWindow 和基本的 QWindow 与 Qt Safe Renderer 库交互以渲染到缓冲区
  • 使用 StateManager 控制 UI 元素的状态
  • 通过 心跳消息非安全分区 通信并接收关于 主 UI 即将关闭的通知。我们使用简单的 Qt TCP 服务器(TcpMsgHandler)来完成此操作。
  • 与 Neptune 的 中间件 通信以获取安全 UI 元素状态的值。与 Neptune 的 Neptune 3 UI - Companion App 一样,使用相同的 Qt IVI 自动生成的客户端。

应用程序的工作流程如下

  • BUILD_FOLDER/qsr-safelayout/SafeTelltalesPanel.srl 加载生成的布局
  • 创建窗口并将其连接到 Qt Safe Renderer 的 StateManager
  • 启动 TCP 服务器以处理来自非安全分区的心跳并显示警告;在新心跳中隐藏它们
  • 启动 中间件 客户端以接收安全 UI 元素可见性和文本值的值

在桌面上运行

要在桌面上运行 Qt Safe Renderer,首先启动 中间件 服务:`remotesettings-server` 和 `drivedata-simulation-server`。

注意:如果这些服务在Neptune 3 UI应用程序之前没有启动,则在应用程序关闭后它们将被停止。

然后启动neptune3-ui应用,之后启动neptune3-ui-qsr-cluster应用。透明的Safe UI窗口将显示与Neptune 3 UI集群相同的速度和功率指示器和文字值。在桌面版本中,可以直接在Neptune 3 UI的集群窗口上放置Qt Safe Renderer窗口,以证明指示器在安全和非安全部分具有相同的位置和比例。如果启用了Qt Safe Renderer支持,则集群窗口的位置将从非安全分区发送到安全部分。对于neptune3-ui-qsr-cluster,Neptune 3 UI集群窗口的覆盖默认启用,可以通过修改设置文件中的布尔键来关闭,基于QSettings,公司名为“Luxoft Sweden AB”,应用名为“QSRCluster”。

[gui]
stick_to_cluster=false

此键用于演示整个集群的形态:底部的Neptune 3 UI和顶部的安全元素,就像集群在一个具有硬件分层的实际目标上渲染一样。然而,在桌面版中,没有硬件分层,所以我们手动将一个窗口放置在另一个窗口上方。我们还使该窗口跟随另一个窗口的坐标,以同步它们在屏幕上的位置。

针对目标设备的特定选项

在目标设备上运行neptune3-ui-qsr-cluster应用,例如Intel NUC,可能需要应用程序窗口具有不透明背景。为了使应用程序能够自动填充背景,设置环境变量QSR_FILL_BLACK_BACKGROUND1

neptune3-ui-qsr-cluster应用无法访问存活消息,且在Main UI应用程序停止或崩溃后启动时,您可能需要在启动时显示警告消息、速度值和功率。为了启用此功能,设置环境变量QSR_SHOW_TEXT_ON_STARTUP1

©2019 Luxoft Sweden AB。此处包含的文档贡献的版权属于各自的拥有者。
提供的文档根据自由软件基金会发布的GNU自由文档许可1.3版的条款获得许可。
Qt和相应的标志是芬兰的Qt Company Ltd.和/或其他国家和地区的商标。所有其他商标都是其各自所有者的财产。