$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 } | nullOBD 数据
current.limitnumber数值
current.labelstring文本
current.showUnitboolean开关
current.stylestring选择项