main()

仪表脚本的绘制入口。CapDrive 调用 main() 取得本次画面,并负责布局、绘制与后续刷新。

执行过程

每次接受新的输入时,CapDrive 更新本次数据和显示环境,在新的局部作用域执行整个文件,再调用本次定义的 main()。函数同步返回内置 View、View 数组或空内容。

顶层取数与计算也会在每次执行时更新。普通变量每次重新初始化,跨次状态使用 $sessionStorage。

当前输入、输入定义或显示环境变化会触发执行,没有统一固定的频率。完全相同的输入会跳过,处理中只保留最新的待处理输入。历史窗口增长、清理和内部采样时间变化不会单独触发执行;显式定义的时间输入变化仍会触发。动画由绘制端独立执行。

示例:根据当前读数绘制

在仪表设置中选择速度。每次调用都读取最新速度,生成数字和单位;没有可用速度时显示横线。

function main() {
  const speed = $data.current.speed;
  return (
    <VStack spacing={8}>
      <Text fontSize={64} color={$env.foreground}>
        {speed?.value == null ? '—' : Math.round(speed.value)}
      </Text>
      <Text fontSize={16} color={$env.accent}>
        {speed?.unit ?? $env.speedUnit}
      </Text>
    </VStack>
  );
}

跨次调用的状态

普通局部变量只用于本次函数调用。需要在当前行程内保留峰值、计数等状态时,使用 $sessionStorage;它按行程和仪表实例隔离,结束行程或重新加载仪表时会清空。

需要列表时可通过数组 map 生成 View。为会更新或重排的项目提供稳定的 key,让绘制更新和动画继续对应同一个项目。

运行要求与错误

main() 应在一次同步调用内完成。避免持续循环、阻塞等待和无界增长的数据结构;运行时会限制执行时间、步骤和绘制内容规模。绘制属性中的数值需要是有限数字,计算结果应先处理缺测、除零等情况。

脚本错误会显示在仪表错误状态和相应日志中。预览用于验证显示代码;实际仪表的读数取决于已选数据和当前数据源。