$data · 驾驶数据

$data 按本仪表的输入标识符提供数据:current 是当前输入,history 是当前行程最近 30 秒的输入采样。

可读取的数据

点击编辑器顶部的仪表名称,打开 仪表设置 → 输入绑定。齿轮进入 参数配置,用于定义输入的名称、标识符和类型;返回输入绑定后填写本机数值,或为 OBD 输入选择自己的车辆参数。基础数据由 App 自动提供。

脚本通过 $data.current.<identifier> 访问输入。例如,基础速度输入 speed 使用 $data.current.speed,OBD 输入 coolant 使用 $data.current.coolant。字段名与车辆参数 UUID、设备名称相互独立。更换车辆参数只需重新绑定;修改输入标识符才需要修改代码。

类型 配置与脚本读到的内容
数值 设置默认值及可选上下限;脚本直接读到数字,例如 $data.current.limit。
文本 设置默认文字;脚本直接读到字符串,例如 $data.current.label。
开关 设置默认开关状态;脚本直接读到布尔值,例如 $data.current.showUnit。
选择项 定义可选文字和默认项;脚本读到选中的字符串,例如 $data.current.style。
基础数据 选择速度、G 值、位置或时间等来源;读数结构随来源而定。
OBD 数据 定义预期值类型,再在输入绑定中选择设备及车辆参数;读数为 { value, unit } 或 null。

下面的字段表使用示例标识符,不表示每块仪表自动拥有这些字段。实际接口和类型提示按当前仪表的输入定义生成。

读数结构与空值

基础量值和 OBD 读数通常为 { value, unit };位置、G 值、姿态等基础数据具有各自分量,记录状态为布尔值。数值、文本、开关与选择项直接返回其配置值。

OBD 未绑定或配置不存在时整个输入为 null;绑定存在但暂时缺测时保留 { value: null, unit }。使用 reading?.value == null 检查缺测,保留有效的 0。OBD 的 value 可能为映射文字;类型声明不做运行时转换,调用数字方法前应检查类型。

历史窗口与时间单位

$data.history 是 当前行程最近 30 秒 的已选数据,按从旧到新排列。宿主统一保存已采集的全部数据,再按仪表输入参数按需组装;打开仪表即可读取已有窗口。暂停绘制、跳过渲染或重新创建运行实例不会丢失窗口。结束或切换行程、切换运行模式时重置;没有活动行程时历史窗口为空。

历史最多按 5 Hz 采样,相邻采样至少相隔 200 毫秒,最多保留 151 项。重复采样时间和仅由显示环境变化引起的重绘不会增加采样;数据停止后,宿主仍会按单调时间清除过期采样,无需脚本执行。此上限不限制 current 读取本次最新输入,也不会发起额外的 OBD 查询。

每个采样采用与 current 一致的字段结构,可能包含缺测。修改输入定义或绑定会重新组装窗口;数值、开关、文本与选项等固定参数使用当前配置。数据更新只比较 $data.current 的实际内容来决定是否执行 JS,数值、单位和分组子字段都参与比较;同值的新响应、历史增长或裁剪、内部采集时间及未选来源更新不会单独触发执行。宿主仍持续维护完整窗口,下一次 current 改变时脚本取得最新历史。显式选择的时间戳或已记录时长属于 current,数值变化仍会触发执行。OBD 读数保留采样时的数值、单位与缺测状态,不会用后来的读数回填;基础速度会按当前显示单位转换。elapsed.value 是当前行程内经过的秒数,timestamp.value 是毫秒时间戳,movingTime.value 是以秒计的行驶时长。绘制时间曲线时使用实际时间,并保留缺测造成的断点。

示例:同时显示速度与 OBD 参数

定义两个输入:标识符为 speed 的基础速度输入,以及标识符为 coolant 的 OBD 输入。为后者绑定本机车辆参数。下例通过各自的输入标识符显示读数与单位;重新绑定设备时无需修改示例代码。

function main() {
  const speed = $data.current.speed;
  const parameter = $data.current.coolant;
  return (
    <VStack spacing={8}>
      <Text fontSize={40}>
        {speed?.value == null ? '—' : speed.value.toFixed(0)}
      </Text>
      <Text>{speed?.unit ?? $env.speedUnit}</Text>
      <Text>
        {parameter?.value == null ? '—' : parameter.value.toString()}
      </Text>
      <Text>{parameter?.unit ?? ''}</Text>
    </VStack>
  );
}

更新与数据来源

每次脚本执行使用本次最新输入;实际频率由数据来源、输入变化和处理耗时决定。current 和 history 返回数据副本,修改它们不会改变传感器读数或车辆配置。

基础速度等字段会应用有效的行程数据替换设置。直接读取 OBD 参数则使用该参数自己的读数及单位,查询间隔、车辆响应和其他请求会影响实际更新。数据可用性还受定位、识别状态和设备连接影响;编辑器预览使用独立的模拟输入。

字段

current{ [identifier: string]: number | string | boolean | object | null }

所选数据的最新值

history{ [identifier: string]: number | string | boolean | object | null }[]

最近 30 秒的已选数据,按时间从早到晚

current.speed{ value: number | null; unit: "km/h" | "mph" }

速度

current.gForce{ longitudinal: number | null; lateral: number | null; combined: number | null; unit: string }

G值

current.heading{ direction: number | null; accuracy: number | null; unit: string }

车头朝向

current.location{ latitude: number | null; longitude: number | null; unit: string }

定位

current.vehicleAttitude{ roll: number | null; pitch: number | null; unit: string }

车辆姿态

current.locationAccuracy{ value: number | null; unit: "m" }

定位精度

current.altitude{ value: number | null; unit: "m" }

海拔

current.distance{ value: number | null; unit: "m" }

里程

current.movingTime{ value: number | null; unit: "s" }

行驶时长

current.timestamp{ value: number | null; unit: "ms" }

采集时间

current.elapsed{ value: number | null; unit: "s" }

记录时长

current.recordingboolean

正在记录

current.coolant{ value: number | string | null; unit: string | null } | null

OBD 数据

current.limitnumber

数值

current.labelstring

文本

current.showUnitboolean

开关

current.stylestring

选择项