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() 应在一次同步调用内完成。避免持续循环、阻塞等待和无界增长的数据结构;运行时会限制执行时间、步骤和绘制内容规模。绘制属性中的数值需要是有限数字,计算结果应先处理缺测、除零等情况。
脚本错误会显示在仪表错误状态和相应日志中。预览用于验证显示代码;实际仪表的读数取决于已选数据和当前数据源。