diff --git a/.gitignore b/.gitignore index de151f0..fdcb64e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,13 @@ tmp/*.log .codex_tmp/ firmware/t2g/Seat_Controller_demo/Tests/manual_hil/logs/ firmware/t2g/Seat_Controller_demo/Tests/manual_hil/seat_function_runtime/ +artifacts/hil/*_server_*.log +firmware/t2g/Seat_Controller_demo/IAR/settings/ +firmware/t2g/Seat_Controller_demo/IAR/Seat_Controller_demo.eww +firmware/t2g/Seat_Controller_demo/IAR/rev_d/.Seat_Controller_demo_build_cache +firmware/t2g/Seat_Controller_demo/IAR/rev_d/.ninja_deps +firmware/t2g/Seat_Controller_demo/IAR/rev_d/.ninja_log +firmware/t2g/Seat_Controller_demo/IAR/rev_d/BrowseInfo/ +firmware/t2g/Seat_Controller_demo/IAR/rev_d/List/ +firmware/t2g/Seat_Controller_demo/IAR/rev_d/Obj/ firmware/t2g/tviibh8m/src/examples/crypto/ClientRunsOnCM7_0/RSA/key_data/private_key*.pem diff --git a/README.md b/README.md index 00759b3..b405840 100755 --- a/README.md +++ b/README.md @@ -77,6 +77,8 @@ artifacts/runs// ## 可执行领域 +座椅与空调等车身设备使用同一 ZLG CAN 盒双通道联动时,参见 [T2G 座椅与车身双通道 CAN 联动](docs/workflows/t2g-cabin-dual-channel-can.md)。 + 当前已接入四个相互隔离的可执行领域: - 座椅:所有热管理、位置移动和姿态预设能力仅面向副驾;未指定座位时默认副驾,显式主驾请求拒绝执行。 @@ -134,4 +136,4 @@ PYTHONPATH=src python -m cognitive_agent.auth generate-secret 完整能力边界、矩阵解释和验收用例见 [座椅阶段一交付](docs/workflows/seat-stage1-delivery.md)。 -已验证的 T2G 加热、通风和四电机能力已完整纳入 `firmware/t2g`,包括 IAR 工程及仓库内 `common/tviibh8m` 构建依赖。M0/M1/M2/M3 分别对应水平、坐盆、靠背和腿托;真实硬件请求先被动核对新版周期反馈与 480/374/917/647 Hall 量程,未检测到匹配固件时默认通过 IAR C-SPY 自动烧写并复验,再发送 CAN 并等待真实回读。当前前端、能力注册、编译、安全门禁和状态反馈只允许副驾 `passenger/front_right`;固件中的 `Driver_Seat_*` 仅是板端既有协议字段名。构建、ZLG bridge、接线、安全门禁、前端测试集和已知量程归零见 [T2G 座椅真实硬件台架接入](docs/workflows/t2g-seat-hardware-bench.md) 与 [前端能力测试集](docs/testing/t2g-seat-frontend-test-suite.md)。 +已验证的 T2G 加热、通风、四电机和原生动态模式能力已完整纳入 `firmware/t2g`,包括 IAR 工程及仓库内 `common/tviibh8m` 构建依赖。M0/M1/M2/M3 分别对应水平、坐盆、靠背和腿托;revision 13通过`0x306`反馈带斜向耦合补偿的木马模式与四轴全程联动动态摇篮的阶段/循环状态。木马模式围绕中间姿态在`[270,250,460,400]`和`[370,130,540,460]`之间连续俯仰往复:坐盆峰峰行程120 Hall、约18 mm垂直分量,水平峰峰行程100 Hall、90%巡航Duty,用额外水平行程抵消坐盆斜向运动约16.4 mm的反向水平分量;参数集中在`seat_dynamic_mode_config.h`并由N7长期库镜像。动态模式收到一次启动命令后由ECU连续循环,收到停止/全停命令或累计运行10分钟时停止;目标到位式阶段在底层堵转/无运动保护继续生效的前提下使用独立保护窗口。真实硬件请求先被动核对新版周期反馈与 480/374/917/647 Hall 量程,未检测到匹配固件时默认通过 IAR C-SPY 自动烧写并复验,再发送 CAN 并等待真实回读。当前前端、能力注册、编译、安全门禁和状态反馈只允许副驾 `passenger/front_right`;固件中的 `Driver_Seat_*` 仅是板端既有协议字段名。构建、ZLG bridge、接线、安全门禁、前端测试集和已知量程归零见 [T2G 座椅真实硬件台架接入](docs/workflows/t2g-seat-hardware-bench.md) 与 [前端能力测试集](docs/testing/t2g-seat-frontend-test-suite.md)。 diff --git a/apps/web-console/app.js b/apps/web-console/app.js index 5d62da1..01b8085 100755 --- a/apps/web-console/app.js +++ b/apps/web-console/app.js @@ -2641,7 +2641,7 @@ function updateSeatFeedbackModeLabel() { } function selectExecutionMode(mode) { - if (mode === "hardware" && !state.runtime?.hardware?.configured) return; + if (mode === "hardware" && !(state.runtime?.hardware?.configured && state.runtime?.vehicle_can?.configured)) return; if (mode === "simulated_hardware" && !state.runtime?.simulated_hardware?.enabled) return; state.executionMode = mode; $$('[data-execution-mode]').forEach((button) => { @@ -2663,7 +2663,7 @@ function selectExecutionMode(mode) { ? "真实台架安全门禁" : simulatedHardware ? "模拟台架隔离边界" : "虚拟执行边界"; $("#safetyText").textContent = hardware - ? "副驾座椅映射到统一实体执行器;绝对位置会实时检查板端标定,小幅相对移动可走受限定时/Hall 回读,异常会尝试 STOP_ALL。" + ? "同一 CAN 盒由单进程持有:通道 0 控制副驾座椅并校验板端反馈,通道 1 以 ISO CAN FD 500 kbit/s / 2 Mbit/s 控制空调等车身设备并校验状态帧。" : simulatedHardware ? "故障只注入执行报告;物理 CAN、ZLG 适配器和 IAR 固件路径保持关闭。" : "四域 CAN 均为 dry-run,真实发送被强制关闭。"; @@ -2807,6 +2807,11 @@ function modeChipLabel(mode) { : name; } +function modeSecondsLabel(durationMs) { + const seconds = Number(durationMs) / 1000; + return Number.isInteger(seconds) ? String(seconds) : seconds.toFixed(1); +} + function populateModeChips() { const group = $(".mode-chips"); if (!group) return; @@ -2825,7 +2830,41 @@ function populateModeChips() { } button.dataset.modeProfileId = mode.id; button.dataset.modeCommand = `进入${mode.name}`; - button.title = mode.description || mode.name; + const timeline = mode.timeline; + let cycleBadge = $(".mode-cycle-badge", button); + if (["infinite", "until_stopped_or_timeout"].includes(timeline?.repeat)) { + if (!cycleBadge) { + cycleBadge = document.createElement("small"); + cycleBadge.className = "mode-cycle-badge"; + button.append(cycleBadge); + } + const runtimeMinutes = Number(timeline.max_runtime_ms || 0) / 60000; + const runtimeLabel = Number.isInteger(runtimeMinutes) + ? String(runtimeMinutes) + : runtimeMinutes.toFixed(1); + const cycleDurationMs = Number(timeline.cycle_duration_ms || 0); + const cycleLabel = cycleDurationMs > 0 + ? `${modeSecondsLabel(cycleDurationMs)}s循环` + : "目标到位循环"; + cycleBadge.textContent = runtimeMinutes > 0 + ? `${cycleLabel} · 最长${runtimeLabel}min` + : cycleLabel; + button.dataset.modeBehavior = "cyclic"; + } else if (cycleBadge) { + cycleBadge.remove(); + } + const phaseSummary = Array.isArray(timeline?.phases) + ? timeline.phases.map((phase) => { + if (Number(phase.duration_ms || 0) > 0) { + return `${phase.name} ${modeSecondsLabel(phase.duration_ms)}s`; + } + const timeout = Number(phase.timeout_ms || 0); + return timeout > 0 + ? `${phase.name} 目标到位(保护上限${modeSecondsLabel(timeout)}s)` + : `${phase.name} 目标到位`; + }).join(" → ") + : ""; + button.title = [mode.description || mode.name, phaseSummary].filter(Boolean).join("\n"); }); refreshIcons(); } @@ -2864,6 +2903,8 @@ async function loadRuntime() { populateVehicleSelector(); populateModeChips(); const hardware = state.runtime.hardware || {}; + const vehicleCan = state.runtime.vehicle_can || {}; + const linkedHardwareReady = Boolean(hardware.configured && vehicleCan.configured); const badge = $("#modelBadge"); const gptButton = $('[data-provider="openai"]'); if (state.runtime.openai_available) { @@ -2882,7 +2923,7 @@ async function loadRuntime() { } $("#matrixCount").textContent = `${state.runtime.matrix.messages} / ${state.runtime.matrix.signals}`; const hardwareButton = $("#hardwareMode"); - hardwareButton.disabled = !hardware.configured; + hardwareButton.disabled = !linkedHardwareReady; const simulation = state.runtime.simulated_hardware || {}; $("#simulationMode").disabled = !simulation.enabled; $("#simulationMode").title = simulation.enabled @@ -2897,23 +2938,23 @@ async function loadRuntime() { const accessText = hardware.access_policy === "local_approval_idle_lease" ? ` · 本地审批 · 空闲 ${hardware.access_inactivity_timeout_seconds || 180} 秒自动停止` : ""; - $("#hardwareNote").textContent = hardware.configured - ? `${hardware.backend} · ${hardware.bitrate / 1000} kbit/s · ${profileText} · ${flashText} · ${approvalText}${accessText}${concurrencyText}` - : `真实执行已锁定:${profileText};请完成服务端启用、适配器、固件镜像${hardware.approval_required ? "和令牌" : ""}配置`; - $("#hardwareAliasNote").textContent = "副驾座椅 → t2g_primary_seat(统一电机、加热和通风执行器)"; + $("#hardwareNote").textContent = linkedHardwareReady + ? `${hardware.backend} · CH${hardware.channel} 座椅 ${hardware.bitrate / 1000} kbit/s · CH${vehicleCan.channel} 车身 CAN FD ${vehicleCan.arbitration.bitrate / 1000}k/${vehicleCan.data.bitrate / 1000000}M · ${profileText} · ${flashText} · ${approvalText}${accessText}${concurrencyText}` + : `联动真实执行已锁定:${profileText};请完成座椅固件、双通道 ZLG 适配器、车身 CAN FD${hardware.approval_required ? "和令牌" : ""}配置`; + $("#hardwareAliasNote").textContent = "CH0 → 副驾座椅控制器 · CH1 → 空调/车窗/门锁/灯光/遮阳帘(ISO CAN FD)"; $("#autoFlashNote").textContent = hardware.auto_flash_enabled ? "未检测到匹配固件时,将在发送座椅控制帧前通过 IAR C-SPY 自动烧录并重新验证。" : "仅接受周期反馈与四轴量程签名匹配的统一固件;需要自动烧录时请启用服务端开关。"; - $("#hardwareBadge").className = `status-badge ${hardware.configured ? "" : "danger"}`.trim(); - $("#hardwareBadge").innerHTML = hardware.configured - ? '硬件已配置' + $("#hardwareBadge").className = `status-badge ${linkedHardwareReady ? "" : "danger"}`.trim(); + $("#hardwareBadge").innerHTML = linkedHardwareReady + ? '双通道已配置' : '硬件锁定'; - $("#hardwareCoverage").textContent = hardware.configured - ? `可选 · ${approvalText}${accessText}${concurrencyText}` + $("#hardwareCoverage").textContent = linkedHardwareReady + ? `CH0 座椅 + CH${vehicleCan.channel} 车身 · ${approvalText}${accessText}${concurrencyText}` : "已阻断"; - $("#hardwareCoverage").className = hardware.configured ? "available" : "blocked"; + $("#hardwareCoverage").className = linkedHardwareReady ? "available" : "blocked"; const modeAvailable = state.executionMode === "hardware" - ? hardware.configured + ? linkedHardwareReady : state.executionMode === "simulated_hardware" ? simulation.enabled : true; @@ -3136,6 +3177,20 @@ function mergeSeatActuatorState(previousState, patchState) { mergedSeat.position = mergedPosition; return; } + if (feature === "dynamic_mode") { + const item = $(`.seat-card[data-seat="${seat}"] [data-dynamic-mode]`); + if (!item) return; + const running = value.state === "running"; + item.classList.toggle("running", running); + const runtimeMinutes = Number(value.max_runtime_ms || 600000) / 60000; + const runtimeLabel = Number.isInteger(runtimeMinutes) + ? String(runtimeMinutes) + : runtimeMinutes.toFixed(1); + $("b", item).textContent = running + ? `${value.name} · 循环中 · 最长${runtimeLabel}分钟` + : "未运行"; + return; + } mergedSeat[feature] = value && typeof value === "object" && !Array.isArray(value) ? { ...(previousSeat[feature] || {}), ...value } : value; @@ -3317,6 +3372,10 @@ const CONFIG_DOMAIN_META = { climate: { label: "空调", icon: "fan", className: "climate" }, ambient_light: { label: "氛围灯", icon: "lamp-ceiling", className: "ambient" }, roof: { label: "智能天幕", icon: "panels-top-left", className: "roof" }, + door: { label: "车门锁", icon: "door-open", className: "generic" }, + window: { label: "车窗", icon: "panels-top-left", className: "generic" }, + outlet: { label: "电动风口", icon: "wind", className: "climate" }, + interior_light: { label: "车内灯", icon: "lightbulb", className: "ambient" }, }; const CONFIG_CAPABILITY_LABELS = { @@ -3328,6 +3387,8 @@ const CONFIG_CAPABILITY_LABELS = { "seat.set_backrest_recline": "调节靠背角度", "seat.set_legrest_height": "调节腿托角度", "seat.set_legrest_extension": "调节腿托伸缩", + "seat.start_dynamic_mode": "启动动态座椅模式", + "seat.stop_dynamic_mode": "停止动态座椅模式", "climate.set_temperature": "设置空调温度", "climate.set_fan_level": "设置空调风量", "climate.set_power": "设置空调电源", @@ -3335,6 +3396,15 @@ const CONFIG_CAPABILITY_LABELS = { "climate.set_cycle_mode": "设置内外循环", "climate.set_outlet_mode": "设置出风模式", "climate.set_front_defrost": "设置前风挡除霜", + "climate.set_control_mode": "设置空调控制模式", + "door.set_rear_lock": "设置后排门锁", + "window.set_motion": "控制车窗动作", + "window.set_position": "设置车窗开度", + "outlet.set_position_percent": "设置电动风口位置", + "outlet.set_calibrated_position": "设置电动风口标定位置", + "interior_light.set_indoor_power": "设置室内灯", + "interior_light.set_wall_power": "设置壁灯", + "interior_light.set_reading_power": "设置阅读灯", "ambient_light.set_power": "设置氛围灯电源", "ambient_light.set_illumination": "设置氛围灯颜色与亮度", "ambient_light.set_color": "设置氛围灯颜色", @@ -3342,6 +3412,7 @@ const CONFIG_CAPABILITY_LABELS = { "ambient_light.set_mode": "设置氛围灯模式", "roof.set_transmittance": "设置天幕透光率", "roof.set_shade_position": "设置遮阳帘位置", + "roof.set_shade_motion": "控制遮阳帘动作", "roof.set_automatic_dimming": "设置自动调光", }; @@ -3361,6 +3432,7 @@ const CONFIG_PARAMETER_LABELS = { cycle_mode: "循环模式", outlet_mode: "出风模式", mode: "工作模式", + mode_id: "固件模式编号", }; function makeConfigElement(tagName, className, textValue) { @@ -3427,8 +3499,13 @@ function renderConfigCards(result) { const container = $("#configCards"); container.replaceChildren(); const entries = configEntries(result); - const operations = entries.flatMap(([domain, config]) => ( - (config?.spec?.operations || []).map((operation) => ({ domain, config, operation })) + const operations = entries.flatMap(([configKey, config]) => ( + (config?.spec?.operations || []).map((operation) => ({ + configKey, + domain: config?.spec?.domain || configKey, + config, + operation, + })) )); if (!operations.length) { const empty = makeConfigElement("div", "config-empty"); @@ -3457,7 +3534,7 @@ function renderConfigCards(result) { sceneSummary.append(sceneCopy, sceneStats); container.append(sceneSummary); - operations.forEach(({ domain, config, operation }, index) => { + operations.forEach(({ configKey, domain, config, operation }, index) => { const meta = CONFIG_DOMAIN_META[domain] || { label: domain, icon: "box", className: "generic" }; const card = makeConfigElement("article", `config-card config-${meta.className}`); const header = makeConfigElement("header", "config-card-header"); @@ -3499,7 +3576,7 @@ function renderConfigCards(result) { }); parametersBlock.append(parameterGrid); - const plan = planForDomain(result, domain); + const plan = planForDomain(result, configKey); const allCommands = plan?.spec?.commands || []; const matchedCommands = allCommands.filter((command) => !command.operation_ref || command.operation_ref === operation.id); const command = matchedCommands[0] || null; @@ -3528,10 +3605,16 @@ function renderConfigCards(result) { hardwareBlock.append(signalList); const footer = makeConfigElement("footer", "config-card-footer"); + const executionScope = config.metadata?.labels?.execution_scope; + const executionScopeLabel = result.execution_mode === "hardware" && domain === "seat" + ? "座椅 CAN · CH0" + : executionScope === "vehicle_can_channel_1" + ? "车身 CAN · CH1" + : executionScope === "virtual_only" ? "仅虚拟执行" : "已通过配置校验"; footer.append( makeConfigElement("span", "", `超时 ${operation.timeout_ms ?? "--"} ms`), makeConfigElement("span", "", operation.failure_policy === "continue" ? "失败后继续" : "失败即中止"), - makeConfigElement("span", "", config.metadata?.labels?.execution_scope === "virtual_only" ? "仅虚拟执行" : "已通过配置校验"), + makeConfigElement("span", "", executionScopeLabel), ); card.append(header, objectBlock, parametersBlock, hardwareBlock, footer); @@ -3605,7 +3688,8 @@ function renderExecution(result) { return; } const reportSucceeded = report.spec.status === "succeeded"; - summary.className = `execution-summary ${reportSucceeded ? "succeeded" : "failed"}`; + const partiallySucceeded = result.status === "partially_succeeded"; + summary.className = `execution-summary ${reportSucceeded ? "succeeded" : partiallySucceeded ? "partial" : "failed"}`; const presetSave = Boolean(result.preset_config); const modeSave = Boolean(result.mode_profile); const simulatedHil = report.metadata?.labels?.seat_feedback === "simulated_hardware"; @@ -3614,6 +3698,10 @@ function renderExecution(result) { const motionCount = report.spec.results.filter((item) => item.telemetry?.motion_axis).length; const firmwareResult = report.spec.results.find((item) => item.telemetry?.firmware_verified); const operationResults = report.spec.results.filter((item) => item.ref !== "seat-controller-firmware"); + const succeededOperations = operationResults.filter((item) => item.status === "succeeded"); + const failedOperations = operationResults.filter((item) => item.status === "failed"); + const succeededDomains = [...new Set(succeededOperations.map((item) => item.domain))]; + const failedDomains = [...new Set(failedOperations.map((item) => item.domain))]; let executionDetail = modeSave ? `长期模式 ${result.mode_profile.name} 已写入配置库,未生成 CAN 命令` : presetSave @@ -3623,13 +3711,16 @@ function renderExecution(result) { : physical ? `${executedDomains.join(" / ")} 已下发真实 CAN,并以 IAR 固件实际反馈确认 ${operationResults.filter((item) => item.status === "succeeded").length} 个步骤` : `${executedDomains.join(" / ")} 共 ${report.spec.results.length} 个操作已完成 CAN 编码与虚拟执行`; + if (partiallySucceeded) { + executionDetail = `部分执行完成:${succeededDomains.join(" / ")} 成功 ${succeededOperations.length} 项;${failedDomains.join(" / ")} 未完成 ${failedOperations.length} 项,失败设备未阻断其他设备`; + } if (motionCount) executionDetail += `,含 ${motionCount} 个座椅位置电机反馈`; if (firmwareResult?.telemetry?.programmed_this_request) executionDetail += ";本次已自动烧录并校验统一固件"; else if (firmwareResult) executionDetail += ";板上统一固件协议签名已校验"; - if (result.status === "partially_succeeded") { + if (result.deferred_requests?.length) { executionDetail += ";未接入域请求已保留为 deferred request"; } - if (!reportSucceeded) { + if (!reportSucceeded && !partiallySucceeded) { const failure = report.spec.results.find((item) => item.status === "failed"); const failureTelemetry = failure?.telemetry || {}; executionDetail = simulatedHil @@ -3655,13 +3746,18 @@ function renderExecution(result) { : presetSave ? "姿态预设已保存" : simulatedHil ? "模拟台架执行成功" : physical ? "真实台架执行成功" : "虚拟执行成功" - : simulatedHil ? "模拟故障已触发" : physical ? "真实台架执行失败" : "虚拟执行失败"; - summary.innerHTML = `
${executionTitle}${executionDetail}
`; + : partiallySucceeded ? (physical ? "真实台架部分执行成功" : "部分执行成功") + : simulatedHil ? "模拟故障已触发" : physical ? "真实台架执行失败" : "虚拟执行失败"; + const executionIcon = reportSucceeded + ? ((presetSave || modeSave) ? "bookmark-check" : "circle-check-big") + : partiallySucceeded ? "circle-alert" : "circle-x"; + summary.innerHTML = `
${executionTitle}${executionDetail}
`; $("#resultNavMeta").textContent = reportSucceeded ? `${report.spec.results.length} 项完成 · ${simulatedHil ? "SIM-HIL" : physical ? "HIL" : "DRY-RUN"}` - : "执行失败 · 查看回读"; - $("#resultPanelState").textContent = reportSucceeded ? "SUCCEEDED" : "FAILED"; - $("#resultPanelState").className = `workspace-panel-state ${reportSucceeded ? "succeeded" : "failed"}`; + : partiallySucceeded ? `${succeededOperations.length} 项成功 / ${failedOperations.length} 项失败 · 查看明细` + : "执行失败 · 查看回读"; + $("#resultPanelState").textContent = reportSucceeded ? "SUCCEEDED" : partiallySucceeded ? "PARTIAL" : "FAILED"; + $("#resultPanelState").className = `workspace-panel-state ${reportSucceeded ? "succeeded" : partiallySucceeded ? "partial" : "failed"}`; report.spec.results.forEach((item) => { const row = document.createElement("div"); row.className = "result-item"; @@ -3706,7 +3802,8 @@ function renderResult(result) { } else if (result.function_configs?.seat) { state.seatFeedbackSource = "simulated"; } - const executionSucceeded = ["succeeded", "partially_succeeded"].includes(result.status); + const partiallySucceeded = result.status === "partially_succeeded"; + const executionSucceeded = result.status === "succeeded" || partiallySucceeded; const domains = Object.keys(result.function_configs || {}); const domainLabels = { seat: "座椅", @@ -3714,7 +3811,9 @@ function renderResult(result) { roof: "天幕", ambient_light: "氛围灯", }; - $("#resultTitle").textContent = executionSucceeded + $("#resultTitle").textContent = partiallySucceeded + ? `${domains.length} 域场景部分完成` + : executionSucceeded ? result.mode_profile ? "长期模式配置已保存" : result.preset_config @@ -3727,7 +3826,7 @@ function renderResult(result) { $("#requestMeta").textContent = `${result.request_id} / context:${conversationLabel} / turn:${result.conversation_turn} / ${result.provider_used || result.provider_requested}`; $("#requestMeta").textContent += ` / ${result.execution_report?.spec?.mode || result.execution_mode || "dry_run"}`; setRunStatus( - executionSucceeded ? "succeeded" : "failed", + partiallySucceeded ? "partial" : executionSucceeded ? "succeeded" : "failed", result.status.toUpperCase(), ); renderPipeline(result.trace_events || []); @@ -3818,7 +3917,9 @@ async function submitRequest(event) { const completed = ["succeeded", "partially_succeeded"].includes(payload.status); const simulated = payload.execution_report?.metadata?.labels?.seat_feedback === "simulated_hardware"; showToast(completed - ? (simulated + ? (payload.status === "partially_succeeded" + ? "已执行可用设备;部分设备未完成,详见执行结果" + : simulated ? "模拟台架执行完成" : payload.execution_report?.spec?.mode === "hil" ? "真实台架执行与反馈确认已完成" diff --git a/apps/web-console/index.html b/apps/web-console/index.html index 894be1b..d7d45fd 100755 --- a/apps/web-console/index.html +++ b/apps/web-console/index.html @@ -9,13 +9,13 @@ 智舱随行 · 一句话与手势控制 - + - + @@ -155,6 +155,9 @@
示例请求 + @@ -378,6 +381,9 @@
副驾front_right
+
+ 动态模式未运行 +
通风 -- 加热 -- diff --git a/apps/web-console/service-worker.js b/apps/web-console/service-worker.js index 73bb291..8ea90f1 100644 --- a/apps/web-console/service-worker.js +++ b/apps/web-console/service-worker.js @@ -1,12 +1,12 @@ -const CACHE_VERSION = "cognitive-agent-pad-v9"; +const CACHE_VERSION = "cognitive-agent-pad-v13"; const SHELL_CACHE = `${CACHE_VERSION}-shell`; const RUNTIME_CACHE = `${CACHE_VERSION}-runtime`; const APP_SHELL = [ "/", "/index.html", - "/styles.css?v=android-pad-2", + "/styles.css?v=android-pad-3", "/network.js?v=android-pad-1", - "/app.js?v=seat-hil-9", + "/app.js?v=seat-hil-13", "/gesture-control.js?v=android-pad-1", "/pwa.js?v=android-pad-1", "/manifest.webmanifest", diff --git a/apps/web-console/styles.css b/apps/web-console/styles.css index 8b056dd..a8bbf52 100755 --- a/apps/web-console/styles.css +++ b/apps/web-console/styles.css @@ -1325,6 +1325,11 @@ textarea:focus { background: var(--teal-soft); } +.run-status.partial { + color: var(--amber); + background: var(--amber-soft); +} + .run-status.failed { color: var(--red); background: var(--red-soft); @@ -2733,6 +2738,11 @@ pre { border-left-color: var(--teal); } +.execution-summary.partial { + background: var(--amber-soft); + border-left-color: var(--amber); +} + .execution-summary.failed { background: var(--red-soft); border-left-color: var(--red); @@ -3892,6 +3902,11 @@ pre { background: var(--teal-soft); } +.workspace-panel-state.partial { + color: var(--amber); + background: var(--amber-soft); +} + .workspace-panel-state.failed { color: var(--red); background: var(--red-soft); @@ -4357,6 +4372,44 @@ pre { } } +.mode-cycle-badge { + margin-left: 2px; + padding: 2px 6px; + border-radius: 999px; + background: rgba(89, 214, 255, 0.12); + color: #8be3ff; + font-size: 10px; + letter-spacing: 0.02em; +} + +.dynamic-mode-state { + display: flex; + align-items: center; + gap: 8px; + margin: 10px 0; + padding: 9px 11px; + border: 1px solid rgba(126, 160, 194, 0.2); + border-radius: 10px; + color: #90a7bc; + background: rgba(13, 27, 41, 0.55); +} + +.dynamic-mode-state b { + margin-left: auto; + color: #b9cad8; + font-size: 12px; +} + +.dynamic-mode-state.running { + border-color: rgba(89, 214, 255, 0.48); + color: #8be3ff; + box-shadow: inset 0 0 20px rgba(89, 214, 255, 0.06); +} + +.dynamic-mode-state.running b { + color: #e0f8ff; +} + .hardware-access-field { padding: 12px; border: 1px solid rgba(38, 102, 159, 0.24); diff --git a/artifacts/hil/cabin_dual_channel_hil_20260804.json b/artifacts/hil/cabin_dual_channel_hil_20260804.json new file mode 100644 index 0000000..9a31fc5 --- /dev/null +++ b/artifacts/hil/cabin_dual_channel_hil_20260804.json @@ -0,0 +1,87 @@ +{ + "schema_version": "1.0.0", + "validated_at": "2026-08-04T09:55:52+08:00", + "platform": "t2g_cabin_bench", + "adapter": { + "model": "USBCANFD-200U", + "device_type": 41, + "device_index": 0, + "driver_self_test": { + "passed": true, + "pointer_bits": 32, + "missing_exports": [], + "classic_frame_size": 16, + "can_fd_frame_size": 72, + "can_fd_tx_size": 76, + "can_fd_rx_size": 80 + } + }, + "channels": { + "seat_can": { + "channel": 0, + "format": "classic_can_11_bit", + "bitrate": 500000, + "diagnostic_self_reception": { + "frame_id": "0x7AA", + "payload_hex": "43 48 30 53 45 41 54 30", + "passed": true + }, + "external_passive_observation_seconds": 6, + "external_frames_observed": 0, + "physical_feedback_verified": false + }, + "body_can": { + "channel": 1, + "format": "iso_can_fd_11_bit", + "arbitration_bitrate": 500000, + "data_bitrate": 2000000, + "bitrate_switch": true, + "diagnostic_self_reception": { + "frame_id": "0x7AA", + "payload_hex": "43 48 31 2D 42 4F 44 59 2D 43 41 4E 46 44 21 21", + "payload_size": 16, + "passed": true + }, + "external_passive_observation_seconds": 5, + "external_frames_observed": 0, + "physical_feedback_verified": false + } + }, + "linked_request": { + "utterance": "关闭副驾座椅通风,同时关闭空调", + "dry_run": { + "status": "succeeded", + "function_configs": ["seat", "native_climate"], + "command_plans": ["seat", "native_climate"] + }, + "hardware_attempts": [ + { + "request_id": "req-20260804015505-713de5", + "status": "execution_failed", + "body_can": "0x1DE transmit rejected; channel_error=0x00000004", + "seat_can": "passive firmware signature not observed within 1200 ms; no seat control frame sent" + }, + { + "request_id": "req-20260804015552-674fb4", + "status": "execution_failed", + "body_can": "0x1DE transmit rejected; channel_error=0x00000000", + "seat_can": "passive firmware signature not observed within 3500 ms; no seat control frame sent" + } + ] + }, + "verdict": { + "adapter_dual_channel_transport": "passed", + "classic_can_transport": "passed", + "iso_can_fd_brs_transport": "passed", + "one_sentence_compilation_and_routing": "passed", + "seat_ecu_closed_loop": "not_verified_no_external_frames", + "body_ecu_closed_loop": "not_verified_no_bus_ack_or_0x404_feedback", + "overall_hardware_requirement": "blocked_by_external_bus_connectivity_or_power" + }, + "safety_cleanup": { + "seat_control_acknowledged": false, + "body_control_acknowledged": false, + "actuator_state_changed_by_verified_command": false, + "zcanpro_restarted": true + } +} diff --git a/artifacts/hil/dynamic_cradle_rev10_continuous_cruise_20260804.json b/artifacts/hil/dynamic_cradle_rev10_continuous_cruise_20260804.json new file mode 100644 index 0000000..70ffdb8 --- /dev/null +++ b/artifacts/hil/dynamic_cradle_rev10_continuous_cruise_20260804.json @@ -0,0 +1,63 @@ +{ + "validated_at": "2026-08-04", + "firmware_revision": 10, + "firmware_image_sha256": "85f9d67ff1efb36c37f38bb7584dffdbb6ecbee33bfc70ab491bad0d57da63b2", + "change": "remove delayed M1 clearance/catch-up and keep all four axes moving from the phase start", + "max_hall": [499, 374, 917, 647], + "known_range_home": { + "hall_before": [379, 255, 417, 416], + "hall_after": [0, 0, 0, 0], + "all_complete_ok": true, + "all_position_valid": true + }, + "step_1_to_step_2": { + "start_hall": [391, 140, 406, 405], + "target_hall": [246, 281, 701, 494], + "observed_hall": [246, 281, 701, 494], + "four_axis_start_spread_s": 0.070, + "four_axis_arrival_spread_s": 0.342, + "cruise_checkpoint": { + "elapsed_s": 3.090, + "hall": [354, 202, 510, 468], + "normalized_progress": { + "longitudinal": 0.255, + "cushion_tilt": 0.440, + "backrest_recline": 0.353, + "legrest_height": 0.708 + } + }, + "result": "PASS" + }, + "step_2_to_step_3": { + "start_hall": [246, 281, 701, 494], + "target_hall": [391, 140, 405, 404], + "observed_hall": [391, 140, 405, 404], + "four_axis_start_spread_s": 0.050, + "four_axis_arrival_spread_s": 0.339, + "cruise_checkpoint": { + "elapsed_s": 2.591, + "hall": [283, 226, 616, 435], + "normalized_progress": { + "longitudinal": 0.255, + "cushion_tilt": 0.390, + "backrest_recline": 0.287, + "legrest_height": 0.656 + } + }, + "result": "PASS" + }, + "continuous_rollover": { + "next_cycle_all_four_axes_active": true, + "next_cycle_start_spread_s": 0.051, + "result": "PASS" + }, + "stop_verification": { + "ack": 1, + "reject": 0, + "final_0x306": "00 00 00 00 00 00 00 00", + "active_mask": 0, + "fault_mask": 0, + "result": "PASS" + }, + "result": "PASS" +} diff --git a/artifacts/hil/dynamic_cradle_rev9_20260804.json b/artifacts/hil/dynamic_cradle_rev9_20260804.json new file mode 100644 index 0000000..5c82c3c --- /dev/null +++ b/artifacts/hil/dynamic_cradle_rev9_20260804.json @@ -0,0 +1,88 @@ +{ + "validated_at": "2026-08-04", + "firmware_revision": 9, + "firmware_image_sha256": "216f3f6b2d7c441f2050e99c2b9d54153a69b46466235232dec1b7ab7644b7c4", + "mode": "dynamic_cradle", + "coordinate_precondition": { + "motor": 1, + "operation": "HOME_KNOWN_RANGE", + "ack": 1, + "reject": 0, + "hall_before": 169, + "hall_after": 0, + "max_hall_preserved": 374, + "near": true, + "position_valid": true, + "result": "PASS" + }, + "full_cycle": { + "entry_step_1": { + "target_hall": [391, 140, 405, 404], + "observed_hall": [392, 141, 405, 403] + }, + "step_1_to_step_2": { + "target_hall": [246, 281, 701, 494], + "observed_hall": [246, 281, 701, 494], + "duration_s": 17.329, + "four_axis_start_spread_s": 0.077, + "four_axis_arrival_spread_s": 0.338, + "result": "PASS" + }, + "step_2_to_step_3": { + "target_hall": [391, 140, 405, 404], + "observed_hall": [391, 140, 405, 405], + "duration_s": 15.155, + "four_axis_start_spread_s": 0.079, + "four_axis_arrival_spread_s": 0.495, + "result": "PASS" + }, + "cycle_index_after_return": 1, + "fault_mask": 0, + "result": "PASS" + }, + "continuous_rollover": { + "cycle_0_forward_start_spread_s": 0.052, + "cycle_0_return_start_spread_s": 0.053, + "cycle_1_forward_start_spread_s": 0.082, + "phase_transitions_s": [0.370, 17.888, 32.781], + "result": "PASS" + }, + "step_3_to_step_1_semantics": "Step 3 and Step 1 have identical Hall targets, so their boundary has zero physical displacement. The ECU rolls the cycle index atomically and synchronously launches the next Step 1-to-Step 2 leg.", + "stop_verification": { + "stop_dynamic_sent": true, + "final_0x306": "00 00 00 00 00 00 00 00", + "result": "PASS" + }, + "frontend_natural_language_hil": { + "start": { + "utterance": "开启动态摇篮模式", + "request_id": "req-20260804071706-45a1df", + "result": "SUCCEEDED", + "firmware_signature": "seat-controller-smv8-dynamic-modes-v9", + "command": "0x300 0E 10 06 00 02 00 00 00", + "ui_state": "动态摇篮模式 · 循环中 · 最长10分钟" + }, + "active_physical_can_observation": { + "source": "physical_can", + "complete": true, + "moving_axes": { + "longitudinal_pct": 59, + "backrest_recline_pct": 75 + }, + "all_axes_position_valid": true, + "faults": false + }, + "stop": { + "utterance": "关闭动态摇篮模式", + "request_id": "req-20260804072028-55179f", + "result": "SUCCEEDED", + "command": "0x300 0F 10 07 00 00 00 00 00", + "ui_state": "未运行", + "all_axes_stopped": true, + "all_axes_position_valid": true, + "faults": false + }, + "hardware_access_after_test": "automatically released by the 180-second local idle policy", + "result": "PASS" + } +} diff --git a/artifacts/hil/rocking_horse_rev11_20260804.json b/artifacts/hil/rocking_horse_rev11_20260804.json new file mode 100644 index 0000000..7b90430 --- /dev/null +++ b/artifacts/hil/rocking_horse_rev11_20260804.json @@ -0,0 +1,343 @@ +{ + "mode": "rocking_horse", + "firmware_revision": 11, + "max_hall": [ + 499, + 374, + 917, + 647 + ], + "homes": [ + { + "motor": 0, + "hall_before": 349, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 21, + "opcode": 11, + "firmware_revision": 11 + }, + "terminal": { + "motor": 0, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 21, + "position_x100": 0 + } + }, + { + "motor": 1, + "hall_before": 163, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 22, + "opcode": 11, + "firmware_revision": 11 + }, + "terminal": { + "motor": 1, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 22, + "position_x100": 0 + } + }, + { + "motor": 2, + "hall_before": 534, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 23, + "opcode": 11, + "firmware_revision": 11 + }, + "terminal": { + "motor": 2, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 23, + "position_x100": 0 + } + }, + { + "motor": 3, + "hall_before": 456, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 24, + "opcode": 11, + "firmware_revision": 11 + }, + "terminal": { + "motor": 3, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 24, + "position_x100": 0 + } + } + ], + "start_ack": { + "ack": 1, + "reject": 0, + "sequence": 37, + "opcode": 14, + "firmware_revision": 11 + }, + "segments": [ + { + "cycle_index": 0, + "phase": 2, + "phase_start": 262550.8121217, + "start_hall": [ + 320, + 191, + 500, + 431 + ], + "first_active": { + "2": 262550.8883221, + "3": 262550.9146271, + "0": 262550.9401055, + "1": 262550.9661217 + }, + "arrival": { + "3": 262552.7830827, + "1": 262552.8335206, + "2": 262553.0696745, + "0": 262553.1213695 + }, + "cruise_checkpoint": { + "elapsed_s": 0.6343701000441797, + "hall": [ + 312, + 201, + 481, + 417 + ], + "normalized_progress": [ + 0.26666666666666666, + 0.3448275862068966, + 0.475, + 0.45161290322580644 + ] + }, + "end_hall": [ + 290, + 219, + 460, + 400 + ], + "start_spread_s": 0.07779960002517328, + "arrival_spread_s": 0.3382868000189774, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 290, + 220, + 460, + 400 + ] + }, + { + "cycle_index": 0, + "phase": 3, + "phase_start": 262553.4043395, + "start_hall": [ + 290, + 219, + 460, + 400 + ], + "first_active": { + "2": 262553.4973208, + "3": 262553.5228996, + "0": 262553.5485228, + "1": 262553.5743734 + }, + "arrival": { + "3": 262557.0745088, + "1": 262557.1252219, + "2": 262557.2577929, + "0": 262557.3081852 + }, + "cruise_checkpoint": { + "elapsed_s": 1.079516199999489, + "hall": [ + 306, + 199, + 489, + 422 + ], + "normalized_progress": [ + 0.26666666666666666, + 0.3389830508474576, + 0.3625, + 0.36666666666666664 + ] + }, + "end_hall": [ + 350, + 160, + 540, + 460 + ], + "start_spread_s": 0.0770526000414975, + "arrival_spread_s": 0.23367639997741207, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 350, + 160, + 540, + 460 + ] + }, + { + "cycle_index": 1, + "phase": 2, + "phase_start": 262557.4375185, + "start_hall": [ + 350, + 160, + 540, + 460 + ], + "first_active": { + "3": 262557.4893286, + "0": 262557.5161744, + "1": 262557.5424914, + "2": 262557.5696487 + }, + "arrival": { + "3": 262561.8903825, + "1": 262561.9425291, + "2": 262562.0729115, + "0": 262562.1245799 + }, + "cruise_checkpoint": { + "elapsed_s": 1.337460899958387, + "hall": [ + 335, + 185, + 498, + 430 + ], + "normalized_progress": [ + 0.25, + 0.4166666666666667, + 0.525, + 0.5 + ] + }, + "end_hall": [ + 290, + 220, + 460, + 400 + ], + "start_spread_s": 0.08032010000897571, + "arrival_spread_s": 0.23419739998644218, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 290, + 220, + 460, + 400 + ] + }, + { + "cycle_index": 1, + "phase": 3, + "phase_start": 262562.35135919997, + "start_hall": [ + 290, + 220, + 460, + 400 + ], + "first_active": { + "3": 262562.3911222, + "0": 262562.4169718, + "1": 262562.4437546, + "2": 262562.4700679 + }, + "arrival": { + "3": 262566.0670384, + "1": 262566.1195433, + "2": 262566.1444, + "0": 262566.2991242 + }, + "cruise_checkpoint": { + "elapsed_s": 1.1310953000211157, + "hall": [ + 305, + 198, + 497, + 423 + ], + "normalized_progress": [ + 0.25, + 0.36666666666666664, + 0.4625, + 0.38333333333333336 + ] + }, + "end_hall": [ + 350, + 160, + 540, + 459 + ], + "start_spread_s": 0.07894570002099499, + "arrival_spread_s": 0.23208580003120005, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 350, + 160, + 540, + 460 + ] + } + ], + "repeat_first_active": { + "0": 262566.4901705, + "1": 262566.5153454, + "2": 262566.542698, + "3": 262566.5681911 + }, + "stop_ack": { + "ack": 1, + "reject": 0, + "sequence": 38, + "opcode": 15, + "firmware_revision": 11 + }, + "idle": { + "mode_id": 0, + "state": 0, + "phase": 0, + "active_mask": 0, + "fault_mask": 0, + "cycle_index": 0, + "phase_elapsed_ms": 0 + } +} diff --git a/artifacts/hil/rocking_horse_rev12_cushion_amplitude_20260804.json b/artifacts/hil/rocking_horse_rev12_cushion_amplitude_20260804.json new file mode 100644 index 0000000..bf9ec62 --- /dev/null +++ b/artifacts/hil/rocking_horse_rev12_cushion_amplitude_20260804.json @@ -0,0 +1,343 @@ +{ + "mode": "rocking_horse", + "firmware_revision": 12, + "max_hall": [ + 499, + 374, + 917, + 647 + ], + "homes": [ + { + "motor": 0, + "hall_before": 342, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 1, + "opcode": 11, + "firmware_revision": 12 + }, + "terminal": { + "motor": 0, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 1, + "position_x100": 0 + } + }, + { + "motor": 1, + "hall_before": 166, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 2, + "opcode": 11, + "firmware_revision": 12 + }, + "terminal": { + "motor": 1, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 2, + "position_x100": 0 + } + }, + { + "motor": 2, + "hall_before": 534, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 3, + "opcode": 11, + "firmware_revision": 12 + }, + "terminal": { + "motor": 2, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 3, + "position_x100": 0 + } + }, + { + "motor": 3, + "hall_before": 454, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 4, + "opcode": 11, + "firmware_revision": 12 + }, + "terminal": { + "motor": 3, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 4, + "position_x100": 0 + } + } + ], + "start_ack": { + "ack": 1, + "reject": 0, + "sequence": 17, + "opcode": 14, + "firmware_revision": 12 + }, + "segments": [ + { + "cycle_index": 0, + "phase": 2, + "phase_start": 264077.9579478, + "start_hall": [ + 320, + 191, + 500, + 430 + ], + "first_active": { + "0": 264078.038142, + "1": 264078.0663315, + "2": 264078.0774349, + "3": 264078.1169224 + }, + "arrival": { + "3": 264079.9439302, + "1": 264079.9959276, + "2": 264080.2325822, + "0": 264080.2840808 + }, + "cruise_checkpoint": { + "elapsed_s": 0.6441632999922149, + "hall": [ + 312, + 214, + 481, + 416 + ], + "normalized_progress": [ + 0.26666666666666666, + 0.3898305084745763, + 0.475, + 0.4666666666666667 + ] + }, + "end_hall": [ + 290, + 250, + 460, + 400 + ], + "start_spread_s": 0.07878040004288778, + "arrival_spread_s": 0.34015060000820085, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 290, + 250, + 460, + 400 + ] + }, + { + "cycle_index": 0, + "phase": 3, + "phase_start": 264080.62360189995, + "start_hall": [ + 290, + 250, + 460, + 400 + ], + "first_active": { + "0": 264080.6481176, + "1": 264080.6733371, + "2": 264080.7001602, + "3": 264080.7257557 + }, + "arrival": { + "1": 264084.2944588, + "3": 264084.344339, + "0": 264084.475855, + "2": 264084.5271018 + }, + "cruise_checkpoint": { + "elapsed_s": 1.0275715000461787, + "hall": [ + 305, + 206, + 492, + 421 + ], + "normalized_progress": [ + 0.25, + 0.36666666666666664, + 0.4, + 0.35 + ] + }, + "end_hall": [ + 350, + 132, + 540, + 460 + ], + "start_spread_s": 0.07763810001779348, + "arrival_spread_s": 0.2326430000248365, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 350, + 130, + 540, + 460 + ] + }, + { + "cycle_index": 1, + "phase": 2, + "phase_start": 264084.65867120004, + "start_hall": [ + 350, + 132, + 540, + 460 + ], + "first_active": { + "2": 264084.7388101, + "1": 264084.7410872, + "0": 264084.7599586, + "3": 264084.7926978 + }, + "arrival": { + "3": 264089.0549796, + "1": 264089.108405, + "0": 264089.3941196, + "2": 264089.4443601 + }, + "cruise_checkpoint": { + "elapsed_s": 1.391282099939417, + "hall": [ + 335, + 187, + 497, + 429 + ], + "normalized_progress": [ + 0.25, + 0.4661016949152542, + 0.5375, + 0.5166666666666667 + ] + }, + "end_hall": [ + 290, + 250, + 460, + 400 + ], + "start_spread_s": 0.05388769996352494, + "arrival_spread_s": 0.38938050001161173, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 290, + 250, + 460, + 400 + ] + }, + { + "cycle_index": 1, + "phase": 3, + "phase_start": 264089.7385309, + "start_hall": [ + 290, + 250, + 460, + 400 + ], + "first_active": { + "1": 264089.857611, + "2": 264089.8838599, + "3": 264089.910015, + "0": 264089.938548 + }, + "arrival": { + "1": 264093.3849972, + "3": 264093.4384044, + "2": 264093.5165479, + "0": 264093.5667763 + }, + "cruise_checkpoint": { + "elapsed_s": 1.011584700027015, + "hall": [ + 305, + 207, + 492, + 420 + ], + "normalized_progress": [ + 0.25, + 0.35833333333333334, + 0.4, + 0.3333333333333333 + ] + }, + "end_hall": [ + 350, + 132, + 540, + 460 + ], + "start_spread_s": 0.08093699999153614, + "arrival_spread_s": 0.1817791000357829, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 350, + 130, + 540, + 460 + ] + } + ], + "repeat_first_active": { + "0": 264093.8496089, + "2": 264093.8578157, + "3": 264093.8843526, + "1": 264093.9379308 + }, + "stop_ack": { + "ack": 1, + "reject": 0, + "sequence": 18, + "opcode": 15, + "firmware_revision": 12 + }, + "idle": { + "mode_id": 0, + "state": 0, + "phase": 0, + "active_mask": 0, + "fault_mask": 0, + "cycle_index": 0, + "phase_elapsed_ms": 0 + } +} diff --git a/artifacts/hil/rocking_horse_rev13_horizontal_compensation_20260804.json b/artifacts/hil/rocking_horse_rev13_horizontal_compensation_20260804.json new file mode 100644 index 0000000..96c7fe6 --- /dev/null +++ b/artifacts/hil/rocking_horse_rev13_horizontal_compensation_20260804.json @@ -0,0 +1,343 @@ +{ + "mode": "rocking_horse", + "firmware_revision": 13, + "max_hall": [ + 499, + 374, + 917, + 647 + ], + "homes": [ + { + "motor": 0, + "hall_before": 326, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 1, + "opcode": 11, + "firmware_revision": 13 + }, + "terminal": { + "motor": 0, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 1, + "position_x100": 0 + } + }, + { + "motor": 1, + "hall_before": 138, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 2, + "opcode": 11, + "firmware_revision": 13 + }, + "terminal": { + "motor": 1, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 2, + "position_x100": 0 + } + }, + { + "motor": 2, + "hall_before": 532, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 3, + "opcode": 11, + "firmware_revision": 13 + }, + "terminal": { + "motor": 2, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 3, + "position_x100": 0 + } + }, + { + "motor": 3, + "hall_before": 451, + "hall_after": 0, + "ack": { + "ack": 1, + "reject": 0, + "sequence": 4, + "opcode": 11, + "firmware_revision": 13 + }, + "terminal": { + "motor": 3, + "task": 6, + "result": 2, + "active": false, + "position_valid": true, + "sequence": 4, + "position_x100": 0 + } + } + ], + "start_ack": { + "ack": 1, + "reject": 0, + "sequence": 17, + "opcode": 14, + "firmware_revision": 13 + }, + "segments": [ + { + "cycle_index": 0, + "phase": 2, + "phase_start": 265437.2473564, + "start_hall": [ + 320, + 190, + 500, + 430 + ], + "first_active": { + "2": 265437.2955111, + "3": 265437.3198522, + "0": 265437.346692, + "1": 265437.3733125 + }, + "arrival": { + "1": 265438.9329059, + "3": 265438.9846889, + "0": 265439.2201775, + "2": 265439.2731793 + }, + "cruise_checkpoint": { + "elapsed_s": 0.5042391999741085, + "hall": [ + 306, + 209, + 486, + 419 + ], + "normalized_progress": [ + 0.28, + 0.31666666666666665, + 0.35, + 0.36666666666666664 + ] + }, + "end_hall": [ + 270, + 250, + 460, + 400 + ], + "start_spread_s": 0.07780140003887936, + "arrival_spread_s": 0.34027340001193807, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 270, + 250, + 460, + 400 + ] + }, + { + "cycle_index": 0, + "phase": 3, + "phase_start": 265439.64164610003, + "start_hall": [ + 270, + 250, + 460, + 400 + ], + "first_active": { + "2": 265439.6948618, + "3": 265439.7208077, + "0": 265439.7458537, + "1": 265439.7726268 + }, + "arrival": { + "1": 265442.9056772, + "3": 265442.9558483, + "2": 265443.0339587, + "0": 265443.0861803 + }, + "cruise_checkpoint": { + "elapsed_s": 0.8318679999792948, + "hall": [ + 295, + 216, + 484, + 417 + ], + "normalized_progress": [ + 0.25, + 0.2833333333333333, + 0.3, + 0.2833333333333333 + ] + }, + "end_hall": [ + 370, + 130, + 540, + 460 + ], + "start_spread_s": 0.07776499999454245, + "arrival_spread_s": 0.18050309998216107, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 370, + 130, + 540, + 460 + ] + }, + { + "cycle_index": 1, + "phase": 2, + "phase_start": 265443.25305889995, + "start_hall": [ + 370, + 130, + 540, + 460 + ], + "first_active": { + "0": 265443.2954135, + "1": 265443.3206536, + "2": 265443.3348354, + "3": 265443.3728105 + }, + "arrival": { + "3": 265446.8221541, + "1": 265446.8749014, + "2": 265447.0045205, + "0": 265447.159461 + }, + "cruise_checkpoint": { + "elapsed_s": 1.084834800043609, + "hall": [ + 343, + 175, + 507, + 436 + ], + "normalized_progress": [ + 0.27, + 0.375, + 0.4125, + 0.4 + ] + }, + "end_hall": [ + 270, + 250, + 460, + 401 + ], + "start_spread_s": 0.07739699998637661, + "arrival_spread_s": 0.3373069000081159, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 270, + 250, + 460, + 400 + ] + }, + { + "cycle_index": 1, + "phase": 3, + "phase_start": 265447.3484032, + "start_hall": [ + 270, + 250, + 460, + 401 + ], + "first_active": { + "1": 265447.3961179, + "0": 265447.400082, + "2": 265447.4222059, + "3": 265447.4483388 + }, + "arrival": { + "1": 265450.6434356, + "3": 265450.693563, + "2": 265450.7765666, + "0": 265450.8258244 + }, + "cruise_checkpoint": { + "elapsed_s": 0.9676259999978356, + "hall": [ + 297, + 209, + 490, + 421 + ], + "normalized_progress": [ + 0.27, + 0.3416666666666667, + 0.375, + 0.3389830508474576 + ] + }, + "end_hall": [ + 370, + 130, + 540, + 460 + ], + "start_spread_s": 0.05222090001916513, + "arrival_spread_s": 0.18238880002172664, + "all_axes_started": true, + "all_axes_arrived": true, + "target": [ + 370, + 130, + 540, + 460 + ] + } + ], + "repeat_first_active": { + "3": 265450.9977942, + "0": 265451.025777, + "2": 265451.0380102, + "1": 265451.0497914 + }, + "stop_ack": { + "ack": 1, + "reject": 0, + "sequence": 18, + "opcode": 15, + "firmware_revision": 13 + }, + "idle": { + "mode_id": 0, + "state": 0, + "phase": 0, + "active_mask": 0, + "fault_mask": 0, + "cycle_index": 0, + "phase_elapsed_ms": 0 + } +} diff --git a/artifacts/hil/seat_frontend_hil_20260801_final_rev6.json b/artifacts/hil/seat_frontend_hil_20260801_final_rev6.json new file mode 100644 index 0000000..603b38d --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260801_final_rev6.json @@ -0,0 +1,2214 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T15:47:02.726525Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801154702", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "THERM-H-1", + "group": "thermal", + "utterance": "副驾座椅加热开到1档", + "started_at": "2026-08-01T15:47:02.726567Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154702-b96636", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29658.320125 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29658.346019 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29658.371926 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29658.39812 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 29658.408285 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 29658.408285 + } + }, + "captured_at": "2026-08-01T15:47:03.509191Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:03.587338Z", + "duration_ms": 861 + }, + { + "id": "THERM-H-2", + "group": "thermal", + "utterance": "副驾座椅加热开到2档", + "started_at": "2026-08-01T15:47:03.587403Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154703-789441", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29659.225937 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29659.251814 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29659.278082 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29659.303945 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 29659.313002 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 29659.313002 + } + }, + "captured_at": "2026-08-01T15:47:04.413905Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:04.492888Z", + "duration_ms": 905 + }, + { + "id": "THERM-H-3", + "group": "thermal", + "utterance": "副驾座椅加热开到3档", + "started_at": "2026-08-01T15:47:04.492947Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154704-702abe", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29660.164397 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29660.189542 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29660.216532 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29660.242415 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 29660.251422 + } + }, + "heating": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 29660.251422 + } + }, + "captured_at": "2026-08-01T15:47:05.352212Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:05.439988Z", + "duration_ms": 947 + }, + { + "id": "THERM-H-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅加热", + "started_at": "2026-08-01T15:47:05.440049Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154705-52492f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29661.056209 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29661.082436 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29661.108174 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29661.134017 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29661.144148 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29661.144148 + } + }, + "captured_at": "2026-08-01T15:47:06.244903Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:06.323379Z", + "duration_ms": 883 + }, + { + "id": "THERM-V-1", + "group": "thermal", + "utterance": "副驾座椅通风开到1档", + "started_at": "2026-08-01T15:47:06.323429Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154706-1720c2", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29661.937905 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29661.963716 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29661.98994 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29662.015735 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 29662.024794 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 29662.024794 + } + }, + "captured_at": "2026-08-01T15:47:07.125514Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:07.199776Z", + "duration_ms": 876 + }, + { + "id": "THERM-V-2", + "group": "thermal", + "utterance": "副驾座椅通风开到2档", + "started_at": "2026-08-01T15:47:07.199843Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154707-98c578", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29662.813889 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29662.839684 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29662.8666 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29662.891751 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 29662.901896 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 29662.901896 + } + }, + "captured_at": "2026-08-01T15:47:08.002673Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:08.085406Z", + "duration_ms": 886 + }, + { + "id": "THERM-V-3", + "group": "thermal", + "utterance": "副驾座椅通风开到3档", + "started_at": "2026-08-01T15:47:08.085456Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154708-91d627", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29663.694339 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29663.720084 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29663.745922 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29663.771793 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 29663.780042 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 29663.780042 + } + }, + "captured_at": "2026-08-01T15:47:08.880722Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:08.966857Z", + "duration_ms": 881 + }, + { + "id": "THERM-V-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅通风", + "started_at": "2026-08-01T15:47:08.966914Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154708-a827a7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29664.524053 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29664.549815 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29664.576044 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29664.601832 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29664.609703 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29664.609703 + } + }, + "captured_at": "2026-08-01T15:47:09.710310Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:09.786556Z", + "duration_ms": 820 + }, + { + "id": "MOTION-M0-25", + "group": "motion", + "utterance": "把副驾座椅水平位置调到25%", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:09.786644Z", + "finished_at": "2026-08-01T15:47:09.786646Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 25, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MOTION-M0-75", + "group": "motion", + "utterance": "把副驾座椅水平位置调到75%", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:09.786668Z", + "finished_at": "2026-08-01T15:47:09.786669Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 75, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MOTION-M0-HOME", + "group": "motion", + "utterance": "把副驾座椅水平位置归零", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:09.786675Z", + "finished_at": "2026-08-01T15:47:09.786676Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 0, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MOTION-M1-20", + "group": "motion", + "utterance": "把副驾坐盆调到20%", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:09.786687Z", + "finished_at": "2026-08-01T15:47:09.786688Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 20, + "minimum_safe_target_pct": 100, + "reason": "M1 near-direction mechanical obstruction now also reproduces from the far endpoint; do not drive below the current 100% position until the mechanism is inspected.", + "evidence": { + "hall_count": 374, + "pulse_count": 0, + "peak_current_delta_raw": 1351, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MOTION-M1-60", + "group": "motion", + "utterance": "把副驾坐盆调到60%", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:09.786696Z", + "finished_at": "2026-08-01T15:47:09.786698Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 60, + "minimum_safe_target_pct": 100, + "reason": "M1 near-direction mechanical obstruction now also reproduces from the far endpoint; do not drive below the current 100% position until the mechanism is inspected.", + "evidence": { + "hall_count": 374, + "pulse_count": 0, + "peak_current_delta_raw": 1351, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MOTION-M2-25", + "group": "motion", + "utterance": "把副驾靠背调到25%", + "started_at": "2026-08-01T15:47:09.786704Z", + "status": "failed", + "errors": [ + "T2G motor 2 TIMEOUT: task_state=7, Hall=743->743" + ], + "http_status": 201, + "request_id": "req-20260801154709-83910b", + "failure_telemetry": { + "motor_selector": 2, + "motion_axis": "backrest_recline", + "task_state": 7, + "motor_result": 6, + "motor_result_name": "TIMEOUT", + "position_valid": true, + "hall_before": 743, + "hall_after": 743, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 138, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 12 02 00 C4 09 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 02 00 01 04 E0 6E", + "timestamp": 29665.003821 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 67 08 02 00 A7 1F 00", + "timestamp": 29671.528551 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "02 00 E7 02 95 03 00 50", + "timestamp": 29664.99191 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "02 05 E7 02 95 03 00 50", + "timestamp": 29671.529697 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 64, + "valid_sample_count": 64, + "max_current_raw": 2252, + "max_current_delta_raw": 205, + "high_current_seen": false, + "low_hall_seen": true, + "stall_overlap_seen": false, + "peak": { + "current_raw": 2252, + "current_baseline_raw": 2047, + "current_delta_raw": 205, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "02 03 CC 08 FF 07 F4 01", + "timestamp": 29665.294733 + } + }, + "latest": { + "current_raw": 2178, + "current_baseline_raw": 2047, + "current_delta_raw": 131, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "02 0B 82 08 FF 07 F4 01", + "timestamp": 29671.440071 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T15:47:16.820114Z", + "duration_ms": 7033 + }, + { + "id": "MOTION-M2-60", + "group": "motion", + "utterance": "把副驾靠背调到60%", + "started_at": "2026-08-01T15:47:16.820162Z", + "status": "failed", + "errors": [ + "T2G motor 2 TIMEOUT: task_state=7, Hall=743->743" + ], + "http_status": 201, + "request_id": "req-20260801154716-4253ad", + "failure_telemetry": { + "motor_selector": 2, + "motion_axis": "backrest_recline", + "task_state": 7, + "motor_result": 6, + "motor_result_name": "TIMEOUT", + "position_valid": true, + "hall_before": 743, + "hall_after": 743, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 138, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 12 05 00 70 17 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 05 00 01 04 E0 67", + "timestamp": 29672.045387 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 67 08 05 00 A7 1F 00", + "timestamp": 29678.579774 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "02 05 E7 02 95 03 00 A0", + "timestamp": 29672.043424 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "02 05 E7 02 95 03 00 B0", + "timestamp": 29678.580946 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 65, + "valid_sample_count": 65, + "max_current_raw": 2242, + "max_current_delta_raw": 190, + "high_current_seen": false, + "low_hall_seen": true, + "stall_overlap_seen": false, + "peak": { + "current_raw": 2242, + "current_baseline_raw": 2052, + "current_delta_raw": 190, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "02 03 C2 08 04 08 F4 01", + "timestamp": 29672.076592 + } + }, + "latest": { + "current_raw": 2163, + "current_baseline_raw": 2052, + "current_delta_raw": 111, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "02 0B 73 08 04 08 F4 01", + "timestamp": 29678.532301 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T15:47:23.850083Z", + "duration_ms": 7030 + }, + { + "id": "MOTION-M2-HOME", + "group": "motion", + "utterance": "把副驾靠背归零", + "started_at": "2026-08-01T15:47:23.850133Z", + "status": "failed", + "errors": [ + "T2G motor 2 CALIBRATION_FAILED: task_state=7, Hall=743->743" + ], + "http_status": 201, + "request_id": "req-20260801154723-c4c780", + "failure_telemetry": { + "motor_selector": 2, + "motion_axis": "backrest_recline", + "task_state": 7, + "motor_result": 11, + "motor_result_name": "CALIBRATION_FAILED", + "position_valid": false, + "hall_before": 743, + "hall_after": 743, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 138, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "0B 12 08 00 52 4B 78 00", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "51 00 08 00 0B 44 E0 60", + "timestamp": 29679.063366 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 B7 00 08 00 FF FF 00", + "timestamp": 29682.286447 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "02 05 E7 02 95 03 00 00", + "timestamp": 29679.06159 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "02 88 E7 02 95 03 00 30", + "timestamp": 29682.289934 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 35, + "valid_sample_count": 35, + "max_current_raw": 2244, + "max_current_delta_raw": 185, + "high_current_seen": false, + "low_hall_seen": true, + "stall_overlap_seen": false, + "peak": { + "current_raw": 2244, + "current_baseline_raw": 2059, + "current_delta_raw": 185, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": false, + "current_calibrating": true, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "02 13 C4 08 0B 08 F4 01", + "timestamp": 29681.340332 + } + }, + "latest": { + "current_raw": 2171, + "current_baseline_raw": 2059, + "current_delta_raw": 112, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "02 0B 7B 08 0B 08 F4 01", + "timestamp": 29682.180355 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T15:47:27.569016Z", + "duration_ms": 3719 + }, + { + "id": "MOTION-M3-20", + "group": "motion", + "utterance": "把副驾腿托调到20%", + "started_at": "2026-08-01T15:47:27.569076Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154727-e582aa", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 1978, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 0B 00 BA 07 00", + "timestamp": 29693.451199 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 0A 00 FF FF 00", + "timestamp": 29693.477217 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 0A 00 10 27 00", + "timestamp": 29693.502608 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 0A 00 FF FF 00", + "timestamp": 29693.528656 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29693.540049 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29693.540049 + } + }, + "captured_at": "2026-08-01T15:47:38.640167Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:38.717963Z", + "duration_ms": 11149 + }, + { + "id": "MOTION-M3-60", + "group": "motion", + "utterance": "把副驾腿托调到60%", + "started_at": "2026-08-01T15:47:38.718046Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154738-a140a6", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 0C 00 10 27 00", + "timestamp": 29700.237153 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 0C 00 FF FF 00", + "timestamp": 29700.263244 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5997, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 0D 00 6D 17 00", + "timestamp": 29700.28857 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 0C 00 FF FF 00", + "timestamp": 29700.314685 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29700.324918 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29700.324918 + } + }, + "captured_at": "2026-08-01T15:47:45.424988Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:45.509180Z", + "duration_ms": 6791 + }, + { + "id": "MOTION-M3-HOME", + "group": "motion", + "utterance": "把副驾腿托归零", + "started_at": "2026-08-01T15:47:45.509231Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154745-8ead10", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 0E 00 FF FF 00", + "timestamp": 29710.693738 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 0E 00 10 27 00", + "timestamp": 29710.719463 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 0E 00 FF FF 00", + "timestamp": 29710.745227 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 0F 00 00 00 00", + "timestamp": 29710.77088 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29710.778777 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29710.778777 + } + }, + "captured_at": "2026-08-01T15:47:55.878618Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:55.952318Z", + "duration_ms": 10443 + }, + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:55.952386Z", + "finished_at": "2026-08-01T15:47:55.952389Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 0, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "COMBINED-ALL", + "group": "combined", + "utterance": "打开副驾加热1档、打开通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:55.952398Z", + "finished_at": "2026-08-01T15:47:55.952399Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 30, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "COMBINED-OFF", + "group": "combined", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T15:47:55.952407Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154755-964b37", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 0F 00 00 00 00", + "timestamp": 29711.524892 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 0E 00 FF FF 00", + "timestamp": 29711.551743 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 0E 00 10 27 00", + "timestamp": 29711.577468 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 0E 00 FF FF 00", + "timestamp": 29711.60355 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29711.611447 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29711.611447 + } + }, + "captured_at": "2026-08-01T15:47:56.711259Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:56.832519Z", + "duration_ms": 880 + }, + { + "id": "MODE-EASY-ENTRY", + "group": "mode", + "utterance": "副驾执行轻松进出模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832581Z", + "finished_at": "2026-08-01T15:47:56.832583Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 100, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-OFFICE", + "group": "mode", + "utterance": "副驾执行办公模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832591Z", + "finished_at": "2026-08-01T15:47:56.832592Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 72, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-QUEEN", + "group": "mode", + "utterance": "副驾执行女王副驾行驶模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832598Z", + "finished_at": "2026-08-01T15:47:56.832599Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 72, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-BABY-NAP", + "group": "mode", + "utterance": "副驾执行宝宝午睡模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832605Z", + "finished_at": "2026-08-01T15:47:56.832607Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 81, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-CRUISE-SOFA", + "group": "mode", + "utterance": "副驾执行巡航沙发模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832615Z", + "finished_at": "2026-08-01T15:47:56.832616Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 51, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-MEDITATION", + "group": "mode", + "utterance": "副驾执行冥想空间模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832622Z", + "finished_at": "2026-08-01T15:47:56.832623Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 100, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-LEISURE", + "group": "mode", + "utterance": "副驾执行休闲躺椅模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832629Z", + "finished_at": "2026-08-01T15:47:56.832630Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 51, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-CALF", + "group": "mode", + "utterance": "副驾执行小腿解压悬浮模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832636Z", + "finished_at": "2026-08-01T15:47:56.832637Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 51, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-BEACH", + "group": "mode", + "utterance": "副驾执行电感沙滩椅模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832643Z", + "finished_at": "2026-08-01T15:47:56.832644Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 100, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-NAP", + "group": "mode", + "utterance": "副驾执行小憩模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832650Z", + "finished_at": "2026-08-01T15:47:56.832651Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 100, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-ZERO-GRAVITY", + "group": "mode", + "utterance": "副驾执行零重力模式", + "status": "safety_blocked", + "started_at": "2026-08-01T15:47:56.832656Z", + "finished_at": "2026-08-01T15:47:56.832657Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 100, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T15:47:56.832664Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154756-1946bc", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 0E 00 FF FF 00", + "timestamp": 29712.411281 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 0F 00 00 00 00", + "timestamp": 29712.437028 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 0E 00 FF FF 00", + "timestamp": 29712.463792 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 0E 00 10 27 00", + "timestamp": 29712.491067 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29712.49673 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29712.49673 + } + }, + "captured_at": "2026-08-01T15:47:57.596426Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:47:57.681445Z", + "duration_ms": 849 + }, + "finished_at": "2026-08-01T15:47:57.681482Z", + "summary": { + "total": 33, + "passed": 12, + "failed": 3, + "safety_blocked": 18, + "executed": 15, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260801_final_rev6_safe.json b/artifacts/hil/seat_frontend_hil_20260801_final_rev6_safe.json new file mode 100644 index 0000000..06f6e18 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260801_final_rev6_safe.json @@ -0,0 +1,1980 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T16:09:08.813120Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801160908", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "THERM-H-1", + "group": "thermal", + "utterance": "副驾座椅加热开到1档", + "started_at": "2026-08-01T16:09:08.813160Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160908-7f9d90", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 00 00 FF FF 00", + "timestamp": 30984.474752 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 00 00 00 00 00", + "timestamp": 30984.501669 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 00 00 FF FF 00", + "timestamp": 30984.526762 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 00 00 10 27 00", + "timestamp": 30984.55371 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 30984.560513 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 30984.560513 + } + }, + "captured_at": "2026-08-01T16:09:09.634508Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:09.716278Z", + "duration_ms": 903 + }, + { + "id": "THERM-H-2", + "group": "thermal", + "utterance": "副驾座椅加热开到2档", + "started_at": "2026-08-01T16:09:09.716339Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160909-455685", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 00 00 00 00 00", + "timestamp": 30985.34714 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 00 00 FF FF 00", + "timestamp": 30985.372972 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 00 00 10 27 00", + "timestamp": 30985.398777 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 00 00 FF FF 00", + "timestamp": 30985.424943 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 30985.432856 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 30985.432856 + } + }, + "captured_at": "2026-08-01T16:09:10.506903Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:10.590135Z", + "duration_ms": 874 + }, + { + "id": "THERM-H-3", + "group": "thermal", + "utterance": "副驾座椅加热开到3档", + "started_at": "2026-08-01T16:09:10.590213Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160910-df1c57", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 00 00 FF FF 00", + "timestamp": 30986.235429 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 00 00 10 27 00", + "timestamp": 30986.261221 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 00 00 FF FF 00", + "timestamp": 30986.287114 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 00 00 00 00 00", + "timestamp": 30986.312876 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 30986.32195 + } + }, + "heating": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 30986.32195 + } + }, + "captured_at": "2026-08-01T16:09:11.395940Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:11.475284Z", + "duration_ms": 885 + }, + { + "id": "THERM-H-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅加热", + "started_at": "2026-08-01T16:09:11.475339Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160911-0d5d6f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 00 00 FF FF 00", + "timestamp": 30987.097703 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 00 00 10 27 00", + "timestamp": 30987.124907 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 00 00 FF FF 00", + "timestamp": 30987.151756 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 00 00 00 00 00", + "timestamp": 30987.177554 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 30987.183158 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 30987.183158 + } + }, + "captured_at": "2026-08-01T16:09:12.257059Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:12.363608Z", + "duration_ms": 888 + }, + { + "id": "THERM-V-1", + "group": "thermal", + "utterance": "副驾座椅通风开到1档", + "started_at": "2026-08-01T16:09:12.363667Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160912-b17d84", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 00 00 FF FF 00", + "timestamp": 30988.007004 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 00 00 10 27 00", + "timestamp": 30988.033125 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 00 00 FF FF 00", + "timestamp": 30988.058917 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 00 00 00 00 00", + "timestamp": 30988.085756 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 30988.093653 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 30988.093653 + } + }, + "captured_at": "2026-08-01T16:09:13.167532Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:13.240092Z", + "duration_ms": 876 + }, + { + "id": "THERM-V-2", + "group": "thermal", + "utterance": "副驾座椅通风开到2档", + "started_at": "2026-08-01T16:09:13.240147Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160913-c6e722", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 00 00 FF FF 00", + "timestamp": 30988.853532 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 00 00 10 27 00", + "timestamp": 30988.879326 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 00 00 FF FF 00", + "timestamp": 30988.905003 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 00 00 00 00 00", + "timestamp": 30988.931185 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 30988.93908 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 30988.93908 + } + }, + "captured_at": "2026-08-01T16:09:14.012902Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:14.088758Z", + "duration_ms": 849 + }, + { + "id": "THERM-V-3", + "group": "thermal", + "utterance": "副驾座椅通风开到3档", + "started_at": "2026-08-01T16:09:14.088811Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160914-2c3a66", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 00 00 FF FF 00", + "timestamp": 30989.699961 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 00 00 10 27 00", + "timestamp": 30989.724961 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 00 00 FF FF 00", + "timestamp": 30989.751846 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 00 00 00 00 00", + "timestamp": 30989.77764 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 30989.785475 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 30989.785475 + } + }, + "captured_at": "2026-08-01T16:09:14.859342Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:14.945067Z", + "duration_ms": 856 + }, + { + "id": "THERM-V-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅通风", + "started_at": "2026-08-01T16:09:14.945127Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160914-a049e3", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 00 00 FF FF 00", + "timestamp": 30990.561013 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 00 00 10 27 00", + "timestamp": 30990.58789 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 00 00 FF FF 00", + "timestamp": 30990.613596 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 00 00 00 00 00", + "timestamp": 30990.639735 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 30990.646482 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 30990.646482 + } + }, + "captured_at": "2026-08-01T16:09:15.720363Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:15.800542Z", + "duration_ms": 855 + }, + { + "id": "MOTION-M0-25", + "group": "motion", + "utterance": "把副驾座椅水平位置调到25%", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:15.800605Z", + "finished_at": "2026-08-01T16:09:15.800608Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 25, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MOTION-M0-75", + "group": "motion", + "utterance": "把副驾座椅水平位置调到75%", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:15.800619Z", + "finished_at": "2026-08-01T16:09:15.800620Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 75, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MOTION-M0-HOME", + "group": "motion", + "utterance": "把副驾座椅水平位置归零", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:15.800627Z", + "finished_at": "2026-08-01T16:09:15.800629Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 0, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MOTION-M1-20", + "group": "motion", + "utterance": "把副驾坐盆调到20%", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:15.800639Z", + "finished_at": "2026-08-01T16:09:15.800641Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 20, + "minimum_safe_target_pct": 100, + "reason": "M1 near-direction mechanical obstruction now also reproduces from the far endpoint; do not drive below the current 100% position until the mechanism is inspected.", + "evidence": { + "hall_count": 374, + "pulse_count": 0, + "peak_current_delta_raw": 1351, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MOTION-M1-60", + "group": "motion", + "utterance": "把副驾坐盆调到60%", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:15.800649Z", + "finished_at": "2026-08-01T16:09:15.800650Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 60, + "minimum_safe_target_pct": 100, + "reason": "M1 near-direction mechanical obstruction now also reproduces from the far endpoint; do not drive below the current 100% position until the mechanism is inspected.", + "evidence": { + "hall_count": 374, + "pulse_count": 0, + "peak_current_delta_raw": 1351, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MOTION-M2-25", + "group": "motion", + "utterance": "把副驾靠背调到25%", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:15.800657Z", + "finished_at": "2026-08-01T16:09:15.800659Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "backrest_recline", + "target_pct": 25, + "block_all_targets": true, + "reason": "M2 produced zero Hall pulses in both directions. Near-direction absolute and homing commands and a bounded far-direction 500 ms/90% timed probe all failed at Hall 743 with low current, indicating an unloaded/open output path; inspect the bridge channel, connector, motor wiring and Hall path before more motion.", + "evidence": { + "hall_count": 743, + "pulse_count": 0, + "near_direction_max_current_delta_raw": 205, + "far_direction_max_current_delta_raw": 198, + "far_probe_duration_ms": 500, + "far_probe_duty_pct": 90, + "position_valid": false + } + } + }, + { + "id": "MOTION-M2-60", + "group": "motion", + "utterance": "把副驾靠背调到60%", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:15.800665Z", + "finished_at": "2026-08-01T16:09:15.800666Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "backrest_recline", + "target_pct": 60, + "block_all_targets": true, + "reason": "M2 produced zero Hall pulses in both directions. Near-direction absolute and homing commands and a bounded far-direction 500 ms/90% timed probe all failed at Hall 743 with low current, indicating an unloaded/open output path; inspect the bridge channel, connector, motor wiring and Hall path before more motion.", + "evidence": { + "hall_count": 743, + "pulse_count": 0, + "near_direction_max_current_delta_raw": 205, + "far_direction_max_current_delta_raw": 198, + "far_probe_duration_ms": 500, + "far_probe_duty_pct": 90, + "position_valid": false + } + } + }, + { + "id": "MOTION-M2-HOME", + "group": "motion", + "utterance": "把副驾靠背归零", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:15.800672Z", + "finished_at": "2026-08-01T16:09:15.800673Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "backrest_recline", + "target_pct": 0, + "block_all_targets": true, + "reason": "M2 produced zero Hall pulses in both directions. Near-direction absolute and homing commands and a bounded far-direction 500 ms/90% timed probe all failed at Hall 743 with low current, indicating an unloaded/open output path; inspect the bridge channel, connector, motor wiring and Hall path before more motion.", + "evidence": { + "hall_count": 743, + "pulse_count": 0, + "near_direction_max_current_delta_raw": 205, + "far_direction_max_current_delta_raw": 198, + "far_probe_duration_ms": 500, + "far_probe_duty_pct": 90, + "position_valid": false + } + } + }, + { + "id": "MOTION-M3-20", + "group": "motion", + "utterance": "把副驾腿托调到20%", + "started_at": "2026-08-01T16:09:15.800679Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160915-aef10a", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 02 00 D9 07 00", + "timestamp": 30994.433753 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 01 00 FF FF 00", + "timestamp": 30994.459856 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 01 00 10 27 00", + "timestamp": 30994.486003 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 01 00 FF FF 00", + "timestamp": 30994.512075 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 30994.520044 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 30994.520044 + } + }, + "captured_at": "2026-08-01T16:09:19.593843Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:19.664419Z", + "duration_ms": 3864 + }, + { + "id": "MOTION-M3-60", + "group": "motion", + "utterance": "把副驾腿托调到60%", + "started_at": "2026-08-01T16:09:19.664479Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160919-42d45b", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 03 00 FF FF 00", + "timestamp": 31001.234083 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5997, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 04 00 6D 17 00", + "timestamp": 31001.260199 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 03 00 FF FF 00", + "timestamp": 31001.285196 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 03 00 10 27 00", + "timestamp": 31001.311303 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 31001.321594 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 31001.321594 + } + }, + "captured_at": "2026-08-01T16:09:26.395325Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:26.458684Z", + "duration_ms": 6794 + }, + { + "id": "MOTION-M3-HOME", + "group": "motion", + "utterance": "把副驾腿托归零", + "started_at": "2026-08-01T16:09:26.458742Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160926-d345a6", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 05 00 10 27 00", + "timestamp": 31011.405943 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 05 00 FF FF 00", + "timestamp": 31011.432132 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 06 00 00 00 00", + "timestamp": 31011.457808 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 05 00 FF FF 00", + "timestamp": 31011.483575 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 31011.492588 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 31011.492588 + } + }, + "captured_at": "2026-08-01T16:09:36.565955Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:36.646801Z", + "duration_ms": 10188 + }, + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:36.646865Z", + "finished_at": "2026-08-01T16:09:36.646867Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 0, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "COMBINED-ALL", + "group": "combined", + "utterance": "打开副驾加热1档、打开通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:36.646875Z", + "finished_at": "2026-08-01T16:09:36.646876Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 30, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "COMBINED-OFF", + "group": "combined", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T16:09:36.646882Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160936-b6ccd7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 05 00 FF FF 00", + "timestamp": 31012.243721 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 05 00 10 27 00", + "timestamp": 31012.269407 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 05 00 FF FF 00", + "timestamp": 31012.296292 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 06 00 00 00 00", + "timestamp": 31012.322045 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 31012.330757 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 31012.330757 + } + }, + "captured_at": "2026-08-01T16:09:37.404046Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:37.485026Z", + "duration_ms": 838 + }, + { + "id": "MODE-EASY-ENTRY", + "group": "mode", + "utterance": "副驾执行轻松进出模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485095Z", + "finished_at": "2026-08-01T16:09:37.485097Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 100, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-OFFICE", + "group": "mode", + "utterance": "副驾执行办公模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485107Z", + "finished_at": "2026-08-01T16:09:37.485109Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 72, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-QUEEN", + "group": "mode", + "utterance": "副驾执行女王副驾行驶模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485115Z", + "finished_at": "2026-08-01T16:09:37.485117Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 72, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-BABY-NAP", + "group": "mode", + "utterance": "副驾执行宝宝午睡模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485124Z", + "finished_at": "2026-08-01T16:09:37.485125Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 81, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-CRUISE-SOFA", + "group": "mode", + "utterance": "副驾执行巡航沙发模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485132Z", + "finished_at": "2026-08-01T16:09:37.485133Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 51, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-MEDITATION", + "group": "mode", + "utterance": "副驾执行冥想空间模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485140Z", + "finished_at": "2026-08-01T16:09:37.485141Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 100, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-LEISURE", + "group": "mode", + "utterance": "副驾执行休闲躺椅模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485148Z", + "finished_at": "2026-08-01T16:09:37.485149Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 51, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-CALF", + "group": "mode", + "utterance": "副驾执行小腿解压悬浮模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485156Z", + "finished_at": "2026-08-01T16:09:37.485157Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 51, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-BEACH", + "group": "mode", + "utterance": "副驾执行电感沙滩椅模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485163Z", + "finished_at": "2026-08-01T16:09:37.485164Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 100, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-NAP", + "group": "mode", + "utterance": "副驾执行小憩模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485171Z", + "finished_at": "2026-08-01T16:09:37.485172Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 100, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + }, + { + "id": "MODE-ZERO-GRAVITY", + "group": "mode", + "utterance": "副驾执行零重力模式", + "status": "safety_blocked", + "started_at": "2026-08-01T16:09:37.485177Z", + "finished_at": "2026-08-01T16:09:37.485178Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "longitudinal", + "target_pct": 100, + "block_all_targets": true, + "reason": "M0 is position-invalid at the far endpoint and produced zero Hall pulses for near-direction absolute and homing commands at both 90% and 95% duty; inspect the mechanism, supply, bridge wiring and Hall path before more motion.", + "evidence": { + "hall_count": 499, + "pulse_count": 0, + "current_delta_raw_at_90_pct": 220, + "current_delta_raw_at_95_pct": 233, + "position_valid": false + } + } + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T16:09:37.485184Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801160937-a34c01", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 06 00 00 00 00", + "timestamp": 31013.066507 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 05 00 FF FF 00", + "timestamp": 31013.092274 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 05 00 10 27 00", + "timestamp": 31013.117968 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 00 05 00 FF FF 00", + "timestamp": 31013.144143 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 31013.15201 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 31013.15201 + } + }, + "captured_at": "2026-08-01T16:09:38.225339Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:09:38.306618Z", + "duration_ms": 821 + }, + "finished_at": "2026-08-01T16:09:38.306667Z", + "summary": { + "total": 33, + "passed": 12, + "failed": 0, + "safety_blocked": 21, + "executed": 12, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260801_run1.json b/artifacts/hil/seat_frontend_hil_20260801_run1.json new file mode 100644 index 0000000..e9f1fa8 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260801_run1.json @@ -0,0 +1,3352 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T14:14:47.917400Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801141447", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "THERM-H-1", + "group": "thermal", + "utterance": "副驾座椅加热开到1档", + "started_at": "2026-08-01T14:14:47.917460Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141447-6d94bf", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 F4 0B 00", + "timestamp": 24123.411518 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 7229, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 08 00 00 3D 1C 00", + "timestamp": 24123.437299 + } + }, + "cushion_tilt": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 3743, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 08 00 00 9F 0E 00", + "timestamp": 24123.463555 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 4B 11 00", + "timestamp": 24123.489414 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 24123.497273 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 24123.497273 + } + }, + "captured_at": "2026-08-01T14:14:48.722550Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:14:48.802959Z", + "duration_ms": 886 + }, + { + "id": "THERM-H-2", + "group": "thermal", + "utterance": "副驾座椅加热开到2档", + "started_at": "2026-08-01T14:14:48.803012Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141448-b14ec4", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 7229, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 08 00 00 3D 1C 00", + "timestamp": 24124.299453 + } + }, + "cushion_tilt": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 3743, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 08 00 00 9F 0E 00", + "timestamp": 24124.325272 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 4B 11 00", + "timestamp": 24124.351111 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 F4 0B 00", + "timestamp": 24124.377319 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 24124.38524 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 24124.38524 + } + }, + "captured_at": "2026-08-01T14:14:49.610360Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:14:49.690777Z", + "duration_ms": 888 + }, + { + "id": "THERM-H-3", + "group": "thermal", + "utterance": "副驾座椅加热开到3档", + "started_at": "2026-08-01T14:14:49.690829Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141449-1da566", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 3743, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 08 00 00 9F 0E 00", + "timestamp": 24125.203986 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 4B 11 00", + "timestamp": 24125.229849 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 F4 0B 00", + "timestamp": 24125.255657 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 7229, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 08 00 00 3D 1C 00", + "timestamp": 24125.281928 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 24125.289845 + } + }, + "heating": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 24125.289845 + } + }, + "captured_at": "2026-08-01T14:14:50.514950Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:14:50.598949Z", + "duration_ms": 908 + }, + { + "id": "THERM-H-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅加热", + "started_at": "2026-08-01T14:14:50.599004Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141450-c3228f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 3743, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 08 00 00 9F 0E 00", + "timestamp": 24126.048902 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 4B 11 00", + "timestamp": 24126.075073 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 F4 0B 00", + "timestamp": 24126.101963 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 7229, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 08 00 00 3D 1C 00", + "timestamp": 24126.127704 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24126.135601 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24126.135601 + } + }, + "captured_at": "2026-08-01T14:14:51.360844Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:14:51.445633Z", + "duration_ms": 847 + }, + { + "id": "THERM-V-1", + "group": "thermal", + "utterance": "副驾座椅通风开到1档", + "started_at": "2026-08-01T14:14:51.445709Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141451-b0593e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 3743, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 08 00 00 9F 0E 00", + "timestamp": 24126.929876 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 4B 11 00", + "timestamp": 24126.955577 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 F4 0B 00", + "timestamp": 24126.981777 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 7229, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 08 00 00 3D 1C 00", + "timestamp": 24127.007498 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 24127.015439 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 24127.015439 + } + }, + "captured_at": "2026-08-01T14:14:52.240452Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:14:52.313460Z", + "duration_ms": 868 + }, + { + "id": "THERM-V-2", + "group": "thermal", + "utterance": "副驾座椅通风开到2档", + "started_at": "2026-08-01T14:14:52.313513Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141452-9c0117", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 3743, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 08 00 00 9F 0E 00", + "timestamp": 24127.807124 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 4B 11 00", + "timestamp": 24127.834033 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 F4 0B 00", + "timestamp": 24127.859853 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 7229, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 08 00 00 3D 1C 00", + "timestamp": 24127.885972 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 24127.892765 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 24127.892765 + } + }, + "captured_at": "2026-08-01T14:14:53.117893Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:14:53.196231Z", + "duration_ms": 883 + }, + { + "id": "THERM-V-3", + "group": "thermal", + "utterance": "副驾座椅通风开到3档", + "started_at": "2026-08-01T14:14:53.196282Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141453-731eeb", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 3743, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 08 00 00 9F 0E 00", + "timestamp": 24128.637499 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 4B 11 00", + "timestamp": 24128.663729 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 F4 0B 00", + "timestamp": 24128.689508 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 7229, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 08 00 00 3D 1C 00", + "timestamp": 24128.715271 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 24128.725394 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 24128.725394 + } + }, + "captured_at": "2026-08-01T14:14:53.950551Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:14:54.033330Z", + "duration_ms": 837 + }, + { + "id": "THERM-V-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅通风", + "started_at": "2026-08-01T14:14:54.033396Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141454-49641e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 3743, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 08 00 00 9F 0E 00", + "timestamp": 24129.503147 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 4B 11 00", + "timestamp": 24129.530063 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 F4 0B 00", + "timestamp": 24129.55577 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 7229, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 08 00 00 3D 1C 00", + "timestamp": 24129.581974 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24129.58987 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24129.58987 + } + }, + "captured_at": "2026-08-01T14:14:54.814846Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:14:54.898071Z", + "duration_ms": 865 + }, + { + "id": "MOTION-M0-25", + "group": "motion", + "utterance": "把副驾座椅水平位置调到25%", + "started_at": "2026-08-01T14:14:54.898127Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141454-dbc16e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 2500, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 02 00 C4 09 00", + "timestamp": 24141.694235 + } + }, + "cushion_tilt": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3743, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 01 00 9F 0E 00", + "timestamp": 24141.720266 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 01 00 4B 11 00", + "timestamp": 24141.746297 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 01 00 F4 0B 00", + "timestamp": 24141.771625 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24141.780738 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24141.780738 + } + }, + "captured_at": "2026-08-01T14:15:07.005696Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:15:07.088819Z", + "duration_ms": 12191 + }, + { + "id": "MOTION-M0-75", + "group": "motion", + "utterance": "把副驾座椅水平位置调到75%", + "started_at": "2026-08-01T14:15:07.088874Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141507-d92525", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 03 00 F4 0B 00", + "timestamp": 24149.95811 + } + }, + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7521, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 04 00 61 1D 00", + "timestamp": 24149.984592 + } + }, + "cushion_tilt": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3743, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 03 00 9F 0E 00", + "timestamp": 24150.009475 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 03 00 4B 11 00", + "timestamp": 24150.035554 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24150.045799 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24150.045799 + } + }, + "captured_at": "2026-08-01T14:15:15.270556Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:15:15.347868Z", + "duration_ms": 8259 + }, + { + "id": "MOTION-M1-20", + "group": "motion", + "utterance": "把副驾坐盆调到20%", + "started_at": "2026-08-01T14:15:15.347936Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141515-725041", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2005, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 06 00 D5 07 00", + "timestamp": 24152.34201 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 05 00 4B 11 00", + "timestamp": 24152.368492 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 05 00 F4 0B 00", + "timestamp": 24152.394569 + } + }, + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 7521, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 05 00 61 1D 00", + "timestamp": 24152.4206 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24152.429711 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24152.429711 + } + }, + "captured_at": "2026-08-01T14:15:17.654358Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:15:17.738126Z", + "duration_ms": 2390 + }, + { + "id": "MOTION-M1-60", + "group": "motion", + "utterance": "把副驾坐盆调到60%", + "started_at": "2026-08-01T14:15:17.738191Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141517-936748", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 08 00 65 17 00", + "timestamp": 24156.567977 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 4427, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 07 00 4B 11 00", + "timestamp": 24156.594054 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 07 00 F4 0B 00", + "timestamp": 24156.620108 + } + }, + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 7521, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 07 00 61 1D 00", + "timestamp": 24156.646171 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24156.653 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24156.653 + } + }, + "captured_at": "2026-08-01T14:15:21.877523Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:15:21.956939Z", + "duration_ms": 4219 + }, + { + "id": "MOTION-M2-25", + "group": "motion", + "utterance": "把副驾靠背调到25%", + "started_at": "2026-08-01T14:15:21.957019Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141521-e4b6fa", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 09 00 65 17 00", + "timestamp": 24161.718216 + } + }, + "backrest_recline": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2486, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 0A 00 B6 09 00", + "timestamp": 24161.744267 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 09 00 F4 0B 00", + "timestamp": 24161.770723 + } + }, + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 7521, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 09 00 61 1D 00", + "timestamp": 24161.796778 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24161.805891 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24161.805891 + } + }, + "captured_at": "2026-08-01T14:15:27.030248Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:15:27.117762Z", + "duration_ms": 5161 + }, + { + "id": "MOTION-M2-60", + "group": "motion", + "utterance": "把副驾靠背调到60%", + "started_at": "2026-08-01T14:15:27.117827Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141527-e7c6f8", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 3060, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 0B 00 F4 0B 00", + "timestamp": 24171.276607 + } + }, + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 7521, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 0B 00 61 1D 00", + "timestamp": 24171.302616 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 0B 00 65 17 00", + "timestamp": 24171.328736 + } + }, + "backrest_recline": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 0C 00 79 17 00", + "timestamp": 24171.354781 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24171.362738 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24171.362738 + } + }, + "captured_at": "2026-08-01T14:15:36.586905Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:15:36.658970Z", + "duration_ms": 9541 + }, + { + "id": "MOTION-M3-20", + "group": "motion", + "utterance": "把副驾腿托调到20%", + "started_at": "2026-08-01T14:15:36.659041Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141536-c450d3", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 6009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 0D 00 79 17 00", + "timestamp": 24173.68069 + } + }, + "legrest_height": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 1978, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 0E 00 BA 07 00", + "timestamp": 24173.706743 + } + }, + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 7521, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 0D 00 61 1D 00", + "timestamp": 24173.732784 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 0D 00 65 17 00", + "timestamp": 24173.758876 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24173.768427 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24173.768427 + } + }, + "captured_at": "2026-08-01T14:15:38.992583Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:15:39.064026Z", + "duration_ms": 2405 + }, + { + "id": "MOTION-M3-60", + "group": "motion", + "utterance": "把副驾腿托调到60%", + "started_at": "2026-08-01T14:15:39.064084Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141539-a9fe4a", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 0F 00 65 17 00", + "timestamp": 24180.47683 + } + }, + "backrest_recline": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 6009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 0F 00 79 17 00", + "timestamp": 24180.502847 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5997, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 10 00 6D 17 00", + "timestamp": 24180.528991 + } + }, + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 7521, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 0F 00 61 1D 00", + "timestamp": 24180.555066 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24180.563025 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24180.563025 + } + }, + "captured_at": "2026-08-01T14:15:45.786997Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:15:45.863213Z", + "duration_ms": 6799 + }, + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T14:15:45.863269Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141545-f60574", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 16 00 00 00 00", + "timestamp": 24235.453923 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 17 00 00 00 00", + "timestamp": 24235.479979 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 12 00 00 00 00", + "timestamp": 24235.505706 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 15 00 00 00 00", + "timestamp": 24235.532537 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24235.539318 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24235.539318 + } + }, + "captured_at": "2026-08-01T14:16:40.761936Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:16:40.850651Z", + "duration_ms": 54987 + }, + { + "id": "COMBINED-ALL", + "group": "combined", + "utterance": "副驾加热1档、通风1档,座椅水平到30%,坐盆到25%,靠背到120度,腿托到125度", + "started_at": "2026-08-01T14:16:40.850721Z", + "status": "failed", + "errors": [ + "request failed" + ], + "http_status": 201, + "request_id": "req-20260801141640-49e911", + "finished_at": "2026-08-01T14:16:40.871779Z", + "duration_ms": 21 + }, + { + "id": "COMBINED-OFF", + "group": "combined", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T14:16:40.871816Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141640-363924", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 15 00 00 00 00", + "timestamp": 24236.31008 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 16 00 00 00 00", + "timestamp": 24236.335863 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 17 00 00 00 00", + "timestamp": 24236.361559 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 12 00 00 00 00", + "timestamp": 24236.38765 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24236.396631 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24236.396631 + } + }, + "captured_at": "2026-08-01T14:16:41.619394Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:16:41.694263Z", + "duration_ms": 822 + }, + { + "id": "MODE-EASY-ENTRY", + "group": "mode", + "utterance": "副驾执行轻松进出模式", + "started_at": "2026-08-01T14:16:41.694321Z", + "status": "failed", + "errors": [ + "T2G motor 0 STALL: task_state=7, Hall=0->383" + ], + "http_status": 201, + "request_id": "req-20260801141641-09e041", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 5, + "motor_result_name": "STALL", + "position_valid": true, + "hall_before": 0, + "hall_after": 383, + "hall_delta": 383, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 10 19 00 10 27 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 19 00 01 01 F0 3F", + "timestamp": 24236.782792 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 57 48 19 00 2B 1F 00", + "timestamp": 24255.522487 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 00 00 00 E0 01 00 F0", + "timestamp": 24236.780998 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 14 7F 01 E0 01 00 71", + "timestamp": 24255.524798 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 184, + "valid_sample_count": 184, + "max_current_raw": 824, + "max_current_delta_raw": 822, + "high_current_seen": true, + "low_hall_seen": true, + "stall_overlap_seen": true, + "peak": { + "current_raw": 824, + "current_baseline_raw": 2, + "current_delta_raw": 822, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0F 38 03 02 00 F4 01", + "timestamp": 24251.756916 + } + }, + "latest": { + "current_raw": 779, + "current_baseline_raw": 4, + "current_delta_raw": 775, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0F 0B 03 04 00 F4 01", + "timestamp": 24255.503046 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:17:00.843956Z", + "duration_ms": 19150 + }, + { + "id": "MODE-OFFICE", + "group": "mode", + "utterance": "副驾执行办公模式", + "started_at": "2026-08-01T14:17:00.844003Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141700-81b370", + "matched_modes": [ + "office" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 21, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2102, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 1F 00 36 08 00", + "timestamp": 24275.546517 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7208, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 1C 00 28 1C 00", + "timestamp": 24275.574062 + } + }, + "cushion_tilt": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2193, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 1D 00 91 08 00", + "timestamp": 24275.599004 + } + }, + "backrest_recline": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2203, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 1E 00 9B 08 00", + "timestamp": 24275.625093 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24275.634162 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24275.634162 + } + }, + "captured_at": "2026-08-01T14:17:20.855960Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:17:20.947339Z", + "duration_ms": 20103 + }, + { + "id": "MODE-QUEEN", + "group": "mode", + "utterance": "副驾执行女王副驾行驶模式", + "started_at": "2026-08-01T14:17:20.947416Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141720-c5ea05", + "matched_modes": [ + "queen_passenger_driving" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 3122, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 24 00 32 0C 00", + "timestamp": 24292.875064 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7208, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 21 00 28 1C 00", + "timestamp": 24292.901064 + } + }, + "cushion_tilt": { + "position_pct": 38, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3797, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 22 00 D5 0E 00", + "timestamp": 24292.927157 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4406, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 23 00 36 11 00", + "timestamp": 24292.953161 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24292.963404 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24292.963404 + } + }, + "captured_at": "2026-08-01T14:17:38.184818Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:17:38.266338Z", + "duration_ms": 17319 + }, + { + "id": "MODE-BABY-NAP", + "group": "mode", + "utterance": "副驾执行宝宝午睡模式", + "started_at": "2026-08-01T14:17:38.266432Z", + "status": "failed", + "errors": [ + "T2G motor 1 STALL: task_state=7, Hall=142->123" + ], + "http_status": 201, + "request_id": "req-20260801141738-191223", + "failure_telemetry": { + "motor_selector": 1, + "motion_axis": "cushion_tilt", + "task_state": 7, + "motor_result": 5, + "motor_result_name": "STALL", + "position_valid": true, + "hall_before": 142, + "hall_after": 123, + "hall_delta": 19, + "endpoint_recovery_max_near_hall": 56, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 11 27 00 B8 0B 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 27 00 01 02 F0 3A", + "timestamp": 24296.662852 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 57 48 27 00 D9 0C 00", + "timestamp": 24305.923277 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "01 00 8E 00 76 01 00 00", + "timestamp": 24294.693346 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "01 14 7B 00 76 01 00 F1", + "timestamp": 24305.924445 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 111, + "valid_sample_count": 111, + "max_current_raw": 1365, + "max_current_delta_raw": 1363, + "high_current_seen": true, + "low_hall_seen": true, + "stall_overlap_seen": true, + "peak": { + "current_raw": 1365, + "current_baseline_raw": 2, + "current_delta_raw": 1363, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "01 07 55 05 02 00 F4 01", + "timestamp": 24304.696515 + } + }, + "latest": { + "current_raw": 1297, + "current_baseline_raw": 2, + "current_delta_raw": 1295, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "01 0F 11 05 02 00 F4 01", + "timestamp": 24305.841614 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:17:51.354874Z", + "duration_ms": 13088 + }, + { + "id": "MODE-CRUISE-SOFA", + "group": "mode", + "utterance": "副驾执行巡航沙发模式", + "started_at": "2026-08-01T14:17:51.354933Z", + "status": "failed", + "errors": [ + "T2G motor 1 STALL: task_state=7, Hall=123->123" + ], + "http_status": 201, + "request_id": "req-20260801141751-d704a2", + "failure_telemetry": { + "motor_selector": 1, + "motion_axis": "cushion_tilt", + "task_state": 7, + "motor_result": 5, + "motor_result_name": "STALL", + "position_valid": true, + "hall_before": 123, + "hall_after": 123, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 56, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 11 2B 00 B8 0B 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 2B 00 01 02 F0 39", + "timestamp": 24313.372947 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 57 48 2B 00 D9 0C 00", + "timestamp": 24318.775514 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "01 04 7B 00 76 01 00 50", + "timestamp": 24311.475176 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "01 14 7B 00 76 01 00 F1", + "timestamp": 24318.776702 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 74, + "valid_sample_count": 74, + "max_current_raw": 1312, + "max_current_delta_raw": 1312, + "high_current_seen": true, + "low_hall_seen": true, + "stall_overlap_seen": true, + "peak": { + "current_raw": 1312, + "current_baseline_raw": 0, + "current_delta_raw": 1312, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "01 07 20 05 00 00 F4 01", + "timestamp": 24313.559687 + } + }, + "latest": { + "current_raw": 1251, + "current_baseline_raw": 1, + "current_delta_raw": 1250, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "01 0F E3 04 01 00 F4 01", + "timestamp": 24318.766784 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:18:04.188710Z", + "duration_ms": 12834 + }, + { + "id": "MODE-MEDITATION", + "group": "mode", + "utterance": "副驾执行冥想空间模式", + "started_at": "2026-08-01T14:18:04.188762Z", + "status": "failed", + "errors": [ + "T2G motor 0 STALL: task_state=7, Hall=245->403" + ], + "http_status": 201, + "request_id": "req-20260801141804-a5f1c3", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 5, + "motor_result_name": "STALL", + "position_valid": true, + "hall_before": 245, + "hall_after": 403, + "hall_delta": 158, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 10 2E 00 10 27 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 2E 00 01 01 F0 39", + "timestamp": 24319.304308 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 57 48 2E 00 CC 20 00", + "timestamp": 24328.676049 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 00 F5 00 E0 01 00 C0", + "timestamp": 24319.302359 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 14 93 01 E0 01 00 A1", + "timestamp": 24328.677195 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 94, + "valid_sample_count": 94, + "max_current_raw": 901, + "max_current_delta_raw": 897, + "high_current_seen": true, + "low_hall_seen": true, + "stall_overlap_seen": true, + "peak": { + "current_raw": 901, + "current_baseline_raw": 4, + "current_delta_raw": 897, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 07 85 03 04 00 F4 01", + "timestamp": 24327.070476 + } + }, + "latest": { + "current_raw": 776, + "current_baseline_raw": 4, + "current_delta_raw": 772, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0F 08 03 04 00 F4 01", + "timestamp": 24328.63209 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:18:14.093374Z", + "duration_ms": 9905 + }, + { + "id": "MODE-LEISURE", + "group": "mode", + "utterance": "副驾执行休闲躺椅模式", + "started_at": "2026-08-01T14:18:14.093456Z", + "status": "failed", + "errors": [ + "T2G motor 1 STALL: task_state=7, Hall=123->123" + ], + "http_status": 201, + "request_id": "req-20260801141814-c17545", + "failure_telemetry": { + "motor_selector": 1, + "motion_axis": "cushion_tilt", + "task_state": 7, + "motor_result": 5, + "motor_result_name": "STALL", + "position_valid": true, + "hall_before": 123, + "hall_after": 123, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 56, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 11 32 00 B8 0B 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 32 00 01 02 F0 31", + "timestamp": 24337.068067 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 57 48 32 00 D9 0C 00", + "timestamp": 24342.475585 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "01 04 7B 00 76 01 00 D0", + "timestamp": 24335.192888 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "01 14 7B 00 76 01 00 61", + "timestamp": 24342.477926 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 73, + "valid_sample_count": 73, + "max_current_raw": 1337, + "max_current_delta_raw": 1337, + "high_current_seen": true, + "low_hall_seen": true, + "stall_overlap_seen": true, + "peak": { + "current_raw": 1337, + "current_baseline_raw": 0, + "current_delta_raw": 1337, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "01 07 39 05 00 00 F4 01", + "timestamp": 24337.378712 + } + }, + "latest": { + "current_raw": 1061, + "current_baseline_raw": 2, + "current_delta_raw": 1059, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "01 0F 25 04 02 00 F4 01", + "timestamp": 24342.379171 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:18:27.856678Z", + "duration_ms": 13763 + }, + { + "id": "MODE-CALF", + "group": "mode", + "utterance": "副驾执行小腿解压悬浮模式", + "started_at": "2026-08-01T14:18:27.856734Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141827-927076", + "matched_modes": [ + "calf_decompression_float" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 35 00 F0 13 00", + "timestamp": 24380.870049 + } + }, + "cushion_tilt": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 7513, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 36 00 59 1D 00", + "timestamp": 24380.895299 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 37 00 00 00 00", + "timestamp": 24380.921326 + } + }, + "legrest_height": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": true, + "task_state": 7, + "motor_result": 6, + "motor_selector": 3, + "value_x100": 9954, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 67 08 38 00 E2 26 00", + "timestamp": 24380.947374 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24380.956429 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24380.956429 + } + }, + "captured_at": "2026-08-01T14:19:06.175744Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:19:06.248103Z", + "duration_ms": 38391 + }, + { + "id": "MODE-BEACH", + "group": "mode", + "utterance": "副驾执行电感沙滩椅模式", + "started_at": "2026-08-01T14:19:06.248167Z", + "status": "failed", + "errors": [ + "T2G motor 0 STALL: task_state=7, Hall=245->403" + ], + "http_status": 201, + "request_id": "req-20260801141906-e7f9a9", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 5, + "motor_result_name": "STALL", + "position_valid": true, + "hall_before": 245, + "hall_after": 403, + "hall_delta": 158, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 10 3A 00 10 27 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 3A 00 01 01 F0 38", + "timestamp": 24381.322731 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 57 48 3A 00 CC 20 00", + "timestamp": 24390.577474 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 00 F5 00 E0 01 00 30", + "timestamp": 24381.32081 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 14 93 01 E0 01 00 01", + "timestamp": 24390.57976 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 93, + "valid_sample_count": 93, + "max_current_raw": 889, + "max_current_delta_raw": 888, + "high_current_seen": true, + "low_hall_seen": true, + "stall_overlap_seen": true, + "peak": { + "current_raw": 889, + "current_baseline_raw": 1, + "current_delta_raw": 888, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0F 79 03 01 00 F4 01", + "timestamp": 24386.84949 + } + }, + "latest": { + "current_raw": 870, + "current_baseline_raw": 4, + "current_delta_raw": 866, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0F 66 03 04 00 F4 01", + "timestamp": 24390.498443 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:19:15.984934Z", + "duration_ms": 9737 + }, + { + "id": "MODE-NAP", + "group": "mode", + "utterance": "副驾执行小憩模式", + "started_at": "2026-08-01T14:19:15.984987Z", + "status": "failed", + "errors": [ + "T2G motor 0 STALL: task_state=7, Hall=403->403" + ], + "http_status": 201, + "request_id": "req-20260801141915-38651e", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 5, + "motor_result_name": "STALL", + "position_valid": true, + "hall_before": 403, + "hall_after": 403, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 10 3D 00 10 27 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 3D 00 01 01 F0 3E", + "timestamp": 24391.074151 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 57 48 3D 00 CC 20 00", + "timestamp": 24396.477417 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 04 93 01 E0 01 00 50", + "timestamp": 24391.072176 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 14 93 01 E0 01 00 D1", + "timestamp": 24396.478605 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 56, + "valid_sample_count": 56, + "max_current_raw": 883, + "max_current_delta_raw": 879, + "high_current_seen": true, + "low_hall_seen": true, + "stall_overlap_seen": true, + "peak": { + "current_raw": 883, + "current_baseline_raw": 4, + "current_delta_raw": 879, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 07 73 03 04 00 F4 01", + "timestamp": 24394.992622 + } + }, + "latest": { + "current_raw": 869, + "current_baseline_raw": 4, + "current_delta_raw": 865, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0F 65 03 04 00 F4 01", + "timestamp": 24396.448417 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:19:21.864717Z", + "duration_ms": 5880 + }, + { + "id": "MODE-ZERO-GRAVITY", + "group": "mode", + "utterance": "副驾执行零重力模式", + "started_at": "2026-08-01T14:19:21.864769Z", + "status": "failed", + "errors": [ + "T2G motor 0 STALL: task_state=7, Hall=403->403" + ], + "http_status": 201, + "request_id": "req-20260801141921-02f30a", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 5, + "motor_result_name": "STALL", + "position_valid": true, + "hall_before": 403, + "hall_after": 403, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 10 40 00 10 27 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 40 00 01 01 F0 3E", + "timestamp": 24396.931321 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 57 48 40 00 CC 20 00", + "timestamp": 24402.377888 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 04 93 01 E0 01 00 10", + "timestamp": 24396.929403 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 14 93 01 E0 01 00 91", + "timestamp": 24402.380189 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 56, + "valid_sample_count": 56, + "max_current_raw": 1010, + "max_current_delta_raw": 1005, + "high_current_seen": true, + "low_hall_seen": true, + "stall_overlap_seen": true, + "peak": { + "current_raw": 1010, + "current_baseline_raw": 5, + "current_delta_raw": 1005, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 07 F2 03 05 00 F4 01", + "timestamp": 24397.174325 + } + }, + "latest": { + "current_raw": 723, + "current_baseline_raw": 4, + "current_delta_raw": 719, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0F D3 02 04 00 F4 01", + "timestamp": 24402.278384 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:19:27.698586Z", + "duration_ms": 5834 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T14:19:27.698630Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801141927-c5b3af", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 41 00 00 00 00", + "timestamp": 24403.207866 + } + }, + "legrest_height": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9954, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 41 00 E2 26 00", + "timestamp": 24403.233854 + } + }, + "longitudinal": { + "position_pct": 84, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 8396, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 41 00 CC 20 00", + "timestamp": 24403.259871 + } + }, + "cushion_tilt": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 7513, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 41 00 59 1D 00", + "timestamp": 24403.286271 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24403.295364 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 24403.295364 + } + }, + "captured_at": "2026-08-01T14:19:28.514121Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:19:28.593969Z", + "duration_ms": 895 + }, + "finished_at": "2026-08-01T14:19:28.594006Z", + "summary": { + "total": 30, + "passed": 21, + "failed": 9, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260801_run2.json b/artifacts/hil/seat_frontend_hil_20260801_run2.json new file mode 100644 index 0000000..00e27fd --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260801_run2.json @@ -0,0 +1,3124 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T14:47:53.934816Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801144753", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "THERM-H-1", + "group": "thermal", + "utterance": "副驾座椅加热开到1档", + "started_at": "2026-08-01T14:47:53.934859Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144753-988889", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 03 00 10 27 00", + "timestamp": 26109.485787 + } + }, + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 03 00 BE 0C 00", + "timestamp": 26109.511466 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 26109.537484 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 26109.564307 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 26109.571052 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 26109.571052 + } + }, + "captured_at": "2026-08-01T14:47:54.749907Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:47:54.824802Z", + "duration_ms": 890 + }, + { + "id": "THERM-H-2", + "group": "thermal", + "utterance": "副驾座椅加热开到2档", + "started_at": "2026-08-01T14:47:54.824891Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144754-33c056", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 03 00 BE 0C 00", + "timestamp": 26110.355515 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 26110.382347 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 26110.408024 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 03 00 10 27 00", + "timestamp": 26110.434084 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 26110.441959 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 26110.441959 + } + }, + "captured_at": "2026-08-01T14:47:55.620824Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:47:55.695170Z", + "duration_ms": 870 + }, + { + "id": "THERM-H-3", + "group": "thermal", + "utterance": "副驾座椅加热开到3档", + "started_at": "2026-08-01T14:47:55.695219Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144755-ae87a8", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 26111.259381 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 26111.286198 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 03 00 10 27 00", + "timestamp": 26111.311936 + } + }, + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 03 00 BE 0C 00", + "timestamp": 26111.337967 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 26111.344752 + } + }, + "heating": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 26111.344752 + } + }, + "captured_at": "2026-08-01T14:47:56.523671Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:47:56.613352Z", + "duration_ms": 918 + }, + { + "id": "THERM-H-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅加热", + "started_at": "2026-08-01T14:47:56.613439Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144756-eecfde", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 26112.104499 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 26112.13051 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 03 00 10 27 00", + "timestamp": 26112.156092 + } + }, + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 03 00 BE 0C 00", + "timestamp": 26112.181763 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26112.189636 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26112.189636 + } + }, + "captured_at": "2026-08-01T14:47:57.368443Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:47:57.450915Z", + "duration_ms": 837 + }, + { + "id": "THERM-V-1", + "group": "thermal", + "utterance": "副驾座椅通风开到1档", + "started_at": "2026-08-01T14:47:57.450971Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144757-7e47fa", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 26112.965674 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 26112.992452 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 03 00 10 27 00", + "timestamp": 26113.018037 + } + }, + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 03 00 BE 0C 00", + "timestamp": 26113.044065 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 26113.05083 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 26113.05083 + } + }, + "captured_at": "2026-08-01T14:47:58.229707Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:47:58.316936Z", + "duration_ms": 866 + }, + { + "id": "THERM-V-2", + "group": "thermal", + "utterance": "副驾座椅通风开到2档", + "started_at": "2026-08-01T14:47:58.316996Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144758-f760ab", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 26113.844422 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 03 00 10 27 00", + "timestamp": 26113.870033 + } + }, + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 03 00 BE 0C 00", + "timestamp": 26113.895676 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 26113.92246 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 26113.929523 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 26113.929523 + } + }, + "captured_at": "2026-08-01T14:47:59.108221Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:47:59.185254Z", + "duration_ms": 868 + }, + { + "id": "THERM-V-3", + "group": "thermal", + "utterance": "副驾座椅通风开到3档", + "started_at": "2026-08-01T14:47:59.185309Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144759-72c9f8", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 26114.721784 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 03 00 10 27 00", + "timestamp": 26114.747721 + } + }, + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 03 00 BE 0C 00", + "timestamp": 26114.774501 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 26114.800136 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 26114.806853 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 26114.806853 + } + }, + "captured_at": "2026-08-01T14:47:59.985653Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:48:00.059998Z", + "duration_ms": 875 + }, + { + "id": "THERM-V-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅通风", + "started_at": "2026-08-01T14:48:00.060097Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144800-78c161", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 26115.566389 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 03 00 10 27 00", + "timestamp": 26115.592042 + } + }, + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 03 00 BE 0C 00", + "timestamp": 26115.61763 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 26115.643641 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26115.650392 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26115.650392 + } + }, + "captured_at": "2026-08-01T14:48:00.829027Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:48:00.907732Z", + "duration_ms": 848 + }, + { + "id": "MOTION-M0-25", + "group": "motion", + "utterance": "把副驾座椅水平位置调到25%", + "started_at": "2026-08-01T14:48:00.907808Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144800-dcbba9", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 2505, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 02 00 C9 09 00", + "timestamp": 26129.168333 + } + }, + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 01 00 BE 0C 00", + "timestamp": 26129.194219 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 01 00 00 00 00", + "timestamp": 26129.22013 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 01 00 00 00 00", + "timestamp": 26129.246414 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26129.255429 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26129.255429 + } + }, + "captured_at": "2026-08-01T14:48:14.433982Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:48:14.519285Z", + "duration_ms": 13611 + }, + { + "id": "MOTION-M0-75", + "group": "motion", + "utterance": "把副驾座椅水平位置调到75%", + "started_at": "2026-08-01T14:48:14.519361Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144814-f53e4f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 26137.808075 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 26137.834319 + } + }, + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7515, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 04 00 5B 1D 00", + "timestamp": 26137.860226 + } + }, + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 03 00 BE 0C 00", + "timestamp": 26137.886198 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26137.895214 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26137.895214 + } + }, + "captured_at": "2026-08-01T14:48:23.073478Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:48:23.148880Z", + "duration_ms": 8630 + }, + { + "id": "MOTION-M0-HOME", + "group": "motion", + "utterance": "把副驾座椅水平位置归零", + "started_at": "2026-08-01T14:48:23.148938Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144823-ceed48", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 05 00 00 00 00", + "timestamp": 26152.661095 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 06 00 00 00 00", + "timestamp": 26152.686683 + } + }, + "cushion_tilt": { + "position_pct": 33, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 3262, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 05 00 BE 0C 00", + "timestamp": 26152.7133 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 05 00 00 00 00", + "timestamp": 26152.739212 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26152.745961 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26152.745961 + } + }, + "captured_at": "2026-08-01T14:48:37.923828Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:48:37.999330Z", + "duration_ms": 14850 + }, + { + "id": "MOTION-M1-20", + "group": "motion", + "utterance": "把副驾坐盆调到20%", + "status": "safety_blocked", + "started_at": "2026-08-01T14:48:37.999413Z", + "finished_at": "2026-08-01T14:48:37.999416Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 20, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MOTION-M1-60", + "group": "motion", + "utterance": "把副驾坐盆调到60%", + "started_at": "2026-08-01T14:48:37.999426Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144838-bf48e6", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 07 00 00 00 00", + "timestamp": 26155.728861 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 08 00 65 17 00", + "timestamp": 26155.754981 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 07 00 00 00 00", + "timestamp": 26155.78086 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 07 00 00 00 00", + "timestamp": 26155.806675 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26155.815708 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26155.815708 + } + }, + "captured_at": "2026-08-01T14:48:40.993469Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:48:41.076130Z", + "duration_ms": 3077 + }, + { + "id": "MOTION-M2-25", + "group": "motion", + "utterance": "把副驾靠背调到25%", + "started_at": "2026-08-01T14:48:41.076205Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144841-5ecd0e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 09 00 00 00 00", + "timestamp": 26163.365098 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 09 00 00 00 00", + "timestamp": 26163.391032 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 09 00 65 17 00", + "timestamp": 26163.416891 + } + }, + "backrest_recline": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2497, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 0A 00 C1 09 00", + "timestamp": 26163.443177 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26163.452244 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26163.452244 + } + }, + "captured_at": "2026-08-01T14:48:48.629917Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:48:48.714157Z", + "duration_ms": 7638 + }, + { + "id": "MOTION-M2-60", + "group": "motion", + "utterance": "把副驾靠背调到60%", + "started_at": "2026-08-01T14:48:48.714243Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144848-c30cb7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 0C 00 79 17 00", + "timestamp": 26173.582967 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 0B 00 00 00 00", + "timestamp": 26173.609993 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 0B 00 00 00 00", + "timestamp": 26173.637376 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 0B 00 65 17 00", + "timestamp": 26173.663288 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26173.670129 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26173.670129 + } + }, + "captured_at": "2026-08-01T14:48:58.847583Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:48:58.933047Z", + "duration_ms": 10219 + }, + { + "id": "MOTION-M2-HOME", + "group": "motion", + "utterance": "把副驾靠背归零", + "started_at": "2026-08-01T14:48:58.933114Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144858-3922e7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 0D 00 65 17 00", + "timestamp": 26193.099722 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 0E 00 00 00 00", + "timestamp": 26193.126386 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 0D 00 00 00 00", + "timestamp": 26193.152327 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 0D 00 00 00 00", + "timestamp": 26193.177827 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26193.184603 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26193.184603 + } + }, + "captured_at": "2026-08-01T14:49:18.361677Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:49:18.449538Z", + "duration_ms": 19516 + }, + { + "id": "MOTION-M3-20", + "group": "motion", + "utterance": "把副驾腿托调到20%", + "started_at": "2026-08-01T14:49:18.449600Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144918-951f7c", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 10 00 D9 07 00", + "timestamp": 26196.941121 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 0F 00 00 00 00", + "timestamp": 26196.965915 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 0F 00 65 17 00", + "timestamp": 26196.991822 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 0F 00 00 00 00", + "timestamp": 26197.017723 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26197.026776 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26197.026776 + } + }, + "captured_at": "2026-08-01T14:49:22.203767Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:49:22.277844Z", + "duration_ms": 3828 + }, + { + "id": "MOTION-M3-60", + "group": "motion", + "utterance": "把副驾腿托调到60%", + "started_at": "2026-08-01T14:49:22.277908Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144922-1b57d6", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 11 00 00 00 00", + "timestamp": 26203.64114 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 11 00 65 17 00", + "timestamp": 26203.665936 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 11 00 00 00 00", + "timestamp": 26203.691853 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5997, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 12 00 6D 17 00", + "timestamp": 26203.717778 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26203.726853 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26203.726853 + } + }, + "captured_at": "2026-08-01T14:49:28.903539Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:49:28.974791Z", + "duration_ms": 6697 + }, + { + "id": "MOTION-M3-HOME", + "group": "motion", + "utterance": "把副驾腿托归零", + "started_at": "2026-08-01T14:49:28.974852Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144928-eb6dd3", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 14 00 00 00 00", + "timestamp": 26214.161987 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 13 00 00 00 00", + "timestamp": 26214.188619 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 13 00 65 17 00", + "timestamp": 26214.214158 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 13 00 00 00 00", + "timestamp": 26214.240817 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26214.246755 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26214.246755 + } + }, + "captured_at": "2026-08-01T14:49:39.423263Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:49:39.500644Z", + "duration_ms": 10526 + }, + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "status": "safety_blocked", + "started_at": "2026-08-01T14:49:39.500708Z", + "finished_at": "2026-08-01T14:49:39.500710Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 0, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "COMBINED-ALL", + "group": "combined", + "utterance": "打开副驾加热1档、打开通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%", + "started_at": "2026-08-01T14:49:39.500720Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801144939-36cbec", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3708, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 18 00 7C 0E 00", + "timestamp": 26247.946715 + } + }, + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4204, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 19 00 6C 10 00", + "timestamp": 26247.972824 + } + }, + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 3026, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 16 00 D2 0B 00", + "timestamp": 26247.998934 + } + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4011, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 17 00 AB 0F 00", + "timestamp": 26248.025073 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 26248.031936 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 26248.031936 + } + }, + "captured_at": "2026-08-01T14:50:13.207616Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:50:13.288554Z", + "duration_ms": 33788 + }, + { + "id": "COMBINED-OFF", + "group": "combined", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T14:50:13.288653Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801145013-7339f7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4011, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 17 00 AB 0F 00", + "timestamp": 26248.798682 + } + }, + "backrest_recline": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3708, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 18 00 7C 0E 00", + "timestamp": 26248.824729 + } + }, + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4204, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 19 00 6C 10 00", + "timestamp": 26248.851193 + } + }, + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 3026, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 16 00 D2 0B 00", + "timestamp": 26248.877212 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26248.886329 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26248.886329 + } + }, + "captured_at": "2026-08-01T14:50:14.062054Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:50:14.142370Z", + "duration_ms": 854 + }, + { + "id": "MODE-EASY-ENTRY", + "group": "mode", + "utterance": "副驾执行轻松进出模式", + "status": "safety_blocked", + "started_at": "2026-08-01T14:50:14.142478Z", + "finished_at": "2026-08-01T14:50:14.142483Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 0, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MODE-OFFICE", + "group": "mode", + "utterance": "副驾执行办公模式", + "status": "safety_blocked", + "started_at": "2026-08-01T14:50:14.142499Z", + "finished_at": "2026-08-01T14:50:14.142502Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 22, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MODE-QUEEN", + "group": "mode", + "utterance": "副驾执行女王副驾行驶模式", + "started_at": "2026-08-01T14:50:14.142517Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801145014-70664a", + "matched_modes": [ + "queen_passenger_driving" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 3091, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 1E 00 13 0C 00", + "timestamp": 26265.676052 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7214, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 1B 00 2E 1C 00", + "timestamp": 26265.702155 + } + }, + "cushion_tilt": { + "position_pct": 38, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3797, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 1C 00 D5 0E 00", + "timestamp": 26265.728141 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4406, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 1D 00 36 11 00", + "timestamp": 26265.75347 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26265.762581 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26265.762581 + } + }, + "captured_at": "2026-08-01T14:50:30.937958Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:50:31.019740Z", + "duration_ms": 16877 + }, + { + "id": "MODE-BABY-NAP", + "group": "mode", + "utterance": "副驾执行宝宝午睡模式", + "status": "safety_blocked", + "started_at": "2026-08-01T14:50:31.019838Z", + "finished_at": "2026-08-01T14:50:31.019840Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 30, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MODE-CRUISE-SOFA", + "group": "mode", + "utterance": "副驾执行巡航沙发模式", + "status": "safety_blocked", + "started_at": "2026-08-01T14:50:31.019849Z", + "finished_at": "2026-08-01T14:50:31.019851Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 30, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MODE-MEDITATION", + "group": "mode", + "utterance": "副驾执行冥想空间模式", + "started_at": "2026-08-01T14:50:31.019858Z", + "status": "failed", + "errors": [ + "T2G motor 0 STALL: task_state=7, Hall=360->403" + ], + "http_status": 201, + "request_id": "req-20260801145031-38266e", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 5, + "motor_result_name": "STALL", + "position_valid": true, + "hall_before": 360, + "hall_after": 403, + "hall_delta": 43, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 10 20 00 10 27 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 20 00 01 01 F0 44", + "timestamp": 26266.161915 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 57 48 20 00 8C 1F 00", + "timestamp": 26276.392137 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 00 68 01 F3 01 00 D0", + "timestamp": 26266.159916 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 14 93 01 F3 01 00 31", + "timestamp": 26276.393289 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 102, + "valid_sample_count": 102, + "max_current_raw": 786, + "max_current_delta_raw": 786, + "high_current_seen": true, + "low_hall_seen": true, + "stall_overlap_seen": true, + "peak": { + "current_raw": 786, + "current_baseline_raw": 0, + "current_delta_raw": 786, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0F 12 03 00 00 F4 01", + "timestamp": 26272.600559 + } + }, + "latest": { + "current_raw": 761, + "current_baseline_raw": 4, + "current_delta_raw": 757, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0F F9 02 04 00 F4 01", + "timestamp": 26276.348574 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:50:41.708093Z", + "duration_ms": 10688 + }, + { + "id": "MODE-LEISURE", + "group": "mode", + "utterance": "副驾执行休闲躺椅模式", + "status": "safety_blocked", + "started_at": "2026-08-01T14:50:41.708148Z", + "finished_at": "2026-08-01T14:50:41.708150Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 30, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MODE-CALF", + "group": "mode", + "utterance": "副驾执行小腿解压悬浮模式", + "started_at": "2026-08-01T14:50:41.708159Z", + "status": "failed", + "errors": [ + "T2G motor 0 TIMEOUT: task_state=7, Hall=403->403" + ], + "http_status": 201, + "request_id": "req-20260801145041-9ad1e3", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 6, + "motor_result_name": "TIMEOUT", + "position_valid": true, + "hall_before": 403, + "hall_after": 403, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 10 23 00 EC 13 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 23 00 01 01 F0 44", + "timestamp": 26276.844086 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 67 08 23 00 8C 1F 00", + "timestamp": 26283.391631 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 04 93 01 F3 01 00 70", + "timestamp": 26276.842135 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 05 93 01 F3 01 00 80", + "timestamp": 26283.392777 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 65, + "valid_sample_count": 65, + "max_current_raw": 261, + "max_current_delta_raw": 257, + "high_current_seen": false, + "low_hall_seen": true, + "stall_overlap_seen": false, + "peak": { + "current_raw": 261, + "current_baseline_raw": 4, + "current_delta_raw": 257, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 03 05 01 04 00 F4 01", + "timestamp": 26276.878946 + } + }, + "latest": { + "current_raw": 209, + "current_baseline_raw": 4, + "current_delta_raw": 205, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0B D1 00 04 00 F4 01", + "timestamp": 26283.333981 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:50:48.717928Z", + "duration_ms": 7010 + }, + { + "id": "MODE-BEACH", + "group": "mode", + "utterance": "副驾执行电感沙滩椅模式", + "status": "safety_blocked", + "started_at": "2026-08-01T14:50:48.717980Z", + "finished_at": "2026-08-01T14:50:48.717982Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 0, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MODE-NAP", + "group": "mode", + "utterance": "副驾执行小憩模式", + "started_at": "2026-08-01T14:50:48.717991Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801145048-75799d", + "matched_modes": [ + "nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 29 00 B5 24 00", + "timestamp": 26322.562423 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 26 00 10 27 00", + "timestamp": 26322.588512 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 27 00 10 27 00", + "timestamp": 26322.614652 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 28 00 A7 1F 00", + "timestamp": 26322.640737 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26322.651384 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26322.651384 + } + }, + "captured_at": "2026-08-01T14:51:27.825471Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:51:27.901781Z", + "duration_ms": 39184 + }, + { + "id": "MODE-ZERO-GRAVITY", + "group": "mode", + "utterance": "副驾执行零重力模式", + "started_at": "2026-08-01T14:51:27.901869Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801145127-214380", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 2E 00 B5 24 00", + "timestamp": 26329.365561 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 2B 00 10 27 00", + "timestamp": 26329.391612 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 2C 00 10 27 00", + "timestamp": 26329.417696 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 2D 00 A7 1F 00", + "timestamp": 26329.442725 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26329.45217 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26329.45217 + } + }, + "captured_at": "2026-08-01T14:51:34.625915Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:51:34.701037Z", + "duration_ms": 6799 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T14:51:34.701100Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801145134-275e25", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 2D 00 A7 1F 00", + "timestamp": 26330.235576 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 2E 00 B5 24 00", + "timestamp": 26330.260914 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 2B 00 10 27 00", + "timestamp": 26330.286997 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 2C 00 10 27 00", + "timestamp": 26330.313124 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26330.323377 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26330.323377 + } + }, + "captured_at": "2026-08-01T14:51:35.497204Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:51:35.579514Z", + "duration_ms": 878 + }, + "finished_at": "2026-08-01T14:51:35.579548Z", + "summary": { + "total": 33, + "passed": 23, + "failed": 2, + "safety_blocked": 8, + "executed": 25, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260801_run3_modes.json b/artifacts/hil/seat_frontend_hil_20260801_run3_modes.json new file mode 100644 index 0000000..796c696 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260801_run3_modes.json @@ -0,0 +1,764 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T14:53:29.226676Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801145329", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MODE-QUEEN", + "group": "mode", + "utterance": "副驾执行女王副驾行驶模式", + "started_at": "2026-08-01T14:53:29.226724Z", + "status": "failed", + "errors": [ + "T2G motor 0 TIMEOUT: task_state=7, Hall=499->499" + ], + "http_status": 201, + "request_id": "req-20260801145329-c441d5", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 6, + "motor_result_name": "TIMEOUT", + "position_valid": true, + "hall_before": 499, + "hall_after": 499, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 10 30 00 20 1C 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 30 00 01 01 F0 4B", + "timestamp": 26444.37267 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 67 28 30 00 10 27 00", + "timestamp": 26450.902006 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 00 F3 01 F3 01 00 90", + "timestamp": 26444.360963 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 05 F3 01 F3 01 00 A0", + "timestamp": 26450.903153 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 65, + "valid_sample_count": 65, + "max_current_raw": 214, + "max_current_delta_raw": 213, + "high_current_seen": false, + "low_hall_seen": true, + "stall_overlap_seen": false, + "peak": { + "current_raw": 214, + "current_baseline_raw": 1, + "current_delta_raw": 213, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0B D6 00 01 00 F4 01", + "timestamp": 26449.53215 + } + }, + "latest": { + "current_raw": 212, + "current_baseline_raw": 1, + "current_delta_raw": 211, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0B D4 00 01 00 F4 01", + "timestamp": 26450.886864 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:53:36.269029Z", + "duration_ms": 7042 + }, + { + "id": "MODE-BABY-NAP", + "group": "mode", + "utterance": "副驾执行宝宝午睡模式", + "status": "safety_blocked", + "started_at": "2026-08-01T14:53:36.269096Z", + "finished_at": "2026-08-01T14:53:36.269098Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 30, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MODE-CRUISE-SOFA", + "group": "mode", + "utterance": "副驾执行巡航沙发模式", + "status": "safety_blocked", + "started_at": "2026-08-01T14:53:36.269107Z", + "finished_at": "2026-08-01T14:53:36.269108Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 30, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MODE-MEDITATION", + "group": "mode", + "utterance": "副驾执行冥想空间模式", + "started_at": "2026-08-01T14:53:36.269121Z", + "status": "failed", + "errors": [ + "T2G motor 1 STALL: task_state=7, Hall=374->374" + ], + "http_status": 201, + "request_id": "req-20260801145336-cea6e3", + "failure_telemetry": { + "motor_selector": 1, + "motion_axis": "cushion_tilt", + "task_state": 7, + "motor_result": 5, + "motor_result_name": "STALL", + "position_valid": true, + "hall_before": 374, + "hall_after": 374, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 56, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 11 34 00 30 11 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 34 00 01 02 F0 49", + "timestamp": 26453.41257 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 57 68 34 00 10 27 00", + "timestamp": 26462.801669 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "01 00 76 01 76 01 00 B0", + "timestamp": 26451.441787 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "01 14 76 01 76 01 00 C1", + "timestamp": 26462.802815 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 113, + "valid_sample_count": 113, + "max_current_raw": 1353, + "max_current_delta_raw": 1351, + "high_current_seen": true, + "low_hall_seen": true, + "stall_overlap_seen": true, + "peak": { + "current_raw": 1353, + "current_baseline_raw": 2, + "current_delta_raw": 1351, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "01 07 49 05 02 00 F4 01", + "timestamp": 26461.7585 + } + }, + "latest": { + "current_raw": 1199, + "current_baseline_raw": 2, + "current_delta_raw": 1197, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": true, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "01 0F AF 04 02 00 F4 01", + "timestamp": 26462.798972 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:53:48.119388Z", + "duration_ms": 11850 + }, + { + "id": "MODE-LEISURE", + "group": "mode", + "utterance": "副驾执行休闲躺椅模式", + "status": "safety_blocked", + "started_at": "2026-08-01T14:53:48.119450Z", + "finished_at": "2026-08-01T14:53:48.119452Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 30, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MODE-CALF", + "group": "mode", + "utterance": "副驾执行小腿解压悬浮模式", + "started_at": "2026-08-01T14:53:48.119461Z", + "status": "failed", + "errors": [ + "T2G motor 0 TIMEOUT: task_state=7, Hall=499->499" + ], + "http_status": 201, + "request_id": "req-20260801145348-bae676", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 6, + "motor_result_name": "TIMEOUT", + "position_valid": true, + "hall_before": 499, + "hall_after": 499, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "01 10 37 00 EC 13 30 75", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "21 00 37 00 01 01 F0 41", + "timestamp": 26463.239675 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 67 28 37 00 10 27 00", + "timestamp": 26469.752618 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 00 F3 01 F3 01 00 10", + "timestamp": 26463.237716 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 05 F3 01 F3 01 00 20", + "timestamp": 26469.754985 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 65, + "valid_sample_count": 65, + "max_current_raw": 253, + "max_current_delta_raw": 250, + "high_current_seen": false, + "low_hall_seen": true, + "stall_overlap_seen": false, + "peak": { + "current_raw": 253, + "current_baseline_raw": 3, + "current_delta_raw": 250, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": false, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 03 FD 00 03 00 F4 01", + "timestamp": 26463.272395 + } + }, + "latest": { + "current_raw": 207, + "current_baseline_raw": 3, + "current_delta_raw": 204, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0B CF 00 03 00 F4 01", + "timestamp": 26469.728393 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:53:55.135955Z", + "duration_ms": 7017 + }, + { + "id": "MODE-BEACH", + "group": "mode", + "utterance": "副驾执行电感沙滩椅模式", + "status": "safety_blocked", + "started_at": "2026-08-01T14:53:55.136004Z", + "finished_at": "2026-08-01T14:53:55.136006Z", + "duration_ms": 0, + "errors": [], + "safety_block": { + "axis": "cushion_tilt", + "target_pct": 0, + "minimum_safe_target_pct": 35, + "reason": "M1 near-direction mechanical obstruction: repeated Hall stop at 122/123 with zero pulses and high current; do not drive toward the near endpoint until the mechanism is inspected.", + "evidence": { + "hall_count": 122, + "pulse_count": 0, + "peak_current_delta_raw": 1205, + "stall_threshold_raw": 500 + } + } + }, + { + "id": "MODE-NAP", + "group": "mode", + "utterance": "副驾执行小憩模式", + "started_at": "2026-08-01T14:53:55.136014Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801145355-391520", + "matched_modes": [ + "nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 3A 00 10 27 00", + "timestamp": 26476.732654 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 3B 00 10 27 00", + "timestamp": 26476.759174 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 3C 00 A7 1F 00", + "timestamp": 26476.785245 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 3D 00 B5 24 00", + "timestamp": 26476.810211 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26476.820464 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26476.820464 + } + }, + "captured_at": "2026-08-01T14:54:01.990826Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:54:02.155719Z", + "duration_ms": 7020 + }, + { + "id": "MODE-ZERO-GRAVITY", + "group": "mode", + "utterance": "副驾执行零重力模式", + "started_at": "2026-08-01T14:54:02.155796Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801145402-f6ff8b", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 3F 00 10 27 00", + "timestamp": 26483.63127 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 40 00 10 27 00", + "timestamp": 26483.657826 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 41 00 A7 1F 00", + "timestamp": 26483.682735 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 42 00 B5 24 00", + "timestamp": 26483.708846 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26483.717983 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26483.717983 + } + }, + "captured_at": "2026-08-01T14:54:08.888287Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:54:08.963843Z", + "duration_ms": 6808 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T14:54:08.963900Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801145408-c833b5", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 42 00 B5 24 00", + "timestamp": 26484.485071 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 3F 00 10 27 00", + "timestamp": 26484.511148 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 40 00 10 27 00", + "timestamp": 26484.537248 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 41 00 A7 1F 00", + "timestamp": 26484.562609 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26484.572862 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26484.572862 + } + }, + "captured_at": "2026-08-01T14:54:09.742991Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:54:09.821001Z", + "duration_ms": 857 + }, + "finished_at": "2026-08-01T14:54:09.821038Z", + "summary": { + "total": 9, + "passed": 2, + "failed": 3, + "safety_blocked": 4, + "executed": 5, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260801_run4_m0_home.json b/artifacts/hil/seat_frontend_hil_20260801_run4_m0_home.json new file mode 100644 index 0000000..5606bab --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260801_run4_m0_home.json @@ -0,0 +1,240 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T14:55:16.839705Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801145516", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-M0-HOME", + "group": "motion", + "utterance": "把副驾座椅水平位置归零", + "started_at": "2026-08-01T14:55:16.839746Z", + "status": "failed", + "errors": [ + "T2G motor 0 CALIBRATION_FAILED: task_state=7, Hall=499->499" + ], + "http_status": 201, + "request_id": "req-20260801145516-496358", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 11, + "motor_result_name": "CALIBRATION_FAILED", + "position_valid": false, + "hall_before": 499, + "hall_after": 499, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "0B 10 44 00 52 4B 78 00", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "51 00 44 00 0B 41 F0 4F", + "timestamp": 26552.027376 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 B7 00 44 00 FF FF 00", + "timestamp": 26555.266451 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 00 F3 01 F3 01 00 C0", + "timestamp": 26552.016761 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 88 F3 01 F3 01 00 00", + "timestamp": 26555.267587 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 36, + "valid_sample_count": 36, + "max_current_raw": 223, + "max_current_delta_raw": 220, + "high_current_seen": false, + "low_hall_seen": true, + "stall_overlap_seen": false, + "peak": { + "current_raw": 223, + "current_baseline_raw": 3, + "current_delta_raw": 220, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": false, + "current_calibrating": true, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 13 DF 00 03 00 F4 01", + "timestamp": 26552.116307 + } + }, + "latest": { + "current_raw": 10, + "current_baseline_raw": 23, + "current_delta_raw": 0, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0B 0A 00 17 00 F4 01", + "timestamp": 26555.246382 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T14:55:20.627987Z", + "duration_ms": 3788 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T14:55:20.628029Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801145520-65fe81", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 45 00 A7 1F 00", + "timestamp": 26556.1968 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 45 00 B5 24 00", + "timestamp": 26556.222629 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 45 00 FF FF 00", + "timestamp": 26556.248442 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 45 00 10 27 00", + "timestamp": 26556.274646 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26556.283681 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 26556.283681 + } + }, + "captured_at": "2026-08-01T14:55:21.452124Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T14:55:21.531805Z", + "duration_ms": 904 + }, + "finished_at": "2026-08-01T14:55:21.531835Z", + "summary": { + "total": 1, + "passed": 0, + "failed": 1, + "safety_blocked": 0, + "executed": 1, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260801_run5_m0_home_rev5.json b/artifacts/hil/seat_frontend_hil_20260801_run5_m0_home_rev5.json new file mode 100644 index 0000000..1671baf --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260801_run5_m0_home_rev5.json @@ -0,0 +1,62 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T15:32:33.035150Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801153233", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-M0-HOME", + "group": "motion", + "utterance": "把副驾座椅水平位置归零", + "started_at": "2026-08-01T15:32:33.035187Z", + "status": "failed", + "errors": [ + "ZCAN_SetValue(canfd_abit_baud_rate) failed" + ], + "http_status": 201, + "request_id": "req-20260801153233-4d8760", + "failure_telemetry": { + "error_type": "CanGatewayError", + "stop_all_attempted": false, + "simulated": false + }, + "finished_at": "2026-08-01T15:32:33.233128Z", + "duration_ms": 198 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T15:32:33.233166Z", + "status": "failed", + "errors": [ + "ZCAN_SetValue(canfd_abit_baud_rate) failed" + ], + "http_status": 201, + "request_id": "req-20260801153233-dc02d8", + "failure_telemetry": { + "error_type": "CanGatewayError", + "stop_all_attempted": false, + "simulated": false + }, + "finished_at": "2026-08-01T15:32:33.390312Z", + "duration_ms": 157 + }, + "finished_at": "2026-08-01T15:32:33.390330Z", + "summary": { + "total": 1, + "passed": 0, + "failed": 1, + "safety_blocked": 0, + "executed": 1, + "final_state_passed": false + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260801_run6_m0_home_rev5.json b/artifacts/hil/seat_frontend_hil_20260801_run6_m0_home_rev5.json new file mode 100644 index 0000000..c231624 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260801_run6_m0_home_rev5.json @@ -0,0 +1,240 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T15:38:36.967401Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801153836", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-M0-HOME", + "group": "motion", + "utterance": "把副驾座椅水平位置归零", + "started_at": "2026-08-01T15:38:36.967442Z", + "status": "failed", + "errors": [ + "T2G motor 0 CALIBRATION_FAILED: task_state=7, Hall=499->499" + ], + "http_status": 201, + "request_id": "req-20260801153836-3cd030", + "failure_telemetry": { + "motor_selector": 0, + "motion_axis": "longitudinal", + "task_state": 7, + "motor_result": 11, + "motor_result_name": "CALIBRATION_FAILED", + "position_valid": false, + "hall_before": 499, + "hall_after": 499, + "hall_delta": 0, + "endpoint_recovery_max_near_hall": 72, + "command_frame": { + "frame_id": "0x300", + "payload_size": 8, + "data_hex": "0B 10 02 00 52 4B 78 00", + "timestamp": null + }, + "ack_frame": { + "frame_id": "0x301", + "payload_size": 8, + "data_hex": "51 00 02 00 0B 41 E0 55", + "timestamp": 29165.165292 + }, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 B7 00 02 00 FF FF 00", + "timestamp": 29168.401573 + }, + "diagnostic_before_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 00 F3 01 F3 01 00 20", + "timestamp": 29165.154003 + }, + "diagnostic_frame": { + "frame_id": "0x303", + "payload_size": 8, + "data_hex": "00 88 F3 01 F3 01 00 60", + "timestamp": 29168.402701 + }, + "diagnostic_read_error": null, + "current_diagnostic": { + "sample_count": 36, + "valid_sample_count": 36, + "max_current_raw": 238, + "max_current_delta_raw": 233, + "high_current_seen": false, + "low_hall_seen": true, + "stall_overlap_seen": false, + "peak": { + "current_raw": 236, + "current_baseline_raw": 3, + "current_delta_raw": 233, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": false, + "current_calibrating": true, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 13 EC 00 03 00 F4 01", + "timestamp": 29165.251397 + } + }, + "latest": { + "current_raw": 12, + "current_baseline_raw": 36, + "current_delta_raw": 0, + "stall_current_delta_threshold_raw": 500, + "current_sample_valid": true, + "current_baseline_valid": true, + "high_current": false, + "hall_activity_low": true, + "current_calibrating": false, + "frame": { + "frame_id": "0x304", + "payload_size": 8, + "data_hex": "00 0B 0C 00 24 00 F4 01", + "timestamp": 29168.379476 + } + } + }, + "error_type": "HardwareExecutionError", + "stop_all_attempted": true, + "simulated": false + }, + "finished_at": "2026-08-01T15:38:53.697878Z", + "duration_ms": 16730 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T15:38:53.697934Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801153853-1d639f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 03 00 10 27 00", + "timestamp": 29169.295418 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 03 00 A7 1F 00", + "timestamp": 29169.322276 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 03 00 B5 24 00", + "timestamp": 29169.347323 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 00 03 00 FF FF 00", + "timestamp": 29169.374233 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29169.380975 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29169.380975 + } + }, + "captured_at": "2026-08-01T15:38:54.491848Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:38:54.576238Z", + "duration_ms": 878 + }, + "finished_at": "2026-08-01T15:38:54.576286Z", + "summary": { + "total": 1, + "passed": 0, + "failed": 1, + "safety_blocked": 0, + "executed": 1, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260801_run7_rev6_flash_thermal_off.json b/artifacts/hil/seat_frontend_hil_20260801_run7_rev6_flash_thermal_off.json new file mode 100644 index 0000000..b462cfa --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260801_run7_rev6_flash_thermal_off.json @@ -0,0 +1,363 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T15:43:36.160681Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801154336", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "THERM-H-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅加热", + "started_at": "2026-08-01T15:43:36.160725Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154336-0eefe8", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29463.233038 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29463.259912 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29463.284973 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29463.311881 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29463.319822 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29463.319822 + } + }, + "captured_at": "2026-08-01T15:43:48.424601Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:43:48.512170Z", + "duration_ms": 12351 + }, + { + "id": "THERM-V-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅通风", + "started_at": "2026-08-01T15:43:48.512241Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154348-d8018c", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29464.079538 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29464.105253 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29464.131102 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29464.157968 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29464.165819 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29464.165819 + } + }, + "captured_at": "2026-08-01T15:43:49.270734Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:43:49.336080Z", + "duration_ms": 824 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T15:43:49.336131Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801154349-f42e7f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 28 00 00 10 27 00", + "timestamp": 29464.904964 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 08 00 00 A7 1F 00", + "timestamp": 29464.931901 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 08 00 00 B5 24 00", + "timestamp": 29464.95768 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": false, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 65535, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 00 00 00 FF FF 00", + "timestamp": 29464.98386 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29464.990659 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 29464.990659 + } + }, + "captured_at": "2026-08-01T15:43:50.095435Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T15:43:50.176751Z", + "duration_ms": 841 + }, + "finished_at": "2026-08-01T15:43:50.176781Z", + "summary": { + "total": 2, + "passed": 2, + "failed": 0, + "safety_blocked": 0, + "executed": 2, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260802_all_modes_after_timeout_fix.json b/artifacts/hil/seat_frontend_hil_20260802_all_modes_after_timeout_fix.json new file mode 100644 index 0000000..48c3fd8 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260802_all_modes_after_timeout_fix.json @@ -0,0 +1,1402 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T17:34:24.688076Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801173424", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MODE-EASY-ENTRY", + "group": "mode", + "utterance": "副驾执行轻松进出模式", + "started_at": "2026-08-01T17:34:24.688111Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173424-29d516", + "matched_modes": [ + "easy_entry_exit" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 37 01 00 00 00", + "timestamp": 36132.806804 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 38 01 00 00 00", + "timestamp": 36132.832713 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 35 01 10 27 00", + "timestamp": 36132.858315 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 36 01 00 00 00", + "timestamp": 36132.884898 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36132.890537 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36132.890537 + } + }, + "captured_at": "2026-08-01T17:34:57.861807Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:34:57.947099Z", + "duration_ms": 33259 + }, + { + "id": "MODE-OFFICE", + "group": "mode", + "utterance": "副驾执行办公模式", + "started_at": "2026-08-01T17:34:57.947281Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173457-b91d14", + "matched_modes": [ + "office" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 21, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2102, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 3D 01 36 08 00", + "timestamp": 36155.402606 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 3A 01 1A 1C 00", + "timestamp": 36155.429035 + } + }, + "cushion_tilt": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2193, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 3B 01 91 08 00", + "timestamp": 36155.455092 + } + }, + "backrest_recline": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2214, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 3C 01 A6 08 00", + "timestamp": 36155.481164 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36155.490271 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36155.490271 + } + }, + "captured_at": "2026-08-01T17:35:20.460980Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:35:20.539737Z", + "duration_ms": 22592 + }, + { + "id": "MODE-QUEEN", + "group": "mode", + "utterance": "副驾执行女王副驾行驶模式", + "started_at": "2026-08-01T17:35:20.539831Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173520-452638", + "matched_modes": [ + "queen_passenger_driving" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4395, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 41 01 2B 11 00", + "timestamp": 36171.331389 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 3122, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 42 01 32 0C 00", + "timestamp": 36171.357453 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 3F 01 1A 1C 00", + "timestamp": 36171.383588 + } + }, + "cushion_tilt": { + "position_pct": 38, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3797, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 40 01 D5 0E 00", + "timestamp": 36171.409577 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36171.419133 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36171.419133 + } + }, + "captured_at": "2026-08-01T17:35:36.389592Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:35:36.474203Z", + "duration_ms": 15934 + }, + { + "id": "MODE-BABY-NAP", + "group": "mode", + "utterance": "副驾执行宝宝午睡模式", + "started_at": "2026-08-01T17:35:36.474286Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173536-1ae95c", + "matched_modes": [ + "baby_nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 41, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4100, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 46 01 04 10 00", + "timestamp": 36186.402227 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 47 01 00 00 00", + "timestamp": 36186.427207 + } + }, + "longitudinal": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 8116, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 44 01 B4 1F 00", + "timestamp": 36186.454004 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 45 01 B3 0B 00", + "timestamp": 36186.479783 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36186.486508 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36186.486508 + } + }, + "captured_at": "2026-08-01T17:35:51.456741Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:35:51.543269Z", + "duration_ms": 15069 + }, + { + "id": "MODE-CRUISE-SOFA", + "group": "mode", + "utterance": "副驾执行巡航沙发模式", + "started_at": "2026-08-01T17:35:51.543344Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173551-b10a5e", + "matched_modes": [ + "cruise_sofa" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 53, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5317, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 4C 01 C5 14 00", + "timestamp": 36206.976676 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 49 01 E2 13 00", + "timestamp": 36207.002744 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 4A 01 B3 0B 00", + "timestamp": 36207.028057 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4395, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 4B 01 2B 11 00", + "timestamp": 36207.054121 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36207.065484 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36207.065484 + } + }, + "captured_at": "2026-08-01T17:36:12.035258Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:36:12.116237Z", + "duration_ms": 20573 + }, + { + "id": "MODE-MEDITATION", + "group": "mode", + "utterance": "副驾执行冥想空间模式", + "started_at": "2026-08-01T17:36:12.116297Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173612-dab772", + "matched_modes": [ + "meditation_space" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 58, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5811, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 51 01 B3 16 00", + "timestamp": 36223.272815 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 4E 01 10 27 00", + "timestamp": 36223.298855 + } + }, + "cushion_tilt": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4412, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 4F 01 3C 11 00", + "timestamp": 36223.324246 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4395, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 50 01 2B 11 00", + "timestamp": 36223.35031 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36223.359447 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36223.359447 + } + }, + "captured_at": "2026-08-01T17:36:28.328944Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:36:28.416288Z", + "duration_ms": 16300 + }, + { + "id": "MODE-LEISURE", + "group": "mode", + "utterance": "副驾执行休闲躺椅模式", + "started_at": "2026-08-01T17:36:28.416362Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173628-9d85f9", + "matched_modes": [ + "leisure_lounger" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 54 01 B3 0B 00", + "timestamp": 36248.14072 + } + }, + "backrest_recline": { + "position_pct": 66, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6598, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 55 01 C6 19 00", + "timestamp": 36248.166811 + } + }, + "legrest_height": { + "position_pct": 76, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 7604, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 56 01 B4 1D 00", + "timestamp": 36248.19294 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 53 01 E2 13 00", + "timestamp": 36248.220546 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36248.228523 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36248.228523 + } + }, + "captured_at": "2026-08-01T17:36:53.197578Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:36:53.276712Z", + "duration_ms": 24860 + }, + { + "id": "MODE-CALF", + "group": "mode", + "utterance": "副驾执行小腿解压悬浮模式", + "started_at": "2026-08-01T17:36:53.276783Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173653-39bc49", + "matched_modes": [ + "calf_decompression_float" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 7513, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 59 01 59 1D 00", + "timestamp": 36280.300316 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 5A 01 00 00 00", + "timestamp": 36280.325624 + } + }, + "legrest_height": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 28 5B 01 10 27 00", + "timestamp": 36280.351617 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 58 01 E2 13 00", + "timestamp": 36280.37769 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36280.387925 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36280.387925 + } + }, + "captured_at": "2026-08-01T17:37:25.356269Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:37:25.441255Z", + "duration_ms": 32164 + }, + { + "id": "MODE-BEACH", + "group": "mode", + "utterance": "副驾执行电感沙滩椅模式", + "started_at": "2026-08-01T17:37:25.441314Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173725-8c8b69", + "matched_modes": [ + "electric_beach_chair" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 5D 01 10 27 00", + "timestamp": 36336.115156 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 5E 01 00 00 00", + "timestamp": 36336.141544 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 9978, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 5F 01 FA 26 00", + "timestamp": 36336.167515 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5981, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 60 01 5D 17 00", + "timestamp": 36336.193545 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36336.202646 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36336.202646 + } + }, + "captured_at": "2026-08-01T17:38:21.169957Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:38:21.251584Z", + "duration_ms": 55810 + }, + { + "id": "MODE-NAP", + "group": "mode", + "utterance": "副驾执行小憩模式", + "started_at": "2026-08-01T17:38:21.251668Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173821-8d526e", + "matched_modes": [ + "nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 65 01 B5 24 00", + "timestamp": 36361.915413 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 62 01 10 27 00", + "timestamp": 36361.941953 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 63 01 10 27 00", + "timestamp": 36361.968014 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 64 01 A7 1F 00", + "timestamp": 36361.994186 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36362.00334 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36362.00334 + } + }, + "captured_at": "2026-08-01T17:38:46.970161Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:38:47.053444Z", + "duration_ms": 25802 + }, + { + "id": "MODE-ZERO-GRAVITY", + "group": "mode", + "utterance": "打开零重力模式", + "started_at": "2026-08-01T17:38:47.053535Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173847-630834", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 6A 01 B5 24 00", + "timestamp": 36368.73592 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 67 01 10 27 00", + "timestamp": 36368.762028 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 68 01 10 27 00", + "timestamp": 36368.788151 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 69 01 A7 1F 00", + "timestamp": 36368.814254 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36368.823389 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36368.823389 + } + }, + "captured_at": "2026-08-01T17:38:53.790157Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:38:53.936718Z", + "duration_ms": 6883 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T17:38:53.936783Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173853-a23f08", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 69 01 A7 1F 00", + "timestamp": 36369.599695 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 6A 01 B5 24 00", + "timestamp": 36369.625753 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 67 01 10 27 00", + "timestamp": 36369.652324 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 68 01 10 27 00", + "timestamp": 36369.678374 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36369.687565 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36369.687565 + } + }, + "captured_at": "2026-08-01T17:38:54.654265Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:38:54.726753Z", + "duration_ms": 790 + }, + "finished_at": "2026-08-01T17:38:54.726786Z", + "summary": { + "total": 11, + "passed": 11, + "failed": 0, + "safety_blocked": 0, + "executed": 11, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260802_all_modes_post_cleanup.json b/artifacts/hil/seat_frontend_hil_20260802_all_modes_post_cleanup.json new file mode 100644 index 0000000..47dc88b --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260802_all_modes_post_cleanup.json @@ -0,0 +1,250 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T17:39:16.430915Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801173916", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T17:39:16.430950Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173916-90206d", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 36459.051975 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 36459.077734 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 36459.104324 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 36459.129781 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36459.136472 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36459.136472 + } + }, + "captured_at": "2026-08-01T17:40:24.101369Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:40:24.299645Z", + "duration_ms": 67869 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T17:40:24.299777Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801174024-2bef93", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 36460.001759 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 36460.028327 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 36460.055218 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 36460.08066 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36460.087354 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36460.087354 + } + }, + "captured_at": "2026-08-01T17:40:25.052281Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:40:25.130245Z", + "duration_ms": 830 + }, + "finished_at": "2026-08-01T17:40:25.130276Z", + "summary": { + "total": 1, + "passed": 1, + "failed": 0, + "safety_blocked": 0, + "executed": 1, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260802_gpt56_position_sync_targeted.json b/artifacts/hil/seat_frontend_hil_20260802_gpt56_position_sync_targeted.json new file mode 100644 index 0000000..e8541c2 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260802_gpt56_position_sync_targeted.json @@ -0,0 +1,364 @@ +{ + "suite": "t2g-seat-frontend-comprehensive-hil", + "started_at": "2026-08-01T20:30:03.347380Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801203003", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MODEL-FUZZY-CRAMPED-COMFORT", + "group": "model", + "utterance": "前舱空间太挤了,把座椅调整到舒服的位置", + "started_at": "2026-08-01T20:30:43.772650Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801203043-6dba03", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 35, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3501, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 09 00 AD 0D 00", + "timestamp": 46720.941274 + } + }, + "legrest_height": { + "position_pct": 10, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 1005, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 0A 00 ED 03 00", + "timestamp": 46720.967852 + } + }, + "longitudinal": { + "position_pct": 80, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 8016, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 07 00 50 1F 00", + "timestamp": 46720.993263 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 08 00 B3 0B 00", + "timestamp": 46721.019784 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 46721.030217 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 46721.030217 + } + }, + "captured_at": "2026-08-01T20:31:25.795596Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T20:31:25.863040Z", + "duration_ms": 42090 + } + ], + "position_memory_sync": { + "id": "PREFLIGHT-POSITION-MEMORY-SYNC", + "group": "preflight", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T20:30:03.347411Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801203003-f00e7a", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 03 00 00 00 00", + "timestamp": 46678.830874 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 04 00 00 00 00", + "timestamp": 46678.856952 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 05 00 00 00 00", + "timestamp": 46678.882795 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 02 00 00 00 00", + "timestamp": 46678.908649 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 46678.916532 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 46678.916532 + } + }, + "captured_at": "2026-08-01T20:30:43.683001Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T20:30:43.772568Z", + "duration_ms": 40425 + }, + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T20:31:25.863092Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801203125-a4af68", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 0C 00 00 00 00", + "timestamp": 46759.956435 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 0D 00 00 00 00", + "timestamp": 46759.982688 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 0E 00 00 00 00", + "timestamp": 46760.008938 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 0F 00 00 00 00", + "timestamp": 46760.041009 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 46760.053878 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 46760.053878 + } + }, + "captured_at": "2026-08-01T20:32:04.818553Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T20:32:04.895597Z", + "duration_ms": 39033 + }, + "finished_at": "2026-08-01T20:32:04.895635Z", + "summary": { + "total": 1, + "passed": 1, + "failed": 0, + "safety_blocked": 0, + "executed": 1, + "position_memory_sync_passed": true, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260802_post_suite_zero_cleanup.json b/artifacts/hil/seat_frontend_hil_20260802_post_suite_zero_cleanup.json new file mode 100644 index 0000000..497f7f8 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260802_post_suite_zero_cleanup.json @@ -0,0 +1,250 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T17:16:40.264559Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801171640", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T17:16:40.264614Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171640-4a5f1e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 19 01 00 00 00", + "timestamp": 35105.608647 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 1A 01 00 00 00", + "timestamp": 35105.634423 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 17 01 00 00 00", + "timestamp": 35105.661016 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 18 01 00 00 00", + "timestamp": 35105.68652 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35105.692065 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35105.692065 + } + }, + "captured_at": "2026-08-01T17:17:50.683023Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:17:50.762718Z", + "duration_ms": 70498 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T17:17:50.762772Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171750-2f0f2f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 19 01 00 00 00", + "timestamp": 35106.475011 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 1A 01 00 00 00", + "timestamp": 35106.500476 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 17 01 00 00 00", + "timestamp": 35106.526322 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 18 01 00 00 00", + "timestamp": 35106.552849 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35106.558466 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35106.558466 + } + }, + "captured_at": "2026-08-01T17:17:51.549417Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:17:51.636183Z", + "duration_ms": 873 + }, + "finished_at": "2026-08-01T17:17:51.636217Z", + "summary": { + "total": 1, + "passed": 1, + "failed": 0, + "safety_blocked": 0, + "executed": 1, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260802_preflight_firmware_restore.json b/artifacts/hil/seat_frontend_hil_20260802_preflight_firmware_restore.json new file mode 100644 index 0000000..bc537ea --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260802_preflight_firmware_restore.json @@ -0,0 +1,363 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T16:40:47.172484Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801164047", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "THERM-H-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅加热", + "started_at": "2026-08-01T16:40:47.172525Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801164047-8cddb4", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 18 00 00 00 00 00", + "timestamp": 32897.543083 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 18 00 00 00 00 00", + "timestamp": 32897.568506 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 18 00 00 00 00 00", + "timestamp": 32897.595022 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 18 00 00 00 00 00", + "timestamp": 32897.620753 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 32897.62524 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 32897.62524 + } + }, + "captured_at": "2026-08-01T16:41:02.659736Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:41:02.738362Z", + "duration_ms": 15566 + }, + { + "id": "THERM-V-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅通风", + "started_at": "2026-08-01T16:41:02.738421Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801164102-401927", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 18 00 00 00 00 00", + "timestamp": 32898.36913 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 18 00 00 00 00 00", + "timestamp": 32898.394558 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 18 00 00 00 00 00", + "timestamp": 32898.421367 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 18 00 00 00 00 00", + "timestamp": 32898.446823 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 32898.453497 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 32898.453497 + } + }, + "captured_at": "2026-08-01T16:41:03.487981Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:41:03.570272Z", + "duration_ms": 832 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T16:41:03.570317Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801164103-4efef7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 00 18 00 00 00 00 00", + "timestamp": 32899.183035 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 00 18 00 00 00 00 00", + "timestamp": 32899.209498 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 00 18 00 00 00 00 00", + "timestamp": 32899.23527 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 0, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 00 18 00 00 00 00 00", + "timestamp": 32899.260679 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 32899.267388 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 32899.267388 + } + }, + "captured_at": "2026-08-01T16:41:04.301854Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:41:04.424088Z", + "duration_ms": 854 + }, + "finished_at": "2026-08-01T16:41:04.424118Z", + "summary": { + "total": 2, + "passed": 2, + "failed": 0, + "safety_blocked": 0, + "executed": 2, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260802_timeout_fix_post_cleanup.json b/artifacts/hil/seat_frontend_hil_20260802_timeout_fix_post_cleanup.json new file mode 100644 index 0000000..56427a0 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260802_timeout_fix_post_cleanup.json @@ -0,0 +1,250 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T17:32:24.627065Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801173224", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T17:32:24.627106Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173224-cedf76", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 30 01 00 00 00", + "timestamp": 36047.100786 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 31 01 00 00 00", + "timestamp": 36047.126273 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 32 01 00 00 00", + "timestamp": 36047.152829 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 33 01 00 00 00", + "timestamp": 36047.178304 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36047.185019 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36047.185019 + } + }, + "captured_at": "2026-08-01T17:33:32.157834Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:33:32.231664Z", + "duration_ms": 67605 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T17:33:32.231720Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173332-3d22e2", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 30 01 00 00 00", + "timestamp": 36047.928676 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 31 01 00 00 00", + "timestamp": 36047.954191 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 32 01 00 00 00", + "timestamp": 36047.980699 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 33 01 00 00 00", + "timestamp": 36048.006522 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36048.013163 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 36048.013163 + } + }, + "captured_at": "2026-08-01T17:33:32.986103Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:33:33.067889Z", + "duration_ms": 836 + }, + "finished_at": "2026-08-01T17:33:33.067920Z", + "summary": { + "total": 1, + "passed": 1, + "failed": 0, + "safety_blocked": 0, + "executed": 1, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260802_timeout_fix_precondition_zero.json b/artifacts/hil/seat_frontend_hil_20260802_timeout_fix_precondition_zero.json new file mode 100644 index 0000000..ae2dcfd --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260802_timeout_fix_precondition_zero.json @@ -0,0 +1,250 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T17:26:35.994926Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801172635", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T17:26:35.994963Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801172635-cf368d", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 23 01 00 00 00", + "timestamp": 35698.280073 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 24 01 00 00 00", + "timestamp": 35698.306668 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 21 01 00 00 00", + "timestamp": 35698.332116 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 22 01 00 00 00", + "timestamp": 35698.357889 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35698.36569 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35698.36569 + } + }, + "captured_at": "2026-08-01T17:27:43.345246Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:27:43.418173Z", + "duration_ms": 67423 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T17:27:43.418231Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801172743-1f95ae", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 23 01 00 00 00", + "timestamp": 35699.098847 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 24 01 00 00 00", + "timestamp": 35699.124304 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 21 01 00 00 00", + "timestamp": 35699.150901 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 22 01 00 00 00", + "timestamp": 35699.176715 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35699.184476 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35699.184476 + } + }, + "captured_at": "2026-08-01T17:27:44.164137Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:27:44.276096Z", + "duration_ms": 858 + }, + "finished_at": "2026-08-01T17:27:44.276129Z", + "summary": { + "total": 1, + "passed": 1, + "failed": 0, + "safety_blocked": 0, + "executed": 1, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260802_user_requested_run3.json b/artifacts/hil/seat_frontend_hil_20260802_user_requested_run3.json new file mode 100644 index 0000000..29fdf7d --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260802_user_requested_run3.json @@ -0,0 +1,3888 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T17:08:24.094417Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801170824", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "THERM-H-1", + "group": "thermal", + "utterance": "副驾座椅加热开到1档", + "started_at": "2026-08-01T17:08:24.094455Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170824-e7d4bb", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 BE 00 B5 24 00", + "timestamp": 34539.795347 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 BB 00 10 27 00", + "timestamp": 34539.821216 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 BC 00 10 27 00", + "timestamp": 34539.847532 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BD 00 A7 1F 00", + "timestamp": 34539.873425 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 34539.883598 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 34539.883598 + } + }, + "captured_at": "2026-08-01T17:08:24.885701Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:08:24.956845Z", + "duration_ms": 862 + }, + { + "id": "THERM-H-2", + "group": "thermal", + "utterance": "副驾座椅加热开到2档", + "started_at": "2026-08-01T17:08:24.956905Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170824-332e47", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 BB 00 10 27 00", + "timestamp": 34540.653512 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 BC 00 10 27 00", + "timestamp": 34540.679443 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BD 00 A7 1F 00", + "timestamp": 34540.705312 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 BE 00 B5 24 00", + "timestamp": 34540.73161 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 34540.739551 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 34540.739551 + } + }, + "captured_at": "2026-08-01T17:08:25.741555Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:08:25.827429Z", + "duration_ms": 871 + }, + { + "id": "THERM-H-3", + "group": "thermal", + "utterance": "副驾座椅加热开到3档", + "started_at": "2026-08-01T17:08:25.827487Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170825-75b032", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 BC 00 10 27 00", + "timestamp": 34541.540791 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BD 00 A7 1F 00", + "timestamp": 34541.566677 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 BE 00 B5 24 00", + "timestamp": 34541.59369 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 BB 00 10 27 00", + "timestamp": 34541.619559 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 34541.627552 + } + }, + "heating": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 34541.627552 + } + }, + "captured_at": "2026-08-01T17:08:26.629455Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:08:26.705777Z", + "duration_ms": 878 + }, + { + "id": "THERM-H-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅加热", + "started_at": "2026-08-01T17:08:26.705835Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170826-c54cd3", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 BC 00 10 27 00", + "timestamp": 34542.387103 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BD 00 A7 1F 00", + "timestamp": 34542.41287 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 BE 00 B5 24 00", + "timestamp": 34542.439124 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 BB 00 10 27 00", + "timestamp": 34542.464931 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34542.472838 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34542.472838 + } + }, + "captured_at": "2026-08-01T17:08:27.474790Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:08:27.558193Z", + "duration_ms": 852 + }, + { + "id": "THERM-V-1", + "group": "thermal", + "utterance": "副驾座椅通风开到1档", + "started_at": "2026-08-01T17:08:27.558249Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170827-b5bc45", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 BC 00 10 27 00", + "timestamp": 34543.216748 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BD 00 A7 1F 00", + "timestamp": 34543.242971 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 BE 00 B5 24 00", + "timestamp": 34543.268807 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 BB 00 10 27 00", + "timestamp": 34543.295796 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 34543.302553 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 34543.302553 + } + }, + "captured_at": "2026-08-01T17:08:28.304452Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:08:28.378592Z", + "duration_ms": 820 + }, + { + "id": "THERM-V-2", + "group": "thermal", + "utterance": "副驾座椅通风开到2档", + "started_at": "2026-08-01T17:08:28.378644Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170828-4d9c48", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 BC 00 10 27 00", + "timestamp": 34544.031158 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BD 00 A7 1F 00", + "timestamp": 34544.056998 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 BE 00 B5 24 00", + "timestamp": 34544.082809 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 BB 00 10 27 00", + "timestamp": 34544.109744 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 34544.117665 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 34544.117665 + } + }, + "captured_at": "2026-08-01T17:08:29.119487Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:08:29.199658Z", + "duration_ms": 821 + }, + { + "id": "THERM-V-3", + "group": "thermal", + "utterance": "副驾座椅通风开到3档", + "started_at": "2026-08-01T17:08:29.199719Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170829-0d184a", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 BC 00 10 27 00", + "timestamp": 34544.857453 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BD 00 A7 1F 00", + "timestamp": 34544.883254 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 BE 00 B5 24 00", + "timestamp": 34544.909084 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 BB 00 10 27 00", + "timestamp": 34544.935365 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 34544.943222 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 34544.943222 + } + }, + "captured_at": "2026-08-01T17:08:29.945111Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:08:30.017608Z", + "duration_ms": 818 + }, + { + "id": "THERM-V-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅通风", + "started_at": "2026-08-01T17:08:30.017659Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170830-a67de6", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 BC 00 10 27 00", + "timestamp": 34545.686922 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BD 00 A7 1F 00", + "timestamp": 34545.713815 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 BE 00 B5 24 00", + "timestamp": 34545.738955 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 BB 00 10 27 00", + "timestamp": 34545.76586 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34545.773769 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34545.773769 + } + }, + "captured_at": "2026-08-01T17:08:30.775602Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:08:30.854317Z", + "duration_ms": 837 + }, + { + "id": "MOTION-M0-25", + "group": "motion", + "utterance": "把副驾座椅水平位置调到25%", + "started_at": "2026-08-01T17:08:30.854374Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170830-0dd6cd", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 BF 00 A7 1F 00", + "timestamp": 34559.237212 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 BF 00 B5 24 00", + "timestamp": 34559.26328 + } + }, + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 2505, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 C0 00 C9 09 00", + "timestamp": 34559.289411 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 BF 00 10 27 00", + "timestamp": 34559.315454 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34559.324617 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34559.324617 + } + }, + "captured_at": "2026-08-01T17:08:44.326171Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:08:44.398075Z", + "duration_ms": 13544 + }, + { + "id": "MOTION-M0-75", + "group": "motion", + "utterance": "把副驾座椅水平位置调到75%", + "started_at": "2026-08-01T17:08:44.398128Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170844-311b78", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 C1 00 B5 24 00", + "timestamp": 34567.727971 + } + }, + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7515, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 C2 00 5B 1D 00", + "timestamp": 34567.753309 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 C1 00 10 27 00", + "timestamp": 34567.779454 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 C1 00 A7 1F 00", + "timestamp": 34567.805533 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34567.816918 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34567.816918 + } + }, + "captured_at": "2026-08-01T17:08:52.818254Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:08:52.893460Z", + "duration_ms": 8495 + }, + { + "id": "MOTION-M0-HOME", + "group": "motion", + "utterance": "把副驾座椅水平位置归零", + "started_at": "2026-08-01T17:08:52.893515Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170852-6542e6", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 C4 00 00 00 00", + "timestamp": 34581.822564 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 28 C3 00 10 27 00", + "timestamp": 34581.848649 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 C3 00 A7 1F 00", + "timestamp": 34581.874405 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 C3 00 B5 24 00", + "timestamp": 34581.90013 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34581.906921 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34581.906921 + } + }, + "captured_at": "2026-08-01T17:09:06.907964Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:09:06.983484Z", + "duration_ms": 14090 + }, + { + "id": "MOTION-M1-20", + "group": "motion", + "utterance": "把副驾坐盆调到20%", + "started_at": "2026-08-01T17:09:06.983546Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170907-eb8e51", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 C5 00 B5 24 00", + "timestamp": 34588.898684 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 C5 00 00 00 00", + "timestamp": 34588.924655 + } + }, + "cushion_tilt": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2005, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 C6 00 D5 07 00", + "timestamp": 34588.949969 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 C5 00 A7 1F 00", + "timestamp": 34588.975992 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34588.985083 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34588.985083 + } + }, + "captured_at": "2026-08-01T17:09:13.986048Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:09:14.063651Z", + "duration_ms": 7080 + }, + { + "id": "MOTION-M1-60", + "group": "motion", + "utterance": "把副驾坐盆调到60%", + "started_at": "2026-08-01T17:09:14.063709Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170914-0c7995", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 C7 00 B5 24 00", + "timestamp": 34592.968781 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 C7 00 00 00 00", + "timestamp": 34592.994821 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 C8 00 65 17 00", + "timestamp": 34593.020838 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 C7 00 A7 1F 00", + "timestamp": 34593.046142 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34593.055193 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34593.055193 + } + }, + "captured_at": "2026-08-01T17:09:18.056088Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:09:18.130364Z", + "duration_ms": 4067 + }, + { + "id": "MOTION-M2-25", + "group": "motion", + "utterance": "把副驾靠背调到25%", + "started_at": "2026-08-01T17:09:18.130428Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170918-f759ce", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2497, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 CA 00 C1 09 00", + "timestamp": 34606.416547 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 C9 00 B5 24 00", + "timestamp": 34606.442939 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 C9 00 00 00 00", + "timestamp": 34606.468938 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 C9 00 65 17 00", + "timestamp": 34606.494925 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34606.504014 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34606.504014 + } + }, + "captured_at": "2026-08-01T17:09:31.504638Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:09:31.588824Z", + "duration_ms": 13458 + }, + { + "id": "MOTION-M2-60", + "group": "motion", + "utterance": "把副驾靠背调到60%", + "started_at": "2026-08-01T17:09:31.588888Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170931-ae3e10", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 CB 00 65 17 00", + "timestamp": 34616.211128 + } + }, + "backrest_recline": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 CC 00 79 17 00", + "timestamp": 34616.238698 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 CB 00 B5 24 00", + "timestamp": 34616.264663 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 CB 00 00 00 00", + "timestamp": 34616.290723 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34616.299824 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34616.299824 + } + }, + "captured_at": "2026-08-01T17:09:41.300276Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:09:41.383301Z", + "duration_ms": 9794 + }, + { + "id": "MOTION-M2-HOME", + "group": "motion", + "utterance": "把副驾靠背归零", + "started_at": "2026-08-01T17:09:41.383362Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170941-d0ef3d", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 CD 00 B5 24 00", + "timestamp": 34633.823158 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 CD 00 00 00 00", + "timestamp": 34633.849132 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 CD 00 65 17 00", + "timestamp": 34633.875891 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 CE 00 00 00 00", + "timestamp": 34633.901539 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34633.908302 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34633.908302 + } + }, + "captured_at": "2026-08-01T17:09:58.908346Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:09:58.991459Z", + "duration_ms": 17608 + }, + { + "id": "MOTION-M3-20", + "group": "motion", + "utterance": "把副驾腿托调到20%", + "started_at": "2026-08-01T17:09:58.991514Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170959-5967df", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 CF 00 00 00 00", + "timestamp": 34644.962212 + } + }, + "legrest_height": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 1978, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 D0 00 BA 07 00", + "timestamp": 34644.988191 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 CF 00 00 00 00", + "timestamp": 34645.01405 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 CF 00 65 17 00", + "timestamp": 34645.04002 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34645.050557 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34645.050557 + } + }, + "captured_at": "2026-08-01T17:10:10.050390Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:10:10.128196Z", + "duration_ms": 11137 + }, + { + "id": "MOTION-M3-60", + "group": "motion", + "utterance": "把副驾腿托调到60%", + "started_at": "2026-08-01T17:10:10.128256Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171010-21f384", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 D1 00 00 00 00", + "timestamp": 34651.627936 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 6012, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 D2 00 7C 17 00", + "timestamp": 34651.654228 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 D1 00 00 00 00", + "timestamp": 34651.680193 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 D1 00 65 17 00", + "timestamp": 34651.706171 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34651.715212 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34651.715212 + } + }, + "captured_at": "2026-08-01T17:10:16.714930Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:10:16.797288Z", + "duration_ms": 6669 + }, + { + "id": "MOTION-M3-HOME", + "group": "motion", + "utterance": "把副驾腿托归零", + "started_at": "2026-08-01T17:10:16.797347Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171016-b82525", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 D3 00 00 00 00", + "timestamp": 34662.045316 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 D3 00 65 17 00", + "timestamp": 34662.0698 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 D3 00 00 00 00", + "timestamp": 34662.096479 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 D4 00 00 00 00", + "timestamp": 34662.122041 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34662.129885 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34662.129885 + } + }, + "captured_at": "2026-08-01T17:10:27.129431Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:10:27.200558Z", + "duration_ms": 10403 + }, + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T17:10:27.200614Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171027-fd4b0c", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 D7 00 00 00 00", + "timestamp": 34685.346403 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 D8 00 00 00 00", + "timestamp": 34685.372197 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 D9 00 00 00 00", + "timestamp": 34685.398708 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 D6 00 00 00 00", + "timestamp": 34685.424255 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34685.430944 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34685.430944 + } + }, + "captured_at": "2026-08-01T17:10:50.430113Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:10:50.507327Z", + "duration_ms": 23307 + }, + { + "id": "COMBINED-ALL", + "group": "combined", + "utterance": "打开副驾加热1档、打开通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%", + "started_at": "2026-08-01T17:10:50.507392Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171050-85b754", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3708, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 DD 00 7C 0E 00", + "timestamp": 34720.499128 + } + }, + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4219, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 DE 00 7B 10 00", + "timestamp": 34720.525318 + } + }, + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 3026, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 DB 00 D2 0B 00", + "timestamp": 34720.551413 + } + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4037, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 DC 00 C5 0F 00", + "timestamp": 34720.577979 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 34720.588248 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 34720.588248 + } + }, + "captured_at": "2026-08-01T17:11:25.586625Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:11:25.659462Z", + "duration_ms": 35152 + }, + { + "id": "COMBINED-OFF", + "group": "combined", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T17:11:25.659547Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171125-fa15bd", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4037, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 DC 00 C5 0F 00", + "timestamp": 34721.319937 + } + }, + "backrest_recline": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3708, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 DD 00 7C 0E 00", + "timestamp": 34721.345996 + } + }, + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4219, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 DE 00 7B 10 00", + "timestamp": 34721.37131 + } + }, + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 3026, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 DB 00 D2 0B 00", + "timestamp": 34721.397361 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34721.406478 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34721.406478 + } + }, + "captured_at": "2026-08-01T17:11:26.404961Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:11:26.478711Z", + "duration_ms": 819 + }, + { + "id": "MODE-EASY-ENTRY", + "group": "mode", + "utterance": "副驾执行轻松进出模式", + "started_at": "2026-08-01T17:11:26.478775Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171126-8cbfe1", + "matched_modes": [ + "easy_entry_exit" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 E3 00 00 00 00", + "timestamp": 34761.498612 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 E0 00 10 27 00", + "timestamp": 34761.524155 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 E1 00 00 00 00", + "timestamp": 34761.550808 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 E2 00 00 00 00", + "timestamp": 34761.5764 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34761.583409 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34761.583409 + } + }, + "captured_at": "2026-08-01T17:12:06.580984Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:12:06.664393Z", + "duration_ms": 40186 + }, + { + "id": "MODE-OFFICE", + "group": "mode", + "utterance": "副驾执行办公模式", + "started_at": "2026-08-01T17:12:06.664466Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171206-47bb05", + "matched_modes": [ + "office" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 E5 00 1A 1C 00", + "timestamp": 34783.981964 + } + }, + "cushion_tilt": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2219, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 E6 00 AB 08 00", + "timestamp": 34784.006911 + } + }, + "backrest_recline": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2214, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 E7 00 A6 08 00", + "timestamp": 34784.033007 + } + }, + "legrest_height": { + "position_pct": 21, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2102, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 E8 00 36 08 00", + "timestamp": 34784.059026 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34784.068151 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34784.068151 + } + }, + "captured_at": "2026-08-01T17:12:29.065381Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:12:29.147224Z", + "duration_ms": 22483 + }, + { + "id": "MODE-QUEEN", + "group": "mode", + "utterance": "副驾执行女王副驾行驶模式", + "started_at": "2026-08-01T17:12:29.147301Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171229-7e40f0", + "matched_modes": [ + "queen_passenger_driving" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4406, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 EC 00 36 11 00", + "timestamp": 34799.721331 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 3122, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 ED 00 32 0C 00", + "timestamp": 34799.747467 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 EA 00 1A 1C 00", + "timestamp": 34799.773538 + } + }, + "cushion_tilt": { + "position_pct": 38, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3797, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 EB 00 D5 0E 00", + "timestamp": 34799.798852 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34799.809103 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34799.809103 + } + }, + "captured_at": "2026-08-01T17:12:44.806117Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:12:44.888658Z", + "duration_ms": 15741 + }, + { + "id": "MODE-BABY-NAP", + "group": "mode", + "utterance": "副驾执行宝宝午睡模式", + "started_at": "2026-08-01T17:12:44.888730Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171244-0fe733", + "matched_modes": [ + "baby_nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 F2 00 00 00 00", + "timestamp": 34814.595262 + } + }, + "longitudinal": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 8116, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 EF 00 B4 1F 00", + "timestamp": 34814.622063 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 F0 00 B3 0B 00", + "timestamp": 34814.647821 + } + }, + "backrest_recline": { + "position_pct": 41, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4100, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 F1 00 04 10 00", + "timestamp": 34814.673468 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34814.680263 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34814.680263 + } + }, + "captured_at": "2026-08-01T17:12:59.676855Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:12:59.751492Z", + "duration_ms": 14863 + }, + { + "id": "MODE-CRUISE-SOFA", + "group": "mode", + "utterance": "副驾执行巡航沙发模式", + "started_at": "2026-08-01T17:12:59.751570Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171259-ad309d", + "matched_modes": [ + "cruise_sofa" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 F4 00 E2 13 00", + "timestamp": 34835.0259 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 F5 00 B3 0B 00", + "timestamp": 34835.052041 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4406, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 F6 00 36 11 00", + "timestamp": 34835.078121 + } + }, + "legrest_height": { + "position_pct": 53, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5301, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 F7 00 B5 14 00", + "timestamp": 34835.104564 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34835.113699 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34835.113699 + } + }, + "captured_at": "2026-08-01T17:13:20.109892Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:13:20.189317Z", + "duration_ms": 20438 + }, + { + "id": "MODE-MEDITATION", + "group": "mode", + "utterance": "副驾执行冥想空间模式", + "started_at": "2026-08-01T17:13:20.189388Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171320-cd7446", + "matched_modes": [ + "meditation_space" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4412, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 FA 00 3C 11 00", + "timestamp": 34851.294603 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4362, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 FB 00 0A 11 00", + "timestamp": 34851.320691 + } + }, + "legrest_height": { + "position_pct": 58, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5811, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 FC 00 B3 16 00", + "timestamp": 34851.346778 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 F9 00 10 27 00", + "timestamp": 34851.37289 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34851.382033 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34851.382033 + } + }, + "captured_at": "2026-08-01T17:13:36.377905Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:13:36.441207Z", + "duration_ms": 16252 + }, + { + "id": "MODE-LEISURE", + "group": "mode", + "utterance": "副驾执行休闲躺椅模式", + "started_at": "2026-08-01T17:13:36.441287Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171336-7cd1ce", + "matched_modes": [ + "leisure_lounger" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 FE 00 E2 13 00", + "timestamp": 34876.303425 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 FF 00 B3 0B 00", + "timestamp": 34876.329519 + } + }, + "backrest_recline": { + "position_pct": 66, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6598, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 00 01 C6 19 00", + "timestamp": 34876.355634 + } + }, + "legrest_height": { + "position_pct": 76, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 7604, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 01 01 B4 1D 00", + "timestamp": 34876.380603 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34876.391277 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34876.391277 + } + }, + "captured_at": "2026-08-01T17:14:01.386641Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:14:01.471255Z", + "duration_ms": 25030 + }, + { + "id": "MODE-CALF", + "group": "mode", + "utterance": "副驾执行小腿解压悬浮模式", + "started_at": "2026-08-01T17:14:01.471332Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171401-3ded24", + "matched_modes": [ + "calf_decompression_float" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 28 06 01 10 27 00", + "timestamp": 34908.769508 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 03 01 E2 13 00", + "timestamp": 34908.795939 + } + }, + "cushion_tilt": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 7513, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 04 01 59 1D 00", + "timestamp": 34908.821914 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 05 01 00 00 00", + "timestamp": 34908.84801 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34908.857109 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34908.857109 + } + }, + "captured_at": "2026-08-01T17:14:33.851924Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:14:33.937484Z", + "duration_ms": 32466 + }, + { + "id": "MODE-BEACH", + "group": "mode", + "utterance": "副驾执行电感沙滩椅模式", + "started_at": "2026-08-01T17:14:33.937559Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171433-ef5599", + "matched_modes": [ + "electric_beach_chair" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5981, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 0B 01 5D 17 00", + "timestamp": 34965.675011 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 08 01 10 27 00", + "timestamp": 34965.70144 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 09 01 00 00 00", + "timestamp": 34965.727424 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 28 0A 01 10 27 00", + "timestamp": 34965.753391 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34965.762482 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34965.762482 + } + }, + "captured_at": "2026-08-01T17:15:30.756318Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:15:30.836468Z", + "duration_ms": 56899 + }, + { + "id": "MODE-NAP", + "group": "mode", + "utterance": "副驾执行小憩模式", + "started_at": "2026-08-01T17:15:30.836547Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171530-f5eb43", + "matched_modes": [ + "nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 10 01 B5 24 00", + "timestamp": 34991.839546 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 0D 01 10 27 00", + "timestamp": 34991.865654 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 0E 01 10 27 00", + "timestamp": 34991.891761 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 0F 01 A7 1F 00", + "timestamp": 34991.918295 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34991.927382 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34991.927382 + } + }, + "captured_at": "2026-08-01T17:15:56.920610Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:15:57.005919Z", + "duration_ms": 26169 + }, + { + "id": "MODE-ZERO-GRAVITY", + "group": "mode", + "utterance": "副驾执行零重力模式", + "started_at": "2026-08-01T17:15:57.005998Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171557-3eb462", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 15 01 B5 24 00", + "timestamp": 34998.626016 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 12 01 10 27 00", + "timestamp": 34998.652171 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 13 01 10 27 00", + "timestamp": 34998.678282 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 14 01 A7 1F 00", + "timestamp": 34998.703658 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34998.712781 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34998.712781 + } + }, + "captured_at": "2026-08-01T17:16:03.705893Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:16:03.835252Z", + "duration_ms": 6829 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T17:16:03.835320Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801171603-9ad0a8", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 14 01 A7 1F 00", + "timestamp": 34999.513815 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 15 01 B5 24 00", + "timestamp": 34999.539906 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 12 01 10 27 00", + "timestamp": 34999.566 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 13 01 10 27 00", + "timestamp": 34999.592133 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34999.601708 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34999.601708 + } + }, + "captured_at": "2026-08-01T17:16:04.594818Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:16:04.678143Z", + "duration_ms": 843 + }, + "finished_at": "2026-08-01T17:16:04.678184Z", + "summary": { + "total": 33, + "passed": 33, + "failed": 0, + "safety_blocked": 0, + "executed": 33, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260802_user_retest_run2.json b/artifacts/hil/seat_frontend_hil_20260802_user_retest_run2.json new file mode 100644 index 0000000..655d639 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260802_user_retest_run2.json @@ -0,0 +1,3888 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T16:58:40.725101Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801165840", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "THERM-H-1", + "group": "thermal", + "utterance": "副驾座椅加热开到1档", + "started_at": "2026-08-01T16:58:40.725141Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165840-28be33", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 66 00 00 00 00", + "timestamp": 33956.407861 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 67 00 00 00 00", + "timestamp": 33956.434758 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 64 00 00 00 00", + "timestamp": 33956.459254 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 65 00 00 00 00", + "timestamp": 33956.485917 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 33956.492602 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 33956.492602 + } + }, + "captured_at": "2026-08-01T16:58:41.506031Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:58:41.593525Z", + "duration_ms": 868 + }, + { + "id": "THERM-H-2", + "group": "thermal", + "utterance": "副驾座椅加热开到2档", + "started_at": "2026-08-01T16:58:41.593579Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165841-1818ca", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 67 00 00 00 00", + "timestamp": 33957.275065 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 64 00 00 00 00", + "timestamp": 33957.301682 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 65 00 00 00 00", + "timestamp": 33957.327241 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 66 00 00 00 00", + "timestamp": 33957.353047 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 33957.361982 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 33957.361982 + } + }, + "captured_at": "2026-08-01T16:58:42.375305Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:58:42.458664Z", + "duration_ms": 865 + }, + { + "id": "THERM-H-3", + "group": "thermal", + "utterance": "副驾座椅加热开到3档", + "started_at": "2026-08-01T16:58:42.458718Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165842-7be445", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 64 00 00 00 00", + "timestamp": 33958.147489 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 65 00 00 00 00", + "timestamp": 33958.17301 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 66 00 00 00 00", + "timestamp": 33958.19969 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 67 00 00 00 00", + "timestamp": 33958.225239 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 33958.231924 + } + }, + "heating": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 33958.231924 + } + }, + "captured_at": "2026-08-01T16:58:43.245268Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:58:43.322944Z", + "duration_ms": 864 + }, + { + "id": "THERM-H-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅加热", + "started_at": "2026-08-01T16:58:43.323003Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165843-a122cf", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 64 00 00 00 00", + "timestamp": 33958.977621 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 65 00 00 00 00", + "timestamp": 33959.003071 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 66 00 00 00 00", + "timestamp": 33959.029648 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 67 00 00 00 00", + "timestamp": 33959.055459 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33959.062138 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33959.062138 + } + }, + "captured_at": "2026-08-01T16:58:44.075421Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:58:44.162451Z", + "duration_ms": 839 + }, + { + "id": "THERM-V-1", + "group": "thermal", + "utterance": "副驾座椅通风开到1档", + "started_at": "2026-08-01T16:58:44.162505Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165844-5ac04a", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 64 00 00 00 00", + "timestamp": 33959.821916 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 65 00 00 00 00", + "timestamp": 33959.847733 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 66 00 00 00 00", + "timestamp": 33959.873151 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 67 00 00 00 00", + "timestamp": 33959.89977 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 33959.905367 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 33959.905367 + } + }, + "captured_at": "2026-08-01T16:58:44.918541Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:58:45.000904Z", + "duration_ms": 838 + }, + { + "id": "THERM-V-2", + "group": "thermal", + "utterance": "副驾座椅通风开到2档", + "started_at": "2026-08-01T16:58:45.000961Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165845-a745b7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 64 00 00 00 00", + "timestamp": 33960.665204 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 65 00 00 00 00", + "timestamp": 33960.691756 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 66 00 00 00 00", + "timestamp": 33960.717225 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 67 00 00 00 00", + "timestamp": 33960.744105 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 33960.749702 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 33960.749702 + } + }, + "captured_at": "2026-08-01T16:58:45.762915Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:58:45.846671Z", + "duration_ms": 846 + }, + { + "id": "THERM-V-3", + "group": "thermal", + "utterance": "副驾座椅通风开到3档", + "started_at": "2026-08-01T16:58:45.846729Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165845-9215b0", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 64 00 00 00 00", + "timestamp": 33961.491153 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 65 00 00 00 00", + "timestamp": 33961.517744 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 66 00 00 00 00", + "timestamp": 33961.543512 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 67 00 00 00 00", + "timestamp": 33961.570101 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 33961.57789 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 33961.57789 + } + }, + "captured_at": "2026-08-01T16:58:46.591152Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:58:46.679815Z", + "duration_ms": 833 + }, + { + "id": "THERM-V-OFF", + "group": "thermal", + "utterance": "关闭副驾座椅通风", + "started_at": "2026-08-01T16:58:46.679892Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165846-6c49f7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 64 00 00 00 00", + "timestamp": 33962.337988 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 65 00 00 00 00", + "timestamp": 33962.363413 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 66 00 00 00 00", + "timestamp": 33962.390019 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 67 00 00 00 00", + "timestamp": 33962.415496 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33962.422179 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33962.422179 + } + }, + "captured_at": "2026-08-01T16:58:47.435325Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:58:47.512136Z", + "duration_ms": 832 + }, + { + "id": "MOTION-M0-25", + "group": "motion", + "utterance": "把副驾座椅水平位置调到25%", + "started_at": "2026-08-01T16:58:47.512204Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165847-75993f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 2525, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 69 00 DD 09 00", + "timestamp": 33967.153221 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 68 00 00 00 00", + "timestamp": 33967.18019 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 68 00 00 00 00", + "timestamp": 33967.206048 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 68 00 00 00 00", + "timestamp": 33967.231817 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33967.2401 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33967.2401 + } + }, + "captured_at": "2026-08-01T16:58:52.253241Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:58:52.327216Z", + "duration_ms": 4815 + }, + { + "id": "MOTION-M0-75", + "group": "motion", + "utterance": "把副驾座椅水平位置调到75%", + "started_at": "2026-08-01T16:58:52.327271Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165852-7a72ed", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7515, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 6B 00 5B 1D 00", + "timestamp": 33975.674201 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 6A 00 00 00 00", + "timestamp": 33975.700112 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 6A 00 00 00 00", + "timestamp": 33975.725955 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 6A 00 00 00 00", + "timestamp": 33975.752099 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33975.76113 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33975.76113 + } + }, + "captured_at": "2026-08-01T16:59:00.774072Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:59:00.855639Z", + "duration_ms": 8528 + }, + { + "id": "MOTION-M0-HOME", + "group": "motion", + "utterance": "把副驾座椅水平位置归零", + "started_at": "2026-08-01T16:59:00.855696Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165900-695164", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 6C 00 00 00 00", + "timestamp": 33989.886615 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6D 00 00 00 00", + "timestamp": 33989.91214 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 6C 00 00 00 00", + "timestamp": 33989.93873 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 6C 00 00 00 00", + "timestamp": 33989.964477 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33989.971188 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33989.971188 + } + }, + "captured_at": "2026-08-01T16:59:14.983746Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:59:15.056659Z", + "duration_ms": 14201 + }, + { + "id": "MOTION-M1-20", + "group": "motion", + "utterance": "把副驾坐盆调到20%", + "started_at": "2026-08-01T16:59:15.056795Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165915-65fa18", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2032, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 6F 00 F0 07 00", + "timestamp": 33992.312514 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 6E 00 00 00 00", + "timestamp": 33992.338389 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 6E 00 00 00 00", + "timestamp": 33992.364609 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 6E 00 00 00 00", + "timestamp": 33992.390412 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33992.399497 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33992.399497 + } + }, + "captured_at": "2026-08-01T16:59:17.412102Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:59:17.488121Z", + "duration_ms": 2431 + }, + { + "id": "MOTION-M1-60", + "group": "motion", + "utterance": "把副驾坐盆调到60%", + "started_at": "2026-08-01T16:59:17.488175Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165917-4b67f3", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 70 00 00 00 00", + "timestamp": 33996.428291 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 70 00 00 00 00", + "timestamp": 33996.454511 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 70 00 00 00 00", + "timestamp": 33996.48033 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 71 00 65 17 00", + "timestamp": 33996.506252 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33996.515289 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 33996.515289 + } + }, + "captured_at": "2026-08-01T16:59:21.527765Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:59:21.606263Z", + "duration_ms": 4118 + }, + { + "id": "MOTION-M2-25", + "group": "motion", + "utterance": "把副驾靠背调到25%", + "started_at": "2026-08-01T16:59:21.606343Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165921-6cee8c", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 72 00 65 17 00", + "timestamp": 34004.026783 + } + }, + "backrest_recline": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2497, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 73 00 C1 09 00", + "timestamp": 34004.053038 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 72 00 00 00 00", + "timestamp": 34004.078986 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 72 00 00 00 00", + "timestamp": 34004.104953 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34004.112858 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34004.112858 + } + }, + "captured_at": "2026-08-01T16:59:29.125201Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:59:29.251711Z", + "duration_ms": 7645 + }, + { + "id": "MOTION-M2-60", + "group": "motion", + "utterance": "把副驾靠背调到60%", + "started_at": "2026-08-01T16:59:29.251773Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165929-d60acc", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 74 00 65 17 00", + "timestamp": 34014.312699 + } + }, + "backrest_recline": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 75 00 79 17 00", + "timestamp": 34014.338618 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 74 00 00 00 00", + "timestamp": 34014.364946 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 74 00 00 00 00", + "timestamp": 34014.390835 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34014.398832 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34014.398832 + } + }, + "captured_at": "2026-08-01T16:59:39.410969Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:59:39.500273Z", + "duration_ms": 10249 + }, + { + "id": "MOTION-M2-HOME", + "group": "motion", + "utterance": "把副驾靠背归零", + "started_at": "2026-08-01T16:59:39.500353Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165939-de4ed7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 76 00 00 00 00", + "timestamp": 34032.801741 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 76 00 65 17 00", + "timestamp": 34032.827323 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 77 00 00 00 00", + "timestamp": 34032.853224 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 76 00 00 00 00", + "timestamp": 34032.878787 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34032.886576 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34032.886576 + } + }, + "captured_at": "2026-08-01T16:59:57.898342Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T16:59:57.974694Z", + "duration_ms": 18474 + }, + { + "id": "MOTION-M3-20", + "group": "motion", + "utterance": "把副驾腿托调到20%", + "started_at": "2026-08-01T16:59:57.974757Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801165957-b8e46e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 78 00 00 00 00", + "timestamp": 34036.617557 + } + }, + "legrest_height": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 79 00 D9 07 00", + "timestamp": 34036.643471 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 78 00 00 00 00", + "timestamp": 34036.66978 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 78 00 65 17 00", + "timestamp": 34036.695668 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34036.703671 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34036.703671 + } + }, + "captured_at": "2026-08-01T17:00:01.715434Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:00:01.789672Z", + "duration_ms": 3815 + }, + { + "id": "MOTION-M3-60", + "group": "motion", + "utterance": "把副驾腿托调到60%", + "started_at": "2026-08-01T17:00:01.789728Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170001-97f1a0", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5997, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 7B 00 6D 17 00", + "timestamp": 34043.401583 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 7A 00 00 00 00", + "timestamp": 34043.42748 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 7A 00 65 17 00", + "timestamp": 34043.4538 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 7A 00 00 00 00", + "timestamp": 34043.479769 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34043.487672 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34043.487672 + } + }, + "captured_at": "2026-08-01T17:00:08.499203Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:00:08.578135Z", + "duration_ms": 6788 + }, + { + "id": "MOTION-M3-HOME", + "group": "motion", + "utterance": "把副驾腿托归零", + "started_at": "2026-08-01T17:00:08.578191Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170008-a6fdf0", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 7C 00 00 00 00", + "timestamp": 34053.589228 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 7D 00 00 00 00", + "timestamp": 34053.615932 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 18 7C 00 00 00 00", + "timestamp": 34053.641455 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 7C 00 65 17 00", + "timestamp": 34053.66742 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34053.675201 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34053.675201 + } + }, + "captured_at": "2026-08-01T17:00:18.686791Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:00:18.764322Z", + "duration_ms": 10186 + }, + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T17:00:18.764381Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170018-b875b8", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 82 00 00 00 00", + "timestamp": 34076.930018 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 7F 00 00 00 00", + "timestamp": 34076.956602 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 80 00 00 00 00", + "timestamp": 34076.982073 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 81 00 00 00 00", + "timestamp": 34077.007845 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34077.014556 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34077.014556 + } + }, + "captured_at": "2026-08-01T17:00:42.025520Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:00:42.095974Z", + "duration_ms": 23332 + }, + { + "id": "COMBINED-ALL", + "group": "combined", + "utterance": "打开副驾加热1档、打开通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%", + "started_at": "2026-08-01T17:00:42.096046Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170042-f4bb4d", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4037, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 85 00 C5 0F 00", + "timestamp": 34112.200599 + } + }, + "backrest_recline": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3708, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 86 00 7C 0E 00", + "timestamp": 34112.226744 + } + }, + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4219, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 87 00 7B 10 00", + "timestamp": 34112.252938 + } + }, + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 3026, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 84 00 D2 0B 00", + "timestamp": 34112.279053 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 34112.290207 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 34112.290207 + } + }, + "captured_at": "2026-08-01T17:01:17.300394Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:01:17.373384Z", + "duration_ms": 35277 + }, + { + "id": "COMBINED-OFF", + "group": "combined", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T17:01:17.373456Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170117-e15325", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 3026, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 84 00 D2 0B 00", + "timestamp": 34113.027123 + } + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4037, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 85 00 C5 0F 00", + "timestamp": 34113.053216 + } + }, + "backrest_recline": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3708, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 86 00 7C 0E 00", + "timestamp": 34113.07923 + } + }, + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4219, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 87 00 7B 10 00", + "timestamp": 34113.104607 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34113.114844 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34113.114844 + } + }, + "captured_at": "2026-08-01T17:01:18.125195Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:01:18.207309Z", + "duration_ms": 834 + }, + { + "id": "MODE-EASY-ENTRY", + "group": "mode", + "utterance": "副驾执行轻松进出模式", + "started_at": "2026-08-01T17:01:18.207374Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170118-aab686", + "matched_modes": [ + "easy_entry_exit" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 8B 00 00 00 00", + "timestamp": 34153.387936 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 8C 00 00 00 00", + "timestamp": 34153.413864 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 89 00 10 27 00", + "timestamp": 34153.440447 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 8A 00 00 00 00", + "timestamp": 34153.46603 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34153.472765 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34153.472765 + } + }, + "captured_at": "2026-08-01T17:01:58.482171Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:01:58.561830Z", + "duration_ms": 40354 + }, + { + "id": "MODE-OFFICE", + "group": "mode", + "utterance": "副驾执行办公模式", + "started_at": "2026-08-01T17:01:58.561907Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170158-3f6b61", + "matched_modes": [ + "office" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 21, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2117, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 91 00 45 08 00", + "timestamp": 34175.930894 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 8E 00 1A 1C 00", + "timestamp": 34175.957002 + } + }, + "cushion_tilt": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2193, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 8F 00 91 08 00", + "timestamp": 34175.983003 + } + }, + "backrest_recline": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2214, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 90 00 A6 08 00", + "timestamp": 34176.008392 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34176.018637 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34176.018637 + } + }, + "captured_at": "2026-08-01T17:02:21.027767Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:02:21.097981Z", + "duration_ms": 22536 + }, + { + "id": "MODE-QUEEN", + "group": "mode", + "utterance": "副驾执行女王副驾行驶模式", + "started_at": "2026-08-01T17:02:21.098056Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170221-7fae50", + "matched_modes": [ + "queen_passenger_driving" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 38, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3797, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 94 00 D5 0E 00", + "timestamp": 34191.653282 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4406, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 95 00 36 11 00", + "timestamp": 34191.67938 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 3122, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 96 00 32 0C 00", + "timestamp": 34191.705489 + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 93 00 1A 1C 00", + "timestamp": 34191.730767 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34191.739884 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34191.739884 + } + }, + "captured_at": "2026-08-01T17:02:36.748637Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:02:36.831176Z", + "duration_ms": 15733 + }, + { + "id": "MODE-BABY-NAP", + "group": "mode", + "utterance": "副驾执行宝宝午睡模式", + "started_at": "2026-08-01T17:02:36.831256Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170236-aa2721", + "matched_modes": [ + "baby_nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 99 00 B3 0B 00", + "timestamp": 34206.517144 + } + }, + "backrest_recline": { + "position_pct": 41, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4100, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 9A 00 04 10 00", + "timestamp": 34206.542843 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 9B 00 00 00 00", + "timestamp": 34206.569709 + } + }, + "longitudinal": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 8116, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 98 00 B4 1F 00", + "timestamp": 34206.595362 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34206.604399 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34206.604399 + } + }, + "captured_at": "2026-08-01T17:02:51.612769Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:02:51.743994Z", + "duration_ms": 14913 + }, + { + "id": "MODE-CRUISE-SOFA", + "group": "mode", + "utterance": "副驾执行巡航沙发模式", + "started_at": "2026-08-01T17:02:51.744083Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170251-25d77f", + "matched_modes": [ + "cruise_sofa" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4406, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 9F 00 36 11 00", + "timestamp": 34227.145285 + } + }, + "legrest_height": { + "position_pct": 53, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5301, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 A0 00 B5 14 00", + "timestamp": 34227.171387 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 9D 00 E2 13 00", + "timestamp": 34227.197402 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 9E 00 B3 0B 00", + "timestamp": 34227.22392 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34227.233039 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34227.233039 + } + }, + "captured_at": "2026-08-01T17:03:12.241003Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:03:12.318444Z", + "duration_ms": 20574 + }, + { + "id": "MODE-MEDITATION", + "group": "mode", + "utterance": "副驾执行冥想空间模式", + "started_at": "2026-08-01T17:03:12.318525Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170312-ba626c", + "matched_modes": [ + "meditation_space" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 58, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5811, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 A5 00 B3 16 00", + "timestamp": 34243.42054 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 A2 00 10 27 00", + "timestamp": 34243.446644 + } + }, + "cushion_tilt": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4412, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 A3 00 3C 11 00", + "timestamp": 34243.472751 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4362, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 A4 00 0A 11 00", + "timestamp": 34243.497686 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34243.507977 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34243.507977 + } + }, + "captured_at": "2026-08-01T17:03:28.515726Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:03:28.582661Z", + "duration_ms": 16264 + }, + { + "id": "MODE-LEISURE", + "group": "mode", + "utterance": "副驾执行休闲躺椅模式", + "started_at": "2026-08-01T17:03:28.582760Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170328-f317e6", + "matched_modes": [ + "leisure_lounger" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 66, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6598, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 A9 00 C6 19 00", + "timestamp": 34268.270288 + } + }, + "legrest_height": { + "position_pct": 76, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 7604, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 AA 00 B4 1D 00", + "timestamp": 34268.296373 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 A7 00 E2 13 00", + "timestamp": 34268.322881 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 A8 00 B3 0B 00", + "timestamp": 34268.34893 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34268.358089 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34268.358089 + } + }, + "captured_at": "2026-08-01T17:03:53.365347Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:03:53.443553Z", + "duration_ms": 24861 + }, + { + "id": "MODE-CALF", + "group": "mode", + "utterance": "副驾执行小腿解压悬浮模式", + "started_at": "2026-08-01T17:03:53.443639Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170353-4d3bf8", + "matched_modes": [ + "calf_decompression_float" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 28 AF 00 10 27 00", + "timestamp": 34301.047403 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 AC 00 E2 13 00", + "timestamp": 34301.073417 + } + }, + "cushion_tilt": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 7513, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 AD 00 59 1D 00", + "timestamp": 34301.099444 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 AE 00 00 00 00", + "timestamp": 34301.12586 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34301.133794 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34301.133794 + } + }, + "captured_at": "2026-08-01T17:04:26.140417Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:04:26.230191Z", + "duration_ms": 32787 + }, + { + "id": "MODE-BEACH", + "group": "mode", + "utterance": "副驾执行电感沙滩椅模式", + "started_at": "2026-08-01T17:04:26.230297Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170426-2ff5a0", + "matched_modes": [ + "electric_beach_chair" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5981, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 B4 00 5D 17 00", + "timestamp": 34357.070462 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 B1 00 10 27 00", + "timestamp": 34357.096447 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 B2 00 00 00 00", + "timestamp": 34357.123929 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 28 B3 00 10 27 00", + "timestamp": 34357.1488 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34357.157893 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34357.157893 + } + }, + "captured_at": "2026-08-01T17:05:22.163410Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:05:22.240070Z", + "duration_ms": 56010 + }, + { + "id": "MODE-NAP", + "group": "mode", + "utterance": "副驾执行小憩模式", + "started_at": "2026-08-01T17:05:22.240143Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170522-c5e5c9", + "matched_modes": [ + "nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 B9 00 B5 24 00", + "timestamp": 34383.483608 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 B6 00 10 27 00", + "timestamp": 34383.509719 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 B7 00 10 27 00", + "timestamp": 34383.535157 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 B8 00 A7 1F 00", + "timestamp": 34383.56124 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34383.571535 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34383.571535 + } + }, + "captured_at": "2026-08-01T17:05:48.576482Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:05:48.690511Z", + "duration_ms": 26450 + }, + { + "id": "MODE-ZERO-GRAVITY", + "group": "mode", + "utterance": "副驾执行零重力模式", + "started_at": "2026-08-01T17:05:48.690603Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170548-adcb9c", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 BE 00 B5 24 00", + "timestamp": 34390.339534 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 BB 00 10 27 00", + "timestamp": 34390.365679 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 BC 00 10 27 00", + "timestamp": 34390.391743 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BD 00 A7 1F 00", + "timestamp": 34390.417918 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34390.427469 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34390.427469 + } + }, + "captured_at": "2026-08-01T17:05:55.432315Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:05:55.511441Z", + "duration_ms": 6821 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T17:05:55.511502Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801170555-fefff7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BD 00 A7 1F 00", + "timestamp": 34391.195927 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 BE 00 B5 24 00", + "timestamp": 34391.222014 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 BB 00 10 27 00", + "timestamp": 34391.247436 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 BC 00 10 27 00", + "timestamp": 34391.273537 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34391.282664 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 34391.282664 + } + }, + "captured_at": "2026-08-01T17:05:56.287538Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:05:56.356721Z", + "duration_ms": 845 + }, + "finished_at": "2026-08-01T17:05:56.356757Z", + "summary": { + "total": 33, + "passed": 33, + "failed": 0, + "safety_blocked": 0, + "executed": 33, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260802_zero_gravity_timeout_fix.json b/artifacts/hil/seat_frontend_hil_20260802_zero_gravity_timeout_fix.json new file mode 100644 index 0000000..d73058f --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260802_zero_gravity_timeout_fix.json @@ -0,0 +1,252 @@ +{ + "suite": "t2g-seat-frontend-full-hil", + "started_at": "2026-08-01T17:32:02.775803Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801173202", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MODE-ZERO-GRAVITY", + "group": "mode", + "utterance": "打开零重力模式", + "started_at": "2026-08-01T17:32:02.775839Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173202-68d1da", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 2C 01 10 27 00", + "timestamp": 35964.438236 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 2D 01 A7 1F 00", + "timestamp": 35964.464297 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 2E 01 B5 24 00", + "timestamp": 35964.490843 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 2B 01 10 27 00", + "timestamp": 35964.51698 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35964.526089 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35964.526089 + } + }, + "captured_at": "2026-08-01T17:32:09.500643Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:32:09.582995Z", + "duration_ms": 6807 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T17:32:09.583051Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801173209-29898b", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 2B 01 10 27 00", + "timestamp": 35965.246437 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 2C 01 10 27 00", + "timestamp": 35965.27405 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 2D 01 A7 1F 00", + "timestamp": 35965.3002 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 2E 01 B5 24 00", + "timestamp": 35965.326337 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35965.334306 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 35965.334306 + } + }, + "captured_at": "2026-08-01T17:32:10.308851Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T17:32:10.379863Z", + "duration_ms": 797 + }, + "finished_at": "2026-08-01T17:32:10.379894Z", + "summary": { + "total": 1, + "passed": 1, + "failed": 0, + "safety_blocked": 0, + "executed": 1, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_cleanup.json b/artifacts/hil/seat_frontend_hil_cleanup.json new file mode 100644 index 0000000..0d1431f --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_cleanup.json @@ -0,0 +1,250 @@ +{ + "suite": "t2g-seat-frontend-comprehensive-hil", + "started_at": "2026-08-01T18:19:38.370275Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801181938", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T18:19:38.370320Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181938-22b770", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 2A 01 00 00 00", + "timestamp": 38880.446998 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 2B 01 00 00 00", + "timestamp": 38880.472823 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 28 01 00 00 00", + "timestamp": 38880.498667 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 29 01 00 00 00", + "timestamp": 38880.524482 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38880.532693 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38880.532693 + } + }, + "captured_at": "2026-08-01T18:20:45.450814Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:20:45.533084Z", + "duration_ms": 67163 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T18:20:45.533139Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801182045-0ea6d9", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 30 01 00 00 00", + "timestamp": 38903.567521 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 2D 01 00 00 00", + "timestamp": 38903.593343 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 2E 01 00 00 00", + "timestamp": 38903.619184 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 2F 01 00 00 00", + "timestamp": 38903.646408 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38903.653213 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38903.653213 + } + }, + "captured_at": "2026-08-01T18:21:08.570962Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:21:08.651237Z", + "duration_ms": 23118 + }, + "finished_at": "2026-08-01T18:21:08.651275Z", + "summary": { + "total": 1, + "passed": 1, + "failed": 0, + "safety_blocked": 0, + "executed": 1, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_latest.json b/artifacts/hil/seat_frontend_hil_latest.json new file mode 100644 index 0000000..33bf456 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_latest.json @@ -0,0 +1,14719 @@ +{ + "suite": "t2g-seat-frontend-comprehensive-hil", + "started_at": "2026-08-01T18:03:13.048608Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801180313", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "THERM-H-LOW-NUMERIC", + "group": "thermal", + "utterance": "副驾座椅加热开到1档", + "started_at": "2026-08-01T18:03:13.048648Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180313-2b8d9a", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37828.834093 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37828.86012 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37828.887604 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37828.913615 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 37828.921562 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 37828.921562 + } + }, + "captured_at": "2026-08-01T18:03:13.860092Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:13.946164Z", + "duration_ms": 898 + }, + { + "id": "THERM-H-LOW-CHINESE", + "group": "thermal", + "utterance": "把副驾驶座椅加热调到一档", + "started_at": "2026-08-01T18:03:13.946222Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180313-505b77", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37829.708145 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37829.734183 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37829.760186 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37829.787662 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 37829.794527 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 37829.794527 + } + }, + "captured_at": "2026-08-01T18:03:14.733052Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:14.812731Z", + "duration_ms": 867 + }, + { + "id": "THERM-H-LOW-WORD", + "group": "thermal", + "utterance": "副驾位座椅加热最低档", + "started_at": "2026-08-01T18:03:14.812785Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180314-9bc8e4", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37830.5784 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37830.603645 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37830.629649 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37830.655708 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 37830.667051 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 37830.667051 + } + }, + "captured_at": "2026-08-01T18:03:15.605651Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:15.691478Z", + "duration_ms": 879 + }, + { + "id": "THERM-H-LOW-DEFAULT", + "group": "thermal", + "utterance": "打开座椅加热", + "started_at": "2026-08-01T18:03:15.691537Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180315-4a8c7a", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37831.436545 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37831.462501 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37831.487734 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37831.513772 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 37831.522807 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 37831.522807 + } + }, + "captured_at": "2026-08-01T18:03:16.461147Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:16.540435Z", + "duration_ms": 849 + }, + { + "id": "THERM-H-MID-NUMERIC", + "group": "thermal", + "utterance": "副驾座椅加热开到2档", + "started_at": "2026-08-01T18:03:16.540493Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180316-85546f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37832.339986 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37832.366003 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37832.392309 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37832.418356 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 37832.427447 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 37832.427447 + } + }, + "captured_at": "2026-08-01T18:03:17.365841Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:17.446957Z", + "duration_ms": 906 + }, + { + "id": "THERM-H-MID-CHINESE", + "group": "thermal", + "utterance": "乘客座加热调到二档", + "started_at": "2026-08-01T18:03:17.447010Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180317-dff074", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37833.229797 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37833.25589 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37833.281869 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37833.308211 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 37833.31732 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 37833.31732 + } + }, + "captured_at": "2026-08-01T18:03:18.255784Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:18.350416Z", + "duration_ms": 903 + }, + { + "id": "THERM-H-MID-WORD", + "group": "thermal", + "utterance": "座椅加热设置为中档", + "started_at": "2026-08-01T18:03:18.350473Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180318-7cb81c", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37834.13423 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37834.160245 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37834.187753 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37834.213764 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 37834.220583 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 37834.220583 + } + }, + "captured_at": "2026-08-01T18:03:19.159037Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:19.245051Z", + "duration_ms": 895 + }, + { + "id": "THERM-H-HIGH-NUMERIC", + "group": "thermal", + "utterance": "副驾座椅加热开到3档", + "started_at": "2026-08-01T18:03:19.245103Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180319-7ae585", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37835.022444 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37835.048503 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37835.074522 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37835.099752 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 37835.108837 + } + }, + "heating": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 37835.108837 + } + }, + "captured_at": "2026-08-01T18:03:20.047145Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:20.121928Z", + "duration_ms": 877 + }, + { + "id": "THERM-H-HIGH-PREFIX", + "group": "thermal", + "utterance": "右前座椅开启3档加热", + "started_at": "2026-08-01T18:03:20.121998Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180320-5cb10e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37835.895724 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37835.92169 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37835.947789 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37835.97381 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 37835.982869 + } + }, + "heating": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 37835.982869 + } + }, + "captured_at": "2026-08-01T18:03:20.921249Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:20.984663Z", + "duration_ms": 863 + }, + { + "id": "THERM-H-HIGH-WORD", + "group": "thermal", + "utterance": "乘客座椅加热调到最高档", + "started_at": "2026-08-01T18:03:20.984717Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180320-25cb8e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37836.724463 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37836.750502 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37836.776534 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37836.801737 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 37836.810848 + } + }, + "heating": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 37836.810848 + } + }, + "captured_at": "2026-08-01T18:03:21.749151Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:21.824666Z", + "duration_ms": 840 + }, + { + "id": "THERM-H-OFF-CLOSE", + "group": "thermal", + "utterance": "关闭副驾座椅加热", + "started_at": "2026-08-01T18:03:21.824729Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180321-9002c0", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37837.538673 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37837.564491 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37837.590622 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37837.616454 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37837.624371 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37837.624371 + } + }, + "captured_at": "2026-08-01T18:03:22.562696Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:22.641761Z", + "duration_ms": 817 + }, + { + "id": "THERM-H-OFF-DROP", + "group": "thermal", + "utterance": "关掉副驾驶座椅加热", + "started_at": "2026-08-01T18:03:22.641814Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180322-b20fa0", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37838.387227 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37838.411923 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37838.437784 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37838.464717 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37838.47259 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37838.47259 + } + }, + "captured_at": "2026-08-01T18:03:23.410906Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:23.492401Z", + "duration_ms": 851 + }, + { + "id": "THERM-H-OFF-STOP", + "group": "thermal", + "utterance": "停止乘客座加热", + "started_at": "2026-08-01T18:03:23.492460Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180323-5d384e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37839.262241 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37839.28841 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37839.314256 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37839.340057 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37839.347992 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37839.347992 + } + }, + "captured_at": "2026-08-01T18:03:24.286187Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:24.360420Z", + "duration_ms": 868 + }, + { + "id": "THERM-H-OFF-DEFAULT", + "group": "thermal", + "utterance": "座椅加热关闭", + "started_at": "2026-08-01T18:03:24.360509Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180324-7114ae", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37840.092677 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37840.118541 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37840.144408 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37840.170192 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37840.178116 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37840.178116 + } + }, + "captured_at": "2026-08-01T18:03:25.116365Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:25.220394Z", + "duration_ms": 860 + }, + { + "id": "THERM-H-COMFORT-MILD", + "group": "thermal", + "utterance": "副驾驶有点冷", + "started_at": "2026-08-01T18:03:25.220457Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180325-8f3c3e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37840.972664 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37840.99795 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37841.023959 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37841.049982 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 37841.059103 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 37841.059103 + } + }, + "captured_at": "2026-08-01T18:03:25.997430Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:26.077380Z", + "duration_ms": 857 + }, + { + "id": "THERM-H-COMFORT-STRONG", + "group": "thermal", + "utterance": "右前座椅太冷了", + "started_at": "2026-08-01T18:03:26.077439Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180326-b2b293", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37841.860666 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37841.888168 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37841.914195 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37841.940208 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 37841.947077 + } + }, + "heating": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "21 00 00 00 00 00 00 00", + "timestamp": 37841.947077 + } + }, + "captured_at": "2026-08-01T18:03:26.885294Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:27.051907Z", + "duration_ms": 974 + }, + { + "id": "THERM-H-COMFORT-OFF", + "group": "thermal", + "utterance": "把右前座加热关掉", + "started_at": "2026-08-01T18:03:27.051969Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180327-057d60", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37842.881896 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37842.908047 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37842.933819 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37842.960826 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37842.968745 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37842.968745 + } + }, + "captured_at": "2026-08-01T18:03:27.906885Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:27.983173Z", + "duration_ms": 931 + }, + { + "id": "THERM-V-LOW-NUMERIC", + "group": "thermal", + "utterance": "副驾座椅通风开到1档", + "started_at": "2026-08-01T18:03:27.983230Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180327-3aee9e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37843.727974 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37843.754982 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37843.780757 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37843.805835 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 37843.813706 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 37843.813706 + } + }, + "captured_at": "2026-08-01T18:03:28.751916Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:28.838585Z", + "duration_ms": 855 + }, + { + "id": "THERM-V-LOW-CHINESE", + "group": "thermal", + "utterance": "副驾驶座椅通风调到一档", + "started_at": "2026-08-01T18:03:28.838639Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180328-907ab8", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37844.570358 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37844.596513 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37844.622315 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37844.64819 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 37844.658347 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 37844.658347 + } + }, + "captured_at": "2026-08-01T18:03:29.596471Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:29.672129Z", + "duration_ms": 833 + }, + { + "id": "THERM-V-LOW-WORD", + "group": "thermal", + "utterance": "乘客座通风最低档", + "started_at": "2026-08-01T18:03:29.672187Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180329-ce2cf9", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37845.400132 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37845.425956 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37845.452885 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37845.47874 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 37845.48744 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 37845.48744 + } + }, + "captured_at": "2026-08-01T18:03:30.425548Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:30.501809Z", + "duration_ms": 830 + }, + { + "id": "THERM-V-MID-NUMERIC", + "group": "thermal", + "utterance": "副驾座椅通风开到2档", + "started_at": "2026-08-01T18:03:30.501870Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180330-40fff8", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37846.248807 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37846.274654 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37846.300766 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37846.326609 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 37846.334532 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 37846.334532 + } + }, + "captured_at": "2026-08-01T18:03:31.272615Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:31.351788Z", + "duration_ms": 850 + }, + { + "id": "THERM-V-MID-PREFIX", + "group": "thermal", + "utterance": "右前座椅开启2档通风", + "started_at": "2026-08-01T18:03:31.351849Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180331-6f1aed", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37847.078576 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37847.104739 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37847.130537 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37847.156414 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 37847.164335 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 37847.164335 + } + }, + "captured_at": "2026-08-01T18:03:32.102539Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:32.189612Z", + "duration_ms": 838 + }, + { + "id": "THERM-V-MID-WORD", + "group": "thermal", + "utterance": "打开座椅通风中档", + "started_at": "2026-08-01T18:03:32.189666Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180332-cad393", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37847.908492 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37847.934346 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37847.960157 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37847.987439 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 37847.99537 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 37847.99537 + } + }, + "captured_at": "2026-08-01T18:03:32.933421Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:33.021186Z", + "duration_ms": 832 + }, + { + "id": "THERM-V-HIGH-NUMERIC", + "group": "thermal", + "utterance": "副驾座椅通风开到3档", + "started_at": "2026-08-01T18:03:33.021243Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180333-00596c", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37848.738213 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37848.764072 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37848.790206 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37848.816051 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 37848.825092 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 37848.825092 + } + }, + "captured_at": "2026-08-01T18:03:33.763230Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:33.868681Z", + "duration_ms": 847 + }, + { + "id": "THERM-V-HIGH-CHINESE", + "group": "thermal", + "utterance": "乘客座椅通风调到三档", + "started_at": "2026-08-01T18:03:33.868742Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180333-76af9f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37849.600149 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37849.625992 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37849.65292 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37849.678757 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 37849.687472 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 37849.687472 + } + }, + "captured_at": "2026-08-01T18:03:34.625470Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:34.772675Z", + "duration_ms": 904 + }, + { + "id": "THERM-V-HIGH-WORD", + "group": "thermal", + "utterance": "右前座通风最高档", + "started_at": "2026-08-01T18:03:34.772756Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180334-13f47e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37850.524465 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37850.550287 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37850.576138 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37850.602276 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 37850.611305 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 37850.611305 + } + }, + "captured_at": "2026-08-01T18:03:35.549455Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:35.623077Z", + "duration_ms": 850 + }, + { + "id": "THERM-V-OFF-CLOSE", + "group": "thermal", + "utterance": "关闭副驾座椅通风", + "started_at": "2026-08-01T18:03:35.623136Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180335-94ce44", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37851.412383 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37851.438254 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37851.464063 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37851.490233 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37851.49926 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37851.49926 + } + }, + "captured_at": "2026-08-01T18:03:36.437277Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:36.581634Z", + "duration_ms": 959 + }, + { + "id": "THERM-V-OFF-DROP", + "group": "thermal", + "utterance": "关掉副驾驶座椅通风", + "started_at": "2026-08-01T18:03:36.581706Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180336-4cefe1", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37852.322237 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37852.348107 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37852.37507 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37852.400091 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37852.40802 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37852.40802 + } + }, + "captured_at": "2026-08-01T18:03:37.346107Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:37.429462Z", + "duration_ms": 848 + }, + { + "id": "THERM-V-OFF-STOP", + "group": "thermal", + "utterance": "停止右前座通风", + "started_at": "2026-08-01T18:03:37.429518Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180337-fc248f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37853.218726 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37853.244589 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37853.270358 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37853.296516 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37853.305549 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37853.305549 + } + }, + "captured_at": "2026-08-01T18:03:38.243640Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:38.319330Z", + "duration_ms": 890 + }, + { + "id": "THERM-V-COMFORT-MILD", + "group": "thermal", + "utterance": "副驾驶有点热", + "started_at": "2026-08-01T18:03:38.319387Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180338-940fbc", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37854.03214 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37854.059153 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37854.084969 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37854.111084 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 37854.117897 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 37854.117897 + } + }, + "captured_at": "2026-08-01T18:03:39.055915Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:39.133791Z", + "duration_ms": 814 + }, + { + "id": "THERM-V-COMFORT-STRONG", + "group": "thermal", + "utterance": "右前座椅太闷了", + "started_at": "2026-08-01T18:03:39.133851Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180339-f61d79", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37854.865125 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37854.890144 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37854.917119 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37854.942931 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 37854.950866 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0C 00 00 00 00 00 00 00", + "timestamp": 37854.950866 + } + }, + "captured_at": "2026-08-01T18:03:39.888924Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:39.966631Z", + "duration_ms": 833 + }, + { + "id": "THERM-V-COMFORT-OFF", + "group": "thermal", + "utterance": "把乘客座通风关掉", + "started_at": "2026-08-01T18:03:39.966694Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180339-9561d2", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37855.710285 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37855.736113 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37855.763032 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37855.789224 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37855.797123 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37855.797123 + } + }, + "captured_at": "2026-08-01T18:03:40.735033Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:40.816905Z", + "duration_ms": 850 + }, + { + "id": "THERM-MIXED-COMFORT", + "group": "thermal", + "utterance": "副驾驶有点冷又有点闷", + "started_at": "2026-08-01T18:03:40.816964Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180340-7ba27d", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37856.606998 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37856.632996 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37856.659067 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37856.685132 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 37856.693417 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 37856.693417 + } + }, + "captured_at": "2026-08-01T18:03:41.631658Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:41.712736Z", + "duration_ms": 896 + }, + { + "id": "THERM-MIXED-OFF", + "group": "thermal", + "utterance": "关闭右前座的加热和通风", + "started_at": "2026-08-01T18:03:41.712799Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180341-8b02bd", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37857.444344 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37857.471241 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37857.496305 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37857.523184 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37857.531109 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37857.531109 + } + }, + "captured_at": "2026-08-01T18:03:42.469069Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:42.547355Z", + "duration_ms": 835 + }, + { + "id": "THERM-AIRFLOW-SETUP", + "group": "thermal", + "utterance": "右前座通风调到2档", + "started_at": "2026-08-01T18:03:42.547416Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180342-ae3fff", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37858.288978 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37858.314807 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37858.340638 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37858.366494 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 37858.376641 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0B 00 00 00 00 00 00 00", + "timestamp": 37858.376641 + } + }, + "captured_at": "2026-08-01T18:03:43.314519Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:43.397779Z", + "duration_ms": 850 + }, + { + "id": "THERM-AIRFLOW-COLD", + "group": "thermal", + "utterance": "副驾被风吹得有点冷", + "started_at": "2026-08-01T18:03:43.397838Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180343-b09247", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37859.179208 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37859.204209 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37859.231177 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37859.257038 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 37859.264975 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "0A 00 00 00 00 00 00 00", + "timestamp": 37859.264975 + } + }, + "captured_at": "2026-08-01T18:03:44.202835Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:44.278739Z", + "duration_ms": 881 + }, + { + "id": "THERM-AIRFLOW-OFF", + "group": "thermal", + "utterance": "关闭座椅通风", + "started_at": "2026-08-01T18:03:44.278843Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180344-73102d", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6F 01 00 00 00", + "timestamp": 37860.00863 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 6C 01 00 00 00", + "timestamp": 37860.034486 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6D 01 00 00 00", + "timestamp": 37860.060297 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6E 01 00 00 00", + "timestamp": 37860.088677 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37860.095488 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37860.095488 + } + }, + "captured_at": "2026-08-01T18:03:45.033348Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:45.115687Z", + "duration_ms": 837 + }, + { + "id": "MOTION-M0-25-HORIZONTAL", + "group": "motion", + "utterance": "把副驾座椅水平位置调到25%", + "started_at": "2026-08-01T18:03:45.115747Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180345-cc4b46", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 01 00 00 00 00", + "timestamp": 37864.853077 + } + }, + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 2525, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 02 00 DD 09 00", + "timestamp": 37864.879373 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 01 00 00 00 00", + "timestamp": 37864.90494 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 01 00 00 00 00", + "timestamp": 37864.931231 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37864.941604 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37864.941604 + } + }, + "captured_at": "2026-08-01T18:03:49.879404Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:49.965027Z", + "duration_ms": 4849 + }, + { + "id": "MOTION-M0-25-FRONTBACK", + "group": "motion", + "utterance": "副驾驶座椅前后位置设置为25%", + "started_at": "2026-08-01T18:03:49.965091Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180349-41abed", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 2505, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 04 00 C9 09 00", + "timestamp": 37865.704375 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 03 00 00 00 00", + "timestamp": 37865.730693 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 37865.75705 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 37865.783293 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37865.792841 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37865.792841 + } + }, + "captured_at": "2026-08-01T18:03:50.730555Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:50.818450Z", + "duration_ms": 853 + }, + { + "id": "MOTION-M0-25-RAIL", + "group": "motion", + "utterance": "右前座滑轨移到25%", + "started_at": "2026-08-01T18:03:50.818512Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180350-477236", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 2505, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 06 00 C9 09 00", + "timestamp": 37866.552797 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 05 00 00 00 00", + "timestamp": 37866.579091 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 05 00 00 00 00", + "timestamp": 37866.604638 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 05 00 00 00 00", + "timestamp": 37866.63091 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37866.640111 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37866.640111 + } + }, + "captured_at": "2026-08-01T18:03:51.577859Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:03:51.655568Z", + "duration_ms": 837 + }, + { + "id": "MOTION-M0-75-HORIZONTAL", + "group": "motion", + "utterance": "副驾座椅水平位置调到75%", + "started_at": "2026-08-01T18:03:51.655652Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180351-ca1a0b", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 07 00 00 00 00", + "timestamp": 37875.195518 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 07 00 00 00 00", + "timestamp": 37875.220666 + } + }, + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7515, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 08 00 5B 1D 00", + "timestamp": 37875.247013 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 07 00 00 00 00", + "timestamp": 37875.2733 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37875.283627 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37875.283627 + } + }, + "captured_at": "2026-08-01T18:04:00.221136Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:00.289344Z", + "duration_ms": 8634 + }, + { + "id": "MOTION-M0-75-LONGITUDINAL", + "group": "motion", + "utterance": "乘客座纵向移动至75%", + "started_at": "2026-08-01T18:04:00.289403Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180400-107ad4", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7495, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 0A 00 47 1D 00", + "timestamp": 37876.049065 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 09 00 00 00 00", + "timestamp": 37876.075382 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 09 00 00 00 00", + "timestamp": 37876.100882 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 09 00 00 00 00", + "timestamp": 37876.127237 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37876.136436 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37876.136436 + } + }, + "captured_at": "2026-08-01T18:04:01.074088Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:01.225142Z", + "duration_ms": 936 + }, + { + "id": "MOTION-M0-75-RAIL", + "group": "motion", + "utterance": "把副驾驶滑轨设为75%", + "started_at": "2026-08-01T18:04:01.225211Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180401-eccf96", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7495, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 0C 00 47 1D 00", + "timestamp": 37876.975129 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 0B 00 00 00 00", + "timestamp": 37877.00067 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 0B 00 00 00 00", + "timestamp": 37877.026988 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 0B 00 00 00 00", + "timestamp": 37877.053315 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37877.063648 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37877.063648 + } + }, + "captured_at": "2026-08-01T18:04:02.001258Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:02.082996Z", + "duration_ms": 858 + }, + { + "id": "MOTION-M0-50-CN-PERCENT", + "group": "motion", + "utterance": "座椅前后移动到百分之五十", + "started_at": "2026-08-01T18:04:02.083063Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180402-441a04", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 0D 00 00 00 00", + "timestamp": 37882.083092 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 0D 00 00 00 00", + "timestamp": 37882.109749 + } + }, + "longitudinal": { + "position_pct": 50, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5010, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 0E 00 92 13 00", + "timestamp": 37882.134933 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 0D 00 00 00 00", + "timestamp": 37882.161296 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37882.171639 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37882.171639 + } + }, + "captured_at": "2026-08-01T18:04:07.109245Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:07.186826Z", + "duration_ms": 5104 + }, + { + "id": "MOTION-M0-50-FULLWIDTH", + "group": "motion", + "utterance": "右前座水平位置调到50%", + "started_at": "2026-08-01T18:04:07.186898Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180407-d9445d", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 0F 00 00 00 00", + "timestamp": 37882.930836 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 0F 00 00 00 00", + "timestamp": 37882.957198 + } + }, + "longitudinal": { + "position_pct": 50, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5010, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 10 00 92 13 00", + "timestamp": 37882.983451 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 0F 00 00 00 00", + "timestamp": 37883.009002 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37883.019341 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37883.019341 + } + }, + "captured_at": "2026-08-01T18:04:07.956849Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:08.035631Z", + "duration_ms": 849 + }, + { + "id": "MOTION-M0-FRONTMOST", + "group": "motion", + "utterance": "把副驾座椅推到最前面", + "started_at": "2026-08-01T18:04:08.035695Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180408-a16ba3", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 11 00 00 00 00", + "timestamp": 37892.917144 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 12 00 00 00 00", + "timestamp": 37892.942967 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 11 00 00 00 00", + "timestamp": 37892.969913 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 11 00 00 00 00", + "timestamp": 37892.994986 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37893.004009 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37893.004009 + } + }, + "captured_at": "2026-08-01T18:04:17.941375Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:18.018815Z", + "duration_ms": 9983 + }, + { + "id": "MOTION-M0-HOME", + "group": "motion", + "utterance": "副驾驶座椅前后复位", + "started_at": "2026-08-01T18:04:18.018909Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180418-5206ef", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 13 00 00 00 00", + "timestamp": 37897.179487 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 14 00 00 00 00", + "timestamp": 37897.205619 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 13 00 00 00 00", + "timestamp": 37897.231444 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 13 00 00 00 00", + "timestamp": 37897.257322 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37897.265187 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37897.265187 + } + }, + "captured_at": "2026-08-01T18:04:22.202332Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:22.278460Z", + "duration_ms": 4260 + }, + { + "id": "MOTION-M0-ZERO", + "group": "motion", + "utterance": "右前座滑轨归零", + "started_at": "2026-08-01T18:04:22.278530Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180422-9ccbf0", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 15 00 00 00 00", + "timestamp": 37901.501948 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 15 00 00 00 00", + "timestamp": 37901.528127 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 15 00 00 00 00", + "timestamp": 37901.553965 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 16 00 00 00 00", + "timestamp": 37901.579768 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37901.588807 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37901.588807 + } + }, + "captured_at": "2026-08-01T18:04:26.525856Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:26.614196Z", + "duration_ms": 4336 + }, + { + "id": "MOTION-M0-REARMOST", + "group": "motion", + "utterance": "副驾驶座椅移动到最后面", + "started_at": "2026-08-01T18:04:26.614273Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180426-b1fe92", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 18 00 10 27 00", + "timestamp": 37918.049929 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 17 00 00 00 00", + "timestamp": 37918.076228 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 17 00 00 00 00", + "timestamp": 37918.10253 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 17 00 00 00 00", + "timestamp": 37918.128057 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37918.137218 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37918.137218 + } + }, + "captured_at": "2026-08-01T18:04:43.073943Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:43.149781Z", + "duration_ms": 16536 + }, + { + "id": "MOTION-M0-BACK-END", + "group": "motion", + "utterance": "把右前座滑轨向后移到底", + "started_at": "2026-08-01T18:04:43.149862Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180443-f49646", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 1A 00 10 27 00", + "timestamp": 37918.865692 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 19 00 00 00 00", + "timestamp": 37918.892018 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 19 00 00 00 00", + "timestamp": 37918.918691 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 19 00 00 00 00", + "timestamp": 37918.943849 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37918.95419 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37918.95419 + } + }, + "captured_at": "2026-08-01T18:04:43.891080Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:43.970091Z", + "duration_ms": 820 + }, + { + "id": "MOTION-M1-20-PAN", + "group": "motion", + "utterance": "把副驾坐盆调到20%", + "started_at": "2026-08-01T18:04:43.970155Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180443-2259d4", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 1B 00 00 00 00", + "timestamp": 37921.366316 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 1B 00 10 27 00", + "timestamp": 37921.392712 + } + }, + "cushion_tilt": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2005, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 1C 00 D5 07 00", + "timestamp": 37921.418383 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 1B 00 00 00 00", + "timestamp": 37921.444721 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37921.455101 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37921.455101 + } + }, + "captured_at": "2026-08-01T18:04:46.391972Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:46.475218Z", + "duration_ms": 2505 + }, + { + "id": "MOTION-M1-20-CUSHION", + "group": "motion", + "utterance": "副驾驶坐垫位置设置为20%", + "started_at": "2026-08-01T18:04:46.475280Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180446-1dc0b0", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 1D 00 00 00 00", + "timestamp": 37922.245667 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 1D 00 10 27 00", + "timestamp": 37922.27211 + } + }, + "cushion_tilt": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2005, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 1E 00 D5 07 00", + "timestamp": 37922.298572 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 1D 00 00 00 00", + "timestamp": 37922.324211 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37922.334588 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37922.334588 + } + }, + "captured_at": "2026-08-01T18:04:47.271188Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:47.355194Z", + "duration_ms": 880 + }, + { + "id": "MOTION-M1-60-PAN", + "group": "motion", + "utterance": "副驾坐盆调到60%", + "started_at": "2026-08-01T18:04:47.355263Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180447-8aa2f6", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 20 00 65 17 00", + "timestamp": 37926.388749 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 1F 00 00 00 00", + "timestamp": 37926.4144 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 1F 00 00 00 00", + "timestamp": 37926.440808 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 1F 00 10 27 00", + "timestamp": 37926.466101 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37926.477602 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37926.477602 + } + }, + "captured_at": "2026-08-01T18:04:51.414231Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:51.499968Z", + "duration_ms": 4145 + }, + { + "id": "MOTION-M1-60-TILT", + "group": "motion", + "utterance": "右前座坐垫倾角调到60%", + "started_at": "2026-08-01T18:04:51.500031Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180451-4a28a5", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 21 00 00 00 00", + "timestamp": 37927.254126 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 21 00 00 00 00", + "timestamp": 37927.280567 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 21 00 10 27 00", + "timestamp": 37927.305833 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 22 00 65 17 00", + "timestamp": 37927.332664 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37927.343049 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37927.343049 + } + }, + "captured_at": "2026-08-01T18:04:52.279720Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:52.402784Z", + "duration_ms": 903 + }, + { + "id": "MOTION-M1-50-CN-PERCENT", + "group": "motion", + "utterance": "乘客座坐盆调到百分之五十", + "started_at": "2026-08-01T18:04:52.402836Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180452-58470b", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 23 00 10 27 00", + "timestamp": 37928.948815 + } + }, + "cushion_tilt": { + "position_pct": 50, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 24 00 88 13 00", + "timestamp": 37928.974118 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 23 00 00 00 00", + "timestamp": 37929.00053 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 23 00 00 00 00", + "timestamp": 37929.026161 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37929.037662 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37929.037662 + } + }, + "captured_at": "2026-08-01T18:04:53.974340Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:54.049144Z", + "duration_ms": 1646 + }, + { + "id": "MOTION-M1-50-FULLWIDTH", + "group": "motion", + "utterance": "副驾驶坐垫设置为50%", + "started_at": "2026-08-01T18:04:54.049224Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180454-5ab231", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 50, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 26 00 88 13 00", + "timestamp": 37929.799906 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 25 00 00 00 00", + "timestamp": 37929.826666 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 25 00 00 00 00", + "timestamp": 37929.851953 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 25 00 10 27 00", + "timestamp": 37929.878443 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37929.888818 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37929.888818 + } + }, + "captured_at": "2026-08-01T18:04:54.825375Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:04:54.909425Z", + "duration_ms": 860 + }, + { + "id": "MOTION-M1-HOME", + "group": "motion", + "utterance": "副驾坐盆归零", + "started_at": "2026-08-01T18:04:54.909507Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180454-c91376", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 27 00 00 00 00", + "timestamp": 37935.596315 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 27 00 00 00 00", + "timestamp": 37935.622596 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 27 00 10 27 00", + "timestamp": 37935.64846 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 28 00 00 00 00", + "timestamp": 37935.674405 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37935.683454 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37935.683454 + } + }, + "captured_at": "2026-08-01T18:05:00.620046Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:00.701569Z", + "duration_ms": 5792 + }, + { + "id": "MOTION-M1-RESET", + "group": "motion", + "utterance": "右前座坐垫复位", + "started_at": "2026-08-01T18:05:00.701639Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180500-9d301d", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 29 00 10 27 00", + "timestamp": 37939.958788 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 2A 00 00 00 00", + "timestamp": 37939.984757 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 29 00 00 00 00", + "timestamp": 37940.010621 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 29 00 00 00 00", + "timestamp": 37940.036898 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37940.044853 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37940.044853 + } + }, + "captured_at": "2026-08-01T18:05:04.981277Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:05.063572Z", + "duration_ms": 4362 + }, + { + "id": "MOTION-M2-25-BACKREST", + "group": "motion", + "utterance": "副驾靠背调到25%", + "started_at": "2026-08-01T18:05:05.063636Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180505-6b3538", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2497, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 2C 00 C1 09 00", + "timestamp": 37947.856329 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 2B 00 00 00 00", + "timestamp": 37947.882736 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 2B 00 10 27 00", + "timestamp": 37947.909165 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 2B 00 00 00 00", + "timestamp": 37947.934757 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37947.945124 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37947.945124 + } + }, + "captured_at": "2026-08-01T18:05:12.881401Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:12.988923Z", + "duration_ms": 7925 + }, + { + "id": "MOTION-M2-25-SEATBACK", + "group": "motion", + "utterance": "副驾驶椅背设置为25%", + "started_at": "2026-08-01T18:05:12.989000Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180512-2d4df3", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 2D 00 00 00 00", + "timestamp": 37948.738587 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 2D 00 10 27 00", + "timestamp": 37948.764938 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 2D 00 00 00 00", + "timestamp": 37948.791351 + } + }, + "backrest_recline": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2497, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 2E 00 C1 09 00", + "timestamp": 37948.816557 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37948.827298 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37948.827298 + } + }, + "captured_at": "2026-08-01T18:05:13.763518Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:13.843061Z", + "duration_ms": 854 + }, + { + "id": "MOTION-M2-60-BACKREST", + "group": "motion", + "utterance": "把副驾靠背调到60%", + "started_at": "2026-08-01T18:05:13.843126Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180513-dfe328", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 2F 00 00 00 00", + "timestamp": 37959.003066 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 2F 00 10 27 00", + "timestamp": 37959.028708 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 2F 00 00 00 00", + "timestamp": 37959.055099 + } + }, + "backrest_recline": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 30 00 79 17 00", + "timestamp": 37959.081521 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37959.093024 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37959.093024 + } + }, + "captured_at": "2026-08-01T18:05:24.028947Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:24.107319Z", + "duration_ms": 10264 + }, + { + "id": "MOTION-M2-60-SEATBACK", + "group": "motion", + "utterance": "右前座椅背调至60%", + "started_at": "2026-08-01T18:05:24.107382Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180524-7cabf8", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 31 00 00 00 00", + "timestamp": 37959.89543 + } + }, + "backrest_recline": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 5965, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 32 00 4D 17 00", + "timestamp": 37959.921076 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 31 00 00 00 00", + "timestamp": 37959.947441 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 31 00 10 27 00", + "timestamp": 37959.972727 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37959.984238 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37959.984238 + } + }, + "captured_at": "2026-08-01T18:05:24.920200Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:24.987852Z", + "duration_ms": 880 + }, + { + "id": "MOTION-M2-ANGLE-130", + "group": "motion", + "utterance": "副驾靠背角度调到130度", + "started_at": "2026-08-01T18:05:24.987924Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180524-63dbe0", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 33 00 10 27 00", + "timestamp": 37962.997503 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 33 00 00 00 00", + "timestamp": 37963.023155 + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 34 00 F0 13 00", + "timestamp": 37963.049562 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 33 00 00 00 00", + "timestamp": 37963.074793 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37963.086302 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37963.086302 + } + }, + "captured_at": "2026-08-01T18:05:28.022157Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:28.095432Z", + "duration_ms": 3108 + }, + { + "id": "MOTION-M2-ANGLE-130-SEATBACK", + "group": "motion", + "utterance": "把副驾驶椅背设为130°", + "started_at": "2026-08-01T18:05:28.095512Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180528-3c9c1f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 35 00 10 27 00", + "timestamp": 37963.860794 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 35 00 00 00 00", + "timestamp": 37963.887178 + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 36 00 F0 13 00", + "timestamp": 37963.913589 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 35 00 00 00 00", + "timestamp": 37963.939229 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37963.950732 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37963.950732 + } + }, + "captured_at": "2026-08-01T18:05:28.886688Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:29.046678Z", + "duration_ms": 951 + }, + { + "id": "MOTION-M2-ANGLE-130-RIGHT", + "group": "motion", + "utterance": "右前座靠背夹角调至130度", + "started_at": "2026-08-01T18:05:29.046751Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180529-fa7cdd", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 37 00 00 00 00", + "timestamp": 37964.771709 + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 38 00 F0 13 00", + "timestamp": 37964.796932 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 37 00 00 00 00", + "timestamp": 37964.823712 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 37 00 10 27 00", + "timestamp": 37964.848981 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37964.860486 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37964.860486 + } + }, + "captured_at": "2026-08-01T18:05:29.796401Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:29.872595Z", + "duration_ms": 826 + }, + { + "id": "MOTION-M2-ANGLE-150", + "group": "motion", + "utterance": "副驾靠背放倒到150度", + "started_at": "2026-08-01T18:05:29.872661Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180529-90be94", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 39 00 00 00 00", + "timestamp": 37973.553784 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 3A 00 A7 1F 00", + "timestamp": 37973.579063 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 39 00 00 00 00", + "timestamp": 37973.605431 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 39 00 10 27 00", + "timestamp": 37973.63107 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37973.641447 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37973.641447 + } + }, + "captured_at": "2026-08-01T18:05:38.577064Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:38.651106Z", + "duration_ms": 8778 + }, + { + "id": "MOTION-M2-ANGLE-150-SEATBACK", + "group": "motion", + "utterance": "乘客座椅背调到150°", + "started_at": "2026-08-01T18:05:38.651170Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180538-a9c08b", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 3B 00 00 00 00", + "timestamp": 37974.417945 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 3C 00 A7 1F 00", + "timestamp": 37974.443562 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 3B 00 00 00 00", + "timestamp": 37974.470009 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 3B 00 10 27 00", + "timestamp": 37974.495235 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37974.505598 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37974.505598 + } + }, + "captured_at": "2026-08-01T18:05:39.441371Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:05:39.520969Z", + "duration_ms": 870 + }, + { + "id": "MOTION-M2-UPRIGHT", + "group": "motion", + "utterance": "把副驾靠背调直", + "started_at": "2026-08-01T18:05:39.521036Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180539-0d9284", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 3D 00 10 27 00", + "timestamp": 37997.830419 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 3D 00 00 00 00", + "timestamp": 37997.856322 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 3E 00 00 00 00", + "timestamp": 37997.882269 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 3D 00 00 00 00", + "timestamp": 37997.908155 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37997.918322 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 37997.918322 + } + }, + "captured_at": "2026-08-01T18:06:02.853517Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:02.916502Z", + "duration_ms": 23395 + }, + { + "id": "MOTION-M2-HOME", + "group": "motion", + "utterance": "副驾驶椅背归零", + "started_at": "2026-08-01T18:06:02.916592Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180602-5be924", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 40 00 00 00 00", + "timestamp": 38000.530131 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 3F 00 00 00 00", + "timestamp": 38000.55643 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 3F 00 10 27 00", + "timestamp": 38000.58161 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 3F 00 00 00 00", + "timestamp": 38000.607915 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38000.618238 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38000.618238 + } + }, + "captured_at": "2026-08-01T18:06:05.553473Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:05.615340Z", + "duration_ms": 2699 + }, + { + "id": "MOTION-M2-RESET", + "group": "motion", + "utterance": "右前座靠背复位", + "started_at": "2026-08-01T18:06:05.615412Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180605-7575dd", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 41 00 00 00 00", + "timestamp": 38003.202263 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 42 00 00 00 00", + "timestamp": 38003.227783 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 41 00 00 00 00", + "timestamp": 38003.254116 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 41 00 10 27 00", + "timestamp": 38003.280461 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38003.291924 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38003.291924 + } + }, + "captured_at": "2026-08-01T18:06:08.227109Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:08.297881Z", + "duration_ms": 2682 + }, + { + "id": "MOTION-M3-20-LEGREST", + "group": "motion", + "utterance": "副驾腿托调到20%", + "started_at": "2026-08-01T18:06:08.297970Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180608-c6f4e5", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 43 00 00 00 00", + "timestamp": 38007.394022 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 43 00 00 00 00", + "timestamp": 38007.420333 + } + }, + "legrest_height": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2009, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 44 00 D9 07 00", + "timestamp": 38007.445974 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 43 00 10 27 00", + "timestamp": 38007.472314 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38007.482725 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38007.482725 + } + }, + "captured_at": "2026-08-01T18:06:12.417816Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:12.571667Z", + "duration_ms": 4274 + }, + { + "id": "MOTION-M3-20-FOOTREST", + "group": "motion", + "utterance": "副驾驶脚托设置为20%", + "started_at": "2026-08-01T18:06:12.571735Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180612-8be469", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 1978, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 46 00 BA 07 00", + "timestamp": 38008.352337 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 45 00 10 27 00", + "timestamp": 38008.37876 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 45 00 00 00 00", + "timestamp": 38008.404029 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 45 00 00 00 00", + "timestamp": 38008.430755 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38008.439992 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38008.439992 + } + }, + "captured_at": "2026-08-01T18:06:13.375007Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:13.460207Z", + "duration_ms": 888 + }, + { + "id": "MOTION-M3-60-LEGREST", + "group": "motion", + "utterance": "把副驾腿托调到60%", + "started_at": "2026-08-01T18:06:13.460272Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180613-bc95d6", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 47 00 10 27 00", + "timestamp": 38015.188189 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 47 00 00 00 00", + "timestamp": 38015.214573 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 47 00 00 00 00", + "timestamp": 38015.240168 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5997, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 48 00 6D 17 00", + "timestamp": 38015.266542 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38015.276963 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38015.276963 + } + }, + "captured_at": "2026-08-01T18:06:20.211836Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:20.296417Z", + "duration_ms": 6836 + }, + { + "id": "MOTION-M3-60-SUPPORT", + "group": "motion", + "utterance": "右前座腿部支撑调至60%", + "started_at": "2026-08-01T18:06:20.296485Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180620-700c2a", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 49 00 00 00 00", + "timestamp": 38016.054804 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 49 00 00 00 00", + "timestamp": 38016.080032 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5997, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 4A 00 6D 17 00", + "timestamp": 38016.106437 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 49 00 10 27 00", + "timestamp": 38016.132043 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38016.14241 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38016.14241 + } + }, + "captured_at": "2026-08-01T18:06:21.077331Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:21.157352Z", + "duration_ms": 861 + }, + { + "id": "MOTION-M3-ANGLE-145", + "group": "motion", + "utterance": "副驾腿托抬到145度", + "started_at": "2026-08-01T18:06:21.157422Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180621-49eb2f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 4B 00 10 27 00", + "timestamp": 38018.252291 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 4B 00 00 00 00", + "timestamp": 38018.278748 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 4B 00 00 00 00", + "timestamp": 38018.304021 + } + }, + "legrest_height": { + "position_pct": 69, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 6893, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 4C 00 ED 1A 00", + "timestamp": 38018.330733 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38018.33884 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38018.33884 + } + }, + "captured_at": "2026-08-01T18:06:23.273585Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:23.345084Z", + "duration_ms": 2188 + }, + { + "id": "MOTION-M3-ANGLE-145-FOOTREST", + "group": "motion", + "utterance": "把副驾驶脚托设为145°", + "started_at": "2026-08-01T18:06:23.345147Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180623-1cd72b", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 4D 00 00 00 00", + "timestamp": 38019.120312 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 4D 00 00 00 00", + "timestamp": 38019.145968 + } + }, + "legrest_height": { + "position_pct": 69, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 6893, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 4E 00 ED 1A 00", + "timestamp": 38019.172279 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 4D 00 10 27 00", + "timestamp": 38019.198723 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38019.207976 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38019.207976 + } + }, + "captured_at": "2026-08-01T18:06:24.142908Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:24.229370Z", + "duration_ms": 884 + }, + { + "id": "MOTION-M3-ANGLE-160", + "group": "motion", + "utterance": "右前座小腿托调到160度", + "started_at": "2026-08-01T18:06:24.229438Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180624-16c48e", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 90, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 8995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 50 00 23 23 00", + "timestamp": 38023.226448 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 4F 00 10 27 00", + "timestamp": 38023.252801 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 4F 00 00 00 00", + "timestamp": 38023.278113 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 4F 00 00 00 00", + "timestamp": 38023.304488 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38023.312541 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38023.312541 + } + }, + "captured_at": "2026-08-01T18:06:28.247255Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:28.326020Z", + "duration_ms": 4097 + }, + { + "id": "MOTION-M3-ANGLE-160-SUPPORT", + "group": "motion", + "utterance": "乘客座腿部支撑夹角设为160°", + "started_at": "2026-08-01T18:06:28.326090Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180628-eeb32d", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 51 00 10 27 00", + "timestamp": 38024.090455 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 51 00 00 00 00", + "timestamp": 38024.116835 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 51 00 00 00 00", + "timestamp": 38024.142414 + } + }, + "legrest_height": { + "position_pct": 90, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 8995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 52 00 23 23 00", + "timestamp": 38024.168782 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38024.178075 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38024.178075 + } + }, + "captured_at": "2026-08-01T18:06:29.112844Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:29.193744Z", + "duration_ms": 868 + }, + { + "id": "MOTION-M3-RETRACT", + "group": "motion", + "utterance": "把副驾腿托收起", + "started_at": "2026-08-01T18:06:29.193811Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180629-bb59b4", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 54 00 00 00 00", + "timestamp": 38038.449265 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 53 00 10 27 00", + "timestamp": 38038.475128 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 53 00 00 00 00", + "timestamp": 38038.501073 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 53 00 00 00 00", + "timestamp": 38038.528473 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38038.537544 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38038.537544 + } + }, + "captured_at": "2026-08-01T18:06:43.472023Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:43.547554Z", + "duration_ms": 14354 + }, + { + "id": "MOTION-M3-HOME", + "group": "motion", + "utterance": "副驾驶脚托归零", + "started_at": "2026-08-01T18:06:43.547633Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180643-719f51", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 55 00 00 00 00", + "timestamp": 38044.804866 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 56 00 00 00 00", + "timestamp": 38044.830781 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 55 00 10 27 00", + "timestamp": 38044.857001 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 55 00 00 00 00", + "timestamp": 38044.882952 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38044.892007 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38044.892007 + } + }, + "captured_at": "2026-08-01T18:06:49.826400Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:49.909806Z", + "duration_ms": 6362 + }, + { + "id": "MOTION-M3-RESET", + "group": "motion", + "utterance": "右前座腿部支撑复位", + "started_at": "2026-08-01T18:06:49.909870Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180649-ffdb1a", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 57 00 10 27 00", + "timestamp": 38051.126951 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 57 00 00 00 00", + "timestamp": 38051.153243 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 57 00 00 00 00", + "timestamp": 38051.179104 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 58 00 00 00 00", + "timestamp": 38051.205048 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38051.214105 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38051.214105 + } + }, + "captured_at": "2026-08-01T18:06:56.148301Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:06:56.236987Z", + "duration_ms": 6327 + }, + { + "id": "MOTION-ALL-40", + "group": "motion", + "utterance": "副驾驶水平、坐垫、椅背、脚托都调到40%", + "started_at": "2026-08-01T18:06:56.237057Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180656-add72d", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 4008, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 5A 00 A8 0F 00", + "timestamp": 38088.69165 + } + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4037, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 5B 00 C5 0F 00", + "timestamp": 38088.71818 + } + }, + "backrest_recline": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4002, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 5C 00 A2 0F 00", + "timestamp": 38088.744015 + } + }, + "legrest_height": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4003, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 5D 00 A3 0F 00", + "timestamp": 38088.770493 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38088.78326 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38088.78326 + } + }, + "captured_at": "2026-08-01T18:07:33.716856Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:07:33.790019Z", + "duration_ms": 37553 + }, + { + "id": "MOTION-ALL-40-FULLWIDTH", + "group": "motion", + "utterance": "右前座前后、坐盆、靠背、腿托全部设置为40%", + "started_at": "2026-08-01T18:07:33.790098Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180733-bad3f3", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 4008, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 5F 00 A8 0F 00", + "timestamp": 38095.595699 + } + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3984, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 60 00 90 0F 00", + "timestamp": 38095.622241 + } + }, + "backrest_recline": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4002, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 61 00 A2 0F 00", + "timestamp": 38095.648008 + } + }, + "legrest_height": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4003, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 62 00 A3 0F 00", + "timestamp": 38095.67453 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38095.684963 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38095.684963 + } + }, + "captured_at": "2026-08-01T18:07:40.618595Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:07:40.704221Z", + "duration_ms": 6914 + }, + { + "id": "MOTION-ALL-ZERO", + "group": "motion", + "utterance": "把副驾水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T18:07:40.704296Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180740-96ab15", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 65 00 00 00 00", + "timestamp": 38132.810737 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 66 00 00 00 00", + "timestamp": 38132.836546 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 67 00 00 00 00", + "timestamp": 38132.862698 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 64 00 00 00 00", + "timestamp": 38132.889597 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38132.896374 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38132.896374 + } + }, + "captured_at": "2026-08-01T18:08:17.828941Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:08:17.914905Z", + "duration_ms": 37211 + }, + { + "id": "MOTION-ALL-RESET", + "group": "motion", + "utterance": "右前座椅四轴全部复位", + "started_at": "2026-08-01T18:08:17.914977Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180817-319234", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 6A 00 00 00 00", + "timestamp": 38153.909876 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 6B 00 00 00 00", + "timestamp": 38153.935727 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 6C 00 00 00 00", + "timestamp": 38153.961563 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 69 00 00 00 00", + "timestamp": 38153.987678 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38153.995599 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38153.995599 + } + }, + "captured_at": "2026-08-01T18:08:38.927854Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:08:39.002141Z", + "duration_ms": 21087 + }, + { + "id": "COMBINED-ALL", + "group": "combined", + "utterance": "打开副驾加热1档、通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%", + "started_at": "2026-08-01T18:08:39.002216Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180839-6720d4", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4204, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 71 00 6C 10 00", + "timestamp": 38189.512293 + } + }, + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 3026, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 6E 00 D2 0B 00", + "timestamp": 38189.537884 + } + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4037, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 6F 00 C5 0F 00", + "timestamp": 38189.56465 + } + }, + "backrest_recline": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3708, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 70 00 7C 0E 00", + "timestamp": 38189.590639 + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 38189.602358 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 38189.602358 + } + }, + "captured_at": "2026-08-01T18:09:14.533883Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:09:14.607994Z", + "duration_ms": 35606 + }, + { + "id": "COMBINED-ALL-OFF", + "group": "combined", + "utterance": "关闭副驾驶座椅加热和通风", + "started_at": "2026-08-01T18:09:14.608074Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180914-a17099", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3708, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 70 00 7C 0E 00", + "timestamp": 38190.320446 + } + }, + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4204, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 71 00 6C 10 00", + "timestamp": 38190.345919 + } + }, + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 3026, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 6E 00 D2 0B 00", + "timestamp": 38190.372459 + } + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4037, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 6F 00 C5 0F 00", + "timestamp": 38190.398252 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38190.409831 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38190.409831 + } + }, + "captured_at": "2026-08-01T18:09:15.341456Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:09:15.427885Z", + "duration_ms": 820 + }, + { + "id": "COMBINED-HEAT-MOTION", + "group": "combined", + "utterance": "副驾驶加热调到二档,前后位置50%,椅背130度", + "started_at": "2026-08-01T18:09:15.428049Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180915-6c05e5", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 4204, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 72 00 6C 10 00", + "timestamp": 38204.222318 + } + }, + "longitudinal": { + "position_pct": 50, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5030, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 73 00 A6 13 00", + "timestamp": 38204.249083 + } + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 4037, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 72 00 C5 0F 00", + "timestamp": 38204.274691 + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 74 00 F0 13 00", + "timestamp": 38204.300736 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 38204.312411 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "19 00 00 00 00 00 00 00", + "timestamp": 38204.312411 + } + }, + "captured_at": "2026-08-01T18:09:29.243623Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:09:29.328495Z", + "duration_ms": 13900 + }, + { + "id": "COMBINED-VENT-MOTION", + "group": "combined", + "utterance": "右前座通风最高档 坐垫40% 脚托145度", + "started_at": "2026-08-01T18:09:29.328587Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180929-68fd5a", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 50, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 5030, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 75 00 A6 13 00", + "timestamp": 38215.127446 + } + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4011, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 76 00 AB 0F 00", + "timestamp": 38215.153063 + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 75 00 F0 13 00", + "timestamp": 38215.178677 + } + }, + "legrest_height": { + "position_pct": 69, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 6893, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 77 00 ED 1A 00", + "timestamp": 38215.204676 + } + } + }, + "ventilation": { + "state": "on", + "level": 3, + "feedback_value": 4, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "1C 00 00 00 00 00 00 00", + "timestamp": 38215.217581 + } + }, + "heating": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "1C 00 00 00 00 00 00 00", + "timestamp": 38215.217581 + } + }, + "captured_at": "2026-08-01T18:09:40.148694Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:09:40.226503Z", + "duration_ms": 10898 + }, + { + "id": "COMBINED-FULLWIDTH", + "group": "combined", + "utterance": "乘客座加热1档,通风2档,前后30%,坐盆40%,靠背130度,腿托145度", + "started_at": "2026-08-01T18:09:40.226579Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180940-96263c", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 7B 00 F0 13 00", + "timestamp": 38229.431026 + } + }, + "legrest_height": { + "position_pct": 69, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 6893, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 7C 00 ED 1A 00", + "timestamp": 38229.457852 + } + }, + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 3006, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 79 00 BE 0B 00", + "timestamp": 38229.483457 + } + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4011, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 7A 00 AB 0F 00", + "timestamp": 38229.509456 + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "13 00 00 00 00 00 00 00", + "timestamp": 38229.523492 + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "13 00 00 00 00 00 00 00", + "timestamp": 38229.523492 + } + }, + "captured_at": "2026-08-01T18:09:54.454304Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:09:54.537912Z", + "duration_ms": 14311 + }, + { + "id": "COMBINED-CLEANUP", + "group": "combined", + "utterance": "关闭右前座加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T18:09:54.537992Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801180954-e31e25", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 81 00 00 00 00", + "timestamp": 38273.786201 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 7E 00 00 00 00", + "timestamp": 38273.81237 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 7F 00 00 00 00", + "timestamp": 38273.838158 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 80 00 00 00 00", + "timestamp": 38273.864019 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38273.873046 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38273.873046 + } + }, + "captured_at": "2026-08-01T18:10:38.803073Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:10:38.876331Z", + "duration_ms": 44338 + }, + { + "id": "MODE-EASY-OPEN", + "group": "mode", + "utterance": "打开轻松进出模式", + "started_at": "2026-08-01T18:10:38.876415Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181038-3dec8e", + "matched_modes": [ + "easy_entry_exit" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 84 00 00 00 00", + "timestamp": 38307.372758 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 85 00 00 00 00", + "timestamp": 38307.398664 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 86 00 00 00 00", + "timestamp": 38307.424913 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 83 00 10 27 00", + "timestamp": 38307.450839 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38307.459898 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38307.459898 + } + }, + "captured_at": "2026-08-01T18:11:12.389125Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:11:12.473873Z", + "duration_ms": 33597 + }, + { + "id": "MODE-EASY-ENTER", + "group": "mode", + "utterance": "副驾进入轻松进出", + "started_at": "2026-08-01T18:11:12.473971Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181112-7d1cc6", + "matched_modes": [ + "easy_entry_exit" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 8B 00 00 00 00", + "timestamp": 38324.997754 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 88 00 10 27 00", + "timestamp": 38325.023677 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 89 00 00 00 00", + "timestamp": 38325.049885 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 8A 00 00 00 00", + "timestamp": 38325.075796 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38325.084857 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38325.084857 + } + }, + "captured_at": "2026-08-01T18:11:30.013794Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:11:30.096933Z", + "duration_ms": 17623 + }, + { + "id": "MODE-EASY-SWITCH", + "group": "mode", + "utterance": "切换到轻松进出模式", + "started_at": "2026-08-01T18:11:30.097015Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181130-8a0027", + "matched_modes": [ + "easy_entry_exit" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 8D 00 10 27 00", + "timestamp": 38342.690272 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 8E 00 00 00 00", + "timestamp": 38342.716256 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 8F 00 00 00 00", + "timestamp": 38342.742171 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 90 00 00 00 00", + "timestamp": 38342.768383 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38342.776326 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38342.776326 + } + }, + "captured_at": "2026-08-01T18:11:47.704886Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:11:47.788817Z", + "duration_ms": 17692 + }, + { + "id": "MODE-OFFICE-OPEN", + "group": "mode", + "utterance": "打开办公模式", + "started_at": "2026-08-01T18:11:47.788893Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181147-e6a8fa", + "matched_modes": [ + "office" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 92 00 1A 1C 00", + "timestamp": 38365.194062 + } + }, + "cushion_tilt": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2193, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 93 00 91 08 00", + "timestamp": 38365.220652 + } + }, + "backrest_recline": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2214, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 94 00 A6 08 00", + "timestamp": 38365.246015 + } + }, + "legrest_height": { + "position_pct": 21, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2117, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 95 00 45 08 00", + "timestamp": 38365.272997 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38365.285718 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38365.285718 + } + }, + "captured_at": "2026-08-01T18:12:10.213843Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:12:10.298709Z", + "duration_ms": 22510 + }, + { + "id": "MODE-OFFICE-ENTER", + "group": "mode", + "utterance": "副驾进入办公", + "started_at": "2026-08-01T18:12:10.298810Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181210-958feb", + "matched_modes": [ + "office" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 97 00 1A 1C 00", + "timestamp": 38372.131005 + } + }, + "cushion_tilt": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2193, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 98 00 91 08 00", + "timestamp": 38372.156809 + } + }, + "backrest_recline": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2170, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 99 00 7A 08 00", + "timestamp": 38372.18221 + } + }, + "legrest_height": { + "position_pct": 21, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2087, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 9A 00 27 08 00", + "timestamp": 38372.208737 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38372.220348 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38372.220348 + } + }, + "captured_at": "2026-08-01T18:12:17.148425Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:12:17.234231Z", + "duration_ms": 6935 + }, + { + "id": "MODE-OFFICE-START", + "group": "mode", + "utterance": "启动办公模式", + "started_at": "2026-08-01T18:12:17.234340Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181217-183858", + "matched_modes": [ + "office" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 9C 00 1A 1C 00", + "timestamp": 38379.048366 + } + }, + "cushion_tilt": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2193, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 9D 00 91 08 00", + "timestamp": 38379.075335 + } + }, + "backrest_recline": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2214, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 9E 00 A6 08 00", + "timestamp": 38379.100735 + } + }, + "legrest_height": { + "position_pct": 21, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2117, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 9F 00 45 08 00", + "timestamp": 38379.127296 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38379.137731 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38379.137731 + } + }, + "captured_at": "2026-08-01T18:12:24.065539Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:12:24.147258Z", + "duration_ms": 6913 + }, + { + "id": "MODE-QUEEN-OPEN", + "group": "mode", + "utterance": "打开女王副驾模式", + "started_at": "2026-08-01T18:12:24.147348Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181224-e70c5e", + "matched_modes": [ + "queen_passenger_driving" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 A1 00 1A 1C 00", + "timestamp": 38394.804912 + } + }, + "cushion_tilt": { + "position_pct": 38, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3797, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 A2 00 D5 0E 00", + "timestamp": 38394.831477 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4406, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 A3 00 36 11 00", + "timestamp": 38394.857295 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 3122, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 A4 00 32 0C 00", + "timestamp": 38394.882706 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38394.894265 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38394.894265 + } + }, + "captured_at": "2026-08-01T18:12:39.822024Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:12:39.896662Z", + "duration_ms": 15749 + }, + { + "id": "MODE-QUEEN-ENTER", + "group": "mode", + "utterance": "进入女王副驾", + "started_at": "2026-08-01T18:12:39.896743Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181239-b27f32", + "matched_modes": [ + "queen_passenger_driving" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 A6 00 1A 1C 00", + "timestamp": 38401.705554 + } + }, + "cushion_tilt": { + "position_pct": 38, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3797, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 A7 00 D5 0E 00", + "timestamp": 38401.730998 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4362, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 A8 00 0A 11 00", + "timestamp": 38401.756793 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 3091, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 A9 00 13 0C 00", + "timestamp": 38401.783364 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38401.794948 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38401.794948 + } + }, + "captured_at": "2026-08-01T18:12:46.722449Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:12:46.795259Z", + "duration_ms": 6899 + }, + { + "id": "MODE-QUEEN-SWITCH", + "group": "mode", + "utterance": "切换到女王副驾行驶模式", + "started_at": "2026-08-01T18:12:46.795364Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181246-f88881", + "matched_modes": [ + "queen_passenger_driving" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 AB 00 1A 1C 00", + "timestamp": 38408.595777 + } + }, + "cushion_tilt": { + "position_pct": 38, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3797, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 AC 00 D5 0E 00", + "timestamp": 38408.621225 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4406, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 AD 00 36 11 00", + "timestamp": 38408.647744 + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 3122, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 AE 00 32 0C 00", + "timestamp": 38408.673576 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38408.685143 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38408.685143 + } + }, + "captured_at": "2026-08-01T18:12:53.612508Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:12:53.698241Z", + "duration_ms": 6903 + }, + { + "id": "MODE-BABY-OPEN", + "group": "mode", + "utterance": "打开宝宝午睡模式", + "started_at": "2026-08-01T18:12:53.698334Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181253-d4a65f", + "matched_modes": [ + "baby_nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 41, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4100, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 B2 00 04 10 00", + "timestamp": 38423.77842 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 B3 00 00 00 00", + "timestamp": 38423.803319 + } + }, + "longitudinal": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 8116, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 B0 00 B4 1F 00", + "timestamp": 38423.829447 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 B1 00 B3 0B 00", + "timestamp": 38423.855902 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38423.865071 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38423.865071 + } + }, + "captured_at": "2026-08-01T18:13:08.792098Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:13:08.866007Z", + "duration_ms": 15168 + }, + { + "id": "MODE-BABY-ENTER", + "group": "mode", + "utterance": "副驾进入宝宝午睡", + "started_at": "2026-08-01T18:13:08.866098Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181308-b5d52b", + "matched_modes": [ + "baby_nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 B6 00 B3 0B 00", + "timestamp": 38436.188692 + } + }, + "backrest_recline": { + "position_pct": 41, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4100, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 B7 00 04 10 00", + "timestamp": 38436.214766 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 B8 00 00 00 00", + "timestamp": 38436.239729 + } + }, + "longitudinal": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 8096, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 B5 00 A0 1F 00", + "timestamp": 38436.266207 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38436.275334 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38436.275334 + } + }, + "captured_at": "2026-08-01T18:13:21.202058Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:13:21.284419Z", + "duration_ms": 12418 + }, + { + "id": "MODE-BABY-START", + "group": "mode", + "utterance": "启动宝宝午睡模式", + "started_at": "2026-08-01T18:13:21.284532Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181321-0cdaf5", + "matched_modes": [ + "baby_nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 BD 00 00 00 00", + "timestamp": 38448.572582 + } + }, + "longitudinal": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 8096, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 BA 00 A0 1F 00", + "timestamp": 38448.598618 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 BB 00 B3 0B 00", + "timestamp": 38448.624757 + } + }, + "backrest_recline": { + "position_pct": 41, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4100, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 BC 00 04 10 00", + "timestamp": 38448.650846 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38448.658805 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38448.658805 + } + }, + "captured_at": "2026-08-01T18:13:33.585363Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:13:33.652301Z", + "duration_ms": 12368 + }, + { + "id": "MODE-CRUISE-OPEN", + "group": "mode", + "utterance": "打开巡航沙发模式", + "started_at": "2026-08-01T18:13:33.652389Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181333-8d38fe", + "matched_modes": [ + "cruise_sofa" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 C0 00 B3 0B 00", + "timestamp": 38469.037312 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4395, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 C1 00 2B 11 00", + "timestamp": 38469.062685 + } + }, + "legrest_height": { + "position_pct": 53, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5301, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 C2 00 B5 14 00", + "timestamp": 38469.088557 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 BF 00 E2 13 00", + "timestamp": 38469.115072 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38469.126745 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38469.126745 + } + }, + "captured_at": "2026-08-01T18:13:54.052799Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:13:54.130112Z", + "duration_ms": 20478 + }, + { + "id": "MODE-CRUISE-ENTER", + "group": "mode", + "utterance": "进入巡航沙发", + "started_at": "2026-08-01T18:13:54.130184Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181354-902294", + "matched_modes": [ + "cruise_sofa" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 C5 00 B3 0B 00", + "timestamp": 38475.945397 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4395, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 C6 00 2B 11 00", + "timestamp": 38475.971225 + } + }, + "legrest_height": { + "position_pct": 53, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5301, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 C7 00 B5 14 00", + "timestamp": 38475.996646 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 C4 00 E2 13 00", + "timestamp": 38476.023208 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38476.033685 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38476.033685 + } + }, + "captured_at": "2026-08-01T18:14:00.959659Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:14:01.043950Z", + "duration_ms": 6914 + }, + { + "id": "MODE-CRUISE-SWITCH", + "group": "mode", + "utterance": "切换到巡航沙发模式", + "started_at": "2026-08-01T18:14:01.044028Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181401-404910", + "matched_modes": [ + "cruise_sofa" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 CA 00 B3 0B 00", + "timestamp": 38482.844825 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4395, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 CB 00 2B 11 00", + "timestamp": 38482.871766 + } + }, + "legrest_height": { + "position_pct": 53, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5301, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 CC 00 B5 14 00", + "timestamp": 38482.897237 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 C9 00 E2 13 00", + "timestamp": 38482.923759 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38482.935382 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38482.935382 + } + }, + "captured_at": "2026-08-01T18:14:07.861296Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:14:07.936489Z", + "duration_ms": 6892 + }, + { + "id": "MODE-MEDITATION-OPEN", + "group": "mode", + "utterance": "打开冥想空间模式", + "started_at": "2026-08-01T18:14:07.936571Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181407-2ca448", + "matched_modes": [ + "meditation_space" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 58, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5811, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 D1 00 B3 16 00", + "timestamp": 38499.219369 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 CE 00 10 27 00", + "timestamp": 38499.24592 + } + }, + "cushion_tilt": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4412, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 CF 00 3C 11 00", + "timestamp": 38499.27174 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4395, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 D0 00 2B 11 00", + "timestamp": 38499.297183 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38499.308806 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38499.308806 + } + }, + "captured_at": "2026-08-01T18:14:24.234341Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:14:24.317611Z", + "duration_ms": 16381 + }, + { + "id": "MODE-MEDITATION-ENTER", + "group": "mode", + "utterance": "副驾进入冥想", + "started_at": "2026-08-01T18:14:24.317716Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181424-326ee6", + "matched_modes": [ + "meditation_space" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 58, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5781, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 D6 00 95 16 00", + "timestamp": 38506.16153 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 D3 00 10 27 00", + "timestamp": 38506.18743 + } + }, + "cushion_tilt": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4412, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 D4 00 3C 11 00", + "timestamp": 38506.213955 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4395, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 D5 00 2B 11 00", + "timestamp": 38506.239417 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38506.250994 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38506.250994 + } + }, + "captured_at": "2026-08-01T18:14:31.176364Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:14:31.245028Z", + "duration_ms": 6927 + }, + { + "id": "MODE-MEDITATION-START", + "group": "mode", + "utterance": "启动冥想空间模式", + "started_at": "2026-08-01T18:14:31.245116Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181431-faf70c", + "matched_modes": [ + "meditation_space" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 58, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5811, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 DB 00 B3 16 00", + "timestamp": 38513.038478 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 D8 00 10 27 00", + "timestamp": 38513.063861 + } + }, + "cushion_tilt": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4412, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 D9 00 3C 11 00", + "timestamp": 38513.089719 + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4395, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 DA 00 2B 11 00", + "timestamp": 38513.116224 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38513.127913 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38513.127913 + } + }, + "captured_at": "2026-08-01T18:14:38.053194Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:14:38.131240Z", + "duration_ms": 6886 + }, + { + "id": "MODE-LEISURE-OPEN", + "group": "mode", + "utterance": "打开休闲躺椅模式", + "started_at": "2026-08-01T18:14:38.131336Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181438-0ad746", + "matched_modes": [ + "leisure_lounger" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 76, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 7604, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 E0 00 B4 1D 00", + "timestamp": 38537.722207 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 DD 00 E2 13 00", + "timestamp": 38537.748815 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 DE 00 B3 0B 00", + "timestamp": 38537.77459 + } + }, + "backrest_recline": { + "position_pct": 66, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6598, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 DF 00 C6 19 00", + "timestamp": 38537.800098 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38537.813963 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38537.813963 + } + }, + "captured_at": "2026-08-01T18:15:02.738811Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:15:02.808893Z", + "duration_ms": 24678 + }, + { + "id": "MODE-LEISURE-ENTER", + "group": "mode", + "utterance": "进入休闲躺椅", + "started_at": "2026-08-01T18:15:02.809003Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181502-9fc01a", + "matched_modes": [ + "leisure_lounger" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 76, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 7604, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 E5 00 B4 1D 00", + "timestamp": 38544.649225 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 E2 00 E2 13 00", + "timestamp": 38544.674993 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 E3 00 B3 0B 00", + "timestamp": 38544.700446 + } + }, + "backrest_recline": { + "position_pct": 66, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6598, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 E4 00 C6 19 00", + "timestamp": 38544.726964 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38544.738641 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38544.738641 + } + }, + "captured_at": "2026-08-01T18:15:09.663438Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:15:09.739021Z", + "duration_ms": 6930 + }, + { + "id": "MODE-LEISURE-SWITCH", + "group": "mode", + "utterance": "切换到休闲躺椅模式", + "started_at": "2026-08-01T18:15:09.739169Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181509-fd6606", + "matched_modes": [ + "leisure_lounger" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 76, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 7604, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 EA 00 B4 1D 00", + "timestamp": 38551.550425 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 E7 00 E2 13 00", + "timestamp": 38551.577314 + } + }, + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 E8 00 B3 0B 00", + "timestamp": 38551.602782 + } + }, + "backrest_recline": { + "position_pct": 66, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6598, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 E9 00 C6 19 00", + "timestamp": 38551.629417 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38551.639862 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38551.639862 + } + }, + "captured_at": "2026-08-01T18:15:16.564587Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:15:16.639370Z", + "duration_ms": 6900 + }, + { + "id": "MODE-CALF-OPEN", + "group": "mode", + "utterance": "打开小腿解压悬浮模式", + "started_at": "2026-08-01T18:15:16.639459Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181516-dd6d5c", + "matched_modes": [ + "calf_decompression_float" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 28 EF 00 10 27 00", + "timestamp": 38583.415703 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 EC 00 E2 13 00", + "timestamp": 38583.441109 + } + }, + "cushion_tilt": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 7513, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 ED 00 59 1D 00", + "timestamp": 38583.467556 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 EE 00 00 00 00", + "timestamp": 38583.493326 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38583.504883 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38583.504883 + } + }, + "captured_at": "2026-08-01T18:15:48.428778Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:15:48.508601Z", + "duration_ms": 31869 + }, + { + "id": "MODE-CALF-ENTER", + "group": "mode", + "utterance": "进入小腿解压", + "started_at": "2026-08-01T18:15:48.508679Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181548-8d6172", + "matched_modes": [ + "calf_decompression_float" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 7513, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 F2 00 59 1D 00", + "timestamp": 38592.153871 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 F3 00 00 00 00", + "timestamp": 38592.181896 + } + }, + "legrest_height": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 28 F4 00 10 27 00", + "timestamp": 38592.208432 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 F1 00 E2 13 00", + "timestamp": 38592.233747 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38592.243064 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38592.243064 + } + }, + "captured_at": "2026-08-01T18:15:57.166796Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:15:57.252082Z", + "duration_ms": 8743 + }, + { + "id": "MODE-CALF-START", + "group": "mode", + "utterance": "启动小腿悬浮模式", + "started_at": "2026-08-01T18:15:57.252155Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181557-680b3d", + "matched_modes": [ + "calf_decompression_float" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 F8 00 00 00 00", + "timestamp": 38600.868639 + } + }, + "legrest_height": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 28 F9 00 10 27 00", + "timestamp": 38600.894427 + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 F6 00 E2 13 00", + "timestamp": 38600.91973 + } + }, + "cushion_tilt": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 7513, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 F7 00 59 1D 00", + "timestamp": 38600.946303 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38600.956724 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38600.956724 + } + }, + "captured_at": "2026-08-01T18:16:05.880351Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:16:05.963656Z", + "duration_ms": 8712 + }, + { + "id": "MODE-BEACH-OPEN", + "group": "mode", + "utterance": "打开电感沙滩椅", + "started_at": "2026-08-01T18:16:05.963740Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181605-f1cd10", + "matched_modes": [ + "electric_beach_chair" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 FC 00 00 00 00", + "timestamp": 38658.042929 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": true, + "task_state": 7, + "motor_result": 6, + "motor_selector": 2, + "value_x100": 9989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 67 08 FD 00 05 27 00", + "timestamp": 38658.069414 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5981, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 FE 00 5D 17 00", + "timestamp": 38658.095112 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 FB 00 10 27 00", + "timestamp": 38658.121601 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38658.133174 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38658.133174 + } + }, + "captured_at": "2026-08-01T18:17:03.055720Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:17:03.136151Z", + "duration_ms": 57172 + }, + { + "id": "MODE-BEACH-ENTER", + "group": "mode", + "utterance": "进入沙滩椅模式", + "started_at": "2026-08-01T18:17:03.136235Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181703-203001", + "matched_modes": [ + "electric_beach_chair" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 01 01 00 00 00", + "timestamp": 38668.419137 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 28 02 01 10 27 00", + "timestamp": 38668.445555 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 6012, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 03 01 7C 17 00", + "timestamp": 38668.472114 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 00 01 10 27 00", + "timestamp": 38668.497794 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38668.509369 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38668.509369 + } + }, + "captured_at": "2026-08-01T18:17:13.431635Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:17:13.509811Z", + "duration_ms": 10374 + }, + { + "id": "MODE-BEACH-SWITCH", + "group": "mode", + "utterance": "切换到电感沙滩椅模式", + "started_at": "2026-08-01T18:17:13.509900Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181713-7cb0b7", + "matched_modes": [ + "electric_beach_chair" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 06 01 00 00 00", + "timestamp": 38678.77835 + } + }, + "backrest_recline": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 28 07 01 10 27 00", + "timestamp": 38678.80406 + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5981, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 08 01 5D 17 00", + "timestamp": 38678.829383 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 05 01 10 27 00", + "timestamp": 38678.855839 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38678.867432 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38678.867432 + } + }, + "captured_at": "2026-08-01T18:17:23.789479Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:17:23.871691Z", + "duration_ms": 10362 + }, + { + "id": "MODE-NAP-OPEN", + "group": "mode", + "utterance": "打开小憩模式", + "started_at": "2026-08-01T18:17:23.871792Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181723-4a0b62", + "matched_modes": [ + "nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 0A 01 10 27 00", + "timestamp": 38704.734923 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 0B 01 10 27 00", + "timestamp": 38704.7604 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 0C 01 A7 1F 00", + "timestamp": 38704.786994 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 0D 01 B5 24 00", + "timestamp": 38704.812825 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38704.823278 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38704.823278 + } + }, + "captured_at": "2026-08-01T18:17:49.744795Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:17:49.820372Z", + "duration_ms": 25949 + }, + { + "id": "MODE-NAP-ENTER", + "group": "mode", + "utterance": "副驾进入小憩", + "started_at": "2026-08-01T18:17:49.820485Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181749-bed402", + "matched_modes": [ + "nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 10 01 10 27 00", + "timestamp": 38711.518766 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 11 01 A7 1F 00", + "timestamp": 38711.544164 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 12 01 B5 24 00", + "timestamp": 38711.570807 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 0F 01 10 27 00", + "timestamp": 38711.596254 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38711.610586 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38711.610586 + } + }, + "captured_at": "2026-08-01T18:17:56.532009Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:17:56.689291Z", + "duration_ms": 6869 + }, + { + "id": "MODE-NAP-START", + "group": "mode", + "utterance": "启动小憩模式", + "started_at": "2026-08-01T18:17:56.689408Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181756-bafac7", + "matched_modes": [ + "nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 16 01 A7 1F 00", + "timestamp": 38718.527422 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 17 01 B5 24 00", + "timestamp": 38718.552804 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 14 01 10 27 00", + "timestamp": 38718.579433 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 15 01 10 27 00", + "timestamp": 38718.605269 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38718.615742 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38718.615742 + } + }, + "captured_at": "2026-08-01T18:18:03.537236Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:18:03.616979Z", + "duration_ms": 6928 + }, + { + "id": "MODE-ZERO-GRAVITY-OPEN", + "group": "mode", + "utterance": "打开零重力模式", + "started_at": "2026-08-01T18:18:03.617099Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181803-b968ba", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 1C 01 B5 24 00", + "timestamp": 38725.452872 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 19 01 10 27 00", + "timestamp": 38725.479536 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 1A 01 10 27 00", + "timestamp": 38725.505395 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 1B 01 A7 1F 00", + "timestamp": 38725.530851 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38725.54244 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38725.54244 + } + }, + "captured_at": "2026-08-01T18:18:10.463573Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:18:10.541182Z", + "duration_ms": 6924 + }, + { + "id": "MODE-ZERO-GRAVITY-ENTER", + "group": "mode", + "utterance": "副驾进入零重力", + "started_at": "2026-08-01T18:18:10.541284Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181810-035b9a", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 1E 01 10 27 00", + "timestamp": 38732.331013 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 1F 01 10 27 00", + "timestamp": 38732.357595 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 20 01 A7 1F 00", + "timestamp": 38732.383032 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 21 01 B5 24 00", + "timestamp": 38732.408866 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38732.420505 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38732.420505 + } + }, + "captured_at": "2026-08-01T18:18:17.341700Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:18:17.414745Z", + "duration_ms": 6873 + }, + { + "id": "MODE-ZERO-GRAVITY-ENGLISH", + "group": "mode", + "utterance": "开启 zero-gravity 模式", + "started_at": "2026-08-01T18:18:17.414832Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181817-17c748", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 24 01 10 27 00", + "timestamp": 38739.24695 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 25 01 A7 1F 00", + "timestamp": 38739.273513 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 26 01 B5 24 00", + "timestamp": 38739.300503 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 23 01 10 27 00", + "timestamp": 38739.324836 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38739.336475 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38739.336475 + } + }, + "captured_at": "2026-08-01T18:18:24.257352Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:18:24.336745Z", + "duration_ms": 6922 + }, + { + "id": "SAFE-DRIVER-THERMAL", + "group": "safety", + "utterance": "打开主驾座椅通风", + "started_at": "2026-08-01T18:18:24.336859Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181824-e63969", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:25.091868Z", + "duration_ms": 755 + }, + { + "id": "SAFE-DRIVER-MOTION", + "group": "safety", + "utterance": "把驾驶位靠背调到50%", + "started_at": "2026-08-01T18:18:25.091935Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181825-b14e47", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:25.817495Z", + "duration_ms": 726 + }, + { + "id": "SAFE-DRIVER-MODE", + "group": "safety", + "utterance": "主驾进入零重力模式", + "started_at": "2026-08-01T18:18:25.817569Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181826-a2fee4", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:26.661784Z", + "duration_ms": 844 + }, + { + "id": "SAFE-FRONT-ROW", + "group": "safety", + "utterance": "打开前排座椅加热", + "started_at": "2026-08-01T18:18:26.661844Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181827-ebadd5", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:27.393073Z", + "duration_ms": 731 + }, + { + "id": "SAFE-PERCENT-OVERFLOW", + "group": "safety", + "utterance": "副驾座椅水平位置调到101%", + "started_at": "2026-08-01T18:18:27.393128Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181827-c45229", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:28.164033Z", + "duration_ms": 771 + }, + { + "id": "SAFE-ANGLE-OVERFLOW", + "group": "safety", + "utterance": "副驾靠背调到200度", + "started_at": "2026-08-01T18:18:28.164096Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181828-f14022", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:28.950747Z", + "duration_ms": 787 + }, + { + "id": "SAFE-LEVEL-UNSUPPORTED", + "group": "safety", + "utterance": "副驾座椅加热开到4档", + "started_at": "2026-08-01T18:18:28.950805Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181829-a95330", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:29.713510Z", + "duration_ms": 763 + }, + { + "id": "SAFE-MISSING-STATE", + "group": "safety", + "utterance": "副驾座椅通风", + "started_at": "2026-08-01T18:18:29.713573Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181830-f6f4cb", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:30.433392Z", + "duration_ms": 720 + }, + { + "id": "SAFE-CONTRADICTORY", + "group": "safety", + "utterance": "打开副驾加热然后关闭副驾加热", + "started_at": "2026-08-01T18:18:30.433450Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181830-aa40a2", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:31.169600Z", + "duration_ms": 736 + }, + { + "id": "SAFE-UNKNOWN-CAPABILITY", + "group": "safety", + "utterance": "把副驾座椅按摩打开", + "started_at": "2026-08-01T18:18:31.169657Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181831-3aef4a", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:31.933210Z", + "duration_ms": 764 + }, + { + "id": "SAFE-UNKNOWN-MODE", + "group": "safety", + "utterance": "打开老板模式", + "started_at": "2026-08-01T18:18:31.933269Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181832-db2831", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:32.677354Z", + "duration_ms": 744 + }, + { + "id": "SAFE-MULTIPLE-MODES", + "group": "safety", + "utterance": "进入办公模式和零重力模式", + "started_at": "2026-08-01T18:18:32.677411Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181833-75e6a1", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:33.467353Z", + "duration_ms": 790 + }, + { + "id": "SAFE-LEGREST-EXTENSION", + "group": "safety", + "utterance": "把副驾腿托伸长到50%", + "started_at": "2026-08-01T18:18:33.467424Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181833-6d5479", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:34.266012Z", + "duration_ms": 799 + }, + { + "id": "SAFE-VAGUE", + "group": "safety", + "utterance": "把座椅调舒服一点", + "started_at": "2026-08-01T18:18:34.266070Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181834-51398c", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 81, + "cushion_tilt": 100, + "legrest_height": 94, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:18:35.030667Z", + "duration_ms": 765 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风", + "started_at": "2026-08-01T18:18:35.030723Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801181835-27db4c", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 23 01 10 27 00", + "timestamp": 38750.767321 + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 24 01 10 27 00", + "timestamp": 38750.79349 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 25 01 A7 1F 00", + "timestamp": 38750.82009 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 26 01 B5 24 00", + "timestamp": 38750.845099 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38750.855392 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 38750.855392 + } + }, + "captured_at": "2026-08-01T18:18:35.776166Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:18:35.870387Z", + "duration_ms": 840 + }, + "finished_at": "2026-08-01T18:18:35.870429Z", + "summary": { + "total": 138, + "passed": 138, + "failed": 0, + "safety_blocked": 0, + "executed": 138, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_relative_motion_regression.json b/artifacts/hil/seat_relative_motion_regression.json new file mode 100644 index 0000000..1f1610b --- /dev/null +++ b/artifacts/hil/seat_relative_motion_regression.json @@ -0,0 +1,1827 @@ +{ + "suite": "t2g-seat-frontend-comprehensive-hil", + "started_at": "2026-08-01T18:55:51.859382Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801185551", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-M0-REARMOST", + "group": "motion", + "utterance": "副驾驶座椅移动到最后面", + "started_at": "2026-08-01T18:55:51.859423Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185551-e3b1b4", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 01 00 00 00 00", + "timestamp": 41003.319 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 01 00 00 00 00", + "timestamp": 41003.344167 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 02 00 10 27 00", + "timestamp": 41003.370792 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 01 00 00 00 00", + "timestamp": 41003.397098 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41003.406341 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41003.406341 + } + }, + "captured_at": "2026-08-01T18:56:08.283480Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:08.365287Z", + "duration_ms": 16506 + }, + { + "id": "MOTION-M0-RELATIVE-FORWARD", + "group": "motion", + "utterance": "副驾滑轨向前移动10%", + "started_at": "2026-08-01T18:56:08.365359Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185608-597d1c", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 03 00 00 00 00", + "timestamp": 41005.875054 + } + }, + "longitudinal": { + "position_pct": 90, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 8998, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 04 00 26 23 00", + "timestamp": 41005.900223 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 03 00 00 00 00", + "timestamp": 41005.926546 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 03 00 00 00 00", + "timestamp": 41005.952874 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41005.963521 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41005.963521 + } + }, + "captured_at": "2026-08-01T18:56:10.840600Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:10.918119Z", + "duration_ms": 2553 + }, + { + "id": "MOTION-M0-RELATIVE-BACKWARD", + "group": "motion", + "utterance": "座椅前后向后移动10%", + "started_at": "2026-08-01T18:56:10.918192Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185610-0bcd93", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 05 00 00 00 00", + "timestamp": 41008.262515 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 05 00 00 00 00", + "timestamp": 41008.288794 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 06 00 10 27 00", + "timestamp": 41008.315132 + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 05 00 00 00 00", + "timestamp": 41008.340261 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41008.34836 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41008.34836 + } + }, + "captured_at": "2026-08-01T18:56:13.225386Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:13.305401Z", + "duration_ms": 2387 + }, + { + "id": "MOTION-M1-60-PAN", + "group": "motion", + "utterance": "副驾坐盆调到60%", + "started_at": "2026-08-01T18:56:13.305460Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185613-a45d47", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 07 00 00 00 00", + "timestamp": 41014.117064 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 07 00 00 00 00", + "timestamp": 41014.142329 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 07 00 10 27 00", + "timestamp": 41014.169109 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 08 00 65 17 00", + "timestamp": 41014.194414 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41014.205961 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41014.205961 + } + }, + "captured_at": "2026-08-01T18:56:19.082848Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:19.160368Z", + "duration_ms": 5855 + }, + { + "id": "MOTION-M1-RELATIVE-UP", + "group": "motion", + "utterance": "副驾坐垫向上调整10%", + "started_at": "2026-08-01T18:56:19.160420Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185619-8fc990", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 09 00 00 00 00", + "timestamp": 41015.770697 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 09 00 10 27 00", + "timestamp": 41015.797085 + } + }, + "cushion_tilt": { + "position_pct": 50, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4973, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 0A 00 6D 13 00", + "timestamp": 41015.82237 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 09 00 00 00 00", + "timestamp": 41015.848831 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41015.859214 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41015.859214 + } + }, + "captured_at": "2026-08-01T18:56:20.736074Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:20.821687Z", + "duration_ms": 1661 + }, + { + "id": "MOTION-M1-RELATIVE-DOWN", + "group": "motion", + "utterance": "坐盆向下移动10%", + "started_at": "2026-08-01T18:56:20.821745Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185620-086ce3", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 0B 00 10 27 00", + "timestamp": 41017.478808 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 0C 00 65 17 00", + "timestamp": 41017.505241 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 0B 00 00 00 00", + "timestamp": 41017.5305 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 0B 00 00 00 00", + "timestamp": 41017.556934 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41017.567659 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41017.567659 + } + }, + "captured_at": "2026-08-01T18:56:22.444490Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:22.531225Z", + "duration_ms": 1709 + }, + { + "id": "MOTION-M2-ANGLE-130", + "group": "motion", + "utterance": "副驾靠背角度调到130度", + "started_at": "2026-08-01T18:56:22.531282Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185622-512c44", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 0D 00 10 27 00", + "timestamp": 41032.26553 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 0D 00 65 17 00", + "timestamp": 41032.290873 + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 0E 00 F0 13 00", + "timestamp": 41032.317415 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 0D 00 00 00 00", + "timestamp": 41032.342726 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41032.354355 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41032.354355 + } + }, + "captured_at": "2026-08-01T18:56:37.230885Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:37.309322Z", + "duration_ms": 14778 + }, + { + "id": "MOTION-M2-RELATIVE-FORWARD", + "group": "motion", + "utterance": "靠背向前移动10度", + "started_at": "2026-08-01T18:56:37.309375Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185637-e74f66", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 0F 00 65 17 00", + "timestamp": 41037.003664 + } + }, + "backrest_recline": { + "position_pct": 36, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3599, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 10 00 0F 0E 00", + "timestamp": 41037.028979 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 0F 00 00 00 00", + "timestamp": 41037.05549 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 0F 00 10 27 00", + "timestamp": 41037.081162 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41037.092699 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41037.092699 + } + }, + "captured_at": "2026-08-01T18:56:41.969121Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:42.049069Z", + "duration_ms": 4740 + }, + { + "id": "MOTION-M2-RELATIVE-BACKWARD", + "group": "motion", + "utterance": "副驾椅背向后移动10度", + "started_at": "2026-08-01T18:56:42.049121Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185642-9fcaa4", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 12 00 F0 13 00", + "timestamp": 41041.934051 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 11 00 00 00 00", + "timestamp": 41041.959404 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 11 00 10 27 00", + "timestamp": 41041.98512 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 11 00 65 17 00", + "timestamp": 41042.011597 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41042.024352 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41042.024352 + } + }, + "captured_at": "2026-08-01T18:56:46.900703Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:46.978006Z", + "duration_ms": 4929 + }, + { + "id": "MOTION-M2-RELATIVE-FORWARD-CN", + "group": "motion", + "utterance": "椅背往前调十度", + "started_at": "2026-08-01T18:56:46.978062Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185646-3afa90", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 36, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3599, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 14 00 0F 0E 00", + "timestamp": 41046.645717 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 13 00 00 00 00", + "timestamp": 41046.671437 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 13 00 10 27 00", + "timestamp": 41046.697902 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 13 00 65 17 00", + "timestamp": 41046.723279 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41046.73483 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41046.73483 + } + }, + "captured_at": "2026-08-01T18:56:51.611166Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:51.695691Z", + "duration_ms": 4718 + }, + { + "id": "MOTION-M2-RELATIVE-BACKWARD-CN", + "group": "motion", + "utterance": "靠背后仰十度", + "started_at": "2026-08-01T18:56:51.695745Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185651-4f2b8b", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 15 00 10 27 00", + "timestamp": 41051.465939 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 15 00 65 17 00", + "timestamp": 41051.491246 + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 16 00 F0 13 00", + "timestamp": 41051.517798 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 15 00 00 00 00", + "timestamp": 41051.544271 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41051.554716 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41051.554716 + } + }, + "captured_at": "2026-08-01T18:56:56.430855Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:56:56.502940Z", + "duration_ms": 4807 + }, + { + "id": "MOTION-M3-ANGLE-145", + "group": "motion", + "utterance": "副驾腿托抬到145度", + "started_at": "2026-08-01T18:56:56.502992Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185656-e83150", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 69, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 6893, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 18 00 ED 1A 00", + "timestamp": 41062.506287 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 17 00 10 27 00", + "timestamp": 41062.531656 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 17 00 65 17 00", + "timestamp": 41062.55825 + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 17 00 F0 13 00", + "timestamp": 41062.584073 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41062.594504 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41062.594504 + } + }, + "captured_at": "2026-08-01T18:57:07.470496Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:57:07.554773Z", + "duration_ms": 11052 + }, + { + "id": "MOTION-M3-RELATIVE-DOWN", + "group": "motion", + "utterance": "脚托往下调10度", + "started_at": "2026-08-01T18:57:07.554839Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185707-99882f", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 19 00 65 17 00", + "timestamp": 41065.28971 + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 19 00 F0 13 00", + "timestamp": 41065.3163 + } + }, + "legrest_height": { + "position_pct": 55, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5487, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 1A 00 6F 15 00", + "timestamp": 41065.341663 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 19 00 10 27 00", + "timestamp": 41065.367523 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41065.377944 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41065.377944 + } + }, + "captured_at": "2026-08-01T18:57:10.253896Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:57:10.336590Z", + "duration_ms": 2782 + }, + { + "id": "MOTION-M3-RELATIVE-UP", + "group": "motion", + "utterance": "腿托向上抬十度", + "started_at": "2026-08-01T18:57:10.336647Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185710-fd8cc5", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 1B 00 F0 13 00", + "timestamp": 41068.130471 + } + }, + "legrest_height": { + "position_pct": 69, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 6893, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 1C 00 ED 1A 00", + "timestamp": 41068.155957 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 28 1B 00 10 27 00", + "timestamp": 41068.18173 + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 1B 00 65 17 00", + "timestamp": 41068.20835 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41068.219949 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41068.219949 + } + }, + "captured_at": "2026-08-01T18:57:13.095860Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:57:13.181872Z", + "duration_ms": 2845 + }, + { + "id": "SAFE-RELATIVE-OVERFLOW", + "group": "safety", + "utterance": "靠背向前移动200度", + "started_at": "2026-08-01T18:57:13.181932Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185713-d2d59a", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 51, + "cushion_tilt": 60, + "legrest_height": 69, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 51, + "cushion_tilt": 60, + "legrest_height": 69, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:57:13.940563Z", + "duration_ms": 759 + }, + { + "id": "SAFE-RELATIVE-WRONG-UNIT", + "group": "safety", + "utterance": "坐垫向前移动10度", + "started_at": "2026-08-01T18:57:13.940615Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185714-ddc0f5", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 51, + "cushion_tilt": 60, + "legrest_height": 69, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 51, + "cushion_tilt": 60, + "legrest_height": 69, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:57:14.760124Z", + "duration_ms": 820 + }, + { + "id": "SAFE-RELATIVE-MISSING-AXIS", + "group": "safety", + "utterance": "向前移动10度", + "started_at": "2026-08-01T18:57:14.760207Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185715-0bbbec", + "physical_state_before": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 51, + "cushion_tilt": 60, + "legrest_height": 69, + "longitudinal": 100 + } + }, + "physical_state_after": { + "source": "physical_can", + "complete": true, + "heating": 0, + "ventilation": 0, + "position": { + "backrest_recline": 51, + "cushion_tilt": 60, + "legrest_height": 69, + "longitudinal": 100 + } + }, + "finished_at": "2026-08-01T18:57:15.503247Z", + "duration_ms": 743 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T18:57:15.503288Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801185715-c258f7", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 1F 00 00 00 00", + "timestamp": 41127.219847 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 20 00 00 00 00", + "timestamp": 41127.245678 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 21 00 00 00 00", + "timestamp": 41127.271534 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 1E 00 00 00 00", + "timestamp": 41127.297631 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41127.305524 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 41127.305524 + } + }, + "captured_at": "2026-08-01T18:58:12.180377Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:58:12.254970Z", + "duration_ms": 56752 + }, + "finished_at": "2026-08-01T18:58:12.255010Z", + "summary": { + "total": 17, + "passed": 17, + "failed": 0, + "safety_blocked": 0, + "executed": 17, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_zero_gravity_regression.json b/artifacts/hil/seat_zero_gravity_regression.json new file mode 100644 index 0000000..e40a6e4 --- /dev/null +++ b/artifacts/hil/seat_zero_gravity_regression.json @@ -0,0 +1,252 @@ +{ + "suite": "t2g-seat-frontend-comprehensive-hil", + "started_at": "2026-08-01T18:23:33.171605Z", + "base_url": "http://127.0.0.1:8000", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260801182333", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MODE-ZERO-GRAVITY-OPEN", + "group": "mode", + "utterance": "打开零重力模式", + "started_at": "2026-08-01T18:23:33.171647Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801182333-ad87f6", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 33 01 10 27 00", + "timestamp": 39114.700574 + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 34 01 A7 1F 00", + "timestamp": 39114.725999 + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 35 01 B5 24 00", + "timestamp": 39114.754159 + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 32 01 10 27 00", + "timestamp": 39114.780784 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 39114.790091 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 39114.790091 + } + }, + "captured_at": "2026-08-01T18:24:39.703780Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:24:39.790515Z", + "duration_ms": 66619 + } + ], + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-01T18:24:39.790569Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260801182439-328aa0", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 38 01 00 00 00", + "timestamp": 39185.409902 + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 39 01 00 00 00", + "timestamp": 39185.435684 + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 3A 01 00 00 00", + "timestamp": 39185.461565 + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 37 01 00 00 00", + "timestamp": 39185.487663 + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 39185.496704 + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 39185.496704 + } + }, + "captured_at": "2026-08-01T18:25:50.408971Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-01T18:25:50.490639Z", + "duration_ms": 70700 + }, + "finished_at": "2026-08-01T18:25:50.490676Z", + "summary": { + "total": 1, + "passed": 1, + "failed": 0, + "safety_blocked": 0, + "executed": 1, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/config/environments/t2g_cabin_bench.example.yaml b/config/environments/t2g_cabin_bench.example.yaml new file mode 100644 index 0000000..261941e --- /dev/null +++ b/config/environments/t2g_cabin_bench.example.yaml @@ -0,0 +1,37 @@ +environment: t2g_cabin_bench +platform: t2g_cabin_bench +execution: + mode: hil + hardware_enabled_env: COGNITIVE_AGENT_HARDWARE_EXECUTION_ENABLED + approval_token_required_env: COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN_REQUIRED + approval_token_env: COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN + seat_firmware_probe_timeout_ms: 3500 +can_adapter: + backend: zlgcan + device: USBCANFD-200U + device_type: 41 + device_index: 0 + ownership: one_bridge_process_opens_device_once +buses: + seat_can: + channel_env: COGNITIVE_AGENT_SEAT_CAN_CHANNEL + default_channel: 0 + frame_format: classic_can_11_bit + bitrate: 500000 + termination_enabled_env: COGNITIVE_AGENT_SEAT_CAN_TERMINATION_ENABLED + termination_enabled_default: true + body_can: + enabled_env: COGNITIVE_AGENT_VEHICLE_CAN_ENABLED + channel_env: COGNITIVE_AGENT_VEHICLE_CAN_CHANNEL + default_channel: 1 + frame_format: can_fd_11_bit + arbitration_bitrate: 500000 + data_bitrate: 2000000 + iso: true + bitrate_switch: true + termination_enabled_env: COGNITIVE_AGENT_VEHICLE_CAN_TERMINATION_ENABLED + termination_enabled_default: false +safety: + channels_must_be_distinct: true + raw_can_passthrough: false + feedback_timeout_ms_env: COGNITIVE_AGENT_VEHICLE_CAN_FEEDBACK_TIMEOUT_MS diff --git a/config/environments/t2g_seat_bench.example.yaml b/config/environments/t2g_seat_bench.example.yaml index 77170e3..ca6fd73 100755 --- a/config/environments/t2g_seat_bench.example.yaml +++ b/config/environments/t2g_seat_bench.example.yaml @@ -20,7 +20,7 @@ firmware: topology: one_board_unified_seat_controller repository_project: firmware/t2g/Seat_Controller_demo/IAR/Seat_Controller_demo.ewp repository_vendor_dependencies: [firmware/t2g/common, firmware/t2g/tviibh8m] - verification: passive_301_302_303_304_305_4FA_and_max_hall + verification: passive_301_302_303_304_305_306_4FA_revision_7_and_max_hall expected_max_hall: [480, 374, 917, 647] auto_flash_enabled_env: COGNITIVE_AGENT_SEAT_AUTO_FLASH_ENABLED auto_flash_default_when_hardware_enabled: true diff --git a/config/modes/vehicles/denza_n7/dynamic_cradle.yaml b/config/modes/vehicles/denza_n7/dynamic_cradle.yaml new file mode 100644 index 0000000..606ea79 --- /dev/null +++ b/config/modes/vehicles/denza_n7/dynamic_cradle.yaml @@ -0,0 +1,82 @@ +id: dynamic_cradle +name: 动态摇篮模式 +aliases: + - 动态摇篮 + - 摇篮模式 + - cradle + - dynamic cradle +description: >- + 腾势 N7 固件原生位置闭环动态模式。Step 1先进入起始姿态;Step 2四轴同步启动并 + 以目标会合方式到达向前收拢姿态;Step 3四轴同步启动并会合返回起点,随后持续循环。 +icon: waves +scope: + vehicle_ids: + - denza_n7 +timeline: + repeat: until_stopped_or_timeout + max_runtime_ms: 600000 + entry: + id: step1 + name: 起始位置 + transition: all_targets_reached + timeout_ms: 30000 + targets: + longitudinal: {value: 172, unit: mm, hall_pulse: 391} + cushion_tilt: {value: 37.5, unit: percent, hall_pulse: 140} + backrest_recline: {value: 30, unit: degree_from_upright, hall_pulse: 405} + legrest_height: {value: 45, unit: degree, hall_pulse: 404} + phases: + - id: forward + name: Step 2 向前收拢 + completion: all_targets_reached + timeout_ms: 30000 + transition: synchronized_target_rendezvous + targets: + longitudinal: {value: 110, unit: mm, hall_pulse: 246} + cushion_tilt: {value: 75, unit: percent, hall_pulse: 281} + backrest_recline: {value: 52, unit: degree_from_upright, hall_pulse: 701} + legrest_height: {value: 55, unit: degree, hall_pulse: 494} + effects: + body_motion: {metaphor: cradle_rise, easing: smooth} + motion: + synchronized_start: true + synchronized_arrival: true + continuous_four_axis_cruise: true + cruise_duty_percent: + longitudinal: 50 + cushion_tilt: 50 + backrest_recline: 90 + legrest_height: 50 + final_approach_hall_pulses: 12 + final_duty_percent: 50 + - id: return + name: Step 3 向后回复 + completion: all_targets_reached + timeout_ms: 30000 + transition: synchronized_target_rendezvous + targets: + longitudinal: {value: 172, unit: mm, hall_pulse: 391} + cushion_tilt: {value: 37.5, unit: percent, hall_pulse: 140} + backrest_recline: {value: 30, unit: degree_from_upright, hall_pulse: 405} + legrest_height: {value: 45, unit: degree, hall_pulse: 404} + effects: + body_motion: {metaphor: cradle_sink, easing: smooth} + motion: + synchronized_start: true + synchronized_arrival: true + continuous_four_axis_cruise: true + cruise_duty_percent: + longitudinal: 50 + cushion_tilt: 50 + backrest_recline: 90 + legrest_height: 50 + final_approach_hall_pulses: 12 + final_duty_percent: 50 +operations: + - domain: seat + capability: seat.start_dynamic_mode + target_scope: passenger + operation: set + parameters: + mode_id: 2 + reason: 启动 IAR revision 13 四轴全程联动位置闭环动态摇篮,循环至停止指令或十分钟上限。 diff --git a/config/modes/vehicles/denza_n7/rocking_horse.yaml b/config/modes/vehicles/denza_n7/rocking_horse.yaml new file mode 100644 index 0000000..800243d --- /dev/null +++ b/config/modes/vehicles/denza_n7/rocking_horse.yaml @@ -0,0 +1,103 @@ +id: rocking_horse +name: 木马模式 +aliases: + - 木马模式 + - 木马 + - 摇摇马 + - 骑木马 + - rocking horse +description: >- + 腾势 N7 固件原生动态模式。座椅围绕中间姿态连续向前俯摆、向后仰摆, + 坐盆使用增强上下行程,四电机在每个半周期同步启动并以位置会合方式到达, + 形成可感知升降、无屏息、无末段追赶的木马节奏。 +icon: waves +scope: + vehicle_ids: + - denza_n7 +seat_tuning: + coordinate_space: hall_pulse + firmware_header: firmware/t2g/Seat_Controller_demo/Config/seat_dynamic_mode_config.h + calibrated_max_hall: [480, 374, 917, 647] + actual_bench_max_hall: [499, 374, 917, 647] + experience_tuning: + cushion_peak_to_peak_hall_pulses: 120 + cushion_peak_to_peak_vertical_mm: 18.0 + cushion_amplitude_gain_vs_revision_11: 2.0 + diagonal_coupling_compensation: + cushion_opposing_horizontal_mm: 16.4 + longitudinal_peak_to_peak_hall_pulses: 100 + longitudinal_peak_to_peak_mm: 44.8 + estimated_net_horizontal_mm: 28.4 + customization_rules: + - 所有目标必须位于对应轴已标定 Hall 量程内 + - 前后端点应围绕中心姿态分布,避免接近机械端点 + - 四轴占空比不得低于台架已验证的可靠起动值 + - 修改本文件后必须同步修改固件配置头并重新执行 IAR/HIL +timeline: + repeat: until_stopped_or_timeout + max_runtime_ms: 600000 + entry: + id: center + name: 木马中心姿态 + transition: all_targets_reached + timeout_ms: 30000 + targets: + longitudinal: {value: 143, unit: mm, hall_pulse: 320} + cushion_tilt: {value: 50.8, unit: percent, hall_pulse: 190} + backrest_recline: {value: 37.1, unit: degree_from_upright, hall_pulse: 500} + legrest_height: {value: 47.9, unit: degree, hall_pulse: 430} + phases: + - id: rock_forward + name: 向前俯摆 + completion: all_targets_reached + timeout_ms: 15000 + transition: synchronized_target_rendezvous + targets: + longitudinal: {value: 121, unit: mm, hall_pulse: 270} + cushion_tilt: {value: 66.8, unit: percent, hall_pulse: 250} + backrest_recline: {value: 34.1, unit: degree_from_upright, hall_pulse: 460} + legrest_height: {value: 44.5, unit: degree, hall_pulse: 400} + effects: + body_motion: {metaphor: rocking_horse_nose_down, easing: smooth} + motion: + synchronized_start: true + synchronized_arrival: true + continuous_four_axis_cruise: true + cruise_duty_percent: + longitudinal: 90 + cushion_tilt: 90 + backrest_recline: 90 + legrest_height: 50 + final_approach_hall_pulses: 8 + final_duty_percent: 50 + - id: rock_backward + name: 向后仰摆 + completion: all_targets_reached + timeout_ms: 15000 + transition: synchronized_target_rendezvous + targets: + longitudinal: {value: 166, unit: mm, hall_pulse: 370} + cushion_tilt: {value: 34.8, unit: percent, hall_pulse: 130} + backrest_recline: {value: 40.0, unit: degree_from_upright, hall_pulse: 540} + legrest_height: {value: 51.2, unit: degree, hall_pulse: 460} + effects: + body_motion: {metaphor: rocking_horse_nose_up, easing: smooth} + motion: + synchronized_start: true + synchronized_arrival: true + continuous_four_axis_cruise: true + cruise_duty_percent: + longitudinal: 90 + cushion_tilt: 90 + backrest_recline: 90 + legrest_height: 50 + final_approach_hall_pulses: 8 + final_duty_percent: 50 +operations: + - domain: seat + capability: seat.start_dynamic_mode + target_scope: passenger + operation: set + parameters: + mode_id: 1 + reason: 启动 IAR revision 13 带坐盆斜向耦合水平补偿的原生木马模式,循环至停止指令或十分钟上限。 diff --git a/config/native_can_capabilities/door.yaml b/config/native_can_capabilities/door.yaml new file mode 100644 index 0000000..718ea55 --- /dev/null +++ b/config/native_can_capabilities/door.yaml @@ -0,0 +1,21 @@ +apiVersion: cognitive-agent/v1alpha1 +kind: CapabilityCatalog +metadata: + id: door-native-can-capabilities + name: Door native CAN capabilities + version: 1.0.0 +spec: + domain: door + capabilities: + - name: door.set_rear_lock + description: Lock or unlock the second-row door lock through the verified vehicle CAN command. + target_devices: [rear_door_lock] + target_scopes: [rear] + parameters: + - name: state + type: string + required: true + allowed_values: [lock, unlock] + description: Absolute second-row lock request. + risk_level: medium + confirmation_policy: on_ambiguity diff --git a/config/native_can_capabilities/interior_light.yaml b/config/native_can_capabilities/interior_light.yaml new file mode 100644 index 0000000..d67b32e --- /dev/null +++ b/config/native_can_capabilities/interior_light.yaml @@ -0,0 +1,35 @@ +apiVersion: cognitive-agent/v1alpha1 +kind: CapabilityCatalog +metadata: + id: interior-light-native-can-capabilities + name: Interior light native CAN capabilities + version: 1.0.0 +spec: + domain: interior_light + capabilities: + - name: interior_light.set_indoor_power + description: Turn the general indoor light on or off through vehicle CAN. + target_devices: [indoor_light] + target_scopes: [vehicle] + parameters: &power_parameters + - name: state + type: string + required: true + allowed_values: ["on", "off"] + description: Absolute lamp power state. + risk_level: low + confirmation_policy: on_ambiguity + - name: interior_light.set_wall_power + description: Turn the wall lamp on or off through vehicle CAN. + target_devices: [wall_lamp] + target_scopes: [vehicle] + parameters: *power_parameters + risk_level: low + confirmation_policy: on_ambiguity + - name: interior_light.set_reading_power + description: Turn all or one supported reading-light zone on or off through vehicle CAN FD. + target_devices: [reading_light] + target_scopes: [all, front_left, front_right, middle_left, middle_right, middle_left_rotary, middle_right_rotary, rear_left, rear_right] + parameters: *power_parameters + risk_level: low + confirmation_policy: on_ambiguity diff --git a/config/native_can_capabilities/outlet.yaml b/config/native_can_capabilities/outlet.yaml new file mode 100644 index 0000000..4e3c5ee --- /dev/null +++ b/config/native_can_capabilities/outlet.yaml @@ -0,0 +1,27 @@ +apiVersion: cognitive-agent/v1alpha1 +kind: CapabilityCatalog +metadata: + id: outlet-native-can-capabilities + name: Air outlet native CAN capabilities + version: 1.0.0 +spec: + domain: outlet + capabilities: + - name: outlet.set_position_percent + description: Set both axes of one calibrated front air outlet using normalized percentages through vehicle CAN FD. + target_devices: [motorized_air_outlet] + target_scopes: [driver_left, driver_right, passenger_left, passenger_right] + parameters: + - {name: horizontal_pct, type: integer, unit: percent, minimum: 0, maximum: 100, required: true, description: Left-to-right target.} + - {name: vertical_pct, type: integer, unit: percent, minimum: 0, maximum: 100, required: true, description: Down-to-up target.} + risk_level: medium + confirmation_policy: on_ambiguity + - name: outlet.set_calibrated_position + description: Set both raw calibrated axes of one front air outlet. + target_devices: [motorized_air_outlet] + target_scopes: [driver_left, driver_right, passenger_left, passenger_right] + parameters: + - {name: horizontal_value, type: integer, minimum: -128, maximum: 126, required: true, description: Calibrated left-to-right coordinate.} + - {name: vertical_value, type: integer, minimum: -128, maximum: 126, required: true, description: Calibrated down-to-up coordinate.} + risk_level: medium + confirmation_policy: on_ambiguity diff --git a/config/native_can_capabilities/window.yaml b/config/native_can_capabilities/window.yaml new file mode 100644 index 0000000..f46f9d9 --- /dev/null +++ b/config/native_can_capabilities/window.yaml @@ -0,0 +1,35 @@ +apiVersion: cognitive-agent/v1alpha1 +kind: CapabilityCatalog +metadata: + id: window-native-can-capabilities + name: Window native CAN capabilities + version: 1.0.0 +spec: + domain: window + capabilities: + - name: window.set_motion + description: Open, close, or stop one or more windows through vehicle CAN FD. + target_devices: [window] + target_scopes: [all, front, rear, front_left, front_right, rear_left, rear_right] + parameters: + - name: motion + type: string + required: true + allowed_values: [open, close, stop] + description: Explicit window motion command. + risk_level: high + confirmation_policy: on_ambiguity + - name: window.set_position + description: Set one window to an absolute opening percentage using position feedback and a stop command. + target_devices: [window] + target_scopes: [front_left, front_right, rear_left, rear_right] + parameters: + - name: position_pct + type: integer + unit: percent + minimum: 0 + maximum: 100 + required: true + description: Absolute window opening percentage. + risk_level: high + confirmation_policy: on_ambiguity diff --git a/contracts/schemas/command-plan.schema.json b/contracts/schemas/command-plan.schema.json index fb8ef22..f8d1f7c 100755 --- a/contracts/schemas/command-plan.schema.json +++ b/contracts/schemas/command-plan.schema.json @@ -66,6 +66,13 @@ "operator": {"type": "string", "enum": ["eq", "neq", "gte", "lte", "within"]}, "value": {"type": ["number", "integer", "boolean", "string"]}, "tolerance": {"type": "number", "minimum": 0}, + "state_signal": {"type": "string", "minLength": 1}, + "accepted_states": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": {"type": "integer", "minimum": 0, "maximum": 255} + }, "timeout_ms": {"type": "integer", "minimum": 1, "maximum": 3600000} } }, @@ -94,6 +101,13 @@ "operator": {"type": "string", "enum": ["eq", "neq", "gte", "lte", "within"]}, "value": {"type": ["number", "integer", "boolean", "string"]}, "tolerance": {"type": "number", "minimum": 0}, + "state_signal": {"type": "string", "minLength": 1}, + "accepted_states": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": {"type": "integer", "minimum": 0, "maximum": 255} + }, "timeout_ms": {"type": "integer", "minimum": 1, "maximum": 3600000} } } diff --git a/docs/workflows/t2g-cabin-dual-channel-can.md b/docs/workflows/t2g-cabin-dual-channel-can.md new file mode 100644 index 0000000..e990c64 --- /dev/null +++ b/docs/workflows/t2g-cabin-dual-channel-can.md @@ -0,0 +1,53 @@ +# T2G 座椅与车身双通道 CAN 联动 + +## 集成基线 + +- 座椅控制沿用当前仓库的 IAR `Seat_Controller_demo` 协议与闭环回读。 +- 车身控制从 `https://git.kendeji.fun/dev-team/project-code` 的 `CAN_DEV` 分支导入,固定基线为提交 `6e7ed04a468dfcde7efda9e30bc15144bf02faf9`。 +- 不允许自然语言直接提供 CAN ID 或原始载荷;只有能力目录中命名、经过范围校验的动作可以编译到车身 CAN。 + +## 适配器和通道 + +一个 `USBCANFD-200U` 只由一个 32 位桥接进程打开一次,再向应用暴露两个通道视图: + +| 通道 | 用途 | 帧格式 | 仲裁速率 | 数据速率 | +|---|---|---|---:|---:| +| CH0 | T2G 副驾座椅控制器 | 11-bit Classic CAN | 500 kbit/s | — | +| CH1 | 空调、车窗、门锁、灯光、遮阳帘和电动风口 | 11-bit ISO CAN FD;按报文选择 BRS | 500 kbit/s | 2 Mbit/s | + +车身通道使用 60 MHz CAN 时钟。仲裁段为 `tseg1=14, tseg2=3, sjw=2, smp=0, brp=5`,20 TQ、80% 采样点;数据段为 `tseg1=10, tseg2=2, sjw=2, smp=0, brp=1`,15 TQ、80% 采样点。ZLG 运行时使用驱动内置的 `500000`/`2000000`、80% 参数项,并显式选择 Normal、ISO CAN FD。 + +## 服务端配置 + +```powershell +$env:COGNITIVE_AGENT_HARDWARE_EXECUTION_ENABLED = "true" +$env:COGNITIVE_AGENT_VEHICLE_CAN_ENABLED = "true" +$env:COGNITIVE_AGENT_SEAT_CAN_BACKEND = "zlgcan" +$env:COGNITIVE_AGENT_VEHICLE_CAN_BACKEND = "zlgcan" +$env:COGNITIVE_AGENT_SEAT_CAN_CHANNEL = "0" +$env:COGNITIVE_AGENT_VEHICLE_CAN_CHANNEL = "1" +$env:COGNITIVE_AGENT_VEHICLE_CAN_ARBITRATION_BITRATE = "500000" +$env:COGNITIVE_AGENT_VEHICLE_CAN_DATA_BITRATE = "2000000" +$env:COGNITIVE_AGENT_SEAT_CAN_TERMINATION_ENABLED = "true" +$env:COGNITIVE_AGENT_VEHICLE_CAN_TERMINATION_ENABLED = "false" +$env:COGNITIVE_AGENT_SEAT_FIRMWARE_PROFILES = "combined" +$env:COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN = "" +``` + +真实执行会拒绝以下情况:两个逻辑总线配置为同一通道、CAN FD 时序不等于已验证值、ZLG 32 位运行时缺失、座椅固件未通过被动签名检查、车身动作不在可信能力目录内,或需要反馈的车身指令未收到对应状态帧。 + +## 一句话联动示例 + +`副驾座椅通风3档,同时打开空调,温度设为24度,风量3档` + +该请求生成独立的 `seat` 与 `native_climate` FunctionConfig/CommandPlan。真实执行时,两组执行器在独立线程中使用 CH0/CH1 通道视图;底层桥接仍统一串行化 SDK 调用,并将长时间接收切成不超过 20 ms 的时间片,以便两个通道交替收发。 + +## 验证要求 + +1. 先运行 `zlgcan_bridge.py --self-test`,确认经典 CAN 与 CAN FD API 导出及 ABI 结构尺寸。 +2. 在 ZCANPRO 确认 CH0/CH1 接线、终端电阻和总线状态正常,然后关闭其在线通道,避免与服务争用设备。 +3. 用 dry-run 核对两份计划:座椅报文位于 `seat_can`,车身报文位于 `body_can`;空调控制 ID 为 `0x1DE`。 +4. 以 hardware 模式执行低风险联动句,要求座椅板端反馈成功,且车身通道观测到对应状态反馈(空调为 `0x404`)。仅发送成功而无状态帧不能记为通过。 +5. 验证完成后关闭座椅热舒适功能、发送座椅 `STOP_ALL`,并按测试前状态恢复车身设备。 + +相关机器可读配置位于 `platforms/t2g_cabin_bench/` 与 `config/environments/t2g_cabin_bench.example.yaml`。 diff --git a/docs/workflows/t2g-seat-hardware-bench.md b/docs/workflows/t2g-seat-hardware-bench.md index dd3cf51..b794d74 100755 --- a/docs/workflows/t2g-seat-hardware-bench.md +++ b/docs/workflows/t2g-seat-hardware-bench.md @@ -42,13 +42,13 @@ powershell -ExecutionPolicy Bypass -File .\tools\build_seat_firmware.ps1 - 热管理命令:`0x29E/0x3CE`;档位反馈:`0x4FA`。 - 移动命令:`0x300`;系统 ACK:`0x301`;归一化位置:`0x302`;Hall/量程:`0x303`。 -- 电流诊断:`0x304` 四轴轮询,`0x305` 通风/加热;这些值用于台架可见性,当前保守阈值不能替代外部限流或量产保护。 +- 电流诊断:`0x304` 四轴轮询,`0x305` 通风/加热;动态模式:`0x306` 以100 ms周期报告模式、阶段、循环和活动轴。这些诊断值用于台架可见性,当前保守阈值不能替代外部限流或量产保护。 - Opcode 1 的 `ParamA` 为 1–10000 绝对位置;后端显式发送 30 s 超时覆盖值。 - 前端目标 `0%`/“归零”不是普通绝对位置,而是 `HOME_KNOWN_RANGE (0x0B)`;只有收到 `COMPLETE/OK`、Near、Hall≤2 和 PositionValid 才算成功。 - Opcode 3 的 `ParamA` 为持续时间,`ParamB` 为驱动等级×10(默认 90%)。 - `STOP_ALL` 的专用 ACK 为 4;完成/故障 TaskState 分别为 6/7。 -新版固件把 `0x304/0x305` 用于电流诊断,不能继续发送旧版身份请求。后端在任何控制帧之前被动观察 `0x301–0x305`、`0x4FA`、四个 MotorID、固件 revision 6 和各轴标称 MaxHall(允许 5% 台架差异);真实硬件执行启用后,未观察到完整签名会自动使用仓库内 IAR 镜像烧写,重新被动验证成功后继续原请求。烧写或复验失败时禁止发送座椅控制帧。 +新版固件把 `0x304/0x305` 用于电流诊断,并用`0x306`报告原生动态模式,不能继续发送旧版身份请求。后端在任何控制帧之前被动观察 `0x301–0x306`、`0x4FA`、四个 MotorID、固件 revision 13 和各轴标称 MaxHall(允许 5% 台架差异);真实硬件执行启用后,未观察到完整签名会自动使用仓库内 IAR 镜像烧写,重新被动验证成功后继续原请求。烧写或复验失败时禁止发送座椅控制帧。 ## 启用配置 @@ -99,6 +99,20 @@ COGNITIVE_AGENT_SEAT_HOME_TIMEOUT_S=120 2026-08-01 长序列中记录到的 M0/M2 无 Hall、M1 高电流无 Hall 故障,后续确认由水平、坐盆和靠背 Hall 地线断开引起,并非软件标定或堵转阈值问题。2026-08-02 重新接好地线并用手工 HIL GUI 验证后,仓库 revision 6 自动烧写成功,四轴均从机械零位以 `PositionValid=1` 启动;自动前端 HIL 的 33 条热功能、单轴、四轴归零、组合和预设模式用例全部通过。因此测试清单中的临时 `safety_blocked` 已撤销。若以后再次出现同类现象,仍应以命令期间 `0x303` Hall 与 `0x304` 电流联合诊断,不能通过提高 Duty 或阈值掩盖线路故障。 +2026-08-03 revision 7加入`START_DYNAMIC_MODE(0x0E)`、`STOP_DYNAMIC_MODE(0x0F)`和`0x306`;revision 8验证了连续循环、循环中停止、堵转/无运动保护和ECU启动累计600 s自动停止的公共动态模式运行时。旧ModeID 1轨迹现已从固件、长期库和前端能力中移除,revision 11复用ModeID 1实现木马模式。 + +2026-08-04 revision 8复测时,公共动态运行时曾单次连续运行600.024 s并自动返回全零IDLE且无FAULT;循环中`STOP_DYNAMIC`也通过。同期动态摇篮被实台M1坐盆轴的真实STALL阻断,独立单轴复测同样在Hall约169失速;后续已恢复机构运动并保留安全全停,未通过降低目标或屏蔽堵转保护改判。 + +同日revision 9把摇篮改为位置闭环会合,不再使用固定30 s阶段。M1以`0x0B`从Hall 169连续回近端0且保持MaxHall=374后,Step 1→2实测17.329 s、启动/到位离散0.077/0.338 s;Step 2→3实测15.155 s、离散0.079/0.495 s;目标精确、CycleIndex进入1、下一轮四轴启动离散0.082 s、停止全零,PASS。证据见`artifacts/hil/dynamic_cradle_rev9_20260804.json`。Step 3和Step 1坐标相同,其边界是零位移原子换轮;可观测同步动作是紧随其后的下一轮Step 1→2四轴启动。 + +同日revision 10移除revision 9中“M1先走10 Hall、等待其他轴预备到位后再单独追赶”的临时避让。正向/返回四轴从阶段开始即全程联动;水平/靠背达到约25%行程时,坐盆已分别完成44.0%/39.0%,启动离散0.070/0.050 s,到位离散0.342/0.339 s,下一轮启动离散0.051 s,无FAULT并可正常停止。证据见`artifacts/hil/dynamic_cradle_rev10_continuous_cruise_20260804.json`。 + +同日revision 11移除旧ModeID 1轨迹并加入木马模式。入口为`[320,190,500,430]`,连续端点为前俯`[290,220,460,400]`与后仰`[350,160,540,460]`;稳态完整循环约9.0 s。实测两个稳态半周期四轴启动离散0.080/0.079 s、到位离散0.234/0.232 s;水平轴到25%时坐盆已达41.7%/36.7%,目标误差不超过1 Hall,自动续环与循环中停止均PASS。证据见`artifacts/hil/rocking_horse_rev11_20260804.json`。 + +同日revision 12把木马坐盆端点由`220↔160`扩大为`250↔130` Hall,并把M1巡航占空比由50%提升为90%。峰峰上下行程由60增至120 Hall,折算垂直分量约由9 mm增至18 mm;稳态前俯/后仰启动离散0.054/0.081 s,到位离散0.389/0.182 s,水平轴到25%时坐盆已完成46.6%/35.8%,完整循环约9.2 s。目标误差不超过2 Hall、无FAULT、自动续环与停止全零均PASS。证据见`artifacts/hil/rocking_horse_rev12_cushion_amplitude_20260804.json`。 + +同日revision 13加入坐盆斜向运动的水平前馈补偿:木马M0端点由`290↔350`扩大为`270↔370` Hall,峰峰行程100 Hall,巡航Duty由50%提升为90%。按台架M0 MaxHall=499换算水平峰峰行程约43.1 mm,扣除M1斜向行程估算的16.4 mm反向水平分量后,净水平摆幅约26.7 mm。稳态前俯/后仰启动离散0.077/0.052 s,到位离散0.337/0.182 s;巡航检查点四轴均持续推进,目标误差不超过1 Hall、无FAULT、自动续环与停止全零均PASS。证据见`artifacts/hil/rocking_horse_rev13_horizontal_compensation_20260804.json`。 + 2026-08-02 时长/超量程规则完成后,扩充清单的真实回归结果为 161/161 通过、0 失败、0 `safety_blocked`,最终清理和独立物理复核均通过。报告位于 `artifacts/hil/seat_frontend_hil_20260802_full_timed_overflow.json`;复核时加热/通风为 0 档,M0/M1/M2/M3 均为 0%,全部 `Position_Valid=1`。 2026-08-02 增加 GPT-5.6-sol 模糊意图与位置记忆同步后,完整回归为 162/162 通过;“前舱空间太挤了,把座椅调整到舒服的位置”明确记录 `provider_used=openai:gpt-5.6-sol`,物理目标为 M0/M1/M2/M3=`80/30/35/10%`。报告位于 `artifacts/hil/seat_frontend_hil_20260802_full_gpt56_position_sync.json`;最终独立复核仍为热管理关闭、四轴 0% 且全部 `Position_Valid=1`。 diff --git a/domains/climate/config/capabilities.yaml b/domains/climate/config/capabilities.yaml index a6666b3..55089ec 100755 --- a/domains/climate/config/capabilities.yaml +++ b/domains/climate/config/capabilities.yaml @@ -71,14 +71,14 @@ spec: risk_level: low confirmation_policy: on_ambiguity - name: climate.set_outlet_mode - description: Direct a zone outlet toward the face or feet. + description: Select a whole-cabin vehicle CAN airflow mode; face and feet remain valid zone-level virtual controls. target_devices: [hvac] - target_scopes: [driver, passenger, rear_left, rear_right] + target_scopes: [driver, passenger, rear_left, rear_right, vehicle] parameters: - name: mode type: string required: true - allowed_values: [face, feet] + allowed_values: [face, face_feet, feet, feet_defrost, defrost, face_feet_defrost, face_defrost] description: Absolute outlet direction. risk_level: low confirmation_policy: on_ambiguity @@ -94,3 +94,15 @@ spec: description: Absolute front defrost state. risk_level: medium confirmation_policy: on_ambiguity + - name: climate.set_control_mode + description: Select manual or automatic HVAC control through the verified vehicle CAN command. + target_devices: [hvac] + target_scopes: [vehicle] + parameters: + - name: mode + type: string + required: true + allowed_values: [manual, auto] + description: Absolute HVAC control strategy. + risk_level: low + confirmation_policy: on_ambiguity diff --git a/domains/climate/schemas/function-parameters.schema.json b/domains/climate/schemas/function-parameters.schema.json index 226e937..60c09d1 100755 --- a/domains/climate/schemas/function-parameters.schema.json +++ b/domains/climate/schemas/function-parameters.schema.json @@ -63,7 +63,30 @@ "type": "object", "additionalProperties": false, "required": ["mode"], - "properties": {"mode": {"enum": ["face", "feet"]}} + "properties": { + "mode": { + "enum": [ + "face", + "face_feet", + "feet", + "feet_defrost", + "defrost", + "face_feet_defrost", + "face_defrost" + ] + } + } + } + } + }, + { + "properties": { + "capability": {"const": "climate.set_control_mode"}, + "parameters": { + "type": "object", + "additionalProperties": false, + "required": ["mode"], + "properties": {"mode": {"enum": ["manual", "auto"]}} } } } diff --git a/domains/roof/config/capabilities.yaml b/domains/roof/config/capabilities.yaml index 1b62af4..c3e87d4 100755 --- a/domains/roof/config/capabilities.yaml +++ b/domains/roof/config/capabilities.yaml @@ -7,6 +7,18 @@ metadata: spec: domain: roof capabilities: + - name: roof.set_shade_motion + description: Open, close, half-open, or stop the panoramic roof shade through vehicle CAN. + target_devices: [roof_shade] + target_scopes: [vehicle] + parameters: + - name: motion + type: string + required: true + allowed_values: [open, close, half, stop] + description: Explicit shade motion command. + risk_level: high + confirmation_policy: on_ambiguity - name: roof.set_shade_position description: Set the rear panoramic roof shade to an absolute position, 0 closed and 100 open. target_devices: [roof_shade] diff --git a/domains/roof/schemas/function-parameters.schema.json b/domains/roof/schemas/function-parameters.schema.json index 6dd2bb1..c421996 100755 --- a/domains/roof/schemas/function-parameters.schema.json +++ b/domains/roof/schemas/function-parameters.schema.json @@ -23,6 +23,17 @@ } } }, + { + "properties": { + "capability": {"const": "roof.set_shade_motion"}, + "parameters": { + "type": "object", + "additionalProperties": false, + "required": ["motion"], + "properties": {"motion": {"enum": ["open", "close", "half", "stop"]}} + } + } + }, { "properties": { "capability": {"const": "roof.set_transmittance"}, diff --git a/domains/seat/can/seat-motion-hardware-matrix.yaml b/domains/seat/can/seat-motion-hardware-matrix.yaml index 8c56694..bd24215 100755 --- a/domains/seat/can/seat-motion-hardware-matrix.yaml +++ b/domains/seat/can/seat-motion-hardware-matrix.yaml @@ -89,6 +89,18 @@ messages: - {name: Current_Raw, start_bit: 16, bit_length: 16} - {name: Current_Baseline_Raw, start_bit: 32, bit_length: 16} - {name: Stall_Current_Delta_Threshold_Raw, start_bit: 48, bit_length: 16} + - name: T2G_Seat_Dynamic_Mode_Status_306 + frame_id: 0x306 + role: feedback + minimum_payload_bytes: 8 + signals: + - {name: Dynamic_Mode_ID, start_bit: 0, bit_length: 8} + - {name: Dynamic_State, start_bit: 8, bit_length: 8} + - {name: Dynamic_Phase, start_bit: 16, bit_length: 8} + - {name: Dynamic_Active_Mask, start_bit: 24, bit_length: 4} + - {name: Dynamic_Fault_Mask, start_bit: 28, bit_length: 4} + - {name: Dynamic_Cycle_Index, start_bit: 32, bit_length: 16} + - {name: Dynamic_Phase_Elapsed_Ms, start_bit: 48, bit_length: 16} - name: T2G_Seat_Thermal_Current_Diagnostic_305 frame_id: 0x305 role: feedback diff --git a/domains/seat/can/signal-mapping.hardware.yaml b/domains/seat/can/signal-mapping.hardware.yaml index 90190ce..9dd0b34 100755 --- a/domains/seat/can/signal-mapping.hardware.yaml +++ b/domains/seat/can/signal-mapping.hardware.yaml @@ -3,7 +3,7 @@ kind: SignalMapping metadata: id: seat-t2g-bench-hardware-mapping name: Verified T2G seat bench mapping - version: 3.0.0 + version: 3.1.0 description: Front-passenger-only mapping implemented by the unified Seat_Controller_demo IAR firmware. spec: domain: seat @@ -80,3 +80,23 @@ spec: feedback_signal: Value_X100 calibration_ref: ../../../platforms/t2g_seat_bench/calibration/seat.yaml unit: percent + - capability: seat.start_dynamic_mode + parameter: mode_id + target_zone: front_right + physical_target_alias: t2g_primary_seat + compiler_handler: compile_t2g_dynamic_mode + bus: seat_can + message: T2G_Seat_Move_Command_300 + signal: Param_A + feedback_message: T2G_Seat_Dynamic_Mode_Status_306 + feedback_signal: Dynamic_Mode_ID + unit: enum + - capability: seat.stop_dynamic_mode + target_zone: front_right + physical_target_alias: t2g_primary_seat + compiler_handler: compile_t2g_dynamic_mode + bus: seat_can + message: T2G_Seat_Move_Command_300 + feedback_message: T2G_Seat_Dynamic_Mode_Status_306 + feedback_signal: Dynamic_State + unit: enum diff --git a/domains/seat/config/capabilities.yaml b/domains/seat/config/capabilities.yaml index 48a2de8..3f7d862 100755 --- a/domains/seat/config/capabilities.yaml +++ b/domains/seat/config/capabilities.yaml @@ -3,7 +3,7 @@ kind: CapabilityCatalog metadata: id: seat-capabilities name: Seat capabilities - version: 1.3.0 + version: 1.4.0 spec: domain: seat capabilities: @@ -27,11 +27,13 @@ spec: - name: level type: integer required: false - description: Desired 1-3 comfort level; simulated until a level command signal is supplied. + description: Desired 1-5 comfort level; levels 4-5 require the vehicle native-CAN backend. allowed_values: - 1 - 2 - 3 + - 4 + - 5 risk_level: medium confirmation_policy: on_ambiguity - name: seat.set_heating @@ -53,11 +55,13 @@ spec: - name: level type: integer required: false - description: Desired 1-3 comfort level; simulated until a level command signal is supplied. + description: Desired 1-5 comfort level; levels 4-5 require the vehicle native-CAN backend. allowed_values: - 1 - 2 - 3 + - 4 + - 5 risk_level: medium confirmation_policy: on_ambiguity - name: seat.set_longitudinal_position @@ -198,6 +202,38 @@ spec: description: Absolute normalized leg-rest extension target. risk_level: high confirmation_policy: on_ambiguity + - name: seat.start_dynamic_mode + description: >- + Start a firmware-owned cyclic four-axis trajectory on the front-passenger seat. + Mode 1 is the short-travel rocking-horse pitch cycle; mode 2 is the long-travel + dynamic cradle. Both use four-axis target rendezvous, repeat until explicitly + stopped, and stop automatically when the firmware-enforced ten-minute runtime + limit expires. A target phase faults safely if it cannot finish within its limit. + target_devices: + - seat_motion_controller + target_scopes: + - passenger + parameters: + - name: mode_id + type: integer + required: true + description: Native dynamic mode identifier implemented by Seat_Controller_demo. + allowed_values: + - 1 + - 2 + risk_level: high + confirmation_policy: on_ambiguity + - name: seat.stop_dynamic_mode + description: >- + Stop whichever firmware-owned dynamic trajectory is currently running on the + front-passenger seat. Use for natural-language stop, close, cancel, or end requests. + target_devices: + - seat_motion_controller + target_scopes: + - passenger + parameters: [] + risk_level: low + confirmation_policy: never - name: seat.save_posture_preset description: >- Save the current five-axis posture of the front-passenger seat as a conversation-owned named preset. diff --git a/domains/seat/schemas/function-parameters.schema.json b/domains/seat/schemas/function-parameters.schema.json index 76dc051..5a343d1 100755 --- a/domains/seat/schemas/function-parameters.schema.json +++ b/domains/seat/schemas/function-parameters.schema.json @@ -22,7 +22,7 @@ "required": ["state"], "properties": { "state": {"type": "string", "enum": ["on", "off"]}, - "level": {"type": "integer", "minimum": 1, "maximum": 3} + "level": {"type": "integer", "minimum": 1, "maximum": 5} } } } @@ -37,7 +37,7 @@ "required": ["state"], "properties": { "state": {"type": "string", "enum": ["on", "off"]}, - "level": {"type": "integer", "minimum": 1, "maximum": 3} + "level": {"type": "integer", "minimum": 1, "maximum": 5} } } } @@ -65,6 +65,31 @@ } } } + }, + { + "type": "object", + "properties": { + "capability": {"const": "seat.start_dynamic_mode"}, + "parameters": { + "type": "object", + "additionalProperties": false, + "required": ["mode_id"], + "properties": { + "mode_id": {"type": "integer", "enum": [1, 2]} + } + } + } + }, + { + "type": "object", + "properties": { + "capability": {"const": "seat.stop_dynamic_mode"}, + "parameters": { + "type": "object", + "additionalProperties": false, + "maxProperties": 0 + } + } } ] } diff --git a/domains/seat/src/seat_domain/compiler.py b/domains/seat/src/seat_domain/compiler.py index 84dcc53..29e4d6c 100755 --- a/domains/seat/src/seat_domain/compiler.py +++ b/domains/seat/src/seat_domain/compiler.py @@ -24,7 +24,7 @@ MOTION_STATUS_MESSAGES = { class SeatCompiler: - version = "1.1.0" + version = "1.2.0" def __init__(self, mapping_path: Path): self.mapping = yaml.safe_load(mapping_path.read_text(encoding="utf-8")) @@ -42,6 +42,49 @@ class SeatCompiler: motion_index = 0 for operation in function_config["spec"]["operations"]: + if operation["capability"] == "seat.start_dynamic_mode": + mode_id = int(operation["parameters"]["mode_id"]) + if mode_id not in {1, 2}: + raise ValueError("dynamic seat mode_id must be 1 or 2") + motion_commands.append( + { + "id": f"dynamic_{operation['id']}", + "operation_ref": operation["id"], + "bus": "seat_can", + "message": "Seat_Dynamic_Mode_Virtual", + "signals": {"Dynamic_Mode_ID": mode_id}, + "send_offset_ms": motion_index * 50, + "completion": { + "message": "Seat_Dynamic_Mode_Status_Virtual", + "signal": "Dynamic_Mode_ID", + "operator": "eq", + "value": mode_id, + "timeout_ms": int(operation.get("timeout_ms", 5000)), + }, + } + ) + motion_index += 1 + continue + if operation["capability"] == "seat.stop_dynamic_mode": + motion_commands.append( + { + "id": f"dynamic_stop_{operation['id']}", + "operation_ref": operation["id"], + "bus": "seat_can", + "message": "Seat_Dynamic_Mode_Stop_Virtual", + "signals": {"Dynamic_State": 0}, + "send_offset_ms": motion_index * 50, + "completion": { + "message": "Seat_Dynamic_Mode_Status_Virtual", + "signal": "Dynamic_State", + "operator": "eq", + "value": 0, + "timeout_ms": int(operation.get("timeout_ms", 5000)), + }, + } + ) + motion_index += 1 + continue mapping = self._mapping_for(operation["capability"], operation["target"]["zone"]) handler = mapping["compiler_handler"] if handler == "compile_binary_control": diff --git a/domains/seat/src/seat_domain/executor.py b/domains/seat/src/seat_domain/executor.py index 8fd7505..c7161b7 100755 --- a/domains/seat/src/seat_domain/executor.py +++ b/domains/seat/src/seat_domain/executor.py @@ -58,6 +58,15 @@ class VirtualSeatExecutor: operations = [operation_by_id[item] for item in operation_ids] if command["message"] == "Seat_Thermal_Control_42A": results.extend(self._execute_thermal(command, operations)) + elif command["message"] in { + "Seat_Dynamic_Mode_Virtual", + "Seat_Dynamic_Mode_Stop_Virtual", + }: + if len(operations) != 1: + raise ValueError( + "A dynamic-mode command must reference exactly one operation" + ) + results.append(self._execute_dynamic_mode(command, operations[0])) else: if len(operations) != 1: raise ValueError("A motion command must reference exactly one operation") @@ -134,6 +143,62 @@ class VirtualSeatExecutor: ) return results + @staticmethod + def _execute_dynamic_mode( + command: dict[str, Any], operation: dict[str, Any] + ) -> dict[str, Any]: + if operation["capability"] == "seat.stop_dynamic_mode": + return { + "ref": operation["id"], + "domain": "seat", + "status": "succeeded", + "message": "虚拟控制器已停止动态座椅模式", + "telemetry": { + "dynamic_mode_id": 0, + "dynamic_mode_name": "", + "dynamic_state": "idle", + "repeat": "none", + "max_runtime_ms": 600_000, + "command_frame": { + "frame_id": "virtual", + "data_hex": "dynamic-stop", + }, + "feedback_frame": { + "frame_id": "virtual", + "data_hex": "dynamic-idle", + }, + "simulated": True, + }, + } + mode_id = int(operation["parameters"]["mode_id"]) + cycle_ms = None + mode_name = "木马模式" if mode_id == 1 else "动态摇篮模式" + return { + "ref": operation["id"], + "domain": "seat", + "status": "succeeded", + "message": ( + f"虚拟控制器已启动{mode_name},持续循环至停止指令或十分钟上限" + ), + "telemetry": { + "dynamic_mode_id": mode_id, + "dynamic_mode_name": mode_name, + "dynamic_state": "running", + "repeat": "until_stopped_or_timeout", + "max_runtime_ms": 600_000, + "cycle_duration_ms": cycle_ms, + "command_frame": { + "frame_id": "virtual", + "data_hex": f"dynamic-mode-{mode_id}", + }, + "feedback_frame": { + "frame_id": "virtual", + "data_hex": f"dynamic-running-{mode_id}", + }, + "simulated": True, + }, + } + def _execute_motion( self, command: dict[str, Any], diff --git a/domains/seat/src/seat_domain/generator.py b/domains/seat/src/seat_domain/generator.py index d67e875..d52ca63 100755 --- a/domains/seat/src/seat_domain/generator.py +++ b/domains/seat/src/seat_domain/generator.py @@ -20,6 +20,9 @@ MOTION_CAPABILITIES = { "legrest_height": "seat.set_legrest_height", "legrest_extension": "seat.set_legrest_extension", } +DYNAMIC_MODE_CAPABILITY = "seat.start_dynamic_mode" +DYNAMIC_MODE_STOP_CAPABILITY = "seat.stop_dynamic_mode" +DYNAMIC_MODE_MAX_RUNTIME_MS = 600_000 def _now() -> str: @@ -31,6 +34,36 @@ def build_intent_ir( ) -> dict[str, Any]: requests = [] for action in parsed["actions"]: + if action.get("action_type") == "dynamic_mode_stop": + requests.append( + { + "domain": "seat", + "goal": f"Stop the active dynamic seat mode on {action['target']}", + "target": TARGETS[action["target"]], + "parameters": {"capability": DYNAMIC_MODE_STOP_CAPABILITY}, + "source_span": utterance, + } + ) + continue + if action.get("action_type") == "dynamic_mode": + requests.append( + { + "domain": "seat", + "goal": ( + f"Start bounded cyclic dynamic seat mode {action['mode_name']} " + f"on {action['target']}" + ), + "target": TARGETS[action["target"]], + "parameters": { + "capability": DYNAMIC_MODE_CAPABILITY, + "mode_id": action["mode_id"], + "repeat": "until_stopped_or_timeout", + "max_runtime_ms": DYNAMIC_MODE_MAX_RUNTIME_MS, + }, + "source_span": utterance, + } + ) + continue if action.get("action_type") == "position": parameters = { "axis": action["axis"], @@ -158,6 +191,42 @@ def build_function_config( "The supplied matrix is partial; this configuration is eligible for virtual execution only." ] for index, action in enumerate(parsed["actions"], start=1): + if action.get("action_type") == "dynamic_mode_stop": + operation_id = f"{action['target']}_dynamic_mode_stop" + operations.append( + { + "id": operation_id, + "capability": DYNAMIC_MODE_STOP_CAPABILITY, + "target": TARGETS[action["target"]], + "parameters": {}, + "timeout_ms": 5000, + "failure_policy": "abort", + } + ) + assumptions.append( + f"Operation {operation_id} stops the firmware-owned loop and " + "requires 0x306 to return IDLE." + ) + continue + if action.get("action_type") == "dynamic_mode": + operation_id = f"{action['target']}_dynamic_mode_{action['mode_id']}" + operations.append( + { + "id": operation_id, + "capability": DYNAMIC_MODE_CAPABILITY, + "target": TARGETS[action["target"]], + "parameters": {"mode_id": int(action["mode_id"])}, + "timeout_ms": 5000, + "failure_policy": "abort", + } + ) + assumptions.append( + f"Operation {operation_id} starts a firmware-owned cyclic loop with " + f"a {DYNAMIC_MODE_MAX_RUNTIME_MS} ms safety cap; " + "completion means that the controller acknowledged the mode and " + "reported it through 0x306, not that the loop terminated." + ) + continue if action.get("action_type") == "position": operation_id = ( f"{action['target']}_{action['axis']}_{action['position_pct']}pct" diff --git a/domains/seat/src/seat_domain/hardware_compiler.py b/domains/seat/src/seat_domain/hardware_compiler.py index 2bb0ef0..318f9cd 100755 --- a/domains/seat/src/seat_domain/hardware_compiler.py +++ b/domains/seat/src/seat_domain/hardware_compiler.py @@ -16,7 +16,7 @@ STATE_VALUES = {"on": 1, "off": 2} class T2GSeatCompiler: """Deterministic compiler for the HIL-verified T2G seat bench protocol.""" - version = "2.0.0" + version = "2.1.0" def __init__(self, mapping_path: Path, calibration_path: Path): self.mapping = yaml.safe_load(mapping_path.read_text(encoding="utf-8")) @@ -41,13 +41,29 @@ class T2GSeatCompiler: for item in operations if item["capability"] in {"seat.set_ventilation", "seat.set_heating"} ] - motion_operations = [item for item in operations if item not in thermal_operations] + dynamic_operations = [ + item + for item in operations + if item["capability"] in { + "seat.start_dynamic_mode", + "seat.stop_dynamic_mode", + } + ] + motion_operations = [ + item + for item in operations + if item not in thermal_operations and item not in dynamic_operations + ] commands: list[dict[str, Any]] = [] if thermal_operations: commands.extend( self._compile_thermal(thermal_operations, actuator_state or {}) ) + if dynamic_operations: + commands.extend( + self._compile_dynamic_mode(dynamic_operations, len(commands)) + ) commands.extend(self._compile_motion(motion_operations, len(commands))) canonical = json.dumps( @@ -257,6 +273,55 @@ class T2GSeatCompiler: commands.append(command) return commands + def _compile_dynamic_mode( + self, + operations: list[dict[str, Any]], + command_offset: int, + ) -> list[dict[str, Any]]: + if len(operations) != 1: + raise ValueError("one command may start or stop only one dynamic seat mode") + operation = operations[0] + self._require_supported(operation) + stopping = operation["capability"] == "seat.stop_dynamic_mode" + mode_id = 0 if stopping else int(operation["parameters"]["mode_id"]) + if not stopping and mode_id not in {1, 2}: + raise ValueError("T2G dynamic mode_id must be 1 or 2") + return [ + { + "id": f"t2g_dynamic_{operation['id']}", + "operation_ref": operation["id"], + "bus": "seat_can", + "message": "T2G_Seat_Move_Command_300", + "signals": { + "Direction": 0, + "Motor_Selector": 0, + "Opcode": int( + self.protocol[ + "stop_dynamic_mode_opcode" + if stopping + else "start_dynamic_mode_opcode" + ] + ), + "Param_A": mode_id, + "Param_B": 0, + "Protocol_Version": int(self.protocol["version"]), + "Sequence": 0, + }, + "send_offset_ms": ( + command_offset * int(self.protocol["inter_axis_settle_ms"]) + ), + "completion": { + "message": "T2G_Seat_Dynamic_Mode_Status_306", + "signal": "Dynamic_State" if stopping else "Dynamic_Mode_ID", + "operator": "eq", + "value": 0 if stopping else mode_id, + "state_signal": "Dynamic_State", + "accepted_states": [0] if stopping else [1, 2], + "timeout_ms": max(int(operation.get("timeout_ms", 0)), 5000), + }, + } + ] + def _compile_timed_motion( self, operation: dict[str, Any], diff --git a/domains/seat/src/seat_domain/hardware_executor.py b/domains/seat/src/seat_domain/hardware_executor.py index 51b8b99..2ecde57 100755 --- a/domains/seat/src/seat_domain/hardware_executor.py +++ b/domains/seat/src/seat_domain/hardware_executor.py @@ -156,7 +156,11 @@ class HardwareSeatExecutor: } results: list[dict[str, Any]] = [] commands = command_plan["spec"]["commands"] - has_motion = any(item["message"] == "T2G_Seat_Move_Command_300" for item in commands) + has_motion = any( + item["message"] == "T2G_Seat_Move_Command_300" + and int(item.get("signals", {}).get("Opcode", 0)) not in {0x09, 0x0F} + for item in commands + ) bus: CanBus | None = None motion_armed = False position_sync_required = False @@ -249,7 +253,12 @@ class HardwareSeatExecutor: elif command["message"] == "T2G_Seat_Thermal_Control_29E": results.extend(self._execute_thermal(bus, command, referenced)) elif command["message"] == "T2G_Seat_Move_Command_300": - results.extend(self._execute_motion(bus, command, referenced)) + if int(command["signals"]["Opcode"]) in {0x0E, 0x0F}: + results.extend( + self._execute_dynamic_mode(bus, command, referenced) + ) + else: + results.extend(self._execute_motion(bus, command, referenced)) else: raise HardwareExecutionError( f"hardware executor refuses unknown message {command['message']}" @@ -697,6 +706,94 @@ class HardwareSeatExecutor: ) return output + def _execute_dynamic_mode( + self, + bus: CanBus, + command: dict[str, Any], + operations: list[dict[str, Any]], + ) -> list[dict[str, Any]]: + if len(operations) != 1: + raise HardwareExecutionError( + "a T2G dynamic-mode frame must reference exactly one operation" + ) + operation = operations[0] + stopping = operation["capability"] == "seat.stop_dynamic_mode" + mode_id = 0 if stopping else int(operation["parameters"]["mode_id"]) + if not stopping and mode_id not in {1, 2}: + raise HardwareExecutionError("T2G dynamic mode_id must be 1 or 2") + + signals = dict(command["signals"]) + sequence = self._next_sequence() + signals["Sequence"] = sequence + command_frame = self._send_encoded(bus, command["message"], signals) + ack_values, ack_frame = self._wait_ack( + bus, sequence, 0x0F if stopping else 0x0E + ) + + completion = command["completion"] + + def matches(values: dict[str, int], _: CanFrame) -> bool: + if stopping: + return ( + values["Dynamic_Mode_ID"] == 0 + and values["Dynamic_State"] == 0 + ) + return ( + values["Dynamic_Mode_ID"] == mode_id + and values["Dynamic_State"] in set( + completion.get("accepted_states", [1, 2]) + ) + ) + + status_values, status_frame = self._receive_until( + bus, + 0x306, + int(completion["timeout_ms"]), + matches, + ) + mode_name = ( + "" + if stopping + else "木马模式" + if mode_id == 1 + else "动态摇篮模式" + ) + return [ + { + "ref": operation["id"], + "domain": "seat", + "status": "succeeded", + "message": ( + "physical 0x301/0x306 confirmed the dynamic seat mode is stopped" + if stopping + else ( + f"physical 0x301/0x306 confirmed {mode_name} is active; " + "firmware will repeat it until stopped or the ten-minute cap" + ) + ), + "telemetry": { + "dynamic_mode_id": mode_id, + "dynamic_mode_name": mode_name, + "dynamic_state": status_values["Dynamic_State"], + "dynamic_phase": status_values["Dynamic_Phase"], + "dynamic_cycle_index": status_values["Dynamic_Cycle_Index"], + "dynamic_phase_elapsed_ms": status_values[ + "Dynamic_Phase_Elapsed_Ms" + ], + "repeat": ( + "none" if stopping else "until_stopped_or_timeout" + ), + "max_runtime_ms": 600_000, + "command_frame": command_frame.public(), + "ack_frame": ack_frame.public(), + "ack_values": ack_values, + "feedback_frame": status_frame.public(), + "hardware_feedback": True, + "simulated": False, + }, + } + ] + def _execute_motion( self, bus: CanBus, diff --git a/domains/seat/src/seat_domain/validator.py b/domains/seat/src/seat_domain/validator.py index d1b05dd..65cdd55 100755 --- a/domains/seat/src/seat_domain/validator.py +++ b/domains/seat/src/seat_domain/validator.py @@ -82,6 +82,21 @@ def validate_semantics( "message": "当前所有座椅能力仅支持前排副驾。", } ) + if action.get("action_type") == "dynamic_mode_stop": + has_motion = True + continue + if action.get("action_type") == "dynamic_mode": + has_motion = True + if action.get("mode_id") not in {1, 2}: + issues.append( + { + "severity": "error", + "code": "UNSUPPORTED_DYNAMIC_MODE", + "path": f"{path}.mode_id", + "message": "动态座椅模式编号必须是 1 或 2。", + } + ) + continue if action.get("action_type") == "position": has_motion = True axis = action.get("axis") diff --git a/domains/seat/tests/integration/test_seat_service.py b/domains/seat/tests/integration/test_seat_service.py index 7b26b6e..760823d 100755 --- a/domains/seat/tests/integration/test_seat_service.py +++ b/domains/seat/tests/integration/test_seat_service.py @@ -32,6 +32,41 @@ class SeatServiceIntegrationTests(unittest.TestCase): for event in result["trace_events"]: self.assertEqual(self.service.contracts.validate(event), []) + def test_dynamic_mode_runs_until_explicit_natural_language_stop(self) -> None: + conversation_id = "conv-dynamic-stop" + started = self.service.process( + "\u5f00\u542f\u52a8\u6001\u6447\u7bee\u6a21\u5f0f", + provider="local", + conversation_id=conversation_id, + vehicle_id="denza_n7", + ) + stopped = self.service.process( + "\u5173\u95ed\u52a8\u6001\u6447\u7bee\u6a21\u5f0f", + provider="local", + conversation_id=conversation_id, + vehicle_id="denza_n7", + ) + + self.assertEqual(started["status"], "succeeded") + self.assertEqual( + started["actuator_state"]["passenger"]["dynamic_mode"], + { + "mode_id": 2, + "name": "\u52a8\u6001\u6447\u7bee\u6a21\u5f0f", + "state": "running", + "repeat": "until_stopped_or_timeout", + "max_runtime_ms": 600_000, + }, + ) + self.assertEqual(stopped["status"], "succeeded") + operation = stopped["function_config"]["spec"]["operations"][0] + self.assertEqual(operation["capability"], "seat.stop_dynamic_mode") + self.assertEqual(operation["parameters"], {}) + self.assertEqual( + stopped["actuator_state"]["passenger"]["dynamic_mode"]["state"], + "idle", + ) + def test_gear_request_is_preserved_and_simulated(self) -> None: result = self.service.process("副驾座椅加热开到三档", provider="local") diff --git a/domains/seat/tests/unit/test_t2g_hardware.py b/domains/seat/tests/unit/test_t2g_hardware.py index cc04139..d41454e 100755 --- a/domains/seat/tests/unit/test_t2g_hardware.py +++ b/domains/seat/tests/unit/test_t2g_hardware.py @@ -16,6 +16,7 @@ if str(SEAT_SOURCE) not in sys.path: from cognitive_agent.infrastructure.can.gateway import CanFrame, CanGatewayError # noqa: E402 from cognitive_agent.application.seat_service import SeatDemoService # noqa: E402 +from cognitive_agent.runtime.contracts import ContractValidator # noqa: E402 from cognitive_agent.infrastructure.can.hardware import ( # noqa: E402 HardwareSafetyError, SeatHardwareSettings, @@ -242,6 +243,34 @@ class ReactiveFakeBus: }, ) ) + if opcode == 14: + self.received.append( + self._frame( + "T2G_Seat_Dynamic_Mode_Status_306", + { + "Dynamic_Mode_ID": command["Param_A"], + "Dynamic_State": 2, + "Dynamic_Phase": 2 if command["Param_A"] == 1 else 5, + "Dynamic_Active_Mask": 0x0F, + "Dynamic_Cycle_Index": 0, + "Dynamic_Phase_Elapsed_Ms": 100, + }, + ) + ) + if opcode == 15: + self.received.append( + self._frame( + "T2G_Seat_Dynamic_Mode_Status_306", + { + "Dynamic_Mode_ID": 0, + "Dynamic_State": 0, + "Dynamic_Phase": 0, + "Dynamic_Active_Mask": 0, + "Dynamic_Cycle_Index": 0, + "Dynamic_Phase_Elapsed_Ms": 0, + }, + ) + ) if opcode == 0x0B and self.complete_motion: motor = command["Motor_Selector"] self.position_valid = True @@ -447,7 +476,7 @@ class ProtocolSignatureFakeBus: self.received: deque[CanFrame] = deque() self.closed = False if signature: - self.received.append(CanFrame(0x301, bytes.fromhex("10 00 00 00 00 00 F0 60"))) + self.received.append(CanFrame(0x301, bytes.fromhex("10 00 00 00 00 00 F0 D0"))) for motor in range(4): self.received.append( CanFrame(0x302, bytes([motor, 0, 0x08, 0, 0, 0, 0, 0])) @@ -464,6 +493,7 @@ class ProtocolSignatureFakeBus: CanFrame(0x304, bytes([motor, 3, 0, 0, 0, 0, 0xF4, 0x01])) ) self.received.append(CanFrame(0x305, bytes(8))) + self.received.append(CanFrame(0x306, bytes(8))) self.received.append(CanFrame(0x4FA, bytes.fromhex("09 00 00 00 00 00 00 00"))) def send(self, arbitration_id: int, data: bytes) -> CanFrame: @@ -485,6 +515,29 @@ class FailingProtocolSignatureBus(ProtocolSignatureFakeBus): raise RuntimeError("CAN receive failed during passive protocol probe") +class LegacyProtocolSignatureFakeBus(ProtocolSignatureFakeBus): + def __init__(self): + super().__init__(False) + self.received.append(CanFrame(0x301, bytes.fromhex("10 00 00 00 00 00 F0 00"))) + for motor in range(4): + self.received.append( + CanFrame(0x302, bytes([motor, 0, 0x08, 0, 0, 0, 0, 0])) + ) + for motor, maximum in enumerate((480, 374, 917, 647)): + self.received.append( + CanFrame( + 0x303, + bytes([motor, 0, 0, 0, maximum & 0xFF, maximum >> 8, 0, 0]), + ) + ) + for motor in range(4): + self.received.append( + CanFrame(0x304, bytes([motor, 3, 0, 0, 0, 0, 0xF4, 0x01])) + ) + self.received.append(CanFrame(0x305, bytes(8))) + self.received.append(CanFrame(0x4FA, bytes(8))) + + class FakeProgrammer: def __init__(self): self.calls = 0 @@ -511,6 +564,7 @@ class T2GHardwareTests(unittest.TestCase): ROOT / "domains" / "seat" / "can" / "signal-mapping.hardware.yaml", ROOT / "platforms" / "t2g_seat_bench" / "calibration" / "seat.yaml", ) + self.contracts = ContractValidator(ROOT) def test_compiler_emits_verified_heating_payload(self) -> None: config = function_config( @@ -569,6 +623,34 @@ class T2GHardwareTests(unittest.TestCase): self.assertEqual(fallback["signals"]["Param_B"], 900) self.assertEqual(fallback["completion"]["signal"], "Task_State") + def test_compiler_emits_native_dynamic_mode_command(self) -> None: + config = function_config( + operation("seat.start_dynamic_mode", {"mode_id": 1}) + ) + + plan = self.compiler.compile(config, {}) + command = plan["spec"]["commands"][0] + frame = self.matrix.encode(command["message"], command["signals"]) + + self.assertEqual(frame["frame_id"], "0x300") + self.assertEqual(frame["data_hex"], "0E 10 00 00 01 00 00 00") + self.assertEqual(command["completion"]["message"], "T2G_Seat_Dynamic_Mode_Status_306") + self.assertEqual(command["completion"]["accepted_states"], [1, 2]) + self.assertEqual(self.contracts.validate(plan), []) + + def test_compiler_emits_native_dynamic_mode_stop_command(self) -> None: + config = function_config(operation("seat.stop_dynamic_mode", {})) + + plan = self.compiler.compile(config, {}) + command = plan["spec"]["commands"][0] + frame = self.matrix.encode(command["message"], command["signals"]) + + self.assertEqual(frame["frame_id"], "0x300") + self.assertEqual(frame["data_hex"], "0F 10 00 00 00 00 00 00") + self.assertEqual(command["completion"]["signal"], "Dynamic_State") + self.assertEqual(command["completion"]["accepted_states"], [0]) + self.assertEqual(self.contracts.validate(plan), []) + def test_compiler_maps_large_relative_backrest_request_to_absolute_target(self) -> None: config = function_config( operation( @@ -696,6 +778,46 @@ class T2GHardwareTests(unittest.TestCase): self.assertEqual([item.data[0] for item in bus.sent], [9, 1]) self.assertTrue(bus.closed) + def test_executor_waits_for_native_dynamic_mode_feedback(self) -> None: + config = function_config( + operation("seat.start_dynamic_mode", {"mode_id": 2}) + ) + plan = self.compiler.compile(config, {}) + bus = ReactiveFakeBus(self.matrix) + + report = HardwareSeatExecutor( + self.matrix, lambda: bus, ack_timeout_ms=20 + ).execute(plan, config) + + self.assertEqual(report["spec"]["status"], "succeeded") + telemetry = report["spec"]["results"][0]["telemetry"] + self.assertEqual(telemetry["dynamic_mode_id"], 2) + self.assertEqual(telemetry["dynamic_state"], 2) + self.assertEqual(telemetry["dynamic_phase"], 5) + self.assertEqual([item.data[0] for item in bus.sent], [9, 14]) + self.assertTrue(bus.closed) + + def test_executor_stops_dynamic_mode_without_homing_or_pre_stop(self) -> None: + config = function_config(operation("seat.stop_dynamic_mode", {})) + plan = self.compiler.compile(config, {}) + bus = ReactiveFakeBus(self.matrix) + + report = HardwareSeatExecutor( + self.matrix, + lambda: bus, + ack_timeout_ms=20, + synchronize_position_before_first_motion=True, + position_sync_state={"synchronized": False}, + ).execute(plan, config) + + self.assertEqual(report["spec"]["status"], "succeeded") + telemetry = report["spec"]["results"][0]["telemetry"] + self.assertEqual(telemetry["dynamic_mode_id"], 0) + self.assertEqual(telemetry["dynamic_state"], 0) + self.assertEqual(telemetry["repeat"], "none") + self.assertEqual([item.data[0] for item in bus.sent], [15]) + self.assertTrue(bus.closed) + def test_firmware_replacement_forces_four_axis_position_memory_sync(self) -> None: config = function_config( operation("seat.set_backrest_recline", {"position_pct": 50}) @@ -1453,6 +1575,9 @@ class T2GHardwareTests(unittest.TestCase): settings.validate_function_config( function_config(operation("seat.set_cushion_tilt", {"position_pct": 40})) ) + settings.validate_function_config( + function_config(operation("seat.stop_dynamic_mode", {})) + ) with self.assertRaises(HardwareSafetyError): settings.validate_function_config( function_config( @@ -1559,7 +1684,7 @@ class T2GHardwareTests(unittest.TestCase): self.assertIs(prepared, bus) self.assertFalse(telemetry["programmed_this_request"]) - self.assertEqual(telemetry["firmware_revision"], 6) + self.assertEqual(telemetry["firmware_revision"], 13) self.assertEqual(bus.sent, []) self.assertEqual(telemetry["max_hall_counts"], [480, 374, 917, 647]) self.assertFalse(bus.closed) @@ -1617,6 +1742,24 @@ class T2GHardwareTests(unittest.TestCase): guard.prepare_bus() self.assertTrue(bus.closed) + def test_firmware_guard_reports_legacy_revision_and_missing_dynamic_status(self) -> None: + bus = LegacyProtocolSignatureFakeBus() + guard = T2GFirmwareGuard( + lambda: bus, + None, + auto_flash=False, + probe_timeout_ms=20, + ) + + with self.assertRaises(FirmwareProgrammingError) as raised: + guard.prepare_bus() + + message = str(raised.exception) + self.assertIn("firmware_revision=0 (expected 13)", message) + self.assertIn("missing_frame_ids=0x306", message) + self.assertIn("max_hall_counts=480,374,917,647", message) + self.assertTrue(bus.closed) + def test_programmer_command_downloads_and_hands_off_to_running_target(self) -> None: firmware_root = ROOT / "firmware" / "t2g" / "Seat_Controller_demo" output_image = ( diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_dynamic_mode.c b/firmware/t2g/Seat_Controller_demo/App/seat_dynamic_mode.c new file mode 100644 index 0000000..771957f --- /dev/null +++ b/firmware/t2g/Seat_Controller_demo/App/seat_dynamic_mode.c @@ -0,0 +1,679 @@ +#include "seat_dynamic_mode.h" + +#include +#include + +#include "motor_control.h" +#include "seat_dynamic_mode_config.h" +#include "seat_motor_manager.h" +#include "seat_move_config.h" + +#define SEAT_DYNAMIC_TARGET_TOLERANCE_PULSES (3u) +#define SEAT_DYNAMIC_ENTRY_TIMEOUT_MS (30000u) +#define SEAT_DYNAMIC_ENTRY_DUTY_PERCENT (90u) +#define SEAT_DYNAMIC_CRADLE_PHASE_TIMEOUT_MS (30000u) +#define SEAT_DYNAMIC_CRADLE_RENDEZVOUS_PULSES (12u) +#define SEAT_DYNAMIC_CRADLE_FINAL_DUTY_PERCENT (50u) + +typedef enum +{ + SEAT_DYNAMIC_CONTROL_TIMED_ARRIVAL = 0u, + SEAT_DYNAMIC_CONTROL_HOLD, + SEAT_DYNAMIC_CONTROL_TARGET_RENDEZVOUS +} seat_dynamic_control_t; + +typedef struct +{ + uint8_t phase; + uint32_t durationMs; + uint32_t timeoutMs; + uint16_t targetHall[SEAT_MOVE_MOTOR_COUNT]; + seat_dynamic_control_t control; +} seat_dynamic_phase_definition_t; + +typedef struct +{ + uint8_t modeId; + const uint16_t *entryTargetHall; + const seat_dynamic_phase_definition_t *phases; + uint8_t phaseCount; + const uint8_t *cruiseDutyPercent; + uint16_t rendezvousPulses; + uint8_t finalDutyPercent; +} seat_dynamic_mode_definition_t; + +typedef struct +{ + uint8_t modeId; + uint8_t state; + uint8_t phase; + uint8_t phaseIndex; + uint8_t faultMask; + uint16_t cycleIndex; + uint16_t internalSequence; + uint32_t modeStartedMs; + uint32_t phaseStartedMs; + uint32_t phaseDurationMs; + uint8_t rendezvousStage; + uint16_t targetHall[SEAT_MOVE_MOTOR_COUNT]; + uint16_t stagingTargetHall[SEAT_MOVE_MOTOR_COUNT]; + uint16_t finalTargetHall[SEAT_MOVE_MOTOR_COUNT]; +} seat_dynamic_context_t; + +static const motor_mode_t s_dynamicLogicalToPhysical[SEAT_MOVE_MOTOR_COUNT] = +{ + (motor_mode_t)SEAT_MOVE_LOGICAL_M0_PHYSICAL_MODE, + (motor_mode_t)SEAT_MOVE_LOGICAL_M1_PHYSICAL_MODE, + (motor_mode_t)SEAT_MOVE_LOGICAL_M2_PHYSICAL_MODE, + (motor_mode_t)SEAT_MOVE_LOGICAL_M3_PHYSICAL_MODE +}; + +/* A cradle must feel like one coordinated body movement. All four axes move + * toward their staging poses in the same scheduler pass; no axis is held back + * for a late catch-up. M0/M1/M3 use the proven breakaway duty while M2 runs + * at loaded duty. After every axis reaches a point exactly 12 Hall pulses + * before the requested pose, they execute an equal-distance 50% final + * approach. This keeps both the visible start and final arrival coordinated + * while making completion independent of an arbitrary 30-second timer. */ +static const uint8_t s_cradleCruiseDuty[SEAT_MOVE_MOTOR_COUNT] = +{ + 50u, 50u, 90u, 50u +}; + +static const uint8_t s_horseCruiseDuty[SEAT_MOVE_MOTOR_COUNT] = +{ + SEAT_DYNAMIC_HORSE_M0_DUTY_PERCENT, + SEAT_DYNAMIC_HORSE_M1_DUTY_PERCENT, + SEAT_DYNAMIC_HORSE_M2_DUTY_PERCENT, + SEAT_DYNAMIC_HORSE_M3_DUTY_PERCENT +}; + +/* Targets are the N7 Hall coordinates supplied for the connected seat bench. + * They are intentionally stored as pulses rather than rounded percentages. */ +static const uint16_t s_rockingHorseEntry[SEAT_MOVE_MOTOR_COUNT] = +{ + SEAT_DYNAMIC_HORSE_ENTRY_M0_HALL, + SEAT_DYNAMIC_HORSE_ENTRY_M1_HALL, + SEAT_DYNAMIC_HORSE_ENTRY_M2_HALL, + SEAT_DYNAMIC_HORSE_ENTRY_M3_HALL +}; +static const seat_dynamic_phase_definition_t s_rockingHorsePhases[] = +{ + { + SEAT_DYNAMIC_PHASE_HORSE_FORWARD, + 0u, + SEAT_DYNAMIC_HORSE_PHASE_TIMEOUT_MS, + { + SEAT_DYNAMIC_HORSE_FORWARD_M0_HALL, + SEAT_DYNAMIC_HORSE_FORWARD_M1_HALL, + SEAT_DYNAMIC_HORSE_FORWARD_M2_HALL, + SEAT_DYNAMIC_HORSE_FORWARD_M3_HALL + }, + SEAT_DYNAMIC_CONTROL_TARGET_RENDEZVOUS + }, + { + SEAT_DYNAMIC_PHASE_HORSE_BACKWARD, + 0u, + SEAT_DYNAMIC_HORSE_PHASE_TIMEOUT_MS, + { + SEAT_DYNAMIC_HORSE_BACKWARD_M0_HALL, + SEAT_DYNAMIC_HORSE_BACKWARD_M1_HALL, + SEAT_DYNAMIC_HORSE_BACKWARD_M2_HALL, + SEAT_DYNAMIC_HORSE_BACKWARD_M3_HALL + }, + SEAT_DYNAMIC_CONTROL_TARGET_RENDEZVOUS + } +}; + +static const uint16_t s_cradleEntry[SEAT_MOVE_MOTOR_COUNT] = +{ + 391u, 140u, 405u, 404u +}; +static const seat_dynamic_phase_definition_t s_cradlePhases[] = +{ + { + SEAT_DYNAMIC_PHASE_CRADLE_FORWARD, + 0u, + SEAT_DYNAMIC_CRADLE_PHASE_TIMEOUT_MS, + { 246u, 281u, 701u, 494u }, + SEAT_DYNAMIC_CONTROL_TARGET_RENDEZVOUS + }, + { + SEAT_DYNAMIC_PHASE_CRADLE_RETURN, + 0u, + SEAT_DYNAMIC_CRADLE_PHASE_TIMEOUT_MS, + { 391u, 140u, 405u, 404u }, + SEAT_DYNAMIC_CONTROL_TARGET_RENDEZVOUS + } +}; + +static const seat_dynamic_mode_definition_t s_dynamicModes[] = +{ + { + SEAT_DYNAMIC_MODE_ROCKING_HORSE, + s_rockingHorseEntry, + s_rockingHorsePhases, + (uint8_t)(sizeof(s_rockingHorsePhases) / + sizeof(s_rockingHorsePhases[0])), + s_horseCruiseDuty, + SEAT_DYNAMIC_HORSE_RENDEZVOUS_PULSES, + SEAT_DYNAMIC_HORSE_FINAL_DUTY_PERCENT + }, + { + SEAT_DYNAMIC_MODE_CRADLE, + s_cradleEntry, + s_cradlePhases, + (uint8_t)(sizeof(s_cradlePhases) / sizeof(s_cradlePhases[0])), + s_cradleCruiseDuty, + SEAT_DYNAMIC_CRADLE_RENDEZVOUS_PULSES, + SEAT_DYNAMIC_CRADLE_FINAL_DUTY_PERCENT + } +}; + +static seat_dynamic_context_t s_dynamic; + +static bool SeatDynamic_TimeReached(uint32_t now, uint32_t deadline); +static uint32_t SeatDynamic_ElapsedMs(uint32_t now, uint32_t started); +static const seat_dynamic_mode_definition_t *SeatDynamic_Definition( + uint8_t modeId); +static uint8_t SeatDynamic_ActiveMask(void); +static bool SeatDynamic_StatusFailed(const seat_motor_status_t *status); +static bool SeatDynamic_TargetsReached(bool *failed); +static bool SeatDynamic_TargetsWithinTolerance(void); +static bool SeatDynamic_StartEntry( + const seat_dynamic_mode_definition_t *definition, + uint32_t now); +static bool SeatDynamic_StartPhase( + const seat_dynamic_mode_definition_t *definition, + uint8_t phaseIndex, + uint32_t now); +static bool SeatDynamic_StartRendezvousFinal( + const seat_dynamic_mode_definition_t *definition); +static void SeatDynamic_Fail(void); +static void SeatDynamic_Advance( + const seat_dynamic_mode_definition_t *definition, + uint32_t now); + +void SeatDynamicMode_Init(void) +{ + (void)memset(&s_dynamic, 0, sizeof(s_dynamic)); + s_dynamic.state = SEAT_DYNAMIC_STATE_IDLE; +} + +bool SeatDynamicMode_Start(uint8_t modeId, uint16_t commandSequence) +{ + const seat_dynamic_mode_definition_t *definition = + SeatDynamic_Definition(modeId); + uint8_t motor; + + if((definition == NULL) || SeatDynamicMode_IsActive() || + SeatMotorManager_IsAnyActive()) + { + return false; + } + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + seat_motor_status_t status; + + if(!SeatMotorManager_GetStatus(s_dynamicLogicalToPhysical[motor], + &status) || + !status.positionValid || + (definition->entryTargetHall[motor] > status.maxHallCount)) + { + return false; + } + } + + (void)memset(&s_dynamic, 0, sizeof(s_dynamic)); + s_dynamic.modeId = modeId; + s_dynamic.state = SEAT_DYNAMIC_STATE_ENTRY; + s_dynamic.phase = SEAT_DYNAMIC_PHASE_ENTRY; + s_dynamic.internalSequence = commandSequence; + s_dynamic.modeStartedMs = Motor_GetTimeMs(); + if(!SeatDynamic_StartEntry(definition, s_dynamic.modeStartedMs)) + { + SeatDynamic_Fail(); + return false; + } + return true; +} + +void SeatDynamicMode_Service(void) +{ + const seat_dynamic_mode_definition_t *definition; + uint32_t now; + uint32_t elapsed; + bool failed = false; + bool reached; + const seat_dynamic_phase_definition_t *phase; + + if(!SeatDynamicMode_IsActive()) + { + return; + } + definition = SeatDynamic_Definition(s_dynamic.modeId); + if(definition == NULL) + { + SeatDynamic_Fail(); + return; + } + + now = Motor_GetTimeMs(); + if(SeatDynamic_TimeReached( + now, s_dynamic.modeStartedMs + SEAT_MOVE_DYNAMIC_MAX_RUNTIME_MS)) + { + /* The ten-minute safety cap is owned by the ECU, not by a frontend + * lease or a host-side timer. Reuse the normal stop path so every + * bridge is de-energized and 0x306 returns to all-zero IDLE. */ + SeatDynamicMode_Stop((uint16_t)(s_dynamic.internalSequence + 1u)); + return; + } + reached = SeatDynamic_TargetsReached(&failed); + if(failed) + { + SeatDynamic_Fail(); + return; + } + + if(s_dynamic.state == SEAT_DYNAMIC_STATE_ENTRY) + { + if(reached) + { + if(!SeatDynamic_StartPhase(definition, 0u, now)) + { + SeatDynamic_Fail(); + } + return; + } + if(SeatDynamic_TimeReached( + now, s_dynamic.phaseStartedMs + SEAT_DYNAMIC_ENTRY_TIMEOUT_MS)) + { + SeatDynamic_Fail(); + } + return; + } + + phase = &definition->phases[s_dynamic.phaseIndex]; + elapsed = SeatDynamic_ElapsedMs(now, s_dynamic.phaseStartedMs); + if(phase->control == SEAT_DYNAMIC_CONTROL_TARGET_RENDEZVOUS) + { + if(reached) + { + if(s_dynamic.rendezvousStage == 0u) + { + if(!SeatDynamic_StartRendezvousFinal(definition)) + { + SeatDynamic_Fail(); + } + } + else + { + SeatDynamic_Advance(definition, now); + } + return; + } + if(elapsed > phase->timeoutMs) + { + SeatDynamic_Fail(); + } + return; + } + if(elapsed < s_dynamic.phaseDurationMs) + { + return; + } + if(reached) + { + SeatDynamic_Advance(definition, now); + return; + } + if(SeatDynamic_TargetsWithinTolerance()) + { + /* At the exact phase boundary an adaptive task may still be active + * while every Hall position is already inside the accepted discrete + * target band. Stop all bridges before entering the hold or opposite + * direction phase; waiting for mathematical equality creates a false + * timeout and can extend the requested phase. */ + SeatMotorManager_StopAll(s_dynamic.internalSequence); + SeatDynamic_Advance(definition, now); + return; + } + if(elapsed > (s_dynamic.phaseDurationMs + + SEAT_MOVE_DYNAMIC_ARRIVAL_GRACE_MS)) + { + SeatDynamic_Fail(); + } +} + +void SeatDynamicMode_Stop(uint16_t commandSequence) +{ + if(SeatDynamicMode_IsActive()) + { + Motor_RequestAbortAllFromIsr(commandSequence); + Motor_ServiceAll(); + SeatMotorManager_StopAll(commandSequence); + } + (void)memset(&s_dynamic, 0, sizeof(s_dynamic)); + s_dynamic.state = SEAT_DYNAMIC_STATE_IDLE; +} + +bool SeatDynamicMode_IsActive(void) +{ + return (s_dynamic.state == SEAT_DYNAMIC_STATE_ENTRY) || + (s_dynamic.state == SEAT_DYNAMIC_STATE_RUNNING); +} + +bool SeatDynamicMode_GetStatus(seat_dynamic_mode_status_t *status) +{ + uint32_t elapsed; + + if(status == NULL) + { + return false; + } + elapsed = SeatDynamicMode_IsActive() ? + SeatDynamic_ElapsedMs(Motor_GetTimeMs(), + s_dynamic.phaseStartedMs) : 0u; + status->modeId = s_dynamic.modeId; + status->state = s_dynamic.state; + status->phase = s_dynamic.phase; + status->activeMask = (uint8_t) + (SeatDynamic_ActiveMask() | (uint8_t)(s_dynamic.faultMask << 4u)); + status->cycleIndex = s_dynamic.cycleIndex; + status->phaseElapsedMs = (elapsed > UINT16_MAX) ? + UINT16_MAX : (uint16_t)elapsed; + return true; +} + +static bool SeatDynamic_TimeReached(uint32_t now, uint32_t deadline) +{ + return ((int32_t)(now - deadline) >= 0); +} + +static uint32_t SeatDynamic_ElapsedMs(uint32_t now, uint32_t started) +{ + return now - started; +} + +static const seat_dynamic_mode_definition_t *SeatDynamic_Definition( + uint8_t modeId) +{ + uint8_t index; + + for(index = 0u; + index < (uint8_t)(sizeof(s_dynamicModes) / sizeof(s_dynamicModes[0])); + index++) + { + if(s_dynamicModes[index].modeId == modeId) + { + return &s_dynamicModes[index]; + } + } + return NULL; +} + +static uint8_t SeatDynamic_ActiveMask(void) +{ + uint8_t motor; + uint8_t mask = 0u; + + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + seat_motor_status_t status; + + if(SeatMotorManager_GetStatus(s_dynamicLogicalToPhysical[motor], + &status) && status.active) + { + mask |= (uint8_t)(1u << motor); + } + } + return mask; +} + +static bool SeatDynamic_StatusFailed(const seat_motor_status_t *status) +{ + return (status->taskState == SEAT_MOTOR_TASK_FAILED) || + (status->result == SEAT_MOTOR_RESULT_STALL) || + (status->result == SEAT_MOTOR_RESULT_TIMEOUT) || + (status->result == SEAT_MOTOR_RESULT_DRIVER_FAULT) || + (status->result == SEAT_MOTOR_RESULT_INVALID) || + (status->result == SEAT_MOTOR_RESULT_CALIBRATION_FAILED); +} + +static bool SeatDynamic_TargetsReached(bool *failed) +{ + uint8_t motor; + bool reached = true; + + if(failed == NULL) + { + return false; + } + *failed = false; + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + seat_motor_status_t status; + uint32_t target = s_dynamic.targetHall[motor]; + uint32_t delta; + + if(!SeatMotorManager_GetStatus(s_dynamicLogicalToPhysical[motor], + &status)) + { + s_dynamic.faultMask |= (uint8_t)(1u << motor); + *failed = true; + return false; + } + if(SeatDynamic_StatusFailed(&status)) + { + s_dynamic.faultMask |= (uint8_t)(1u << motor); + *failed = true; + return false; + } + delta = (status.hallCount >= target) ? + (status.hallCount - target) : (target - status.hallCount); + if(status.active || + (delta > SEAT_DYNAMIC_TARGET_TOLERANCE_PULSES)) + { + reached = false; + } + } + return reached; +} + +static bool SeatDynamic_TargetsWithinTolerance(void) +{ + uint8_t motor; + + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + seat_motor_status_t status; + uint32_t target = s_dynamic.targetHall[motor]; + uint32_t delta; + + if(!SeatMotorManager_GetStatus(s_dynamicLogicalToPhysical[motor], + &status) || + SeatDynamic_StatusFailed(&status)) + { + return false; + } + delta = (status.hallCount >= target) ? + (status.hallCount - target) : (target - status.hallCount); + if(delta > SEAT_DYNAMIC_TARGET_TOLERANCE_PULSES) + { + return false; + } + } + return true; +} + +static bool SeatDynamic_StartEntry( + const seat_dynamic_mode_definition_t *definition, + uint32_t now) +{ + uint8_t motor; + + s_dynamic.internalSequence++; + s_dynamic.phaseStartedMs = now; + s_dynamic.phaseDurationMs = SEAT_DYNAMIC_ENTRY_TIMEOUT_MS; + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + s_dynamic.targetHall[motor] = definition->entryTargetHall[motor]; + if(!SeatMotor_MoveAbsoluteHallDuty( + s_dynamicLogicalToPhysical[motor], + definition->entryTargetHall[motor], + SEAT_DYNAMIC_ENTRY_DUTY_PERCENT, + s_dynamic.internalSequence)) + { + return false; + } + } + return true; +} + +static bool SeatDynamic_StartPhase( + const seat_dynamic_mode_definition_t *definition, + uint8_t phaseIndex, + uint32_t now) +{ + const seat_dynamic_phase_definition_t *phase; + uint8_t motor; + + if((definition == NULL) || (phaseIndex >= definition->phaseCount)) + { + return false; + } + phase = &definition->phases[phaseIndex]; + s_dynamic.state = SEAT_DYNAMIC_STATE_RUNNING; + s_dynamic.phaseIndex = phaseIndex; + s_dynamic.phase = phase->phase; + s_dynamic.phaseStartedMs = now; + s_dynamic.phaseDurationMs = phase->durationMs; + s_dynamic.rendezvousStage = 0u; + s_dynamic.internalSequence++; + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + s_dynamic.targetHall[motor] = phase->targetHall[motor]; + s_dynamic.finalTargetHall[motor] = phase->targetHall[motor]; + } + if(phase->control == SEAT_DYNAMIC_CONTROL_HOLD) + { + return true; + } + if(phase->control == SEAT_DYNAMIC_CONTROL_TARGET_RENDEZVOUS) + { + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + seat_motor_status_t status; + uint16_t target = phase->targetHall[motor]; + uint16_t current; + + if(!SeatMotorManager_GetStatus(s_dynamicLogicalToPhysical[motor], + &status)) + { + return false; + } + current = (uint16_t)status.hallCount; + if(target > current + definition->rendezvousPulses) + { + s_dynamic.stagingTargetHall[motor] = (uint16_t) + (target - definition->rendezvousPulses); + } + else if(current > target + + definition->rendezvousPulses) + { + s_dynamic.stagingTargetHall[motor] = (uint16_t) + (target + definition->rendezvousPulses); + } + else + { + s_dynamic.stagingTargetHall[motor] = target; + } + s_dynamic.targetHall[motor] = + s_dynamic.stagingTargetHall[motor]; + } + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + if(!SeatMotor_MoveAbsoluteHallDuty( + s_dynamicLogicalToPhysical[motor], + s_dynamic.targetHall[motor], + definition->cruiseDutyPercent[motor], + s_dynamic.internalSequence)) + { + return false; + } + } + return true; + } + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + if(!SeatMotor_MoveAbsoluteHallInTimeWithGrace( + s_dynamicLogicalToPhysical[motor], + phase->targetHall[motor], + phase->durationMs, + SEAT_MOVE_DYNAMIC_ARRIVAL_GRACE_MS, + s_dynamic.internalSequence)) + { + return false; + } + } + return true; +} + +static bool SeatDynamic_StartRendezvousFinal( + const seat_dynamic_mode_definition_t *definition) +{ + uint8_t motor; + + if(definition == NULL) + { + return false; + } + + s_dynamic.internalSequence++; + s_dynamic.rendezvousStage = 2u; + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + s_dynamic.targetHall[motor] = s_dynamic.finalTargetHall[motor]; + } + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) + { + if(!SeatMotor_MoveAbsoluteHallDuty( + s_dynamicLogicalToPhysical[motor], + s_dynamic.finalTargetHall[motor], + definition->finalDutyPercent, + s_dynamic.internalSequence)) + { + return false; + } + } + return true; +} + +static void SeatDynamic_Fail(void) +{ + uint16_t sequence = (uint16_t)(s_dynamic.internalSequence + 1u); + + Motor_RequestAbortAllFromIsr(sequence); + Motor_ServiceAll(); + SeatMotorManager_StopAll(sequence); + s_dynamic.internalSequence = sequence; + s_dynamic.state = SEAT_DYNAMIC_STATE_FAULT; + s_dynamic.phaseStartedMs = Motor_GetTimeMs(); +} + +static void SeatDynamic_Advance( + const seat_dynamic_mode_definition_t *definition, + uint32_t now) +{ + uint8_t nextPhase = (uint8_t)(s_dynamic.phaseIndex + 1u); + + if(nextPhase >= definition->phaseCount) + { + nextPhase = 0u; + s_dynamic.cycleIndex++; + } + if(!SeatDynamic_StartPhase(definition, nextPhase, now)) + { + SeatDynamic_Fail(); + } +} diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_dynamic_mode.h b/firmware/t2g/Seat_Controller_demo/App/seat_dynamic_mode.h new file mode 100644 index 0000000..b8d52b7 --- /dev/null +++ b/firmware/t2g/Seat_Controller_demo/App/seat_dynamic_mode.h @@ -0,0 +1,49 @@ +#ifndef SEAT_DYNAMIC_MODE_H +#define SEAT_DYNAMIC_MODE_H + +#include +#include + +typedef enum +{ + SEAT_DYNAMIC_MODE_NONE = 0u, + SEAT_DYNAMIC_MODE_ROCKING_HORSE = 1u, + SEAT_DYNAMIC_MODE_CRADLE = 2u +} seat_dynamic_mode_id_t; + +typedef enum +{ + SEAT_DYNAMIC_STATE_IDLE = 0u, + SEAT_DYNAMIC_STATE_ENTRY = 1u, + SEAT_DYNAMIC_STATE_RUNNING = 2u, + SEAT_DYNAMIC_STATE_FAULT = 3u +} seat_dynamic_state_t; + +typedef enum +{ + SEAT_DYNAMIC_PHASE_NONE = 0u, + SEAT_DYNAMIC_PHASE_ENTRY = 1u, + SEAT_DYNAMIC_PHASE_HORSE_FORWARD = 2u, + SEAT_DYNAMIC_PHASE_HORSE_BACKWARD = 3u, + SEAT_DYNAMIC_PHASE_CRADLE_FORWARD = 5u, + SEAT_DYNAMIC_PHASE_CRADLE_RETURN = 6u +} seat_dynamic_phase_t; + +typedef struct +{ + uint8_t modeId; + uint8_t state; + uint8_t phase; + uint8_t activeMask; + uint16_t cycleIndex; + uint16_t phaseElapsedMs; +} seat_dynamic_mode_status_t; + +void SeatDynamicMode_Init(void); +bool SeatDynamicMode_Start(uint8_t modeId, uint16_t commandSequence); +void SeatDynamicMode_Service(void); +void SeatDynamicMode_Stop(uint16_t commandSequence); +bool SeatDynamicMode_IsActive(void); +bool SeatDynamicMode_GetStatus(seat_dynamic_mode_status_t *status); + +#endif /* SEAT_DYNAMIC_MODE_H */ diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c b/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c index 50389a8..6cf943e 100755 --- a/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c +++ b/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c @@ -10,6 +10,13 @@ #define SEAT_MOTOR_SPEED_CAL_MEASURE_MS (1000ul) #define SEAT_MOTOR_SPEED_CAL_DUTY_PERCENT (95u) #define SEAT_MOTOR_DEFAULT_CAL_LEG_TIMEOUT_MS (70000ul) +#define SEAT_MOTOR_TIMED_ARRIVAL_SETTLE_MS (500ul) +#define SEAT_MOTOR_TIMED_M0_NEAR_EXTENSION_MS (900ul) +#define SEAT_MOTOR_TIMED_M0_FAR_EXTENSION_MS (1000ul) +#define SEAT_MOTOR_TIMED_M1_NEAR_EXTENSION_MS (1200ul) +#define SEAT_MOTOR_TIMED_M1_FAR_EXTENSION_MS (700ul) +#define SEAT_MOTOR_TIMED_M3_NEAR_EXTENSION_MS (1900ul) +#define SEAT_MOTOR_TIMED_M3_FAR_EXTENSION_MS (1600ul) typedef char seat_motor_manager_requires_four_motors[ (MOTOR_MODE_COUNT == 4) ? 1 : -1]; @@ -22,6 +29,8 @@ typedef struct uint32_t commandSequence; uint32_t targetValueX100; uint32_t durationMs; + uint32_t speedPlanDurationMs; + uint32_t deadlineGraceMs; uint32_t deadlineMs; uint32_t retryAtMs; uint32_t speedValuePerSecondX100; @@ -95,6 +104,36 @@ static uint32_t SeatMotor_AbsDelta(uint32_t lhs, uint32_t rhs) return (lhs >= rhs) ? (lhs - rhs) : (rhs - lhs); } +static uint32_t SeatMotor_TimedPlanExtensionMs( + motor_mode_t mode, + motor_direction_t direction) +{ + /* The four loaded mechanisms do not have identical low-speed breakaway + * and coast behavior. Bench traces show repeatable early arrival against + * M2 when every axis follows the same ideal time-position line. Extend + * only the speed plan (never the phase deadline) by the measured lead so + * all four axes converge at the requested phase boundary. */ + if(mode == MOTOR_MODE_0_LINEAR) + { + return (direction == MOTOR_DIRECTION_TOWARD_NEAR) ? + SEAT_MOTOR_TIMED_M0_NEAR_EXTENSION_MS : + SEAT_MOTOR_TIMED_M0_FAR_EXTENSION_MS; + } + if(mode == MOTOR_MODE_1_ANGLE) + { + return (direction == MOTOR_DIRECTION_TOWARD_NEAR) ? + SEAT_MOTOR_TIMED_M1_NEAR_EXTENSION_MS : + SEAT_MOTOR_TIMED_M1_FAR_EXTENSION_MS; + } + if(mode == MOTOR_MODE_3_LINEAR_TRACK) + { + return (direction == MOTOR_DIRECTION_TOWARD_NEAR) ? + SEAT_MOTOR_TIMED_M3_NEAR_EXTENSION_MS : + SEAT_MOTOR_TIMED_M3_FAR_EXTENSION_MS; + } + return 0ul; +} + static bool SeatMotor_TargetWithinHallTolerance( const seat_motor_task_t *task, const motor_position_info_t *info) @@ -192,9 +231,10 @@ static bool SeatMotor_PrepareNewTask(motor_mode_t mode, static bool SeatMotor_StartPositionTask(motor_mode_t mode, uint32_t targetValueX100, uint8_t dutyPercent, - uint32_t speedValuePerSecondX100, - uint32_t durationLimitMs, - uint32_t commandSequence, + uint32_t speedValuePerSecondX100, + uint32_t durationLimitMs, + uint32_t speedPlanDurationMs, + uint32_t commandSequence, bool dynamicSpeed, bool preserveRetry, seat_motor_task_state_t runningState) @@ -203,7 +243,7 @@ static bool SeatMotor_StartPositionTask(motor_mode_t mode, seat_motor_task_t *task; motor_position_info_t info; uint32_t travelValueX100; - uint32_t planDurationMs; + uint32_t planDurationMs = 0ul; uint8_t retryCount; if((false == SeatMotor_ModeValid(mode)) || @@ -257,7 +297,8 @@ static bool SeatMotor_StartPositionTask(motor_mode_t mode, if(false != dynamicSpeed) { - planDurationMs = (durationLimitMs != 0ul) ? durationLimitMs : + planDurationMs = (speedPlanDurationMs != 0ul) ? + speedPlanDurationMs : (durationLimitMs != 0ul) ? durationLimitMs : (uint32_t)((((uint64_t)travelValueX100 * 1000ull) + speedValuePerSecondX100 - 1ull) / speedValuePerSecondX100); @@ -282,6 +323,7 @@ static bool SeatMotor_StartPositionTask(motor_mode_t mode, SEAT_MOTOR_TASK_WAIT_START : runningState; task->targetValueX100 = targetValueX100; task->durationMs = durationLimitMs; + task->speedPlanDurationMs = planDurationMs; task->deadlineMs = 0ul; task->speedValuePerSecondX100 = speedValuePerSecondX100; task->dutyPercent = dutyPercent; @@ -490,7 +532,8 @@ void SeatMotorManager_Service(void) } else if(0ul != task->durationMs) { - task->deadlineMs = now + task->durationMs; + task->deadlineMs = now + task->durationMs + + task->deadlineGraceMs; } else { @@ -517,6 +560,7 @@ void SeatMotorManager_Service(void) task->dutyPercent, task->speedValuePerSecondX100, task->durationMs, + task->speedPlanDurationMs, task->commandSequence, task->dynamicSpeed, true, @@ -643,6 +687,7 @@ bool SeatMotor_MoveAbsoluteDuty(motor_mode_t mode, dutyPercent, 0ul, 0ul, + 0ul, commandSequence, false, false, @@ -696,6 +741,7 @@ bool SeatMotor_MoveAbsoluteNormalized(motor_mode_t mode, dutyPercent, 0ul, timeoutMs, + 0ul, commandSequence, false, false, @@ -795,6 +841,7 @@ bool SeatMotor_MoveAbsoluteSpeed(motor_mode_t mode, 0u, speedValuePerSecondX100, 0ul, + 0ul, commandSequence, true, false, @@ -879,10 +926,27 @@ bool SeatMotor_MoveAbsoluteInTime(motor_mode_t mode, uint32_t targetValueX100, uint32_t durationMs, uint32_t commandSequence) +{ + return SeatMotor_MoveAbsoluteInTimeWithGrace(mode, + targetValueX100, + durationMs, + 0ul, + commandSequence); +} + +bool SeatMotor_MoveAbsoluteInTimeWithGrace(motor_mode_t mode, + uint32_t targetValueX100, + uint32_t durationMs, + uint32_t deadlineGraceMs, + uint32_t commandSequence) { motor_position_info_t info; uint32_t travel; uint32_t speed; + uint32_t speedPlanDurationMs; + uint32_t speedPlanExtensionMs; + motor_direction_t direction; + bool started; if((0ul == durationMs) || (MOTOR_API_SUCCESS != Motor_GetPositionInfo(mode, &info)) || @@ -898,16 +962,94 @@ bool SeatMotor_MoveAbsoluteInTime(motor_mode_t mode, MOTOR_SPEED_MIN_DUTY_PERCENT, commandSequence); } - speed = (uint32_t)((((uint64_t)travel) * 1000ull) / durationMs); - return SeatMotor_StartPositionTask(mode, - targetValueX100, - 0u, - speed, - durationMs, - commandSequence, - true, - false, - SEAT_MOTOR_TASK_POSITION); + direction = (targetValueX100 >= info.valueX100) ? + MOTOR_DIRECTION_TOWARD_FAR : + MOTOR_DIRECTION_TOWARD_NEAR; + speedPlanDurationMs = (durationMs > SEAT_MOTOR_TIMED_ARRIVAL_SETTLE_MS) ? + (durationMs - SEAT_MOTOR_TIMED_ARRIVAL_SETTLE_MS) : durationMs; + speedPlanExtensionMs = SeatMotor_TimedPlanExtensionMs(mode, direction); + if(speedPlanExtensionMs > (UINT32_MAX - speedPlanDurationMs)) + { + return false; + } + speedPlanDurationMs += speedPlanExtensionMs; + speed = (uint32_t) + ((((uint64_t)travel) * 1000ull) / speedPlanDurationMs); + started = SeatMotor_StartPositionTask(mode, + targetValueX100, + 0u, + speed, + durationMs, + speedPlanDurationMs, + commandSequence, + true, + false, + SEAT_MOTOR_TASK_POSITION); + if(started) + { + tasks[(uint32_t)mode].deadlineGraceMs = deadlineGraceMs; + } + return started; +} + +bool SeatMotor_MoveAbsoluteHallDuty(motor_mode_t mode, + uint32_t targetHallCount, + uint8_t dutyPercent, + uint32_t commandSequence) +{ + motor_position_info_t info; + uint32_t targetValueX100; + + if((MOTOR_API_SUCCESS != Motor_GetPositionInfo(mode, &info)) || + (false == info.positionValid) || (0ul == info.maxHallCount) || + (targetHallCount > info.maxHallCount)) + { + return false; + } + targetValueX100 = (uint32_t) + (((uint64_t)targetHallCount * info.maxValueX100 + + (info.maxHallCount / 2ul)) / info.maxHallCount); + return SeatMotor_MoveAbsoluteDuty(mode, + targetValueX100, + dutyPercent, + commandSequence); +} + +bool SeatMotor_MoveAbsoluteHallInTime(motor_mode_t mode, + uint32_t targetHallCount, + uint32_t durationMs, + uint32_t commandSequence) +{ + return SeatMotor_MoveAbsoluteHallInTimeWithGrace(mode, + targetHallCount, + durationMs, + 0ul, + commandSequence); +} + +bool SeatMotor_MoveAbsoluteHallInTimeWithGrace(motor_mode_t mode, + uint32_t targetHallCount, + uint32_t durationMs, + uint32_t deadlineGraceMs, + uint32_t commandSequence) +{ + motor_position_info_t info; + uint32_t targetValueX100; + + if((MOTOR_API_SUCCESS != Motor_GetPositionInfo(mode, &info)) || + (false == info.positionValid) || (0ul == info.maxHallCount) || + (targetHallCount > info.maxHallCount)) + { + return false; + } + targetValueX100 = (uint32_t) + (((uint64_t)targetHallCount * info.maxValueX100 + + (info.maxHallCount / 2ul)) / info.maxHallCount); + return SeatMotor_MoveAbsoluteInTimeWithGrace(mode, + targetValueX100, + durationMs, + deadlineGraceMs, + commandSequence); } bool SeatMotor_CalibrateRange(motor_mode_t mode, diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.h b/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.h index 28de407..7b17eb4 100755 --- a/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.h +++ b/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.h @@ -110,6 +110,30 @@ bool SeatMotor_MoveAbsoluteInTime(motor_mode_t mode, uint32_t targetValueX100, uint32_t durationMs, uint32_t commandSequence); +/* Keep the same speed plan while allowing a bounded scheduler/settling grace + * before the manager reports TIMEOUT. */ +bool SeatMotor_MoveAbsoluteInTimeWithGrace(motor_mode_t mode, + uint32_t targetValueX100, + uint32_t durationMs, + uint32_t deadlineGraceMs, + uint32_t commandSequence); + +/* Hall-coordinate variants used by firmware-owned synchronized trajectories. + * The target is checked against the live calibrated MaxHall before conversion + * to the motor's physical value. */ +bool SeatMotor_MoveAbsoluteHallDuty(motor_mode_t mode, + uint32_t targetHallCount, + uint8_t dutyPercent, + uint32_t commandSequence); +bool SeatMotor_MoveAbsoluteHallInTime(motor_mode_t mode, + uint32_t targetHallCount, + uint32_t durationMs, + uint32_t commandSequence); +bool SeatMotor_MoveAbsoluteHallInTimeWithGrace(motor_mode_t mode, + uint32_t targetHallCount, + uint32_t durationMs, + uint32_t deadlineGraceMs, + uint32_t commandSequence); /* Range calibration is interruptible by Motor_RequestAbortAllFromIsr(). */ bool SeatMotor_CalibrateRange(motor_mode_t mode, diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c b/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c index 0e1f7a4..961666b 100755 --- a/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c +++ b/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c @@ -7,6 +7,7 @@ #include "motor_control.h" #include "safety_manager.h" #include "seat_controller_thermal.h" +#include "seat_dynamic_mode.h" #include "seat_motor_manager.h" #include "seat_move_config.h" #include "seat_move_store.h" @@ -67,7 +68,9 @@ typedef enum SEAT_MOVE_OPCODE_CALIBRATE_RANGE = 0x0Au, SEAT_MOVE_OPCODE_HOME_KNOWN_RANGE = 0x0Bu, SEAT_MOVE_OPCODE_QUERY_STATUS = 0x0Cu, - SEAT_MOVE_OPCODE_CLEAR_FAULT = 0x0Du + SEAT_MOVE_OPCODE_CLEAR_FAULT = 0x0Du, + SEAT_MOVE_OPCODE_START_DYNAMIC_MODE = 0x0Eu, + SEAT_MOVE_OPCODE_STOP_DYNAMIC_MODE = 0x0Fu } seat_move_opcode_t; typedef enum @@ -170,12 +173,14 @@ static uint8_t s_motorPeriodicId = 0u; static uint8_t s_diagnosticPeriodicId = 0u; static bool s_motorPeriodicPending = false; static bool s_diagnosticPeriodicPending = false; +static bool s_dynamicStatusPending = true; static uint8_t s_systemAlive = 0u; static uint8_t s_diagnosticAlive[SEAT_MOVE_MOTOR_COUNT]; static uint32_t s_nextStartMs = 0u; static uint32_t s_nextSystemStatusMs = 0u; static uint32_t s_nextMotorPollMs = 0u; static uint32_t s_nextDiagnosticPollMs = 0u; +static uint32_t s_nextDynamicStatusMs = 0u; static bool SeatMove_TimeReached(uint32_t now, uint32_t deadline); static bool SeatMove_SequenceNewer(uint16_t candidate, uint16_t reference); @@ -220,6 +225,7 @@ static bool SeatMove_SendSystemStatus(void); static bool SeatMove_SendMotorStatus(uint8_t motor); static bool SeatMove_SendDiagnostic(uint8_t motor); static bool SeatMove_SendCurrentDiagnostic(uint8_t motor); +static bool SeatMove_SendDynamicStatus(void); static void SeatMove_ServiceFeedback(void); bool SeatMoveApplication_Init(void) @@ -233,6 +239,7 @@ bool SeatMoveApplication_Init(void) s_storeSavePending = false; s_storeSaveNotBeforeMs = 0u; SeatMotorManager_Init(); + SeatDynamicMode_Init(); SeatMoveStore_Init(); if(SeatMoveStore_IsValid() && SeatMoveStore_IsClean() && @@ -254,9 +261,11 @@ bool SeatMoveApplication_Init(void) s_nextSystemStatusMs = now; s_nextMotorPollMs = now; s_nextDiagnosticPollMs = now; + s_nextDynamicStatusMs = now; s_systemStatusPending = true; s_motorStatusPendingMask = SEAT_MOVE_ACTIVE_MOTOR_MASK; s_diagnosticPendingMask = SEAT_MOVE_ACTIVE_MOTOR_MASK; + s_dynamicStatusPending = true; return true; } @@ -273,6 +282,15 @@ void SeatMoveApplication_Service(void) { uint8_t motor; + if(SeatDynamicMode_IsActive()) + { + SeatDynamicMode_Stop(g_seatMoveLastSequence); + s_storeSavePending = true; + s_storeSaveNotBeforeMs = + Motor_GetTimeMs() + SEAT_MOVE_STORE_SAVE_DEBOUNCE_MS; + s_dynamicStatusPending = true; + } + for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) { s_pending[motor].valid = false; @@ -294,6 +312,7 @@ void SeatMoveApplication_Service(void) } SeatMove_ServiceDispatcher(); SeatMotorManager_Service(); + SeatDynamicMode_Service(); SeatMove_ServiceStateChanges(); SeatMove_ServicePersistence(); SeatMove_ServiceFeedback(); @@ -326,7 +345,9 @@ void Motor_CalibrationServiceHook(void) void SeatMoveApplication_StopAll(uint16_t sequence) { uint8_t logicalMotor; + bool dynamicWasActive = SeatDynamicMode_IsActive(); + SeatDynamicMode_Stop(sequence); Motor_RequestAbortAllFromIsr(sequence); Motor_ServiceAll(); for(logicalMotor = 0u; @@ -342,6 +363,13 @@ void SeatMoveApplication_StopAll(uint16_t sequence) s_motorStatusPendingMask = SEAT_MOVE_ACTIVE_MOTOR_MASK; s_diagnosticPendingMask = SEAT_MOVE_ACTIVE_MOTOR_MASK; s_systemStatusPending = true; + s_dynamicStatusPending = true; + if(dynamicWasActive) + { + s_storeSavePending = true; + s_storeSaveNotBeforeMs = + Motor_GetTimeMs() + SEAT_MOVE_STORE_SAVE_DEBOUNCE_MS; + } } static bool SeatMove_TimeReached(uint32_t now, uint32_t deadline) @@ -479,6 +507,8 @@ static bool SeatMove_ParseCommand(const bsp_seat_move_can_frame_t *frame, case SEAT_MOVE_OPCODE_HOME_KNOWN_RANGE: case SEAT_MOVE_OPCODE_QUERY_STATUS: case SEAT_MOVE_OPCODE_CLEAR_FAULT: + case SEAT_MOVE_OPCODE_START_DYNAMIC_MODE: + case SEAT_MOVE_OPCODE_STOP_DYNAMIC_MODE: break; default: *reject = SEAT_MOVE_REJECT_BAD_OPCODE; @@ -501,7 +531,9 @@ static bool SeatMove_ParametersValid(const seat_move_command_t *command, *reject = SEAT_MOVE_REJECT_BAD_MOTOR; return false; } - if((command->opcode == SEAT_MOVE_OPCODE_STOP_ALL) && + if(((command->opcode == SEAT_MOVE_OPCODE_STOP_ALL) || + (command->opcode == SEAT_MOVE_OPCODE_START_DYNAMIC_MODE) || + (command->opcode == SEAT_MOVE_OPCODE_STOP_DYNAMIC_MODE)) && (command->motor != 0u)) { *reject = SEAT_MOVE_REJECT_BAD_MOTOR; @@ -590,6 +622,22 @@ static bool SeatMove_ParametersValid(const seat_move_command_t *command, return false; } break; + case SEAT_MOVE_OPCODE_START_DYNAMIC_MODE: + if(((command->paramA != SEAT_DYNAMIC_MODE_ROCKING_HORSE) && + (command->paramA != SEAT_DYNAMIC_MODE_CRADLE)) || + (command->paramB != 0u)) + { + *reject = SEAT_MOVE_REJECT_PARAM_RANGE; + return false; + } + break; + case SEAT_MOVE_OPCODE_STOP_DYNAMIC_MODE: + if((command->paramA != 0u) || (command->paramB != 0u)) + { + *reject = SEAT_MOVE_REJECT_PARAM_RANGE; + return false; + } + break; default: *reject = SEAT_MOVE_REJECT_BAD_OPCODE; return false; @@ -801,9 +849,27 @@ static void SeatMove_HandleCommand(const bsp_seat_move_can_frame_t *frame) g_seatMoveAcceptedCount++; return; } + if(command.opcode == SEAT_MOVE_OPCODE_STOP_DYNAMIC_MODE) + { + SeatMoveApplication_StopAll(command.sequence); + SeatMove_SetResponse(SEAT_MOVE_ACK_ACCEPTED, + SEAT_MOVE_REJECT_NONE, + &command); + g_seatMoveAcceptedCount++; + return; + } if(command.opcode == SEAT_MOVE_OPCODE_STOP_MOTOR) { - SeatMove_StopMotor(command.motor, command.sequence); + if(SeatDynamicMode_IsActive()) + { + /* A one-axis stop would invalidate a synchronized trajectory. + * Stop the complete dynamic mode instead. */ + SeatMoveApplication_StopAll(command.sequence); + } + else + { + SeatMove_StopMotor(command.motor, command.sequence); + } SeatMove_SetResponse(SEAT_MOVE_ACK_ACCEPTED, SEAT_MOVE_REJECT_NONE, &command); @@ -855,6 +921,64 @@ static void SeatMove_HandleCommand(const bsp_seat_move_can_frame_t *frame) &command); return; } + if(command.opcode == SEAT_MOVE_OPCODE_START_DYNAMIC_MODE) + { + if(SeatDynamicMode_IsActive() || SeatMotorManager_IsAnyActive() || + SeatMove_AnyPending()) + { + g_seatMoveConflictCount++; + SeatMove_SetResponse(SEAT_MOVE_ACK_REJECTED, + SEAT_MOVE_REJECT_BUSY_SAME_MOTOR, + &command); + return; + } + if(SeatMove_PositionValidMask() != SEAT_MOVE_ACTIVE_MOTOR_MASK) + { + SeatMove_SetResponse(SEAT_MOVE_ACK_REJECTED, + SeatMoveStore_HasCorruptRecord() ? + SEAT_MOVE_REJECT_CAL_DATA_INVALID : + SEAT_MOVE_REJECT_POSITION_INVALID, + &command); + return; + } + SafetyManager_KickWatchdog(); + if(!SeatMoveStore_MarkMovementStarted()) + { + SafetyManager_LatchFault(SAFETY_FAULT_CONFIG_STORE); + SeatMove_SetResponse(SEAT_MOVE_ACK_REJECTED, + SEAT_MOVE_REJECT_INTERNAL_ERROR, + &command); + return; + } + s_storeSavePending = true; + s_storeSaveNotBeforeMs = + Motor_GetTimeMs() + SEAT_MOVE_STORE_SAVE_DEBOUNCE_MS; + if(!SeatDynamicMode_Start((uint8_t)command.paramA, + command.sequence)) + { + SeatMove_SetResponse(SEAT_MOVE_ACK_REJECTED, + SEAT_MOVE_REJECT_INTERNAL_ERROR, + &command); + s_dynamicStatusPending = true; + return; + } + s_motorStatusPendingMask = SEAT_MOVE_ACTIVE_MOTOR_MASK; + s_diagnosticPendingMask = SEAT_MOVE_ACTIVE_MOTOR_MASK; + s_dynamicStatusPending = true; + SeatMove_SetResponse(SEAT_MOVE_ACK_ACCEPTED, + SEAT_MOVE_REJECT_NONE, + &command); + g_seatMoveAcceptedCount++; + return; + } + if(SeatDynamicMode_IsActive()) + { + g_seatMoveConflictCount++; + SeatMove_SetResponse(SEAT_MOVE_ACK_REJECTED, + SEAT_MOVE_REJECT_BUSY_SAME_MOTOR, + &command); + return; + } if(SeatMove_IsPositionCommand(command.opcode)) { if(!SeatMove_GetStatus(command.motor, &status)) @@ -1069,6 +1193,14 @@ static void SeatMove_ServicePersistence(void) return; } + /* A continuously cycling dynamic mode must not commit Work Flash at each + * hold or phase boundary. The dirty record remains authoritative until + * STOP_ALL/STOP_DYNAMIC_MODE and one final settled save. */ + if(SeatDynamicMode_IsActive()) + { + return; + } + now = Motor_GetTimeMs(); if(SeatMove_AnyPending() || SeatMotorManager_IsAnyActive() || SeatMove_AnyPhysicalMotorMoving()) @@ -1166,8 +1298,11 @@ static uint8_t SeatMove_MapTaskResult(const seat_motor_status_t *status) static uint8_t SeatMove_SystemState(void) { + seat_dynamic_mode_status_t dynamicStatus; uint8_t activeMask = SeatMove_ActiveMask(); uint8_t faultedMask = SeatMove_FaultedMask(); + bool dynamicFault = SeatDynamicMode_GetStatus(&dynamicStatus) && + (dynamicStatus.state == SEAT_DYNAMIC_STATE_FAULT); if(SafetyManager_IsInhibited()) { @@ -1178,12 +1313,12 @@ static uint8_t SeatMove_SystemState(void) { return SEAT_MOVE_SYSTEM_CALIBRATION; } - if((faultedMask != 0u) || + if((faultedMask != 0u) || dynamicFault || (SafetyManager_GetFault() != SAFETY_FAULT_NONE)) { return SEAT_MOVE_SYSTEM_FAULT; } - if(activeMask != 0u) + if((activeMask != 0u) || SeatDynamicMode_IsActive()) { return SEAT_MOVE_SYSTEM_ACTIVE; } @@ -1192,11 +1327,15 @@ static uint8_t SeatMove_SystemState(void) static bool SeatMove_SendSystemStatus(void) { + seat_dynamic_mode_status_t dynamicStatus; uint8_t activeMask = SeatMove_ActiveMask(); uint8_t faultedMask = SeatMove_FaultedMask(); uint8_t positionValidMask = SeatMove_PositionValidMask(); bool calibrationBusy = SeatMove_CalibrationBusy(); - bool faultSummary = (faultedMask != 0u) || + bool dynamicStatusValid = SeatDynamicMode_GetStatus(&dynamicStatus); + bool dynamicFault = dynamicStatusValid && + (dynamicStatus.state == SEAT_DYNAMIC_STATE_FAULT); + bool faultSummary = (faultedMask != 0u) || dynamicFault || (SafetyManager_GetFault() != SAFETY_FAULT_NONE) || SeatMoveStore_HasCorruptRecord(); uint8_t byte0 = (uint8_t)((g_seatMoveAck & 0x0Fu) | @@ -1205,6 +1344,7 @@ static bool SeatMove_SendSystemStatus(void) uint8_t byte4 = g_seatMoveLastOpcode; uint8_t byte5 = (uint8_t)((activeMask & 0x0Fu) | (SafetyManager_IsInhibited() ? 0x10u : 0u) | + (SeatDynamicMode_IsActive() ? 0x20u : 0u) | (calibrationBusy ? 0x40u : 0u) | (faultSummary ? 0x80u : 0u)); uint8_t byte6 = (uint8_t)((faultedMask & 0x0Fu) | @@ -1304,7 +1444,9 @@ static bool SeatMove_SendDiagnostic(uint8_t motor) UINT16_MAX : (uint16_t)status.hallCount; maxHallCount = (status.maxHallCount > UINT16_MAX) ? UINT16_MAX : (uint16_t)status.maxHallCount; - speedRaw = (status.hallSpeedPpsX100 + 100u) / 200u; + /* 0x303 B6 is specified as 0.5 pulse/s per LSB. hallSpeed is x100, + * therefore divide by 50 (with half-up rounding), not by 200. */ + speedRaw = (status.hallSpeedPpsX100 + 25u) / 50u; if(speedRaw > UINT8_MAX) { speedRaw = UINT8_MAX; @@ -1363,6 +1505,27 @@ static bool SeatMove_SendCurrentDiagnostic(uint8_t motor) data1); } +static bool SeatMove_SendDynamicStatus(void) +{ + seat_dynamic_mode_status_t status; + uint32_t data0; + uint32_t data1; + + if(!SeatDynamicMode_GetStatus(&status)) + { + return false; + } + data0 = (uint32_t)status.modeId | + ((uint32_t)status.state << 8u) | + ((uint32_t)status.phase << 16u) | + ((uint32_t)status.activeMask << 24u); + data1 = (uint32_t)status.cycleIndex | + ((uint32_t)status.phaseElapsedMs << 16u); + return BspSeatMoveCan_Send(SEAT_MOVE_CAN_DYNAMIC_STATUS_ID, + data0, + data1); +} + static void SeatMove_ServiceFeedback(void) { uint32_t now = Motor_GetTimeMs(); @@ -1373,6 +1536,11 @@ static void SeatMove_ServiceFeedback(void) s_systemStatusPending = true; s_nextSystemStatusMs = now + SEAT_MOVE_SYSTEM_STATUS_PERIOD_MS; } + if(SeatMove_TimeReached(now, s_nextDynamicStatusMs)) + { + s_dynamicStatusPending = true; + s_nextDynamicStatusMs = now + SEAT_MOVE_DYNAMIC_STATUS_PERIOD_MS; + } if(!s_motorPeriodicPending && SeatMove_TimeReached(now, s_nextMotorPollMs)) { @@ -1408,6 +1576,19 @@ static void SeatMove_ServiceFeedback(void) } return; } + if(s_dynamicStatusPending) + { + if(SeatMove_SendDynamicStatus()) + { + s_dynamicStatusPending = false; + g_seatMoveFeedbackTxCount++; + } + else + { + g_seatMoveFeedbackTxFailureCount++; + } + return; + } for(motor = 0u; motor < SEAT_MOVE_MOTOR_COUNT; motor++) { uint8_t bit = (uint8_t)(1u << motor); diff --git a/firmware/t2g/Seat_Controller_demo/Config/seat_dynamic_mode_config.h b/firmware/t2g/Seat_Controller_demo/Config/seat_dynamic_mode_config.h new file mode 100644 index 0000000..8fbceb8 --- /dev/null +++ b/firmware/t2g/Seat_Controller_demo/Config/seat_dynamic_mode_config.h @@ -0,0 +1,55 @@ +#ifndef SEAT_DYNAMIC_MODE_CONFIG_H +#define SEAT_DYNAMIC_MODE_CONFIG_H + +/* Rocking-horse tuning for the connected N7 passenger seat. + * + * M0/M1/M2/M3 are longitudinal, cushion tilt, backrest and legrest. Keep all + * Hall targets inside the calibrated ranges before building for another seat. + * The centre pose and two symmetric endpoints are deliberately separated from + * the mechanical endpoints. M1 uses a 120-Hall peak-to-peak stroke (about + * 18 mm of the calibrated vertical component) so the rider can feel a real + * rise/fall instead of only a backrest pitch. M0 uses a 100-Hall stroke at + * 90% duty to overcome the opposing horizontal component created by that + * diagonal M1 stroke. This file is the ECU-side customization + * point; config/modes/vehicles/denza_n7/rocking_horse.yaml mirrors these values + * for the long-term mode library and frontend. + */ +#define SEAT_DYNAMIC_HORSE_ENTRY_M0_HALL (320u) +#define SEAT_DYNAMIC_HORSE_ENTRY_M1_HALL (190u) +#define SEAT_DYNAMIC_HORSE_ENTRY_M2_HALL (500u) +#define SEAT_DYNAMIC_HORSE_ENTRY_M3_HALL (430u) + +#define SEAT_DYNAMIC_HORSE_FORWARD_M0_HALL (270u) +#define SEAT_DYNAMIC_HORSE_FORWARD_M1_HALL (250u) +#define SEAT_DYNAMIC_HORSE_FORWARD_M2_HALL (460u) +#define SEAT_DYNAMIC_HORSE_FORWARD_M3_HALL (400u) + +#define SEAT_DYNAMIC_HORSE_BACKWARD_M0_HALL (370u) +#define SEAT_DYNAMIC_HORSE_BACKWARD_M1_HALL (130u) +#define SEAT_DYNAMIC_HORSE_BACKWARD_M2_HALL (540u) +#define SEAT_DYNAMIC_HORSE_BACKWARD_M3_HALL (460u) + +#define SEAT_DYNAMIC_HORSE_M0_DUTY_PERCENT (90u) +#define SEAT_DYNAMIC_HORSE_M1_DUTY_PERCENT (90u) +#define SEAT_DYNAMIC_HORSE_M2_DUTY_PERCENT (90u) +#define SEAT_DYNAMIC_HORSE_M3_DUTY_PERCENT (50u) +#define SEAT_DYNAMIC_HORSE_FINAL_DUTY_PERCENT (50u) +#define SEAT_DYNAMIC_HORSE_RENDEZVOUS_PULSES (8u) +#define SEAT_DYNAMIC_HORSE_PHASE_TIMEOUT_MS (15000u) + +#if ((SEAT_DYNAMIC_HORSE_ENTRY_M0_HALL > 480u) || \ + (SEAT_DYNAMIC_HORSE_FORWARD_M0_HALL > 480u) || \ + (SEAT_DYNAMIC_HORSE_BACKWARD_M0_HALL > 480u) || \ + (SEAT_DYNAMIC_HORSE_ENTRY_M1_HALL > 374u) || \ + (SEAT_DYNAMIC_HORSE_FORWARD_M1_HALL > 374u) || \ + (SEAT_DYNAMIC_HORSE_BACKWARD_M1_HALL > 374u) || \ + (SEAT_DYNAMIC_HORSE_ENTRY_M2_HALL > 917u) || \ + (SEAT_DYNAMIC_HORSE_FORWARD_M2_HALL > 917u) || \ + (SEAT_DYNAMIC_HORSE_BACKWARD_M2_HALL > 917u) || \ + (SEAT_DYNAMIC_HORSE_ENTRY_M3_HALL > 647u) || \ + (SEAT_DYNAMIC_HORSE_FORWARD_M3_HALL > 647u) || \ + (SEAT_DYNAMIC_HORSE_BACKWARD_M3_HALL > 647u)) +#error "Rocking-horse Hall targets exceed the nominal N7 calibrated ranges." +#endif + +#endif /* SEAT_DYNAMIC_MODE_CONFIG_H */ diff --git a/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h b/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h index a7a73b2..fc5591e 100755 --- a/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h +++ b/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h @@ -67,14 +67,25 @@ #define SEAT_MOVE_CAN_PROTOCOL_VERSION (1u) /* Repository image identity carried by 0x301 byte 7 high nibble. Increment * whenever a host-visible safety or motion fix requires automatic reflash. */ -#define SEAT_MOVE_FIRMWARE_REVISION (6u) +#define SEAT_MOVE_FIRMWARE_REVISION (13u) #define SEAT_MOVE_CAN_COMMAND_ID (0x300u) #define SEAT_MOVE_CAN_SYSTEM_STATUS_ID (0x301u) #define SEAT_MOVE_CAN_MOTOR_STATUS_ID (0x302u) #define SEAT_MOVE_CAN_DIAGNOSTIC_ID (0x303u) #define SEAT_MOVE_CAN_CURRENT_DIAGNOSTIC_ID (0x304u) +#define SEAT_MOVE_CAN_DYNAMIC_STATUS_ID (0x306u) #define SEAT_MOVE_SYSTEM_STATUS_PERIOD_MS (100u) +#define SEAT_MOVE_DYNAMIC_STATUS_PERIOD_MS (100u) +/* Native dynamic modes are bounded independently of the host process. The + * ECU keeps cycling after the start ACK, but always stops after ten minutes + * if no STOP_DYNAMIC/STOP_ALL command arrives. */ +#define SEAT_MOVE_DYNAMIC_MAX_RUNTIME_MS (600000u) +/* The phase duration is the requested synchronized-arrival target. A loaded + * bench axis may be physically slower (notably M2 for the 472-pulse breathing + * stroke), so normal Hall progress may continue through this bounded grace + * window. Stall/no-motion and driver-fault protections remain immediate. */ +#define SEAT_MOVE_DYNAMIC_ARRIVAL_GRACE_MS (30000u) #define SEAT_MOVE_MOTOR_STATUS_POLL_MS (25u) /* One motor is emitted per poll; 25 ms gives each axis a 100 ms 0x303/0x304 * update period and captures the 200 ms high-current confirmation window. */ @@ -148,7 +159,8 @@ (SEAT_MOVE_CAN_SYSTEM_STATUS_ID > 0x7FFu) || \ (SEAT_MOVE_CAN_MOTOR_STATUS_ID > 0x7FFu) || \ (SEAT_MOVE_CAN_DIAGNOSTIC_ID > 0x7FFu) || \ - (SEAT_MOVE_CAN_CURRENT_DIAGNOSTIC_ID > 0x7FFu)) + (SEAT_MOVE_CAN_CURRENT_DIAGNOSTIC_ID > 0x7FFu) || \ + (SEAT_MOVE_CAN_DYNAMIC_STATUS_ID > 0x7FFu)) #error "Seat movement CAN identifiers must be 11-bit standard IDs." #endif diff --git a/firmware/t2g/Seat_Controller_demo/Docs/README_Seat_Controller_demo.md b/firmware/t2g/Seat_Controller_demo/Docs/README_Seat_Controller_demo.md index d3f9862..3cbae29 100755 --- a/firmware/t2g/Seat_Controller_demo/Docs/README_Seat_Controller_demo.md +++ b/firmware/t2g/Seat_Controller_demo/Docs/README_Seat_Controller_demo.md @@ -1,6 +1,6 @@ # Seat_Controller_demo -`Seat_Controller_demo` 是 `CYT4BFBCJE` / `CY_MCU_rev_d` / Cortex-M0+ Flash 的单板统一座椅控制器工程,集成座椅通风、靠背加热和四电机移动。SDL 公共源码未修改,应用配置和功能代码均位于本工程目录。 +`Seat_Controller_demo` 是 `CYT4BFBCJE` / `CY_MCU_rev_d` / Cortex-M0+ Flash 的单板统一座椅控制器工程,集成座椅通风、靠背加热、四电机移动和两个原生连续循环动态模式。动态模式收到停止/全停命令或启动累计10分钟时终止。SDL 公共源码未修改,应用配置和功能代码均位于本工程目录。 ## 单板资源 @@ -22,8 +22,9 @@ - TX `0x301/0x302/0x303`:移动 ACK、状态和 Hall 诊断。 - TX `0x304`:四轴电流诊断;B0 MotorID,B1 bits0..4依次为采样有效/零点有效/高电流/低Hall/标定中,B2..3 ADC raw,B4..5停止态零点raw,B6..7该轴堵转电流差值阈值raw。 - TX `0x305`:热管理电流诊断;B0采样有效标志,B1输出状态,B2..3通风电流raw,B4..5靠背加热电流raw,B6/B7为两路ADC累计错误计数(饱和到255)。 +- TX `0x306`:100 ms动态模式状态;ModeID、状态、阶段、四轴ActiveMask、循环序号和阶段已运行毫秒数。 -CAN 为 500 kbit/s、经典标准帧、11-bit ID、DLC 8。移动协议版本为 1;支持 `MOVE_ABSOLUTE`、`MOVE_RELATIVE`、`MOVE_TIMED`、`STOP_MOTOR`、`STOP_ALL`、`CALIBRATE_RANGE`、`HOME_KNOWN_RANGE`、`QUERY_STATUS` 和 `CLEAR_FAULT`。四轴定义及完整字节布局见 `Docs/outputs/seat_move_four_motor_20260724/座椅四电机移动功能CAN矩阵表.xlsx`。 +CAN 为 500 kbit/s、经典标准帧、11-bit ID、DLC 8。移动协议版本为 1;支持 `MOVE_ABSOLUTE`、`MOVE_RELATIVE`、`MOVE_TIMED`、`STOP_MOTOR`、`STOP_ALL`、`CALIBRATE_RANGE`、`HOME_KNOWN_RANGE`、`QUERY_STATUS`、`CLEAR_FAULT`、`START_DYNAMIC_MODE(0x0E)` 和 `STOP_DYNAMIC_MODE(0x0F)`。ModeID 1为木马模式,ModeID 2为动态摇篮;两者均按目标到位连续循环。四轴定义及完整字节布局见 `Docs/outputs/seat_move_four_motor_20260724/座椅四电机移动功能CAN矩阵表.xlsx`。 2026-07-30 四个独立量程入口已验证 CAN MotorID 与板级物理 Mode 同号映射:M0/physical0 水平前后、M1/physical1 坐盆上下、M2/physical2 靠背前后、M3/physical3 腿托上下。首次测试仍须目视确认没有错误执行机构动作。 @@ -46,6 +47,7 @@ CAN 为 500 kbit/s、经典标准帧、11-bit ID、DLC 8。移动协议版本为 - 四轴分别具有启动宽限(M0/M1/M2=1 s,M3=2 s)。普通移动仅在“500 ms Hall双边沿窗口不超过2个边沿”且“相对停止态零点的轴电流超过独立阈值并持续200 ms”同时成立时报告 `STALL`;低Hall但电流低或采样过期时不误报堵转,连续5 s无运动后关断并报告 `TIMEOUT`。 - 真实台架诊断必须同时保存命令期间的 `0x304` 电流峰值和 `0x303` Hall 变化:高电流且无 Hall 表示机械阻塞或 Hall 公共参考异常,低电流且双向无 Hall 更符合驱动桥、连接器、电机线束或 Hall 地线开路。2026-08-01 的 M0/M1/M2 异常最终定位为 Hall 地线断开;2026-08-02 恢复接线后完整 33 条自动 HIL 全部通过。不得靠提高 Duty、阈值或超时掩盖同类线路问题。 - 四轴普通绝对/相对移动默认使用90% PWM占空比;堵转电流差值阈值在重新带载标定前统一使用500 raw保守默认值,优先避免正常运动误报。PWM软件上限保持95%。 +- 动态模式按Hall目标和阶段时长做低速位置进度闭环;四轴同步启动,在相位边界以±3 Hall判定到位后统一停止再切换。任何轴不能在阶段宽限内到位时全停并通过`0x306`报告FAULT。 - 位置任务因端点/堵转事件停止时,若最终Hall已进入目标±2脉冲范围则按到位完成;底层LastEvent仍由`0x303`保留用于诊断。超过该范围的STALL/TIMEOUT仍按失败处理。 - `HOME_KNOWN_RANGE`/全量标定的寻端语义与普通移动分离。端点要求500 ms内Hall双边沿为0,避免慢速移动仅有下降沿时被误判为端点;已知量程归零若第一次寻近端少于4个真实Hall边沿,会先向远端验证至少4个双边沿再重新寻近端,并校验回程与离端边沿数(允许1边沿误差),禁止把电机未启动直接清零。无法证明往返运动时归零失败并使PositionValid失效。位置和量程仍按Hall上升沿计数。 - `STOP_ALL` 不受旧 Sequence 限制;CAN RX ISR 先立即终止四路 PWM,因此也能打断阻塞式全行程标定,主流程随后完成 ACK 和 Sequence 重同步。 @@ -70,5 +72,18 @@ CAN 为 500 kbit/s、经典标准帧、11-bit ID、DLC 8。移动协议版本为 - `Tests/manual_hil/05_seat_function_bridge.py`:在ZCANPRO内运行的CAN桥接。 - `Tests/manual_hil/run_seat_function_gui.bat`:Windows选择界面,从仓库根目录 `座椅功能模式配置表.xlsx` 连续动态读取当前11种模式/12个场景,显示物理目标、重算Hall、CAN结果并保存人工观察;小憩模式为单场景,并包含新增“小腿解压悬浮模式”。 - `Tests/manual_hil/02_power_memory.py` 默认只做正常掉电恢复;`03_protection_faults.py` 默认只做无需注入设备的协议保护。 +- `Tests/manual_hil/07_dynamic_modes.py`:revision 13原生动态模式HIL。验证带水平耦合补偿的木马模式和动态摇篮的完整阶段顺序、精确Hall目标、四轴全程联动、自动跨周期和停止;ECU另有600 s硬截止。 + +2026-08-04已验证公共动态运行时的自动续环、循环中停止,以及单次连续运行600.024 s后的ECU安全截止;任何轴堵转、无运动或驱动故障仍会保持全停,固件不绕过底层保护。 + +同日revision 9在M1执行已知量程回近端后通过重新设计的摇篮实测:Step 1→2启动/到位离散0.077/0.338 s,Step 2→3为0.079/0.495 s,全部目标在±3 Hall内,CycleIndex自动进入1,下一轮四轴启动离散0.082 s,停止后`0x306`全零。 + +同日revision 10删除M1延迟追赶:正向/返回水平与靠背约走25%时,坐盆已走44.0%/39.0%;四轴启动离散0.070/0.050 s、到位离散0.342/0.339 s,下一轮启动离散0.051 s。四轴从阶段开始全程联动,停止后`0x306`全零。 + +同日revision 11用木马模式替换旧ModeID 1轨迹。木马在前俯`[290,220,460,400]`和后仰`[350,160,540,460]`间连续往复;稳态前俯/后仰启动离散0.080/0.079 s,到位离散0.234/0.232 s,水平到25%时坐盆已达41.7%/36.7%,完整周期约9.0 s。目标、自动续环和停止全零均PASS,配置见`Config/seat_dynamic_mode_config.h`。 + +同日revision 12将坐盆目标扩大到`250↔130` Hall并把M1巡航占空比提升为90%,坐盆峰峰垂直分量约18 mm。稳态前俯/后仰启动离散0.054/0.081 s,到位离散0.389/0.182 s,水平到25%时坐盆已达46.6%/35.8%,完整周期约9.2 s;无FAULT、目标、自动续环和停止全零均PASS。 + +同日revision 13将M0水平目标扩大到`270↔370` Hall并把巡航Duty提升为90%,用100 Hall峰峰行程补偿M1斜向运动。实测水平峰峰行程约43.1 mm、估算净水平摆幅约26.7 mm;稳态前俯/后仰启动离散0.077/0.052 s,到位离散0.337/0.182 s,四轴巡航持续推进、无FAULT、目标、自动续环和停止全零均PASS。 本轮不执行 `01_calibration_position.py` 或 `04_waveform_full_function.py`,两者均已设置归档保护。具体顺序和日志回传要求见 `Tests/manual_hil/README_CN.md`。 diff --git a/firmware/t2g/Seat_Controller_demo/Docs/座椅控制器_CAN_测试规范.md b/firmware/t2g/Seat_Controller_demo/Docs/座椅控制器_CAN_测试规范.md index a94609f..d2939fd 100644 --- a/firmware/t2g/Seat_Controller_demo/Docs/座椅控制器_CAN_测试规范.md +++ b/firmware/t2g/Seat_Controller_demo/Docs/座椅控制器_CAN_测试规范.md @@ -1,13 +1,13 @@ # 座椅控制器 CAN/HIL 测试规范 -版本:2.3(2026-07-30) +版本:3.0(2026-08-03) 对象:`Seat_Controller_demo`、`量程测试脚本` MCU:CYT4BFBCJE / CY_MCU_rev_d / Cortex-M0+ Flash 总线:Classic CAN,11-bit 标准帧,500 kbit/s,DLC=8,Intel/Little-endian ## 1. 目的与范围 -本规范用于验证统一控制器的座椅通风、靠背加热、四轴移动、自动标定、反馈周期和安全停机。测试分为静态构建、无机械动作 CAN 检查、单轴低风险动作、多轴并发、全行程标定和故障注入。未经安全确认不得直接跳到多轴或标定阶段。 +本规范用于验证统一控制器的座椅通风、靠背加热、四轴移动、原生动态模式、自动标定、反馈周期和安全停机。测试分为静态构建、无机械动作 CAN 检查、单轴低风险动作、多轴并发、动态时序、全行程标定和故障注入。未经安全确认不得直接跳到多轴、动态模式或标定阶段。 配套文件: @@ -66,20 +66,32 @@ Byte0=Opcode;Byte1=`0x10 | MotorID | (Direction<<2)`;Byte2..3=Sequence;Byt | `0B` | 已知量程回最近端 | `0x4B52` | 最近端寻找10~600 s | | `0C` | 查询状态 | 0 | 0 | | `0D` | 清故障 | `0xC33C` | 0 | +| `0E` | 启动原生动态模式 | ModeID:1木马模式、2动态摇篮 | 0 | +| `0F` | 停止原生动态模式 | 0 | 0 | ### 3.3 移动反馈 -- `0x301`:Byte0 低半字节 ACK、高半字节 SystemState;Byte1 RejectReason;Byte2..3 Sequence;Byte4 Opcode;Byte5 ActiveMask/抑制/标定/故障;Byte6 FaultedMask/PositionValidMask;Byte7 低半字节 Alive、高半字节 FirmwareRevision(当前为 2)。 +- `0x301`:Byte0 低半字节 ACK、高半字节 SystemState;Byte1 RejectReason;Byte2..3 Sequence;Byte4 Opcode;Byte5 ActiveMask/抑制/动态/标定/故障;Byte6 FaultedMask/PositionValidMask;Byte7 低半字节 Alive、高半字节 FirmwareRevision(当前为 13)。 - `0x302`:Byte0 MotorID;Byte1 TaskState/Result;Byte2 方向、Active、PositionValid、端点、堵转和驱动故障;Byte3..4 Sequence;Byte5..6 归一化位置;Byte7 驱动等级。 - `0x303`:Byte0 MotorID;Byte1 LastEvent/FaultFlags;Byte2..3 HallCount;Byte4..5 MaxHallCount;Byte6 Hall速度(0.5 pulse/s/LSB);Byte7 Retry/Alive。 +- `0x306`:原生动态模式状态,周期100 ms;Byte0 ModeID,Byte1 State(0 IDLE、1 ENTRY、2 RUNNING、3 FAULT),Byte2 Phase(1 ENTRY、2 HORSE_FORWARD、3 HORSE_BACKWARD、5 CRADLE_FORWARD、6 CRADLE_RETURN;4保留),Byte3低半字节ActiveMask、高半字节FaultMask,Byte4..5 CycleIndex,Byte6..7 PhaseElapsedMs。 -ACK:0 NONE、1 ACCEPTED、2 REJECTED、3 DUPLICATE、4 STOP_ALL_ACCEPTED。RejectReason 与 TaskState/Result 以移动矩阵“枚举定义”页为准。`0x301` Byte5 bit5 当前固定为0,预留给未来通信监控。 +ACK:0 NONE、1 ACCEPTED、2 REJECTED、3 DUPLICATE、4 STOP_ALL_ACCEPTED。RejectReason 与 TaskState/Result 以移动矩阵“枚举定义”页为准。`0x301` Byte5 bit5 表示原生动态模式正在执行。 RejectReason:0 NONE、1 BAD_DLC、2 BAD_VERSION、3 BAD_OPCODE、4 BAD_MOTOR、5 BAD_DIRECTION、6 PARAM_RANGE、7 POSITION_INVALID、8 SEQUENCE_OLD、9 BUSY_SAME_MOTOR、10 INTERLOCK、11 FAULT_ACTIVE、12 SERVICE_MODE_REQUIRED、13 CAL_DATA_INVALID、14 INTERNAL_ERROR。 TaskState:0 IDLE、1 ACCEPTED、2 POSITION_RUN、3 TIMED_RUN、4 CALIBRATION、5 STOPPING、6 COMPLETE、7 FAULT。Result:0 NONE、1 RUNNING、2 OK、3 STOPPED_BY_CMD、4 ENDPOINT_REACHED、5 STALL、6 TIMEOUT、7 DRIVER_FAULT、8 HALL_FAULT、9 INVALID_CMD、10 INTERLOCKED、11 CALIBRATION_FAILED。 -### 3.4 本地位置记忆(SMV8) +### 3.4 原生动态模式时序 + +- ModeID 1“木马模式”revision 13:入口 Hall `[320,190,500,430]`;向前俯摆到`[270,250,460,400]`,再向后仰摆到`[370,130,540,460]`,随后在两个端点间连续往复。M1峰峰行程120 Hall;M0峰峰行程100 Hall,以更大的水平速度和行程补偿M1斜向运动;每阶段先到目标前8 Hall会合,再以50% Duty完成等距末段,单段15 s仅作为无到位安全上限。 +- ModeID 2“动态摇篮”revision 13:Step 1入口 Hall `[391,140,405,404]`;Step 1→Step 2四轴从阶段开始全程联动并以位置会合方式到`[246,281,701,494]`;Step 2→Step 3同步返回`[391,140,405,404]`。阶段完成条件是四轴全部目标到位,不再声明或等待固定30 s,也不允许任一轴延迟到末段追赶。 +- 两种模式的每个运动阶段均在同一调度批次启动四轴;木马巡航占空比M0/M1/M2/M3为90/90/90/50%,动态摇篮为50/50/90/50%,到会合点后再同步执行等距末段。起动与到位离散均要求不大于1.0 s。 +- Step 3与下一轮Step 1的坐标完全相同,因此该边界物理位移为0;ECU原子递增CycleIndex并立即同步启动下一轮Step 1→Step 2,不伪造一次零位移电机启动。 +- 四轴命令同时启动,动态目标容差为±3 Hall。底层5 s无运动、堵转、驱动故障和最终到位超时仍会立即或在其既定保护时间内全停,并令`0x306.State=FAULT`。 +- `STOP_DYNAMIC(0x0F)`和`STOP_ALL(0x09)`都必须终止循环;未收到停止指令时,ECU从启动命令起累计600 s后自动执行同等安全停止。正常或到时停止后`0x306`回到全零IDLE。 + +### 3.5 本地位置记忆(SMV8) - 两个128-byte Work Flash 小扇区交替保存,记录含 Magic/Version、单调 Sequence、Clean标志、四轴绝对 Hall、MaxHall、最大速度、累计 Hall 上升沿、物理绝对量、PositionValid 和 CRC32。 - 每个动作命令真正启动前先写入较新 dirty 记录;写完才允许 PWM 启动。若此时掉电,新记录阻止旧 clean 位置被恢复。 @@ -109,7 +121,8 @@ TaskState:0 IDLE、1 ACCEPTED、2 POSITION_RUN、3 TIMED_RUN、4 CALIBRATION 5. 每轴 300~500 ms 正反向点动并目视签字确认映射。 6. 单轴定时、同轴换向、单轴停止和四轴并发互不干涉。 7. 已知量程回最近端、每次移动结束保存、正常掉电恢复、运动中掉电失效及恢复、绝对/相对位置精度。 -8. 堵转、驱动故障、CAN bus-off、C-SPY 结束和看门狗路径。 +8. `07_dynamic_modes.py`:完整验证两个原生动态模式的命令ACK、0x306阶段顺序、阶段时长、四轴启动/到位离散度、自动跨周期和停止。 +9. 堵转、驱动故障、CAN bus-off、C-SPY 结束和看门狗路径。 每个阶段开始前先发送全停,结束后再次发送全停。任何实物动作与预期不符时停止后续用例。 @@ -152,7 +165,20 @@ TaskState:0 IDLE、1 ACCEPTED、2 POSITION_RUN、3 TIMED_RUN、4 CALIBRATION - 重复帧只返回 DUPLICATE,不产生第二次动作;旧 Sequence 拒绝且输出不变;旧 Sequence 的 STOP_ALL 仍必须执行。 - 未标定时绝对/相对位置命令拒绝,CurrentPosition=`0xFFFF`;定时命令仍可用。 -### 6.4 标定与位置 +### 6.4 动态模式 + +- 动态摇篮revision 13不使用固定30 s/60 s完成条件;Step 1→2和Step 2→3只在四轴全部进入±3 Hall目标带后切换,单段保护上限30 s。四轴启动离散度和最终到位离散度均不大于1.0 s;水平与靠背均达到25%行程时,坐盆归一化进度必须不小于15%,用于阻止末段追赶回归。 +- 木马模式不设置停驻阶段;前俯与后仰只在四轴全部进入±3 Hall目标带后反向,单段保护上限15 s。入口只用于建立中间姿态,验收必须额外观察至少一个后仰→前俯→后仰的完整稳态循环。 +- 台架轴在标称时间尚未到位时,只有Hall正常进展且在30 s窗口内到达精确目标才可继续循环;不得虚报到位或省略目标。无Hall进展、堵转、驱动故障或超过窗口必须进入FAULT并全停。 +- 2026-08-04已验证公共动态运行时单次连续运行600.024 s后自动回到全零IDLE且无FAULT;循环中`STOP_DYNAMIC(0x0F)`也可立即安全停止。该公共安全逻辑由两个当前模式共用。 +- 当前台架动态摇篮在向前收拢时由M1坐盆轴触发STALL;`0x306`故障位为`0x2`。独立单轴90%固定占空比复测同样在约45.2%(Hall约169)失速,无法到达75%(281 pulse)目标,证明阻断点不在动态调度。修复机构卡滞、负载、供电/驱动或Hall问题前,不得屏蔽堵转保护、降低需求目标或伪造循环PASS。 +- 2026-08-04 revision 9重新设计并先执行M1已知量程回近端:Hall 169连续回到0,Near/PositionValid有效且MaxHall保持374。随后Step 1→2实测17.329 s,四轴启动/到位离散0.077/0.338 s;Step 2→3实测15.155 s,离散0.079/0.495 s;目标分别精确到`[246,281,701,494]`和`[391,140,405,405]`,CycleIndex进入1且无FAULT。下一轮四轴重新启动离散0.082 s,停止后`0x306`全零,PASS。 +- 2026-08-04 revision 10移除M1延迟追赶后,Step 1→2在水平进度25.5%、靠背35.3%时坐盆已达44.0%;Step 2→3在水平25.5%、靠背28.7%时坐盆已达39.0%。启动离散0.070/0.050 s,到位离散0.342/0.339 s,目标精确、下一轮启动离散0.051 s、无FAULT、停止全零,PASS。 +- 2026-08-04 revision 11木马模式实测稳态前俯/后仰启动离散0.080/0.079 s,到位离散0.234/0.232 s;水平到25%时坐盆已达41.7%/36.7%,目标误差不超过1 Hall,稳态完整周期约9.0 s。自动进入下一轮且停止后`0x306`全零,PASS。 +- 2026-08-04 revision 12木马模式把坐盆峰峰行程由60增至120 Hall,实测稳态前俯/后仰启动离散0.054/0.081 s,到位离散0.389/0.182 s;水平到25%时坐盆已达46.6%/35.8%,目标误差不超过2 Hall,稳态完整周期约9.2 s。自动进入下一轮、无FAULT且停止后`0x306`全零,PASS。 +- 2026-08-04 revision 13木马模式把M0峰峰行程由60增至100 Hall、巡航Duty由50%增至90%。按实测MaxHall=499换算水平峰峰行程约43.1 mm,扣除M1斜向行程估算的16.4 mm反向水平分量后净水平摆幅约26.7 mm。稳态前俯/后仰启动离散0.077/0.052 s,到位离散0.337/0.182 s;巡航检查点四轴均持续推进,目标误差不超过1 Hall,自动续环、无FAULT且停止全零,PASS。 + +### 6.5 标定与位置 - 每轴按负端→正端完成,标定中 `0x301 SystemState=CALIBRATION`、Byte5 bit6=1,`0x302 TaskState=CALIBRATION`,周期反馈不中断。 - MaxHallCount 软件允许范围(实测值的70%~130%):M0 336~624,M1 261~486,M2 641~1192,M3 452~841,且大于等于8。台架目标值分别为480、374、917、647;超出允许范围标定失败。 diff --git a/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c b/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c index d56ae00..caae00c 100755 --- a/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c +++ b/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c @@ -74,6 +74,10 @@ #define MOTOR_SPEED_CONTROL_START_DELAY_MS (500ul) #define MOTOR_SPEED_CONTROL_CHECK_MS (100ul) #define MOTOR_SPEED_CONTROL_WINDOW_MS (500ul) +#define MOTOR_SPEED_PROGRESS_CONTROL_START_MS (100ul) +#define MOTOR_SPEED_CONTROL_MIN_DUTY_PERCENT (5u) +#define MOTOR_SPEED_CONTROL_PAUSE_DUTY_PERCENT (0u) +#define MOTOR_SPEED_PROGRESS_TOLERANCE_PULSES (1ul) #define MOTOR_SPEED_CONTROL_HISTORY_SAMPLES \ (MOTOR_SPEED_CONTROL_WINDOW_MS / MOTOR_SPEED_CONTROL_CHECK_MS) #define MOTOR_SPEED_TOLERANCE_PERCENT (10ul) @@ -210,6 +214,11 @@ #error "MOTOR_SPEED_CONTROL_WINDOW_MS must be a multiple of the speed check period." #endif +#if ((MOTOR_SPEED_CONTROL_MIN_DUTY_PERCENT == 0u) || \ + (MOTOR_SPEED_CONTROL_MIN_DUTY_PERCENT >= MOTOR_SPEED_MIN_DUTY_PERCENT)) +#error "Adaptive speed duty must be below the fixed-duty command minimum." +#endif + #if ((MOTOR_PWM_DUTY_PERCENT < MOTOR_SPEED_MIN_DUTY_PERCENT) || \ (MOTOR_PWM_DUTY_PERCENT > MOTOR_SPEED_MAX_DUTY_PERCENT)) #error "The default motor duty must stay inside the speed-control duty limits." @@ -711,9 +720,9 @@ static bool Motor_CalculateSpeedPlan(uint32_t motorIndex, profile->speedStepPpsX100 - 1ul) / profile->speedStepPpsX100; initialDuty = dutySteps * MOTOR_SPEED_DUTY_STEP_PERCENT; - if(initialDuty < MOTOR_SPEED_MIN_DUTY_PERCENT) + if(initialDuty < MOTOR_SPEED_CONTROL_MIN_DUTY_PERCENT) { - initialDuty = MOTOR_SPEED_MIN_DUTY_PERCENT; + initialDuty = MOTOR_SPEED_CONTROL_MIN_DUTY_PERCENT; } else if(initialDuty > MOTOR_SPEED_MAX_DUTY_PERCENT) { @@ -1187,6 +1196,21 @@ static void Motor_SafetyTaskFromIsr(void) continue; } + /* Long synchronized trajectories use pulse-density control whenever + * their requested speed is below the loaded mechanism's proven 50% + * breakaway duty. A zero-duty pause is intentional de-energization, + * not a no-motion fault. The absolute task/phase deadline still + * bounds the pause, and the activity window is reset when drive + * resumes. */ + if((false != state->speedControlEnabled) && + (state->speedCurrentDutyPercent == + MOTOR_SPEED_CONTROL_PAUSE_DUTY_PERCENT)) + { + state->lowHallTracking = false; + state->stallCurrentTracking = false; + continue; + } + if(false != state->calibrating) { state->lowHallTracking = false; @@ -1804,6 +1828,14 @@ static void Motor_CommitPreparedHardwareStartUnsafe(uint32_t motorIndex) (false == state->calibrating)) { dutyPercent = state->speedInitialDutyPercent; + /* Dynamic trajectories may need a low steady-state PWM to stretch a + * short Hall travel over tens of seconds. Give every loaded axis the + * proven 50% breakaway pulse first; after the 500 ms measurement delay + * the closed loop may ramp below the public fixed-duty command floor. */ + if(dutyPercent < MOTOR_SPEED_MIN_DUTY_PERCENT) + { + dutyPercent = MOTOR_SPEED_MIN_DUTY_PERCENT; + } } state->speedCurrentDutyPercent = dutyPercent; Motor_ResetSpeedMeasurementUnsafe(state); @@ -2302,6 +2334,9 @@ static void Motor_SpeedControlService(uint32_t motorIndex) uint32_t elapsedMs; uint32_t actualPpsX100; uint32_t targetPpsX100; + uint32_t planElapsedMs; + uint32_t plannedProgressPulses; + uint32_t actualProgressPulses; uint32_t savedIntrStatus; uint8_t historyIndex; uint8_t newDutyPercent; @@ -2347,6 +2382,39 @@ static void Motor_SpeedControlService(uint32_t motorIndex) state->speedLastSampleTicks = nowTicks; elapsedTicks = (uint32_t)(nowTicks - baseTicks); + planElapsedMs = MOTOR_TICKS_TO_MS( + (uint32_t)(nowTicks - state->speedControlStartTicks)); + if(planElapsedMs > state->speedDurationMs) + { + planElapsedMs = state->speedDurationMs; + } + plannedProgressPulses = (uint32_t) + (((uint64_t)state->speedPlannedHallPulses * planElapsedMs + + (state->speedDurationMs / 2ul)) / state->speedDurationMs); + actualProgressPulses = rawEdges - state->speedBaselineRawEdges; + + /* Loaded axes need a short 50% breakaway pulse, but waiting for the full + * 500 ms speed window lets a short-travel axis build an unrecoverable + * lead. Position progress is meaningful from the first 100 ms sample, + * so de-energize an already-ahead axis immediately. Driving it at an + * arbitrary sub-breakaway duty can create current without Hall progress + * and was the cause of false cradle STALLs. */ + if(((uint32_t)(nowTicks - state->speedControlStartTicks) >= + MOTOR_MS_TO_TICKS(MOTOR_SPEED_PROGRESS_CONTROL_START_MS)) && + (actualProgressPulses > + (plannedProgressPulses + MOTOR_SPEED_PROGRESS_TOLERANCE_PULSES))) + { + if(state->speedCurrentDutyPercent != + MOTOR_SPEED_CONTROL_PAUSE_DUTY_PERCENT) + { + state->speedCurrentDutyPercent = + MOTOR_SPEED_CONTROL_PAUSE_DUTY_PERCENT; + Motor_ApplyDutyPercent(motorIndex, + MOTOR_SPEED_CONTROL_PAUSE_DUTY_PERCENT); + } + Cy_SysLib_ExitCriticalSection(savedIntrStatus); + return; + } if(((uint32_t)(nowTicks - state->speedControlStartTicks) < MOTOR_MS_TO_TICKS(MOTOR_SPEED_CONTROL_START_DELAY_MS)) || (elapsedTicks < MOTOR_MS_TO_TICKS(MOTOR_SPEED_CONTROL_WINDOW_MS))) @@ -2369,11 +2437,43 @@ static void Motor_SpeedControlService(uint32_t motorIndex) newDutyPercent = state->speedCurrentDutyPercent; state->speedActualPpsX100 = actualPpsX100; - if((((uint64_t)actualPpsX100) * 100ull) < - (((uint64_t)targetPpsX100) * - (100ul - MOTOR_SPEED_TOLERANCE_PERCENT))) + /* Speed-only regulation cannot synchronize very short and long axes: the + * loaded motor breakaway pulse puts a short travel several seconds ahead + * even when its eventual speed is correct. Track the time-position line + * as well. An axis ahead of the line drops immediately to the adaptive + * floor; an axis behind it ramps up. Within one Hall pulse, the ordinary + * measured-speed loop keeps each energized burst bounded. */ + if(actualProgressPulses > + (plannedProgressPulses + MOTOR_SPEED_PROGRESS_TOLERANCE_PULSES)) { - if(newDutyPercent < MOTOR_SPEED_MAX_DUTY_PERCENT) + newDutyPercent = MOTOR_SPEED_CONTROL_PAUSE_DUTY_PERCENT; + } + else if((actualProgressPulses + MOTOR_SPEED_PROGRESS_TOLERANCE_PULSES) < + plannedProgressPulses) + { + if(newDutyPercent < MOTOR_SPEED_MIN_DUTY_PERCENT) + { + newDutyPercent = MOTOR_SPEED_MIN_DUTY_PERCENT; + } + else if(newDutyPercent < MOTOR_SPEED_MAX_DUTY_PERCENT) + { + newDutyPercent = (uint8_t) + (newDutyPercent + MOTOR_SPEED_DUTY_STEP_PERCENT); + if(newDutyPercent > MOTOR_SPEED_MAX_DUTY_PERCENT) + { + newDutyPercent = MOTOR_SPEED_MAX_DUTY_PERCENT; + } + } + } + else if((((uint64_t)actualPpsX100) * 100ull) < + (((uint64_t)targetPpsX100) * + (100ul - MOTOR_SPEED_TOLERANCE_PERCENT))) + { + if(newDutyPercent < MOTOR_SPEED_MIN_DUTY_PERCENT) + { + newDutyPercent = MOTOR_SPEED_MIN_DUTY_PERCENT; + } + else if(newDutyPercent < MOTOR_SPEED_MAX_DUTY_PERCENT) { newDutyPercent = (uint8_t) (newDutyPercent + MOTOR_SPEED_DUTY_STEP_PERCENT); @@ -2400,6 +2500,10 @@ static void Motor_SpeedControlService(uint32_t motorIndex) newDutyPercent = MOTOR_SPEED_MIN_DUTY_PERCENT; } } + else if(newDutyPercent != MOTOR_SPEED_CONTROL_PAUSE_DUTY_PERCENT) + { + newDutyPercent = MOTOR_SPEED_CONTROL_PAUSE_DUTY_PERCENT; + } } else { @@ -2408,6 +2512,15 @@ static void Motor_SpeedControlService(uint32_t motorIndex) if(newDutyPercent != state->speedCurrentDutyPercent) { + if((state->speedCurrentDutyPercent == + MOTOR_SPEED_CONTROL_PAUSE_DUTY_PERCENT) && + (newDutyPercent >= MOTOR_SPEED_MIN_DUTY_PERCENT)) + { + /* Resume gets a fresh 500 ms activity window, matching a normal + * hardware start. This prevents the first loaded-current sample + * from being compared with the intentionally quiet pause. */ + Motor_ResetActivityWindowUnsafe(state); + } state->speedCurrentDutyPercent = newDutyPercent; Motor_ApplyDutyPercent(motorIndex, newDutyPercent); } diff --git a/firmware/t2g/Seat_Controller_demo/IAR/Seat_Controller_demo.ewp b/firmware/t2g/Seat_Controller_demo/IAR/Seat_Controller_demo.ewp index ea9e06c..d4ecfd8 100755 --- a/firmware/t2g/Seat_Controller_demo/IAR/Seat_Controller_demo.ewp +++ b/firmware/t2g/Seat_Controller_demo/IAR/Seat_Controller_demo.ewp @@ -2275,6 +2275,12 @@ $PROJ_DIR$\..\App\seat_move_application.h + + $PROJ_DIR$\..\App\seat_dynamic_mode.c + + + $PROJ_DIR$\..\App\seat_dynamic_mode.h + $PROJ_DIR$\..\App\seat_move_store.c diff --git a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex index b20cff6..6729950 100755 --- a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex +++ b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex @@ -1,12 +1,12 @@ :020000041000EA -:100000000000022809D4001095DB0010CDD80010A4 +:100000000000022879E10010B1E90010CDE60010EF :1000100000000000000000000000000000000000E0 -:100020000000000000000000000000008DD900105A -:10003000000000000000000099DB00109DDB0010B4 -:10004000D5CD0010F9CD00101DCE001041CE00100E -:1000500065CE001089CE0010ADCE0010D1CE0010BC -:10006000A1DB0010A5DB0010A9DB0010ADDB001048 -:10007000B1DB0010B5DB0010B9DB0010BDDB0010F8 +:100020000000000000000000000000008DE700104C +:100030000000000000000000B5E90010B9E9001060 +:1000400045DB001069DB00108DDB0010B1DB001018 +:10005000D5DB0010F9DB00101DDC001041DC0010C6 +:10006000BDE90010C1E90010C5E90010C9E90010A0 +:10007000CDE90010D1E90010D5E90010D9E9001050 :1000800000B5010009B2002905D40121C006C00E47 :100090008140C648016000BD00B5010009B20029D9 :1000A00005D40121C006C00E8140C148016000BDD9 @@ -31,8 +31,8 @@ :1001D00081218900405870470168802212060A4335 :1001E0000260704780B5FFF7ADFF02BD80B5FFF735 :1001F000AFFF01BD80B5FFF7CBFF02BD80B5FFF7B4 -:10020000D8FF01BD80B503F0B2FD02BD80B503F09B -:10021000C0FD02BD00B5022801D301200FE00B0094 +:10020000D8FF01BD80B503F046FE02BD80B503F006 +:1002100054FE02BD00B5022801D301200FE00B00FF :10022000DBB2042B01DB012009E0B34B800018187E :10023000C9B2405C824201D3012000E0002000BD31 :10024000F8B504001F00022C01D3012023E01500A3 @@ -74,11 +74,11 @@ :10048000AD4B1340F6B23202C0218900114019432E :10049000FF229143EAB20A4361034250610340588C :1004A000002070BDDCB506000F0010001900069C8E -:1004B0004901C20E1143400132003B0003F07DFCB4 +:1004B0004901C20E1143400132003B0003F011FD1F :1004C000060091204000FFF779FFF106C90E009168 :1004D00071090B051B0D5B1E2200D2B20321C0B2B5 :1004E000FFF7F8FED3BD80B51300A74A13600023C1 -:1004F000137203F028FD01BD98DA001000B5C0B2F8 +:1004F000137203F0BCFD01BD98E8001000B5C0B256 :10050000042801D2012000E00020C0B200BD00B5E7 :10051000401A00B2012801DB012000E00020C0B237 :1005200000BD00B5BE490978002901D000201FE0B8 @@ -86,9 +86,9 @@ :10054000891D415C002908D1FC214058002801D1B7 :10055000012000E00020C0B20AE08021490041589B :10056000FC228058814201D1012000E00020C0B26D -:1005700000BD00B5C0B264214843642103F022FDF0 +:1005700000BD00B5C0B264214843642103F0B6FD5C :1005800000BD10B504000800C0B2FFF7F2FF010083 -:10059000A448A2018018406903F0F9FE10BD0000D4 +:10059000A448A2018018406903F08DFF10BD00003F :1005A00000000440FF00FFFF10B40021B42281507E :1005B0009D4A1368BC2403511268C023C2500268CC :1005C000C423C2500A00F023C254F122815410BC4B @@ -97,16 +97,16 @@ :1005F000099B002B11D00A9B002B0ED00092009A71 :10060000002A0AD0002808D0E26A824205D30A00F4 :10061000002A02D0616B002901D1002054E00021A2 -:10062000002303F0BDFE06000F00E06A4008002131 -:1006300080197941E26A002303F0BFFB0500300016 -:1006400039007A4A002303F0ABFE06000F00E06A8F -:100650000021009A002303F0A3FE02000B00009685 +:10062000002303F051FF06000F00E06A400800219C +:1006300080197941E26A002303F053FC0500300081 +:1006400039007A4A002303F03FFF06000F00E06AFA +:100650000021009A002303F037FF02000B000096F0 :100660000197100019004008CE0730434908009E4A -:10067000019F8019794103F0A0FB0600002D0BD0EB +:10067000019F8019794103F034FC0600002D0BD056 :10068000002E09D0BE4802998422520051434018DE :10069000B8214058B04201D2002015E0606B3018FC -:1006A000401E616B03F08EFC05214843322801D2C5 -:1006B000322002E0602800D35F2008990D6009997C +:1006A000401E616B03F022FD05214843052801D25D +:1006B000052002E0602800D35F2008990D600999A9 :1006C0000E600A9908700120FEBD80B55549800171 :1006D0000818016AC069FFF727FD002801D0012032 :1006E00000E00020C0B202BD10B44F490A68426267 @@ -120,16 +120,16 @@ :100760008E21415C00290BD08F21415C002907D0EC :100770002D490968806B081A332801D2012000E056 :100780000020C0B200BD00002C120028F8B503F014 -:1007900022FF002801D1002041E0002425002EE0A6 +:10079000B6FF002801D1002041E0002425002EE012 :1007A00084214900764A6846038828004843101887 :1007B0007426835368460388280048431018762619 :1007C0008353230028004843101878268353164883 :1007D0000368280048431018836323002800484317 :1007E00010188726835501231E002800484310183F :1007F0008E27C655694350188F2143546D1C042D14 -:1008000008D269462800C0B203F074FF0028C7D19F +:1008000008D269462800C0B204F008F80028C7D111 :10081000002004E004480068934908600120F2BD0C -:100820004C1C00283CCF0010901B0028A086010023 +:10082000B01C0028ACDC0010F01B0028A0860100E2 :10083000FEB58D488D4909680268891A052900D2DC :100840009DE08A4909680160002452E0D2B2002A82 :100850003ED02000704328187621405A072141439A @@ -141,14 +141,14 @@ :1008B0008F23C05C0028C9D168460288200070439D :1008C00028187623C2522000704328188F228154A2 :1008D0002000704328187621415A68460088FFF7A7 -:1008E0002DFF6643A91978228852019804F004F874 -:1008F000641C042C43D269462000C0B203F0FAFE07 -:10090000002825D103F0F4FF84225200584B210027 +:1008E0002DFF6643A91978228852019804F094F8E4 +:1008F000641C042C43D269462000C0B203F08EFF72 +:10090000002825D104F084F884225200584B21009D :10091000514359188725495DFF290AD021005143C9 :10092000591887254D5D6D1C2100514359188726A4 :100930008D552100514359188725495D032904D35A -:10094000002162439A188E23D15403F0D5FFCFE7DC -:1009500003F0CEFF019084267600454D20007043C1 +:10094000002162439A188E23D15404F065F8CFE752 +:1009500004F05EF8019084267600454D2000704337 :1009600028187E21405C002884D12000704328187C :100970009421405C002800D07CE701227BE7F7BD92 :100980000813002810B53A4A84235B004343D21869 @@ -159,16 +159,16 @@ :1009D000135502E000237F2413558A23D35C972408 :1009E00013558223D15400218A23D1549423D15406 :1009F0007E21515C002905D0D34980010818406947 -:100A000003F083FF10BD38B5002429E0CF4B13E07D +:100A000004F013F810BD38B5002429E0CF4B13E0F3 :100A100084214900164A2000484310188B23C05CEB :100A20000028F3D020004843101880690028EDD03A :100A30002000484310188369200048431018962569 :100A4000405D00280BD0094800686143511849698E :100A5000401A984203D305212000FFF793FF641C3E -:100A6000042CD5D331BD00009C1B0028901B00280E +:100A6000042CD5D331BD0000FC1B0028F01B00284E :100A700008130028F8B500273C0061E1B44AB248E9 :100A8000A1014018016AB048A301C018C06903F071 -:100A90005AFA84256D00AF4E20006843375020007D +:100A9000EEFA84256D00AF4E2000684337502000E9 :100AA0006843301847602000684330188760A648C4 :100AB000A1014018816A200068433018C1602000FD :100AC00068433018076120006843301847612000F0 @@ -211,13 +211,13 @@ :100D10003900200068433018FF22921D81543900A9 :100D20002000684330188322520081542000684319 :100D30003018FFF739FC65437019FFF7D5FC641CC8 -:100D4000042C00D29AE6F1BD3CCF0010B888000018 -:100D5000941200280813002870B50600B6488421B4 +:100D4000042C00D29AE6F1BDACDC0010B88800009B +:100D5000941200280813002870B50600BF488421AB :100D60004900714344183000FFF7AFFC05008820AC :100D7000205C002805D1852025540120882160545D :100D80007EE028008521615CC0B2884268D060683E :100D9000401C60607E20205C002806D19520205CED -:100DA000002802D0C048006820622800C0B2002895 +:100DA000002802D07348006820622800C0B20028E2 :100DB00054D02068401C20607E20205C0100C9B215 :100DC000002905D19521615C002901D08120205C9A :100DD0000100C9B2012918D18920205C002808D15E @@ -229,13 +229,13 @@ :100E3000002813D07E20205C012803D1A0682169FE :100E4000884207D27E20205C022807D12069A16851 :100E5000884203D301213000FFF794FD85202554FB -:100E60009520205C00280BD08F480068216A401A2A +:100E60009520205C00280BD042480068216A401A77 :100E7000322805D3002001009522A154812160541D -:100E800070BD70B56C498422520042438C187E219B -:100E9000615C00296CD08D21615C00292CD1824ECF -:100EA0003568964980010818806B0021FA2292006B -:100EB000002303F075FA02000B009148002180180E -:100EC0005941FA22D200002302F077FF616A691AC1 +:100E800070BD70B575498422520042438C187E2192 +:100E9000615C00296CD08D21615C00292CD1354E1C +:100EA00035689E4980010818806B0021FA22920063 +:100EB000002303F009FB02000B0099480021801871 +:100EC0005941FA22D200002303F00BF8616A691A33 :100ED00081424DD301208D216054306820636068C9 :100EE00060630020206701007A22A15201007C2269 :100EF000A1528C2160543BE07C20205A0A2810D259 @@ -244,3310 +244,3536 @@ :100F20000FE07A20205A80B280002018806C7A214D :100F3000615A626889B2890061188A646168081A16 :100F400020677A20205A401C010089B20A2900D368 -:100F500000207A2160527C20205A0A2808D3524867 +:100F500000207A2160527C20205A0A2808D30548B4 :100F60000068216B401AFA2802D301208C216054BA -:100F700070BD000070B50026340019E030009021EB -:100F8000685430009121685411E030009121685478 -:100F90008220285C00280AD143480068E96B401A87 -:100FA0009249884203D305212000FFF7EBFC641C23 -:100FB000042C77D220488421490061434518200041 -:100FC000FFF75FFF7E20285C002807D08220285C86 -:100FD000002803D18C20285C002800D1E7E78B2073 -:100FE000285C002814D030009021685430009121F2 -:100FF0006854286F00280AD17E20285C022801D17D -:10100000022100E00321C9B22000FFF7BBFCCEE7BC -:10101000286F0328B2D22000FFF79CFBC0B2002843 -:101020000CD07820285A3549A2018918898F884226 -:1010300004D3012003E000BF0813002830009021F2 -:10104000695C00290BD101219022A9541649096835 -:10105000E9636968296431009122A95408E069684C -:101060002A6C914204D0696829640F490968E963D0 -:10107000C0B2002889D09120285C002806D1012028 -:101080009121685408480068686481E70648006850 -:10109000696C401A642800D27AE704212000FFF727 -:1010A00071FC75E770BD0000901B002838B59C4CA2 -:1010B000200003F049FD00281BD0200003F049FD6B -:1010C00098480168491C01600024250003E02800BD -:1010D000FFF742FE6D1C042DF9D3FFF794FCA548E1 -:1010E0000168491C01600168192902D30460FFF7F7 -:1010F00041FF31BD8B480068704700003CCF0010B5 -:10110000CF07000070B528250026340009E0022230 -:1011100001219948A301C0181823C05EFFF752F9B6 -:10112000641C042CF3D302220121FF204230FFF77C -:1011300049F9914C1820205EFFF740F92B005B1E07 -:1011400002220121C0B2FFF77BF81820205EFFF7D2 -:1011500035F902220121C0B2FFF774F9350011E020 -:101160008649A8012018406902F084FFA8012018D0 -:10117000406903F0FFF80021A8012018406903F03E -:101180000AF96D1C042DEBD3012420007C49087062 -:101190006448066077480660614E7A49300003F083 -:1011A000BBFB300003F0D5FC300003F0C7FC764DEC -:1011B000280003F0D7FC75490020285E03F0F1FCFD -:1011C00003210220285EFEF773FF0220285EFEF74F -:1011D00063FF0220285EFEF753FF300003F0A8FCF7 -:1011E000300003F08CFBAB48047070BDC4090000F4 -:1011F000F8B500220121A848FFF775F90122022164 -:10120000A648FFF770F900220121A548FFF76BF906 -:10121000A44D012201212800FFF765F900220021D9 -:10122000A148FFF760F9A14C002204212000FFF73C -:101230005AF9002205212000FFF755F9002200216C -:101240002800FFF750F9FFF715FC99480090082097 -:1012500000990860974E13243470974FBF4A0021BD -:10126000380002F070FE0625009805603470BB4A15 -:101270000121380002F067FE009805603470B74A1B -:101280000221380002F05FFEF1BD78B58DB06846EE -:10129000B349342203F098FC3948007800280BD079 -:1012A000B04803F032FBB04803F02FFBAF4803F027 -:1012B0002CFBAF4803F029FB7B4E6A46002130002F -:1012C00002F041FE794D6A460421280002F03BFEFF -:1012D0006A460521280002F036FE724C6A4600215B -:1012E000200002F030FE00213000FEF727FF04212D -:1012F0002800FEF723FF05212800FEF71FFF00212D -:101300002000FEF71BFF012000906A46012120000B -:1013100002F019FE01212000FEF70CFF0EB070BD97 -:10132000000A5840901B00281CB59124640001223B -:1013300003212000FFF746F8012000908D4A00238A -:101340008D480021FFF7AEF82000FFF737F80122A3 -:101350000321C0B2FFF776F8884C200003F096FD19 -:1013600000228749200003F057FC2000FEF734FFDD -:1013700013BD0000941B00283CCF001094D3001034 -:101380004A1C002844D60010A0DA0010AD1000104E -:10139000F2B5060000273C000098002801D100208B -:1013A00077E038000099088003F0A2FACD49097867 -:1013B000002903D003F0A0FA00206AE00121C94A05 -:1013C000117003F099FA6D4D2800FEF70FFF280009 -:1013D000FEF714FF02213148FEF7B0FE012003F0B2 -:1013E000DDFDB6B231002800FEF710FF01283ED126 -:1013F000BD4E00E0761E2800FEF7FCFE002801D15D -:10140000002EF7D12800FEF7F5FE00282FD0B64EAB -:1014100000E0761E2800FEF7E5FE002801D1002E30 -:10142000F7D12800FEF7DEFE002820D00122009927 -:101430002800FEF7E7FE012819D1C020000200991C -:1014400009880140814201D1012400E03C002000D4 -:10145000C0B200280BD0A5480078002807D000981B -:101460000088FC2189010140002900D03C000120B6 -:1014700003F094FD02210948FEF75CFE012003F011 -:101480008DFD03F035FA97490F7003F035FA20000F -:10149000C0B2F2BD491C002880013140800F3140AC -:1014A00080043140000431408000314080023140EE -:1014B00064120028681200280003314080B5C0B2D1 -:1014C0000202FC2080011040C9B20843694680B284 -:1014D000FFF75EFF02BD1CB50C00C0B20002FC218C -:1014E000890101408020C0010843002C05D06946D5 -:1014F00080B2FFF74DFF002801D1002003E06846CD -:1015000000882070012016BD38B505000C002100B0 -:10151000C9B22800C0B2FFF7D1FF002801D10020D6 -:101520000FE069462800C0B2FFF7D5FF002806D0BB -:1015300068460078E4B2A04201D1012000E000201A -:10154000C0B232BD80B5B44A00211160017C117275 -:10155000C168806802F0F7FC01BD0000601200283D -:1015600010D8001000065840800658400007584028 -:101570008009584000B4C4040024F4000000644012 -:1015800094D60010F8B50126300000246846047097 -:10159000564804700121A148FEF7CCFDC24F01213D -:1015A0003800FEF7C7FD9E4D280003F0F7FC01212F -:1015B0009C48FEF7BFFD280003F0F0FC0221082044 -:1015C000FFF7A2FF05002800C0B2002804D00021C8 -:1015D0000920FFF799FF05002800C0B2002804D0B9 -:1015E00000210A20FFF790FF05002800C0B2002864 -:1015F00004D00F210B20FFF787FF05002800C0B2A1 -:10160000002804D0A5210C20FFF77EFF050028004C -:10161000C0B2002804D000210D20FFF775FF05009F -:101620002800C0B2002804D000210E20FFF76CFF74 -:1016300005002800C0B2002808D087210720FFF746 -:101640003DFF0500FA20800003F0A8FC2800C0B28E -:10165000002804D086210720FFF756FF0500280048 -:10166000C0B200280ED069460020FFF734FF0028E2 -:1016700007D068460078BF210140802901D135009C -:1016800000E025002800C0B2002810D0A148047056 -:10169000B7480470B748047014480670B64800682C -:1016A000B649086001213800FEF748FD07E0B1485F -:1016B00006700E48047001213800FEF73BFD28003B -:1016C000C0B2F2BD10B50400534A00201060107281 -:1016D000E168A06802F037FCE168A068FEF72EFD23 -:1016E00010BD00004E1C0028A0860100511C0028DF -:1016F000F8B5012420009F49087000252800A7495B -:10170000087001216848FEF715FD2E000FE0A4487F -:101710000078002805D0A348B1014018406903F0C3 -:10172000F4F8A048B1014018FFF7CCFF761C042E56 -:10173000EDD303F0DDF80090280044E02A0011E02A -:10174000B64984225200424389188A228A5C002AC0 -:1017500007D197228A5C002A03D198228A5C002A4A -:10176000ECD022002B007E268B552B007F268B553C -:101770002B0080268B552B0082268B550723832632 -:101780008B552E008A27CE552E008B27CE552E0046 -:101790009427CE552E009527CE552E009627CE5550 -:1017A0002E009727CE552E008927CE55D2B2002A7B -:1017B00008D084228B549C228A58A023CA5022002D -:1017C0009823CA54401C0428BAD3009803F094F814 -:1017D000F1BD80B57148007800280AD065480078CE -:1017E000002806D1654864490A680368D21A192A94 -:1017F00000D20FE00968016069460020FFF76BFE28 -:10180000002805D068460078BF210140802901D01A -:10181000FFF76EFF01BD0000C812002880013140B3 -:10182000102700008004314070B55E4A8001101816 -:10183000504A1278002A01D0002034E02422825C31 -:10184000092A14D1334D2A782523C35C9A432523D2 -:10185000C45C0C4014432100C9B20920FFF754FEB8 -:1018600006003000C0B2002815D02C7013E0404DA7 -:101870002A782523C35C9A432523C45C0C40144377 -:101880002100C9B20A20FFF73FFE06003000C0B2B7 -:10189000002800D02C703000C0B2002801D1FFF722 -:1018A00027FF3000C0B270BD0004314038B50400DD -:1018B0003C48A1014518686903F027F82800FFF7A4 -:1018C00001FF00212000FFF7AFFF32BD70B505001A -:1018D0003448AA018618C9B2012902D12620345CF5 -:1018E00001E02720345C0F20E840C00701D400202D -:1018F0000FE0706903F009F83000FFF7E3FE210004 -:10190000C9B22800FFF790FF002801D1002000E0B5 -:10191000012070BD471C002870B504002148A101BA -:1019200045183E488421490061434018F421465C33 -:1019300083214900415C002905D08B21415C0029AD -:1019400001D1F221465CF3214654FEF72DFE310011 -:10195000C9B22000FEF715FE0021686902F01BFDE8 -:10196000686902F0CCFF2800FFF7ECFD70BD0000B5 -:10197000481C00284B1C0028901B0028981B00289E -:1019800000B50A00D2B2002A07D081228154AD49A5 -:101990000968016201219522815400BD511C002873 -:1019A0004A1C00283CCF0010842281549C214158BD -:1019B000A0228150012198228154704700B59C21BA -:1019C0004158491C9C2281509C214158002902D138 -:1019D00001219C22815000210A008423C254A022AC -:1019E00081509822815400BD00B58B21415C0029B3 -:1019F00004D08169002901D0816900E092499622D2 -:101A0000825C002A07D08F4A12684069101A884207 -:101A100001D3012000E00020C0B200BD081300285F -:101A200080B500217E2281547F22815480228154FE -:101A3000942281549522815481228154962281548A -:101A40008A228154972281540121832281540121C9 -:101A5000FFF7AAFF01BDF3B583B07C480399842248 -:101A600052005143441800206946087000250020A8 -:101A7000694648700027002069468870002602F0F9 -:101A800037FF01909420205C00284DD08220205CFC -:101A9000002849D16E480078002845D12000FEF783 -:101AA00040FD002840D06846007CC0B2002809D024 -:101AB00064480068E169401A322835D39520205CDB -:101AC000002831D12000FFF78FFF002804D0052126 -:101AD0000398FEF757FF27E08A20205C002808D0F3 -:101AE000A0682169884204D12000FFF799FF0127EF -:101AF0001AE08A20205C002807D0A068216988426B -:101B000001D2012003E0022001E08020205C694630 -:101B1000087068460078002803D0012069464870A4 -:101B200002E0002069464870019802F0E5FE3800A6 -:101B3000C0B2002803D00398FFF7B8FE80E06846E3 -:101B40004078002801D100207AE0684601780398A7 -:101B5000FFF7BCFE002801D1002071E002F0C8FEB2 -:101B600001909420205C002856D08220205C002820 -:101B700052D13748007800284ED12000FEF7D1FC22 -:101B8000002849D02000FFF72FFF002804D00521AE -:101B90000398FEF7F7FE3FE08A20205C002810D073 -:101BA000A0682169884204D12000FFF739FF01278E -:101BB00009E0A0682169884201D2012503E00225DD -:101BC00001E08020255C3800C0B200281CD128002C -:101BD00069460978C0B2884216D1684600787E21ED -:101BE00060540020802160549421605495216054F9 -:101BF000812160542000FEF777FD0398FFF78CFEEB -:101C000001266846867007E0FFB2002F03D18020CE -:101C10002554012600E00126019802F06DFE684679 -:101C2000807800280AD10A480078002804D1039857 -:101C3000FFF73CFE002801D1002001E03000C0B2D7 -:101C400005B0F0BD901B0028B888000008130028DC -:101C50004B1C0028F6B583B00D001F000400E4B251 -:101C60009C490978002916D0C0B2FEF747FC00282D -:101C700011D09948007800280DD1984800780028A4 -:101C800009D16846057068460078012805D0684685 -:101C90000078022801D001201AE102F029FE01900B -:101CA000842676008E4D2000704328188221405CE7 -:101CB000002806D1200070432818FEF732FC0028C7 -:101CC00004D1019802F018FE012001E120007043C8 -:101CD00028187E21415C0CA80078002813D10CA89C -:101CE00001700CA8007800280DD12000704328183E -:101CF0009522805C002806D020007043281881229D -:101D0000805C0CAA10700800C0B2002803D001202B -:101D10006A46507002E000206A4650700CA80078B5 -:101D200000280CD0C9B2002905D00CA8007869465B -:101D30000978884203D001206946887002E00020BB -:101D40006946887068464078002805D0C548A101DA -:101D50004018406902F0D9FD0A9902976846027C52 -:101D600000272000704328188223C75420007043A6 -:101D700028187F23C7542000704328188A23C25490 -:101D8000029B20007043281803612000704328182C -:101D90008B23C15420007043281897214754D2B296 -:101DA000002A08D00BA80078002804D02000704337 -:101DB0002818FFF703FE0D98C0B2002806D02000B7 -:101DC000704328189621405C002810D1A64801686D -:101DD0002000704328184161012120007043281819 -:101DE00096228154200070432818862147540BA85E -:101DF0000078002804D0200070432818832147541D -:101E00006846807800281ED02000704328187E2164 -:101E10004754684601782000704328188022815476 -:101E200091480168200070432818C16101212000F9 -:101E300070432818942281540CA801786643A8198D -:101E4000FFF79EFD20E02000704328187E214754B4 -:101E50006846017820007043281880228154824807 -:101E60000168200070432818C161012120007043DF -:101E70002818942281542000704328189521475433 -:101E80006643A81981214754019802F035FD684640 -:101E9000407800280CD07348A1014018FFF712FCCD -:101EA00000212000FFF7C0FC002801D101200FE035 -:101EB00068468078002801D0002009E00021200039 -:101EC000FFF7C9FD002801D0380000E00120C0B2B2 -:101ED00005B0F0BD491C00284C1C00284B1C0028F4 -:101EE0000813002880B50121FFF7B5FD01BDF1B54C -:101EF00086B05E4806998422520051434418002758 -:101F0000002502F0F5FC01908220205C69460870F3 -:101F100068460078002803D1019802F0EDFC9EE0AD -:101F20007F20205C694608748B20205C69464870DD -:101F30009720205C6946887000263000822160541A -:101F400030007E21605430007F21605430008021B9 -:101F5000605430009421605430008A2160546846F7 -:101F60000078832160543000972160546846017CDA -:101F70002000FFF705FD68468078002804D06846F9 -:101F800001782000FFF710FD6846007802280FD185 -:101F900001252F0068464078002807D19220205C58 -:101FA000002803D08620205C002830D035002EE0A9 -:101FB00068460078032810D1022768464078002838 -:101FC00009D19220205C002805D08620205C0028C2 -:101FD00001D101251BE0350019E06846007804288E -:101FE00015D16846007C012801D1022700E00127B5 -:101FF00068464078002809D19320205C002805D04D -:102000008620205C002801D1012500E03500280051 -:10201000C0B2002805D08620205C401C8621605478 -:1020200001E096202654019802F066FC0698FFF71E -:102030003DFC002813D0EDB2002D10D001200390FC -:102040006846007C02900020019000200090002350 -:1020500000223900C9B20698C0B2FFF7FBFD07B0F5 -:10206000F0BD00003CCF0010901B00280813002892 -:10207000F1B584B0A8480499842252005143441811 -:1020800002F036FC0700A548016883204000205C70 -:10209000002818D07E20205C002814D08B20205CE3 -:1020A000002810D19420205C00280CD18220205CD4 -:1020B000002808D19A480078002804D1C020205870 -:1020C000081A322803D2380002F016FCBBE026685A -:1020D000F020205CF122A25C052A0AD2C422A25878 -:1020E0000092BC22A258F123E35C5B1CF1256355EE -:1020F0000CE00200D2B29200A218C823D25800927B -:102100000200D2B29200A218DC23D2580300DBB244 -:102110009B00E318C8255E510300DBB29B00E31867 -:10212000DC255951401C0300DBB2052B00D30020F5 -:10213000F023E054C0202150881ABC22A258891AEA -:10214000FA2901D3FA2803D2380002F0D5FB7AE04D -:102150000021FA22D200002302F022F9FA22920092 -:10216000002301F02AFE0500002D03D1380002F003 -:10217000C3FB68E00098301A0021B34A002302F044 -:102180000FF902000B0068080021801859412A004D -:10219000002301F012FE0600B02020580290F32028 -:1021A000255CB4202650300000216422002302F078 -:1021B000F7F800900191029800215A22002302F0C2 -:1021C000EFF8009A019B8B420DD801D382420AD2CC -:1021D0002800C0B25F2826D26D1D2800C0B260283A -:1021E00021D35F251FE0029800216E22002302F018 -:1021F000D7F800900191300000216422002302F002 -:10220000CFF8009A019B8B420DD801D382420AD2AB -:102210002800C0B2332806D32800C0B2372801D323 -:10222000FB3500E032252800F321615CC0B2884212 -:1022300006D0F32025542900C9B20498FEF7A1F96D -:10224000380002F059FB05B0F0BDFEB5A748007894 -:1022500000285DD002F04CFBC5490978002902D066 -:1022600002F04AFB54E001273900C14A1170BB4912 -:102270000A786B461A70002422000A7002F03CFBB8 -:102280006846007800282BD0250027E026001AE0B9 -:10229000684600783900A94008421ED002F028FBA9 -:1022A0000190842149001C4A2800484310188223C9 -:1022B0005B00C05C0028E9D069435018FEF731F993 -:1022C0000028E3D13E00019802F016FBF6B2002E82 -:1022D00003D02800C0B200F05CF96D1C042DD7D3E8 -:1022E000FEF7A6FAFFF775FA250009E02800FFF7C8 -:1022F000FEFD2800FFF7F6FD2800FFF7B9FE6D1C74 -:10230000042DF3D302F0F4FA99490C7002F0F4FAB8 -:10231000F7BD03480078704708130028901B002879 -:102320004B1C0028F8B50E000700FFB26F49097872 -:10233000002904D0C0B2FEF7E1F8002801D1012045 -:1023400046E002F0D5FA04008A4884214900794326 -:10235000451889480078002804D0200002F0CCFA03 -:10236000012035E0FF20801D285C00280CD03100C2 -:1023700089B2F820285AFEF7CAF8002804D02000B5 -:1023800002F0BAFA012023E082204000285C0028F5 -:102390000FD0F620285A310089B2884219D1002086 -:1023A0008221490068546D4801780122BA40914366 -:1023B0000170F8202E52FC202858802149006850D6 -:1023C0000120FF21891D6854200002F095FA0020A9 -:1023D000F2BD200002F090FA0120F9E7F2B5040006 -:1023E000E4B242490978002904D0C0B2FEF786F869 -:1023F000002801D1002025E002F07AFA07008425A8 -:102400006D005C4E200068433018FEF78AF8002803 -:1024100012D0200068433018FF21891D405C00283D -:102420000AD0684600886C433119F822895A80B274 -:10243000814201D1012400E00024380002F05CFA5E -:102440002000C0B2F2BD0000A0860100F3B581B04B -:1024500000262DE000200EE0002482204000385CA1 -:102460000028F7D068460189F620385AFEF74FF861 -:102470000028EFD028002043C0B2002817D16846BA -:102480000089F6217852FC203858401CFC217850F5 -:10249000280082214900785430480178B5400D4326 -:1024A0000570AE48B1014018406902F02EFA761C62 -:1024B000042E1AD20125684600792900B14008424D -:1024C000F5D02C488421490071434718FF20801D16 -:1024D000385C0028C0D068460189F820385AFEF7D9 -:1024E00016F80028B8D02C00B7E7F7BD491C002823 -:1024F000F1B5002425002EE0842149001D4A6846DC -:102500000388280048431018F626835328004843C0 -:102510001018FC23C3585B1C280048431018FC26E5 -:10252000835101231E0028004843101882277F0092 -:10253000C655200069435118FF22921D8854074850 -:102540000178AB400B4303708448A90140184069EF -:1025500002F0DBF96D1C042DCED3F1BD4F1C002819 -:1025600080B50121044A117080B2FFF7C1FF01BD9F -:102570004D1C0028081300284C1C002810B500240E -:1025800004E02000C0B200F004F8641C042CF8D36E -:1025900010BDFEB50400E4B2B9490978002904D0A1 -:1025A000C0B2FDF7ABFF002801D10120D5E002F059 -:1025B0009FF9019084256D00B24E200068433018C9 -:1025C0007E21415C2000684330188322805C6A468B -:1025D00010702000684330188A22805C002806D1E1 -:1025E0002000684330189722805C002803D0012027 -:1025F0006A46507002E000206A465070C9B220005E -:1026000068433018FFF7BCF9002739002000684301 -:1026100030187E22815439002000684330187F2210 -:1026200081543900200068433018802281543900D9 -:1026300020006843301882228154B3480078002873 -:1026400006D007212000684330188322815430E0EF -:1026500068464078002806D00621200068433018DC -:102660008322815425E068460078022813D068460A -:10267000007803280FD06846007804280BD06846FD -:102680000078052807D068460078072803D06846F8 -:102690000078082807D16846017820006843301880 -:1026A0008322815405E039002000684330188322DA -:1026B000815439002000684330188A22815439003F -:1026C0002000684330188B22815439002000684371 -:1026D0003018942281543900200068433018962223 -:1026E000815439002000684330189722815468468D -:1026F0004078002805D0062165437019FFF754F98A -:102700000FE03900200068433018842281542000F3 -:1027100068433018A021475038006543711998224A -:102720008854019802F0E8F87748007800280BD028 -:102730000A4DA0012818406902F0E7F8A001281806 -:10274000FEF7C0FF012008E02000FFF7AFF80028E7 -:1027500001D0380000E00120C0B2FEBD3CCF001027 -:10276000FEB50D000400E4B245490978002913D0F4 -:10277000C0B2FDF7C3FE00280ED0AC4E3078002862 -:102780000AD1684605706846007832382E2803D290 -:102790005D4D2878002801D001206FE002F0A8F8F4 -:1027A0000190307800280CD12878002809D18425A0 -:1027B0006D00344E200068433018FDF7B2FE00284B -:1027C00004D1019802F098F8012057E0684601789A -:1027D000200068433018F42281540027390020007B -:1027E0006843301883225200815420006843301817 -:1027F000A4214750200068433018A82147502000EA -:1028000068433018AC214750200068433018B0218D -:10281000475068460178200068433018F2228154FE -:1028200068460178200068433018F3228154200064 -:1028300068433018FDF7B8FE2000684330187E2149 -:10284000405C00280ED02000684330188B21405C8B -:10285000002807D1654370198221405C002801D10E -:102860000127FFE7FFB2002F04D06846017820005F -:10287000FDF787FE019802F03FF80020FEBD000042 -:10288000491C002808130028F8B5002203920022F2 -:102890000292012201920022009200230022C9B27A -:1028A000C0B2FFF7D7F905B000BD38B50400E4B2F7 -:1028B000AE490978002904D0C0B2FDF71FFE0028F8 -:1028C00001D100201FE002F013F884225200A84B2F -:1028D0002100514359187E25495D00290CD1210062 -:1028E000514359189425495D002905D154431919BC -:1028F0009522895C002901D0012400E0002401F028 -:10290000FBFF2000C0B232BD4B1C002838B50C00C4 -:102910000500EDB2002C1FD0C0B2FDF7EFFD00287E -:102920001AD06068002817D06168280000F00CFFFA -:10293000002811D0207C002803D0606821688842DC -:102940000AD3A068002807D08A48A9014018006B64 -:102950004000A168884201D2012000E0002032BD81 -:10296000F8B50400E4B2814A1278002A06D00F00BC -:102970003900C0B2FFF7CAFF002801D0012053E0A0 -:1029800001F0B6FF009084256D00794E2000684369 -:1029900030187E21405C002814D120006843301894 -:1029A0009421405C00280DD1200068433018952107 -:1029B000405C002806D12000684330188221405C2A -:1029C000002804D0009801F097FF01202CE039681E -:1029D000200068433018816079682000684330180F -:1029E000C160B968200068433018B8228150F96886 -:1029F000200068433150397C200068433018892218 -:102A00008154002120006843301883228154200023 -:102A100068433018FDF768FE6C433019FDF7C4FDBC -:102A2000009801F069FF0020F2BD00004C1C002856 -:102A300070B50C000500EDB2002C08D04B490978A8 -:102A4000002904D0C0B2FDF759FD002801D10120B2 -:102A500020E001F04DFF84225200454B29005143F4 -:102A6000591889682160290051435918C968616063 -:102A7000290051435918B8268959A16029005143AA -:102A80005958E160554359198922895C217401F034 -:102A900033FF002070BDF8B50D000400E4B23349E7 -:102AA0000978002918D0C0B2FDF728FD002813D0FE -:102AB0007348007800280FD1C048007800280BD157 -:102AC00000950098002807D02A48A1014018006B03 -:102AD00040000099884201D2012036E001F008FF51 -:102AE000070084256D00B74E2000684330187E2112 -:102AF000405C00281BD12000684330189421405CC2 -:102B0000002814D12000684330189521405C00282B -:102B10000DD12000684330188221405C002806D186 -:102B2000200068433018FDF7FCFC002804D1380071 -:102B300001F0E2FE012008E000986C433119B82250 -:102B40008850380001F0D8FE0020F2BD00B59E4844 -:102B500000680021FA22D200002301F021FCFA22B1 -:102B60009200002301F029F900BD0000491C002853 -:102B7000081300283CCF0010F8B505000C002E000B -:102B8000F6B2002C09D091480078002805D0280022 -:102B9000C0B2FDF7B3FC002801D101206CE001F0C8 -:102BA000A7FE07008848016884225200854B300048 -:102BB00050431818806B091A2570300050431818BC -:102BC0008E25405D002803D0332901D2012000E08A -:102BD000002060703000504318188F25405DA070B1 -:102BE0003000504318187425405BE080300050439B -:102BF00018187625405B208130005043181878253E -:102C0000405B60816E48B5014019808FA08160787B -:102C1000002808D0A078002805D06089A589A8429E -:102C200001D3012000E00020E0703000504318186C -:102C30008C25405D002807D0300050431818006FE5 -:102C4000032801D2012000E000202071564398198A -:102C50008B22805C607108000021FA22D2000023E0 -:102C600001F09EFBFA229200002301F0A6F82061F9 -:102C7000380001F041FE0020F2BDA84908707047FD -:102C80004C1C0028FEB505000C002E00F6B2002CEE -:102C900009D04E480078002805D02800C0B2FDF7C2 -:102CA0002DFC002801D1012086E001F021FE0190D9 -:102CB00084214900434A3000484310188768300097 -:102CC00048431018C068009030004843101889230A -:102CD000C05C60703000484310187E23C05CA07058 -:102CE000714350188321405CE070019801F004FEAC -:102CF0000098002801D101205EE001970098019919 -:102D0000884201D2009801902D48B1014018C26A52 -:102D1000257067600098A06022610198002100235F -:102D200001F03EFB02000B000098400800218018D3 -:102D30005941009A002301F040F8E0600198002119 -:102D4000774A002301F02CFB02000B00009840089A -:102D5000002180185941009A002301F02EF860628A -:102D60000026A661E6612800C0B2002805D1E0680F -:102D70006061E068A06126621DE0EDB2012D17D10F -:102D8000E068606101980021664A002301F008FBB9 -:102D900002000B0000984008002180185941009A59 -:102DA000002301F00AF8A061E068E061266202E019 -:102DB0006661E06820620020FEBD00004B1C002818 -:102DC0003CCF001008130028901B0028491C002845 -:102DD000F8B588B00D0016000400E4B27A4909780D -:102DE00000290CD0C0B2FDF789FB002807D0774836 -:102DF0000078002803D176480078002801D001200F -:102E00008AE006960795FFF720FA01F071FD842607 -:102E100076006C4D210071436918CF6801F06CFD9C -:102E200003A8029004A8019005A80090069B079AA9 -:102E300039002000FDF7D2FB002801D101206BE012 -:102E400001F056FD07006148007800280AD160486B -:102E50000078002806D1200070432818FDF761FB98 -:102E6000002804D1380001F047FD012054E0079903 -:102E7000200070432818A422815006992000704336 -:102E80002818A82281500599200070432818AC22E8 -:102E900081500499200070432818B0228150684660 -:102EA000017B200070432818F22281546846017B80 -:102EB000200070432818F322815401212000704320 -:102EC0002818832252008154200070432818FDF7EF -:102ED0006BFB2000704328187E21405C00280ED038 -:102EE0002000704328188B21405C002807D16643DE -:102EF000A8198221405C002801D1012000E00020B7 -:102F0000C0B2002804D06846017B2000FDF739FBE1 -:102F1000380001F0F1FC002009B0F0BD501C002881 -:102F200010270000EC13000070B505000C002E0007 -:102F3000F6B2002C09D024480078002805D02800DB -:102F4000C0B2FDF7DBFA002801D1012038E001F022 -:102F5000CFFC257084225200B84B310051435918E0 -:102F600083256D00495D6170310051435918A425D6 -:102F700049596160310051435918A8254959A16048 -:102F8000310051435918AC254959E1603100514392 -:102F90005918B02549592161310051435918B425B8 -:102FA00049596161310051435918F225495D217633 -:102FB00056439919F322895C617601F09DFC00204B -:102FC00070BD000008130028491C00284C1C002874 -:102FD0004B1C0028F1B586B00C006846007E0190BD -:102FE0000026300030006946087430006946887059 -:102FF00030006946487092480078002809D0684639 -:10300000007EFDF77BFA002803D08E4D287800283B -:1030100001D0012010E10394FFF717F98A480199C4 -:1030200089014018C76A0398874201D2012003E151 -:1030300001F05EFC029081480199842252005143C4 -:1030400044188920205C002812D0E06800280FD0A6 -:103050008B20205C00280BD18220205C002807D127 -:103060002000FDF75EFA002802D02878002804D05E -:10307000029801F041FC0120DEE003980021E268A3 -:10308000002301F08DF902000B0078080021801860 -:1030900059413A00002300F090FE07007E20205C9A -:1030A000694608702000FEF789FC276101258A2007 -:1030B000255430008B21605430009721605430003B -:1030C000832160549420205C002819D0A068874296 -:1030D00001D1300005E0A068B84201D2280000E02C -:1030E0000220802160549620205C00287DD1574822 -:1030F000006860619620255430008621605474E099 -:1031000068460078002839D068460078012802D146 -:10311000A068B84206D368460078022804D1A068A7 -:10312000874201D2280000E030009621615C00292E -:1031300007D14649096861619621655431008622AC -:10314000A154C0B2002850D13F48019989014018CC -:10315000406901F0DAFB30007E21605430008021AC -:1031600060543A480068E06194202554684601782C -:103170002000FEF705FC6846857036E09520205C4F -:1031800000281DD0A068874201D1300005E0A0686A -:10319000B84201D2280000E0022080216054206A59 -:1031A000E061942025549620205C00281DD12748FA -:1031B000006860619620255430008621605414E038 -:1031C000A068874206D13000862160542000FEF7B7 -:1031D00027FC0AE0A068B84202D26846057402E003 -:1031E00002206946087468464570029801F084FB25 -:1031F00068468078002809D00198FEF757FB002820 -:1032000001D0300000E02800C0B215E068464078E8 -:10321000002810D000200390002002900020019090 -:10322000002000903B0001226846017C6846007E39 -:10323000FEF710FD00E0002007B0F0BD08130028E5 -:10324000491C00284B1C00283CCF0010901B002874 -:10325000FEB5C0B20400FDF74DFF019010E0FFB2D3 -:10326000002F46D0FDF746FF0199401A9349884246 -:1032700041D234480078002801D001F061FF30BF0E -:10328000FEF7E3FF01F0F5FF01F032FB009084252B -:103290006D002B4E2000684330189521475C88480C -:1032A000007800281AD1200068433018FDF739F95A -:1032B000002813D02000684330187E21405C00288D -:1032C0000CD12000684330189421405C002805D1BF -:1032D000654370198221405C002801D0012500E07F -:1032E0000025009801F008FBEDB2002DB7D00020BA -:1032F00002E0012000E00020FEBD0000FBB5170049 -:10330000089C0299002901D1002C18D0060001F078 -:10331000EFFA842252006B4B310051435D58564303 -:1033200099194E6801F0E8FA0298002803D0019834 -:10333000281A02990860002C01D0F01B2060F7BD0C -:1033400008130028501C0028F9B585B00D001600A0 -:103350006846047D0698002802D00020069908607F -:103360006846007DFFF774FF002801D10120A2E02C -:103370002F0001F0BDFA050030000021FA22920072 -:10338000002301F00DF802000B00B3480021801863 -:103390005941FA22D200002300F00FFD494984224E -:1033A0005200624389188861280001F0A5FA0020C4 -:1033B0000390002002900120019001200090002342 -:1033C00000223900C9B26846007DFEF743FC0028A0 -:1033D00001D001206FE001F08BFA3A4984225200BB -:1033E00062438918C96A019101F086FA0FE0FFB2C1 -:1033F000002F4FD1EDB2002D02D1F6B2002E49D0F0 -:10340000D0480078002801D001F09AFE30BFFEF7C6 -:103410001CFF01F02EFF01F06BFA84225200294BB1 -:10342000210051435918496800912100514359180E -:1034300083254F5D2100514359187E254D5D624320 -:10344000991894228E5C01F057FA00980199401A5D -:103450000428CCD36846007DFFF79BF8002805D1EF -:103460006846007DFFF7F4FE002809D10698009019 -:103470000023019A00212000FFF740FF01201AE0FD -:10348000069800900023019A00212000FFF736FFE4 -:10349000002010E06846007DFFF77BF86846007D5D -:1034A000FFF7D6FE069800900023019A0021200025 -:1034B000FFF724FF012007B0F0BD0000C4090000A1 -:1034C0004B1C002808130028F1B586B00E0015002B -:1034D0006846047E3000C0B2022803D1022069464B -:1034E000087402E0032069460874059305980028D3 -:1034F00002D00020059908600C98002802D0002016 -:103500000C9908606846007EFFF7A2FE002801D1F2 -:10351000012014E12F0001F0EBF905003800002133 -:10352000FA229200002300F03BFF02000B004A4801 -:10353000002180185941FA22D200002300F03DFCFE -:103540009D4984225200624389188861280001F055 -:10355000D3F9002003900020029001200190012067 -:103560000090002300223100C9B26846007EFEF7B9 -:1035700071FB002801D00120E1E001F0B9F98425B8 -:103580006D008D4E210069437118896A02912100F6 -:1035900069437118C96A019101F0AEF913E06846F8 -:1035A0004078002800D0B9E068460078002803D1B0 -:1035B000FFB2002F00D1B1E062480078002801D0AE -:1035C00001F0BEFD30BFFEF740FE01F052FE01F0FB -:1035D0008FF92100694371188322895C6A46517012 -:1035E0002100694371187E22895C6A4611702100AE -:1035F0006943711894228F5C2100694371189522E8 -:10360000895C6A46917001F077F9684640786946AE -:10361000097C8842C3D1684600780028BFD13800B1 -:10362000C0B20028BBD168468078002816D0684612 -:10363000007EFFF70DFE002810D16846007EFEF7E1 -:10364000A8FF0C980090059B019A02992000FFF7B3 -:1036500055FE012073E000BFCF07000001F048F9DC -:1036600007002000684330188321405C6946097CCC -:1036700088421FD12000684330187E21405C00281A -:1036800018D12000684330189421405C002811D1E3 -:103690002000684330189521405C00280AD12000A2 -:1036A00068433018FCF73DFF002803D043480078FA -:1036B000002810D0380001F01FF96846007EFEF7A0 -:1036C00068FF0C980090059B019A02992000FFF773 -:1036D00015FE012033E0200068433058039020009D -:1036E000684330184068009000206C4331198B22E9 -:1036F0008854380001F000F90598002804D0039898 -:103700000299401A059908600C98002804D0009886 -:103710000199401A0C990860002010E06846007E6C -:10372000FEF737FF6846007EFFF792FD0C98009089 -:10373000059B019A02992000FFF7E0FD012007B0E8 -:10374000F0BD0000501C0028F2B582B01C49800179 -:103750000818806A00216A4603C2083A64240025DA -:10376000684603C84622002300F01AFE22002B0000 -:1037700000F023FB06000F00684603C882220023E6 -:1037800000F00EFE22002B0000F017FB029A082A20 -:103790000FD3029A0023BB420BD301D8B24208D305 -:1037A000029A0023994204D301D8904201D3012008 -:1037B00000E00020C0B2FEBD081300284B1C00280A -:1037C0003CCF0010F9B58FB00F0016000FA8047899 -:1037D000002004900020079000200A900020002084 -:1037E000002000200990002008903220694648738C -:1037F00001250020002069460871002069460875EF -:10380000002005A948700020069024480078002870 -:103810001FD00FA80078FCF771FE002819D02048AF -:103820000078002815D11F480078002811D1029691 -:10383000029800280DD0684607736846007B002870 -:1038400011D06846007B01280DD06846007B022815 -:1038500009D01098002804D005A803C8109A03C204 -:10386000083A012012E201F043F8009084277F001B -:103870000D4E200078433018FCF753FE002815D178 -:10388000009801F039F81098002804D005A803C862 -:10389000109A03C2083A0120F8E100BF491C002831 -:1038A0004C1C00284B1C00280813002820007843DB -:1038B0003018C0680B90009801F01EF80FA800782F -:1038C000FEF767FE002800D095E16846007B0028DF -:1038D00060D107A8009004AB029A02210FA80078DB -:1038E000FFF7F2FD05002800C0B200282BD1079891 -:1038F000042828D20AAB029A01210FA80078FFF70A -:1039000023FD05002800C0B200281CD107A80090A4 -:1039100004AB029A02210FA80078FFF7D5FD05003D -:103920002800C0B200280ED1079800210022401CB8 -:10393000514102000B000A9800218B4203D801D3A9 -:10394000824200D201252800C0B2002820D100F018 -:10395000CFFF0090200078433018FCF7E2FD0028EC -:1039600004D1009800F0C8FF012544E100212000A7 -:103970007843301881600121200078433018892273 -:103980008154009800F0B8FF01206946087521E1D4 -:1039900001251FE16846007B012830D100200090FE -:1039A00004AB029A01210FA80078FFF78DFD0500F6 -:1039B0002800C0B2002820D100F09AFF009020001B -:1039C00078433018FCF7ADFD002804D1009800F0D2 -:1039D00093FF01250FE10B99200078433018816097 -:1039E000012120007843301889228154009800F08A -:1039F00083FF012005A94870ECE00125EAE00020E2 -:103A000000900023029A02210FA80078FFF75CFDC6 -:103A100005002800C0B2002828D100F069FF050089 -:103A2000200078433018FCF77CFD002804D12800E2 -:103A300000F062FF0125DEE000212000784330180D -:103A4000816020007843301889228154280000F0DA -:103A500053FF0120694608750020009004AB029ACC -:103A600001210FA80078FFF72FFD05002800C0B244 -:103A7000002800D0ADE004992000FFF765FE002883 -:103A800000D1A6E000F034FF2100794371188322B1 -:103A90005200895C6A469173210079437118A4220F -:103AA00089580D91210079437118A82289580C91E9 -:103AB00000F022FF6846807B00280ED003A8401C3F -:103AC000029008A8019009A800900C9B0D9A0499F7 -:103AD0002000FCF783FD6946087100F009FF0090A3 -:103AE000200078433018FCF71CFD002804D1009812 -:103AF00000F002FF01257EE0049920007843301891 -:103B0000C1600499200078433018816001212000B1 -:103B100078433018892281546846807B00284FD032 -:103B20006846007900281FD0099920007843301892 -:103B3000AC2281500899200078433018B02281507F -:103B40006846417B200078433018F2228154684651 -:103B5000417B200078433018F322815420007843C1 -:103B60003018FCF721FD2BE000210A0020007843EB -:103B7000301883235B00C254200078433018A422FD -:103B80008150200078433018A822815020007843CB -:103B90003018AC228150200078433018B022815078 -:103BA000200078433018B42281503221200078431D -:103BB0003018F2228154200078433018F3228154C7 -:103BC000009800F099FE012005A94870049806901D -:103BD00000E001252800C0B200280CD16846007B17 -:103BE000022808D000F084FE210079437118C968CA -:103BF000069100F081FE2800C0B200283CD0344875 -:103C00000078002803D10FA80078FEF7C2FC00F06E -:103C10006FFE00906846007B022808D16846007D50 -:103C2000002804D0049920007843301881600B9953 -:103C3000200078433018C16000210A00200078433A -:103C400030188923C2540A002000784330188B238F -:103C5000C254200078433018962281541C480078C2 -:103C6000002801D0072000E008207C43311983227E -:103C70008854009800F040FE1098002804D005A851 -:103C800003C8109A03C2083A2800C0B211B0F0BDB0 -:103C900038B500200F490870FDF7AAFAFDF744FB7C -:103CA000FDF770FC050000F096FC0400FDF72AFA11 -:103CB000EDB2002D06D0E4B2002C03D0FCF766FD77 -:103CC000002803D1FDF714FD012000E0002032BDE3 -:103CD0004B1C00284C1C0028D021890040587047FC -:103CE000C22189004058C005C00D70479022920043 -:103CF00081507047822189004058C005C00D70472F -:103D000000B50068800B8007800F002801D180205B -:103D100000E0402000BD00B5C02189004058C00629 -:103D2000C00E082801D2012000E00020C0B200BD72 -:103D3000F8B504000D0016002000FFF7ECFF002886 -:103D400009D02F000025B54210D22000FFF7C4FF94 -:103D500078556D1CF7E72F00002505E02000FFF7E0 -:103D6000BBFF690078526D1CB542F7D3F1BDF8B5C1 -:103D700007000D0016003800FFF7B2FF0400A6424E -:103D800000D23400290022003800FFF7D1FF2000C4 -:103D9000F2BDF8B505000C0000262800FFF7B0FFC3 -:103DA00007002800FFF7A6FF874204D02100280063 -:103DB000FFF79CFF01263000F2BD12422DD0994240 -:103DC00031D970B500251B4209D00C00002112E04A -:103DD000110000F0F7F80A000021002370BD09422D -:103DE000F6D00024012649186441944200D3A41A55 -:103DF0007641F8D33100012601E0764109D200185E -:103E000064416D41A41A9D41F7D2A4185D41B619D1 -:103E1000F5D3300022002B0070BD1B42CFD108B576 -:103E200002F070FC08BD01D19042CAD202000B0022 -:103E3000002100207047000070B55F4BC018C0091A -:103E400000015E4BC31804290CD21F251C68CE004C -:103E50002800B0408443D2B21540C80085402543B5 -:103E60001D600CE0FC311F255C68CE002800B040CE -:103E70008443D2B21540C800854025435D6070BDC3 -:103E800000B5002A03D101228A40426002E00122EB -:103E90008A40826000BD30B403008C000F25596C4D -:103EA0002800A04081431540A5400D435D6430BC0F -:103EB000704730B4030001259C6C2800884084437F -:103EC00015408D4025439D6430BC704730B40300DD -:103ED0000125DC6C28008840844315408D40254333 -:103EE000DD6430BC704730B403004C00103403254F -:103EF000D96C2800A04081431540A5400D43DD64E6 -:103F000030BC7047426901228A4042614069704773 -:103F100030B4030001259C69280088408443154083 -:103F20008D4025439D6130BC704730B403004C0088 -:103F30000325196C2800A04081431540A5400D437E -:103F40001D6430BC7047F8B504000025002C30D04B -:103F50001600002E2DD00F00326839002000FFF728 -:103F60008FFF327A39002000FFF766FF726939004F -:103F70002000FFF79EFFB26939002000FFF7A6FF7F -:103F8000F26939002000FFF7AEFF726839002000A7 -:103F9000FFF781FFF26839002000FFF7C6FF390004 -:103FA0002000FFF7AFFF326939002000FFF7B0FFB4 -:103FB00000E0034D2800F2BD0000CFBF00003040FC -:103FC00001005A000022030A8B420BD203098B42E4 -:103FD00019D243088B422ED2411A00D201465241D7 -:103FE00010467047FF2209023FD012068B4205D3CC -:103FF000121209028B4201D31212090203098B42E9 -:1040000019D300E0090AC3098B4201D3CB01C01ABE -:10401000524183098B4201D38B01C01A524143099B -:104020008B4201D34B01C01A524103098B4201D389 -:104030000B01C01A5241C3088B4201D3CB00C01AF6 -:10404000524183088B4201D38B00C01A524143086E -:104050008B4201D34B00C01A5241884200D3401A10 -:104060005241CFD201461046704708B502F04CFBD2 -:1040700008BD0000F8B501231A00002800D151E165 -:10408000002900D14EE1A84A12680C7AA74D1540CC -:10409000A4048022D20214402C430322CE6816408E -:1040A000A34D25403604C024A40234402C430D788F -:1040B0006E07760F9F4D25403606E024E404344019 -:1040C0002C438E789C4D2540B4078026F60534405D -:1040D0002C4328254D5D0126B4431D40254334243F -:1040E0000C5D0226B5436400022634402C430D7F4C -:1040F0000426B443AD000426354025434C7F0826F2 -:10410000B543E400082634402C4340254E5D1E4054 -:104110008A4D2540B4028026F60034402C434025C9 -:104120004D5DEDB26D081E002E40F6B2844D254067 -:1041300074028026B60034402C4370254E5D814DBC -:10414000254034028026760034402C4371254E5D94 -:1041500016407D4D25403603C024A40134402C4335 -:1041600004600C7A002C02D10023836006E00C7AF4 -:10417000012C02D14B69836000E083600B6A03610C -:104180004B6A4361CB6A83610B6BC3614B6903620A -:104190008B6943626D4B1C684423CB5CDBB2FF250B -:1041A000AC4323434C240C5DE4B2694D1D40240410 -:1041B000FF231B0423402B435C240C5DE4B21D024F -:1041C0002D0A23062B436C240C5DE4B2614D1D4087 -:1041D0002402FF231B0223402B4343645E4B1B68D6 -:1041E00064240C5DE4B25B4D1D402402FF231B02DE -:1041F00023402B4354240C5DE4B2FF25AB431C4306 -:104200008464564B1C684123CB5C13400325AC43AC -:10421000234360240C5D1440514E1E40A302C02570 -:104220002D011D4035434823CE5C16403023DB432F -:1042300030241D40370127402F4350254D5D154048 -:10424000484E3E402F02C025AD003D403543582624 -:104250008E5D1640C027BD43B701C0263E402E43A9 -:1042600068254D5D15400C27BE43AF000C253D4031 -:104270003543C5643C4D2D6807267227CF5D374016 -:1042800000970727BD432F00009D3D437327CF5D57 -:104290003E407027BD43370170263E402E434665A1 -:1042A00035254D5D8567314D2D680E7C1640032701 -:1042B000BD432E43CD7C1540C027BE43AF01C02572 -:1042C0003D4035434E7C16400C27BD43B7000C26BD -:1042D0003E402E438D7C2A403340120114401C4343 -:1042E0000465234A1268CB8894B21A0422438B884F -:1042F0009BB21B0A9BB2174C14401B02FF221202F6 -:104300001A4022430B78052B05D10979C9B2FF2346 -:104310009A43114304E04978FF239A43C9B21143F9 -:10432000016300221000F2BD70DB0010FFFFFBFFF5 -:10433000FFFFFCFFFFFFFFF8FFFFFFBFFFFBFFFFDB -:10434000FFFDFFFFFFFEFFFFFFCFFFFF74DB00104D -:10435000FFFF00FFFF00FFFF78DB00107CDB001099 -:10436000FFF3FFFFFFFCFFFF80DB001084DB00108A -:1043700088DB00100168802212060A430260704741 -:104380000168490049080160704740687047016151 -:1043900070470069704781607047006A704700008D -:1043A00030B4434351435D18010C0C00130C5C43C3 -:1043B0002D1980B2434392B251430024C91864417D -:1043C00024040B04090C09195043C018694130BC7E -:1043D0007047000000B5022801D301200FE00B0058 -:1043E000DBB2042B01DB012009E0BE4B8000181872 -:1043F000C9B2405C824201D3012000E0002000BD30 -:10440000F8B504001F00022C01D3012023E01500A1 -:104410000E002A003100C9B22000FFF7DBFF01289F -:1044200001D1012017E03000C0B2002816D1FF2FC3 -:1044300012D8AD4861034018A900401880214901F5 -:1044400040180168A94A0A403902FF231B020B40A9 -:10445000134303600020F2BD0120FCE7F6B2012EF9 -:1044600016D180204002874210D29F486103401835 -:10447000A9004018A0214901401801689C4A0A403F -:104480003902C94B0B4013430360E3E70120E2E725 -:104490000120E0E700B20012C0B27047F8B5050095 -:1044A0000F001600280000B2FFF7F4FF0400200000 -:1044B000C0B2022801D301202CE032003900C9B279 -:1044C0002000C0B2FFF786FF012801D1012021E0C2 -:1044D00085482100C9B2490341182A00D2B292008E -:1044E0008918C02212018A58B0491140FFB23B021C -:1044F000C02292001A400A43FF218A43F1B21143BD -:10450000E4B262038018EDB2AA008018C022120142 -:1045100081500020F2BD70B50400022C01D30120AF -:1045200028E015000E002A003100C9B22000FFF774 -:1045300051FF012801D101201CE06B486103415863 -:10454000802212060A43C02189041143FF2212046B -:104550000A43964B1340F6B23202C0218900114043 -:104560001943FF229143EAB20A43610342506103B7 -:104570004058002070BD70B50400022C01D301200A -:1045800028E015000E002A003100C9B22000FFF714 -:1045900021FF012801D101201CE05348610341584B -:1045A0008022D2050A43C02189041143FF2212044C -:1045B0000A437E4B1340F6B23202C02189001140FB -:1045C0001943FF229143EAB20A4361034250610357 -:1045D0004058002070BDF8B598B00BA8342102F007 -:1045E000A5F89A4803C801AA03C2083A03A8A54936 -:1045F000202200F0E9FAAA480078002801D0012022 -:104600006DE000252C0007E02800A64962008852D2 -:104610002800A5490855641C062C14D2A34814216F -:1046200061434118097A0BAA11720BAA1421614344 -:104630004118496814236343C058FFF784FC0028DD -:10464000E2D000204BE0684600F0B2F8002801D12B -:10465000002044E000980021962292000023FFF7FA -:104660009FFE934A002312184B4110001900914AF3 -:104670000023FFF7A2FB002800D1012003AFB8817F -:104680008D4E300002F0D0F801A9300002F068F839 -:10469000002801D0002022E02C0006E01420604316 -:1046A0002818C06802F0BEF9641C062C13D27F4D96 -:1046B000142060432818007C787103A914206043FB -:1046C0002818C06802F0B4F80028E7D0300002F0E3 -:1046D000ABF8002003E0012071490870012019B0F7 -:1046E000F0BD000098DA001000000440FF00FFFF5A -:1046F000FF0000FFF8B584B00E00C0B202900025A4 -:1047000028006946088004212A0003AC200001F03B -:10471000FDFF2C0062480078002806D0674F3878EB -:10472000002802D10298062801D3002039E0012098 -:1047300038705E480299142251434018C0680190B5 -:10474000019800F0A1F8019802F078F9019800F0C2 -:104750007FF800281FD003AA6946019802F074F977 -:10476000002818D103A8C078002814D06846008813 -:104770000005000D69460880684600884949029A8C -:10478000520088520124484802994454002E02D015 -:10479000684600883080019800F076F83D7020006F -:1047A000C0B205B0F0BD000000FFFF00FFFCFFFF3E -:1047B000F8B5070000200090FF262C363000FFF7E8 -:1047C00069FE0500002F04D0684602F04DFE002867 -:1047D00001D0002038E00098394940183949FFF7E6 -:1047E000F1FB0400002C02D03748844201D30020A2 -:1047F0002AE0042201212800FFF7BDFE002801D095 -:10480000002021E0042201213000FFF747FE0028AC -:1048100001D0002018E0631E042201212800FFF7C8 -:10482000EFFD002801D000200EE004220121280025 -:10483000FFF771FE002801D0002005E0009821005C -:10484000FFF7C0FB38600120F2BD000070DA0010F5 -:104850007CB505001D4C062100226E46300001F09B -:1048600055FF6946280002F0DBF968460078002809 -:1048700003D1641E002CF4D101E0012000E00020EF -:1048800076BD00008CD80010E0B511490CC908397C -:1048900069460CC10839694602F06CF907BD000091 -:1048A0003F1C0028301B0028481B002834D2001071 -:1048B000FFC99A3B00CA9A3B00109040401C002858 -:1048C0005F8DCB00608DCB0001000100A086010050 -:1048D00078DA001000000000000000000000000076 -:1048E000801C800803D0401C801EFCD100BF704794 -:1048F000EFF3108072B6704780F310887047403035 -:10490000016810220A4302607047403001680822A3 -:104910000A43026070470000F8B5012422004C23CE -:10492000CB5C052B03D24D23CB5C052B01D31000B0 -:10493000E2E0002800D1DEE0002900D1DBE06F4A90 -:1049400012684B7923406E4D15409B048022D202A1 -:1049500013402B4303228D7915406A4E1E402B04D1 -:10496000C025AD021D40354307230E7A1E40664F19 -:104970002F403606E025ED0435403D43CE79634FA8 -:104980002F40B5078026F60535403D430E7D0127B3 -:10499000BD4326402E4324254D5D0227BE436D00B6 -:1049A00002273D40354305600D79060030360096FC -:1049B000009E3668FF27BE43EDB23543009E35604A -:1049C0004D79012D0BD18C79002C02D1002484600B -:1049D00006E08C79012C03D10C68846000E08460CF -:1049E000CC6804610C694461CC6984610C6AC4615F -:1049F0000C680462464C25680C7EE4B2FF26B54381 -:104A00002C4330254D5DEEB2424D25403604FF2447 -:104A1000240434402C4340254D5DEDB22402240A89 -:104A20002E06264348240C5DE7B2FF2424023A4DAB -:104A30002E403F02274037434764384E36683827B8 -:104A4000CF5DFFB20097FF27BE43009F3743282664 -:104A50008E5DF6B23D40360234402C438464304CC7 -:104A600025688C7D14400326B5432C4325254E5DD7 -:104A700016402C4D2540B602C024240134402C435E -:104A80002C254D5D15403026B4432E013025354090 -:104A9000254334240C5D1440234E2E402502C024AF -:104AA000A4002C4034433C254D5D1540C026B44342 -:104AB000AE01C0253540254344240C5D22400C2422 -:104AC000A54394000C2222402A43C264174A14686A -:104AD0004C228A5C1A400725AC4322434D240C5DCE -:104AE00023407024A2431C017023234013434365D9 -:104AF000497D816700221000F2BD00005CDB0010E0 -:104B0000FFFFFBFFFFFFFCFFFFFFFFF8FFFFFFBF03 -:104B100060DB0010FFFF00FFFF00FFFF64DB001001 -:104B200068DB0010FFF3FFFFFFFCFFFF6CDB0010F2 -:104B30000168802212060A430260704778300168DB -:104B400001220A4302607047C16F0800C007C00F0E -:104B50007047010070310A68012313430B60006F36 -:104B60007047000030B5010000221000134B1B6895 -:104B7000002914D08C786407640F0725AB431C43CD -:104B80000B79002B01D00122FFE763005B08D207FD -:104B90001A430B4B0024095F89005A5000E0064875 -:104BA00030BD00B5074A1368002B03D0126800B26D -:104BB0008000115000BD00000100560058DB0010BD -:104BC000008020402412002870B4103A03D378C922 -:104BD000103A78C0FBD2530701D318C918C001D5C9 -:104BE00008C908C0D20704D30B880380891C801C25 -:104BF000002A01D50B78037070BC70478B0701D178 -:104C00008307E1D0124205D00B78491C0370401C89 -:104C1000521EF9D170470000F7B5AD4BAD4A15688B -:104C2000AD4A1668AD4A12680192AD4A1268009208 -:104C3000002422002200002800D11EE10A00002AE0 -:104C400000D11AE15168002901D1936805E051684B -:104C5000022901D1230000E0022311695769B942FA -:104C600001D3116900E05169092909D29D49294000 -:104C70002125555D002D15D080256D000D4313E0D5 -:104C8000112905D2974F2F408021C9013943EFE701 -:104C9000212905D2934F2F40802109023943E7E7AC -:104CA0008B48EBE0904D0D40D168491E0907090F74 -:104CB0000F27BD4329438D4D0D40802149042943D1 -:104CC0000160117F002901D0210000E001210125B0 -:104CD0000127BE43294031430E005168090929408C -:104CE0000227BE434900022739403143D67E1027B0 -:104CF000B943360110273E400E43517E2027BE4364 -:104D000049012027394031431668012E00D0250083 -:104D10004E007608E90731430425A9435D000426C7 -:104D200035400D4308218D43D900082319402943FC -:104D3000537F6D4D0D40190280235B0019402943BC -:104D4000957F80239B006A4E0E40690219403143D3 -:104D5000D67F684D0D40B1028026F60031402943D0 -:104D60002025565D644D2940F60280273F013E40D4 -:104D70000E4311798F07BF0F5C4931403F06C026B3 -:104D8000B6043E400E430662167E009F56493940E7 -:104D9000360280277F003E400E43977E54493140C3 -:104DA0007E021E400E431169491EC906C90E1F2707 -:104DB000BE433143C026B60081512421515CC9B2A3 -:104DC0000091C121890041180E68FF27BE43009F52 -:104DD00037430F60167E019F4349394036028027D2 -:104DE0007F003E400E435169491EC906C90E1F2768 -:104DF000BE4331438026B60081512C21515CC9B29B -:104E000000918121890041180E68FF27BE43009F51 -:104E100037430F60116B1B4E8151916A184E8151BF -:104E20003821515CF026360186190096009E3768BD -:104E30002F4E3E4049020B40334300990B6039210D -:104E4000515CF4221201821813681D40C9028023AC -:104E50001B011940294311600B4944500298002856 -:104E60000AD002980460029884610298C460029893 -:104E7000C46126480299086223001800FEBD0000A4 -:104E8000C80F0000880F0000C80E00001B49016019 -:104E9000C02189040162FF220832C02189004250EA -:104EA0000021C1239B00C15080239B00C25081225E -:104EB00092008150124A8150154A8150114A815006 -:104EC000114A8150134A8150134A815070470000A3 -:104ED0000140AA0040DB001044DB001048DB00105A -:104EE0004CDB0010FF3FFFFFFFFEFFFFFFFFFFFC5B -:104EF000FFFDFFFFFFFBFFFFFFF7FFFF0F000003BA -:104F0000C80E0000C80F0000880F0000EFCDAB00F6 -:104F1000880E0000080F0000480F0000F8B50400DC -:104F20000D00334F387800280ED02D4E18222D4911 -:104F3000300002F0E3FA0020F075CF2040002A494B -:104F40000860002002F03AFB2000290001223A709C -:104F500080225204002399420AD301D8904207D3F9 -:104F6000244A04000D0024A003C80019694102E08E -:104F70000200002000211D4B00241C60204D2A60EF -:104F8000214A146005221A601A68D203FCD51C60FD -:104F90000029DDD10028DBD13C70F1BD70B50500E2 -:104FA000184E306800280ED10D4C18220D492000F3 -:104FB00002F0A4FA0020E075E52040000A490860EC -:104FC000002002F0FBFA2C0030681049FEF7FAFFCF -:104FD000002122000023FFF7E3F9FFF79FFF70BDD8 -:104FE000C41A002894D50010881B002810E000E0A7 -:104FF000461C0028FFFFFF00010000FFFFFFFFFF2E -:1050000014E000E0201C002818E000E040420F00FF -:1050100043490A680860704742490A680860704757 -:1050200041490A680860704740490A6801239A4369 -:10503000C0B20300DB07DB0F13430B6070473B4933 -:105040000A6810239A43C0B200011023184010438D -:105050000860704735490A68354B1340C0B20002FA -:1050600080225200104018430860704731480168A0 -:1050700001220A430260704710B5FFF739FC0400B3 -:1050800000F024F80020FFF7C3FFFA20C001FFF76B -:10509000C3FF0020FFF7C4FF0020FFF7C5FF01207A -:1050A000FFF7CDFF0020FFF7D5FF00F004F8200048 -:1050B000FFF722FC10BD80B5FFF71AFC1E490A68F5 -:1050C000032313430B60FFF717FC01BD80B5FFF707 -:1050D0000FFC19490A6803239A43012313430B6009 -:1050E0000A6803239A43022313430B60FFF704FC6F -:1050F00001BD80B5FFF7EAFF104801688022120663 -:105100000A430260FFF7D7FF01BD80B5FFF7DEFF5E -:105110000A480168490049080160FFF7CCFF01BD5A -:1051200004C0264008C026400CC0264010C02640BF -:10513000FFFEFFFF44C0264040C0264000C026407E -:1051400080B5FFF7C3FFFFF791FFFFF7B4FF01BD85 -:1051500070B5302100242200914D280001F0D6FACC -:10516000E02122008F4D280001F0D0FA0426310002 -:1051700022008D4D280001F0C9FA2200A34D310014 -:10518000280001F0C3FA2000A1490870A14804607A -:1051900002F048FC03F0A0F803F04CFA002809D014 -:1051A00003F04BFA002805D003F01AF9002801D1CA -:1051B00003F08AF903F002FD002804D1062003F071 -:1051C000ADFF002012E0FDF7C1FCA1490860A14934 -:1051D0000860A1490860A14908600120A049087041 -:1051E0000F20A0490870AF490870012070BD38B584 -:1051F00084B09D480068002802D0022003F08EFF92 -:1052000003F09FFF03F0B2FF002818D00020010038 -:1052100008E00200624B0C00E4B20C256C431B1941 -:105220009A72491C0A00D2B2042AF2D39E4908702D -:1052300001208B49087002E0684600F07AFB68465E -:1052400003F004FD002808D00098C021890088429E -:10525000F2D0684603F0E0FFF1E700F0A5FD02F0B0 -:10526000DFFC00F000FE00F043FE01F04AF905B05B -:1052700030BDF8B502E0684600F05BFB684603F01D -:10528000E5FC002808D00098C02189008842F2D0AF -:10529000684603F0C1FFF1E773480068002802D0B8 -:1052A000022003F03BFF03F04CFF00F0DCFD01F0B7 -:1052B00028F905B000BDF8B50700380080B2FDF749 -:1052C00017F9FCF7C2FF0026340018E02000C0B236 -:1052D00000F059F80500390089B22800C0B2FDF786 -:1052E00021F8390089B22800C0B202F0A5FB2C4891 -:1052F0002100C9B20C22514340188672641C200060 -:10530000C0B20428E2D3684806700F2055490870DF -:1053100064490870012052490870F1BD00B5401A77 -:10532000002801D4012000E00020C0B200BD00B57B -:10533000401A00B2012801DB012000E00020C0B2C9 -:1053400000BD00B500281BD0002919D002780B78C9 -:105350009A4215D142784B789A4211D182788B7853 -:105360009A420DD182888B889A4209D1C288CB8813 -:105370009A4205D100890989884201D1012000E0C3 -:105380000020C0B200BD00B50100C9B2042903D29B -:105390004649C0B2085C00E00420C0B200BD000075 -:1053A000581A002828180028001C002810B50C00E6 -:1053B0000100C9B2042901D2002C01D1002006E06D -:1053C000C0B2FFF7E0FF2100C0B202F01FFF10BD26 -:1053D00000B5002802D04178042901D3002013E051 -:1053E00001780A2902D001780B2904D10189FA2019 -:1053F0008000484308E00189002901D0008903E0CA -:10540000A64940788000085800BD0000081C00280C -:10541000641C0028041C002800B5002802D0417834 -:10542000042901D3002012E00178032903D09C490C -:105430004078085C0BE00089401D0A21FEF7C2FDA0 -:10544000322800D23220602800D35F20C0B200BDD5 -:105450000C1C0028101C0028141C0028181C0028F4 -:1054600003130028041300287C1B002800B58D4B73 -:1054700018708D4B1970002A05D011788B4B19705C -:1054800091888B4A1180C0B2002803D0012089493D -:10549000087002E00020874908700120AA490870BE -:1054A00000BD000005130028601C00288CDB0010E4 -:1054B000F8B50500002D05D00C00002C02D0160018 -:1054C000002E01D1002039E00A21002227003800F7 -:1054D00001F01CF9686820706868000A03210A005E -:1054E000024062700200D2B292080A40A2706A685A -:1054F000120CA280AA68E280AA68120C22812A6893 -:10550000C0239B009A4202D12A7B082A03D00120A3 -:105510003070002012E0F0220240102A03D0022056 -:10552000307000200AE02078401E022802D9C01FF7 -:10553000052801D8012001E031700020F2BD00B53E -:10554000002801D0002901D100204AE04278042A35 -:1055500003D304200870002043E00278092A06D112 -:105560004278002A03D004200870002039E0027835 -:10557000032A09D18278012A0DD08278022A0AD022 -:105580000520087000202CE08278002A03D0052036 -:105590000870002025E00278521E0FD0521E21D044 -:1055A000521E33D0521F012A40D9921E49D0521E9A -:1055B00055D0521E3AD0521E5FD06AE0C288784B56 -:1055C0009A4207D20289002A08D000896438754AB5 -:1055D000904203D306200870002002E000200870EB -:1055E000012000BDC28812B26F4BD2186F4B9A4295 -:1055F00007D20289002A08D000896438694A90429B -:1056000003D3062008700020EBE7E7E7C288643A7E -:10561000644B9A4205D20089654A8018654A9042D7 -:1056200003D3062008700020DBE7D7E7C288002AF2 -:1056300002D10089002803D0062008700020D0E79E -:10564000CCE7C288AA4B9A4204D100890A38A94AF9 -:10565000904203D3062008700020C2E7BEE7C2884C -:10566000A54B9A4204D100890A38A24A904203D33A -:10567000062008700020B4E7B0E7C2889F4B9A422A -:1056800002D10089002803D0062008700020A8E776 -:10569000A4E7032008700020A3E7000044DA00100C -:1056A00090DB00105D1C00285E1C00285F1C002899 -:1056B0003A1C0028631C002800B50100C9B201296A -:1056C00002D0C0B2022801D1012000E00020C0B207 -:1056D00000BD10B504002000C0B2FFF7EDFF0028A8 -:1056E0000AD12000C0B2032806D02000C0B20A2888 -:1056F00002D0E4B20B2C01D1012000E00020C0B2A6 -:1057000010BD80B58EB00100C9B2042908D27C4911 -:105710000200D2B20C235A438918897A002901D099 -:1057200001200EE06946C0B2FFF740FE002806D017 -:1057300068463221405C002801D0012000E00020B2 -:10574000C0B20FB000BD00000313002800B56D48C3 -:105750000078002801D0012000E00020C0B200BD88 -:1057600038B58EB067480478002510E069462800F7 -:10577000C0B2FFF71BFE002808D068463221405C0B -:10578000002803D020000124AC4004436D1C2800F5 -:10579000C0B20428EAD32000C0B20FB030BD000070 -:1057A00011270000FDE9000010270000214E000035 -:1057B000D4FEFFFFBD02000038B58EB000252C00DE -:1057C00018E069462800C0B2FFF7F0FD002810D0AD -:1057D00068464178042908D04178072905D04178E6 -:1057E000082902D04078092803D120000124AC40C8 -:1057F00004436D1C2800C0B20428E2D3FCF789FDE5 -:10580000002802D020000F2404432000C0B20FB0B3 -:1058100030BD38B58EB000252C0010E06946280058 -:10582000C0B2FFF7C3FD002808D068463421405CB1 -:10583000002803D020000124AC4004436D1C280044 -:10584000C0B20428EAD32000C0B20FB030BD80B58A -:10585000FFF786FF0100002005E00A00D207D20F03 -:105860008018C9B249080A00D2B2002AF5D1C0B2E4 -:1058700002BD10B58EB0002418E069462000C0B209 -:10588000FFF794FD002810D068463221415C0029C2 -:105890000BD00178052926D00178062923D001787C -:1058A000072920D0007808281DD0641C2000C0B231 -:1058B00004281AD212482100C9B20C2251434118BF -:1058C000897A0029D9D02100C9B20C225143415C08 -:1058D0000A2906D02100C9B20C225143405C0B2892 -:1058E000CBD1012002E0012000E000200EB010BD6D -:1058F0005AA500004F020000524B00003CC30000BC -:10590000581A0028601C002810B5002400E0641C10 -:105910002000C0B204280AD22000C0B2FFF733FD35 -:10592000C0B2FCF7C2FF0028F1D0012000E0002047 -:1059300010BD70B592B0012421006A461170AA49C9 -:105940000A68521C0A606A4601A9FFF7B1FD0028E7 -:1059500005D0694601A8FFF7F2FD00280AD1A34847 -:105960000168491C016001AA684601780220FFF71E -:105970007DFD28E101AD2878092836D0BC480178A2 -:1059800000291ED0A988BB4A1288914219D1BA4871 -:10599000007800280BD0B94901A8FFF7D2FC0028F5 -:1059A00005D001AA00210320FFF760FD08E08F4821 -:1059B0000168491C016001AA08210220FFF756FD79 -:1059C00001E10078002810D0AA480188A888FFF7D4 -:1059D000AEFC002809D185480168491C016001AA74 -:1059E00008210220FFF742FDEDE02000A0490870E9 -:1059F0002000A1490870A8889E4908809F4801A9F5 -:105A00004CC94CC00C390C38287809280CD1A8880E -:105A1000FFF751FC01AA00210420FFF727FDAA4847 -:105A20000168491C0160CEE0287808280DD1A988BA -:105A3000687800F0DDF801AA00210120FFF716FDCB -:105A4000A1480168491C0160BDE028780C2813D1E9 -:105A5000687884409D480178214301709C48017812 -:105A60000C43047001AA00210120FFF7FFFC9648B7 -:105A70000168491C0160A6E028780D283BD16878B0 -:105A8000FFF73FFE002809D0C6480168491C0160A5 -:105A900001AA09210220FFF7E9FC94E003F066FB6C -:105AA00000280BD1FCF735FC002807D16878FFF7F8 -:105AB0006AFCC0B202F081FB002805D101AA0B21CB -:105AC0000220FFF7D3FC7EE0804801786A7823004B -:105AD00093400B4303707E4801786A7894400C43EE -:105AE000047001AA00210120FFF7C0FC764801687C -:105AF000491C016067E003F039FB002805D001AACA -:105B00000B210220FFF7B2FC5DE02878FFF7D4FDFF -:105B100000281DD004A96878FFF748FC002805D1AB -:105B200001AA0E210220FFF7A1FC4CE004A83421B9 -:105B3000405C00280CD102F083FD002801D00D212B -:105B400000E0072101AAC9B20220FFF78FFC3AE06A -:105B5000FFF78FFE002809D092480168491C0160B8 -:105B600001AA09210220FFF781FC2CE028780A28ED -:105B700002D028780B2811D101F089FF002803D129 -:105B8000FFF7E4FD002812D086480168491C016037 -:105B900001AA09210220FFF769FC14E06878FFF7E9 -:105BA000B0FD002811D0A988687800F021F801A87C -:105BB00000F066F801AA00210120FFF757FC4248D7 -:105BC0000168491C016012B070BDFFF740FE042857 -:105BD000EDD374480168491C016001AA0A21022022 -:105BE000FFF744FCEFE70000E81B0028EC1B00284F -:105BF000F8B504002000C0B2042837D20F002000FE -:105C0000C0B2FFF7C0FB06000125390089B22800A9 -:105C1000B040C0B2FCF71AFCFCF717FB390089B2A0 -:105C20003000C0B2FCF77EFBBFB239003000C0B21A -:105C300001F002FF0020AC492200D2B20C235A43EB -:105C400089188872A9490A782800A04082430A70FE -:105C50001E4801782A00A2400A4302701C480178BD -:105C60002A00A2400A430270BC480570F1BD000042 -:105C7000611C00283C1C0028621C00283C1B0028DA -:105C800038B501004C78984D2000C0B20C2250432A -:105C900028180A22FEF7B2FF012001002200D2B22A -:105CA0000C235A43AA18917290490A780300A34022 -:105CB00013430B7005490A780300A34013430B708C -:105CC000A649087031BD0000F41B00280413002809 -:105CD00005130028F8B504006078FFF754FB0500B1 -:105CE0002000FFF775FB07002000FFF795FB06007B -:105CF0002078FFF7EEFC002815D003F007FA02F039 -:105D0000EAFB002804D1032003F008FA002047E052 -:105D100003F0FCF9012092490870FCF717FF914944 -:105D20004018914908602078012808D0022811D035 -:105D300003281BD00A2824D00B2829D02FE0A088C4 -:105D400000903300DBB23A00E1882800C0B202F0D4 -:105D5000CBF825E0A08800903300DBB23A00E18860 -:105D600009B22800C0B202F0FDF819E0A088009046 -:105D70003300DBB2E288A1782800C0B202F01AF941 -:105D80000EE0A28839002800C0B202F07BF907E0DB -:105D9000A28839002800C0B202F0C4F900E0002057 -:105DA000F2BD0000F01B0028F8B584B0FCF7CEFE71 -:105DB000009003F0DBF9002806D16C4801680098D8 -:105DC000FFF7ACFA002800D14BE0002000E0401CB7 -:105DD0000100C9B2042944D20326654F39780D1851 -:105DE0003540414C2900C9B20C2251436118897ACF -:105DF0000029ECD001A82900C9B20C225143611836 -:105E00000A22FEF7FBFE00202900C9B20C225143F2 -:105E100061188872012435490A782000A84082431D -:105E20000A702800401C06403E70009864304F49BC -:105E3000086001A8FFF74EFF002804D101AA0E2137 -:105E40000220FFF713FB4B4801782200AA400A43C7 -:105E50000270494801782200AA400A4302703F4874 -:105E6000047005B0F0BD38B58EB0002435E0694649 -:105E70002000C0B2FFF79AFA00282DD03F4D200035 -:105E8000C0B2285C00280AD03D482100C9B238229F -:105E900051434118684600F075F800281CD0384876 -:105EA0002100C9B238225143401869463822FEF712 -:105EB0008BFE012001002200D2B2A9542D490A789C -:105EC0000300A34013430B702B490A780300A3403F -:105ED00013430B7021490870641C2000C0B20428D1 -:105EE000C5D30FB030BD0000581A0028601C002830 -:105EF00038B51B4C207800282ED0FCF727FE050073 -:105F0000FFF724FC002807D101F0C1FD002803D1D0 -:105F1000FFF7FAFC002804D012482818124908603C -:105F20001AE0114801682800FFF7F8F9002813D09B -:105F300003F0ECF802F006FB002803D1032003F085 -:105F4000EDF809E003F0E2F8002020700120034999 -:105F500008700F200849087031BD000003130028A5 -:105F6000641C0028B80B0000041C00280C1C00282E -:105F7000651C00280413002805130028001C0028B5 -:105F80002818002800B502780B789A4227D1427869 -:105F90004B789A4223D182788B789A421FD1C2786B -:105FA000CB789A421BD142684B689A4217D1302273 -:105FB000825C3023CB5C9A4211D13222825C322344 -:105FC000CB5C9A420BD13122825C3123CB5C9A426A -:105FD00005D13422805C3422895C884201D00120C2 -:105FE00000E00020C0B200BD00B5007800280FD04E -:105FF000022811D00ED304280CD00FD306280FD0BE -:106000000ED308280CD00BD30A280DD00AD30DE0EC -:1060100000200CE001200AE0022008E0032006E056 -:10602000042004E0062002E0072000E0072000BD75 -:1060300000B5407800280ED0022810D00DD30428D7 -:1060400011D00ED3062812D00FD3082813D010D3A6 -:10605000092812D013E0002012E0012010E00220F5 -:106060000EE003200CE005200AE0042008E00620F2 -:1060700006E0072004E0092002E00B2000E00920F0 -:1060800000BD38B5FFF76CFB0400FFF795FB05007A -:1060900003F06CF8002808D003F072F8002801D152 -:1060A000032000E00420C0B214E0FFF7E2FB002868 -:1060B00001D005200EE0EDB2002D03D103F060F811 -:1060C000002801D0042005E0E4B2002C01D0022019 -:1060D00000E0012032BDFEB5FFF742FB69460871C2 -:1060E000FFF76AFB0400FFF794FB6946C870FFF7EF -:1060F000C0FB694688702000C0B2002807D103F0B9 -:106100003FF8002803D102F09BFA002801D00125B6 -:1061100000E000258D4807780F263740FFF7B1FFD4 -:10612000000138436946487089480078694608701C -:106130008848077803F01AF8002801D0102000E002 -:10614000002069468978002901D0402100E0002123 -:106150006A461279324010430143E8010843344053 -:106160006946C9780A012243BA4909780E4060237A -:106170003343694649786C46247824020C43B64977 -:10618000098809042143FFB2C0B200023843D2B2E9 -:1061900014040443DBB21A062243B04802F096FD11 -:1061A000FEBDF1B594B0AE4814A909780C22514354 -:1061B0004018019006A914A80078FFF7F7F8002806 -:1061C00001D10020C0E006A8FFF70EFF040006A8DA -:1061D000FFF72EFF070006A8C0786946087006A8DA -:1061E0003221405C002803D006A83021455C00E045 -:1061F0000025079869464880994814A909780C2217 -:1062000051434018807A002817D0019800780A2856 -:1062100003D0019800780B2801D1042400E0012468 -:10622000012701988078694608700198808869463E -:1062300048800198FFF7F0F8050006AE3220305C88 -:10624000002808D1864814A909780C225143401827 -:10625000807A002802D00420059001E000200590FB -:106260003420305C002802D00820049001E0002097 -:1062700004903420305C002805D00998002802D111 -:106280001020039001E0002003903420305C0028AF -:1062900009D00A98002806D009980A99884202D3A2 -:1062A0002020029001E0002002907078042802D1A2 -:1062B0004020019001E0002001907078072803D071 -:1062C000FCF727F8002801D0802000E00020694674 -:1062D00009788907890F059A0A4304991143039A9B -:1062E0000A4302991143019A0A4310433421715C15 -:1062F000002907D00D995B4A914201D35A4A02E026 -:106300000D9A00E0594A14A90978E4B223071B0F3B -:10631000FFB23C01F02626401E4333020B43C0B2BD -:1063200000041843694649880906014368464088C5 -:1063300080B2000A80B292B213020343EDB22A0681 -:106340001A434B4802F0C2FC15B0F0BD5D1C00289A -:106350005E1C00285F1C0028F1B590B001A910A8B0 -:106360000078FFF723F8002801D1002070E080209A -:1063700040020499814203D33C496A46518002E0BD -:1063800004996A4651800599814203D3374869468A -:10639000088002E005986946088007986430C821A3 -:1063A000FDF710FE0400FF2C00D9FF2401A840785F -:1063B000042801D1012700E0002701A84078072820 -:1063C00003D0FBF7A6FF002801D0022500E000253E -:1063D00001A84078082801D1042600E0002601A881 -:1063E0004078092803D002F02BF9002801D00821B9 -:1063F00000E000213D432E4331430F2001AA937852 -:106400000340090119433123D25C1040A94A10AB63 -:106410001B78D25C1201024310A80078C9B20B02AB -:106420000343684640880104194368460088E4B283 -:1064300023040343D2B212061A439F4802F046FCDB -:10644000002801D1002003E010A8007800F012F825 -:1064500011B0F0BD6C1C00283A1C0028010300009C -:10646000581A00281127000010270000FFFF000025 -:106470000203000078B585B004002000C0B20428F3 -:1064800009D22000C0B2FEF77EFF6946C0B2FCF719 -:1064900073FB002801D0002031E0684641780029D4 -:1064A00001D0012100E000218278002A01D00222DF -:1064B00000E00022C378002B01D0042300E0002379 -:1064C0000579002D01D0082600E000264579002D31 -:1064D00001D0102500E000250A4313431E43354335 -:1064E000E4B2EDB22A022243C188090411430389B0 -:1064F000808902041A43C120800002F0E7FB06B045 -:1065000070BDF8B5FCF722FB04006C4D2968200033 -:10651000FEF704FF002805D001206949087020001B -:106520006430286067480078002814D16648016804 -:106530002000FEF7F3FE00280DD0644A644800787E -:106540001070012063490B781278050095401D43B7 -:106550000D705C49087060480078002814D15F48CD -:1065600001682000FEF7DAFE00280DD05C4A5D4885 -:10657000007810705C4901200B7812780500954076 -:106580001D430D70544908704D4D287800281ED0C9 -:10659000FFF7A1FD002815D00020287053490A7884 -:1065A000521C1207120F0A7051490A78002A04D0AF -:1065B000504A1070504A1070087050480168491CC9 -:1065C000016003E04E480168491C016071E000254C -:1065D00000E06D1C2800C0B204282CD20127AF4077 -:1065E0003C4E30783842F4D02800C0B2FFF7D9FDD5 -:1065F00000281BD03078B843307032480178002929 -:106600000FD032490978EDB28D420AD130490A786B -:10661000521C9207920F0A700021017019342A4807 -:10662000046036480168491C016003E03448016891 -:10663000491C01603DE0002500E06D1C2800C0B24F -:10664000042836D20127AF40274E30783842F4D0A4 -:106650002800C0B2FFF780FE002825D03078B8436C -:10666000307014482900C9B2415C491C0907090F60 -:106670002A00D2B281541848017800290FD0184955 -:106680000978EDB28D420AD116490A78521C920758 -:10669000920F0A70002101701934104804601748E5 -:1066A0000168491C016003E015480168491C01604C -:1066B000FFE7F1BD081C002803030000101C0028A0 -:1066C000031300286A1C0028141C0028681C0028DA -:1066D000661C0028041300286B1C0028181C0028C6 -:1066E000691C0028671C0028051300286C1C002862 -:1066F000631C00285D1C00285E1C0028F81B002875 -:10670000FC1B002870470000704700001206130AA7 -:106710001A43130C1A4300BF094205D0830707D060 -:106720000270401C491EF9D1704700000022FFE7AB -:106730001300103906D330B41400150010393CC0D2 -:10674000FCD230BC490700D30CC000D504C089007E -:1067500002D30280801C002900D50270704700001F -:10676000F8B5020000231800A94C2468002959D06C -:1067700000920A781207120F009D10352E680F271D -:10678000BE4332432A604A78FF25AC43D2B222434B -:106790008C78002C01D0012400E01C009D4D154098 -:1067A00024028022520014402C430122CE7816404D -:1067B000994D254074028026B60034402C430D7953 -:1067C000002D01D0160000E01E00944D2540B402BB -:1067D0008026F60034402C434D79002D01D0160060 -:1067E00000E01E008E4D254074078026B60534401B -:1067F0002C438D79002D01D0160000E01E00A14D24 -:106800002540B4078026F60534402C43C979002979 -:1068100001D01300FFE762005208D9071143009A24 -:10682000116000E09848F2BD0021016001617047ED -:10683000F0B585B00C000025019594490E68944987 -:106840000968049193490968039193490F68934932 -:1068500009680291002C00D1D4E00090009800F06B -:10686000E7F802998020C000084380218900014395 -:106870008020400008430222024301210A430420F1 -:106880001043009A106120784007400F072296437A -:10689000304362785207520F7023984312017026DA -:1068A000164006430322A07810407D4B3340060279 -:1068B000C020800030401843E378002B01D00B004B -:1068C00000E02B00774E0640D80280231B011840C1 -:1068D00030432379002B01D00B0000E02B00460051 -:1068E0007608D8073043009B186060798006800ED8 -:1068F000049B3F26B3431843A3791340C026B043FB -:106900009B01C0261E400643E07943075B0F6648A3 -:1069100030401E02E023DB0033400343207A00288E -:1069200001D00D00FFE75F4E1E40E80280231B01EF -:1069300018403043657A1540874B03402D03C02033 -:10694000800128401843A57A1540844B0340AD03CD -:10695000C020000228401843A3891D052D0D804B3F -:1069600003402D047F4828401843A37B0B4045007B -:106970006D08D8072843009B5860E07B4007400F14 -:10698000039B0725AB431843237C0B404025A843BA -:106990009B0140252B400343607C014080208343C2 -:1069A000C801802108401843A17C6F4B03400902B5 -:1069B000FF20000208401843E17CC906C90E6B4B5A -:1069C00003400904F820400308401843217D0A4091 -:1069D000674901409205C020000410400843009917 -:1069E0008860E08A390C090480B20843218B82B2A6 -:1069F000080410430099C86021001A31009800F083 -:106A000055F801E020480190019805B0F0BD000064 -:106A1000B0DA0010FFFEFFFFFFFDFFFFFFFBFFFFEF -:106A2000FFFFFFDF3830016801220A430260704730 -:106A30003830016801229143016070473C300168A1 -:106A400001220A430260704710B5030000200029AC -:106A500016D0002A14D05B6A1C000C80190F0C00A1 -:106A6000E407E40F1470990F0C00E407E40F94702E -:106A7000590F0C00E407E40F5470D90FD17000E0F7 -:106A8000014810BDFFFFFFBF0100DA00B4DA0010BB -:106A9000B8DA0010BCDA0010C0DA0010C4DA001056 -:106AA000FFFCFFFFFFF7FFFFFFF8FFFFF0B50A0055 -:106AB000002319006F4C2468002A49D05579002D15 -:106AC00001D0012600E01E006B4D2540B402802657 -:106AD000F60034402C431579002D01D0012600E04A -:106AE0001E00664D254074028026B60034402C43BB -:106AF000D578002D01D0012600E01E00604D254014 -:106B000034028026760034402C435578002D01D085 -:106B1000012500E01D000226B4436D000226354029 -:106B200025431478002C01D0012400E01C0001262C -:106B30000127BD4334402C439278002A00D11E0027 -:106B400004229443B20004231A402243826100E0ED -:106B500047490800F0BD0000FFCFFFFFFF3FFFFFE8 -:106B6000FFFF00F00000FF0FFF00FFFFFFFFE0FF4F -:106B7000FFFF3FFFF0B50A0000231900414C2468D5 -:106B8000002A49D05579002D01D0012600E01E00D1 -:106B9000394D2540B4028026F60034402C43157947 -:106BA000002D01D0012600E01E00344D2540740266 -:106BB0008026B60034402C43D578002D01D0012624 -:106BC00000E01E002E4D2540340280267600344021 -:106BD0002C435578002D01D0012500E01D00022630 -:106BE000B4436D000226354025431478002C01D0B3 -:106BF000012400E01C0001260127BD4334402C4342 -:106C00009278002A00D11E0004229443B20004238B -:106C10001A402243026100E015490800F0BD00005F -:106C200010B50200002000291FD01269930A1C0031 -:106C3000E407E40F4C71530A1C00E407E40F0C71E5 -:106C4000130A1C00E407E40FCC7053081C00E4078F -:106C5000E40F4C7013001C00E407E40F0C70920862 -:106C60001300DB07DB0F8B7000E0014810BD000054 -:106C70000100DA00C8DA0010FFFBFFFFFFFDFFFF95 -:106C8000FFFEFFFFCCDA001000B5012027490A689B -:106C900052080240002A01D0022001E009680840A1 -:106CA00000BD274801680800C007C00F704700B545 -:106CB000C21E022A01D3012002E0C01E086000208B -:106CC00000BD1CB5FF246946FFF7F1FFC0B20028E4 -:106CD00002D02000C0B207E03C480099890041582A -:106CE0000800C007C00FC0B216BD00B5002801D013 -:106CF000032801D3012002E0401E0860002000BDEF -:106D00001CB5FF246946FFF7F0FFC0B2002802D08F -:106D10002000C0B208E03448009909014018C16859 -:106D20000800C007C00FC0B216BD000024152640E1 -:106D30002E48006881080800C007C00F7047000097 -:106D40004015264038B504002000C0B208280DD3F5 -:106D5000274D18222749280000F0D0FB0020E875B5 -:106D6000254826490860002000F028FC244821001E -:106D7000C9B2890041580A00D205D20F002A05D0B5 -:106D8000E4B2A10040580007000F00E0FF2032BD30 -:106D900038B505002800C0B208280ED3144C1822BC -:106DA0001449200000F0AAFB0020E07589200001B2 -:106DB00012490860002000F001FC1148EDB2A90062 -:106DC000405800098007800F32BD00004016264061 -:106DD0000F480068000AC0B270470E480068000AF9 -:106DE000C0B2704700000000001926401000274084 -:106DF000C41A0028DCD400105B080000881B00289F -:106E00004012264004480068000AC0B270470000E3 -:106E1000101020400C1020400810204038B504000D -:106E2000072C0ED3124D18221249280000F066FBE1 -:106E30000020E875CE2040000F490860002000F0D7 -:106E4000BDFB0A48A10040584007400F010009B2AD -:106E5000042907D10448A1004058C106C90E80206A -:106E60004000084300B232BD000126400012264017 -:106E7000C41A002838D50010881B00281E4909684C -:106E80008A03920B0260090E0A00D207D20FC27168 -:106E9000174909680A00D204D20C82800A00120C39 -:106EA000D2B20281090CC9B24181264909680F2278 -:106EB0000B00134003730B091A4042730A0AD204F1 -:106EC000D20CC281090F8907890F01740949096829 -:106ED0000A0A5207520F82710A00120CD205D20D13 -:106EE0004282890F0A00D207D20F02757047000054 -:106EF000341526403C152640301526401CB50C00A4 -:106F00006946FFF7D4FE0100C9B2002901D0C0B222 -:106F100017E00D480099890040584106490E21604C -:106F20001F21020A0A406260020C1140A160010F99 -:106F30008907890F6173C00E0100C907C90F21734A -:106F4000002016BD38152640001626401CB50C0042 -:106F50006946FFF7CAFE0100C9B2002901D0C0B2DC -:106F600033E01A48009909014158CAB222601F2231 -:106F70000B0A134063600B0C1A40A260090F8907CB -:106F8000890F21730099090141184A68D10F617373 -:106F90000721130F0B40002B01D0012300E0002339 -:106FA000A3731202120A2261009A120180188068EB -:106FB000C20F2275020E1300DB07DB0F63750200A0 -:106FC000A275000C0140E175002016BD0019264095 -:106FD00080B5010086481822FDF7F6FD012085499D -:106FE0000870002002BD000000B583490968C90F80 -:106FF000002907D07F490978002907D100210160C5 -:10700000032000BD002101600320FAE778490968E8 -:1070100001600020F5E7000010B50400FFF734FE22 -:10702000002803D10020206003200BE07148007885 -:10703000002804D06E4880682060002002E0002014 -:107040002060032010BD00B56A490978002904D0EA -:10705000674949680160002002E0002101600320C7 -:1070600000BD000000B565490968C90F002907D0B7 -:1070700060490978002907D100210160032000BD83 -:10708000002101600320FAE75949C9680160002026 -:10709000F5E7000000B55A490968C90F002907D073 -:1070A00054490978002907D100210160032000BD5F -:1070B000002101600320FAE74D49096901600020C1 -:1070C000F5E7000010B50400FFF732FE002803D1F9 -:1070D0000020206003200BE046480078002804D000 -:1070E000434840692060002002E000202060032027 -:1070F00010BD000010B50C00C0B2FFF78FFE0028D5 -:107100000CD0401E0ED0401E10D087214900401ADE -:1071100010D0401E12D0C01E14D017E02000FFF780 -:1071200063FF16E02000FFF78EFF12E02000FFF75C -:1071300073FF0EE02000FFF795FF0AE02000FFF745 -:10714000C1FF06E02000FFF7A5FF02E0002020605D -:10715000032010BD80B501000020FFF7CBFF02BD6A -:1071600080B50322D2B2824203D2002008600120FF -:1071700003E0401CC0B2FFF7BDFF02BD30B587B0D1 -:1071800004006846FFF7E6FF0100C9B2002903D0FA -:1071900000212160C0B228E001A8FFF76FFE01AD19 -:1071A000287C022803D10098206000201DE07B4845 -:1071B0000068C00F002808D0FFF773FDC0B2002898 -:1071C00007D10020206003200FE0009820600020FD -:1071D0000BE0009801994843A988FCF7F3FEE97990 -:1071E000491CFCF7EFFE2060002007B030BD000016 -:1071F000AC1A0028451C0028181526400815264002 -:107200000C152640F0B58BB004000D006946200037 -:10721000C0B2FFF7A5FF0100C9B2002903D00021C9 -:107220002960C0B2B7E02000C0B2022848D307A945 -:107230002000C0B2401CFFF761FEC0B200280DD094 -:10724000824E18228249300000F058F90020F07573 -:10725000804881490860002000F0B0F97F48210093 -:10726000C9B28900401808380068C00F002807D04C -:1072700007A8407B022807D10098286000208AE0F8 -:1072800000982860002086E0E4B2641C2000FFF72C -:1072900018FD0100C9B2002902D0C0B2FF2803D1F5 -:1072A00000202860032076E0009807994843089959 -:1072B000FCF788FE0999FCF785FE286000206AE04B -:1072C00001A92000C0B2401CFFF740FEC0B2002858 -:1072D0000DD05E4E18225E49300000F00FF90020FC -:1072E000F0755F485C490860002000F067F95D4870 -:1072F0002100C9B209014058C00F002807D001AED3 -:10730000307B022807D100982860002043E00098D5 -:10731000286000203FE0E4B2641C2000FFF7F0FC8E -:107320000100C9B2002902D0C0B2FF2803D1002059 -:10733000286003202FE0707B012821D100980021D4 -:10734000019E00273F06320A17433606059A00239E -:1073500092197B41FDF724F806000F0002980021E6 -:10736000039A0023FDF71CF802000B0030003900DF -:10737000FCF723FD000E0A021043090E286009E005 -:107380000098019948430299FCF71CFE0399FCF709 -:1073900019FE286000200BB0F0BD0000301526401B -:1073A00010B50323421E0400E4B2002C03D10800F0 -:1073B000FFF7E4FE0CE01400DBB2E4B2A34204D316 -:1073C0001000C0B2FFF71EFF02E0C0B2FFF792FE4E -:1073D00010BD38B504000D002000C0B2FFF7B2FCAC -:1073E0000100C9B2FF2904D12800FFF7FDFDC0B29A -:1073F0001BE06946C0B2FFF7D3FF0100C9B2002904 -:1074000003D000212960C0B20FE02000C0B2FFF716 -:10741000BFFCC0B2002805D002280BD006D3032839 -:107420000CD00FE000982860002032BD0098400882 -:107430002860F9E7009880082860F5E70098C00800 -:107440002860F1E7002028600320EEE7C41A002836 -:1074500038D5001063090000881B0028001626405C -:107460007F090000001926401CB504006946002071 -:10747000FFF7AFFF0100C9B2002903D0002121604E -:10748000C0B209E0FFF7A9FC01000098C9B2491C8D -:10749000FCF798FD2060002016BD1CB5040069466D -:1074A0000020FFF796FF0100C9B2002903D0002198 -:1074B0002160C0B208E0FFF78BFC01000098491C76 -:1074C000FCF780FD2060002016BD1CB50400684656 -:1074D000FFF7E3FF0100C9B2002901D0C0B208E004 -:1074E000FFF790FC01000098491CFCF76BFD206041 -:1074F000002016BD80B5FFF7E8FF02BD71B58B0710 -:1075000009D0521E28D30B780370401C1B421FD099 -:10751000491C8B07F5D1121F3ED3274CE50140C90A -:10752000331BB3432B4209D1830716D140C0121F2E -:1075300032D340C9331BB3432B42F7D0121DFF2374 -:107540001E4205D00670401C360A521E1E42F9D15A -:1075500011000022FFF7E0F871BDDB4216D0401E9B -:107560004670360A4680360C0671001D121F06D37F -:1075700040C9331BB3432B42F2D0401CDEE7401C12 -:107580000AE040C9331BB3432B42D7D10680360CE7 -:107590004680001D121FF4D2121D0BD00B78037011 -:1075A000521E07D0401C491C1B42F7D10370401CDF -:1075B000521EFBD171BD00000101010100B501BEE9 -:1075C000FEE780B50C4A0D490B68934210D00A6063 -:1075D00002684A6042688A608268CA60C2680A615A -:1075E00002694A6142698A618269CA61C069086246 -:1075F00002F06EF901BD0000F3F2F1F0881A0028E4 -:107600007047704700B5C0B2042801D2012000E0E5 -:107610000020C0B200BD00B50100C9B2002901D1EF -:107620007C4813E00100C9B2012902D1AF2040011A -:107630000CE00100C9B2022901D1774806E0C0B2CE -:10764000032802D1E120400100E0002000BD00B588 -:107650000100C9B2002901D15A2011E00100C9B2CC -:10766000012901D15A200BE00100C9B2022901D140 -:107670005A2005E0C0B2032801D15A2000E00020C2 -:1076800000BD00B5401A002801D4012000E0002010 -:10769000C0B200BD00B5884201D3401A00E0081A0C -:1076A00000BD10B500280FD00C00002C0CD0617864 -:1076B000002909D02169002906D0A168002903D03A -:1076C00021698268914201D2002019E0806800217E -:1076D000A2680023FCF764FE02000B00206940084A -:1076E00000218018594122690023FCF766FB61687C -:1076F000FFF7D0FF032801D2012000E00020C0B234 -:1077000010BD00B5C0B232382E2801D2012000E0F1 -:107710000020C0B200BD00B50178022905D0017873 -:10772000012904D14078022801D1012000E0002085 -:10773000C0B200BD00B50178032905D00178012948 -:1077400004D14078032801D1012000E00020C0B21C -:1077500000BD38B50C00B7490200D2B234235A43F9 -:107760008D18C0B2FAF715FF0A202870AC700020FF -:107770003021685431BDAF49C0B23422504308189B -:10778000092101700221817000213022815470474B -:10779000A849C0B2342250430818002101700322C6 -:1077A000827030228154704770B505000C002800AB -:1077B000C0B2FFF727FF002807D0FAF7AAFD00287C -:1077C00003D180204002844201D3002020E0280021 -:1077D000C0B2FAF7DEFE002807D1210089B22800E6 -:1077E000C0B2FAF79FFD002801D0002010E09148B8 -:1077F000EDB234214D434519342100222E003000D2 -:10780000FEF784FF6C600120A870302168540120CD -:1078100070BD0000FC530000901A0000F1B59CB050 -:107820000C0017001D001CA80078FFF7EBFE0028D5 -:107830001AD026A80078022803D026A800780328AA -:1078400012D101941CA80078FFF7E5FE0199884247 -:107850000AD304A91CA80078FBF714FA002803D166 -:1078600004A84078002801D10020D9E0714E1CA85E -:107870000078342148433018039003982E21405C4F -:10788000694648706846077024A80078002807D128 -:1078900068460078FFF735FF002801D10020BFE0DF -:1078A00007990198FFF7F6FE07000295239D259C96 -:1078B00024A8007800281AD00298002801D0002FB0 -:1078C00015D1002F11D1E4B2002C08D129001CA839 -:1078D0000078FFF769FF002801D10020A0E01CA874 -:1078E0000078FFF748FF01209AE0002098E00EA8FA -:1078F00003993422FDF768F92000C0B2002808D1AE -:1079000029001CA80078FFF74FFF002801D10020B4 -:1079100086E01CA80078342148433518E4B2002CD6 -:107920000CD028000EA93422FDF74EF901200100E9 -:10793000A97001003022A95469464870229C24A8ED -:107940000078002828D0002C01D0200013E0380057 -:107950000021FA2292000023FCF722FD02000B0016 -:1079600002980021801859410022401E9141029A3C -:107970000023FCF722FA002807D03A0001001CA8D7 -:107980000078FBF725FA002815D008211CA80078FC -:10799000FFF7DFFE002043E0684601781CA800786E -:1079A000FAF7DEFE002806D008211CA80078FFF7B1 -:1079B000D0FE002034E026A800786870002C01D0AA -:1079C000012001E026A8007828700198A860EC60EA -:1079D000002028610298A861684600782D2168542B -:1079E00024A800782F216854684640782E216854D6 -:1079F00001980799884201D3012000E002202C2140 -:107A0000685401991CA80078FBF7E4FA002806D016 -:107A100008211CA80078FFF79CFE002000E0012050 -:107A20001DB0F0BD10B5D02100227B4C2000FEF728 -:107A30006DFE10BD08190028F8B505000C002800DF -:107A4000C0B2FFF7DFFD002813D02800C0B2FAF75C -:107A5000A0FD7148EDB234214D4345193421002673 -:107A600032002F003800FEF751FE6C602E700320AC -:107A7000A870F1BD38B50400002505E021002800FC -:107A8000C0B2FFF7D9FF6D1C042DF7D331BD00B58F -:107A9000002000E0401C042809D25F493422424300 -:107AA00089183022895C0029F4D0012000E00020F0 -:107AB00000BD78B585B0040057482300DBB23425FB -:107AC0006B43C5182878082835D1696889B2200029 -:107AD000C0B2FAF783FC002804D12000C0B2FFF73F -:107AE00057FE96E02000C0B2FAF7DFFE002800D073 -:107AF0008FE0A86A002806D0A96A2000C0B2FAF771 -:107B0000CAFF002812D0696889B22000C0B2FAF713 -:107B100065FC002804D12000C0B2FFF739FE04E064 -:107B200009212000C0B2FFF714FE72E02000C0B2AD -:107B3000FFF721FE6DE0C87804280BD0C878022832 -:107B400008D0C878032805D0C878052802D0C8789E -:107B5000012805D109212000C0B2FFF7FAFD58E045 -:107B60002878012855D01600287806281BD1686A85 -:107B7000FA21490041183000FFF783FD002811D099 -:107B800069462000C0B2FAF753FF002805D009214A -:107B90002000C0B2FFF7DDFD3BE0039828626E6273 -:107BA0000720287035E0686AFA2189004118300002 -:107BB000FFF767FD00282CD069462000C0B2FAF715 -:107BC00037FF002805D009212000C0B2FFF7C1FD12 -:107BD0001FE0686A361A0398296A401A00210F4A82 -:107BE0000023FCF7DDFB32000023FCF7E6F806007B -:107BF000002E05D02000C0B2FAF7CBFC002805D03B -:107C000009212000C0B2FFF7A4FD02E0AE62082007 -:107C1000287006B070BD000008190028A086010079 -:107C2000F0B591B0FAF711FBFAF790FF059000203C -:107C300006900CE006212800C0B2FFF78AFD03E0A1 -:107C40002800C0B2FFF797FD0698401C06900698E2 -:107C5000042800D344E1069DA248069934225143EA -:107C600044183020205C002806D007A92800C0B2A4 -:107C7000FBF708F8002800D0E6E7FAF74AFB0028EF -:107C800003D107AEF078072805D107212800C0B23C -:107C9000FFF75FFDD8E7616889B22800C0B2FAF744 -:107CA0009DFB002804D12800C0B2FFF771FDCBE78F -:107CB000F078062807D12078082804D02800C0B220 -:107CC000FFF766FDC0E72078012814D1B0780028BE -:107CD00011D0607820702078062802D10598606263 -:107CE00009E0E068002804D00598E16840182061A8 -:107CF00001E000202061207806280BD0207807289A -:107D000008D02078082805D02078012809D160788B -:107D1000062806D1059A07A92800C0B2FFF7C9FEB8 -:107D200092E7207804282DD161690598FFF7A9FC16 -:107D3000002826D060780490012003902F20205C3A -:107D4000029060680190E0680090A3692D20225C99 -:107D5000A1682800C0B2FFF761FD002811D1616859 -:107D600089B22800C0B2FAF739FB002804D12800F4 -:107D7000C0B2FFF70DFD04E004212800C0B2FFF7F8 -:107D8000E8FC61E7F078022802D0F078032801D1FE -:107D9000012700E00027F078042803D03800C0B2A3 -:107DA000002852D02000FFF7B6FC00280AD007A90F -:107DB0002000FFF776FC002804D02800C0B2FFF7AF -:107DC000DAFC41E72000FFF7A6FC002823D02E2094 -:107DD000205C00281FD12800C0B2FAF7DAFB002887 -:107DE0000CD0FAF796FA002801D0072100E008210C -:107DF000C9B22800C0B2FFF7ACFC25E70420207010 -:107E0000002020610598FA21C90040186061012016 -:107E10002E21605418E03800C0B2002809D020009C -:107E2000FFF788FC002804D02800C0B2FFF7A3FCAD -:107E30000AE0FFB2002F01D0052100E00421C9B201 -:107E40002800C0B2FFF785FCFEE6F078012804D1D7 -:107E50002800C0B2FFF78FFCF6E6F078052805D1C0 -:107E600006212800C0B2FFF774FCEDE62069002867 -:107E700000D1E9E621690598FFF703FC002800D14D -:107E8000E2E62800C0B2FAF784FB00280CD0FAF72B -:107E900040FA002801D0072100E00821C9B22800DB -:107EA000C0B2FFF756FCCFE62078032800D0C1E629 -:107EB00069462800C0B2FAF7BBFD002805D00821AA -:107EC0002800C0B2FFF745FCBEE60398E16988428E -:107ED00000D0B5E604212800C0B2FFF73AFCB3E6B3 -:107EE00011B0F0BD08190028F0B58FB00C001D00CE -:107EF00061498C4211D21600002E0ED0070005A950 -:107F00003800C0B2FAF7BEFE002806D105A84078B6 -:107F1000002802D00998002801D1002020E020008C -:107F20000021099A0023FCF73BFA02000B0053489A -:107F3000002180185941524A0023FBF73EFF0221DD -:107F4000049100210391002102911499019100965E -:107F500000232A00D2B201003800C0B2FFF75EFC55 -:107F60000FB0F0BDF0B58BB007000E0014001D007F -:107F700001A93800C0B2FAF785FE002803D101A894 -:107F80004078002801D1002012E00A9881190029C8 -:107F900001D5002103E03848814200DB38492B003D -:107FA000220010980090DBB23800C0B2FFF79CFFAF -:107FB0000BB0F0BDF6B585B004000E0006980028A1 -:107FC00015D01F003800C0B2FFF79BFB00280ED071 -:107FD0003000C0B2012803D03000C0B2022806D160 -:107FE0000C992000C0B2FFF7DFFB002801D1002070 -:107FF00040E03900C9B22000C0B2FAF7B1FB002856 -:1080000006D008212000C0B2FFF7A3FB002031E01A -:1080100043482100C9B23422514345186946200023 -:10802000C0B2FAF705FD002806D008212000C0B232 -:10803000FFF78FFB00201DE00398E8613100C9B213 -:108040002000C0B2FAF720FC002806D0082120004A -:10805000C0B2FFF77EFB00200CE001202870032057 -:1080600068702C202E540698E860002028612D208E -:108070002F54012007B0F0BD112700008813000025 -:1080800010270000FEB504000D0016002000C0B24D -:10809000FFF7B8FA002802D02F00002F01D10020EE -:1080A0003DE02000C0B2FFF7D2FA05003100200009 -:1080B000C0B2FFF779FB002807D02900C9B2200021 -:1080C000C0B2FAF74DFB002806D009212000C0B24B -:1080D000FFF73FFB002022E0052011492200D2B229 -:1080E00034235A4388546B463A0002212000C0B220 -:1080F000FBF768FB002806D168460178002902D00A -:108100004078002806D109212000C0B2FFF721FBEA -:10811000002004E02000C0B2FFF72DFB0120FEBDCF -:1081200008190028FEB504000D0016002000C0B29A -:10813000FFF768FA002802D02F00002F01D100209D -:108140003AE02000C0B2FFF782FA050031002000BB -:10815000C0B2FFF729FB002807D02900C9B22000D0 -:10816000C0B2FAF7FDFA002806D009212000C0B2FB -:10817000FFF7EFFA00201FE0052056492200D2B297 -:1081800034235A4388546B463A0000212000C0B281 -:10819000FBF718FB002803D168460078002806D1B9 -:1081A00009212000C0B2FFF7D4FA002004E020002B -:1081B000C0B2FFF7E0FA0120FEBD70B50400200058 -:1081C000C0B2FFF71FFA002809D02000C0B2FAF7AA -:1081D0006CFB002803D1FAF79CF8002801D000209E -:1081E00013E03C48E4B234214C4304193020205CB5 -:1081F000002801D0002008E0656834210022260014 -:108200003000FEF783FA6560012070BD38B596B086 -:1082100005000C00002C1AD02800C0B2FFF7F2F9BC -:10822000002814D069462800C0B2FAF72BFD0028B8 -:108230000DD10FA92800C0B2FAF776FE002806D1AA -:108240000AA92800C0B2FAF7F3FB002801D00020E9 -:108250003CE02048EDB234214D43401901782170B3 -:10826000817861706946CA78A2708A78E270426843 -:108270006260039AA260019AE260029A22610C9AFB -:108280006261149AA261099AE261059A2262069AD1 -:108290006262079AA262089AE2620FAA527E3023B3 -:1082A000E2542E22825C3123E2543022825C32235B -:1082B000E2542E22805C002801D0012000E0002042 -:1082C0003322A054487834216054012017B030BDC7 -:1082D0000000000008190028F8B5C0B0002001F027 -:1082E00072FB20A9002000F016FA07006946012061 -:1082F00000F011FA04003800C0B2022801D10125B3 -:1083000000E000252000C0B2022801D1012600E0D3 -:1083100000263000284387490870864800780028E6 -:1083200013D1FFB2002F04D120A800F04CFA00288E -:1083300007D0E4B2002C08D1684600F044FA0028C7 -:1083400003D101207C49087002E000207A490870BE -:108350007848007800280FD100200100BA4A117037 -:108360007649086005E00021C943754A8300D15071 -:10837000401C2028F7D331E0F6B2002E16D0EDB223 -:10838000002D05D02299029800F014FA00280DD093 -:1083900001206A4908600020202814D26946820022 -:1083A0008958674A8300D150401CF5E70020634993 -:1083B000086006E020A982008958614A8300D150F4 -:1083C000401C2028F6D35E48C068012803D1012054 -:1083D0009D49087002E000209B49087041B0F0BD43 -:1083E000F0B595B053480078002803D0964800783F -:1083F000002801D1002065E0002400E0641C042C6A -:108400004ED2062767433F1D4D4DB800285801A99D -:1084100014226243885001AEB80028184068142125 -:10842000614371184860B8002818806814216143BE -:1084300071188860B8002818C06814216143711849 -:10844000C860B800281800690090B8002818406972 -:10845000012801D1012000E000201421614371189E -:108460000874142060433018426801A81421614345 -:1084700041582000C0B200F02DF9B90069184969CF -:1084800002290BD20099814208D11420604331188F -:108490002000C0B2FAF73AFA0028AFD0002011E06D -:1084A000002400E0641C042C0BD201A814216143B9 -:1084B00041182000C0B2FAF753FA0028F2D0002089 -:1084C00000E0012015B0F0BD00205F4908700120D8 -:1084D00019490870704710B5A0B0164800780028F8 -:1084E00003D059480078002804D10020564908706C -:1084F00001201CE00020010006E0114A8B00D25848 -:108500006B468C001A51491C2029F6D30C49896806 -:10851000491C029103901C21684600F097F81C90BA -:10852000A048006801214140684600F075F920B07C -:1085300010BD00006D1C00286F1C00281C1C0028AA -:10854000D8190028F8B5B0B0974F3878002805D072 -:108550009448006801214140009101E00020009012 -:108560000026300005E00021C94310AA8300D15045 -:10857000401C2028F7D38D4810900820119038789F -:10858000002803D08A488068401C00E00120129037 -:108590000120139034001FE0310019E0019810A968 -:1085A000AA00885010A80299AA0082185160039965 -:1085B000AA00821891600499AA008218D1600999D2 -:1085C000AA008218116101A9097C0029E4D00121C7 -:1085D000AA0080184161641C042C12D20625654350 -:1085E0002D1D01A92000C0B2FAF722FA002806D1F9 -:1085F00006A92000C0B2FAF745FB0028CED0002023 -:1086000016E01C2110A800F021F82C9038780028E2 -:108610000AD022480078002806D010A800F0E7F819 -:10862000002801D0012003E0009910A800F0F4F820 -:1086300031B0F0BDA04800787047A048007870477E -:108640009F480078704700006E1C0028F2B5002695 -:10865000F64300210A0000E0521C009B9A421AD205 -:108660009300C4580B0000E05B1C042BF4D23500CF -:10867000E6B26E40240A0D0001E00F0004E0082D70 -:10868000F2D2F707F9D5904F7608B4463E00674618 -:108690007E406D1CF3E7F043F2BD00006E1C002825 -:1086A000C0018A494018704700B5C0B2002805D003 -:1086B000022808D004D3032807D009E0844808E042 -:1086C000AF20400105E0834803E0E120400100E0E5 -:1086D000002000BD38B50D001400C0B2FFF7E4FF64 -:1086E00002002800002A01D0002C02D10020C04343 -:1086F00010E0844200D2200000210023FBF750FE4E -:1087000002000B006008002180185941220000235C -:10871000FBF753FB32BD10B50C00FFF7C1FF002C77 -:1087200001D100203CE0002104E08A0082588B0047 -:10873000E250491C2029F8D3E068022801D3002028 -:108740002EE02068194988420BD16068082808D1BA -:108750001C212000FFF77AFF216F814201D1022006 -:108760001EE020685C49884202D1606805280DD06F -:1087700020685A49884202D16068062806D02068DD -:10878000574988420BD16068072808D11C21200076 -:10879000FFF75CFF216F814201D1012000E0002042 -:1087A00010BD00001C1C00286D1C002838564D53BD -:1087B000D819002800B5401A012801DB012000E08B -:1087C0000020C0B200BD00B5002801D100200DE09E -:1087D000002100E0491C202907D28A00825800238A -:1087E000DB439A42F6D0002000E0012000BD10B526 -:1087F000002801D100200EE0042100E0491C1C29C2 -:1088000008D28A0082582F4B8C001B599A42F5D00F -:10881000002000E0012010BDFEB50500002D03D0B2 -:1088200000910098022801D3002043E00098FFF750 -:1088300037FF070001970121380001F0E2F801211C -:10884000380001F01CF9002801D1002032E0002698 -:10885000340007E00122A0002918A000381801F018 -:1088600057F9641C202CF5D3300005E081006958CD -:10887000144A8300D150401C202808D2019982005C -:1088800089588200AA589142F0D0002012E0009846 -:108890001449086001200100074A1170E9680129A4 -:1088A00002D10649087002E030000449087004480B -:1088B00006700120FEBD00006D1C00286E1C002803 -:1088C0006F1C0028D81900282083B8ED000003147D -:1088D000FC530000901A000035564D5336564D5348 -:1088E00037564D531C1C002800B5010009B2002961 -:1088F00005D40121C006C00E8140AE48016000BD14 -:1089000000B5010009B2002905D40121C006C00E3E -:108910008140CC48016000BDF0B5020012B2002ACF -:1089200018D41822A44B040024B2A408A4001C5993 -:10893000FF250600F6001640B540AC438901C9B2D8 -:108940000500ED002A409140214300B280088000DC -:1089500019501CE00F22BC4C182503001BB2134019 -:10896000083B9B089B00060036B23240083A92084A -:108970009200A258FF260700FF002F40BE40B243DE -:108980008901C9B2C0000540A9401143E150F0BDC2 -:1089900000B5002A03D101228A40426002E0012290 -:1089A0008A40826000BD0268CA401000C007C00F44 -:1089B000704700B5022801D301200FE00B00DBB2A5 -:1089C000042B01DB012009E0BC4B80001818C9B260 -:1089D000405C824201D3012000E0002000BDF8B5D8 -:1089E00004001F00022C01D3012023E015000E001B -:1089F0002A003100C9B22000FFF7DBFF012801D1B6 -:108A0000012017E03000C0B2002816D1FF2F12D885 -:108A1000AB4861034018A900401880214901401863 -:108A20000168A84A0A403902FF231B020B40134386 -:108A300003600020F2BD0120FCE7F6B2012E16D142 -:108A400080204002874210D29D4861034018A9004F -:108A50004018A0214901401801689B4A0A40390288 -:108A6000C44B0B4013430360E3E70120E2E701201E -:108A7000E0E700B20012C0B27047F8B505000F0081 -:108A80001600280000B2FFF7F4FF04002000C0B277 -:108A9000022801D301202CE032003900C9B22000A5 -:108AA000C0B2FFF786FF012801D1012021E08448F0 -:108AB0002100C9B2490341182A00D2B29200891894 -:108AC000C02212018A58AC491140FFB23B02C022B9 -:108AD00092001A400A43FF218A43F1B21143E4B2E3 -:108AE00062038018EDB2AA008018C02212018150E2 -:108AF0000020F2BD70B50400022C01D3012028E053 -:108B000015000E002A003100C9B22000FFF751FF06 -:108B1000012801D101201CE06948610341588022ED -:108B200012060A43C02189041143FF2212040A439A -:108B3000914B1340F6B23202C02189001140194313 -:108B4000FF229143EAB20A43610342506103405855 -:108B5000002070BD70B50400022C01D3012028E074 -:108B600015000E002A003100C9B22000FFF721FFD6 -:108B7000012801D101201CE05148610341588022A5 -:108B8000D2050A43C02189041143FF2212040A437B -:108B9000794B1340F6B23202C021890011401943CB -:108BA000FF229143EAB20A436103425061034058F5 -:108BB000002070BD00E100E000E400E038B50020D6 -:108BC0000100974A11700100964A11709649086099 -:108BD00000F0D4F8002803D000F02CF9002804D1CC -:108BE0009248B849086000202BE0914C2000FBF728 -:108BF000B9FF002804D08D48B2490860002020E069 -:108C0000B1490020205EFBF7CCFF00210220205E4E -:108C1000FFF782FE0220205EFFF772FEAB4D2800B8 -:108C200001F05AFEAA49280001F0CCFAA5490860D3 -:108C3000002801D0002004E00220205EFFF754FE4F -:108C4000012032BD80E200E01CED00E038B50400F8 -:108C5000002C01D100202FE0FBF74AFE71490A7871 -:108C600013006F4D2D78DBB2AB4203D1FBF744FE0E -:108C7000002021E0C44B1500EDB22D015D592560A7 -:108C80001500EDB22D015D196D6865601500EDB23E -:108C90002D015D19AD68A5601500EDB22D015B19C0 -:108CA0001B7B2373521C1300DBB2102B00D300225A -:108CB0000A70FBF721FE012032BD000098DA001097 -:108CC00000000440FF00FFFFFF0000FFF1B594B07B -:108CD0000D0016005021002422006F463800FDF7D9 -:108CE00015FD149880210901884203D24E4800687E -:108CF000002804D04D48A9490860002038E06846A3 -:108D000021000170210001721499019108214C2267 -:108D100081540395049600E0641C2000C0B208282A -:108D200021D26A4D2100C9B2280001F02DFF0100B7 -:108D3000C9B20129F0D0C0B20328EDD014989849E7 -:108D400008606A462100C9B2280001F049FE934933 -:108D50000860002805D193480168491C0160012082 -:108D600006E0002004E090480168491C01600020F2 -:108D700015B0F0BD00FFFF00FFFCFFFFF8B50025B8 -:108D800000956846FEF770FB002801D0002046E001 -:108D9000864C0098A04205D300982100FBF712F9F9 -:108DA000002901D000203AE000982100FBF70AF9E1 -:108DB0000400002C03D0FF20801C844201D300203B -:108DC0002DE0FF2608363000FFF753FE0700002293 -:108DD00000213800FFF7BEFE002801D000201EE071 -:108DE000002200213000FFF748FE002801D00020BB -:108DF00015E023005B1E002200213800FFF7EFFD85 -:108E0000002801D000200AE0002200213800FFF7EE -:108E100071FE002801D1012000E02800C0B2F2BD9F -:108E2000411C0028421C00287C1B00280100620015 -:108E30000008002818B5A7B01AA85D493422FBF72E -:108E4000C3FE0DA85B493422FBF7BEFE68465A49B3 -:108E50003422FBF7B9FE594C1AAA07212000FBF770 -:108E600072F8002801D0002024E00DAA062120007D -:108E7000FBF769F8002801D000201BE06A460121B9 -:108E80002000FBF760F8002801D0002012E001224A -:108E900001212000FFF77CFDFA208000FCF77EF81E -:108EA00001212000FFF77FFD012801D1012000E012 -:108EB0000020C0B228B010BD80B5044801F042F8CF -:108EC00001BD00005C1B0028B98E00100004544056 -:108ED0000808002870B51400002C05D0207A00285E -:108EE00002D12078002800D04DE035480168491CA7 -:108EF00001606068334908606068C0218900884269 -:108F000014D14C20205C082810D1E068C0B2092898 -:108F10000CD1E068000AC0B2102807D120690028EF -:108F200004D1E068000C80B2F9F7E2FA2648017833 -:108F30000A00521C1300DBB2102B00D300221300D6 -:108F4000224D2D78DBB2AB4204D121480168491C87 -:108F5000016018E00C4B65680E00F6B236019D51B9 -:108F60004C25655D0E00F6B236019E193573E56835 -:108F70000E00F6B236019E1975602469C9B2090166 -:108F800059188C60027070BD2817002800B5C0B257 -:108F9000002802D101200F49086000BD781B00287D -:108FA000741B0028681B00286C1B0028005A6202F2 -:108FB00074D70010A8D70010DCD700108001314012 -:108FC000601B0028701B0028411C0028421C002840 -:108FD000641B00287C1B00286B490A6808607047E6 -:108FE0006A490A6810239A43C0B20001102318404E -:108FF00010430860704765490A68654B1340C0B26A -:1090000000028022520010401843086070475F49F8 -:109010000A6852005208C0B2C00710430860704787 -:10902000002070475B480068704710B5040059483D -:109030000460BFF34F8FFFF7F5FFA04201D101207D -:1090400000E00020C0B210BDF8B50400FF20E230FF -:109050000090FFF7E5FF0700FFF7E4FF01252E0072 -:1090600000210A004C4B1A700A004C4B1A70009AEF -:109070002240002A02D04A490D7001E0484A11708E -:10908000610005D50020FFF7D0FF0600FFF7CAFFFB -:10909000F6B2002E09D04349884206D042498842A0 -:1090A00007D13800C0B2002803D105203A49087022 -:1090B00012E03B480078002803D0042036490870AD -:1090C0000AE0FFB2002F07D00800FFF7AEFF00282C -:1090D00002D1052030490870FBF7CEFFFBF7F6FF01 -:1090E000C8200001FFF778FF0120FFF779FF00207B -:1090F000FFF781FF0120FFF78AFFFBF7DCFFFBF79B -:10910000F8FF2648057000F001F8F1BD80B523484E -:109110000078002801D0FCF713F801BD80B50100EC -:10912000C9B200290CD01C490A78002A08D108705D -:109130000020F9F715FAF9F721FA0020FEF79AFC5A -:1091400001BD80B5FFF76CFFFFF76CFF1549884242 -:1091500002D10520FFF7E2FFF9F7DBF8002802D083 -:109160000120FFF7DBFFFFF7D1FF01BD00B50A4883 -:109170000078002801D0012000E00020C0B200BD2E -:10918000054800787047000008C0264010C02640FF -:10919000FFFEFFFF0C102740521C0028541C002823 -:1091A000531C002845564F4D41564F4D1CB501F0FC -:1091B00019FD002803D100F0B9F800202BE001F0E0 -:1091C000F3FF002803D100F0B1F8002023E0FBF703 -:1091D00002FA002805D069460520FBF78BFA002823 -:1091E00003D100F0A3F8002015E0684600889749F5 -:1091F00008800124964804700020964908600120E8 -:1092000000F084FA012000F09DFA64209249086081 -:1092100092480470012016BD80B5002804D1904802 -:109220000168491C016020E08E490A68521C0A60EE -:1092300001688D4A891A08D00C3909D0922252004F -:10924000891A08D05C3909D00BE000F085F80CE0F1 -:1092500000F00EF909E000F06DF906E000F0A0F969 -:1092600003E07F480168491C016001BD80B501F041 -:10927000E7FC00F03CF87D480178E02905D0017852 -:10928000052902D00078002806D10020A6490870E0 -:109290000120724908700EE0A4480178002906D127 -:1092A000A1480178002906D00121017003E000786F -:1092B000401C9D4908709E480078002814D0B4488E -:1092C0000168002910D00168491E0160006800286B -:1092D0000AD1B048007801F0D9FF002804D101205C -:1092E000AD49086000F056FA00F05BFA01BD1CB50C -:1092F00058480168491C016001680A2915D30024F7 -:10930000046069460520FBF7F5F9002807D0684698 -:1093100000884E49088001204D49087005E09F48AB -:109320000168491C01604A48047013BD80B501F012 -:10933000FEFC02F083FA01F0C0FF002001007C4A2D -:109340001170934908600100B64A1170764908709F -:1093500001204249087001BD70B5017B08290AD07F -:109360003F480168491C0160002000F0CFF900204F -:1093700000F0E8F968E00324416822000A404168EF -:10938000890823000B404168090925000D400F267C -:109390004168090C31404068000D06401000C0B221 -:1093A000022803D1012000F0B1F924E0D2B2012A51 -:1093B0001AD11800C0B2012802D0DBB2022B13D19F -:1093C0000800C0B200280FD00800C0B206280BD297 -:1093D0000800C0B200F028F900280CD102206E4924 -:1093E000086000F0D7F906E01D480168491C0160DB -:1093F000002000F08BF92800C0B2022803D1012020 -:1094000000F0A0F920E0EDB2012D16D13000C0B27D -:10941000002812D03000C0B206280ED2BA48007818 -:1094200000280AD03000C0B200F03FF900280BD16C -:109430005948046000F0AEF906E009480168491C8B -:109440000160002000F07EF970BD0000381C00288B -:109450005C1C0028E41B0028E01B0028FE120028EA -:10946000C81B0028C41B00289E020000571C0028AF -:1094700080B5017B082904D0B0480168491C01600F -:1094800051E0436807214268120C0A404068C00C52 -:109490000140DBB2012B07D11000C0B2052803D276 -:1094A0000800C0B2052804D3A4480168491C016023 -:1094B00039E01000C0B2012801D1012005E0D2B28C -:1094C000022A01D1022000E003209D4A107008000A -:1094D000C0B2012801D1012005E0C9B2022901D1A1 -:1094E000022000E00320A1490870114800780028FC -:1094F0000AD09F48007800F097F8002804D1042093 -:109500002549086000F046F90848007800280AD08C -:109510009848007800F0C9F8002804D105201E49B9 -:10952000086000F037F901BDFD120028561C002824 -:10953000591C002880B5017B08290AD000207249F7 -:1095400008707E480168491C0160002000F0FAF8AC -:109550001CE0406800098007800F0100C9B20129A2 -:1095600002D0C0B2022803D101206749087002E08E -:1095700000206549087064480078002806D16F48CB -:109580000168491C0160002000F0DCF801BD00000A -:10959000DC1B00285B1C0028D41B0028D81B0028DB -:1095A00010B5017B08290AD064480168491C016094 -:1095B000002000F0ABF8002000F0C4F831E00324F4 -:1095C000416821404068800804400800C0B201287A -:1095D0000BD16748007800F027F800280BD106204F -:1095E000A849086000F0D6F805E0C9B2022902D106 -:1095F000012000F08BF82000C0B201280BD15D489B -:10960000007800F052F800280BD107209D4908602F -:1096100000F0C0F805E0E4B2022C02D1012000F015 -:1096200091F810BDFC12002870B50100C9B20329E1 -:1096300001D3032500E005000100C9B2002903D0D1 -:109640000100C9B2062901D3002025E03C490A786F -:109650002B00DBB29A4200D20D78454908708A4C43 -:109660002800C0B200F088F820706D1C8748057093 -:10967000012587480570874E307800280DD1642079 -:1096800001F0B8FD002801D1002005E03570FA2076 -:10969000C00081490860012070BD7F480068002833 -:1096A000F9D1207801F0F2FDF6E710B50100C9B25A -:1096B000032901D3032400E004000100C9B20029FA -:1096C00007D00100C9B2062903D20F490978002941 -:1096D00001D1002017E025490A782300DBB29A4225 -:1096E00000D20C78234908702000C0B201F00AFBB8 -:1096F000002801D1002006E0641C684804700120A5 -:1097000063490870012010BD5A1C002810B50400E0 -:1097100001F0D3FD002001005E4A11705E4908602F -:109720000100594A11702100C9B2052900D3040073 -:109730005648047001205649087010BDC81B002807 -:109740000013002810B50400002001F0DBFA002807 -:1097500001D102F073F82000C0B2052800D3002424 -:109760004E48047001204A49087010BD02130028B9 -:10977000FF1200280113002800B50100C9B2012919 -:1097800001D1322005E0C0B2022801D1462000E01C -:10979000642000BD80B5FFF7C9FD0120FFF7BEFCC6 -:1097A00001BDF8B53E4C2068401C2060384D28783B -:1097B000002802D12068642862D334480078C0B2FF -:1097C0004007400F35490978C90038220A40024352 -:1097D000009234480078002801D0012100E00021E7 -:1097E00031480078E02801D0022000E00020084342 -:1097F00028490978002901D0012100E000212B4AE5 -:109800001278530006221A400A4380235B0028493D -:109810000E689E4201D3FF2100E00968254E37689B -:109820009F4201D3FF2300E03368C0B2D2B21202DC -:109830000243214800880704174320480088C9B222 -:1098400009040143DBB21E060E43002200991C48A6 -:10985000FFF73CFA00280FD0320039001948FFF713 -:1098600035FA002808D018480168491C016000201A -:1098700001002970206003E014480168491C016060 -:10988000F1BD0000D41B00285B1C0028FC1200283E -:10989000FE120028591C0028DC1B0028FD1200289D -:1098A000E01B00285C1C0028571C0028561C0028C0 -:1098B000D81B0028B01B0028381C0028361C0028A4 -:1098C000FA04000005030000CC1B0028D01B002870 -:1098D00000B5FEE700B5010009B2002905D4012159 -:1098E000C006C00E8140B748016000BDF0B502005F -:1098F00012B2002A18D41822844B040024B2A408FF -:10990000A4001C59FF250600F6001640B540AC43E4 -:109910008901C9B20500ED002A409140214300B2FF -:109920008008800019501CE00F22A74C1825030066 -:109930001BB21340083B9B089B00060036B2324026 -:10994000083A92089200A258FF260700FF002F4015 -:10995000BE40B2438901C9B2C0000540A9401143CD -:10996000E150F0BD00B59D48012102680A43026044 -:1099700002680A40002AFBD100BD99480168012213 -:109980000A43026070479748016801220A43026057 -:1099900070471FB5684602F049F900280DD08B4C7E -:1099A00018228B492000FDF7A9FD0020E075492011 -:1099B000884908600020FDF701FE01208A490870EF -:1099C000FFF7D0FF1FBD80B5C0B201280ED1032123 -:1099D000814802F05BF903210320FFF787FF032092 -:1099E000FFF778FF01208149087002E000207F49DD -:1099F0000870FFF7C2FFFFF7C6FF01207A49087021 -:109A000001BD7CB505000E00794803C86A4603C253 -:109A1000083A3000C0B2002814D1744800780128F8 -:109A20000DD06A4C18226A492000FDF767FD00201E -:109A3000E0759420674908600020FDF7BFFD002015 -:109A400069490870684601210171002421004171B3 -:109A500000953200D2B26946002002F027FB0028B0 -:109A60000CD05A4D18225A492800FDF747FDEC75D5 -:109A70009E20584908600020FDF7A0FD73BD7CB50D -:109A800006000D00300002F013FA00280DD04F4CF4 -:109A900018224F492000FDF731FD0020E075B52068 -:109AA0004C4908600020FDF789FD2800C0B200285D -:109AB00014D14E48007801280DD0444C1822444956 -:109AC0002000FDF71BFD0020E075B920414908602A -:109AD0000020FDF773FD0020434908700096300018 -:109AE00002F024FA002801D0202001E0802080002C -:109AF00001902A00D2B26946002002F03FFB002804 -:109B000001D1012000E0002076BD000000E400E06B -:109B1000F8B584B007000E001500380002F0C8F94F -:109B200000280DD0294C182229492000FDF7E6FC19 -:109B30000020E075DF20274908600020FDF73EFD8A -:109B400068461021FCF7F2FD2800C0B2002814D1AD -:109B50002648007801280DD01C4C18221C492000F2 -:109B6000FDF7CCFC0020E075E6201A4908600020D3 -:109B7000FDF724FD00201C490870012168460A00F9 -:109B800002720A00427202228272C1720024210013 -:109B90000173009701962A00D2B26946002002F0B4 -:109BA00027F900280CD0094D182209492800FDF793 -:109BB000A5FCEC75F520074908600020FDF7FEFCC8 -:109BC00005B0F0BD00E100E01CED00E0C41A002883 -:109BD000F0D50010881B002893990010080024403D -:109BE00000F4244000F52440431C0028441C0028B5 -:109BF00088DA001000B5002801D0002901D1A04862 -:109C000008E0A04A904206D1002008808020800110 -:109C10004860002000BD9C4A904205D18020800110 -:109C200002000A804860F4E7BA4A904206D18020D8 -:109C3000C0010880802080014860EAE7B64A90426F -:109C400006D1C020C0010880802080014860E0E784 -:109C5000B24A904206D18020000208808020800114 -:109C60004860D6E7AE4A904205D1002008808020A7 -:109C700080014860CDE7AB4A904205D18020800149 -:109C800002000A804860C4E7A74A904206D18020BB -:109C9000C0010880802080014860BAE7A34A904252 -:109CA00006D1C020C0010880802080014860B0E754 -:109CB0009F4A904206D180200002088080208001C7 -:109CC0004860A6E76E48A5E700B5002100E0491C02 -:109CD0000A290AD2974A18234B43D3589842F6D1FF -:109CE000182041435018001D00E0002000BD10B5B1 -:109CF0000A00D2B2402A01DB002017E0020C120455 -:109D000080235B02D218AC23C3589B089B049B0C96 -:109D10009B00D218C9B2884BBC240059000A4007E6 -:109D2000400F185C801C41438800101810BD10B50E -:109D30000A00D2B2202A01DB002016E0020C120435 -:109D400080235B02D218C023C3589B089B049B0C42 -:109D50009B00D218C9B2784BC82400594007400F65 -:109D6000185C801C41438800101810BD10B50B0012 -:109D7000DBB2022B01DB002028E0030C1B04802453 -:109D800064021B190C00E4B2002C05D1A024045974 -:109D9000A408A404A40C04E0B0240459A408A40456 -:109DA000A40CA4001B19C9B2002904D1BC2140583D -:109DB0004007400F04E0BC21405800094007400F15 -:109DC0005D49085C801C42439000181810BD00B526 -:109DD0005A49884201D3052100E00021400A40068B -:109DE000400E0818C0B200BD38B504000020002C99 -:109DF00044D02000FFF7EBFF0121226D520F0A40F3 -:109E0000002A05D00A004E4B0500EDB26D005A53F2 -:109E1000226D120F0A40002A05D00222484B05008D -:109E2000EDB26D005A53226DD20E0A40002A05D0C1 -:109E30000322434B0500EDB26D005A53226D920E82 -:109E40000A40002A05D004223D4B0500EDB26D000A -:109E50005A53226D520E0A40002A05D00522384B73 -:109E60000500EDB26D005A53226D520D11400029CC -:109E700004D00621324AC0B24000115231BD000068 -:109E800001006200000052400002524070B5002202 -:109E90001300130000283CD003689B0F1C00E4074C -:109EA000E40F0C720B7A002B05D10368DB00DB0892 -:109EB0009B144B6003E00368DB00DB084B604368E6 -:109EC0005B0D1C00E407E40F0C7043681B0C1B07C0 -:109ED0001B0F4C240B554C23CB5C082B01DA1300D1 -:109EE00002E04C23CB5C083B0AE01400A4B2A400BF -:109EF0000419A4681500ADB2AD004D19EC60521CF8 -:109F000014000D4D1E00B6B2AD5DA4B2ADB2AC42B0 -:109F1000EBD370BD0004524000065240000852408E -:109F200000005440000254400004544000065440D5 -:109F3000000854405808002880DA001001085240F8 -:109F4000DC1A0028F1B5A8B0002000900020289865 -:109F5000FFF7BAFE0700002F29D0289E306D9749E1 -:109F60000140002902D02898FFF73EFF0125306DFF -:109F7000C00C284000281CD1306D2840002868D132 -:109F8000306D00092840002800D0BAE0306D400A4A -:109F90000540002D0BD03000503001688022920027 -:109FA0000A4302603868002801D03868804729B029 -:109FB000F0BD300050300168802212030A43026075 -:109FC00098203058002816D0002400E0641C20009F -:109FD000C0B220282CDA98203058E04028400028D1 -:109FE000F4D02100C9B22898FFF781FE0090A54067 -:109FF000982035501CE09C203058002818D00024B0 -:10A0000000E0641C2000C0B2202811DA9C203058E7 -:10A01000E04028400028F4D020342100C9B228981C -:10A02000FFF765FE00902000E03085409C20355011 -:10A0300000980028BBD013A90098FFF727FF786885 -:10A040000028B4D013AA2100C9B200207B68984729 -:10A05000ADE73000503001682943016017E0289ACD -:10A06000D4235B00D45801AA0300DBB29B00D45078 -:10A07000401C02000B00D2B2DBB29A42EFD3B868A8 -:10A08000002804D001AAC9B20020BB689847A420C8 -:10A0900030584006400E012889DB2898C02149002D -:10A0A00040582840002822D1A420305800903F2456 -:10A0B0000098020A224000212898FFF757FE002846 -:10A0C000E5D013A9FFF7E2FE3000A83001683F2277 -:10A0D0009143009A120A14400C43046078680028E7 -:10A0E000D5D013AA002101207B689847CFE73448D8 -:10A0F0002899BC2289584907490F415C891C0020D6 -:10A10000B7E730005030016810220A43026017E0C0 -:10A11000289ADC235B00D45801AA0300DBB29B0021 -:10A12000D450401C02000B00D2B2DBB29A42EFD3F3 -:10A13000B868002804D001AAC9B20120BB689847BA -:10A14000B42030584006400E012800DA2FE7289846 -:10A15000C0214900405840082840002822D1B4209E -:10A16000305800903F240098020A2240012128988C -:10A17000FFF7FCFD0028E3D013A9FFF787FE3000AE -:10A18000B83001683F229143009A120A14400C43F0 -:10A19000046078680028D3D013AA012101207B68CD -:10A1A0009847CDE706482899BC22895809094907EC -:10A1B000490F415C891C0020B4E70000EEE0F73F46 -:10A1C00080DA0010F1B594B0D34800681290D348FB -:10A1D00000681190D2480768D2480668D2480068E3 -:10A1E0001090D24800680F90D14800680490D14880 -:10A1F00000680E90D04800680190D04800680D902B -:10A20000CF4800680C90CF4800680B90CE4800689B -:10A210000A90CE4800680990CD4800680890CD4863 -:10A2200000680390CC4800680290DC480068079002 -:10A23000DB48006800901498002810D00C00002C17 -:10A240000DD02820205C002802D0E06A002806D02B -:10A250003020205C002804D0606B002801D1D14858 -:10A2600024E31498FFF730FD002801D1CD481DE309 -:10A270002168016061684160A1688160E168C16036 -:10A2800021690161149D0120A861A869C007FCD55E -:10A290000320A86105A91498FFF7ACFC002801D0A1 -:10A2A000C04803E32820215C129ABF4810400A04EA -:10A2B000FF21090411400143BC4808406946898ACE -:10A2C00089B2890889B2890001438420295030204D -:10A2D000205C4006400EFE21C903119BE44A1A404F -:10A2E0000004084010438422AA5892082823E35C03 -:10A2F000D2189204920CAD4B03409200DD481040FE -:10A3000018438822A850A06BC000C0087A0F5207DB -:10A3100010439022A85007224020205C1040099F43 -:10A32000D54B3B400702E020C00038401843412392 -:10A33000E35C13407027B8431F0170233B40034385 -:10A340004220205C10400727BB431843BC23E85041 -:10A350004420235C1800C007C00F73005B08C607C9 -:10A360001E434520205C4006400EC44B1E4007069D -:10A37000FE20C005384030434626A65D7606760EA0 -:10A38000BB4F07403004084038438826AE59B60812 -:10A390003027E75D7F00F619B604B60C834F0740FF -:10A3A000B600B44830403843A026A8514820265C67 -:10A3B0003000C007C00F109E76007608C0073043FB -:10A3C0004926A65D7606760E03403606FE20C005B9 -:10A3D000304018434A23E35C5B065B0EA44E064004 -:10A3E000180401403143A64FA02028588008462376 -:10A3F000E35C4226A65DBE5DB61C7343C0188304B1 -:10A400009B0C6A4808409B009A4919400143B020C0 -:10A4100029504720205C002801D1002100E00121C3 -:10A42000009B012083430800C007C00F18434B2145 -:10A43000615C002901D1002100E001210223984341 -:10A4400049000223194001431498C0235B00C15006 -:10A45000B020285880084A21615C4123E35CFB5C02 -:10A460009B1C5943401883049B0C82484F490F9E04 -:10A470000E409B0003403343AC26AB514323E35CC7 -:10A480001A40089B0726B3431A43C823EA507D4A63 -:10A49000049E16407C4B1E400496AC26AE59B6086E -:10A4A00000964C26A65DB4464026A65DBE5DB61C51 -:10A4B00067467743009EF619B604B60C049F0F401A -:10A4C000B60006403E43F027EE510E9F6F4E3E40D1 -:10A4D00032404D26A65DB606B60E13403604FC2269 -:10A4E000920332401A43F023EB589B0814339B0429 -:10A4F0009B0C11409A0010400843C02168508022F4 -:10A5000052021498000C00046946898A4018801889 -:10A5100006998B08002125E0D0DA0010D4DA00106B -:10A52000D8DA0010DCDA0010E0DA0010E4DA00100B -:10A53000E8DA0010ECDA0010F0DA0010F4DA0010BB -:10A54000F8DA0010FCDA001000DB001004DB001069 -:10A5500008DB00100CDB001010DB0010002606608A -:10A56000001D491C9942F9D3019901200843022199 -:10A570000143CF480840217D012901D1012100E09C -:10A580000021CC4B03404802802189000840184339 -:10A59000217D01290CD101210BE000BF14DB00104B -:10A5A00018DB001001006200FFFF00FF0300FFFF47 -:10A5B0000021C14B03400802802149000840184394 -:10A5C00080218843402188432021884310218843EB -:10A5D0000421884301900198A861E08AC005C00D5C -:10A5E0000D99B64B0B400104B54808401843217E35 -:10A5F000B44B03400902FF200002084018437F23A8 -:10A60000617E19407F26B0430143A07E1840C901F6 -:10A61000C90940060843E861207D012853D11F2065 -:10A62000A18B01400C9FA84E3E400F04F821490326 -:10A6300039403143A67F3040A44E0E400102F8203D -:10A640004001084030430F21E67F0E40F027B84319 -:10A650003701F0263E4006432020205C01400F20B9 -:10A66000864331432220205C012811D1012610E0CD -:10A67000FFFF80FFFCFF0000FFF8FFFFFFFFFF80F0 -:10A6800080DA0010FFFFFFC0FFFFC0FFFFFFFFBF2A -:10A6900000268F480840F1058026360431400143EA -:10A6A000E9602320215C19400B9E8A4830400E024D -:10A6B000FE21C901314001432420205C03407F205A -:10A6C00081430B43AB6403203C21635C03400A9944 -:10A6D0003026B1431E01302333400B433D21615CE2 -:10A6E00008400C218B4381000C20084018433E2178 -:10A6F000615C012901D1012100E00021022398437E -:10A7000049000223194001433F20205C012801D168 -:10A71000012000E000200126012399433040084336 -:10A72000802168501498000C00048421695889081D -:10A730008904890C890040188018002105E0E36A2B -:10A740008F00DB598F00C351491C2823E35C9942D9 -:10A75000F5D31498000C00048821695889088904ED -:10A76000890C890040188218002308E0606BD9002A -:10A77000401803C8DF00D71903C7083F5B1C30200F -:10A78000205C8342F2D3844803990140834A0A4003 -:10A7900083491140834A0A4083491140834A0A4051 -:10A7A0004B491140824A0A4082491140824A0A407C -:10A7B000802109031143814A0A4081491140814A9D -:10A7C0000A40814911403A4A0A4080491140804A72 -:10A7D0000A4080491140804A0A4036491140364BB0 -:10A7E0000B4080218B434021C9430B402022D243A0 -:10A7F000134010271F4308239F430423DB431F40BC -:10A800000224E443274037430397039F6F65029F69 -:10A81000384002900298614F074061483840614FCC -:10A82000074061483840614F074029483840604F31 -:10A83000074060483840604F0740684838405F4FE5 -:10A8400007405F4838405F4F07405F483840184F27 -:10A8500007405E4838405E4F07405E4838405E4FD4 -:10A86000074014483840144F074080208743394040 -:10A870000A401020824308208243134023400120D5 -:10A880008343AB65079830430440EC651498FFF7A9 -:10A890009EFA4000B04900220A52019801218843E3 -:10A8A000A861A86930400028FBD1002015B0F0BD98 -:10A8B000FFBFFFFFFFFDFFFFFFFEFFFFFFFF00FEEB -:10A8C0000000FF01FF00FFFFFFFFE0FFFFE0FFFFD1 -:10A8D000FFFF7FFFFF80FFFFFEB50700002F01D1C4 -:10A8E0009E4857E03800FFF7EFF9002801D19B4858 -:10A8F00050E0002404604460C46004613D00012015 -:10A90000A861A96901400029FBD00326AE61694610 -:10A910003800FFF76FF9002801D090483AE0842012 -:10A920002C5088202C508E4890216850BC202C50F0 -:10A93000A0202C50B0202C50C02040003C50AC2017 -:10A940002C50C8202C50F0202C50C0202C50380CFB -:10A95000000469460988401880214902401801997D -:10A960008A08210002E00460001D491C9142FAD3CC -:10A97000AE617C48E8617C48E860AC6480202C5083 -:10A980006C65AC65EC653800FFF721FA4000724950 -:10A990000C520020FEBD0000FFFFFFDFFFFFFFEFB6 -:10A9A000FFFFFFF7FFFFFFFBFFFFFFFDFFFFFFFEC6 -:10A9B000FFFFBFFFFFFFDFFFFFFFEFFFFFFFFBFF1B -:10A9C000FFFFFDFFFFFFFEFFFF7FFFFFFFDFFFFF3A -:10A9D000FFEFFFFFFFF7FFFFFFFBFFFFFFFFF7FFAB -:10A9E000F8B50600002E02D01400002C01D15B48FF -:10A9F000B0E06846017068460078202801DB5748BF -:10AA0000A8E03000FFF760F9002801D15348A1E029 -:10AA100037000125B8692840002808D1CC203958D2 -:10AA200068460078C1400800C007C00F00E0280059 -:10AA3000C0B2002801D049488CE068460178300057 -:10AA4000FFF775F9002801D1444883E001000A6846 -:10AA5000464B13400B60217A012901D12B0000E005 -:10AA6000002302001668424931409B078026F60504 -:10AA700033400B4313600168890F2940002902D13C -:10AA800061688A0400E0626801000B685B0F5B0785 -:10AA9000D200D2081A430A60011D0A68354B1340E0 -:10AAA0000B60011D0A681202120A0A604C21615CE7 -:10AAB0000B071B0F011D0E682F4A32401B04F026A6 -:10AAC00036031E4016430E602178012901D12B0068 -:10AAD00000E00023021D1668284931405B058026EE -:10AAE000B60333400B4313602178012901D12B00B9 -:10AAF00000E00023021D1668214931401B05802615 -:10AB0000760333400B4313604C21615C082901DA62 -:10AB1000002102E04C21615C08391A4A89B2515C7B -:10AB200000220AE013009BB29B00E318DB681600CA -:10AB3000B6B2B6008619B360521C13000E00F6B20E -:10AB40009BB2B6B2B342EDD3684600788540D020C0 -:10AB50003D500020F2BD0000DC1A00280100620018 -:10AB6000FFFFFF1F030A0006330A0000FFFFFFDF9D -:10AB7000FFFFFFBFFFFF7FFFFFFFF0FFFFFFDFFFD4 -:10AB8000FFFFEFFF80DA001010B50200002A03D0AB -:10AB90000800C0B2202801DB002021E000200123B2 -:10ABA000CC241459CC401C40002C09D0D42010587F -:10ABB000C8401840002801D1180010E003200EE022 -:10ABC000D8241459CC401C40002C01D0022006E0AF -:10ABD000DC241259CA401340002B00D00420C0B21C -:10ABE00010BD000080B500F029FE00F097FD0028A0 -:10ABF00004D1E02000F01EF9002020E001F024FB49 -:10AC0000002804D1E02000F015F9002017E0002012 -:10AC100001006F4A11706F4908606F4908606F4901 -:10AC2000086001006E4A117001006E4A1170012126 -:10AC30006D4A11706D49086086490860012002BDA7 -:10AC400038B585480168491C0160654C20780428A6 -:10AC500003D3E02000F0EEF853E05D4800780028D0 -:10AC600002D000F0EBFD4CE020785E4D2978C0B2B8 -:10AC7000884208D0207800F062F8002803D1E02054 -:10AC800000F0D8F83DE02878002814D0F7F75EFFF0 -:10AC90007049504A1268801A086008686F498842F3 -:10ACA00009D36F480168491C01600020207005200D -:10ACB00000F0C0F825E048480168491C01600168BF -:10ACC0000A291ED30024046001F0CBFA00280AD020 -:10ACD0004248046001F0D8FA6249088001F0D7FACE -:10ACE000614908600DE061480168491C01603B480A -:10ACF0000168491C01600068032802D3E02000F0CD -:10AD000099F831BD00B50100C9B2042901D3002072 -:10AD10000CE02F490978002905D00100C9B20029AB -:10AD200001D0002002E02E490870012000BD80B54E -:10AD300000202B490870E02000F07CF801BD70B5C0 -:10AD400004002000C0B200280FD100F077FD254894 -:10AD500004700120244908700020454908603D49DD -:10AD600008601C49086001202FE02000C0B200F0FC -:10AD70003FF80500002D01D1002026E000F068FD1D -:10AD8000002806D0280000F03BFD002808D1002054 -:10AD90001BE0280000F0E8FC002801D1002014E0AE -:10ADA000104E3078002806D1F7F7D0FE0949086028 -:10ADB00000202849086034702000C0B200F029F853 -:10ADC000094908702A480560012070BD0000000094 -:10ADD000581C0028B81B0028BC1B0028C01B0028DA -:10ADE000551C0028561C0028571C0028A01B0028B2 -:10ADF00000B5C0B2012804D009D3032805D002D37E -:10AE000005E01E2004E03C2002E05A2000E0002083 -:10AE100000BD00B5C0B2012804D009D3032805D075 -:10AE200002D305E0022004E0032002E0042000E059 -:10AE3000012000BD10B5040000F000FD01200D4907 -:10AE40000870002001000C4A1170094908600B4885 -:10AE5000047010BDA41B0028A81B0028C0270900EF -:10AE6000AC1B0028361C0028B41B0028B01B00288F -:10AE7000A01B0028581C0028561C0028571C00281E -:10AE800070B5B14BC018C0090001C64BC3180429E6 -:10AE90000CD21F251C68CE002800B0408443D2B2DB -:10AEA0001540C800854025431D600CE0FC311F257E -:10AEB0005C68CE002800B0408443D2B21540C80080 -:10AEC000854025435D6070BD00B59F4A8018C0096C -:10AED0000001B44A8018042905D20068C900C8409E -:10AEE000C006C00E05E0FC314068C900C840C0067D -:10AEF000C00EC0B200BD00B5002A03D101228A40B5 -:10AF0000426002E001228A40826000BD30B403004A -:10AF10008C000F25596C2800A04081431540A540A6 -:10AF20000D435D6430BC704730B403004C001034F6 -:10AF30000325D96C2800A04081431540A5400D434E -:10AF4000DD6430BC704700B5022801D301200FE05A -:10AF50000B00DBB2042B01DB012009E0A44B8000D5 -:10AF60001818C9B2405C824201D3012000E00020E1 -:10AF700000BDF8B504001F00022C01D3012023E01E -:10AF800015000E002A003100C9B22000FFF7DBFFD8 -:10AF9000012801D1012017E03000C0B2002816D1ED -:10AFA000FF2F12D8B74861034018A900401880212C -:10AFB000490140180168B44A0A403902FF231B02C4 -:10AFC0000B40134303600020F2BD0120FCE7F6B202 -:10AFD000012E16D180204002874210D2A948610379 -:10AFE0004018A9004018A021490140180168BB4A37 -:10AFF0000A403902BA4B0B4013430360E3E70120D8 -:10B00000E2E70120E0E700B20012C0B27047F8B5F5 -:10B0100005000F001600280000B2FFF7F4FF04003F -:10B020002000C0B2022801D301202CE032003900F8 -:10B03000C9B22000C0B2FFF786FF012801D101206C -:10B0400021E090482100C9B2490341182A00D2B238 -:10B0500092008918C02212018A58A2491140FFB2F9 -:10B060003B02C02292001A400A43FF218A43F1B2F8 -:10B070001143E4B262038018EDB2AA008018C02226 -:10B08000120181500020F2BD70B50400022C01D3E2 -:10B09000012028E015000E002A003100C9B220006E -:10B0A000FFF751FF012801D101201CE07548610321 -:10B0B0004158802212060A43C02189041143FF220D -:10B0C00012040A43874B1340F6B23202C0218900B2 -:10B0D00011401943FF229143EAB20A4361034250EF -:10B0E00061034058002070BD70B50400022C01D3EC -:10B0F000012028E015000E002A003100C9B220000E -:10B10000FFF721FF012801D101201CE05D48610308 -:10B1100041588022D2050A43C02189041143FF22ED -:10B1200012040A436F4B1340F6B23202C021890069 -:10B1300011401943FF229143EAB20A43610342508E -:10B1400061034058002070BD0000CFBFF0B58DB046 -:10B15000684665493422F9F737FD644F6A46012194 -:10B160003800F8F7F0FE0600002420006946087257 -:10B170006A4602213800F8F7E6FE050000220121A8 -:10B180003800FFF7B8FE002202213800FFF7B3FEB7 -:10B190003543002D01D1012000E02000C0B20DB0E8 -:10B1A000F0BD00000000304010B500F0ABF8002802 -:10B1B00001D100201BE04E4C2000F9F7E1F84D4989 -:10B1C0002000F8F757FF002801D000200FE02000F2 -:10B1D000F9F7E3F84849884207D12000F9F7D9F890 -:10B1E0004649884201D1012000E00020C0B210BDD4 -:10B1F00098DA001070B5424C0021216000F046F84A -:10B20000002803D10120206000203AE0374E0022C0 -:10B2100001213000FFF76FFE354D37492800F9F75F -:10B22000BAF82800F9F7A6F82800F9F768FB022019 -:10B23000F9F7B4FE2800F9F7A8F8000405D40220B5 -:10B24000206000F03AF800201BE0002201213000CD -:10B25000FFF76AFE062201213000FFF757FE0822A1 -:10B2600001213000FFF70CFE01213000FFF72CFE1A -:10B27000082805D00320206000F01FF8002000E01F -:10B28000012070BD00000440FF00FFFF38B56528B5 -:10B2900001D3002010E000F087F80400144D2100D5 -:10B2A0002800F9F774F82800F9F773F8A04201D1E3 -:10B2B000012000E00020C0B232BD10B50C48F9F703 -:10B2C0005FF80A4C00220121200000F07BF80022E8 -:10B2D0000221200000F076F810BD0000FF0000FF02 -:10B2E00000FFFF00FFFCFFFF40D70010800531404A -:10B2F000001E584020D300101F4E0000204E0000BA -:10B30000581B0028F8B5002500956846FCF7ACF8F6 -:10B31000002801D0002045E0274C0098A04205D32A -:10B3200000982100F8F74EFE002901D0002039E0F6 -:10B3300000982100F8F746FE0400002C02D01F48B8 -:10B34000844201D300202DE0FF266A363000FFF74B -:10B350005AFE0700002201213800FFF7C5FE002831 -:10B3600001D000201EE0002201213000FFF74FFE37 -:10B37000002801D0002015E023005B1E00220121DF -:10B380003800FFF7F6FD002801D000200AE0002277 -:10B3900001213800FFF778FE002801D1012000E0EC -:10B3A0002800C0B2F2BD000000B505494843642141 -:10B3B000F8F708FE00BD000080841E0001000100B7 -:10B3C000204E000070B505000C0016000022210080 -:10B3D0002800FFF790FD3200D2B221002800FFF7CD -:10B3E0004FFD002221002800FFF79EFD06222100CC -:10B3F0002800FFF78BFD002221002800FFF77BFDCE -:10B4000070BD000070B5B14BC018C0090001C24B3F -:10B41000C31804290CD21F251C68CE002800B04098 -:10B420008443D2B21540C800854025431D600CE01E -:10B43000FC311F255C68CE002800B0408443D2B2A6 -:10B440001540C800854025435D6070BD00B59F4A2A -:10B450008018C0090001B04A8018042905D200688C -:10B46000C900C840C006C00E05E0FC314068C900F4 -:10B47000C840C006C00EC0B200BD00B5002A03D14E -:10B4800001228A40426002E001228A40826000BDBF -:10B4900030B403008C000F25596C2800A040814374 -:10B4A0001540A5400D435D6430BC704730B40300C7 -:10B4B0004C0010340325D96C2800A040814315406E -:10B4C000A5400D43DD6430BC704700B5022801D3B0 -:10B4D00001200FE00B00DBB2042B01DB012009E0AF -:10B4E000A04B80001818C9B2405C824201D30120F1 -:10B4F00000E0002000BDF8B504001F00022C01D3BD -:10B50000012023E015000E002A003100C9B22000FE -:10B51000FFF7DBFF012801D1012017E03000C0B2A6 -:10B52000002816D1FF2F12D8B34861034018A90094 -:10B5300040188021490140180168B04A0A40390288 -:10B54000FF231B020B40134303600020F2BD0120C8 -:10B55000FCE7F6B2012E16D180204002874210D2BD -:10B56000A54861034018A9004018A02149014018CE -:10B570000168B14A0A403902BA4B0B4013430360D9 -:10B58000E3E70120E2E70120E0E700B20012C0B2E9 -:10B590007047F8B505000F001600280000B2FFF74D -:10B5A000F4FF04002000C0B2022801D301202CE0E7 -:10B5B00032003900C9B22000C0B2FFF786FF01286F -:10B5C00001D1012021E08C482100C9B24903411872 -:10B5D0002A00D2B292008918C02212018A58A249C8 -:10B5E0001140FFB23B02C02292001A400A43FF21E1 -:10B5F0008A43F1B21143E4B262038018EDB2AA00AB -:10B600008018C022120181500020F2BD70B50400E4 -:10B61000022C01D3012028E015000E002A00310081 -:10B62000C9B22000FFF751FF012801D101201CE021 -:10B63000714861034158802212060A43C0218904DF -:10B640001143FF2212040A43874B1340F6B2320221 -:10B65000C021890011401943FF229143EAB20A43F5 -:10B660006103425061034058002070BD70B5040072 -:10B67000022C01D3012028E015000E002A00310021 -:10B68000C9B22000FFF721FF012801D101201CE0F1 -:10B690005948610341588022D2050A43C0218904D8 -:10B6A0001143FF2212040A436F4B1340F6B23202D9 -:10B6B000C021890011401943FF229143EAB20A4395 -:10B6C0006103425061034058002070BD0000CFBFAD -:10B6D00078B58DB0684665493422F9F775FA644E3D -:10B6E0006A4607213000F8F72EFC040000220721EB -:10B6F0003000FFF7C2FE00255E480560002C07D130 -:10B7000007213000FFF7A2FE002801D1012000E050 -:10B710002800C0B20EB070BD0000304010B500F07F -:10B72000B3F8002801D100201AE0534C2000F8F7AC -:10B7300027FE52492000F8F79DFC002801D0002088 -:10B740000EE02000F8F729FE4D49884206D120007E -:10B75000F8F71FFE002801D1012000E00020C0B250 -:10B7600010BD000098DA001070B5464C0021216031 -:10B7700000F046F8002803D10120206000203AE0C4 -:10B780003B4E002207213000FFF777FE3A4D3C493F -:10B790002800F8F700FE2800F8F7ECFD2800F9F77C -:10B7A000AEF80220F9F7FAFB2800F8F7EEFD0004E6 -:10B7B00005D40220206000F041F800201BE00022A8 -:10B7C00007213000FFF772FE062207213000FFF745 -:10B7D0005FFE082207213000FFF714FE072130002A -:10B7E000FFF734FE082805D00320206000F026F87B -:10B7F000002000E0012070BD00000440FF00FFFFBA -:10B8000070B50400002C01D0652C01D3002012E09B -:10B81000200000F08BF80600174D31002800F8F7E3 -:10B82000B6FD2800F8F7B5FDB04201D0002002E0D7 -:10B8300010480460012070BDFF0000FF80B50E4875 -:10B84000F8F79EFD00F07AF800200A49086001BD73 -:10B8500080B50948F8F799FDC10B0800C007C00F73 -:10B8600002BD000000FFFF00FFFCFFFF0CD700102F -:10B8700000083140501B002880205840ACD20010F6 -:10B880001F4E0000541B0028F8B50025009568469F -:10B89000FBF7EAFD002801D0002045E0354C009878 -:10B8A000A04205D300982100F8F78CFB002901D0B5 -:10B8B000002039E000982100F8F784FB0400002CF8 -:10B8C00002D02D48844201D300202DE0B726760017 -:10B8D0003000FFF75AFE0700032201213800FFF76E -:10B8E000C5FE002801D000201EE003220121300007 -:10B8F000FFF74FFE002801D0002015E023005B1E5B -:10B90000032201213800FFF7F6FD002801D00020B6 -:10B910000AE0032201213800FFF778FE002801D158 -:10B92000012000E02800C0B2F2BD000000B51349BC -:10B9300048436421F8F746FB00BD000010B5104CE9 -:10B94000002207212000FFF798FD00220721200098 -:10B95000FFF758FD002207212000FFF7A7FD062270 -:10B9600007212000FFF794FD002207212000FFF7A8 -:10B9700084FD10BD80841E0001000100204E0000E7 -:10B980000008314038B50500082D0DD3914C182220 -:10B9900091492000FBF7B2FD0020E075E8208F49B7 -:10B9A00008600020FBF70AFE8D486901401832BD8F -:10B9B000994B1B689BB212041A43120C120489B2F1 -:10B9C000114381607047C0687047944B1B689BB2FD -:10B9D00012041A43120C120489B211430160006868 -:10B9E0007047C069C00FC0B27047F8B502000E00C2 -:10B9F000002A01D105204EE00F2089490B681B0A5F -:10BA00000340002B01D1002007E00968090A084023 -:10BA10000E2801D1012000E00220824940010F18C8 -:10BA2000814C984D280011001022F9F7E7F828689A -:10BA300001218843286010212800FBF7E2FD924B8A -:10BA40002A000121380000F04CFC002804D001201D -:10BA500021E0641E002C15D03800FFF7C2FF00283B -:10BA6000F7D1002E08D010212800FBF7C9FD3000C7 -:10BA700029001022F9F7C2F800F0B4F8012803D128 -:10BA8000032008E0022006E000F0ACF8002801D115 -:10BA9000002000E00420F2BD38B50100002901D1EA -:10BAA00005202BE00F205E4A13681B0A0340002B81 -:10BAB00001D1002007E01268120A10400E2801D1BF -:10BAC000012000E00220574A400115186D4C20006B -:10BAD0001022F9F793F82068012188432060102193 -:10BAE0002000FBF78EFD684B22000121280000F0AA -:10BAF000F8FB002801D0012000E0002032BDFEB597 -:10BB000003001600002B03D001910198002801D1F9 -:10BB100005205DE00F2042490A68120A0240002A0F -:10BB200001D1002007E00968090A08400E2801D168 -:10BB3000012000E002203B49400108180090804CA1 -:10BB4000504D280019001022F9F758F87D4F3800A1 -:10BB500001991022F9F752F82868012188432860DA -:10BB6000386801218843386010212800FBF749FD1F -:10BB700010213800FBF745FD3B002A000121009809 -:10BB800000F0AFFB002804D0012021E0641E002C4F -:10BB900015D00098FFF725FF0028F7D1002E08D018 -:10BBA00010212800FBF72CFD300029001022F9F7A6 -:10BBB00025F800F017F8012803D1032008E002203F -:10BBC00006E000F00FF8002801D1002000E004207A -:10BBD000FEBD0000C41A00282CD10010881B0028CC -:10BBE0000010224010B5274C10212000FBF708FD63 -:10BBF0002068000F0007A0210906884201D100201B -:10BC000009E02068000F0007F0210906884201D1F1 -:10BC1000012000E0022010BD50DB001054DB0010BA -:10BC20000000204000002240FFFFFF0F38B5040055 -:10BC3000FFF7D8FF05002800C0B2022801D1424812 -:10BC40000DE0002C04D0200027491022F8F7D6FF81 -:10BC5000EDB2002D01D1002001E02348006832BD83 -:10BC600000B5010F0907A0221206914201D1002060 -:10BC700006E0010F0907F0221206914200D0324877 -:10BC800000BD0000001B0028841B00281CB502001A -:10BC90000B002E4803C86C4603C4083C6C46638006 -:10BCA0002B4802606846F8F75DFF2A490020205EB5 -:10BCB000F8F777FF0220FFF765FE0F21264A136889 -:10BCC0001B0A0B40002B01D1002307E01268120A67 -:10BCD00011400E2901D1012300E00223002201219D -:10BCE0009940FFF765FE13BD001B002870B50026C4 -:10BCF00030000220FFF746FE04002000FFF763FE3D -:10BD000005000F2014490A68120A0240002A07D0D1 -:10BD10000968090A08400E2801D1012600E0022620 -:10BD20002800F040C00705D509480168002901D066 -:10BD3000006880472A0CA9B22000FFF746FE70BDBC -:10BD4000FFFFFF00201B0028FFFFFF0F90DA00100D -:10BD5000801B0028EDBC0010000020405048006807 -:10BD6000410B0800C007C00F70474D480068010B29 -:10BD70000800C007C00F704700B54A48012102689B -:10BD80000A43026002680A40002AFBD100BD1FB5C9 -:10BD90000400C9B2012921D168461021FAF7C6FC76 -:10BDA00069462000FFF721FE0100C9B2012901D137 -:10BDB0005B481BE00100C9B2022901D13A4815E0F5 -:10BDC000C0B2042801D1394810E0009800F01CF9F5 -:10BDD00000280BD1FFF7D0FF002007E02000FFF77D -:10BDE0005BFE002801D04E4800E0002004B010BDEA -:10BDF0007FB50C001500002C01D14A484DE02068A9 -:10BE000000F0F0F8012802D06068002801D1454810 -:10BE100043E068461021FAF789FC00980002000A06 -:10BE2000C021C90401430091227AFF2000023E494B -:10BE3000009B0B40120202401A430092637A009E5C -:10BE4000494A32401B04FF2636041E401643009622 -:10BE5000E27A019B19401202104008430190A07A37 -:10BE60000199FF229143C0B208430190207B0199C0 -:10BE70000902090A000608430190206802906068E0 -:10BE800003903A48A17A4900415A6068FBF7B9FB30 -:10BE90002900C9B26846FFF77AFF04B070BD000000 -:10BEA000000024400800244010005200FF0052000F -:10BEB00010B50400FFF752FF002810D1EC20000657 -:10BEC0002018C0218902884201D2002026E044487F -:10BED00020188021490288421FD200201EE0C02085 -:10BEE0004002EC2109066118814201D2002015E0D0 -:10BEF000802109026B4AA2188A4201D200200DE07B -:10BF0000EB221206A218824201D2002006E0664807 -:10BF10002018884201D2002000E0012010BD00005E -:10BF2000040052000F005200FF00FFFF10B5040094 -:10BF3000FFF714FF002807D1294820188021490263 -:10BF400088420FD201200EE080200002554961187E -:10BF5000814201D2012006E053496118814201D299 -:10BF6000012000E0002010BDFFFF00FFF0D900100D -:10BF700010B50400FFF7F9FE002810D1F0200006EC -:10BF80002018FE21C903884201D2002026E065481E -:10BF900020188021C90288421FD200201EE0FE2006 -:10BFA0008003F02109066118814201D2002015E0CA -:10BFB000802189025C4AA2188A4201D200200DE049 -:10BFC000EE221206A218824201D2002006E0574853 -:10BFD0002018884201D2002000E0012010BD00009E -:10BFE0000000FDEB10B504002000FFF761FF002802 -:10BFF00001D1002007E02000FFF7BAFF002801D19F -:10C00000002000E0012010BD80B5FFF729FE0028C8 -:10C0100001D1002044E04649884201D145483FE033 -:10C020004549401A1CD0801E1DD0401E1DD0401E08 -:10C030001DD0401E1DD0001F1DD087381DD0401EB2 -:10C040001DD012381DD0401E1DD0401E1DD0801E98 -:10C050001DD0801E1DD008381DD009381DD01EE00F -:10C06000A420C0031CE035481AE0354818E03548E4 -:10C0700016E0354814E0354812E0354810E0354800 -:10C080000EE035480CE035480AE0354808E0354810 -:10C0900006E0354804E0354802E0354800E0254830 -:10C0A00002BD00000080FEEB0080FEEA38B584B0DF -:10C0B0000C001500002C01D12E4831E02068FFF75C -:10C0C00091FF012801D12B482AE02078800701D078 -:10C0D000284825E068461021FAF728FB009800025E -:10C0E000000AA02149050143009120790099224AC4 -:10C0F0000A400002FF2109020140114300916079CA -:10C1000000994C4A0A400004FF21090401401143F0 -:10C110000091206801902900C9B26846FFF737FEF8 -:10C1200005B030BD000081EF0080C0EF0080C0EDA1 -:10C13000FFFFFF0FFF005200010000F0010052005E -:10C140000200520003005200040052000500520099 -:10C150000600520007005200080052000900520079 -:10C160000A0052000B0052000C0052000D00520059 -:10C170000E0052000F005200FF00FFFF38B588B0DC -:10C180000C001500002C01D12E4851E060680028F9 -:10C1900001D12C484CE02068FFF78AFE012808D026 -:10C1A0002068616889004018401EFFF781FE012861 -:10C1B00001D124483CE068461021FAF7B7FA00980C -:10C1C0000002000AA821890501430091206801901E -:10C1D0006068401E80B20299090C0904084302906D -:10C1E000EDB2012D1CD104A81021FAF79FFA04A981 -:10C1F0006846FFF7FAFB0100C9B2012901D11048D6 -:10C2000016E00100C9B2022901D10B4810E0C0B20A -:10C21000042801D109480BE00498FFF7F5FE07E078 -:10C220006846FFF739FC002801D0054800E00020EF -:10C2300009B030BDFFFF00FF10005200FF005200A8 -:10C24000040052000F00520080B5F8F7C4F900282E -:10C2500001D1002004E001201349087000F001F82A -:10C2600002BD80B510480078002805D0694604203A -:10C27000F8F740FA002801D1002004E06846008861 -:10C280000A490880012002BD08480088704780B52F -:10C29000064800880021064A0023F8F781F8054A7D -:10C2A0000023F7F78AFD02BD3E1C0028341C00283D -:10C2B00040787D0150FB4A00174A1268120C1204A4 -:10C2C00089B2114381607047C16070470161704756 -:10C2D00000B50068C00F002801D1104800E0002020 -:10C2E00000BDF8B507000C0015001E003800FFF770 -:10C2F000EFFF00280DD129003800FFF7E5FF3100DE -:10C300003800FFF7E3FF21003800FFF7D5FF0020DA -:10C3100000E00248F2BD00003CDB001001008A0092 -:10C32000F8B584B0F8F7F1FEBA490127086803228E -:10C33000904338430860B8480A6802400A60B74929 -:10C340000A6803239A433A430A600A6802400A6073 -:10C35000B3490A6803239A433A430A600A680240D1 -:10C360000A60B0490A6803239A433A430A600A689C -:10C3700010400860AC4801680F22914339430160C6 -:10C38000AA480168072291430160A9480168072271 -:10C39000914304220A4302600168F0229143C022C3 -:10C3A0000A4302600168C02292000A4302600168E9 -:10C3B000C02212010A43026001689E4A0A4080219D -:10C3C000490111430160E1480168802212060A43D5 -:10C3D0000260DF48016839400029FAD00168490845 -:10C3E00039400029FAD0DB480168DB4A0A40026084 -:10C3F000DA480168D84A0A408021490011430160A7 -:10C40000D7480168D44A0A4080214900114301609D -:10C41000D4480168D04A0A400260D3480168072224 -:10C42000914302220A430260D0480168490049084A -:10C430000160CF480168890A890229220A43026003 -:10C440000168CC4A0A4002600168802252040A4313 -:10C4500002600168C84A0A40026001688022120630 -:10C460000A430260C5480168C54A0A408021C900E4 -:10C47000114301600168FF229143AF220A43026029 -:10C48000802189020268BF4B13400B430360802266 -:10C4900092040368BC4C1C4014430460BB4B04680A -:10C4A0001C400460046880252D0625430560B848BB -:10C4B00004680725AC43022525430560B548046898 -:10C4C000240E2406B44D254305600468B34D254071 -:10C4D000802464052C430460046880252D062543D0 -:10C4E0000560AF480468640064080460AD4C8025B2 -:10C4F000AD002668A2483040284320602068FF260F -:10C50000B04362260643266026689E483040802657 -:10C51000F6020643266026689B48304002432260AC -:10C5200020681840206020688022120602432260A2 -:10C530009D4802680724A2430224144304609B48D8 -:10C5400002687F24A24328241443046002688C4CB0 -:10C5500014402C43046002688A4C1440214301605B -:10C560000168894A0A400260914902680A400260F3 -:10C5700002681A40026002688024240614430460A2 -:10C580008C4802680724A243022414430460B04884 -:10C5900002687F24A2431E24144304600268784C7E -:10C5A0001440254305600268764C1440C022920274 -:10C5B000224302600268744C144004600268114017 -:10C5C000016001680B4003600168802212060A4383 -:10C5D0000260A048006838400028FAD09E480068F1 -:10C5E00038400028FAD09D48006838400028FAD02A -:10C5F0009B48006838400028FAD09A480168072212 -:10C6000091430160684698491022F8F7DDFA002648 -:10C6100035E000BFC4132040FFFCFFFF00132040A3 -:10C6200080132040A0132040000024400015264025 -:10C6300044152640FF8FFFFF32200021F8F76EFCE3 -:10C64000300040B280002818016830229143220057 -:10C6500052B21201302313400B430360641E2000CA -:10C6600040B26946320052B25200895C00B209B24F -:10C670008842E1DA32200021F8F750FC761C3000C5 -:10C6800040B208283FD2300040B204280DD1EFF369 -:10C690001084002080F31088FA239B0000220121DF -:10C6A000102000F00BFA84F31088704D300040B277 -:10C6B0008000281801680F2291436A4633005BB25C -:10C6C0005B00D21852781207120F0A430260300042 -:10C6D00040B280002818016830220A43026030000E -:10C6E00040B2800028180168802252000A4302608C -:10C6F000300040B2800028180168802212060A43E8 -:10C7000002600224ABE75A48134A016811400160F5 -:10C71000F821C94303680B400360564803681A4078 -:10C720000260026811400160F8F7D0FC52480168CD -:10C73000802212060A43026001680F430760F8F77F -:10C74000BAFC00F039F805B0F0BD00BF1C1526405A -:10C750002415264010102040FF00FFFF0810204045 -:10C760000C102040200320400412264004192640CB -:10C7700008192640FFFFF8FFFFFFFFEF00192640D2 -:10C78000FFE0FFFFFFFFE0FFFFFFFFF9FFFFFFCF2D -:10C790000812264014192640F1D24D00FFFFFF8FEA -:10C7A00018192640101926400C1226400016264063 -:10C7B000FFFFFFF71012264038B586B068462F49B4 -:10C7C0001822F8F701FA6846FAF702FCC0B200280E -:10C7D0000ED02B4C18222B492000FAF78FFE002098 -:10C7E000E075FF20A830284908600020FAF7E6FE2F -:10C7F000264D2800FAF77EFEC0B200280ED0204C4D -:10C80000182220492000FAF779FE0020E075FF2069 -:10C81000AA301D4908600020FAF7D0FE1C4C286899 -:10C82000206020681B4940181B49F7F7CBFB1B49C8 -:10C8300008601B4D20681B494018FA218900F7F752 -:10C84000C1FB28602868C0031749086007B030BDE5 -:10C85000041626400C1926401C1926404016264076 -:10C86000441626401412264054DA00104012264086 -:10C87000080020400804204008152640C4D90010B4 -:10C88000C41A002874D40010881B0028201C00281B -:10C89000241C00283F420F0040420F002C1C00289F -:10C8A000281C0028E7030000301C0028F3B595B0D1 -:10C8B000170000210D000800684601801C00A4B28A -:10C8C000A408200080B280218900884203D301257A -:10C8D000684604807E4C1C9E00F011F9002800D0B0 -:10C8E00099E06846877016A8077801A81021F9F723 -:10C8F0001DFF0198022188433100C9B2490002227C -:10C90000114001430191019804218843FFB2B9000D -:10C91000042211400143019101980821884369468E -:10C920008978C90008221140014301910198102122 -:10C93000884301900198202188430190019840216B -:10C94000884301900198802101430191614F019832 -:10C95000384015A909780902F82252010A40024319 -:10C96000019201985C490140019101980002000A7E -:10C97000A82149050143019111A81021F9F7D6FE1C -:10C980001198800A8002A4B2A105890D014311917A -:10C9900052480068002806D101980740D020400185 -:10C9A0003843019007E0002805D001980740802017 -:10C9B000400138430190002211A901A8FFF79FF818 -:10C9C000EDB2002D03D06846008800F08DF809A86C -:10C9D0001021F9F7ABFE099802218843F6B27100E5 -:10C9E000022211400143099109983D4901400991F2 -:10C9F00009983C4901408020400208430990099869 -:10CA00000002000A8821490501430991002109A873 -:10CA1000FEF7EBFF50E000F07DF80128FBD000F0BE -:10CA200073F80128F7D10DA81021F9F77FFE0DA8A2 -:10CA30000078FD2101400DA801700DA800780C219F -:10CA400001430DA801700D980002000AB0214905AC -:10CA500001430D9100210DA8FEF7C7FF00F054F827 -:10CA6000002829D1EDB2002D03D06846008800F0DF -:10CA70003BF805A81021F9F759FE059802218843D3 -:10CA8000F6B2710002221140014305910598144944 -:10CA90000140059105981349014080204002084358 -:10CAA000059005980002000A882149050143059177 -:10CAB000002105A8FEF799FF17B0F0BD1CB50124B1 -:10CAC00000949BB2D2B2C9B2C0B2FFF7EFFE13BD61 -:10CAD000FF010000FFE0FFFFFF1FFFFF300700170F -:10CAE000FF00FFFFFFFF00FF0D490A680D4B1340D9 -:10CAF00080B200050C4A02401A430A607047084899 -:10CB00000068C00FC0B27047084801680800C0073D -:10CB1000C00F704705480068C00FC0B270470000E2 -:10CB200028102640FFFF0FC00000F03F2C102640C9 -:10CB300000B5010009B2002905D40121C006C00ECC -:10CB400081408F48016000BDF0B5020012B2002A9A -:10CB500018D418228B4B040024B2A408A4001C593A -:10CB6000FF250600F6001640B540AC438901C9B266 -:10CB70000500ED002A409140214300B2800880006A -:10CB800019501CE00F22804C182503001BB21340E3 -:10CB9000083B9B089B00060036B23240083A9208D8 -:10CBA0009200A258FF260700FF002F40BE40B2436C -:10CBB0008901C9B2C0000540A9401143E150F0BD50 -:10CBC00080B500F012F87148714902680A400260AD -:10CBD000704802680A4002606F48026811400160B4 -:10CBE00000F092F800F0A9F801BDFEB568466B4967 -:10CBF0000CC90CC008390838002630000AE06A4623 -:10CC00000300DBB2DB00D2185268521C114000292D -:10CC10000ED1401C0100C9B200290AD107216A4681 -:10CC20000300DBB2DB00D2580A40002AE7D0FEE75F -:10CC3000FEE75B4C072021680140002900D0FEE799 -:10CC4000584F3968491C0840002800D0FEE73500DD -:10CC500024E068462900C9B2C90040184168684606 -:10CC60002A00D2B2D200805800F044F815E030001B -:10CC70000028EED02168491E68462A00D2B2D200B0 -:10CC8000805800F037F868462900C9B2C90040183A -:10CC900041683868401C00F02DF86D1C2800C0B2B7 -:10CCA000002826D168462900C9B2C900405800288A -:10CCB00014D0206869462A00D2B2D200895888422E -:10CCC0000AD368462900C9B2C900401840682168E3 -:10CCD000884201D30120CBE73000C9E7684629002C -:10CCE000C9B2C9004018406821688842BFD30120FA -:10CCF000BEE7F7BD80B50022002302E00CC0083873 -:10CD000008308842FAD301BD30B52748800827494A -:10CD1000274A002308E01C00E4B2A40014591D00B7 -:10CD2000EDB2AD004C515B1C1C000500E4B2EDB24D -:10CD3000AC42F0D31F48016030BD10B51023112163 -:10CD40001A4800221C00E4B2A4001459DBB29B0074 -:10CD5000C4500B00DBB29B00D258C9B289004250CC -:10CD600001210020FFF7F0FE00210120FFF7ECFE7B -:10CD70000020FFF7DDFE0120FFF7DAFE10BD000006 -:10CD800000E100E000E400E01CED00E000132040C2 -:10CD9000FFFFF7FF80132040A0132040A8DA001007 -:10CDA0006CD4001070D4001080000000001D00281A -:10CDB0000000001008ED00E000B5010009B20029F4 -:10CDC00005D40121C006C00E81404A48016000BD63 -:10CDD00000B5FEE780B54848006848480068C10FC4 -:10CDE000002905D046498005800D800008588047FD -:10CDF0000020FFF7E1FF01BD80B5424800684248CE -:10CE00000068C10F002905D03D498005800D8000D4 -:10CE1000085880470120FFF7CFFF01BD80B53B4890 -:10CE200000683B480068C10F002905D034498005DF -:10CE3000800D8000085880470220FFF7BDFF01BD2C -:10CE400080B53448006834480068C10F002905D017 -:10CE50002B498005800D8000085880470320FFF78C -:10CE6000ABFF01BD80B52D4800682D480068C10F9B -:10CE7000002905D022498005800D80000858804790 -:10CE80000420FFF799FF01BD80B5264800682648B9 -:10CE90000068C10F002905D019498005800D800068 -:10CEA000085880470520FFF787FF01BD80B51F4860 -:10CEB00000681F480068C10F002905D0104980058F -:10CEC000800D8000085880470620FFF775FF01BDE0 -:10CED00080B51848006818480068C10F002905D0BF -:10CEE00007498005800D8000085880470720FFF71C -:10CEF00063FF01BD80E200E01CDB00100011204058 -:10CF00004809002820DB00100411204024DB001019 -:10CF10000811204028DB00100C1120402CDB0010F1 -:10CF20001011204030DB00101411204034DB0010C1 -:10CF30001811204038DB00101C112040ACD8001024 -:10CF400004DA0010800231400400000008000000F4 -:10CF5000800658403A0100000009314002000000FC -:10CF60000A0F0D07E0010000FC53000098210000AB -:10CF7000F4010000E8030000F401000038D90010BB -:10CF800014DA0010800231400500000008000000A3 -:10CF9000000758403B01000000053140010000003F -:10CFA0000AF0D07076010000E0150000D4170000F0 -:10CFB0005E010000E8030000F401000054D90010F5 -:10CFC00024DA0010000431400000000008000000D6 -:10CFD0008009584040010000000731400000000077 -:10CFE000090F0D0795030000901A00002823000088 -:10CFF000F4010000E8030000F401000070D9001003 -:10D0000034DA001080003140000000000800000009 -:10D0100000065840390100000006314005000000BC -:10D0200009F0D07087020000201C00009821000049 -:10D03000F4010000D0070000F401000080B5F4F70F -:10D0400024F9FCF773F9FCF761F8FA208000F7F790 -:10D05000A5FFF4E710B5FEF73BFBFEF777F8FFF707 -:10D060005FF9F4F712F9FEF733FB002803D0FEF75F -:10D070006DF8002801D1FFF7E1FF204C00F042F8E5 -:10D08000206000F042F82068FBF7DEFFFCF76EF846 -:10D09000002801D0FFF7D2FF62B6194CF6F7F8FD71 -:10D0A00020602068002804D00120FCF737F8FFF743 -:10D0B000C5FF0120F5F7E1FDFCF778F8002804D161 -:10D0C0000120FCF72BF8FFF7B9FFF8F741F800282B -:10D0D00001D1FFF7B3FFF8F78AF8FCF7C7F8FCF7C0 -:10D0E00045F8002803D0F4F7D0F8FCF71FF9FCF757 -:10D0F0000DF8FA208000F7F751FFECE78C1B0028B1 -:10D10000281200280648006870470020C0430449E0 -:10D110000860044908600020034908607047000067 -:10D12000001826400418264008102640443A5C683F -:10D1300075616E672E7875657765695C4769745CA3 -:10D14000436F676E69746976655F4167656E745C8D -:10D150002E636F6465785F746D705C736561742DA8 -:10D160006669726D776172652D6275696C642D6494 -:10D17000636532383438396139643334386432386D -:10D180003933353239353533343638336466375CC4 -:10D19000636F6D6D6F6E5C7372635C6472697665EC -:10D1A00072735C6970635C63795F6970635F6472FA -:10D1B000762E6800F1B401684118436858080A18CF -:10D1C00000988068DB0701D54B46C01891422DD0EE -:10D1D0000D78491C032403262E4002D10E78F61C3C -:10D1E000491C2B090F2B07D10B780F33491C03E087 -:10D1F0000F78491C0770401C761EF9D1002BE5D032 -:10D200000E78491CAD082C40032C01D10C78491C28 -:10D2100024023419654244190025AE1E9E42D5D021 -:10D220002678641C0670401C6D1CF6E700980C30D4 -:10D23000F2BC70470005314006000000000000000D -:10D2400080189040020000000006314001000000FC -:10D25000000000004019904005000000000531402A -:10D260000700000000000000C0189040030000000C -:10D27000000531400500000000000000401890400B -:10D280000100000000063140020000000000000024 -:10D2900080199040060000000006314006000000A2 -:10D2A00000000000801A90400A0000000400000006 -:10D2B0000000000000000000000000000100030367 -:10D2C0001F4E0000000000000000000000000000F1 -:10D2D000000000000000000000000000000000004E -:10D2E0000000000000000000000000000203000039 -:10D2F0000000000003000000000000000300000028 -:10D300000000000003000000000000000300000017 -:10D310000000000003000000010000000102000006 -:10D3200004000000000000000000000000000000F9 -:10D33000010003031F4E0000000000000000000079 -:10D34000204E00000000000000000000000000006F -:10D3500000000000000000000000000000000000CD -:10D3600002030000000000000300000000000000B5 -:10D3700003000000000000000300000000000000A7 -:10D380000300000000000000030000000100000096 -:10D390000102000004000000000000000000000086 -:10D3A0000000000001000303630000000000000013 -:10D3B000000000003200000000000000000000003B -:10D3C000000000000000000000000000000000005D -:10D3D0000000000002030000000000000300000045 -:10D3E0000000000003000000000000000300000037 -:10D3F0000000000003000000000000000300000027 -:10D40000010000000102000072B6104810490860D7 -:10D41000BFF34F8F0120C0040E490A6802430A601F -:10D420000D490A6802430A600C490A6802430A600F -:10D43000002000210D4A03C26A45FCD1084FB847BD -:10D44000084FB847084FB847FEE70000000000103B -:10D4500008ED00E00013204080132040A01320407E -:10D46000C1CB001045D80010A9D9001000FF012839 -:10D47000FFFF0128443A5C6875616E672E78756518 -:10D480007765695C4769745C436F676E6974697638 -:10D49000655F4167656E745C6669726D7761726520 -:10D4A0005C7432675C747669696268386D5C73724B -:10D4B000635C73797374656D5C7265765F645C73CD -:10D4C000797374656D5F747669696268386D5F63DE -:10D4D0006D30706C75732E6300000000443A5C6818 -:10D4E00075616E672E7875657765695C4769745CF0 -:10D4F000436F676E69746976655F4167656E745CDA -:10D500006669726D776172655C7432675C747669A6 -:10D51000696268386D5C7372635C647269766572A7 -:10D52000735C737973636C6B5C63795F737973633A -:10D530006C6B2E6800000000443A5C6875616E6791 -:10D540002E7875657765695C4769745C436F676EB3 -:10D5500069746976655F4167656E745C6669726D52 -:10D56000776172655C7432675C7476696962683889 -:10D570006D5C7372635C647269766572735C7379F7 -:10D5800073636C6B5C63795F737973636C6B2E632D -:10D5900000000000443A5C6875616E672E7875651E -:10D5A0007765695C4769745C436F676E6974697617 -:10D5B000655F4167656E745C6669726D77617265FF -:10D5C0005C7432675C636F6D6D6F6E5C7372635C0D -:10D5D000647269766572735C7379737469636B5C8A -:10D5E00063795F7379737469636B2E630000000065 -:10D5F000443A5C6875616E672E7875657765695C1D -:10D600004769745C436F676E69746976655F4167EB -:10D61000656E745C6669726D776172655C743267A1 -:10D620005C636F6D6D6F6E5C7372635C6D775C666F -:10D630006C6173685C63795F6D775F666C6173685A -:10D640002E6300009F0F000000000000000000009B -:10D6500000000000000000000000030000000000C7 -:10D6600000000000000000000003000000000000B7 -:10D6700003000000000000000300000000000000A4 -:10D680000300000000000000030000000100000093 -:10D690000000000001000000000000000000000089 -:10D6A0001000000010000000100000000100000148 -:10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A -:10D6D00070B40123002413E00168001D194202D038 -:10D6E0004D466918491E0C60091D121F042AFAD202 -:10D6F0000D00960701D50C80AD1C1A4000D02C708F -:10D700000268001D002AE7D170BC704700000000CD -:10D710000600000000000000000000000000000003 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000060000000000000000000000D3 -:10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D77000000000000000000008000000150000008C -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 -:10D7A0000000000000000000010000000E0000006A -:10D7B0001500000000000000000000000000000054 -:10D7C0000000000000000000000000000000000059 -:10D7D0000000000000000000000000000100000048 -:10D7E0000600000000000000000000000000000033 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000006000000000000000000000002 -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D840000000000010B5074979441831064C7C44AB -:10D85000163404E0081D0A68891888470100A142AF -:10D86000F8D110BD080000002400000065FEFFFF95 -:10D8700068090000081300280000000039F9FFFFC4 -:10D880003E030000380100000008002800000301EA -:10D890000000000001000000000000000000000087 -:10D8A00001000000FF0F0100000000004D4F544F29 -:10D8B000525F494E325F4842375F4842385F484FB7 -:10D8C00052495A4F4E54414C00000000042071460A -:10D8D000084202D0EFF3098001E0EFF3088000B5C1 -:10D8E0000149884700BD0000C375001000F00EF824 -:10D8F000002801D0FFF7A6FF00BF00BF002000BF37 -:10D9000000BFFFF7A7FB00F003F8000000207047FE -:10D9100080B500F001F801BD0746384600F002F876 -:10D92000FBE7000080B500BF00BF024A11001820CD -:10D93000ABBEFBE7260002004D4F544F525F494EED -:10D94000335F4842355F4842365F534541545F502C -:10D95000414E00004D4F544F525F494E345F484294 -:10D96000335F4842345F4241434B524553540000B9 -:10D970004D4F544F525F494E315F4842315F4842EC -:10D98000325F4C4547524553540000000420714615 -:10D99000084201D0EFF30980EFF3088000B5014998 -:10D9A000884700BD65DA00100548014603B46846A3 -:10D9B00080F3098800BF00BF00BF00BFFFF796FFDC -:10D9C000A5EDF5FE00127A00000000000024F4002E -:10D9D0000080000000800000008000009E029E0A7F -:10D9E000AA02AA0ACE03CE0B2A042A0C0003000BBB -:10D9F0000100020004000800100020004000800028 -:10DA000000010002484F52495A4F4E54414C5F4862 -:10DA1000414C4C00534541545F50414E5F48414C8E -:10DA20004C0000004241434B524553545F48414C27 -:10DA30004C0000004C4547524553545F48414C4C04 -:10DA400000000000E02E0000401F0000E02E00005B -:10DA5000102700000003000100040103020200027D -:10DA6000000300058169891E0978C9B20160704709 -:10DA7000000000000001010101010100000100009F -:10DA80000203040506080C1000000000000000005E -:10DA9000020000000100000004030001131400153F -:10DAA000C70103000100000000080028FFFF012853 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB8000000000000000000000000000000102038F -:10DB90005A5A5A5AFEE70000FEE70000FEE700006E -:10DBA000FEE70000FEE70000FEE70000FEE70000E1 -:10DBB000FEE70000FEE70000FEE70000FEE740048D -:10DBC000550002000100015003D58E001000012312 -:10DBD0008D8F0CA0040900040101000112050E83C1 -:10DBE000DCD9286004FFFFFF1F020225920807F01E -:10DBF000010352400001F2060218F2060418F20670 -:10DC00000618F2060818F306005478F10618F20612 -:10DC10000418F2060618F2050818F002FFD1CD002C -:10DC20001004F1FF04F1FF04F1FF04F1FF04F1FF20 -:10DC300004F1FF04F1FF04F147046C0248090028D5 -:10DC4000060AF321060001F12334F25208680008A5 -:10DC500001010102030203010F0F00000000000098 -:10DC600000000000000000000000000000000000B4 -:10DC700000000000000000000000000000000000A4 -:10DC80000000000000000000000000000000000094 -:10DC90000000000000000000000000000000000084 -:10DCA0000000000000000000000000000000000074 -:10DCB0000000000000000000000000000000000064 -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000000000000000000000000000000034 -:10DCF0000000000000000000000000000000000024 -:10DD00000000000000000000000000000000000013 -:10DD10000000000000000000000000000000000003 -:10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 -:10DD600000000000000000000000000000000000B3 -:10DD700000000000000000000000000000000000A3 -:10DD80000000000000000000000000000000000093 -:10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 -:04DDD000000000004F -:040000051000D9A965 +:100F700070BD0000F01B002870B50026340019E099 +:100F800030009021685430009121685411E0300005 +:100F9000912168548220285C00280AD1C348006847 +:100FA000E96B401A9949884203D305212000FFF7D5 +:100FB000E9FC641C042C00D387E028488421490004 +:100FC000614345182000FFF75CFF7E20285C002865 +:100FD00007D08220285C002803D18C20285C0028C0 +:100FE00000D1E6E783204000285C00280AD0F320E7 +:100FF000285C002806D130009021685430009121EF +:101000006854D6E78B20285C002814D0300090214B +:101010006854300091216854286F00280AD17E203E +:10102000285C022801D1022100E00321C9B220007E +:10103000FFF7A8FCBDE7286F0328A1D22000FFF727 +:1010400089FBC0B200280BD07820285A3349A2016E +:101050008918898F884203D3012002E008130028F1 +:1010600030009021695C00290BD101219022A95404 +:101070008E490968E9636968296431009122A9549D +:1010800008E069682A6C914204D06968296487493C +:101090000968E963C0B2002800D178E79120285C94 +:1010A000002806D1012091216854804800686864B6 +:1010B00070E77E480068696C401A642800D269E7CE +:1010C00004212000FFF75EFC64E770BD38B59E4C3C +:1010D000200003F0C9FD00281BD0200003F0C9FD4B +:1010E00072480168491C01600024250003E02800C3 +:1010F000FFF732FE6D1C042DF9D3FFF784FCA748DF +:101100000168491C01600168192902D30460FFF7D6 +:1011100033FF31BD8D48006870470000ACDC001023 +:10112000CF07000070B528250026340009E0022210 +:1011300001219B48A301C0181823C05EFFF742F9A4 +:10114000641C042CF3D302220121FF204230FFF75C +:1011500039F9934C1820205EFFF730F92B005B1E05 +:1011600002220121C0B2FFF76BF81820205EFFF7C2 +:1011700025F902220121C0B2FFF764F9350011E020 +:101180008849A8012018406903F008F8A801201830 +:10119000406903F083F90021A8012018406903F099 +:1011A0008EF96D1C042DEBD3012420007E490870BC +:1011B0003E48066079480660634E7C49300003F083 +:1011C0003BFC300003F055FD300003F047FD784D47 +:1011D000280003F057FD77490020285E03F071FDD9 +:1011E00003210220285EFEF763FF0220285EFEF73F +:1011F00053FF0220285EFEF743FF300003F028FD76 +:10120000300003F00CFCAD48047070BDC409000050 +:10121000F8B500220121AA48FFF765F90122022151 +:10122000A848FFF760F900220121A748FFF75BF902 +:10123000A64D012201212800FFF755F900220021C7 +:10124000A348FFF750F9A34C002204212000FFF728 +:101250004AF9002205212000FFF745F9002200216C +:101260002800FFF740F9FFF705FC9B480090082095 +:1012700000990860994E13243470994FC14A002197 +:10128000380002F0F4FE0625009805603470BD4A6F +:101290000121380002F0EBFE009805603470B94A75 +:1012A0000221380002F0E3FEF1BD0000F01B00282F +:1012B00078B58DB06846B449342203F015FD3A483C +:1012C000007800280BD0B14803F0AFFBB04803F022 +:1012D000ACFBB04803F0A9FBAF4803F0A6FB7C4E83 +:1012E0006A460021300002F0C2FE7A4D6A460421AF +:1012F000280002F0BCFE6A460521280002F0B7FE75 +:10130000724C6A460021200002F0B1FE002130003C +:10131000FEF714FF04212800FEF710FF0521280026 +:10132000FEF70CFF00212000FEF708FF01200090CF +:101330006A460121200002F09AFE01212000FEF7FA +:10134000F9FE0EB070BD0000000A5840F01B0028E6 +:101350001CB591246400012203212000FFF732F81C +:10136000012000908D4A00238D480021FFF79AF854 +:101370002000FFF723F801220321C0B2FFF762F833 +:10138000884C200003F012FE00228749200003F061 +:10139000D3FC2000FEF720FF13BD0000F41B002843 +:1013A000ACDC001004E10010AE1C0028B4E3001017 +:1013B000A0E80010CD100010F2B5060000273C0098 +:1013C0000098002801D1002077E0380000990880BB +:1013D00003F01EFBCD490978002903D003F01CFB64 +:1013E00000206AE00121C94A117003F015FB6D4D20 +:1013F0002800FEF7FBFE2800FEF700FF022131481F +:10140000FEF79CFE012003F059FEB6B23100280021 +:10141000FEF7FCFE01283ED1BD4E00E0761E2800FE +:10142000FEF7E8FE002801D1002EF7D12800FEF7D4 +:10143000E1FE00282FD0B64E00E0761E2800FEF711 +:10144000D1FE002801D1002EF7D12800FEF7CAFEF8 +:10145000002820D0012200992800FEF7D3FE0128A1 +:1014600019D1C0200002009909880140814201D1B0 +:10147000012400E03C002000C0B200280BD0A548A9 +:101480000078002807D000980088FC2189010140DD +:10149000002900D03C00012003F010FE0221094881 +:1014A000FEF748FE012003F009FE03F0B1FA974968 +:1014B0000F7003F0B1FA2000C0B2F2BDAD1C0028DD +:1014C00080013140800F31408004314000043140C0 +:1014D00080003140800231406412002868120028E8 +:1014E0000003314080B5C0B20202FC2080011040F0 +:1014F000C9B20843694680B2FFF75EFF02BD1CB562 +:101500000C00C0B20002FC21890101408020C00112 +:101510000843002C05D0694680B2FFF74DFF002834 +:1015200001D1002003E0684600882070012016BD2C +:1015300038B505000C002100C9B22800C0B2FFF781 +:10154000D1FF002801D100200FE069462800C0B279 +:10155000FFF7D5FF002806D068460078E4B2A04225 +:1015600001D1012000E00020C0B232BD80B5B44AF4 +:1015700000211160017C1172C168806802F077FD62 +:1015800001BD00006012002880E5001000065840F0 +:1015900080065840000758408009584000B4C404F1 +:1015A0000024F4000000644004E40010F8B50126B3 +:1015B0003000002468460470564804700121A14898 +:1015C000FEF7B8FDC24F01213800FEF7B3FD9E4D76 +:1015D000280003F073FD01219C48FEF7ABFD2800B5 +:1015E00003F06CFD02210820FFF7A2FF0500280090 +:1015F000C0B2002804D000210920FFF799FF0500A0 +:101600002800C0B2002804D000210A20FFF790FF74 +:1016100005002800C0B2002804D00F210B20FFF7DE +:1016200087FF05002800C0B2002804D0A5210C20A7 +:10163000FFF77EFF05002800C0B2002804D000217B +:101640000D20FFF775FF05002800C0B2002804D068 +:1016500000210E20FFF76CFF05002800C0B2002813 +:1016600008D087210720FFF73DFF0500FA20800002 +:1016700003F024FD2800C0B2002804D086210720F2 +:10168000FFF756FF05002800C0B200280ED06946BB +:101690000020FFF734FF002807D068460078BF21FC +:1016A0000140802901D1350000E025002800C0B2AA +:1016B000002810D0A1480470A1480470B9480470F3 +:1016C00014480670B8480068B8490860012138001D +:1016D000FEF734FD07E0B34806700E4804700121A0 +:1016E0003800FEF727FD2800C0B2F2BD10B5040097 +:1016F000534A002010601072E168A06802F0B7FC45 +:10170000E168A068FEF71AFD10BD0000B21C0028B9 +:10171000A0860100B51C0028F8B501242000A149CD +:10172000087000252800A949087001216848FEF7C3 +:1017300001FD2E000FE0A6480078002805D0A5483E +:10174000B1014018406903F070F9A248B101401896 +:10175000FFF7CCFF761C042EEDD303F059F900906F +:10176000280044E02A0011E0B84984225200424394 +:1017700089188A228A5C002A07D197228A5C002A6B +:1017800003D198228A5C002AECD022002B007E260E +:101790008B552B007F268B552B0080268B552B00DD +:1017A00082268B55072383268B552E008A27CE55FC +:1017B0002E008B27CE552E009427CE552E00952730 +:1017C000CE552E009627CE552E009727CE552E00AB +:1017D0008927CE55D2B2002A08D084228B549C226D +:1017E0008A58A023CA5022009823CA54401C0428B7 +:1017F000BAD3009803F010F9F1BD80B573480078B2 +:1018000000280AD067480078002806D16748664952 +:101810000A680368D21A192A00D20FE00968016029 +:1018200069460020FFF76BFE002805D06846007867 +:10183000BF210140802901D0FFF76EFF01BD0000EC +:10184000C812002880013140102700008004314078 +:1018500070B5604A80011018524A1278002A01D0EF +:10186000002034E02422825C092A14D1334D2A78E6 +:101870002523C35C9A432523C45C0C4014432100F8 +:10188000C9B20920FFF754FE06003000C0B200289C +:1018900015D02C7013E02A4D2A782523C35C9A4377 +:1018A0002523C45C0C4014432100C9B20A20FFF771 +:1018B0003FFE06003000C0B2002800D02C7030007F +:1018C000C0B2002801D1FFF727FF3000C0B270BDC1 +:1018D0000004314038B504003E48A101451868694C +:1018E00003F0A3F82800FFF701FF00212000FFF715 +:1018F000AFFF32BD70B505003648AA018618C9B2DF +:10190000012902D12620345C01E02720345C0F201D +:10191000E840C00701D400200FE0706903F085F8AB +:101920003000FFF7E3FE2100C9B22800FFF790FF67 +:10193000002801D1002000E0012070BDAB1C002870 +:10194000AC1C002870B504002248A10145183F488E +:101950008421490061434018F421465C83214900F9 +:10196000415C00290AD08B21415C002906D1F2217B +:10197000465C3100C9B2322900D23226F3214654E6 +:10198000FEF712FE3100C9B22000FEF7FAFD002179 +:10199000686902F094FD686903F041F82800FFF7D8 +:1019A000E5FD70BDAF1C0028F01B0028F81B0028C7 +:1019B00000B50A00D2B2002A07D081228154AD4975 +:1019C0000968016201219522815400BDB51C0028DF +:1019D000AE1C0028ACDC0010842281549C214158AC +:1019E000A0228150012198228154704700B59C218A +:1019F0004158491C9C2281509C214158002902D108 +:101A000001219C22815000210A008423C254A0227B +:101A100081509822815400BD00B58B21415C002982 +:101A200004D08169002901D0816900E092499622A1 +:101A3000825C002A07D08F4A12684069101A8842D7 +:101A400001D3012000E00020C0B200BD081300282F +:101A500080B500217E2281547F22815480228154CE +:101A6000942281549522815481228154962281545A +:101A70008A22815497228154012183228154012199 +:101A8000FFF7AAFF01BDF3B583B07C480399842218 +:101A90005200514344180020694608700025002078 +:101AA000694648700027002069468870002602F0C9 +:101AB000AFFF01909420205C00284DD08220205C54 +:101AC000002849D16E480078002845D12000FEF753 +:101AD00028FD002840D06846007CC0B2002809D00C +:101AE00064480068E169401A322835D39520205CAB +:101AF000002831D12000FFF78FFF002804D00521F6 +:101B00000398FEF73FFF27E08A20205C002808D0DA +:101B1000A0682169884204D12000FFF799FF0127BE +:101B20001AE08A20205C002807D0A068216988423A +:101B300001D2012003E0022001E08020205C694600 +:101B4000087068460078002803D001206946487074 +:101B500002E0002069464870019802F05DFF3800FD +:101B6000C0B2002803D00398FFF7B4FE80E06846B7 +:101B70004078002801D100207AE068460178039877 +:101B8000FFF7B8FE002801D1002071E002F040FF0D +:101B900001909420205C002856D08220205C0028F0 +:101BA00052D13748007800284ED12000FEF7B9FC0A +:101BB000002849D02000FFF72FFF002804D005217E +:101BC0000398FEF7DFFE3FE08A20205C002810D05B +:101BD000A0682169884204D12000FFF739FF01275E +:101BE00009E0A0682169884201D2012503E00225AD +:101BF00001E08020255C3800C0B200281CD12800FC +:101C000069460978C0B2884216D1684600787E21BC +:101C100060540020802160549421605495216054C8 +:101C2000812160542000FEF75FFD0398FFF78AFED4 +:101C300001266846867007E0FFB2002F03D180209E +:101C40002554012600E00126019802F0E5FE6846D1 +:101C5000807800280AD10A480078002804D1039827 +:101C6000FFF738FE002801D1002001E03000C0B2AB +:101C700005B0F0BDF01B0028B8880000081300284C +:101C8000AF1C0028F6B583B00D001F000400E4B2BD +:101C90009C490978002916D0C0B2FEF72FFC002815 +:101CA00011D09948007800280DD198480078002874 +:101CB00009D16846057068460078012805D0684655 +:101CC0000078022801D001201AE102F0A1FE019063 +:101CD000842676008E4D2000704328188221405CB7 +:101CE000002806D1200070432818FEF71AFC0028AF +:101CF00004D1019802F090FE012001E12000704320 +:101D000028187E21415C0CA80078002813D10CA86B +:101D100001700CA8007800280DD12000704328180D +:101D20009522805C002806D020007043281881226C +:101D3000805C0CAA10700800C0B2002803D00120FB +:101D40006A46507002E000206A4650700CA8007885 +:101D500000280CD0C9B2002905D00CA8007869462B +:101D60000978884203D001206946887002E000208B +:101D70006946887068464078002805D0C548A101AA +:101D80004018406902F051FE0A9902976846027CA9 +:101D900000272000704328188223C7542000704376 +:101DA00028187F23C7542000704328188A23C25460 +:101DB000029B2000704328180361200070432818FC +:101DC0008B23C15420007043281897214754D2B266 +:101DD000002A08D00BA80078002804D02000704307 +:101DE0002818FFF703FE0D98C0B2002806D0200087 +:101DF000704328189621405C002810D1A64801683D +:101E000020007043281841610121200070432818E8 +:101E100096228154200070432818862147540BA82D +:101E20000078002804D020007043281883214754EC +:101E30006846807800281ED02000704328187E2134 +:101E40004754684601782000704328188022815446 +:101E500091480168200070432818C16101212000C9 +:101E600070432818942281540CA801786643A8195D +:101E7000FFF79EFD20E02000704328187E21475484 +:101E800068460178200070432818802281548248D7 +:101E90000168200070432818C161012120007043AF +:101EA0002818942281542000704328189521475403 +:101EB0006643A81981214754019802F0ADFD684698 +:101EC000407800280CD07348A1014018FFF70EFCA1 +:101ED00000212000FFF7BCFC002801D101200FE009 +:101EE00068468078002801D0002009E00021200009 +:101EF000FFF7C9FD002801D0380000E00120C0B282 +:101F000005B0F0BDAD1C0028B01C0028AF1C002897 +:101F10000813002880B50121FFF7B5FD01BDF1B51B +:101F200086B05E4806998422520051434418002727 +:101F3000002502F06DFD01908220205C694608704A +:101F400068460078002803D1019802F065FD9EE004 +:101F50007F20205C694608748B20205C69464870AD +:101F60009720205C694688700026300082216054EA +:101F700030007E21605430007F2160543000802189 +:101F8000605430009421605430008A2160546846C7 +:101F90000078832160543000972160546846017CAA +:101FA0002000FFF705FD68468078002804D06846C9 +:101FB00001782000FFF710FD6846007802280FD155 +:101FC00001252F0068464078002807D19220205C28 +:101FD000002803D08620205C002830D035002EE079 +:101FE00068460078032810D1022768464078002808 +:101FF00009D19220205C002805D08620205C002892 +:1020000001D101251BE0350019E06846007804285D +:1020100015D16846007C012801D1022700E0012784 +:1020200068464078002809D19320205C002805D01C +:102030008620205C002801D1012500E03500280021 +:10204000C0B2002805D08620205C401C8621605448 +:1020500001E096202654019802F0DEFC0698FFF776 +:1020600039FC002813D0EDB2002D10D001200390D0 +:102070006846007C02900020019000200090002320 +:1020800000223900C9B20698C0B2FFF7FBFD07B0C5 +:10209000F0BD0000ACDC0010F01B00280813002885 +:1020A000F1B584B0B14804998422520051434518D7 +:1020B00002F0AEFC0090AE48046883204000285C2B +:1020C000002818D07E20285C002814D08B20285CA3 +:1020D000002810D19420285C00280CD18220285C94 +:1020E000002808D1A3480078002804D1C02028582F +:1020F000201A322803D2009802F08EFC34E12868BE +:102100000190F020285CF121695C05290AD2C421E4 +:1021100069580391BC216958F122AA5C521CF12331 +:10212000EA540CE00100C9B289006918C822895834 +:1021300003910100C9B289006918DC228958019A0B +:102140000300DBB29B00EB18C8269A510200D2B202 +:102150009200AA18DC23D450401C0200D2B2052AF7 +:1021600000D30020F022A854C0202C50601A029006 +:10217000BC202858201A0021FA22D200002302F0A5 +:10218000A3F9FA229200002301F0ABFE0200A42082 +:102190002858904201D2A4202A58AC202858A421C3 +:1021A0006E580021002302F08FF902000B00700826 +:1021B000002180185941A422AA58002301F091FE61 +:1021C00006000198C4216958471ABC202858201AD3 +:1021D000322812D33000401CB8420ED2F320285CC3 +:1021E000002806D00020F321685400210498FEF74F +:1021F000C8F9009802F010FCB6E0BC202858201A5C +:10220000FA2802D30298FA2803D2009802F004FCBC +:10221000AAE002980021FA22D200002302F054F929 +:10222000FA229200002301F05CFE0400002C03D18E +:10223000009802F0F1FB97E001980399401A002101 +:10224000AF4A002302F040F902000B0060080021B1 +:10225000801859412200002301F043FE0190B02074 +:1022600028580290F3202C5C0198B421685030006B +:10227000401CB84201D200245BE07F1CB74210D260 +:102280002000C0B2322801D2322452E02000C0B275 +:102290005F284ED2641D2000C0B2602849D35F245D +:1022A00047E0019800216422002302F00DF90600A6 +:1022B0000F00029800215A22002302F005F98F42F4 +:1022C00013D801D3864210D22000C0B2322801D2E6 +:1022D00032242EE02000C0B25F282AD2641D2000E4 +:1022E000C0B2602825D35F2423E0029800216E222B +:1022F000002302F0E9F806000F0001980021642293 +:10230000002302F0E1F88F4213D801D3864210D2A5 +:102310002000C0B2332807D32000C0B2372801D331 +:10232000FB3406E0322404E02000C0B2002800D0D4 +:1023300000242000F321695CC0B2884211D0F32050 +:10234000285C002806D12000C0B2322802D3280021 +:10235000FEF7CAF9F3202C542100C9B20498FEF705 +:1023600010F9009802F058FB05B0F0BD08130028E2 +:10237000F01B0028AF1C0028FEB5A54800780028F7 +:102380005DD002F045FBC3490978002902D002F074 +:1023900043FB54E001273900BE4A1170B8490A785E +:1023A0006B461A70002422000A7002F035FB684662 +:1023B000007800282BD0250027E026001AE0684688 +:1023C00000783900A94008421ED002F021FB01909C +:1023D00084214900B04A28004843101882235B003A +:1023E000C05C0028E9D069435018FEF79AF800282D +:1023F000E3D13E00019802F00FFBF6B2002E03D0AD +:102400002800C0B200F059F96D1C042DD7D3FEF797 +:102410000FFAFFF7F2F9250009E02800FFF77FFD2A +:102420002800FFF777FD2800FFF73AFE6D1C042D0A +:10243000F3D302F0EDFA97490C7002F0EDFAF7BD14 +:10244000964800787047F8B50E000700FFB2704953 +:102450000978002904D0C0B2FEF750F8002801D155 +:10246000012046E002F0D4FA04008B4884214900A0 +:10247000794345188A480078002804D0200002F0EB +:10248000CBFA012035E0FF20801D285C00280CD00D +:10249000310089B2F820285AFEF739F8002804D014 +:1024A000200002F0B9FA012023E082204000285CDD +:1024B00000280FD0F620285A310089B2884219D15D +:1024C00000208221490068546D4801780122BA40F9 +:1024D00091430170F8202E52FC2028588021490099 +:1024E00068500120FF21891D6854200002F094FAF1 +:1024F0000020F2BD200002F08FFA0120F9E7000071 +:10250000A0860100F2B50400E4B24149097800292F +:1025100004D0C0B2FDF7F2FF002801D1002025E071 +:1025200002F076FA070084256D005B4E20006843B8 +:102530003018FDF7F6FF002812D02000684330184D +:10254000FF21891D405C00280AD0684600886C4342 +:102550003119F822895A80B2814201D1012400E068 +:102560000024380002F058FA2000C0B2F2BDF3B5E2 +:1025700081B000262DE000200EE0002482204000E3 +:10258000385C0028F7D068460189F620385AFDF7F4 +:10259000BEFF0028EFD028002043C0B2002817D18A +:1025A00068460089F6217852FC203858401CFC21EE +:1025B0007850280082214900785431480178B5408C +:1025C0000D430570AF48B1014018406902F02DFA83 +:1025D000761C042E1AD20125684600792900B140E4 +:1025E0000842F5D02C488421490071434718FF2048 +:1025F000801D385C0028C0D068460189F820385A10 +:10260000FDF785FF0028B8D02C00B7E7F7BD000024 +:10261000AD1C0028F1B5002425002EE084214900DE +:102620001D4A68460388280048431018F62683533D +:10263000280048431018FC23C3585B1C280048435B +:102640001018FC26835101231E002800484310184F +:1026500082277F00C655200069435118FF22921D32 +:10266000885407480178AB400B4303708548A901A3 +:102670004018406902F0D9F96D1C042DCED3F1BD8C +:10268000B31C002880B50121054A117080B2FFF704 +:10269000C1FF01BDB11C002808130028AF1C002891 +:1026A000B01C002810B5002404E02000C0B200F0E7 +:1026B00004F8641C042CF8D310BDFEB50400E4B289 +:1026C000B9490978002904D0C0B2FDF717FF0028E6 +:1026D00001D10120D5E002F09BF9019084256D0025 +:1026E000B24E2000684330187E21415C20006843D0 +:1026F00030188322805C6A461070200068433018CE +:102700008A22805C002806D1200068433018972276 +:10271000805C002803D001206A46507002E000204F +:102720006A465070C9B2200068433018FFF740F97C +:10273000002739002000684330187E228154390078 +:102740002000684330187F228154390020006843FC +:1027500030188022815439002000684330188222CA +:102760008154B3480078002806D007212000684330 +:1027700030188322815430E068464078002806D023 +:1027800006212000684330188322815425E06846E2 +:102790000078022813D06846007803280FD06846D6 +:1027A000007804280BD068460078052807D06846D2 +:1027B0000078072803D068460078082807D16846C3 +:1027C00001782000684330188322815405E03900E5 +:1027D0002000684330188322815439002000684368 +:1027E00030188A22815439002000684330188B2227 +:1027F00081543900200068433018942281543900F4 +:102800002000684330189622815439002000684324 +:1028100030189722815468464078002805D0062158 +:1028200065437019FFF7D8F80FE0390020006843BE +:10283000301884228154200068433018A02147506A +:1028400038006543711998228854019802F0E4F821 +:102850007748007800280BD00A4DA001281840695D +:1028600002F0E3F8A0012818FEF740FF012008E07D +:102870002000FFF72FF8002801D0380000E00120E9 +:10288000C0B2FEBDACDC0010FEB50D000400E4B229 +:1028900045490978002913D0C0B2FDF72FFE002862 +:1028A0000ED0AC4E307800280AD1684605706846D4 +:1028B000007832382E2803D25D4D2878002801D0C8 +:1028C00001206FE002F0A4F80190307800280CD1CC +:1028D0002878002809D184256D00344E20006843F3 +:1028E0003018FDF71EFE002804D1019802F094F87C +:1028F000012057E068460178200068433018F42230 +:102900008154002739002000684330188322520088 +:102910008154200068433018A421475020006843A8 +:102920003018A8214750200068433018AC21475088 +:10293000200068433018B0214750684601782000D5 +:1029400068433018F22281546846017820006843B9 +:102950003018F3228154200068433018FDF724FE1C +:102960002000684330187E21405C00280ED02000F3 +:10297000684330188B21405C002807D165437019EB +:102980008221405C002801D10127FFE7FFB2002F20 +:1029900004D0684601782000FDF7F3FD019802F0AD +:1029A0003BF80020FEBD0000AD1C002808130028E5 +:1029B000F8B5002203920022029201220192002225 +:1029C000009200230022C9B2C0B2FFF75BF905B044 +:1029D00000BD38B50400E4B2AE490978002904D03E +:1029E000C0B2FDF78BFD002801D100201FE002F0EE +:1029F0000FF884225200A84B2100514359187E251C +:102A0000495D00290CD12100514359189425495D95 +:102A1000002905D1544319199522895C002901D058 +:102A2000012400E0002401F0F7FF2000C0B232BD15 +:102A3000AF1C002838B50C000500EDB2002C1FD0EB +:102A4000C0B2FDF75BFD00281AD06068002817D0DF +:102A50006168280000F00CFF002811D0207C0028BD +:102A600003D06068216888420AD3A068002807D094 +:102A70008A48A9014018006B4000A168884201D231 +:102A8000012000E0002032BDF8B50400E4B2814A24 +:102A90001278002A06D00F003900C0B2FFF7CAFF33 +:102AA000002801D0012053E001F0B2FF00908425FE +:102AB0006D00794E2000684330187E21405C00286C +:102AC00014D12000684330189421405C00280DD1B7 +:102AD0002000684330189521405C002806D1200072 +:102AE000684330188221405C002804D0009801F02F +:102AF00093FF01202CE03968200068433018816082 +:102B00007968200068433018C160B96820006843C4 +:102B10003018B8228150F968200068433150397C60 +:102B20002000684330188922815400212000684326 +:102B3000301883228154200068433018FDF7D4FDFB +:102B40006C433019FDF730FD009801F065FF00205F +:102B5000F2BD0000B01C002870B50C000500EDB2FD +:102B6000002C08D04B490978002904D0C0B2FDF7E9 +:102B7000C5FC002801D1012020E001F049FF84229A +:102B80005200454B2900514359188968216029009A +:102B900051435918C9686160290051435918B82632 +:102BA0008959A160290051435958E1605543591989 +:102BB0008922895C217401F02FFF002070BDF8B5D7 +:102BC0000D000400E4B233490978002918D0C0B2DE +:102BD000FDF794FC002813D07348007800280FD12B +:102BE000C048007800280BD100950098002807D035 +:102BF0002A48A1014018006B40000099884201D288 +:102C0000012036E001F004FF070084256D00B74E77 +:102C10002000684330187E21405C00281BD1200032 +:102C2000684330189421405C002814D12000684388 +:102C300030189521405C00280DD1200068433018E1 +:102C40008221405C002806D1200068433018FDF73F +:102C500068FC002804D1380001F0DEFE012008E005 +:102C600000986C433119B8228850380001F0D4FE26 +:102C70000020F2BD00B59E4800680021FA22D20073 +:102C8000002301F021FCFA229200002301F029F92F +:102C900000BD0000AD1C002808130028ACDC0010AB +:102CA000F8B505000C002E00F6B2002C09D09148B2 +:102CB0000078002805D02800C0B2FDF71FFC0028CE +:102CC00001D101206CE001F0A3FE070088480168F3 +:102CD00084225200854B300050431818806B091A2B +:102CE00025703000504318188E25405D002803D011 +:102CF000332901D2012000E00020607030005043F1 +:102D000018188F25405DA0703000504318187425A6 +:102D1000405BE0803000504318187625405B2081EE +:102D20003000504318187825405B60816E48B5012B +:102D30004019808FA0816078002808D0A0780028F2 +:102D400005D06089A589A84201D3012000E00020B8 +:102D5000E0703000504318188C25405D002807D0E3 +:102D6000300050431818006F032801D2012000E002 +:102D700000202071564398198B22805C60710800F6 +:102D80000021FA22D200002301F09EFBFA229200D9 +:102D9000002301F0A6F82061380001F03DFE00207C +:102DA000F2BDA84908707047B01C0028FEB50500A8 +:102DB0000C002E00F6B2002C09D04E4800780028F6 +:102DC00005D02800C0B2FDF799FB002801D10120F1 +:102DD00086E001F01DFE019084214900434A300045 +:102DE000484310188768300048431018C0680090A6 +:102DF0003000484310188923C05C6070300048439D +:102E000010187E23C05CA070714350188321405C71 +:102E1000E070019801F000FE0098002801D1012027 +:102E20005EE0019700980199884201D200980190D4 +:102E30002D48B1014018C26A257067600098A060F3 +:102E4000226101980021002301F03EFB02000B00EB +:102E500000984008002180185941009A002301F091 +:102E600040F8E06001980021774A002301F02CFB34 +:102E700002000B0000984008002180185941009A78 +:102E8000002301F02EF860620026A661E6612800AA +:102E9000C0B2002805D1E0686061E068A0612662E8 +:102EA0001DE0EDB2012D17D1E068606101980021AD +:102EB000664A002301F008FB02000B00009840085E +:102EC000002180185941009A002301F00AF8A061FE +:102ED000E068E061266202E06661E068206200204E +:102EE000FEBD0000AF1C0028ACDC00100813002859 +:102EF000F01B0028AD1C0028F8B588B00D001600A6 +:102F00000400E4B27A49097800290CD0C0B2FDF778 +:102F1000F5FA002807D077480078002803D17648D2 +:102F20000078002801D001208AE006960795FFF777 +:102F300023FA01F06DFD842676006C4D210071436B +:102F40006918CF6801F068FD03A8029004A80190F9 +:102F500005A80090069B079A39002000FDF73EFB6C +:102F6000002801D101206BE001F052FD070061480B +:102F7000007800280AD160480078002806D1200097 +:102F800070432818FDF7CDFA002804D1380001F06D +:102F900043FD012054E00799200070432818A42223 +:102FA00081500699200070432818A8228150059965 +:102FB000200070432818AC228150049920007043EF +:102FC0002818B02281506846017B200070432818E1 +:102FD000F22281546846017B200070432818F322B6 +:102FE000815401212000704328188322520081540B +:102FF000200070432818FDF7D7FA200070432818E6 +:103000007E21405C00280ED02000704328188B21C0 +:10301000405C002807D16643A8198221405C002843 +:1030200001D1012000E00020C0B2002804D0684691 +:10303000017B2000FDF7A5FA380001F0EDFC00202F +:1030400009B0F0BDB41C002810270000EC130000EC +:1030500070B505000C002E00F6B2002C09D02448F3 +:103060000078002805D02800C0B2FDF747FA0028F4 +:1030700001D1012038E001F0CBFC25708422520000 +:10308000B84B31005143591883256D00495D61707B +:10309000310051435918A425495961603100514309 +:1030A0005918A8254959A160310051435918AC2538 +:1030B0004959E160310051435918B02549592161FE +:1030C000310051435918B4254959616131005143C8 +:1030D0005918F225495D217656439919F322895CE6 +:1030E000617601F099FC002070BD000008130028F3 +:1030F000AD1C0028B01C0028AF1C0028F1B586B01C +:103100000C006846007E01900026300030006946C1 +:1031100008743000694688703000694648709248EB +:103120000078002809D06846007EFDF7E7F90028FE +:1031300003D08E4D2878002801D0012010E103949F +:10314000FFF71AF98A48019989014018C76A03985C +:10315000874201D2012003E101F05AFC029081482C +:10316000019984225200514344188920205C002890 +:1031700012D0E06800280FD08B20205C00280BD1F3 +:103180008220205C002807D12000FDF7CAF9002822 +:1031900002D02878002804D0029801F03DFC0120DC +:1031A000DEE003980021E268002301F08DF90200BF +:1031B0000B0078080021801859413A00002300F0E4 +:1031C00090FE07007E20205C694608702000FEF714 +:1031D0000DFC276101258A20255430008B21605485 +:1031E0003000972160543000832160549420205C8B +:1031F000002819D0A068874201D1300005E0A068FE +:10320000B84201D2280000E00220802160549620BC +:10321000205C00287DD157480068606196202554C5 +:1032200030008621605474E068460078002839D068 +:1032300068460078012802D1A068B84206D36846E3 +:103240000078022804D1A068874201D2280000E05B +:1032500030009621615C002907D146490968616107 +:103260009621655431008622A154C0B2002850D165 +:103270003F48019989014018406901F0D6FB3000B0 +:103280007E2160543000802160543A480068E0613B +:1032900094202554684601782000FEF789FB684693 +:1032A000857036E09520205C00281DD0A0688742FC +:1032B00001D1300005E0A068B84201D2280000E04A +:1032C000022080216054206AE061942025549620D9 +:1032D000205C00281DD12748006860619620255495 +:1032E00030008621605414E0A068874206D1300087 +:1032F000862160542000FEF7ABFB0AE0A068B842CC +:1033000002D26846057402E00220694608746846E5 +:103310004570029801F080FB68468078002809D04B +:103320000198FEF7D7FA002801D0300000E028000D +:10333000C0B215E068464078002810D00020039005 +:103340000020029000200190002000903B0001220C +:103350006846017C6846007EFEF794FC00E0002091 +:1033600007B0F0BD08130028AD1C0028AF1C0028D2 +:10337000ACDC0010F01B0028FEB5C0B20400FDF765 +:10338000C9FE019010E0FFB2002F46D0FDF7C2FE4B +:103390000199401A9349884241D234480078002864 +:1033A00001D001F05DFF30BFFEF7E6FF02F013F839 +:1033B00001F02EFB009084256D002B4E2000684309 +:1033C00030189521475C8848007800281AD12000E1 +:1033D00068433018FDF7A5F8002813D02000684393 +:1033E00030187E21405C00280CD120006843301842 +:1033F0009421405C002805D1654370198221405C0E +:10340000002801D0012500E00025009801F004FB10 +:10341000EDB2002DB7D0002002E0012000E0002036 +:10342000FEBD0000FBB51700089C0299002901D1E0 +:10343000002C18D0060001F0EBFA842252006B4BEE +:10344000310051435D58564399194E6801F0E4FA32 +:103450000298002803D00198281A02990860002CCD +:1034600001D0F01B2060F7BD08130028B41C002811 +:10347000F9B585B00D0016006846047D0698002851 +:1034800002D00020069908606846007DFFF774FFAF +:10349000002801D10120A2E02F0001F0B9FA0500B7 +:1034A00030000021FA229200002301F00DF8020002 +:1034B0000B00B348002180185941FA22D2000023A2 +:1034C00000F00FFD49498422520062438918886147 +:1034D000280001F0A1FA00200390002002900120B2 +:1034E000019001200090002300223900C9B26846F3 +:1034F000007DFEF7C7FB002801D001206FE001F03E +:1035000087FA3A498422520062438918C96A0191B4 +:1035100001F082FA0FE0FFB2002F4FD1EDB2002D83 +:1035200002D1F6B2002E49D0D0480078002801D050 +:1035300001F096FE30BFFEF71FFF01F04CFF01F0D7 +:1035400067FA84225200294B2100514359184968D7 +:10355000009121005143591883254F5D21005143AB +:1035600059187E254D5D6243991894228E5C01F0B6 +:1035700053FA00980199401A0428CCD36846007D7C +:10358000FFF79BF8002805D16846007DFFF7F4FEA1 +:10359000002809D1069800900023019A00212000FC +:1035A000FFF740FF01201AE0069800900023019ADF +:1035B00000212000FFF736FF002010E06846007D64 +:1035C000FFF77BF86846007DFFF7D6FE069800906F +:1035D0000023019A00212000FFF724FF012007B0FB +:1035E000F0BD0000C4090000AF1C0028081300282B +:1035F000F1B586B00E0015006846047E3000C0B2FA +:10360000022803D102206946087402E003206946BB +:10361000087405930598002802D0002005990860D9 +:103620000C98002802D000200C9908606846007EA3 +:10363000FFF7A2FE002801D1012014E12F0001F0C4 +:10364000E7F9050038000021FA229200002300F07B +:103650003BFF02000B004A48002180185941FA2222 +:10366000D200002300F03DFC9D49842252006243B9 +:1036700089188861280001F0CFF90020039000200C +:1036800002900120019001200090002300223100CF +:10369000C9B26846007EFEF7F5FA002801D0012085 +:1036A000E1E001F0B5F984256D008D4E21006943FC +:1036B0007118896A0291210069437118C96A0191E0 +:1036C00001F0AAF913E068464078002800D0B9E07C +:1036D00068460078002803D1FFB2002F00D1B1E086 +:1036E00062480078002801D001F0BAFD30BFFEF733 +:1036F00043FE01F070FE01F08BF92100694371185F +:103700008322895C6A4651702100694371187E22C8 +:10371000895C6A46117021006943711894228F5C9C +:103720002100694371189522895C6A46917001F005 +:1037300073F9684640786946097C8842C3D1684677 +:1037400000780028BFD13800C0B20028BBD168463D +:103750008078002816D06846007EFFF70DFE00280E +:1037600010D16846007EFEF7A8FF0C980090059BDC +:10377000019A02992000FFF755FE012073E000BF77 +:10378000CF07000001F044F907002000684330181B +:103790008321405C6946097C88421FD12000684330 +:1037A00030187E21405C002818D120006843301872 +:1037B0009421405C002811D12000684330189521E5 +:1037C000405C00280AD1200068433018FCF7A9FEAD +:1037D000002803D043480078002810D0380001F0BA +:1037E0001BF96846007EFEF768FF0C980090059B69 +:1037F000019A02992000FFF715FE012033E0200016 +:1038000068433058039020006843301840680090A7 +:1038100000206C4331198B228854380001F0FCF8E9 +:103820000598002804D003980299401A0599086069 +:103830000C98002804D000980199401A0C9908604F +:10384000002010E06846007EFEF737FF6846007EE5 +:10385000FFF792FD0C980090059B019A02992000B9 +:10386000FFF7E0FD012007B0F0BD0000B41C002808 +:10387000F2B582B01C4980010818806A00216A46AE +:1038800003C2083A64240025684603C84622002380 +:1038900000F01AFE22002B0000F023FB06000F00B0 +:1038A000684603C88222002300F00EFE22002B008F +:1038B00000F017FB029A082A0FD3029A0023BB429A +:1038C0000BD301D8B24208D3029A0023994204D301 +:1038D00001D8904201D3012000E00020C0B2FEBD1B +:1038E00008130028AF1C0028ACDC0010F9B58FB01D +:1038F0000F0016000FA80478002004900020079005 +:1039000000200A90002000200020002009900020C4 +:10391000089032206946487301250020002069463E +:103920000871002069460875002005A9487000202C +:1039300006902448007800281FD00FA80078FCF7D4 +:10394000DDFD002819D020480078002815D11F4837 +:103950000078002811D10296029800280DD0684600 +:1039600007736846007B002811D06846007B012859 +:103970000DD06846007B022809D01098002804D09A +:1039800005A803C8109A03C2083A012012E201F008 +:103990003FF8009084277F000D4E200078433018B8 +:1039A000FCF7BFFD002815D1009801F035F81098FC +:1039B000002804D005A803C8109A03C2083A0120C1 +:1039C000F8E100BFAD1C0028B01C0028AF1C002887 +:1039D00008130028200078433018C0680B90009826 +:1039E00001F01AF80FA80078FEF767FE002800D053 +:1039F00095E16846007B002860D107A8009004ABE1 +:103A0000029A02210FA80078FFF7F2FD05002800B6 +:103A1000C0B200282BD10798042828D20AAB029AFA +:103A200001210FA80078FFF723FD05002800C0B290 +:103A300000281CD107A8009004AB029A02210FA80D +:103A40000078FFF7D5FD05002800C0B200280ED190 +:103A5000079800210022401C514102000B000A98E7 +:103A600000218B4203D801D3824200D201252800D5 +:103A7000C0B2002820D100F0CBFF00902000784396 +:103A80003018FCF74EFD002804D1009800F0C4FF68 +:103A9000012544E100212000784330188160012194 +:103AA00020007843301889228154009800F0B4FF38 +:103AB00001206946087521E101251FE16846007B68 +:103AC000012830D10020009004AB029A01210FA8F8 +:103AD0000078FFF78DFD05002800C0B2002820D136 +:103AE00000F096FF0090200078433018FCF719FD95 +:103AF000002804D1009800F08FFF01250FE10B99F9 +:103B0000200078433018816001212000784330186C +:103B100089228154009800F07FFF012005A9487098 +:103B2000ECE00125EAE0002000900023029A022147 +:103B30000FA80078FFF75CFD05002800C0B2002840 +:103B400028D100F065FF0500200078433018FCF70D +:103B5000E8FC002804D1280000F05EFF0125DEE02B +:103B6000002120007843301881602000784330180D +:103B700089228154280000F04FFF01206946087512 +:103B80000020009004AB029A01210FA80078FFF7F3 +:103B90002FFD05002800C0B2002800D0ADE0049938 +:103BA0002000FFF765FE002800D1A6E000F030FFFE +:103BB00021007943711883225200895C6A4691730F +:103BC000210079437118A42289580D91210079436D +:103BD0007118A82289580C9100F01EFF6846807B5E +:103BE00000280ED003A8401C029008A8019009A844 +:103BF00000900C9B0D9A04992000FCF7EFFC69469D +:103C0000087100F005FF0090200078433018FCF7A1 +:103C100088FC002804D1009800F0FEFE01257EE01B +:103C20000499200078433018C1600499200078433B +:103C30003018816001212000784330188922815496 +:103C40006846807B00284FD06846007900281FD046 +:103C50000999200078433018AC228150089920003F +:103C600078433018B02281506846417B2000784369 +:103C70003018F22281546846417B20007843301886 +:103C8000F3228154200078433018FCF78DFC2BE0A0 +:103C900000210A0020007843301883235B00C254BF +:103CA000200078433018A422815020007843301837 +:103CB000A8228150200078433018AC228150200087 +:103CC00078433018B0228150200078433018B42255 +:103CD00081503221200078433018F2228154200094 +:103CE00078433018F3228154009800F095FE0120AB +:103CF00005A948700498069000E001252800C0B28C +:103D000000280CD16846007B022808D000F080FE15 +:103D1000210079437118C968069100F07DFE2800E2 +:103D2000C0B200283CD034480078002803D10FA846 +:103D30000078FEF7C2FC00F06BFE00906846007B46 +:103D4000022808D16846007D002804D0049920008C +:103D50007843301881600B99200078433018C16097 +:103D600000210A002000784330188923C2540A0039 +:103D70002000784330188B23C25420007843301839 +:103D8000962281541C480078002801D0072000E0CA +:103D900008207C43311983228854009800F03CFEAF +:103DA0001098002804D005A803C8109A03C2083A46 +:103DB0002800C0B211B0F0BD38B500200F4908701E +:103DC000FDF726FAFDF7C4FAFDF7F0FB050000F059 +:103DD00096FC0400FDF7A6F9EDB2002D06D0E4B282 +:103DE000002C03D0FCF7D2FC002803D1FDF794FC93 +:103DF000012000E0002032BDAF1C0028B01C0028CC +:103E0000D021890040587047C22189004058C00520 +:103E1000C00D704790229200815070478221890026 +:103E20004058C005C00D704700B50068800B800782 +:103E3000800F002801D1802000E0402000BD00B5A7 +:103E4000C02189004058C006C00E082801D20120B8 +:103E500000E00020C0B200BDF8B504000D0016005F +:103E60002000FFF7ECFF002809D02F000025B54205 +:103E700010D22000FFF7C4FF78556D1CF7E72F0024 +:103E8000002505E02000FFF7BBFF690078526D1C9C +:103E9000B542F7D3F1BDF8B507000D0016003800A4 +:103EA000FFF7B2FF0400A64200D23400290022002E +:103EB0003800FFF7D1FF2000F2BDF8B505000C0077 +:103EC00000262800FFF7B0FF07002800FFF7A6FF35 +:103ED000874204D021002800FFF79CFF0126300014 +:103EE000F2BD12422DD0994231D970B500251B4246 +:103EF00009D00C00002112E0110000F0F7F80A00D0 +:103F00000021002370BD0942F6D000240126491883 +:103F10006441944200D3A41A7641F8D331000126BB +:103F200001E0764109D2001864416D41A41A9D4117 +:103F3000F7D2A4185D41B619F5D3300022002B004A +:103F400070BD1B42CFD108B502F0D2FD08BD01D132 +:103F50009042CAD202000B000021002070470000EE +:103F600070B55F4BC018C00900015E4BC31804292F +:103F70000CD21F251C68CE002800B0408443D2B26A +:103F80001540C800854025431D600CE0FC311F250D +:103F90005C68CE002800B0408443D2B21540C8000F +:103FA000854025435D6070BD00B5002A03D1012224 +:103FB0008A40426002E001228A40826000BD30B443 +:103FC00003008C000F25596C2800A0408143154048 +:103FD000A5400D435D6430BC704730B4030001253B +:103FE0009C6C28008840844315408D4025439D6487 +:103FF00030BC704730B403000125DC6C28008840D9 +:10400000844315408D402543DD6430BC704730B497 +:1040100003004C0010340325D96C2800A0408143D4 +:104020001540A5400D43DD6430BC70474269012254 +:104030008A4042614069704730B4030001259C69A1 +:1040400028008840844315408D4025439D6130BC45 +:10405000704730B403004C000325196C2800A040C1 +:1040600081431540A5400D431D6430BC7047F8B531 +:1040700004000025002C30D01600002E2DD00F009B +:10408000326839002000FFF78FFF327A39002000B4 +:10409000FFF766FF726939002000FFF79EFFB269E3 +:1040A00039002000FFF7A6FFF26939002000FFF772 +:1040B000AEFF726839002000FFF781FFF268390017 +:1040C0002000FFF7C6FF39002000FFF7AFFF32697D +:1040D00039002000FFF7B0FF00E0034D2800F2BDDB +:1040E0000000CFBF0000304001005A000022030A48 +:1040F0008B420BD203098B4219D243088B422ED23A +:10410000411A00D20146524110467047FF2209026F +:104110003FD012068B4205D3121209028B4201D303 +:104120001212090203098B4219D300E0090AC309DC +:104130008B4201D3CB01C01A524183098B4201D378 +:104140008B01C01A524143098B4201D34B01C01A63 +:10415000524103098B4201D30B01C01A5241C308DB +:104160008B4201D3CB00C01A524183088B4201D34A +:104170008B00C01A524143088B4201D34B00C01A36 +:104180005241884200D3401A5241CFD201461046D4 +:10419000704708B502F0AEFC08BD0000F8B5012379 +:1041A0001A00002800D151E1002900D14EE1A84AAF +:1041B00012680C7AA74D1540A4048022D202144044 +:1041C0002C430322CE681640A34D25403604C0245C +:1041D000A40234402C430D786E07760F9F4D254086 +:1041E0003606E024E40434402C438E789C4D254070 +:1041F000B4078026F60534402C4328254D5D012662 +:10420000B4431D40254334240C5D0226B5436400AD +:10421000022634402C430D7F0426B443AD0004260F +:10422000354025434C7F0826B543E400082634403A +:104230002C4340254E5D1E408A4D2540B402802609 +:10424000F60034402C4340254D5DEDB26D081E0054 +:104250002E40F6B2844D254074028026B6003440CC +:104260002C4370254E5D814D25403402802676001A +:1042700034402C4371254E5D16407D4D254036035C +:10428000C024A40134402C4304600C7A002C02D1D9 +:104290000023836006E00C7A012C02D14B69836015 +:1042A00000E083600B6A03614B6A4361CB6A836100 +:1042B0000B6BC3614B6903628B6943626D4B1C6876 +:1042C0004423CB5CDBB2FF25AC4323434C240C5D81 +:1042D000E4B2694D1D402404FF231B0423402B43FB +:1042E0005C240C5DE4B21D022D0A23062B436C24D2 +:1042F0000C5DE4B2614D1D402402FF231B022340EC +:104300002B4343645E4B1B6864240C5DE4B25B4D3D +:104310001D402402FF231B0223402B4354240C5D29 +:10432000E4B2FF25AB431C438464564B1C68412315 +:10433000CB5C13400325AC43234360240C5D144045 +:10434000514E1E40A302C0252D011D403543482378 +:10435000CE5C16403023DB4330241D40370127401C +:104360002F4350254D5D1540484E3E402F02C0253D +:10437000AD003D40354358268E5D1640C027BD43F5 +:10438000B701C0263E402E4368254D5D15400C27E1 +:10439000BE43AF000C253D403543C5643C4D2D6800 +:1043A00007267227CF5D374000970727BD432F00B0 +:1043B000009D3D437327CF5D3E407027BD433701CD +:1043C00070263E402E43466535254D5D8567314D4F +:1043D0002D680E7C16400327BD432E43CD7C15402F +:1043E000C027BE43AF01C0253D4035434E7C16403B +:1043F0000C27BD43B7000C263E402E438D7C2A403F +:104400003340120114401C430465234A1268CB88D0 +:1044100094B21A0422438B889BB21B0A9BB2174C9E +:1044200014401B02FF2212021A4022430B78052B74 +:1044300005D10979C9B2FF239A43114304E04978B1 +:10444000FF239A43C9B21143016300221000F2BD59 +:1044500080E90010FFFFFBFFFFFFFCFFFFFFFFF8FD +:10446000FFFFFFBFFFFBFFFFFFFDFFFFFFFEFFFFA3 +:10447000FFCFFFFF84E90010FFFF00FFFF00FFFFF9 +:1044800088E900108CE90010FFF3FFFFFFFCFFFF3D +:1044900090E9001094E9001098E90010016880226A +:1044A00012060A430260704701684900490801602A +:1044B00070474068704701617047006970478160CC +:1044C0007047006A7047000030B4434351435D18A1 +:1044D000010C0C00130C5C432D1980B2434392B2C3 +:1044E00051430024C918644124040B04090C091920 +:1044F0005043C018694130BC7047000000B5022825 +:1045000001D301200FE00B00DBB2042B01DB012003 +:1045100009E0BE4B80001818C9B2405C824201D34A +:10452000012000E0002000BDF8B504001F00022CAF +:1045300001D3012023E015000E002A003100C9B28A +:104540002000FFF7DBFF012801D1012017E0300038 +:10455000C0B2002816D1FF2F12D8AD486103401811 +:10456000A90040188021490140180168A94A0A4061 +:104570003902FF231B020B40134303600020F2BDEE +:104580000120FCE7F6B2012E16D1802040028742BE +:1045900010D29F4861034018A9004018A02149018A +:1045A000401801689C4A0A403902C94B0B4013432A +:1045B0000360E3E70120E2E70120E0E700B2001238 +:1045C000C0B27047F8B505000F001600280000B211 +:1045D000FFF7F4FF04002000C0B2022801D301203D +:1045E0002CE032003900C9B22000C0B2FFF786FFCC +:1045F000012801D1012021E085482100C9B24903E9 +:1046000041182A00D2B292008918C02212018A5899 +:10461000B0491140FFB23B02C02292001A400A4347 +:10462000FF218A43F1B21143E4B262038018EDB274 +:10463000AA008018C022120181500020F2BD70B57E +:104640000400022C01D3012028E015000E002A00EE +:104650003100C9B22000FFF751FF012801D101202C +:104660001CE06B4861034158802212060A43C021B6 +:1046700089041143FF2212040A43964B1340F6B2F9 +:104680003202C021890011401943FF229143EAB24E +:104690000A436103425061034058002070BD70B569 +:1046A0000400022C01D3012028E015000E002A008E +:1046B0003100C9B22000FFF721FF012801D10120FC +:1046C0001CE05348610341588022D2050A43C021AF +:1046D00089041143FF2212040A437E4B1340F6B2B1 +:1046E0003202C021890011401943FF229143EAB2EE +:1046F0000A436103425061034058002070BDF8B581 +:1047000098B00BA8342102F007FA9A4803C801AA0E +:1047100003C2083A03A8A549202200F0E5FAAA48F6 +:104720000078002801D001206DE000252C0007E072 +:104730002800A649620088522800A5490855641C33 +:10474000062C14D2A348142161434118097A0BAAFC +:1047500011720BAA14216143411849681423634361 +:10476000C058FFF784FC0028E2D000204BE06846E8 +:1047700000F0B2F8002801D1002044E000980021A8 +:10478000962292000023FFF79FFE934A00231218FF +:104790004B4110001900914A0023FFF7A2FB0028AB +:1047A00000D1012003AFB8818D4E300002F032FA03 +:1047B00001A9300002F0CAF9002801D0002022E04F +:1047C0002C0006E0142060432818C06802F020FB8B +:1047D000641C062C13D27F4D142060432818007CE3 +:1047E000787103A9142060432818C06802F016FAF3 +:1047F0000028E7D0300002F00DFA002003E001208D +:1048000071490870012019B0F0BD000098E800104F +:1048100000000440FF00FFFFFF0000FFF8B584B078 +:104820000E00C0B2029000252800694608800421CD +:104830002A0003AC200002F05FF92C0062480078E7 +:10484000002806D0674F3878002802D10298062841 +:1048500001D3002039E0012038705E48029914220B +:1048600051434018C0680190019800F0A1F80198E8 +:1048700002F0DAFA019800F07FF800281FD003AAAE +:104880006946019802F0D6FA002818D103A8C0782A +:10489000002814D0684600880005000D694608808D +:1048A000684600884949029A5200885201244848C3 +:1048B00002994454002E02D0684600883080019846 +:1048C00000F076F83D702000C0B205B0F0BD0000E9 +:1048D00000FFFF00FFFCFFFFF8B50700002000907D +:1048E000FF262C363000FFF769FE0500002F04D0AC +:1048F000684602F0AFFF002801D0002038E00098A1 +:10490000394940183949FFF7F1FB0400002C02D067 +:104910003748844201D300202AE0042201212800E4 +:10492000FFF7BDFE002801D0002021E00422012174 +:104930003000FFF747FE002801D0002018E0631E7A +:10494000042201212800FFF7EFFD002801D00020FC +:104950000EE0042201212800FFF771FE002801D09B +:10496000002005E000982100FFF7C0FB386001201F +:10497000F2BD000070E800107CB505001D4C06215A +:1049800000226E46300002F0B7F86946280002F0B7 +:104990003DFB68460078002803D1641E002CF4D14A +:1049A00001E0012000E0002076BD00008CE6001050 +:1049B000E0B511490CC9083969460CC10839694686 +:1049C00002F0CEFA07BD0000A31C0028901B0028AF +:1049D000A81B0028A4DF0010FFC99A3B00CA9A3B1D +:1049E00000109040A41C00285F8DCB00608DCB0090 +:1049F00001000100A086010078E80010000000001E +:104A0000801C800803D0401C801EFCD100BF704772 +:104A1000EFF3108072B6704780F310887047403013 +:104A2000016810220A430260704740300168082282 +:104A30000A43026070470000F8B5012422004C23AD +:104A4000CB5C052B03D24D23CB5C052B01D310008F +:104A5000E2E0002800D1DEE0002900D1DBE06F4A6F +:104A600012684B7923406E4D15409B048022D20280 +:104A700013402B4303228D7915406A4E1E402B04B0 +:104A8000C025AD021D40354307230E7A1E40664FF8 +:104A90002F403606E025ED0435403D43CE79634F87 +:104AA0002F40B5078026F60535403D430E7D012792 +:104AB000BD4326402E4324254D5D0227BE436D0095 +:104AC00002273D40354305600D79060030360096DB +:104AD000009E3668FF27BE43EDB23543009E356029 +:104AE0004D79012D0BD18C79002C02D100248460EA +:104AF00006E08C79012C03D10C68846000E08460AE +:104B0000CC6804610C694461CC6984610C6AC4613D +:104B10000C680462464C25680C7EE4B2FF26B5435F +:104B20002C4330254D5DEEB2424D25403604FF2426 +:104B3000240434402C4340254D5DEDB22402240A68 +:104B40002E06264348240C5DE7B2FF2424023A4D8A +:104B50002E403F02274037434764384E3668382797 +:104B6000CF5DFFB20097FF27BE43009F3743282643 +:104B70008E5DF6B23D40360234402C438464304CA6 +:104B800025688C7D14400326B5432C4325254E5DB6 +:104B900016402C4D2540B602C024240134402C433D +:104BA0002C254D5D15403026B4432E01302535406F +:104BB000254334240C5D1440234E2E402502C0248E +:104BC000A4002C4034433C254D5D1540C026B44321 +:104BD000AE01C0253540254344240C5D22400C2401 +:104BE000A54394000C2222402A43C264174A146849 +:104BF0004C228A5C1A400725AC4322434D240C5DAD +:104C000023407024A2431C017023234013434365B7 +:104C1000497D816700221000F2BD00006CE90010A0 +:104C2000FFFFFBFFFFFFFCFFFFFFFFF8FFFFFFBFE2 +:104C300070E90010FFFF00FFFF00FFFF74E90010A4 +:104C400078E90010FFF3FFFFFFFCFFFF7CE9001095 +:104C50000168802212060A430260704778300168BA +:104C600001220A4302607047C16F0800C007C00FED +:104C70007047010070310A68012313430B60006F15 +:104C80007047000030B5010000221000134B1B6874 +:104C9000002914D08C786407640F0725AB431C43AC +:104CA0000B79002B01D00122FFE763005B08D207DC +:104CB0001A430B4B0024095F89005A5000E0064854 +:104CC00030BD00B5074A1368002B03D0126800B24C +:104CD0008000115000BD00000100560068E900107E +:104CE000008020402412002870B4103A03D378C901 +:104CF000103A78C0FBD2530701D318C918C001D5A8 +:104D000008C908C0D20704D30B880380891C801C03 +:104D1000002A01D50B78037070BC70478B0701D156 +:104D20008307E1D0124205D00B78491C0370401C68 +:104D3000521EF9D170470000F7B5AD4BAD4A15686A +:104D4000AD4A1668AD4A12680192AD4A12680092E7 +:104D5000002422002200002800D11EE10A00002ABF +:104D600000D11AE15168002901D1936805E051682A +:104D7000022901D1230000E0022311695769B942D9 +:104D800001D3116900E05169092909D29D492940DF +:104D90002125555D002D15D080256D000D4313E0B4 +:104DA000112905D2974F2F408021C9013943EFE7E0 +:104DB000212905D2934F2F40802109023943E7E78B +:104DC0008B48EBE0904D0D40D168491E0907090F53 +:104DD0000F27BD4329438D4D0D40802149042943B0 +:104DE0000160117F002901D0210000E0012101258F +:104DF0000127BE43294031430E005168090929406B +:104E00000227BE434900022739403143D67E10278E +:104E1000B943360110273E400E43517E2027BE4342 +:104E200049012027394031431668012E00D0250062 +:104E30004E007608E90731430425A9435D000426A6 +:104E400035400D4308218D43D900082319402943DB +:104E5000537F6D4D0D40190280235B00194029439B +:104E6000957F80239B006A4E0E40690219403143B2 +:104E7000D67F684D0D40B1028026F60031402943AF +:104E80002025565D644D2940F60280273F013E40B3 +:104E90000E4311798F07BF0F5C4931403F06C02692 +:104EA000B6043E400E430662167E009F56493940C6 +:104EB000360280277F003E400E43977E54493140A2 +:104EC0007E021E400E431169491EC906C90E1F27E6 +:104ED000BE433143C026B60081512421515CC9B282 +:104EE0000091C121890041180E68FF27BE43009F31 +:104EF00037430F60167E019F4349394036028027B1 +:104F00007F003E400E435169491EC906C90E1F2746 +:104F1000BE4331438026B60081512C21515CC9B279 +:104F200000918121890041180E68FF27BE43009F30 +:104F300037430F60116B1B4E8151916A184E81519E +:104F40003821515CF026360186190096009E37689C +:104F50002F4E3E4049020B40334300990B603921EC +:104F6000515CF4221201821813681D40C90280238B +:104F70001B011940294311600B4944500298002835 +:104F80000AD002980460029884610298C460029872 +:104F9000C46126480299086223001800FEBD000083 +:104FA000C80F0000880F0000C80E00001B490160F8 +:104FB000C02189040162FF220832C02189004250C9 +:104FC0000021C1239B00C15080239B00C25081223D +:104FD00092008150124A8150154A8150114A8150E5 +:104FE000114A8150134A8150134A81507047000082 +:104FF0000140AA0050E9001054E9001058E90010DF +:105000005CE90010FF3FFFFFFFFEFFFFFFFFFFFC1B +:10501000FFFDFFFFFFFBFFFFFFF7FFFF0F00000398 +:10502000C80E0000C80F0000880F0000EFCDAB00D5 +:10503000880E0000080F0000480F0000F8B50400BB +:105040000D00334F387800280ED02D4E18222D49F0 +:10505000300002F049FC0020F075CF2040002A49C2 +:105060000860002002F0A0FC2000290001223A7014 +:1050700080225204002399420AD301D8904207D3D8 +:10508000244A04000D0024A003C80019694102E06D +:105090000200002000211D4B00241C60204D2A60CE +:1050A000214A146005221A601A68D203FCD51C60DC +:1050B0000029DDD10028DBD13C70F1BD70B50500C1 +:1050C000184E306800280ED10D4C18220D492000D2 +:1050D00002F00AFC0020E075E52040000A49086063 +:1050E000002002F061FC2C0030681049FEF7FEFF42 +:1050F000002122000023FFF7E7F9FFF79FFF70BDB3 +:10510000181B002804E30010E81B002810E000E052 +:10511000AA1C0028FFFFFF00010000FFFFFFFFFFA8 +:1051200014E000E0841C002818E000E040420F007A +:1051300043490A680860704742490A680860704736 +:1051400041490A680860704740490A6801239A4348 +:10515000C0B20300DB07DB0F13430B6070473B4912 +:105160000A6810239A43C0B200011023184010436C +:105170000860704735490A68354B1340C0B20002D9 +:10518000802252001040184308607047314801687F +:1051900001220A430260704710B5FFF739FC040092 +:1051A00000F024F80020FFF7C3FFFA20C001FFF74A +:1051B000C3FF0020FFF7C4FF0020FFF7C5FF012059 +:1051C000FFF7CDFF0020FFF7D5FF00F004F8200027 +:1051D000FFF722FC10BD80B5FFF71AFC1E490A68D4 +:1051E000032313430B60FFF717FC01BD80B5FFF7E6 +:1051F0000FFC19490A6803239A43012313430B60E8 +:105200000A6803239A43022313430B60FFF704FC4D +:1052100001BD80B5FFF7EAFF104801688022120641 +:105220000A430260FFF7D7FF01BD80B5FFF7DEFF3D +:105230000A480168490049080160FFF7CCFF01BD39 +:1052400004C0264008C026400CC0264010C026409E +:10525000FFFEFFFF44C0264040C0264000C026405D +:1052600080B5FFF7C3FFFFF791FFFFF7B4FF01BD64 +:1052700070B53021002422008B4D280001F03CFC49 +:10528000E0212200894D280001F036FC042631007F +:105290002200874D280001F02FFC2200854D3100AF +:1052A000280001F029FC200083490870A44804600C +:1052B00002F0E4FD03F032FB03F0C6FE04F072F8E6 +:1052C000002809D004F071F8002805D003F040FF51 +:1052D000002801D103F0B0FF04F028FB002804D11E +:1052E000062004F0D3FD002016E0FDF7C3FC95492D +:1052F0000860954908609549086095490860954996 +:1053000008600120054908700F21054A1170054AFF +:105310001170B7490870012070BD00000313002808 +:10532000041300280513002838B584B0B14800687C +:10533000002802D0022004F0A9FD04F0BAFD04F018 +:10534000CDFD00282BD003F0F7FB00280ED0AA4893 +:10535000008803F0D7FB012457480470FDF78AFC4E +:10536000A649401876490860B4480470002001003E +:1053700008E002004C4B0C00E4B20C256C431B19F6 +:105380009A72491C0A00D2B2042AF2D39C490870CE +:105390000120AB49087002E0684600F0B9FB68469E +:1053A00004F00CFB002808D00098C0218900884236 +:1053B000F2D0684604F0E8FDF1E700F073FE02F079 +:1053C0005BFE03F00AFB00F0CCFE00F00FFF01F0E3 +:1053D00069FA05B030BDF8B502E0684600F098FB08 +:1053E000684604F0EBFA002808D00098C021890034 +:1053F0008842F2D0684604F0C7FDF1E77D480068B6 +:10540000002802D0022004F041FD04F052FD00F01B +:10541000A8FE01F047FA05B000BDF1B503F08CFB22 +:1054200007006846008803F06DFB68460088FDF7BA +:10543000F1F8FCF7A1FF0026340018E02000C0B20C +:1054400000F071F80500684601882800C0B2FCF73A +:10545000FAFF684601882800C0B202F019FD124820 +:105460002100C9B20C22514340188672641C2000EE +:10547000C0B20428E2D3624806700F207149087058 +:105480007149087001206E49087059490870FFB2CF +:10549000002F07D008490870FDF7ECFB574940186A +:1054A00027490860F1BD0000AC1A0028181900282F +:1054B000601C0028681C0028C81C002800B5401A81 +:1054C000002801D4012000E00020C0B200BD00B5DA +:1054D000401A00B2012801DB012000E00020C0B228 +:1054E00000BD00B500281BD0002919D002780B7828 +:1054F0009A4215D142784B789A4211D182788B78B2 +:105500009A420DD182888B889A4209D1C288CB8871 +:105510009A4205D100890989884201D1012000E021 +:105520000020C0B200BD00B50100C9B2042903D2F9 +:105530004649C0B2085C00E00420C0B200BD0000D3 +:10554000641C00286C1C0028701C0028741C002897 +:10555000781C00287C1C002810B50C000100C9B282 +:10556000042901D2002C01D1002006E0C0B2FFF7CF +:10557000DAFF2100C0B203F06DF910BD00B50028BC +:1055800002D04178042901D3002013E001780A29D0 +:1055900002D001780B2904D10189FA208000484308 +:1055A00008E00189002901D0008903E028494078FA +:1055B0008000085800BD00B5002802D041780429B9 +:1055C00001D3002012E00178032903D0214940785B +:1055D000085C0BE00089401D0A21FEF787FD322898 +:1055E00000D23220602800D35F20C0B200BD00008E +:1055F00006130028DC1B00289E1C0028B80B0000A6 +:10560000C41C002800B5144B1870144B1970002AE4 +:1056100005D01178124B19709188124A1180C0B2CE +:10562000002803D001209C49087002E000209A491C +:10563000087001200249087000BD00000613002810 +:10564000031300280413002805130028A8E90010FC +:1056500044E80010ACE90010C11C0028C21C00285E +:10566000C31C00289E1C0028F8B50500002D05D09D +:105670000C00002C02D01600002E01D1002039E0D1 +:105680000A2100222700380001F036FA68682070ED +:105690006868000A03210A00024062700200D2B268 +:1056A00092080A40A2706A68120CA280AA68E2807E +:1056B000AA68120C22812A68C0239B009A4202D158 +:1056C0002A7B082A03D001203070002012E0F0224B +:1056D0000240102A03D00220307000200AE0207817 +:1056E000401E022802D9C01F072801D8012001E06E +:1056F00031700020F2BD00B5002801D0002901D191 +:10570000002054E04278042A03D3042008700020CB +:105710004DE00278092A05D002780E2A02D00278DC +:105720000F2A06D14278002A03D0042008700020F6 +:105730003DE00278032A09D18278012A0DD08278CF +:10574000022A0AD005200870002030E08278002A62 +:1057500003D005200870002029E00278521E13D0E3 +:10576000521E25D0521E37D0521F012A44D9921EF4 +:105770004DD0521E59D0521E3ED0521E63D0521EE2 +:105780006DD0521E79D083E0C2887C4B9A4207D2FA +:105790000289002A08D000896438794A904203D3EC +:1057A00006200870002002E000200870012000BDE3 +:1057B000C28812B2734BD218734B9A4207D2028935 +:1057C000002A08D0008964386D4A904203D306202D +:1057D00008700020EBE7E7E7C288643A684B9A421A +:1057E00005D20089694A8018694A904203D306208D +:1057F00008700020DBE7D7E7C288002A02D10089C1 +:10580000002803D0062008700020D0E7CCE7C2882B +:10581000AE4B9A4204D100890A38AD4A904203D374 +:10582000062008700020C2E7BEE7C288A94B9A4252 +:1058300004D100890A38A64A904203D30620087092 +:105840000020B4E7B0E7C288A34B9A4202D1008996 +:10585000002803D0062008700020A8E7A4E7C2882B +:10586000012A02D0C288022A02D10089002803D06E +:105870000620087000209AE796E7C288002A02D125 +:105880000089002803D00620087000208FE78BE7EE +:105890000320087000208AE7C71C002800B501001B +:1058A000C9B2012902D0C0B2022801D1012000E012 +:1058B0000020C0B200BD10B504002000C0B2FFF748 +:1058C000EDFF00280AD12000C0B2032806D0200036 +:1058D000C0B20A2802D0E4B20B2C01D1012000E0B2 +:1058E0000020C0B210BD80B58EB00100C9B204293D +:1058F00008D27A490200D2B20C235A438918897A15 +:10590000002901D001200EE06946C0B2FFF724FE55 +:10591000002806D068463221405C002801D00120D2 +:1059200000E00020C0B20FB000BD00B56C480078A8 +:10593000002801D0012000E00020C0B200BD38B531 +:105940008EB067480478002510E069462800C0B290 +:10595000FFF702FE002808D068463221405C00288C +:1059600003D020000124AC4004436D1C2800C0B2C9 +:105970000428EAD32000C0B20FB030BD11270000C8 +:10598000FDE9000010270000214E0000D4FEFFFFBB +:10599000BD02000038B58EB000252C0018E0694625 +:1059A0002800C0B2FFF7D8FD002810D06846417823 +:1059B000042908D04178072905D04178082902D068 +:1059C0004078092803D120000124AC4004436D1C19 +:1059D0002800C0B20428E2D3FCF732FD002802D030 +:1059E00020000F2404432000C0B20FB030BD38B5F2 +:1059F0008EB000252C0010E069462800C0B2FFF7E9 +:105A0000ABFD002808D068463421405C002803D054 +:105A100020000124AC4004436D1C2800C0B20428BF +:105A2000EAD32000C0B20FB030BD80B5FFF787FFCA +:105A30000100002005E00A00D207D20F8018C9B289 +:105A400049080A00D2B2002AF5D1C0B202BD10B591 +:105A50008EB0002418E069462000C0B2FFF77CFD3C +:105A6000002810D068463221415C00290BD0017813 +:105A7000052926D00178062923D00178072920D0CE +:105A8000007808281DD0641C2000C0B204281AD257 +:105A900012482100C9B20C2251434118897A0029C9 +:105AA000D9D02100C9B20C225143415C0A2906D049 +:105AB0002100C9B20C225143405C0B28CBD10120FC +:105AC00002E0012000E000200EB010BD5AA5000049 +:105AD0004F020000524B00003CC30000AC1A0028EB +:105AE000C41C002810B5002400E0641C2000C0B2D3 +:105AF00004280AD22000C0B2FFF715FDC0B2FCF79F +:105B000068FF0028F1D0012000E0002010BD000057 +:105B100070B592B0012421006A461170AF490A683D +:105B2000521C0A606A4601A9FFF79EFD002805D0B5 +:105B3000694601A8FFF7DFFD00280AD1A8480168DF +:105B4000491C016001AA684601780220FFF75AFD4E +:105B5000BCE101AD2878092836D0A2480178002997 +:105B60001ED0A988A04A1288914219D19F48007876 +:105B700000280BD09E4901A8FFF7B3FC002805D0F0 +:105B800001AA00210320FFF73DFD08E094480168C9 +:105B9000491C016001AA08210220FFF733FD95E1AD +:105BA0000078002810D090480188A888FFF78FFC63 +:105BB000002809D18A480168491C016001AA08210E +:105BC0000220FFF71FFD81E12000864908702000B8 +:105BD00086490870A88884490880854801A94CC96D +:105BE0004CC00C390C38287809280CD1A888FFF74C +:105BF00014FC01AA00210420FFF704FDBB48016842 +:105C0000491C016062E128780F280CD1A888FFF7B1 +:105C100004FC01AA00210120FFF7F4FCB34801684D +:105C2000491C016052E12878082815D102F084FF50 +:105C3000002803D0A888FFF7F0FB03E0A988687864 +:105C400000F056F901AA00210120FFF7DBFCA7486C +:105C50000168491C016039E128780C2813D1687863 +:105C60008440C348017821430170C24801780C4345 +:105C7000047001AA00210120FFF7C4FC9B480168C1 +:105C8000491C016022E128780D283BD16878FFF794 +:105C90002AFE002809D0CA480168491C016001AAEF +:105CA00009210220FFF7AEFC10E104F017F90028EB +:105CB0000BD1FCF7C5FB002807D16878FFF733FC50 +:105CC000C0B202F09BFD002805D101AA0B210220E1 +:105CD000FFF798FCFAE0A64801786A782300934021 +:105CE0000B430370A34801786A7894400C43047016 +:105CF00001AA00210120FFF785FC7C480168491CAE +:105D00000160E3E004F0EAF8002805D001AA0B21C5 +:105D10000220FFF777FCD9E028780E286AD102F03C +:105D20000BFF002807D102F0DEF8002803D1FFF7AF +:105D3000FCFD002809D0A2480168491C016001AAA5 +:105D400009210220FFF75EFCC0E0FFF750FE0F289C +:105D50000CD003F02DFB002801D00D2100E007211D +:105D600001AAC9B20220FFF74DFCAFE004F086F8AB +:105D700003F069FA002808D1032004F087F801AA8B +:105D80000E210220FFF73EFCA0E020008D490870A4 +:105D9000FCF770FF8C494018C0490860A988E88862 +:105DA000C0B202F0C6FD002807D101AA0E210220D0 +:105DB000FFF728FCBA48047088E00F206C4908708F +:105DC0006C490870B648047001AA00210120FFF751 +:105DD00019FC46480168491C016077E0481C00280E +:105DE0004C1C0028C51C0028A01C0028C61C00282C +:105DF0009C1B002802F0A0FE002809D07048016812 +:105E0000491C016001AA09210220FFF7FBFB5DE0AC +:105E10002878FFF743FD00281DD004A96878FFF714 +:105E20009BFB002805D101AA0E210220FFF7EAFB07 +:105E30004CE004A83421405C00280CD103F0B8FAEF +:105E4000002801D00D2100E0072101AAC9B20220DB +:105E5000FFF7D8FB3AE0FFF7FAFD002809D05848D1 +:105E60000168491C016001AA09210220FFF7CAFB51 +:105E70002CE028780A2802D028780B2811D102F0CB +:105E800032F8002803D1FFF750FD002812D04C480B +:105E90000168491C016001AA09210220FFF7B2FB39 +:105EA00014E06878FFF71FFD002811D0A9886878F2 +:105EB00000F01EF801A800F05FF801AA00210120FF +:105EC000FFF7A0FB09480168491C016012B070BDD2 +:105ED000FFF7ABFD0428EDD339480168491C016088 +:105EE00001AA0A210220FFF78DFBEFE7541C0028CE +:105EF000F8B504002000C0B2042837D20F002000FB +:105F0000C0B2FFF710FB06000125390089B2280056 +:105F1000B040C0B2FCF72BFBFCF72EFA390089B277 +:105F20003000C0B2FCF78FFABFB239003000C0B207 +:105F300001F0AEFF0020AB492200D2B20C235A433D +:105F400089188872A8490A782800A04082430A70FC +:105F5000074801782A00A2400A43027005480178E8 +:105F60002A00A2400A430270BD480570F1BD00003E +:105F7000041300280513002838B501004C78994D0A +:105F80002000C0B20C22504328180A22FEF7C6FE99 +:105F9000012001002200D2B20C235A43AA189172A8 +:105FA00091490A780300A34013430B70AD490A7866 +:105FB0000300A34013430B70A949087031BD0000D2 +:105FC000501C0028C81C0028B80B0000F8B50400BD +:105FD0006078FFF7A8FA05002000FFF7CFFA070066 +:105FE0002000FFF7E8FA06002078FFF764FC00289D +:105FF00015D003F043FF03F026F9002804D1032055 +:1060000003F044FF002047E003F038FF01209649E9 +:106010000870FCF72FFE95494018954908602078D4 +:10602000012808D0022811D003281BD00A2824D028 +:106030000B2829D02FE0A08800903300DBB23A0073 +:10604000E1882800C0B202F093F925E0A088009012 +:106050003300DBB23A00E18809B22800C0B202F096 +:10606000C7F919E0A08800903300DBB2E288A1787C +:106070002800C0B202F0E4F90EE0A288390028003E +:10608000C0B202F01EFB07E0A28839002800C0B2AF +:1060900002F065FB00E00020F2BD0000641C002857 +:1060A00006130028F8B584B0FCF7E4FD009003F077 +:1060B00015FF002806D16F4801680098FFF7FEF928 +:1060C000002800D14BE0002000E0401C0100C9B2D4 +:1060D000042944D20326684F39780D183540414CC5 +:1060E0002900C9B20C2251436118897A0029ECD0E9 +:1060F00001A82900C9B20C22514361180A22FEF7F7 +:106100000DFE00202900C9B20C225143611888728B +:10611000012435490A782000A84082430A702800EB +:10612000401C06403E70009864305249086001A847 +:10613000FFF74CFF002804D101AA0E210220FFF72F +:1061400061FA484801782200AA400A4302704B488D +:1061500001782200AA400A4302704148047005B049 +:10616000F0BD38B58EB0002435E069462000C0B2DD +:10617000FFF7F2F900282DD0414D2000C0B2285C75 +:1061800000280AD03F482100C9B2382251434118A3 +:10619000684600F079F800281CD03A482100C9B2BE +:1061A00038225143401869463822FEF79DFD0120F0 +:1061B00001002200D2B2A9542A490A780300A34060 +:1061C00013430B702D490A780300A34013430B704F +:1061D00023490870641C2000C0B20428C5D30FB046 +:1061E00030BD0000AC1A0028C41C002838B51E4C75 +:1061F0002078002832D002F09FFC00282ED1FCF736 +:1062000039FD0500FFF791FB002807D101F06BFE77 +:10621000002803D1FFF766FC002804D01348281893 +:10622000134908601AE0124801682800FFF746F990 +:10623000002813D003F022FE03F03CF8002803D11D +:10624000032003F023FE09E003F018FE0020207075 +:106250000120034908700F200849087031BD000073 +:106260000313002804130028C81C0028B80B0000E2 +:10627000641C00286C1C0028C91C00280513002879 +:10628000601C00281819002800B502780B789A4283 +:1062900027D142784B789A4223D182788B789A42E0 +:1062A0001FD1C278CB789A421BD142684B689A4280 +:1062B00017D13022825C3023CB5C9A4211D132223A +:1062C000825C3223CB5C9A420BD13122825C312337 +:1062D000CB5C9A4205D13422805C3422895C8842AE +:1062E00001D0012000E00020C0B200BD00B5007860 +:1062F00000280FD0022811D00ED304280CD00FD3C1 +:1063000006280FD00ED308280CD00BD30A280DD0A6 +:106310000AD30DE000200CE001200AE0022008E092 +:10632000032006E0042004E0062002E0072000E04D +:10633000072000BD00B5407800280ED0022810D0FC +:106340000DD3042811D00ED3062812D00FD308285D +:1063500013D010D3092812D013E0002012E001203E +:1063600010E002200EE003200CE005200AE00420EB +:1063700008E0062006E0072004E0092002E00B20E8 +:1063800000E0092000BD7CB5FFF7D9FA0400FFF753 +:1063900001FB0500684602F0DCFB002805D06846DA +:1063A0004078032801D1012600E0002603F096FD85 +:1063B000002808D003F09CFD002801D1032000E054 +:1063C0000420C0B21BE0FFF742FB002801D00520EB +:1063D00015E0EDB2002D06D1F6B2002E03D103F088 +:1063E00087FD002801D0042009E0E4B2002C03D18D +:1063F00002F0A2FB002801D0022000E0012076BDBF +:10640000F8B584B0FFF79BFA69464871FFF7C2FA06 +:106410000400FFF7ECFA69460871FFF718FB6946BC +:10642000C87002A802F095FBC0B2002805D002A8EF +:106430004078032801D1012000E000202100C9B2EA +:1064400000290AD1C0B2002807D103F051FD00286D +:1064500003D102F0ADFF002801D0012500E00025A6 +:10646000934806780F273E40FFF78DFF0001304329 +:10647000694688708F480078694648708E48007871 +:106480006946087003F02AFD002801D0102600E0BC +:10649000002602F051FB002801D0202000E000205F +:1064A0006946C978002901D0402100E000216A46F0 +:1064B00052793A40164330430143E80108433C40D7 +:1064C000694609790A012243BB4909780F40D02364 +:1064D0003B43694689786C46647824020C43B7498B +:1064E0000988090421436C462478C0B20002204385 +:1064F000D2B214040443DBB21A062243B04803F0BC +:106500009DFA05B0F0BDF1B594B0AE4814A9097874 +:106510000C2251434018019006A914A80078FFF7F7 +:106520001BF8002801D10020C0E006A8FFF7DEFE1E +:10653000040006A8FFF7FEFE070006A8C07869461B +:10654000087006A83221405C002803D006A830213C +:10655000455C00E00025079869464880994814A9E1 +:1065600009780C2251434018807A002817D00198EE +:1065700000780A2803D0019800780B2801D1042460 +:1065800000E001240127019880786946087001988D +:106590008088694648800198FFF70DF8050006AE2F +:1065A0003220305C002808D1864814A909780C22D2 +:1065B00051434018807A002802D00420059001E061 +:1065C000002005903420305C002802D00820049080 +:1065D00001E0002004903420305C002805D00998A8 +:1065E000002802D11020039001E000200390342005 +:1065F000305C002809D00A98002806D009980A992A +:10660000884202D32020029001E00020029070789E +:10661000042802D14020019001E000200190707810 +:10662000072803D0FBF70CFF002801D0802000E0F2 +:106630000020694609788907890F059A0A43049959 +:106640001143039A0A4302991143019A0A431043E2 +:106650003421715C002907D00D998C4A914201D3F5 +:106660008B4A02E00D9A00E08A4A14A90978E4B244 +:1066700023071B0FFFB23C01F02626401E433302C6 +:106680000B43C0B200041843694649880906014318 +:106690006846408880B2000A80B292B21302034377 +:1066A000EDB22A061A437C4803F0C8F915B0F0BDD4 +:1066B000C11C0028C21C0028C31C0028F1B590B0E2 +:1066C00001A910A80078FEF747FF002801D100209B +:1066D00070E0802040020499814203D36D496A46EC +:1066E000518002E004996A4651800599814203D3A2 +:1066F00068486946088002E005986946088007985E +:1067000019303221FDF7F2FC0400FF2C00D9FF24E0 +:1067100001A84078042801D1012700E0002701A842 +:106720004078072803D0FBF78BFE002801D0022514 +:1067300000E0002501A84078082801D1042600E0E7 +:10674000002601A84078092803D002F031FE002875 +:1067500001D0082100E000213D432E4331430F20AA +:1067600001AA93780340090119433123D25C1040F8 +:106770004A4A10AB1B78D25C1201024310A8007881 +:10678000C9B20B02034368464088010419436846B6 +:106790000088E4B223040343D2B212061A434048ED +:1067A00003F04CF9002801D1002003E010A8007884 +:1067B00000F00AF811B0F0BDD01C00289E1C002883 +:1067C00001030000AC1A002878B585B00400200051 +:1067D000C0B2042809D22000C0B2FEF7A4FE694668 +:1067E000C0B2FCF75DFA002801D0002031E0684615 +:1067F0004178002901D0012100E000218278002A9F +:1068000001D0022200E00022C378002B01D0042333 +:1068100000E000230579002D01D0082600E00026C5 +:106820004579002D01D0102500E000250A431343CF +:106830001E433543E4B2EDB22A022243C188090463 +:1068400011430389808902041A43C120800003F0A8 +:10685000F5F806B070BDE0B5684602F07AF9002898 +:1068600001D1002011E068460178427812020A4303 +:1068700081780B041343C178090619438388C088C3 +:1068800002041A43844803F0D9F80EBD1127000012 +:1068900010270000FFFF000002030000681C002812 +:1068A00003030000F8B5FCF7E5F904007B4D296807 +:1068B0002000FEF703FE002805D00120784908706B +:1068C000200064302860774D29682000FEF7F6FD2F +:1068D000002805D001207449087020006430286029 +:1068E00072480078002814D1714801682000FEF732 +:1068F000E5FD00280DD06F4A6F4800781070012028 +:106900006E490B781278050095401D430D7067495C +:1069100008706B480078002814D16A48016820008C +:10692000FEF7CCFD00280DD0674A6848007810704B +:10693000674901200B781278050095401D430D70C2 +:106940005F490870564D287800281ED0FFF758FD83 +:10695000002815D0002028705E490A78521C1207C2 +:10696000120F0A705C490A78002A04D05B4A107042 +:106970005B4A107008705B480168491C016003E0C5 +:1069800059480168491C016085E0474D2878002876 +:106990000FD0FFF760FF002806D000202870514874 +:1069A0000168491C016003E04F480168491C01600F +:1069B00071E0002500E06D1C2800C0B204282CD234 +:1069C0000127AF403D4E30783842F4D02800C0B2A5 +:1069D000FFF799FD00281BD03078B843307033485A +:1069E000017800290FD033490978EDB28D420AD1E0 +:1069F00031490A78521C9207920F0A7000210170E7 +:106A000019342B48046037480168491C016003E0D1 +:106A100035480168491C01603DE0002500E06D1C1F +:106A20002800C0B2042836D20127AF40284E307863 +:106A30003842F4D02800C0B2FFF740FE002825D02D +:106A40003078B843307029482900C9B2415C491CEC +:106A50000907090F2A00D2B2815419480178002988 +:106A60000FD019490978EDB28D420AD117490A7839 +:106A7000521C9207920F0A700021017019341148BC +:106A8000046018480168491C016003E01648016869 +:106A9000491C0160FFE7F1BD06030000701C0028DF +:106AA000031300287C1C002806130028CE1C002895 +:106AB000741C0028CC1C0028CA1C002804130028C1 +:106AC000CF1C0028781C0028CD1C0028CB1C0028D7 +:106AD00005130028D01C0028C71C0028C11C002852 +:106AE000C21C0028581C00285C1C0028681C0028B8 +:106AF00070470000704700001206130A1A43130C77 +:106B00001A4300BF094205D0830707D00270401C1A +:106B1000491EF9D1704700000022FFE71300103929 +:106B200006D330B41400150010393CC0FCD230BC80 +:106B3000490700D30CC000D504C0890002D30280ED +:106B4000801C002900D5027070470000F8B50200D3 +:106B500000231800A94C2468002959D000920A7813 +:106B60001207120F009D10352E680F27BE433243C7 +:106B70002A604A78FF25AC43D2B222438C78002C9D +:106B800001D0012400E01C009D4D1540240280220C +:106B9000520014402C430122CE781640994D2540D6 +:106BA00074028026B60034402C430D79002D01D0AC +:106BB000160000E01E00944D2540B4028026F60029 +:106BC00034402C434D79002D01D0160000E01E000A +:106BD0008E4D254074078026B60534402C438D79B0 +:106BE000002D01D0160000E01E00A14D2540B40785 +:106BF0008026F60534402C43C979002901D01300C2 +:106C0000FFE762005208D9071143009A116000E0C3 +:106C10009848F2BD0021016001617047F0B585B070 +:106C20000C000025019594490E6894490968049167 +:106C300093490968039193490F6893490968029140 +:106C4000002C00D1D4E00090009800F0E7F8029901 +:106C50008020C0000843802189000143802040003B +:106C600008430222024301210A4304201043009AF0 +:106C7000106120784007400F072296433043627826 +:106C80005207520F70239843120170261640064394 +:106C90000322A07810407D4B33400602C0208000C4 +:106CA00030401843E378002B01D00B0000E02B00AC +:106CB000774E0640D80280231B01184030432379C9 +:106CC000002B01D00B0000E02B0046007608D8070F +:106CD0003043009B186060798006800E049B3F263D +:106CE000B3431843A3791340C026B0439B01C02689 +:106CF0001E400643E07943075B0F664830401E02A2 +:106D0000E023DB0033400343207A002801D00D004C +:106D1000FFE75F4E1E40E80280231B01184030430E +:106D2000657A1540874B03402D03C0208001284021 +:106D30001843A57A1540844B0340AD03C0200002E0 +:106D400028401843A3891D052D0D804B03402D04B9 +:106D50007F4828401843A37B0B4045006D08D807A7 +:106D60002843009B5860E07B4007400F039B0725AA +:106D7000AB431843237C0B404025A8439B0140258F +:106D80002B400343607C014080208343C801802165 +:106D900008401843A17C6F4B03400902FF2000020A +:106DA00008401843E17CC906C90E6B4B0340090437 +:106DB000F820400308401843217D0A4067490140FC +:106DC0009205C02000041040084300998860E08AC2 +:106DD000390C090480B20843218B82B208041043A5 +:106DE0000099C86021001A31009800F055F801E0C0 +:106DF00020480190019805B0F0BD0000C0E80010E7 +:106E0000FFFEFFFFFFFDFFFFFFFBFFFFFFFFFFDFB9 +:106E10003830016801220A43026070473830016847 +:106E200001229143016070473C30016801220A430E +:106E30000260704710B503000020002916D0002A18 +:106E400014D05B6A1C000C80190F0C00E407E40FDF +:106E50001470990F0C00E407E40F9470590F0C00A4 +:106E6000E407E40F5470D90FD17000E0014810BD61 +:106E7000FFFFFFBF0100DA00C4E80010C8E80010FF +:106E8000CCE80010D0E80010D4E80010FFFCFFFFB1 +:106E9000FFF7FFFFFFF8FFFFF0B50A00002319001E +:106EA0006F4C2468002A49D05579002D01D0012665 +:106EB00000E01E006B4D2540B4028026F6003440F1 +:106EC0002C431579002D01D0012600E01E00664DEF +:106ED000254074028026B60034402C43D578002D1E +:106EE00001D0012600E01E00604D254034028026BE +:106EF000760034402C435578002D01D0012500E068 +:106F00001D000226B4436D00022635402543147847 +:106F1000002C01D0012400E01C0001260127BD4304 +:106F200034402C439278002A00D11E00042294435E +:106F3000B20004231A402243826100E0474908005E +:106F4000F0BD0000FFCFFFFFFF3FFFFFFFFF00F09E +:106F50000000FF0FFF00FFFFFFFFE0FFFFFF3FFF0D +:106F6000F0B50A0000231900414C2468002A49D0DA +:106F70005579002D01D0012600E01E00394D254035 +:106F8000B4028026F60034402C431579002D01D040 +:106F9000012600E01E00344D254074028026B60014 +:106FA00034402C43D578002D01D0012600E01E008E +:106FB0002E4D254034028026760034402C435578EF +:106FC000002D01D0012500E01D000226B4436D0014 +:106FD0000226354025431478002C01D0012400E01E +:106FE0001C0001260127BD4334402C439278002A1F +:106FF00000D11E0004229443B20004231A4022430D +:10700000026100E015490800F0BD000010B5020063 +:10701000002000291FD01269930A1C00E407E40F26 +:107020004C71530A1C00E407E40F0C71130A1C0096 +:10703000E407E40FCC7053081C00E407E40F4C7025 +:1070400013001C00E407E40F0C7092081300DB0728 +:10705000DB0F8B7000E0014810BD00000100DA007A +:10706000D8E80010FFFBFFFFFFFDFFFFFFFEFFFF63 +:10707000DCE8001000B5012027490A6852080240E8 +:10708000002A01D0022001E00968084000BD27481D +:1070900001680800C007C00F704700B5C21E022A71 +:1070A00001D3012002E0C01E0860002000BD1CB515 +:1070B000FF246946FFF7F1FFC0B2002802D020008C +:1070C000C0B207E03C480099890041580800C00759 +:1070D000C00FC0B216BD00B5002801D0032801D3EF +:1070E000012002E0401E0860002000BD1CB5FF2406 +:1070F0006946FFF7F0FFC0B2002802D02000C0B2FE +:1071000008E03448009909014018C1680800C00728 +:10711000C00FC0B216BD0000241526402E480068DE +:1071200081080800C007C00F7047000040152640C6 +:1071300038B504002000C0B208280DD3274D18220E +:107140002749280000F0D0FB0020E8752548264993 +:107150000860002000F028FC24482100C9B2890002 +:1071600041580A00D205D20F002A05D0E4B2A1008E +:1071700040580007000F00E0FF2032BD38B5050081 +:107180002800C0B208280ED3144C1822144920003D +:1071900000F0AAFB0020E075892000011249086078 +:1071A000002000F001FC1148EDB2A9004058000990 +:1071B0008007800F32BD0000401626400F4800684F +:1071C000000AC0B270470E480068000AC0B270479B +:1071D000000000000019264010002740181B00285E +:1071E0004CE200105B080000E81B0028401226401B +:1071F00004480068000AC0B2704700001010204028 +:107200000C1020400810204038B50400072C0ED385 +:10721000124D18221249280000F066FB0020E87584 +:10722000CE2040000F490860002000F0BDFB0A4856 +:10723000A10040584007400F010009B2042907D1BE +:107240000448A1004058C106C90E802040000843F0 +:1072500000B232BD0001264000122640181B002853 +:10726000A8E20010E81B00281E4909688A03920B57 +:107270000260090E0A00D207D20FC27117490968CD +:107280000A00D204D20C82800A00120CD2B202810F +:10729000090CC9B24181264909680F220B0013402D +:1072A00003730B091A4042730A0AD204D20CC2813A +:1072B000090F8907890F0174094909680A0A5207E9 +:1072C000520F82710A00120CD205D20D4282890F30 +:1072D0000A00D207D20F027570470000341526400D +:1072E0003C152640301526401CB50C006946FFF7BA +:1072F000D4FE0100C9B2002901D0C0B217E00D4888 +:107300000099890040584106490E21601F21020A58 +:107310000A406260020C1140A160010F8907890FC9 +:107320006173C00E0100C907C90F2173002016BD8B +:1073300038152640001626401CB50C006946FFF79C +:10734000CAFE0100C9B2002901D0C0B233E01A4818 +:10735000009909014158CAB222601F220B0A13404A +:1073600063600B0C1A40A260090F8907890F217313 +:107370000099090141184A68D10F61730721130F61 +:107380000B40002B01D0012300E00023A373120265 +:10739000120A2261009A120180188068C20F2275B9 +:1073A000020E1300DB07DB0F63750200A275000CF1 +:1073B0000140E175002016BD0019264080B501008E +:1073C00086481822FDF790FC0120854908700020AE +:1073D00002BD000000B583490968C90F002907D024 +:1073E0007F490978002907D100210160032000BDF1 +:1073F000002101600320FAE7784909680160002054 +:10740000F5E7000010B50400FFF734FE002803D1B3 +:107410000020206003200BE071480078002804D091 +:107420006E4880682060002002E000202060032079 +:1074300010BD00B56A490978002904D06749496838 +:107440000160002002E000210160032000BD000077 +:1074500000B565490968C90F002907D06049097856 +:10746000002907D100210160032000BD0021016037 +:107470000320FAE75949C96801600020F5E70000D8 +:1074800000B55A490968C90F002907D0544909783D +:10749000002907D100210160032000BD0021016007 +:1074A0000320FAE74D49096901600020F5E7000073 +:1074B00010B50400FFF732FE002803D10020206041 +:1074C00003200BE046480078002804D04348406978 +:1074D0002060002002E000202060032010BD00009A +:1074E00010B50C00C0B2FFF78FFE00280CD0401E74 +:1074F0000ED0401E10D087214900401A10D0401EE7 +:1075000012D0C01E14D017E02000FFF763FF16E072 +:107510002000FFF78EFF12E02000FFF773FF0EE060 +:107520002000FFF795FF0AE02000FFF7C1FF06E00B +:107530002000FFF7A5FF02E000202060032010BD1F +:1075400080B501000020FFF7CBFF02BD80B503220C +:10755000D2B2824203D200200860012003E0401C26 +:10756000C0B2FFF7BDFF02BD30B587B0040068466A +:10757000FFF7E6FF0100C9B2002903D00021216016 +:10758000C0B228E001A8FFF76FFE01AD287C0228F9 +:1075900003D10098206000201DE07B480068C00FE8 +:1075A000002808D0FFF773FDC0B2002807D10020E3 +:1075B000206003200FE00098206000200BE000987E +:1075C00001994843A988FCF791FDE979491CFCF72A +:1075D0008DFD2060002007B030BD0000001B00289A +:1075E000A91C002818152640081526400C15264011 +:1075F000F0B58BB004000D0069462000C0B2FFF763 +:10760000A5FF0100C9B2002903D000212960C0B242 +:10761000B7E02000C0B2022848D307A92000C0B2BA +:10762000401CFFF761FEC0B200280DD0824E182228 +:107630008249300000F058F90020F07580488149F7 +:107640000860002000F0B0F97F482100C9B289002D +:10765000401808380068C00F002807D007A8407BF2 +:10766000022807D10098286000208AE0009828604E +:10767000002086E0E4B2641C2000FFF718FD010042 +:10768000C9B2002902D0C0B2FF2803D1002028606F +:10769000032076E00098079948430899FCF726FDF7 +:1076A0000999FCF723FD286000206AE001A9200069 +:1076B000C0B2401CFFF740FEC0B200280DD05E4EA5 +:1076C00018225E49300000F00FF90020F0755F4885 +:1076D0005C490860002000F067F95D482100C9B2EC +:1076E00009014058C00F002807D001AE307B0228A6 +:1076F00007D100982860002043E00098286000200F +:107700003FE0E4B2641C2000FFF7F0FC0100C9B2C6 +:10771000002902D0C0B2FF2803D100202860032036 +:107720002FE0707B012821D100980021019E0027C5 +:107730003F06320A17433606059A002392197B4109 +:10774000FCF7C2FE06000F0002980021039A0023F6 +:10775000FCF7BAFE02000B0030003900FCF7C1FB59 +:10776000000E0A021043090E286009E000980199F2 +:1077700048430299FCF7BAFC0399FCF7B7FC286070 +:1077800000200BB0F0BD00003015264010B50323DB +:10779000421E0400E4B2002C03D10800FFF7E4FE0F +:1077A0000CE01400DBB2E4B2A34204D31000C0B278 +:1077B000FFF71EFF02E0C0B2FFF792FE10BD38B522 +:1077C00004000D002000C0B2FFF7B2FC0100C9B2F6 +:1077D000FF2904D12800FFF7FDFDC0B21BE0694678 +:1077E000C0B2FFF7D3FF0100C9B2002903D00021C6 +:1077F0002960C0B20FE02000C0B2FFF7BFFCC0B2EA +:10780000002805D002280BD006D303280CD00FE0A7 +:1078100000982860002032BD009840082860F9E7F1 +:10782000009880082860F5E70098C0082860F1E714 +:10783000002028600320EEE7181B0028A8E20010B3 +:1078400063090000E81B0028001626407F0900009D +:10785000001926401CB5040069460020FFF7AFFF61 +:107860000100C9B2002903D000212160C0B209E0A3 +:10787000FFF7A9FC01000098C9B2491CFCF736FCCF +:107880002060002016BD1CB5040069460020FFF7EB +:1078900096FF0100C9B2002903D000212160C0B2C7 +:1078A00008E0FFF78BFC01000098491CFCF71EFC68 +:1078B0002060002016BD1CB504006846FFF7E3FFFA +:1078C0000100C9B2002901D0C0B208E0FFF790FC66 +:1078D00001000098491CFCF709FC2060002016BD3F +:1078E00080B5FFF7E8FF02BD71B58B0709D0521EC6 +:1078F00028D30B780370401C1B421FD0491C8B07F8 +:10790000F5D1121F3ED3274CE50140C9331BB343C9 +:107910002B4209D1830716D140C0121F32D340C970 +:10792000331BB3432B42F7D0121DFF231E4205D059 +:107930000670401C360A521E1E42F9D11100002268 +:10794000FFF7E0F871BDDB4216D0401E4670360AE4 +:107950004680360C0671001D121F06D340C9331B2A +:10796000B3432B42F2D0401CDEE7401C0AE040C982 +:10797000331BB3432B42D7D10680360C4680001D03 +:10798000121FF4D2121D0BD00B780370521E07D0B9 +:10799000401C491C1B42F7D10370401C521EFBD1F6 +:1079A00071BD00000101010100B501BEFEE780B517 +:1079B0000C4A0D490B68934210D00A6002684A6075 +:1079C00042688A608268CA60C2680A6102694A6164 +:1079D00042698A618269CA61C069086202F030FE48 +:1079E00001BD0000F3F2F1F0DC1A00287047704787 +:1079F00000B5C0B2042801D2012000E00020C0B2CE +:107A000000BD00B50100C9B2002901D1904813E0C2 +:107A10000100C9B2012902D1AF2040010CE00100F0 +:107A2000C9B2022901D18B4806E0C0B2032802D1B5 +:107A3000E120400100E0002000BD00B50100C9B216 +:107A4000002901D15A2011E00100C9B2012901D158 +:107A50005A200BE00100C9B2022901D15A2005E0E9 +:107A6000C0B2032801D15A2000E0002000BD00B5BB +:107A7000401A002801D4012000E00020C0B200BD5F +:107A800000B5884201D3401A00E0081A00BD00B5D5 +:107A90000200D2B2002A08D1C9B2022902D1E120E3 +:107AA000800001E0FA20800018E00200D2B2012A32 +:107AB00008D1C9B2022902D19620C00001E0AF204E +:107AC00080000BE0C0B2032807D1C9B2022901D15E +:107AD000614801E0C820C00000E0002000BD10B5F2 +:107AE00000280FD00C00002C0CD06178002909D0A0 +:107AF0002169002906D0A168002903D02169826884 +:107B0000914201D2002019E080680021A268002380 +:107B1000FCF7DAFC02000B00206940080021801805 +:107B2000594122690023FCF7DCF96168FFF7A8FFDF +:107B3000032801D2012000E00020C0B210BD00B532 +:107B4000C0B232382E2801D2012000E00020C0B29D +:107B500000BD00B50178022905D00178012904D1C2 +:107B60004078022801D1012000E00020C0B200BD11 +:107B700000B50178032905D00178012904D14078A6 +:107B8000032801D1012000E00020C0B200BD38B5BB +:107B90000C00BE490200D2B23C235A438D18C0B239 +:107BA000FAF78BFD0A202870AC7000203821685449 +:107BB00031BDB649C0B23C225043081809210170BA +:107BC000022181700021382281547047AF49C0B230 +:107BD0003C22504308180021017003228270382291 +:107BE0008154704770B505000C002800C0B2FFF743 +:107BF000FFFE002807D0FAF723FC002803D18020DD +:107C00004002844201D3002020E02800C0B2FAF7ED +:107C100054FD002807D1210089B22800C0B2FAF72C +:107C200012FC002801D0002010E09848EDB23C2161 +:107C30004D4345193C2100222E003000FEF75CFF29 +:107C40006C600120A87038216854012070BD0000CC +:107C5000FC530000901A00006C070000F2B59EB0C3 +:107C6000070016001C00002001903800C0B2FFF78A +:107C7000BFFE002819D029A80078022803D029A81F +:107C80000078032811D13800C0B2FFF7BAFE1E9960 +:107C900088420AD305A93800C0B2FBF787F800284C +:107CA00003D105A84078002801D10020E4E0774DF9 +:107CB0003800C0B23C21484328180490049836216B +:107CC000405C694648706846067027A8007800281E +:107CD00007D168460078FFF732FF002801D1002065 +:107CE000CAE008991E98FFF7CBFE02900394269EE7 +:107CF000289C27A8007800281CD00398002802D0D0 +:107D00000298002816D10298002811D1E4B2002C64 +:107D100008D131003800C0B2FFF764FF002801D15C +:107D20000020A9E03800C0B2FFF743FF0120A3E024 +:107D30000020A1E00FA804993C22FCF7D5FF200009 +:107D4000C0B2002808D131003800C0B2FFF74AFFA6 +:107D5000002801D100208FE03800C0B23C21484308 +:107D60002D18E4B2002C0CD028000FA93C22FCF7FF +:107D7000BBFF01200100A97001003822A954694607 +:107D80004870249C27A8007800282FD02598002828 +:107D900001D0019018E0002C01D0019414E0029869 +:107DA0000021FA2292000023FCF78EFB02000B0058 +:107DB00003980021801859410022401E9141039AE6 +:107DC0000023FCF78EF801900198002807D0029A52 +:107DD00001993800C0B2FBF78FF8002815D00821B0 +:107DE0003800C0B2FFF7D3FE002045E068460178B6 +:107DF0003800C0B2FAF748FD002806D00821380044 +:107E0000C0B2FFF7C4FE002036E029A800786870F1 +:107E1000002C01D0012001E029A8007828701E98CC +:107E2000A860EC60019828610020A861039828628E +:107E3000684600783521685427A8007837216854AF +:107E400068464078362168541E980899884201D3C4 +:107E5000012000E00220342168541E993800C0B28D +:107E6000FBF74CF9002806D008213800C0B2FFF714 +:107E70008EFE002000E001201FB0F0BD10B5F02103 +:107E800000227B4C2000FEF737FE10BD281800288A +:107E9000F8B505000C002800C0B2FFF7A9FD0028C6 +:107EA00013D02800C0B2FAF708FC7148EDB23C21AB +:107EB0004D4345193C21002632002F003800FEF7C3 +:107EC0001BFE6C602E700320A870F1BD38B5040055 +:107ED000002505E021002800C0B2FFF7D9FF6D1C86 +:107EE000042DF7D331BD00B5002000E0401C04286C +:107EF00009D25F493C22424389183822895C002913 +:107F0000F4D0012000E0002000BD78B585B0040069 +:107F100057482300DBB23C256B43C5182878082856 +:107F200035D1696889B22000C0B2FAF7EBFA0028AF +:107F300004D12000C0B2FFF749FE96E02000C0B295 +:107F4000FAF747FD002800D08FE0286B002806D004 +:107F5000296B2000C0B2FAF732FE002812D06968FF +:107F600089B22000C0B2FAF7CDFA002804D120006F +:107F7000C0B2FFF72BFE04E009212000C0B2FFF7DA +:107F800006FE72E02000C0B2FFF713FE6DE0C87875 +:107F900004280BD0C878022808D0C878032805D058 +:107FA000C878052802D0C878012805D10921200009 +:107FB000C0B2FFF7ECFD58E02878012855D0160034 +:107FC000287806281BD1E86AFA21490041183000B8 +:107FD000FFF74DFD002811D069462000C0B2FAF726 +:107FE000BBFD002805D009212000C0B2FFF7CFFD5E +:107FF0003BE00398A862EE620720287035E0E86A4B +:10800000FA21890041183000FFF731FD00282CD0FB +:1080100069462000C0B2FAF79FFD002805D009216B +:108020002000C0B2FFF7B3FD1FE0E86A361A0398DC +:10803000A96A401A00210F4A0023FCF745FA3200D2 +:108040000023FBF74EFF0600002E05D02000C0B233 +:10805000FAF733FB002805D009212000C0B2FFF752 +:1080600096FD02E02E630820287006B070BD000067 +:1080700028180028A0860100F8B592B0FAF77CF91C +:10808000FAF7F8FD0690002007900CE00621280082 +:10809000C0B2FFF77CFD03E02800C0B2FFF789FD06 +:1080A0000798401C07900798042800D348E1079DD3 +:1080B000A44807993C22514344183820205C0028EA +:1080C00006D008A92800C0B2FAF770FE002800D038 +:1080D000E6E7FAF7B5F9002803D108AEF0780728EB +:1080E00005D107212800C0B2FFF751FDD8E761682C +:1080F00089B22800C0B2FAF705FA002804D1280096 +:10810000C0B2FFF763FDCBE7F078062807D12078EF +:10811000082804D02800C0B2FFF758FDC0E7207837 +:10812000012816D1B078002813D06078207020780C +:10813000062802D10698E0620BE0E068002806D02D +:108140000698E168401861694018A06101E00020CC +:10815000A061207806280BD02078072808D0207846 +:10816000082805D02078012809D16078062806D192 +:10817000069A08A92800C0B2FFF7C7FE90E720784A +:1081800004282FD1E1690698FFF771FC002828D058 +:1081900060780590012004903720205C039060688F +:1081A000029020690190E0680090236A3520225CEB +:1081B000A1682800C0B2FFF751FD002811D1616805 +:1081C00089B22800C0B2FAF79DF9002804D128002E +:1081D000C0B2FFF7FBFC04E004212800C0B2FFF7A7 +:1081E000D6FC5DE7F078022802D0F078032801D1B0 +:1081F000012700E00027F078042803D03800C0B23F +:10820000002852D02000FFF7A4FC00280AD008A9BB +:108210002000FFF764FC002804D02800C0B2FFF75C +:10822000C8FC3DE72000FFF794FC002823D036204F +:10823000205C00281FD12800C0B2FAF73EFA0028BF +:108240000CD0FAF7FDF8002801D0072100E0082142 +:10825000C9B22800C0B2FFF79AFC21E704202070C1 +:108260000020A0610698FA21C9004018E0610120B1 +:108270003621605418E03800C0B2002809D0200030 +:10828000FFF776FC002804D02800C0B2FFF791FC6D +:108290000AE0FFB2002F01D0052100E00421C9B29D +:1082A0002800C0B2FFF773FCFAE6F078012804D189 +:1082B0002800C0B2FFF77DFCF2E6F078052805D172 +:1082C00006212800C0B2FFF762FCE9E6A069002899 +:1082D00000D1E5E6A1690698FFF7C9FB002800D1A7 +:1082E000DEE62800C0B2FAF7E8F900280CD0FAF769 +:1082F000A7F8002801D0072100E00821C9B2280012 +:10830000C0B2FFF744FCCBE62078032800D0BDE6DE +:1083100069462800C0B2FAF71FFC002805D00821E2 +:108320002800C0B2FFF733FCBAE60398616A8842BE +:1083300000D0B1E604212800C0B2FFF728FCAFE668 +:1083400013B0F0BD2818002810B586B0022405949B +:108350000024049400240394029300230193002337 +:1083600000930023D2B2C0B2FFF778FC06B010BD74 +:10837000F8B590B00C001D0062498C4211D2160075 +:10838000002E0ED0070006A93800C0B2FAF70EFD85 +:10839000002806D106A84078002802D00A980028B4 +:1083A00001D1002022E0200000210A9A0023FCF7DE +:1083B0008BF802000B005448002180185941534AA1 +:1083C0000023FBF78EFD022105910021049100217D +:1083D00003911699029100210191009600232A0031 +:1083E000D2B201003800C0B2FFF738FC11B0F0BDC6 +:1083F000F0B58BB007000E0014001D0001A9380075 +:10840000C0B2FAF7D3FC002803D101A840780028B5 +:1084100001D1002012E00A988119002901D500211C +:1084200003E03848814200DB38492B0022001098D5 +:108430000090DBB23800C0B2FFF79AFF0BB0F0BD7E +:10844000F6B585B004000E000698002815D01F0070 +:108450003800C0B2FFF773FB00280ED03000C0B266 +:10846000012803D03000C0B2022806D10C992000A8 +:10847000C0B2FFF7B7FB002801D1002040E039006F +:10848000C9B22000C0B2FAF7FFF9002806D00821CF +:108490002000C0B2FFF77BFB002031E053482100F1 +:1084A000C9B23C225143451869462000C0B2FAF7D0 +:1084B00053FB002806D008212000C0B2FFF767FB5D +:1084C00000201DE0039868623100C9B22000C0B2EC +:1084D000FAF76EFA002806D008212000C0B2FFF794 +:1084E00056FB00200CE00120287003206870342027 +:1084F0002E540698E8600020A86135202F540120F2 +:1085000007B0F0BD112700008813000010270000FD +:10851000F6B591B00C001E00129900290BD007008F +:1085200007A93800C0B2FAF741FC002803D107A818 +:108530004078002801D1002055E006940A99069859 +:10854000FFF79EFA0400002C07D1189B32220699EF +:108550003800C0B2FFF7F8FE45E006980A99884255 +:1085600001D3012100E002211298FF22F63290424D +:1085700003D31298A04A851800E0129DC9B23800B2 +:10858000C0B2FFF784FA0021C943491B814201D2DE +:10859000002028E02D1820000021FA22920000235C +:1085A000FBF792FF2A000023FBF79BFC02210591B9 +:1085B00000210491012103911899029101951299CA +:1085C00000910300002206993800C0B2FFF746FB75 +:1085D0000100C9B2002905D00449FFB23C2257432B +:1085E000C9194E61C0B213B0F0BD000028180028B0 +:1085F000F8B58AB007000E0014001D006946380067 +:10860000C0B2FAF7D3FB00280AD1684640780028A8 +:1086100006D00298002803D030000299814201D28E +:10862000002017E00021049A0023FBF74DFF020011 +:108630000B0002984008002180185941029A00233B +:10864000FBF74FFC2B002200D2B201003800C0B271 +:10865000FFF77AFE0BB0F0BDF0B58BB007000E004F +:1086600014001D0001A93800C0B2FAF79FFB0028D2 +:108670000AD101A84078002806D00398002803D02A +:1086800030000399814201D2002018E00021059AB0 +:108690000023FBF719FF02000B000398400800219C +:1086A00080185941039A0023FBF71BFC1099009195 +:1086B0002B00220001003800C0B2FFF729FF0BB0E9 +:1086C000F0BDFEB504000D0016002000C0B2FFF79B +:1086D0008FF9002802D02F00002F01D100203DE0AB +:1086E0002000C0B2FFF7A9F9050031002000C0B298 +:1086F000FFF778FA002807D02900C9B22000C0B2DD +:10870000FAF7C2F8002806D009212000C0B2FFF70E +:108710003EFA002022E005204D492200D2B23C233F +:108720005A4388546B463A0002212000C0B2FBF73E +:10873000DDF8002806D168460178002902D040788B +:10874000002806D109212000C0B2FFF720FA00203E +:1087500004E02000C0B2FFF72CFA0120FEBDFEB5F8 +:1087600004000D0016002000C0B2FFF741F90028F8 +:1087700002D02F00002F01D100203AE02000C0B22B +:10878000FFF75BF9050031002000C0B2FFF72AFABD +:10879000002807D02900C9B22000C0B2FAF774F847 +:1087A000002806D009212000C0B2FFF7F0F9002010 +:1087B0001FE0052026492200D2B23C235A438854A8 +:1087C0006B463A0000212000C0B2FBF78FF800286A +:1087D00003D168460078002806D109212000C0B2E4 +:1087E000FFF7D5F9002004E02000C0B2FFF7E1F95F +:1087F0000120FEBD000000000CFEFFFF70B504006C +:108800002000C0B2FFF7F4F8002809D02000C0B261 +:10881000FAF7DFF8002803D1F9F712FE002801D09B +:10882000002013E00A48E4B23C214C4304193820EC +:10883000205C002801D0002008E065683C2100226F +:1088400026003000FEF758F96560012070BD000079 +:108850002818002838B596B005000C00002C1AD056 +:108860002800C0B2FFF7C4F8002814D069462800D9 +:10887000C0B2FAF79BFA00280DD10FA92800C0B2A8 +:10888000FAF7E6FB002806D10AA92800C0B2FAF7D9 +:1088900063F9002801D000203CE01F48EDB23C21E4 +:1088A0004D43401901782170817861706946CA781A +:1088B000A2708A78E27042686260039AA260019AAC +:1088C000E260029A22610C9A6261149AA261099A8A +:1088D000E261059A2262069A6262079AA262089A87 +:1088E000E2620FAA527E3023E2543622825C3123A8 +:1088F000E2543822825C3223E2543622805C002823 +:1089000001D0012000E000203322A0544878342117 +:108910006054012017B030BD2818002870B53421EC +:1089200000242200B24D2E003000FEF7E5F86C70F6 +:1089300070BDF0B58FB007000E003800C0B200F077 +:108940003EF900900098002807D000F0F5F80028C4 +:1089500003D1FFF7C8FA002801D000203BE0002433 +:10896000250000E06D1C2800C0B2042818D201A91F +:10897000B0482A00D2B2805CFFF76CFF00280DD00F +:1089800001A83421405C002808D005980099496866 +:108990002A00D2B25200895A8842E3D200201AE05B +:1089A00034212200924C25002800FEF7A5F82770FC +:1089B000012001006170A0702681FAF75BF9E06088 +:1089C000E168009800F0D4F9002803D100F00AFB18 +:1089D000002000E001200FB0F0BDFEB50020694688 +:1089E000087000F0A9F8002800D18AE0804C2078B7 +:1089F00000F0E5F80700002F02D100F0F3FA80E064 +:108A0000FAF738F90600E0688B494118300000F0A9 +:108A1000CBF8002805D02089401C80B200F072F805 +:108A20006FE0684600F022F90500684600780028EB +:108A300002D000F0D7FA64E06078012817D1EDB2D7 +:108A4000002D09D032000021380000F0C5F90028BF +:108A500001D100F0C7FA54E02069AD494118300057 +:108A600000F0A2F8002801D000F0BCFA49E0B86894 +:108A7000E17818225143401802902169300000F03B +:108A80009CF801900298007D02281AD1EDB2002DC9 +:108A90000FD0207E002807D1380000F06AFA0028A5 +:108AA00006D100F09FFA03E03100380000F0AFFA81 +:108AB00027E0029880680199884201D200F092FA7A +:108AC0001FE00198616988421BD3EDB2002D04D0EC +:108AD0003100380000F09BFA13E000F01BF9002889 +:108AE00007D02089FFF7F2F93100380000F08FFA43 +:108AF00007E06069864940180199884201D200F078 +:108B000071FAF7BD70B5040000F016F8002809D01E +:108B1000200080B2F9F77EFDF9F72EFCA4B2200008 +:108B2000FFF7D4F9342100242200314D2E0030000B +:108B3000FDF7E2FF6C7070BD00B52D48417801294A +:108B400002D04078022801D1012000E00020C0B20C +:108B500000BD70B50400002C01D1002023E0FFF718 +:108B6000EBFF002807D0FAF785F82149096900F0E2 +:108B700024F8050000E000251D4E30782070707844 +:108B80006070B078A07000F035F8317909010143C8 +:108B9000E170F088A08080204002854201D38B4D97 +:108BA000FFE7E580012070BD00B5401A002801D420 +:108BB000012000E00020C0B200BD401A704710B58F +:108BC000002100E0491C0A00D2B2022A0EDA804AD3 +:108BD0000B00DBB218246343D35C0400E4B2A3426D +:108BE000F0D1C9B218204143501800E0002010BD58 +:108BF000781A002838B58EB000252C0012E069469E +:108C00000C482A00D2B2805CFFF724FE002808D06E +:108C100068463221405C002803D020000124AC408B +:108C200004436D1C2800C0B20428E8D32000C0B261 +:108C30000FB030BD9CE90010C027090000B50178D5 +:108C40000A290ED0417804290BD04178062908D092 +:108C50004178072905D04178082902D040780928B1 +:108C600001D1012000E00020C0B200BDF1B590B0FC +:108C700001242000694608701098002801D10020C6 +:108C800043E0002010990870002617E00498381A75 +:108C900009E001A8FFF7D2FF00282BD10498B842C1 +:108CA000F4D30498C01B01A93222895C002901D1A8 +:108CB000042802D3002069460870761C3000C0B238 +:108CC000042820D2434D3000C0B240002818478B02 +:108CD00001A9C3483200D2B2805CFFF7BBFD002877 +:108CE000D7D128792100B14001432971109804702F +:108CF00000200AE028792100B14001432971109831 +:108D00000470002001E06846007811B0F0BD00005A +:108D10003075000038B58EB0002400E0641C2000DF +:108D2000C0B2042821D22B482100C9B24900401802 +:108D3000458B6946AA482200D2B2805CFFF78AFDC3 +:108D400000280AD06846FFF779FF002805D103986C +:108D5000A84204D30398401B03E0002006E00398D8 +:108D6000281A0428DAD3002000E001200FB030BD1B +:108D7000F8B50600174D2889401C28812961AF48A5 +:108D80006861002400E0641C2000C0B204281AD2EC +:108D900070682100C9B24900405A2100C9B2490097 +:108DA000691848832B895A2270682100C9B249008A +:108DB000415A8B482700FFB2C05DFFF719FC00281D +:108DC000E1D1002000E00120F2BD0000FFFF000023 +:108DD00014E60010781A0028F8B590B00700002FAC +:108DE00004D008003B7BC0B2984201D30020BEE013 +:108DF000B8680B00DBB218246343C0180190904E92 +:108E000002207070F17001980078B07032610198A2 +:108E100040687061002030763089401C308100202D +:108E200016E001990200D2B2520089188989020025 +:108E3000D2B25200B218518301990200D2B252004C +:108E4000891889890200D2B25200B2185185401C9B +:108E50000100C9B20429E4D30198007D012801D1A1 +:108E6000012084E00198007D022863D100241EE0E7 +:108E70002000C0B24000301845840DE0290089B2BE +:108E8000BA8A891880B28142F2DAB88A2818210099 +:108E9000C9B24900711848842000C0B2400030189F +:108EA000408C2100C9B2490071184883641C20001D +:108EB000C0B2042821D201982100C9B2490040184B +:108EC000858902A946482200D2B2805CFFF7C2FC25 +:108ED000002810D00598010089B2BA8A89182A00A2 +:108EE00092B29142CADAB88A281A2100C9B249005E +:108EF00071184884D0E7002039E0002400E0641CA9 +:108F00002000C0B2042813D2338938692100C9B2C5 +:108F1000425C2000C0B240003018418B3048250030 +:108F2000EDB2405DFFF764FB0028E8D100201EE0B1 +:108F300001201CE0002400E0641C2000C0B20428D2 +:108F400014D2308900903D4B01984268019821006D +:108F5000C9B249004018818921482500EDB2405D21 +:108F6000FFF77AFB0028E7D1002000E0012011B0D4 +:108F7000F0BDF8B50600002E01D100202FE0304DE5 +:108F80002889401C288102202876002420000AE03D +:108F90000100C9B249006918498D0200D2B25200DD +:108FA000AA185183401C0100C9B20429F0D300E083 +:108FB000641C2000C0B2042810D22B89B27D20008E +:108FC000C0B240002818418D1E482700FFB2C05D86 +:108FD000FFF70EFB0028EBD1002000E00120F2BDDE +:108FE0009CE9001038B5164D2C89641C200080B215 +:108FF000F9F710FBF9F7C0F9200080B2FEF766FF21 +:109000002C8103206870F9F735FE286131BD38B531 +:109010000A000B4BD978491C0C00057BE4B2AC422A +:1090200003D30021DC88641CDC80C9B2FFF7D4FEC6 +:10903000002801D1FFF7D6FF31BD000030750000D8 +:10904000781A00289CE90010F8B5C0B0002001F0A3 +:1090500072FB20A9002000F016FA070069460120E3 +:1090600000F011FA04003800C0B2022801D1012535 +:1090700000E000252000C0B2022801D1012600E056 +:109080000026300028438749087086480078002869 +:1090900013D1FFB2002F04D120A800F04CFA002811 +:1090A00007D0E4B2002C08D1684600F044FA00284A +:1090B00003D101207C49087002E000207A49087041 +:1090C0007848007800280FD100200100BA4A1170BA +:1090D0007649086005E00021C943754A8300D150F4 +:1090E000401C2028F7D331E0F6B2002E16D0EDB2A6 +:1090F000002D05D02299029800F014FA00280DD016 +:1091000001206A4908600020202814D269468200A4 +:109110008958674A8300D150401CF5E70020634915 +:10912000086006E020A982008958614A8300D15076 +:10913000401C2028F6D35E48C068012803D10120D6 +:109140009D49087002E000209B49087041B0F0BDC5 +:10915000F0B595B053480078002803D096480078C1 +:10916000002801D1002065E0002400E0641C042CEC +:109170004ED2062767433F1D4D4DB800285801A920 +:1091800014226243885001AEB800281840681421A8 +:10919000614371184860B800281880681421614341 +:1091A00071188860B8002818C068142161437118CC +:1091B000C860B800281800690090B80028184069F5 +:1091C000012801D1012000E0002014216143711821 +:1091D0000874142060433018426801A814216143C8 +:1091E00041582000C0B200F02DF9B9006918496952 +:1091F00002290BD20099814208D114206043311812 +:109200002000C0B2F9F716FC0028AFD0002011E012 +:10921000002400E0641C042C0BD201A8142161433B +:1092200041182000C0B2F9F72FFC0028F2D000202E +:1092300000E0012015B0F0BD00205F49087001205A +:1092400019490870704710B5A0B01648007800287A +:1092500003D059480078002804D1002056490870EE +:1092600001201CE00020010006E0114A8B00D258CA +:109270006B468C001A51491C2029F6D30C49896889 +:10928000491C029103901C21684600F097F81C903D +:10929000A048006801214140684600F075F920B0FF +:1092A00010BD0000D11C0028D31C0028801C002801 +:1092B000F8190028F8B5B0B0974F3878002805D0D5 +:1092C0009448006801214140009101E00020009095 +:1092D0000026300005E00021C94310AA8300D150C8 +:1092E000401C2028F7D38D48109008201190387822 +:1092F000002803D08A488068401C00E001201290BA +:109300000120139034001FE0310019E0019810A9EA +:10931000AA00885010A80299AA00821851600399E7 +:10932000AA00821891600499AA008218D160099954 +:10933000AA008218116101A9097C0029E4D0012149 +:10934000AA0080184161641C042C12D206256543D2 +:109350002D1D01A92000C0B2F9F7FEFB002806D19F +:1093600006A92000C0B2F9F721FD0028CED00020C8 +:1093700016E01C2110A800F021F82C903878002865 +:109380000AD022480078002806D010A800F0E7F89C +:10939000002801D0012003E0009910A800F0F4F8A3 +:1093A00031B0F0BDA04800787047A0480078704701 +:1093B0009F48007870470000D21C0028F2B50026B4 +:1093C000F64300210A0000E0521C009B9A421AD288 +:1093D0009300C4580B0000E05B1C042BF4D2350052 +:1093E000E6B26E40240A0D0001E00F0004E0082DF3 +:1093F000F2D2F707F9D5904F7608B4463E0067469B +:109400007E406D1CF3E7F043F2BD0000D21C002843 +:10941000C0018A494018704700B5C0B2002805D085 +:10942000022808D004D3032807D009E0844808E0C4 +:10943000AF20400105E0834803E0E120400100E067 +:10944000002000BD38B50D001400C0B2FFF7E4FFE6 +:1094500002002800002A01D0002C02D10020C043C5 +:1094600010E0844200D2200000210023FBF72CF8FA +:1094700002000B00600800218018594122000023DF +:10948000FAF72FFD32BD10B50C00FFF7C1FF002C1D +:1094900001D100203CE0002104E08A0082588B00CA +:1094A000E250491C2029F8D3E068022801D30020AB +:1094B0002EE02068194988420BD16068082808D13D +:1094C0001C212000FFF77AFF216F814201D1022089 +:1094D0001EE020685C49884202D1606805280DD0F2 +:1094E00020685A49884202D16068062806D0206860 +:1094F000574988420BD16068072808D11C212000F9 +:10950000FFF75CFF216F814201D1012000E00020C4 +:1095100010BD0000801C0028D11C002838564D5377 +:10952000F819002800B5401A012801DB012000E0ED +:109530000020C0B200BD00B5002801D100200DE020 +:10954000002100E0491C202907D28A00825800230C +:10955000DB439A42F6D0002000E0012000BD10B5A8 +:10956000002801D100200EE0042100E0491C1C2944 +:1095700008D28A0082582F4B8C001B599A42F5D092 +:10958000002000E0012010BDFEB50500002D03D035 +:1095900000910098022801D3002043E00098FFF7D3 +:1095A00037FF070001970121380001F0E2F801219F +:1095B000380001F01CF9002801D1002032E000261B +:1095C000340007E00122A0002918A000381801F09B +:1095D00057F9641C202CF5D3300005E08100695850 +:1095E000144A8300D150401C202808D201998200DF +:1095F00089588200AA589142F0D0002012E00098C9 +:109600001449086001200100074A1170E968012926 +:1096100002D10649087002E030000449087004488D +:1096200006700120FEBD0000D11C0028D21C0028BD +:10963000D31C0028F81900282083B8ED000003147B +:10964000FC530000901A000035564D5336564D53CA +:1096500037564D53801C002800B5010009B200297F +:1096600005D40121C006C00E8140AE48016000BD96 +:1096700000B5010009B2002905D40121C006C00EC1 +:109680008140CC48016000BDF0B5020012B2002A52 +:1096900018D41822A44B040024B2A408A4001C5916 +:1096A000FF250600F6001640B540AC438901C9B25B +:1096B0000500ED002A409140214300B2800880005F +:1096C00019501CE00F22BC4C182503001BB213409C +:1096D000083B9B089B00060036B23240083A9208CD +:1096E0009200A258FF260700FF002F40BE40B24361 +:1096F0008901C9B2C0000540A9401143E150F0BD45 +:1097000000B5002A03D101228A40426002E0012212 +:109710008A40826000BD0268CA401000C007C00FC6 +:10972000704700B5022801D301200FE00B00DBB227 +:10973000042B01DB012009E0BC4B80001818C9B2E2 +:10974000405C824201D3012000E0002000BDF8B55A +:1097500004001F00022C01D3012023E015000E009D +:109760002A003100C9B22000FFF7DBFF012801D138 +:10977000012017E03000C0B2002816D1FF2F12D808 +:10978000AB4861034018A9004018802149014018E6 +:109790000168A84A0A403902FF231B020B40134309 +:1097A00003600020F2BD0120FCE7F6B2012E16D1C5 +:1097B00080204002874210D29D4861034018A900D2 +:1097C0004018A0214901401801689B4A0A4039020B +:1097D000C44B0B4013430360E3E70120E2E70120A1 +:1097E000E0E700B20012C0B27047F8B505000F0004 +:1097F0001600280000B2FFF7F4FF04002000C0B2FA +:10980000022801D301202CE032003900C9B2200027 +:10981000C0B2FFF786FF012801D1012021E0844872 +:109820002100C9B2490341182A00D2B29200891816 +:10983000C02212018A58AC491140FFB23B02C0223B +:1098400092001A400A43FF218A43F1B21143E4B265 +:1098500062038018EDB2AA008018C0221201815064 +:109860000020F2BD70B50400022C01D3012028E0D5 +:1098700015000E002A003100C9B22000FFF751FF89 +:10988000012801D101201CE0694861034158802270 +:1098900012060A43C02189041143FF2212040A431D +:1098A000914B1340F6B23202C02189001140194396 +:1098B000FF229143EAB20A436103425061034058D8 +:1098C000002070BD70B50400022C01D3012028E0F7 +:1098D00015000E002A003100C9B22000FFF721FF59 +:1098E000012801D101201CE0514861034158802228 +:1098F000D2050A43C02189041143FF2212040A43FE +:10990000794B1340F6B23202C0218900114019434D +:10991000FF229143EAB20A43610342506103405877 +:10992000002070BD00E100E000E400E038B5002058 +:109930000100974A11700100964A1170964908601B +:1099400000F0D4F8002803D000F02CF9002804D14E +:109950009248B849086000202BE0914C2000FBF7AA +:1099600091F9002804D08D48B2490860002020E019 +:10997000B1490020205EFBF7A4F900210220205EFF +:10998000FFF782FE0220205EFFF772FEAB4D28003B +:1099900001F05AFEAA49280001F0CCFAA549086056 +:1099A000002801D0002004E00220205EFFF754FED2 +:1099B000012032BD80E200E01CED00E038B504007B +:1099C000002C01D100202FE0FBF722F871490A7822 +:1099D00013006F4D2D78DBB2AB4203D1FBF71CF8BF +:1099E000002021E0C44B1500EDB22D015D5925602A +:1099F0001500EDB22D015D196D6865601500EDB2C1 +:109A00002D015D19AD68A5601500EDB22D015B1942 +:109A10001B7B2373521C1300DBB2102B00D30022DC +:109A20000A70FAF7F9FF012032BD000098E8001033 +:109A300000000440FF00FFFFFF0000FFF1B594B0FD +:109A40000D0016005021002422006F463800FDF75B +:109A500053F8149880210901884203D24E480068C7 +:109A6000002804D04D48A9490860002038E0684625 +:109A700021000170210001721499019108214C22EA +:109A800081540395049600E0641C2000C0B20828AD +:109A900021D26A4D2100C9B2280001F02DFF01003A +:109AA000C9B20129F0D0C0B20328EDD0149898496A +:109AB00008606A462100C9B2280001F049FE9349B6 +:109AC0000860002805D193480168491C0160012005 +:109AD00006E0002004E090480168491C0160002075 +:109AE00015B0F0BD00FFFF00FFFCFFFFF8B500253B +:109AF00000956846FDF7AEFE002801D0002046E044 +:109B0000864C0098A04205D300982100FAF7EEFA9F +:109B1000002901D000203AE000982100FAF7E6FA87 +:109B20000400002C03D0FF20801C844201D30020BD +:109B30002DE0FF2608363000FFF753FE0700002215 +:109B400000213800FFF7BEFE002801D000201EE0F3 +:109B5000002200213000FFF748FE002801D000203D +:109B600015E023005B1E002200213800FFF7EFFD07 +:109B7000002801D000200AE0002200213800FFF771 +:109B800071FE002801D1012000E02800C0B2F2BD22 +:109B9000A51C0028A61C0028DC1B00280100620070 +:109BA0000008002818B5A7B01AA85D493422FBF7B1 +:109BB0009BF80DA85B493422FBF796F868465A4992 +:109BC0003422FBF791F8594C1AAA07212000FAF722 +:109BD0004EFA002801D0002024E00DAA0621200022 +:109BE000FAF745FA002801D000201BE06A4601215F +:109BF0002000FAF73CFA002801D0002012E00122F0 +:109C000001212000FFF77CFDFA208000FBF756FAC7 +:109C100001212000FFF77FFD012801D1012000E094 +:109C20000020C0B228B010BD80B5044801F042F851 +:109C300001BD0000BC1B0028299C001000045440FA +:109C40000808002870B51400002C05D0207A0028E0 +:109C500002D12078002800D04DE035480168491C29 +:109C600001606068334908606068C02189008842EB +:109C700014D14C20205C082810D1E068C0B209281B +:109C80000CD1E068000AC0B2102807D12069002872 +:109C900004D1E068000C80B2F8F7BCFC26480178DB +:109CA0000A00521C1300DBB2102B00D30022130059 +:109CB000224D2D78DBB2AB4204D121480168491C0A +:109CC000016018E00C4B65680E00F6B236019D513C +:109CD0004C25655D0E00F6B236019E193573E568B8 +:109CE0000E00F6B236019E1975602469C9B20901E9 +:109CF00059188C60027070BD2817002800B5C0B2DA +:109D0000002802D101200F49086000BDD81B00289F +:109D1000D41B0028C81B0028CC1B0028005A620254 +:109D2000E4E4001018E500104CE50010800131401B +:109D3000C01B0028D01B0028A51C0028A61C00283A +:109D4000C41B0028DC1B00286B490A6808607047A8 +:109D50006A490A6810239A43C0B2000110231840D0 +:109D600010430860704765490A68654B1340C0B2EC +:109D700000028022520010401843086070475F497B +:109D80000A6852005208C0B2C0071043086070470A +:109D9000002070475B480068704710B504005948C0 +:109DA0000460BFF34F8FFFF7F5FFA04201D1012000 +:109DB00000E00020C0B210BDF8B50400FF20E23082 +:109DC0000090FFF7E5FF0700FFF7E4FF01252E00F5 +:109DD00000210A004C4B1A700A004C4B1A70009A72 +:109DE0002240002A02D04A490D7001E0484A117011 +:109DF000610005D50020FFF7D0FF0600FFF7CAFF7E +:109E0000F6B2002E09D04349884206D04249884222 +:109E100007D13800C0B2002803D105203A490870A4 +:109E200012E03B480078002803D00420364908702F +:109E30000AE0FFB2002F07D00800FFF7AEFF0028AE +:109E400002D1052030490870FBF7A6F9FBF7CEF9DF +:109E5000C8200001FFF778FF0120FFF779FF0020FD +:109E6000FFF781FF0120FFF78AFFFBF7B4F9FBF74B +:109E7000D0F92648057000F001F8F1BD80B52348FF +:109E80000078002801D0FBF7EBF901BD80B5010097 +:109E9000C9B200290CD01C490A78002A08D10870E0 +:109EA0000020F8F7EFFBF8F7FDFB0020FEF70EF8B7 +:109EB00001BD80B5FFF76CFFFFF76CFF15498842C5 +:109EC00002D10520FFF7E2FFF8F7BAFA002802D026 +:109ED0000120FFF7DBFFFFF7D1FF01BD00B50A4806 +:109EE0000078002801D0012000E00020C0B200BDB1 +:109EF000054800787047000008C0264010C0264082 +:109F0000FFFEFFFF0C102740B61C0028B81C0028DD +:109F1000B71C002845564F4D41564F4D1CB501F01A +:109F200019FD002803D100F0B9F800202BE001F062 +:109F3000F3FF002803D100F0B1F8002023E0FAF786 +:109F4000DEFB002805D069460520FAF767FC0028EB +:109F500003D100F0A3F8002015E068460088974977 +:109F6000088001249648047000209649086001206A +:109F700000F084FA012000F09DFA64209249086004 +:109F800092480470012016BD80B5002804D1904885 +:109F90000168491C016020E08E490A68521C0A6071 +:109FA00001688D4A891A08D00C3909D092225200D2 +:109FB000891A08D05C3909D00BE000F085F80CE074 +:109FC00000F00EF909E000F06DF906E000F0A0F9EC +:109FD00003E07F480168491C016001BD80B501F0C4 +:109FE000E7FC00F03CF87D480178E02905D00178D5 +:109FF000052902D00078002806D10020A649087063 +:10A000000120724908700EE0A4480178002906D1A9 +:10A01000A1480178002906D00121017003E00078F1 +:10A02000401C9D4908709E480078002814D0B44810 +:10A030000168002910D00168491E016000680028ED +:10A040000AD1B048007801F0D9FF002804D10120DE +:10A05000AD49086000F056FA00F05BFA01BD1CB58E +:10A0600058480168491C016001680A2915D3002479 +:10A07000046069460520FAF7D1FB002807D068463E +:10A0800000884E49088001204D49087005E09F482E +:10A090000168491C01604A48047013BD80B501F095 +:10A0A000FEFC02F083FA01F0C0FF002001007C4AB0 +:10A0B0001170934908600100B64A11707649087022 +:10A0C00001204249087001BD70B5017B08290AD002 +:10A0D0003F480168491C0160002000F0CFF90020D2 +:10A0E00000F0E8F968E00324416822000A40416872 +:10A0F000890823000B404168090925000D400F26FF +:10A100004168090C31404068000D06401000C0B2A3 +:10A11000022803D1012000F0B1F924E0D2B2012AD3 +:10A120001AD11800C0B2012802D0DBB2022B13D121 +:10A130000800C0B200280FD00800C0B206280BD219 +:10A140000800C0B200F028F900280CD102206E49A6 +:10A15000086000F0D7F906E01D480168491C01605D +:10A16000002000F08BF92800C0B2022803D10120A2 +:10A1700000F0A0F920E0EDB2012D16D13000C0B200 +:10A18000002812D03000C0B206280ED2BA4800789B +:10A1900000280AD03000C0B200F03FF900280BD1EF +:10A1A0005948046000F0AEF906E009480168491C0E +:10A1B0000160002000F07EF970BD00009C1C0028AA +:10A1C000C01C0028441C0028401C0028FE12002847 +:10A1D000281C0028241C00289E020000BB1C00280C +:10A1E00080B5017B082904D0B0480168491C016092 +:10A1F00051E0436807214268120C0A404068C00CD5 +:10A200000140DBB2012B07D11000C0B2052803D2F8 +:10A210000800C0B2052804D3A4480168491C0160A5 +:10A2200039E01000C0B2012801D1012005E0D2B20E +:10A23000022A01D1022000E003209D4A107008008C +:10A24000C0B2012801D1012005E0C9B2022901D123 +:10A25000022000E00320A14908701148007800287E +:10A260000AD09F48007800F097F8002804D1042015 +:10A270002549086000F046F90848007800280AD00F +:10A280009848007800F0C9F8002804D105201E493C +:10A29000086000F037F901BDFD120028BA1C002843 +:10A2A000BD1C002880B5017B08290AD00020724916 +:10A2B00008707E480168491C0160002000F0FAF82F +:10A2C0001CE0406800098007800F0100C9B2012925 +:10A2D00002D0C0B2022803D101206749087002E011 +:10A2E00000206549087064480078002806D16F484E +:10A2F0000168491C0160002000F0DCF801BD00008D +:10A300003C1C0028BF1C0028341C0028381C0028D6 +:10A3100010B5017B08290AD064480168491C016016 +:10A32000002000F0ABF8002000F0C4F831E0032476 +:10A33000416821404068800804400800C0B20128FC +:10A340000BD16748007800F027F800280BD10620D1 +:10A35000A849086000F0D6F805E0C9B2022902D188 +:10A36000012000F08BF82000C0B201280BD15D481D +:10A37000007800F052F800280BD107209D490860B2 +:10A3800000F0C0F805E0E4B2022C02D1012000F098 +:10A3900091F810BDFC12002870B50100C9B2032964 +:10A3A00001D3032500E005000100C9B2002903D054 +:10A3B0000100C9B2062901D3002025E03C490A78F2 +:10A3C0002B00DBB29A4200D20D78454908708A4CC6 +:10A3D0002800C0B200F088F820706D1C8748057016 +:10A3E000012587480570874E307800280DD16420FC +:10A3F00001F0B8FD002801D1002005E03570FA20F9 +:10A40000C00081490860012070BD7F4800680028B5 +:10A41000F9D1207801F0F2FDF6E710B50100C9B2DC +:10A42000032901D3032400E004000100C9B200297C +:10A4300007D00100C9B2062903D20F4909780029C3 +:10A4400001D1002017E025490A782300DBB29A42A7 +:10A4500000D20C78234908702000C0B201F00AFB3A +:10A46000002801D1002006E0641C68480470012027 +:10A4700063490870012010BDBE1C002810B50400FF +:10A4800001F0D3FD002001005E4A11705E490860B2 +:10A490000100594A11702100C9B2052900D30400F6 +:10A4A0005648047001205649087010BD281C002829 +:10A4B0000013002810B50400002001F0DBFA00288A +:10A4C00001D102F073F82000C0B2052800D30024A7 +:10A4D0004E48047001204A49087010BD021300283C +:10A4E000FF1200280113002800B50100C9B201299C +:10A4F00001D1322005E0C0B2022801D1462000E09F +:10A50000642000BD80B5FFF7C9FD0120FFF7BEFC48 +:10A5100001BDF8B53E4C2068401C2060384D2878BD +:10A52000002802D12068642862D334480078C0B281 +:10A530004007400F35490978C90038220A400243D4 +:10A54000009234480078002801D0012100E0002169 +:10A5500031480078E02801D0022000E000200843C4 +:10A5600028490978002901D0012100E000212B4A67 +:10A570001278530006221A400A4380235B002849C0 +:10A580000E689E4201D3FF2100E00968254E37681E +:10A590009F4201D3FF2300E03368C0B2D2B212025F +:10A5A0000243214800880704174320480088C9B2A5 +:10A5B00009040143DBB21E060E43002200991C4829 +:10A5C000FFF73CFA00280FD0320039001948FFF796 +:10A5D00035FA002808D018480168491C016000209D +:10A5E00001002970206003E014480168491C0160E3 +:10A5F000F1BD0000341C0028BF1C0028FC120028FC +:10A60000FE120028BD1C00283C1C0028FD1200285A +:10A61000401C0028C01C0028BB1C0028BA1C0028B5 +:10A62000381C0028101C00289C1C00289A1C00289C +:10A63000FA040000050300002C1C0028301C002830 +:10A6400000B5FEE700B5010009B2002905D40121DB +:10A65000C006C00E8140B748016000BDF0B50200E1 +:10A6600012B2002A18D41822844B040024B2A40881 +:10A67000A4001C59FF250600F6001640B540AC4367 +:10A680008901C9B20500ED002A409140214300B282 +:10A690008008800019501CE00F22A74C18250300E9 +:10A6A0001BB21340083B9B089B00060036B23240A9 +:10A6B000083A92089200A258FF260700FF002F4098 +:10A6C000BE40B2438901C9B2C0000540A940114350 +:10A6D000E150F0BD00B59D48012102680A430260C7 +:10A6E00002680A40002AFBD100BD99480168012296 +:10A6F0000A43026070479748016801220A430260DA +:10A7000070471FB5684602F049F900280DD08B4C00 +:10A7100018228B492000FDF7E7F80020E07549205A +:10A72000884908600020FDF73FF901208A49087038 +:10A73000FFF7D0FF1FBD80B5C0B201280ED10321A5 +:10A74000814802F05BF903210320FFF787FF032014 +:10A75000FFF778FF01208149087002E000207F495F +:10A760000870FFF7C2FFFFF7C6FF01207A490870A3 +:10A7700001BD7CB505000E00794803C86A4603C2D6 +:10A78000083A3000C0B2002814D17448007801287B +:10A790000DD06A4C18226A492000FDF7A5F8002068 +:10A7A000E0759420674908600020FDF7FDF800205F +:10A7B0006949087068460121017100242100417136 +:10A7C00000953200D2B26946002002F027FB002833 +:10A7D0000CD05A4D18225A492800FDF785F8EC751F +:10A7E0009E20584908600020FDF7DEF873BD7CB557 +:10A7F00006000D00300002F013FA00280DD04F4C77 +:10A8000018224F492000FDF76FF80020E075B520B1 +:10A810004C4908600020FDF7C7F82800C0B20028A6 +:10A8200014D14E48007801280DD0444C18224449D8 +:10A830002000FDF759F80020E075B9204149086073 +:10A840000020FDF7B1F80020434908700096300061 +:10A8500002F024FA002801D0202001E080208000AE +:10A8600001902A00D2B26946002002F03FFB002886 +:10A8700001D1012000E0002076BD000000E400E0EE +:10A88000F8B584B007000E001500380002F0C8F9D2 +:10A8900000280DD0294C182229492000FDF724F862 +:10A8A0000020E075DF20274908600020FDF77CF8D4 +:10A8B00068461021FCF730F92800C0B2002814D1F6 +:10A8C0002648007801280DD01C4C18221C49200075 +:10A8D000FDF70AF80020E075E6201A49086000201C +:10A8E000FDF762F800201C490870012168460A0043 +:10A8F00002720A00427202228272C1720024210096 +:10A900000173009701962A00D2B26946002002F036 +:10A9100027F900280CD0094D182209492800FCF716 +:10A92000E3FFEC75F520074908600020FDF73CF8CF +:10A9300005B0F0BD00E100E01CED00E0181B0028B0 +:10A9400060E30010E81B002803A700100800244063 +:10A9500000F4244000F52440A71C0028A81C00286F +:10A9600088E8001000B5002801D0002901D1A048D6 +:10A9700008E0A04A904206D1002008808020800193 +:10A980004860002000BD9C4A904205D18020800193 +:10A9900002000A804860F4E7BA4A904206D180205B +:10A9A000C0010880802080014860EAE7B64A9042F2 +:10A9B00006D1C020C0010880802080014860E0E707 +:10A9C000B24A904206D18020000208808020800197 +:10A9D0004860D6E7AE4A904205D10020088080202A +:10A9E00080014860CDE7AB4A904205D180208001CC +:10A9F00002000A804860C4E7A74A904206D180203E +:10AA0000C0010880802080014860BAE7A34A9042D4 +:10AA100006D1C020C0010880802080014860B0E7D6 +:10AA20009F4A904206D18020000208808020800149 +:10AA30004860A6E76E48A5E700B5002100E0491C84 +:10AA40000A290AD2974A18234B43D3589842F6D181 +:10AA5000182041435018001D00E0002000BD10B533 +:10AA60000A00D2B2402A01DB002017E0020C1204D7 +:10AA700080235B02D218AC23C3589B089B049B0C19 +:10AA80009B00D218C9B2884BBC240059000A400769 +:10AA9000400F185C801C41438800101810BD10B591 +:10AAA0000A00D2B2202A01DB002016E0020C1204B8 +:10AAB00080235B02D218C023C3589B089B049B0CC5 +:10AAC0009B00D218C9B2784BC82400594007400FE8 +:10AAD000185C801C41438800101810BD10B50B0095 +:10AAE000DBB2022B01DB002028E0030C1B048024D6 +:10AAF00064021B190C00E4B2002C05D1A0240459F7 +:10AB0000A408A404A40C04E0B0240459A408A404D8 +:10AB1000A40CA4001B19C9B2002904D1BC214058BF +:10AB20004007400F04E0BC21405800094007400F97 +:10AB30005D49085C801C42439000181810BD00B5A8 +:10AB40005A49884201D3052100E00021400A40060D +:10AB5000400E0818C0B200BD38B504000020002C1B +:10AB600044D02000FFF7EBFF0121226D520F0A4075 +:10AB7000002A05D00A004E4B0500EDB26D005A5375 +:10AB8000226D120F0A40002A05D00222484B050010 +:10AB9000EDB26D005A53226DD20E0A40002A05D044 +:10ABA0000322434B0500EDB26D005A53226D920E05 +:10ABB0000A40002A05D004223D4B0500EDB26D008D +:10ABC0005A53226D520E0A40002A05D00522384BF6 +:10ABD0000500EDB26D005A53226D520D114000294F +:10ABE00004D00621324AC0B24000115231BD0000EB +:10ABF00001006200000052400002524070B5002285 +:10AC00001300130000283CD003689B0F1C00E407CE +:10AC1000E40F0C720B7A002B05D10368DB00DB0814 +:10AC20009B144B6003E00368DB00DB084B60436868 +:10AC30005B0D1C00E407E40F0C7043681B0C1B0742 +:10AC40001B0F4C240B554C23CB5C082B01DA130053 +:10AC500002E04C23CB5C083B0AE01400A4B2A40041 +:10AC60000419A4681500ADB2AD004D19EC60521C7A +:10AC700014000D4D1E00B6B2AD5DA4B2ADB2AC4233 +:10AC8000EBD370BD00045240000652400008524011 +:10AC90000000544000025440000454400006544058 +:10ACA000000854405808002880E80010010852406D +:10ACB000301B0028F1B5A8B0002000900020289893 +:10ACC000FFF7BAFE0700002F29D0289E306D974964 +:10ACD0000140002902D02898FFF73EFF0125306D82 +:10ACE000C00C284000281CD1306D2840002868D1B5 +:10ACF000306D00092840002800D0BAE0306D400ACD +:10AD00000540002D0BD030005030016880229200A9 +:10AD10000A4302603868002801D03868804729B0AB +:10AD2000F0BD300050300168802212030A430260F7 +:10AD300098203058002816D0002400E0641C200021 +:10AD4000C0B220282CDA98203058E0402840002853 +:10AD5000F4D02100C9B22898FFF781FE0090A540E9 +:10AD6000982035501CE09C203058002818D0002432 +:10AD700000E0641C2000C0B2202811DA9C2030586A +:10AD8000E04028400028F4D020342100C9B228989F +:10AD9000FFF765FE00902000E03085409C20355094 +:10ADA00000980028BBD013A90098FFF727FF786808 +:10ADB0000028B4D013AA2100C9B200207B689847AC +:10ADC000ADE73000503001682943016017E0289A50 +:10ADD000D4235B00D45801AA0300DBB29B00D450FB +:10ADE000401C02000B00D2B2DBB29A42EFD3B8682B +:10ADF000002804D001AAC9B20020BB689847A4204B +:10AE000030584006400E012889DB2898C0214900AF +:10AE100040582840002822D1A420305800903F24D8 +:10AE20000098020A224000212898FFF757FE0028C8 +:10AE3000E5D013A9FFF7E2FE3000A83001683F22F9 +:10AE40009143009A120A14400C4304607868002869 +:10AE5000D5D013AA002101207B689847CFE734485A +:10AE60002899BC2289584907490F415C891C002058 +:10AE7000B7E730005030016810220A43026017E043 +:10AE8000289ADC235B00D45801AA0300DBB29B00A4 +:10AE9000D450401C02000B00D2B2DBB29A42EFD376 +:10AEA000B868002804D001AAC9B20120BB6898473D +:10AEB000B42030584006400E012800DA2FE72898C9 +:10AEC000C0214900405840082840002822D1B42021 +:10AED000305800903F240098020A2240012128980F +:10AEE000FFF7FCFD0028E3D013A9FFF787FE300031 +:10AEF000B83001683F229143009A120A14400C4373 +:10AF0000046078680028D3D013AA012101207B684F +:10AF10009847CDE706482899BC228958090949076E +:10AF2000490F415C891C0020B4E70000EEE0F73FC8 +:10AF300080E80010F1B594B0D34800681290D3486F +:10AF400000681190D2480768D2480668D248006865 +:10AF50001090D24800680F90D14800680490D14802 +:10AF600000680E90D04800680190D04800680D90AD +:10AF7000CF4800680C90CF4800680B90CE4800681E +:10AF80000A90CE4800680990CD4800680890CD48E6 +:10AF900000680390CC4800680290DC480068079085 +:10AFA000DB48006800901498002810D00C00002C9A +:10AFB0000DD02820205C002802D0E06A002806D0AE +:10AFC0003020205C002804D0606B002801D1D148DB +:10AFD00024E31498FFF730FD002801D1CD481DE38C +:10AFE0002168016061684160A1688160E168C160B9 +:10AFF00021690161149D0120A861A869C007FCD5E1 +:10B000000320A86105A91498FFF7ACFC002801D023 +:10B01000C04803E32820215C129ABF4810400A046C +:10B02000FF21090411400143BC4808406946898A50 +:10B0300089B2890889B289000143842029503020CF +:10B04000205C4006400EFE21C903119BE44A1A40D1 +:10B050000004084010438422AA5892082823E35C85 +:10B06000D2189204920CAD4B03409200DD48104080 +:10B0700018438822A850A06BC000C0087A0F52075E +:10B0800010439022A85007224020205C1040099FC6 +:10B09000D54B3B400702E020C00038401843412315 +:10B0A000E35C13407027B8431F0170233B40034308 +:10B0B0004220205C10400727BB431843BC23E850C4 +:10B0C0004420235C1800C007C00F73005B08C6074C +:10B0D0001E434520205C4006400EC44B1E40070620 +:10B0E000FE20C005384030434626A65D7606760E23 +:10B0F000BB4F07403004084038438826AE59B60895 +:10B100003027E75D7F00F619B604B60C834F074081 +:10B11000B600B44830403843A026A8514820265CE9 +:10B120003000C007C00F109E76007608C00730437D +:10B130004926A65D7606760E03403606FE20C0053B +:10B14000304018434A23E35C5B065B0EA44E064086 +:10B15000180401403143A64FA020285880084623F8 +:10B16000E35C4226A65DBE5DB61C7343C018830433 +:10B170009B0C6A4808409B009A4919400143B02043 +:10B1800029504720205C002801D1002100E0012146 +:10B19000009B012083430800C007C00F18434B21C8 +:10B1A000615C002901D1002100E0012102239843C4 +:10B1B00049000223194001431498C0235B00C15089 +:10B1C000B020285880084A21615C4123E35CFB5C85 +:10B1D0009B1C5943401883049B0C82484F490F9E87 +:10B1E0000E409B0003403343AC26AB514323E35C4A +:10B1F0001A40089B0726B3431A43C823EA507D4AE6 +:10B20000049E16407C4B1E400496AC26AE59B608F0 +:10B2100000964C26A65DB4464026A65DBE5DB61CD3 +:10B2200067467743009EF619B604B60C049F0F409C +:10B23000B60006403E43F027EE510E9F6F4E3E4053 +:10B2400032404D26A65DB606B60E13403604FC22EB +:10B25000920332401A43F023EB589B0814339B04AB +:10B260009B0C11409A0010400843C0216850802276 +:10B2700052021498000C00046946898A401880180C +:10B2800006998B08002125E0E0E80010E4E80010B2 +:10B29000E8E80010ECE80010F0E80010F4E8001016 +:10B2A000F8E80010FCE8001000E9001004E90010C4 +:10B2B00008E900100CE9001010E9001014E9001072 +:10B2C00018E900101CE9001020E9001000260660B3 +:10B2D000001D491C9942F9D301990120084302211C +:10B2E0000143CF480840217D012901D1012100E01F +:10B2F0000021CC4B034048028021890008401843BC +:10B30000217D01290CD101210BE000BF24E90010AF +:10B3100028E9001001006200FFFF00FF0300FFFFAB +:10B320000021C14B03400802802149000840184316 +:10B33000802188434021884320218843102188436D +:10B340000421884301900198A861E08AC005C00DDE +:10B350000D99B64B0B400104B54808401843217EB7 +:10B36000B44B03400902FF200002084018437F232A +:10B37000617E19407F26B0430143A07E1840C90179 +:10B38000C90940060843E861207D012853D11F20E8 +:10B39000A18B01400C9FA84E3E400F04F8214903A9 +:10B3A00039403143A67F3040A44E0E400102F820C0 +:10B3B0004001084030430F21E67F0E40F027B8439C +:10B3C0003701F0263E4006432020205C01400F203C +:10B3D000864331432220205C012811D1012610E050 +:10B3E000FFFF80FFFCFF0000FFF8FFFFFFFFFF8073 +:10B3F00080E80010FFFFFFC0FFFFC0FFFFFFFFBF9F +:10B4000000268F480840F10580263604314001436C +:10B41000E9602320215C19400B9E8A4830400E02CF +:10B42000FE21C901314001432420205C03407F20DC +:10B4300081430B43AB6403203C21635C03400A99C6 +:10B440003026B1431E01302333400B433D21615C64 +:10B4500008400C218B4381000C20084018433E21FA +:10B46000615C012901D1012100E000210223984300 +:10B4700049000223194001433F20205C012801D1EB +:10B48000012000E0002001260123994330400843B9 +:10B49000802168501498000C0004842169588908A0 +:10B4A0008904890C890040188018002105E0E36AAE +:10B4B0008F00DB598F00C351491C2823E35C99425C +:10B4C000F5D31498000C0004882169588908890470 +:10B4D000890C890040188218002308E0606BD900AD +:10B4E000401803C8DF00D71903C7083F5B1C302092 +:10B4F000205C8342F2D3844803990140834A0A4086 +:10B5000083491140834A0A4083491140834A0A40D3 +:10B510004B491140824A0A4082491140824A0A40FE +:10B52000802109031143814A0A4081491140814A1F +:10B530000A40814911403A4A0A4080491140804AF4 +:10B540000A4080491140804A0A4036491140364B32 +:10B550000B4080218B434021C9430B402022D24322 +:10B56000134010271F4308239F430423DB431F403E +:10B570000224E443274037430397039F6F65029FEC +:10B58000384002900298614F074061483840614F4F +:10B59000074061483840614F074029483840604FB4 +:10B5A000074060483840604F0740684838405F4F68 +:10B5B00007405F4838405F4F07405F483840184FAA +:10B5C00007405E4838405E4F07405E4838405E4F57 +:10B5D000074014483840144F0740802087433940C3 +:10B5E0000A40102082430820824313402340012058 +:10B5F0008343AB65079830430440EC651498FFF72C +:10B600009EFA4000B04900220A5201980121884365 +:10B61000A861A86930400028FBD1002015B0F0BD1A +:10B62000FFBFFFFFFFFDFFFFFFFEFFFFFFFF00FE6D +:10B630000000FF01FF00FFFFFFFFE0FFFFE0FFFF53 +:10B64000FFFF7FFFFF80FFFFFEB50700002F01D146 +:10B650009E4857E03800FFF7EFF9002801D19B48DA +:10B6600050E0002404604460C46004613D00012097 +:10B67000A861A96901400029FBD00326AE61694693 +:10B680003800FFF76FF9002801D090483AE0842095 +:10B690002C5088202C508E4890216850BC202C5073 +:10B6A000A0202C50B0202C50C02040003C50AC209A +:10B6B0002C50C8202C50F0202C50C0202C50380C7E +:10B6C0000004694609884018802149024018019900 +:10B6D0008A08210002E00460001D491C9142FAD34F +:10B6E000AE617C48E8617C48E860AC6480202C5006 +:10B6F0006C65AC65EC653800FFF721FA40007249D3 +:10B700000C520020FEBD0000FFFFFFDFFFFFFFEF38 +:10B71000FFFFFFF7FFFFFFFBFFFFFFFDFFFFFFFE48 +:10B72000FFFFBFFFFFFFDFFFFFFFEFFFFFFFFBFF9D +:10B73000FFFFFDFFFFFFFEFFFF7FFFFFFFDFFFFFBC +:10B74000FFEFFFFFFFF7FFFFFFFBFFFFFFFFF7FF2D +:10B75000F8B50600002E02D01400002C01D15B4881 +:10B76000B0E06846017068460078202801DB574841 +:10B77000A8E03000FFF760F9002801D15348A1E0AC +:10B7800037000125B8692840002808D1CC20395855 +:10B7900068460078C1400800C007C00F00E02800DC +:10B7A000C0B2002801D049488CE0684601783000DA +:10B7B000FFF775F9002801D1444883E001000A68C9 +:10B7C000464B13400B60217A012901D12B0000E088 +:10B7D000002302001668424931409B078026F60587 +:10B7E00033400B4313600168890F2940002902D1BF +:10B7F00061688A0400E0626801000B685B0F5B0708 +:10B80000D200D2081A430A60011D0A68354B134062 +:10B810000B60011D0A681202120A0A604C21615C69 +:10B820000B071B0F011D0E682F4A32401B04F02628 +:10B8300036031E4016430E602178012901D12B00EA +:10B8400000E00023021D1668284931405B05802670 +:10B85000B60333400B4313602178012901D12B003B +:10B8600000E00023021D1668214931401B05802697 +:10B87000760333400B4313604C21615C082901DAE5 +:10B88000002102E04C21615C08391A4A89B2515CFE +:10B8900000220AE013009BB29B00E318DB6816004D +:10B8A000B6B2B6008619B360521C13000E00F6B291 +:10B8B0009BB2B6B2B342EDD3684600788540D02043 +:10B8C0003D500020F2BD0000301B00280100620046 +:10B8D000FFFFFF1F030A0006330A0000FFFFFFDF20 +:10B8E000FFFFFFBFFFFF7FFFFFFFF0FFFFFFDFFF57 +:10B8F000FFFFEFFF80E8001010B50200002A03D020 +:10B900000800C0B2202801DB002021E00020012334 +:10B91000CC241459CC401C40002C09D0D420105801 +:10B92000C8401840002801D1180010E003200EE0A4 +:10B93000D8241459CC401C40002C01D0022006E031 +:10B94000DC241259CA401340002B00D00420C0B29E +:10B9500010BD000080B500F029FE00F097FD002822 +:10B9600004D1E02000F01EF9002020E001F024FBCB +:10B97000002804D1E02000F015F9002017E0002095 +:10B9800001006F4A11706F4908606F4908606F4984 +:10B99000086001006E4A117001006E4A11700121A9 +:10B9A0006D4A11706D49086086490860012002BD2A +:10B9B00038B585480168491C0160654C2078042829 +:10B9C00003D3E02000F0EEF853E05D480078002853 +:10B9D00002D000F0EBFD4CE020785E4D2978C0B23B +:10B9E000884208D0207800F062F8002803D1E020D7 +:10B9F00000F0D8F83DE02878002814D0F7F73AF99D +:10BA00007049504A1268801A086008686F49884275 +:10BA100009D36F480168491C01600020207005208F +:10BA200000F0C0F825E048480168491C0160016841 +:10BA30000A291ED30024046001F0CBFA00280AD0A2 +:10BA40004248046001F0D8FA6249088001F0D7FA50 +:10BA5000614908600DE061480168491C01603B488C +:10BA60000168491C01600068032802D3E02000F04F +:10BA700099F831BD00B50100C9B2042901D30020F5 +:10BA80000CE02F490978002905D00100C9B200292E +:10BA900001D0002002E02E490870012000BD80B5D1 +:10BAA00000202B490870E02000F07CF801BD70B543 +:10BAB00004002000C0B200280FD100F077FD254817 +:10BAC00004700120244908700020454908603D4960 +:10BAD00008601C49086001202FE02000C0B200F07F +:10BAE0003FF80500002D01D1002026E000F068FDA0 +:10BAF000002806D0280000F03BFD002808D10020D7 +:10BB00001BE0280000F0E8FC002801D1002014E030 +:10BB1000104E3078002806D1F7F7ACF809490860D4 +:10BB200000202849086034702000C0B200F029F8D5 +:10BB3000094908702A480560012070BD0000000016 +:10BB4000BC1C0028181C00281C1C0028201C0028D5 +:10BB5000B91C0028BA1C0028BB1C0028001C0028A7 +:10BB600000B5C0B2012804D009D3032805D002D300 +:10BB700005E01E2004E03C2002E05A2000E0002006 +:10BB800000BD00B5C0B2012804D009D3032805D0F8 +:10BB900002D305E0022004E0032002E0042000E0DC +:10BBA000012000BD10B5040000F000FD01200D498A +:10BBB0000870002001000C4A1170094908600B4808 +:10BBC000047010BD041C0028081C0028C0270900B0 +:10BBD0000C1C00289A1C0028141C0028101C00288B +:10BBE000001C0028BC1C0028BA1C0028BB1C002814 +:10BBF00070B5B14BC018C0090001C64BC318042969 +:10BC00000CD21F251C68CE002800B0408443D2B25D +:10BC10001540C800854025431D600CE0FC311F2500 +:10BC20005C68CE002800B0408443D2B21540C80002 +:10BC3000854025435D6070BD00B59F4A8018C009EE +:10BC40000001B44A8018042905D20068C900C84020 +:10BC5000C006C00E05E0FC314068C900C840C006FF +:10BC6000C00EC0B200BD00B5002A03D101228A4037 +:10BC7000426002E001228A40826000BD30B40300CD +:10BC80008C000F25596C2800A04081431540A54029 +:10BC90000D435D6430BC704730B403004C00103479 +:10BCA0000325D96C2800A04081431540A5400D43D1 +:10BCB000DD6430BC704700B5022801D301200FE0DD +:10BCC0000B00DBB2042B01DB012009E0A44B800058 +:10BCD0001818C9B2405C824201D3012000E0002064 +:10BCE00000BDF8B504001F00022C01D3012023E0A1 +:10BCF00015000E002A003100C9B22000FFF7DBFF5B +:10BD0000012801D1012017E03000C0B2002816D16F +:10BD1000FF2F12D8B74861034018A90040188021AE +:10BD2000490140180168B44A0A403902FF231B0246 +:10BD30000B40134303600020F2BD0120FCE7F6B284 +:10BD4000012E16D180204002874210D2A9486103FB +:10BD50004018A9004018A021490140180168BB4AB9 +:10BD60000A403902BA4B0B4013430360E3E701205A +:10BD7000E2E70120E0E700B20012C0B27047F8B578 +:10BD800005000F001600280000B2FFF7F4FF0400C2 +:10BD90002000C0B2022801D301202CE0320039007B +:10BDA000C9B22000C0B2FFF786FF012801D10120EF +:10BDB00021E090482100C9B2490341182A00D2B2BB +:10BDC00092008918C02212018A58A2491140FFB27C +:10BDD0003B02C02292001A400A43FF218A43F1B27B +:10BDE0001143E4B262038018EDB2AA008018C022A9 +:10BDF000120181500020F2BD70B50400022C01D365 +:10BE0000012028E015000E002A003100C9B22000F0 +:10BE1000FFF751FF012801D101201CE075486103A3 +:10BE20004158802212060A43C02189041143FF228F +:10BE300012040A43874B1340F6B23202C021890034 +:10BE400011401943FF229143EAB20A436103425071 +:10BE500061034058002070BD70B50400022C01D36E +:10BE6000012028E015000E002A003100C9B2200090 +:10BE7000FFF721FF012801D101201CE05D4861038B +:10BE800041588022D2050A43C02189041143FF2270 +:10BE900012040A436F4B1340F6B23202C0218900EC +:10BEA00011401943FF229143EAB20A436103425011 +:10BEB00061034058002070BD0000CFBFF0B58DB0C9 +:10BEC000684665493422F8F70FFF644F6A4601213E +:10BED0003800F8F7CCF80600002420006946087204 +:10BEE0006A4602213800F8F7C2F805000022012155 +:10BEF0003800FFF7B8FE002202213800FFF7B3FE3A +:10BF00003543002D01D1012000E02000C0B20DB06A +:10BF1000F0BD00000000304010B500F0ABF8002884 +:10BF200001D100201BE04E4C2000F8F7BDFA4D492E +:10BF30002000F8F733F9002801D000200FE020009E +:10BF4000F8F7BFFA4849884207D12000F8F7B5FA58 +:10BF50004649884201D1012000E00020C0B210BD56 +:10BF600098E8001070B5424C0021216000F046F8BE +:10BF7000002803D10120206000203AE0374E002243 +:10BF800001213000FFF76FFE354D37492800F8F7E3 +:10BF900096FA2800F8F782FA2800F8F740FD022008 +:10BFA000F9F78CF82800F8F784FA000405D4022089 +:10BFB000206000F03AF800201BE000220121300050 +:10BFC000FFF76AFE062201213000FFF757FE082224 +:10BFD00001213000FFF70CFE01213000FFF72CFE9D +:10BFE000082805D00320206000F01FF8002000E0A2 +:10BFF000012070BD00000440FF00FFFF38B5652838 +:10C0000001D3002010E000F087F80400144D210057 +:10C010002800F8F750FA2800F8F74FFAA04201D1AB +:10C02000012000E00020C0B232BD10B50C48F8F786 +:10C030003BFA0A4C00220121200000F07BF800228C +:10C040000221200000F076F810BD0000FF0000FF84 +:10C0500000FFFF00FFFCFFFFB0E40010800531404F +:10C06000001E584090E000101F4E0000204E0000BF +:10C07000B81B0028F8B5002500956846FBF7EAFBD9 +:10C08000002801D0002045E0274C0098A04205D3AD +:10C0900000982100F8F72AF8002901D0002039E0A3 +:10C0A00000982100F8F722F80400002C02D01F4865 +:10C0B000844201D300202DE0FF266A363000FFF7CE +:10C0C0005AFE0700002201213800FFF7C5FE0028B4 +:10C0D00001D000201EE0002201213000FFF74FFEBA +:10C0E000002801D0002015E023005B1E0022012162 +:10C0F0003800FFF7F6FD002801D000200AE00022FA +:10C1000001213800FFF778FE002801D1012000E06E +:10C110002800C0B2F2BD000000B5054948436421C3 +:10C12000F7F7E4FF00BD000080841E00010001005D +:10C13000204E000070B505000C0016000022210002 +:10C140002800FFF790FD3200D2B221002800FFF74F +:10C150004FFD002221002800FFF79EFD062221004E +:10C160002800FFF78BFD002221002800FFF77BFD50 +:10C1700070BD000070B5B14BC018C0090001C24BC2 +:10C18000C31804290CD21F251C68CE002800B0401B +:10C190008443D2B21540C800854025431D600CE0A1 +:10C1A000FC311F255C68CE002800B0408443D2B229 +:10C1B0001540C800854025435D6070BD00B59F4AAD +:10C1C0008018C0090001B04A8018042905D200680F +:10C1D000C900C840C006C00E05E0FC314068C90077 +:10C1E000C840C006C00EC0B200BD00B5002A03D1D1 +:10C1F00001228A40426002E001228A40826000BD42 +:10C2000030B403008C000F25596C2800A0408143F6 +:10C210001540A5400D435D6430BC704730B4030049 +:10C220004C0010340325D96C2800A04081431540F0 +:10C23000A5400D43DD6430BC704700B5022801D332 +:10C2400001200FE00B00DBB2042B01DB012009E031 +:10C25000A04B80001818C9B2405C824201D3012073 +:10C2600000E0002000BDF8B504001F00022C01D33F +:10C27000012023E015000E002A003100C9B2200081 +:10C28000FFF7DBFF012801D1012017E03000C0B229 +:10C29000002816D1FF2F12D8B34861034018A90017 +:10C2A00040188021490140180168B04A0A4039020B +:10C2B000FF231B020B40134303600020F2BD01204B +:10C2C000FCE7F6B2012E16D180204002874210D240 +:10C2D000A54861034018A9004018A0214901401851 +:10C2E0000168B14A0A403902BA4B0B40134303605C +:10C2F000E3E70120E2E70120E0E700B20012C0B26C +:10C300007047F8B505000F001600280000B2FFF7CF +:10C31000F4FF04002000C0B2022801D301202CE069 +:10C3200032003900C9B22000C0B2FFF786FF0128F1 +:10C3300001D1012021E08C482100C9B249034118F4 +:10C340002A00D2B292008918C02212018A58A2494A +:10C350001140FFB23B02C02292001A400A43FF2163 +:10C360008A43F1B21143E4B262038018EDB2AA002D +:10C370008018C022120181500020F2BD70B5040067 +:10C38000022C01D3012028E015000E002A00310004 +:10C39000C9B22000FFF751FF012801D101201CE0A4 +:10C3A000714861034158802212060A43C021890462 +:10C3B0001143FF2212040A43874B1340F6B23202A4 +:10C3C000C021890011401943FF229143EAB20A4378 +:10C3D0006103425061034058002070BD70B50400F5 +:10C3E000022C01D3012028E015000E002A003100A4 +:10C3F000C9B22000FFF721FF012801D101201CE074 +:10C400005948610341588022D2050A43C02189045A +:10C410001143FF2212040A436F4B1340F6B232025B +:10C42000C021890011401943FF229143EAB20A4317 +:10C430006103425061034058002070BD0000CFBF2F +:10C4400078B58DB0684665493422F8F74DFC644EE6 +:10C450006A4607213000F7F70AFE04000022072190 +:10C460003000FFF7C2FE00255E480560002C07D1B2 +:10C4700007213000FFF7A2FE002801D1012000E0D3 +:10C480002800C0B20EB070BD0000304010B500F002 +:10C49000B3F8002801D100201AE0534C2000F8F72F +:10C4A00003F852492000F7F779FE002801D0002058 +:10C4B0000EE02000F8F705F84D49884206D120002B +:10C4C000F7F7FBFF002801D1012000E00020C0B2F7 +:10C4D00010BD000098E8001070B5464C00212160A6 +:10C4E00000F046F8002803D10120206000203AE047 +:10C4F0003B4E002207213000FFF777FE3A4D3C49C2 +:10C500002800F7F7DCFF2800F7F7C8FF2800F8F746 +:10C5100086FA0220F8F7D2FD2800F7F7CAFF0004D8 +:10C5200005D40220206000F041F800201BE000222A +:10C5300007213000FFF772FE062207213000FFF7C7 +:10C540005FFE082207213000FFF714FE07213000AC +:10C55000FFF734FE082805D00320206000F026F8FD +:10C56000002000E0012070BD00000440FF00FFFF3C +:10C5700070B50400002C01D0652C01D3002012E01E +:10C58000200000F08BF80600174D31002800F7F767 +:10C5900092FF2800F7F791FFB04201D0002002E09F +:10C5A00010480460012070BDFF0000FF80B50E48F8 +:10C5B000F7F77AFF00F07AF800200A49086001BD19 +:10C5C00080B50948F7F775FFC10B0800C007C00F19 +:10C5D00002BD000000FFFF00FFFCFFFF7CE4001035 +:10C5E00000083140B01B0028802058401CE000109B +:10C5F0001F4E0000B41B0028F8B5002500956846C2 +:10C60000FBF728F9002801D0002045E0354C0098C0 +:10C61000A04205D300982100F7F768FD002901D05A +:10C62000002039E000982100F7F760FD0400002C9D +:10C6300002D02D48844201D300202DE0B726760099 +:10C640003000FFF75AFE0700032201213800FFF7F0 +:10C65000C5FE002801D000201EE003220121300089 +:10C66000FFF74FFE002801D0002015E023005B1EDD +:10C67000032201213800FFF7F6FD002801D0002039 +:10C680000AE0032201213800FFF778FE002801D1DB +:10C69000012000E02800C0B2F2BD000000B513493F +:10C6A00048436421F7F722FD00BD000010B5104C8F +:10C6B000002207212000FFF798FD0022072120001B +:10C6C000FFF758FD002207212000FFF7A7FD0622F3 +:10C6D00007212000FFF794FD002207212000FFF72B +:10C6E00084FD10BD80841E0001000100204E00006A +:10C6F0000008314038B50500082D0DD3914C1822A3 +:10C7000091492000FBF7F0F80020E075E8208F4900 +:10C7100008600020FBF748F98D486901401832BDD8 +:10C72000994B1B689BB212041A43120C120489B273 +:10C73000114381607047C0687047944B1B689BB27F +:10C7400012041A43120C120489B2114301600068EA +:10C750007047C069C00FC0B27047F8B502000E0044 +:10C76000002A01D105204EE00F2089490B681B0AE1 +:10C770000340002B01D1002007E00968090A0840A6 +:10C780000E2801D1012000E00220824940010F184B +:10C79000814C984D280011001022F8F7BFFA286844 +:10C7A00001218843286010212800FBF720F9924BD3 +:10C7B0002A000121380000F04CFC002804D00120A0 +:10C7C00021E0641E002C15D03800FFF7C2FF0028BE +:10C7D000F7D1002E08D010212800FBF707F9300010 +:10C7E00029001022F8F79AFA00F0B4F8012803D1D2 +:10C7F000032008E0022006E000F0ACF8002801D198 +:10C80000002000E00420F2BD38B50100002901D16C +:10C8100005202BE00F205E4A13681B0A0340002B03 +:10C8200001D1002007E01268120A10400E2801D141 +:10C83000012000E00220574A400115186D4C2000ED +:10C840001022F8F76BFA206801218843206010213C +:10C850002000FBF7CCF8684B22000121280000F0F3 +:10C86000F8FB002801D0012000E0002032BDFEB519 +:10C8700003001600002B03D001910198002801D17C +:10C8800005205DE00F2042490A68120A0240002A92 +:10C8900001D1002007E00968090A08400E2801D1EB +:10C8A000012000E002203B49400108180090804C24 +:10C8B000504D280019001022F8F730FA7D4F38004B +:10C8C00001991022F8F72AFA286801218843286084 +:10C8D000386801218843386010212800FBF787F869 +:10C8E00010213800FBF783F83B002A000121009853 +:10C8F00000F0AFFB002804D0012021E0641E002CD2 +:10C9000015D00098FFF725FF0028F7D1002E08D09A +:10C9100010212800FBF76AF8300029001022F8F7F0 +:10C92000FDF900F017F8012803D1032008E00220E8 +:10C9300006E000F00FF8002801D1002000E00420FC +:10C94000FEBD0000181B00289CDE0010E81B00281C +:10C950000010224010B5274C10212000FBF746F8AC +:10C960002068000F0007A0210906884201D100209D +:10C9700009E02068000F0007F0210906884201D174 +:10C98000012000E0022010BD60E9001064E9001001 +:10C990000000204000002240FFFFFF0F38B50400D8 +:10C9A000FFF7D8FF05002800C0B2022801D1424895 +:10C9B0000DE0002C04D0200027491022F8F7AEF932 +:10C9C000EDB2002D01D1002001E02348006832BD06 +:10C9D00000B5010F0907A0221206914201D10020E3 +:10C9E00006E0010F0907F0221206914200D03248FA +:10C9F00000BD0000601B0028E41B00281CB50200DD +:10CA00000B002E4803C86C4603C4083C6C46638088 +:10CA10002B4802606846F8F735F92A490020205E65 +:10CA2000F8F74FF90220FFF765FE0F21264A136839 +:10CA30001B0A0B40002B01D1002307E01268120AE9 +:10CA400011400E2901D1012300E00223002201211F +:10CA50009940FFF765FE13BD601B002870B50026E6 +:10CA600030000220FFF746FE04002000FFF763FEBF +:10CA700005000F2014490A68120A0240002A07D054 +:10CA80000968090A08400E2801D1012600E00226A3 +:10CA90002800F040C00705D509480168002901D0E9 +:10CAA000006880472A0CA9B22000FFF746FE70BD3F +:10CAB000FFFFFF00801B0028FFFFFF0F90E8001022 +:10CAC000E01B00285DCA00100000204050480068AC +:10CAD000410B0800C007C00F70474D480068010BAC +:10CAE0000800C007C00F704700B54A48012102681E +:10CAF0000A43026002680A40002AFBD100BD1FB54C +:10CB00000400C9B2012921D168461021FAF704F8BE +:10CB100069462000FFF721FE0100C9B2012901D1B9 +:10CB20005B481BE00100C9B2022901D13A4815E077 +:10CB3000C0B2042801D1394810E0009800F01CF977 +:10CB400000280BD1FFF7D0FF002007E02000FFF7FF +:10CB50005BFE002801D04E4800E0002004B010BD6C +:10CB60007FB50C001500002C01D14A484DE020682B +:10CB700000F0F0F8012802D06068002801D1454893 +:10CB800043E068461021F9F7C7FF00980002000A49 +:10CB9000C021C90401430091227AFF2000023E49CE +:10CBA000009B0B40120202401A430092637A009EDF +:10CBB000494A32401B04FF2636041E4016430096A5 +:10CBC000E27A019B19401202104008430190A07ABA +:10CBD0000199FF229143C0B208430190207B019943 +:10CBE0000902090A00060843019020680290606863 +:10CBF00003903A48A17A4900415A6068FAF7F7FE73 +:10CC00002900C9B26846FFF77AFF04B070BD000082 +:10CC1000000024400800244010005200FF00520091 +:10CC200010B50400FFF752FF002810D1EC200006D9 +:10CC30002018C0218902884201D2002026E0444801 +:10CC400020188021490288421FD200201EE0C02007 +:10CC50004002EC2109066118814201D2002015E052 +:10CC6000802109026B4AA2188A4201D200200DE0FD +:10CC7000EB221206A218824201D2002006E066488A +:10CC80002018884201D2002000E0012010BD0000E1 +:10CC9000040052000F005200FF00FFFF10B5040017 +:10CCA000FFF714FF002807D12948201880214902E6 +:10CCB00088420FD201200EE0802000025549611801 +:10CCC000814201D2012006E053496118814201D21C +:10CCD000012000E0002010BDFFFF00FFF0E7001082 +:10CCE00010B50400FFF7F9FE002810D1F02000066F +:10CCF0002018FE21C903884201D2002026E06548A1 +:10CD000020188021C90288421FD200201EE0FE2088 +:10CD10008003F02109066118814201D2002015E04C +:10CD2000802189025C4AA2188A4201D200200DE0CB +:10CD3000EE221206A218824201D2002006E05748D5 +:10CD40002018884201D2002000E0012010BD000020 +:10CD50000000FDEB10B504002000FFF761FF002884 +:10CD600001D1002007E02000FFF7BAFF002801D121 +:10CD7000002000E0012010BD80B5FFF729FE00284B +:10CD800001D1002044E04649884201D145483FE0B6 +:10CD90004549401A1CD0801E1DD0401E1DD0401E8B +:10CDA0001DD0401E1DD0001F1DD087381DD0401E35 +:10CDB0001DD012381DD0401E1DD0401E1DD0801E1B +:10CDC0001DD0801E1DD008381DD009381DD01EE092 +:10CDD000A420C0031CE035481AE0354818E0354867 +:10CDE00016E0354814E0354812E0354810E0354883 +:10CDF0000EE035480CE035480AE0354808E0354893 +:10CE000006E0354804E0354802E0354800E02548B2 +:10CE100002BD00000080FEEB0080FEEA38B584B061 +:10CE20000C001500002C01D12E4831E02068FFF7DE +:10CE300091FF012801D12B482AE02078800701D0FA +:10CE4000284825E068461021F9F766FE00980002A0 +:10CE5000000AA02149050143009120790099224A46 +:10CE60000A400002FF21090201401143009160794C +:10CE700000994C4A0A400004FF2109040140114373 +:10CE80000091206801902900C9B26846FFF737FE7B +:10CE900005B030BD000081EF0080C0EF0080C0ED24 +:10CEA000FFFFFF0FFF005200010000F001005200E1 +:10CEB000020052000300520004005200050052001C +:10CEC00006005200070052000800520009005200FC +:10CED0000A0052000B0052000C0052000D005200DC +:10CEE0000E0052000F005200FF00FFFF38B588B05F +:10CEF0000C001500002C01D12E4851E0606800287C +:10CF000001D12C484CE02068FFF78AFE012808D0A8 +:10CF10002068616889004018401EFFF781FE0128E3 +:10CF200001D124483CE068461021F9F7F5FD00984E +:10CF30000002000AA82189050143009120680190A0 +:10CF40006068401E80B20299090C090408430290EF +:10CF5000EDB2012D1CD104A81021F9F7DDFD04A9C3 +:10CF60006846FFF7FAFB0100C9B2012901D1104858 +:10CF700016E00100C9B2022901D10B4810E0C0B28D +:10CF8000042801D109480BE00498FFF7F5FE07E0FB +:10CF90006846FFF739FC002801D0054800E0002072 +:10CFA00009B030BDFFFF00FF10005200FF0052002B +:10CFB000040052000F00520080B5F7F7A0FB0028D4 +:10CFC00001D1002004E001201349087000F001F8AD +:10CFD00002BD80B510480078002805D069460420BD +:10CFE000F7F71CFC002801D1002004E06846008807 +:10CFF0000A490880012002BD08480088704780B5B2 +:10D00000064800880021064A0023F7F75DFA054A22 +:10D010000023F6F766FF02BDA21C0028981C00281A +:10D0200040787D0150FB4A00174A1268120C120426 +:10D0300089B2114381607047C160704701617047D8 +:10D0400000B50068C00F002801D1104800E00020A2 +:10D0500000BDF8B507000C0015001E003800FFF7F2 +:10D06000EFFF00280DD129003800FFF7E5FF310060 +:10D070003800FFF7E3FF21003800FFF7D5FF00205D +:10D0800000E00248F2BD00004CE9001001008A00F7 +:10D09000F8B584B0F8F7C9F8BA490127086803223F +:10D0A000904338430860B8480A6802400A60B749AC +:10D0B0000A6803239A433A430A600A6802400A60F6 +:10D0C000B3490A6803239A433A430A600A68024054 +:10D0D0000A60B0490A6803239A433A430A600A681F +:10D0E00010400860AC4801680F2291433943016049 +:10D0F000AA480168072291430160A94801680722F4 +:10D10000914304220A4302600168F0229143C02245 +:10D110000A4302600168C02292000A43026001686B +:10D12000C02212010A43026001689E4A0A4080211F +:10D13000490111430160E1480168802212060A4357 +:10D140000260DF48016839400029FAD001684908C7 +:10D1500039400029FAD0DB480168DB4A0A40026006 +:10D16000DA480168D84A0A40802149001143016029 +:10D17000D7480168D44A0A40802149001143016020 +:10D18000D4480168D04A0A400260D34801680722A7 +:10D19000914302220A430260D048016849004908CD +:10D1A0000160CF480168890A890229220A43026086 +:10D1B0000168CC4A0A4002600168802252040A4396 +:10D1C00002600168C84A0A400260016880221206B3 +:10D1D0000A430260C5480168C54A0A408021C90067 +:10D1E000114301600168FF229143AF220A430260AC +:10D1F000802189020268BF4B13400B4303608022E9 +:10D2000092040368BC4C1C4014430460BB4B04688C +:10D210001C400460046880252D0625430560B8483D +:10D2200004680725AC43022525430560B54804681A +:10D23000240E2406B44D254305600468B34D2540F3 +:10D24000802464052C430460046880252D06254352 +:10D250000560AF480468640064080460AD4C802534 +:10D26000AD002668A2483040284320602068FF2691 +:10D27000B04362260643266026689E4830408026DA +:10D28000F6020643266026689B483040024322602F +:10D290002068184020602068802212060243226025 +:10D2A0009D4802680724A2430224144304609B485B +:10D2B00002687F24A24328241443046002688C4C33 +:10D2C00014402C43046002688A4C144021430160DE +:10D2D0000168894A0A400260914902680A40026076 +:10D2E00002681A4002600268802424061443046025 +:10D2F0008C4802680724A243022414430460B04807 +:10D3000002687F24A2431E24144304600268784C00 +:10D310001440254305600268764C1440C0229202F6 +:10D32000224302600268744C144004600268114099 +:10D33000016001680B4003600168802212060A4305 +:10D340000260A048006838400028FAD09E48006873 +:10D3500038400028FAD09D48006838400028FAD0AC +:10D360009B48006838400028FAD09A480168072294 +:10D3700091430160684698491022F7F7B5FC0026F2 +:10D3800035E000BFC4132040FFFCFFFF0013204026 +:10D3900080132040A01320400000244000152640A8 +:10D3A00044152640FF8FFFFF32200021F7F746FE8D +:10D3B000300040B2800028180168302291432200DA +:10D3C00052B21201302313400B430360641E20004D +:10D3D00040B26946320052B25200895C00B209B2D2 +:10D3E0008842E1DA32200021F7F728FE761C30006F +:10D3F00040B208283FD2300040B204280DD1EFF3EC +:10D400001084002080F31088FA239B000022012161 +:10D41000102000F00BFA84F31088704D300040B2F9 +:10D420008000281801680F2291436A4633005BB2DE +:10D430005B00D21852781207120F0A4302603000C4 +:10D4400040B280002818016830220A430260300090 +:10D4500040B2800028180168802252000A4302600E +:10D46000300040B2800028180168802212060A436A +:10D4700002600224ABE75A48134A01681140016078 +:10D48000F821C94303680B400360564803681A40FB +:10D490000260026811400160F7F7A8FE5248016877 +:10D4A000802212060A43026001680F430760F7F703 +:10D4B00092FE00F039F805B0F0BD00BF1C15264003 +:10D4C0002415264010102040FF00FFFF08102040C8 +:10D4D0000C1020402003204004122640041926404E +:10D4E00008192640FFFFF8FFFFFFFFEF0019264055 +:10D4F000FFE0FFFFFFFFE0FFFFFFFFF9FFFFFFCFB0 +:10D500000812264014192640F1D24D00FFFFFF8F6C +:10D5100018192640101926400C12264000162640E5 +:10D52000FFFFFFF71012264038B586B068462F4936 +:10D530001822F7F7D9FB6846F9F740FFC0B2002878 +:10D540000ED02B4C18222B492000FAF7CDF90020E1 +:10D55000E075FF20A830284908600020FAF724FA77 +:10D56000264D2800FAF7BCF9C0B200280ED0204C96 +:10D57000182220492000FAF7B7F90020E075FF20B3 +:10D58000AA301D4908600020FAF70EFA1C4C2868E2 +:10D59000206020681B4940181B49F6F7A7FD1B496E +:10D5A00008601B4D20681B494018FA218900F6F7D6 +:10D5B0009DFD28602868C0031749086007B030BD8A +:10D5C000041626400C1926401C19264040162640F9 +:10D5D000441626401412264054E8001040122640FB +:10D5E000080020400804204008152640C4E7001029 +:10D5F000181B0028E4E10010E81B0028841C002808 +:10D60000881C00283F420F0040420F00901C002859 +:10D610008C1C0028E7030000941C0028F3B595B08B +:10D62000170000210D000800684601801C00A4B20C +:10D63000A408200080B280218900884203D30125FC +:10D64000684604807E4C1C9E00F011F9002800D032 +:10D6500099E06846877016A8077801A81021F9F7A5 +:10D660005BFA0198022188433100C9B249000222C5 +:10D67000114001430191019804218843FFB2B90090 +:10D680000422114001430191019808218843694611 +:10D690008978C900082211400143019101981021A5 +:10D6A00088430190019820218843019001984021EE +:10D6B000884301900198802101430191614F0198B5 +:10D6C000384015A909780902F82252010A4002439C +:10D6D000019201985C490140019101980002000A01 +:10D6E000A82149050143019111A81021F9F714FA65 +:10D6F0001198800A8002A4B2A105890D01431191FD +:10D7000052480068002806D101980740D020400107 +:10D710003843019007E0002805D001980740802099 +:10D72000400138430190002211A901A8FFF79FF89A +:10D73000EDB2002D03D06846008800F08DF809A8EE +:10D740001021F9F7E9F9099802218843F6B271002E +:10D75000022211400143099109983D490140099174 +:10D7600009983C49014080204002084309900998EB +:10D770000002000A8821490501430991002109A8F6 +:10D78000FEF7EBFF50E000F07DF80128FBD000F041 +:10D7900073F80128F7D10DA81021F9F7BDF90DA8EC +:10D7A0000078FD2101400DA801700DA800780C2122 +:10D7B00001430DA801700D980002000AB02149052F +:10D7C00001430D9100210DA8FEF7C7FF00F054F8AA +:10D7D000002829D1EDB2002D03D06846008800F062 +:10D7E0003BF805A81021F9F797F90598022188431D +:10D7F000F6B27100022211400143059105981449C7 +:10D8000001400591059813490140802040020843DA +:10D81000059005980002000A8821490501430591F9 +:10D82000002105A8FEF799FF17B0F0BD1CB5012433 +:10D8300000949BB2D2B2C9B2C0B2FFF7EFFE13BDE3 +:10D84000FF010000FFE0FFFFFF1FFFFF3007001791 +:10D85000FF00FFFFFFFF00FF0D490A680D4B13405B +:10D8600080B200050C4A02401A430A60704708481B +:10D870000068C00FC0B27047084801680800C007C0 +:10D88000C00F704705480068C00FC0B27047000065 +:10D8900028102640FFFF0FC00000F03F2C1026404C +:10D8A00000B5010009B2002905D40121C006C00E4F +:10D8B00081408F48016000BDF0B5020012B2002A1D +:10D8C00018D418228B4B040024B2A408A4001C59BD +:10D8D000FF250600F6001640B540AC438901C9B2E9 +:10D8E0000500ED002A409140214300B280088000ED +:10D8F00019501CE00F22804C182503001BB2134066 +:10D90000083B9B089B00060036B23240083A92085A +:10D910009200A258FF260700FF002F40BE40B243EE +:10D920008901C9B2C0000540A9401143E150F0BDD2 +:10D9300080B500F012F87148714902680A4002602F +:10D94000704802680A4002606F4802681140016036 +:10D9500000F092F800F0A9F801BDFEB568466B49E9 +:10D960000CC90CC008390838002630000AE06A46A5 +:10D970000300DBB2DB00D2185268521C11400029B0 +:10D980000ED1401C0100C9B200290AD107216A4604 +:10D990000300DBB2DB00D2580A40002AE7D0FEE7E2 +:10D9A000FEE75B4C072021680140002900D0FEE71C +:10D9B000584F3968491C0840002800D0FEE7350060 +:10D9C00024E068462900C9B2C90040184168684689 +:10D9D0002A00D2B2D200805800F044F815E030009E +:10D9E0000028EED02168491E68462A00D2B2D20033 +:10D9F000805800F037F868462900C9B2C9004018BD +:10DA000041683868401C00F02DF86D1C2800C0B239 +:10DA1000002826D168462900C9B2C900405800280C +:10DA200014D0206869462A00D2B2D20089588842B0 +:10DA30000AD368462900C9B2C90040184068216865 +:10DA4000884201D30120CBE73000C9E768462900AE +:10DA5000C9B2C9004018406821688842BFD301207C +:10DA6000BEE7F7BD80B50022002302E00CC00838F5 +:10DA700008308842FAD301BD30B5274880082749CD +:10DA8000274A002308E01C00E4B2A40014591D003A +:10DA9000EDB2AD004C515B1C1C000500E4B2EDB2D0 +:10DAA000AC42F0D31F48016030BD10B510231121E6 +:10DAB0001A4800221C00E4B2A4001459DBB29B00F7 +:10DAC000C4500B00DBB29B00D258C9B2890042504F +:10DAD00001210020FFF7F0FE00210120FFF7ECFEFE +:10DAE0000020FFF7DDFE0120FFF7DAFE10BD000089 +:10DAF00000E100E000E400E01CED00E00013204045 +:10DB0000FFFFF7FF80132040A0132040B8E800106B +:10DB1000DCE10010E0E1001080000000001D0028A2 +:10DB20000000001008ED00E000B5010009B2002976 +:10DB300005D40121C006C00E81404A48016000BDE5 +:10DB400000B5FEE780B54848006848480068C10F46 +:10DB5000002905D046498005800D8000085880477F +:10DB60000020FFF7E1FF01BD80B542480068424850 +:10DB70000068C10F002905D03D498005800D800057 +:10DB8000085880470120FFF7CFFF01BD80B53B4813 +:10DB900000683B480068C10F002905D03449800562 +:10DBA000800D8000085880470220FFF7BDFF01BDAF +:10DBB00080B53448006834480068C10F002905D09A +:10DBC0002B498005800D8000085880470320FFF70F +:10DBD000ABFF01BD80B52D4800682D480068C10F1E +:10DBE000002905D022498005800D80000858804713 +:10DBF0000420FFF799FF01BD80B52648006826483C +:10DC00000068C10F002905D019498005800D8000EA +:10DC1000085880470520FFF787FF01BD80B51F48E2 +:10DC200000681F480068C10F002905D01049800511 +:10DC3000800D8000085880470620FFF775FF01BD62 +:10DC400080B51848006818480068C10F002905D041 +:10DC500007498005800D8000085880470720FFF79E +:10DC600063FF01BD80E200E02CE9001000112040BC +:10DC70004809002830E900100411204034E9001060 +:10DC80000811204038E900100C1120403CE9001038 +:10DC90001011204040E900101411204044E9001008 +:10DCA0001811204048E900101C112040ACE600107B +:10DCB00004E8001080023140040000000800000069 +:10DCC000800658403A01000000093140020000007F +:10DCD0000A0F0D07E0010000FC530000982100002E +:10DCE000F4010000E8030000F401000038E7001030 +:10DCF00014E8001080023140050000000800000018 +:10DD0000000758403B0100000005314001000000C1 +:10DD10000AF0D07076010000E0150000D417000072 +:10DD20005E010000E8030000F401000054E7001069 +:10DD300024E800100004314000000000080000004A +:10DD400080095840400100000007314000000000F9 +:10DD5000090F0D0795030000901A0000282300000A +:10DD6000F4010000E8030000F401000070E7001077 +:10DD700034E800108000314000000000080000007E +:10DD8000000658403901000000063140050000003F +:10DD900009F0D07087020000201C000098210000CC +:10DDA000F4010000D0070000F401000080B5F3F793 +:10DDB0007FFAFCF773F9FCF761F8FA208000F7F7B7 +:10DDC0007DF9F4E710B5FEF73BFBFEF777F8FFF7B8 +:10DDD0005FF9F3F76DFAFEF733FB002803D0FEF787 +:10DDE0006DF8002801D1FFF7E1FF204C00F042F868 +:10DDF000206000F042F82068FBF7DEFFFCF76EF8C9 +:10DE0000002801D0FFF7D2FF62B6194CF5F7D4FF16 +:10DE100020602068002804D00120FCF737F8FFF7C5 +:10DE2000C5FF0120F4F7BDFFFCF778F8002804D106 +:10DE30000120FCF72BF8FFF7B9FFF7F719FA0028D4 +:10DE400001D1FFF7B3FFF7F76FFAFCF7C7F8FCF75C +:10DE500045F8002803D0F3F72BFAFCF71FF9FCF77D +:10DE60000DF8FA208000F7F729F9ECE7EC1B002801 +:10DE7000281200280648006870470020C043044963 +:10DE800008600449086000200349086070470000EA +:10DE9000001826400418264008102640443A5C68C2 +:10DEA00075616E672E7875657765695C4769745C26 +:10DEB000436F676E69746976655F4167656E745C10 +:10DEC0002E636F6465785F746D705C736561742D2B +:10DED0006669726D776172652D6275696C642D6219 +:10DEE00061643338633535313366393461393362CF +:10DEF0003532633831626334303338363763335CFC +:10DF0000636F6D6D6F6E5C7372635C64726976656E +:10DF100072735C6970635C63795F6970635F64727C +:10DF2000762E6800F1B401684118436858080A1851 +:10DF300000988068DB0701D54B46C01891422DD070 +:10DF40000D78491C032403262E4002D10E78F61CBE +:10DF5000491C2B090F2B07D10B780F33491C03E009 +:10DF60000F78491C0770401C761EF9D1002BE5D0B4 +:10DF70000E78491CAD082C40032C01D10C78491CAB +:10DF800024023419654244190025AE1E9E42D5D0A4 +:10DF90002678641C0670401C6D1CF6E700980C3057 +:10DFA000F2BC704700053140060000000000000090 +:10DFB000801890400200000000063140010000007F +:10DFC00000000000401990400500000000053140AD +:10DFD0000700000000000000C0189040030000008F +:10DFE000000531400500000000000000401890408E +:10DFF00001000000000631400200000000000000A7 +:10E000008019904006000000000631400600000024 +:10E0100000000000801A90400A0000000400000088 +:10E0200000000000000000000000000001000303E9 +:10E030001F4E000000000000000000000000000073 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000002030000BB +:10E0600000000000030000000000000003000000AA +:10E07000000000000300000000000000030000009A +:10E080000000000003000000010000000102000089 +:10E09000040000000000000000000000000000007C +:10E0A000010003031F4E00000000000000000000FC +:10E0B000204E0000000000000000000000000000F2 +:10E0C0000000000000000000000000000000000050 +:10E0D0000203000000000000030000000000000038 +:10E0E000030000000000000003000000000000002A +:10E0F0000300000000000000030000000100000019 +:10E100000102000004000000000000000000000008 +:10E110000000000001000303630000000000000095 +:10E1200000000000320000000000000000000000BD +:10E1300000000000000000000000000000000000DF +:10E1400000000000020300000000000003000000C7 +:10E1500000000000030000000000000003000000B9 +:10E1600000000000030000000000000003000000A9 +:10E17000010000000102000072B61048104908605A +:10E18000BFF34F8F0120C0040E490A6802430A60A2 +:10E190000D490A6802430A600C490A6802430A6092 +:10E1A000002000210D4A03C26A45FCD1084FB84740 +:10E1B000084FB847084FB847FEE7000000000010BE +:10E1C00008ED00E00013204080132040A013204001 +:10E1D00031D9001045E60010A9E7001000FF012822 +:10E1E000FFFF0128443A5C6875616E672E7875659B +:10E1F0007765695C4769745C436F676E69746976BB +:10E20000655F4167656E745C6669726D77617265A2 +:10E210005C7432675C747669696268386D5C7372CD +:10E22000635C73797374656D5C7265765F645C734F +:10E23000797374656D5F747669696268386D5F6360 +:10E240006D30706C75732E6300000000443A5C689A +:10E2500075616E672E7875657765695C4769745C72 +:10E26000436F676E69746976655F4167656E745C5C +:10E270006669726D776172655C7432675C74766929 +:10E28000696268386D5C7372635C6472697665722A +:10E29000735C737973636C6B5C63795F73797363BD +:10E2A0006C6B2E6800000000443A5C6875616E6714 +:10E2B0002E7875657765695C4769745C436F676E36 +:10E2C00069746976655F4167656E745C6669726DD5 +:10E2D000776172655C7432675C747669696268380C +:10E2E0006D5C7372635C647269766572735C73797A +:10E2F00073636C6B5C63795F737973636C6B2E63B0 +:10E3000000000000443A5C6875616E672E787565A0 +:10E310007765695C4769745C436F676E6974697699 +:10E32000655F4167656E745C6669726D7761726581 +:10E330005C7432675C636F6D6D6F6E5C7372635C8F +:10E34000647269766572735C7379737469636B5C0C +:10E3500063795F7379737469636B2E6300000000E7 +:10E36000443A5C6875616E672E7875657765695C9F +:10E370004769745C436F676E69746976655F41676E +:10E38000656E745C6669726D776172655C74326724 +:10E390005C636F6D6D6F6E5C7372635C6D775C66F2 +:10E3A0006C6173685C63795F6D775F666C617368DD +:10E3B0002E6300009F0F000000000000000000001E +:10E3C000000000000000000000000300000000004A +:10E3D000000000000000000000030000000000003A +:10E3E0000300000000000000030000000000000027 +:10E3F0000300000000000000030000000100000016 +:10E40000000000000100000000000000000000000B +:10E4100010000000100000001000000001000001CA +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400070B40123002413E00168001D194202D0BA +:10E450004D466918491E0C60091D121F042AFAD284 +:10E460000D00960701D50C80AD1C1A4000D02C7011 +:10E470000268001D002AE7D170BC70470000000050 +:10E480000600000000000000000000000000000086 +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B0000000000006000000000000000000000056 +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000008000000150000000F +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E510000000000000000000010000000E000000EC +:10E5200015000000000000000000000000000000D6 +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000001000000CA +:10E5500006000000000000000000000000000000B5 +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E580000000000006000000000000000000000085 +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000200000000000000983A000087 +:10E5C0000E01FA00CC0190010200000003000000DF +:10E5D00000000000983A0000720182001C02CC0189 +:10E5E000020000000500000000000000307500007F +:10E5F000F6001901BD02EE01020000000600000055 +:10E60000000000003075000087018C009501940126 +:10E610000200000001000000A8E80010B4E50010AE +:10E6200002000000A4E9001008003200020000000F +:10E63000B0E80010E4E5001002000000A0E90010BE +:10E640000C00320010B5074979441831064C7C445F +:10E65000163404E0081D0A68891888470100A142A1 +:10E66000F8D110BD0800000024000000D5FDFFFF18 +:10E67000CC0900000813002800000000A9F8FFFFE3 +:10E680005A030000380100000008002800000301C0 +:10E690000000000001000000000000000000000079 +:10E6A00001000000FF0F0100000000004D4F544F1B +:10E6B000525F494E325F4842375F4842385F484FA9 +:10E6C00052495A4F4E54414C0000000004207146FC +:10E6D000084202D0EFF3098001E0EFF3088000B5B3 +:10E6E0000149884700BD0000AF79001000F00EF826 +:10E6F000002801D0FFF7A6FF00BF00BF002000BF29 +:10E7000000BFFFF75FFB00F003F800000020704738 +:10E7100080B500F001F801BD0746384600F002F868 +:10E72000FBE7000080B500BF00BF024A11001820BF +:10E73000ABBEFBE7260002004D4F544F525F494EDF +:10E74000335F4842355F4842365F534541545F501E +:10E75000414E00004D4F544F525F494E345F484286 +:10E76000335F4842345F4241434B524553540000AB +:10E770004D4F544F525F494E315F4842315F4842DE +:10E78000325F4C4547524553540000000420714607 +:10E79000084201D0EFF30980EFF3088000B501498A +:10E7A000884700BD65E800100548014603B4684687 +:10E7B00080F3098800BF00BF00BF00BFFFF796FFCE +:10E7C000A5EDF5FE00127A00000000000024F40020 +:10E7D0000080000000800000008000009E029E0A71 +:10E7E000AA02AA0ACE03CE0B2A042A0C0003000BAD +:10E7F000010002000400080010002000400080001A +:10E8000000010002484F52495A4F4E54414C5F4854 +:10E81000414C4C00534541545F50414E5F48414C80 +:10E820004C0000004241434B524553545F48414C19 +:10E830004C0000004C4547524553545F48414C4CF6 +:10E8400000000000E02E0000401F0000E02E00004D +:10E85000102700000003000100040103020200026F +:10E86000000300058169891E0978C9B201607047FB +:10E870000000000000010101010101000001000091 +:10E880000203040506080C10000000000000000050 +:10E890000200000001000000040300011314001531 +:10E8A000C7010300010000004001BE00F401AE01F9 +:10E8B00087018C009501940100080028FFFF0128C2 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000001020371 +:10E9A00032325A325A5A5A32000102035A5A5A5AC9 +:10E9B000FEE70000FEE70000FEE70000FEE70000C3 +:10E9C000FEE70000FEE70000FEE70000FEE70000B3 +:10E9D000FEE70000FEE70000FEE7400455000200ED +:10E9E0000100015003459C0010000132FD0CA00401 +:10E9F0000900040101000112050E83DCE728600410 +:10EA0000FFFFFF1F020225920807F001035240009A +:10EA100001F2060218F2060418F2060618F20608B9 +:10EA200018F306005478F10618F2060418F20606E8 +:10EA300018F2050818F002FF41DB001004F1FF0492 +:10EA4000F1FF04F1FF04F1FF04F1FF04F1FF04F111 +:10EA5000FF04F147046C0248090028060AF3210666 +:10EA60000001F12334F25208680009010101020398 +:10EA70000203010F0F010000000000000000000071 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:01EBF0000024 +:040000051000E7A957 :00000001FF diff --git a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out index 0a1d75c..87949f4 100755 Binary files a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out and b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out differ diff --git a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim index b98ad53..19e8ea5 100755 Binary files a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim and b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim differ diff --git a/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/07_dynamic_modes.py b/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/07_dynamic_modes.py new file mode 100644 index 0000000..2e07ed4 --- /dev/null +++ b/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/07_dynamic_modes.py @@ -0,0 +1,577 @@ +"""Revision-13 native dynamic-mode CAN/Hall verification for ZCANPRO. + +Run this file from the ZCANPRO extension-script window after programming the +repository HEX. It validates one complete rocking-horse cycle and one +complete cradle cycle, then stops safely. STOP_ALL and thermal-off are always +attempted from ``finally``. +""" + +import importlib +import os +import sys +import time + +# ZCANPRO keeps one interpreter for scripts from multiple worktrees. Loading +# by a unique module name prevents an older desktop copy of ``hil_common`` +# from winning through ``sys.modules`` or the retained import search path. +_BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +_COMMON_PATH = os.path.join(_BASE_DIR, "hil_common.py") +_COMMON_NAME = "cognitive_agent_dynamic_hil_common_v13" +_COMMON_SPEC = importlib.util.spec_from_file_location(_COMMON_NAME, _COMMON_PATH) +if _COMMON_SPEC is None or _COMMON_SPEC.loader is None: + raise RuntimeError("Cannot load repository hil_common.py") +_hil_common = importlib.util.module_from_spec(_COMMON_SPEC) +sys.modules[_COMMON_NAME] = _hil_common +_COMMON_SPEC.loader.exec_module(_hil_common) +HilSession = _hil_common.HilSession +command_payload = _hil_common.command_payload +parse_302 = _hil_common.parse_302 +parse_303 = _hil_common.parse_303 +parse_306 = _hil_common.parse_306 + + +SELECTED_MODES = ("ROCKING_HORSE", "DYNAMIC_CRADLE") +EXPECTED_REVISION = 13 +EXPECTED_MAX_HALL = (480, 374, 917, 647) +HALL_TOLERANCE = 3 +PHASE_DURATION_TOLERANCE_S = 0.55 +ARRIVAL_SPREAD_TOLERANCE_S = 1.00 +ARRIVAL_EARLY_TOLERANCE_S = 1.00 +LINKED_REFERENCE_PROGRESS = 0.25 +LINKED_MIN_CUSHION_PROGRESS = 0.15 + +MODE_DEFINITIONS = { + "ROCKING_HORSE": { + "mode_id": 1, + "sequence": 0x0700, + "first_phase": 2, + "cycle_duration_ms": None, + "entry_target": (320, 190, 500, 430), + "phase_order": (2, 3), + "phases": { + 2: { + "name": "rock_forward", + "completion": "all_targets_reached", + "timeout_ms": 15000, + "target": (270, 250, 460, 400), + "moving_axes": (0, 1, 2, 3), + "continuous_four_axis_cruise": True, + }, + 3: { + "name": "rock_backward", + "completion": "all_targets_reached", + "timeout_ms": 15000, + "target": (370, 130, 540, 460), + "moving_axes": (0, 1, 2, 3), + "continuous_four_axis_cruise": True, + }, + }, + }, + "DYNAMIC_CRADLE": { + "mode_id": 2, + "sequence": 0x0720, + "first_phase": 5, + "cycle_duration_ms": None, + "entry_target": (391, 140, 405, 404), + "phase_order": (5, 6), + "phases": { + 5: { + "name": "forward", + "completion": "all_targets_reached", + "timeout_ms": 30000, + "target": (246, 281, 701, 494), + "moving_axes": (0, 1, 2, 3), + "continuous_four_axis_cruise": True, + }, + 6: { + "name": "return", + "completion": "all_targets_reached", + "timeout_ms": 30000, + "target": (391, 140, 405, 404), + "moving_axes": (0, 1, 2, 3), + "continuous_four_axis_cruise": True, + }, + }, + }, +} + +session = None + + +def z_notify(event_type, obj): + del obj + if event_type == "stop" and session is not None: + session.request_stop() + + +def hall_snapshot(s, capture_s=0.35): + if capture_s > 0: + s.capture_state(capture_s, clear=False) + values = [] + for motor in range(4): + diagnostic = s.latest.get((0x303, motor)) + values.append(None if diagnostic is None else diagnostic["hall"]) + return values + + +def hall_match(actual, expected): + return all( + value is not None and abs(value - target) <= HALL_TOLERANCE + for value, target in zip(actual, expected) + ) + + +def wait_idle_status(s, timeout_s=3.0): + deadline = time.monotonic() + timeout_s + latest = None + while time.monotonic() < deadline and not s.stop_requested: + for can_id, data, frame in s.receive(): + del frame + if can_id != 0x306: + continue + latest = parse_306(data) + if latest is not None and latest["mode_id"] == 0 and \ + latest["state"] == 0: + return latest + time.sleep(0.005) + return latest + + +def stop_dynamic(s, sequence, label): + response = s.send_command( + command_payload(0x0F, 0, 0, sequence), + expected_ack=1, + expected_reject=0, + timeout_s=2.0, + note=label + " STOP_DYNAMIC", + ) + idle = wait_idle_status(s) + passed = response is not None and response["ack"] == 1 and \ + response["reject"] == 0 and idle is not None and \ + idle["mode_id"] == 0 and idle["state"] == 0 + s.record(label + "-STOP", passed, + {"ack": response, "dynamic_status": idle}, + "Opcode 0x0F accepted and 0x306 returns IDLE") + return passed + + +def new_segment(status, observed_at, start_hall): + phase_start = observed_at - status["phase_elapsed_ms"] / 1000.0 + return { + "cycle_index": status["cycle_index"], + "phase": status["phase"], + "phase_start": phase_start, + "first_observed": observed_at, + "last_status": dict(status), + "first_active": {}, + "arrival": {}, + "arrival_source": {}, + "terminal": {}, + "target_hall_at_end": None, + "start_hall": list(start_hall), + "latest_hall": list(start_hall), + "cruise_checkpoint": None, + } + + +def observe_cycle(s, label, definition): + expected_order = definition["phase_order"] + first_phase = definition["first_phase"] + segments = [] + current = None + started = False + deadline = time.monotonic() + 115.0 + failure_status = None + + while time.monotonic() < deadline and not s.stop_requested: + frames = s.receive() + if not frames: + time.sleep(0.005) + continue + now = time.monotonic() + for can_id, data, frame in frames: + del frame + if can_id == 0x306: + status = parse_306(data) + if status is None or status["mode_id"] != definition["mode_id"]: + continue + if status["state"] == 3: + failure_status = status + break + phase = status["phase"] + if phase not in definition["phases"]: + continue + key = (status["cycle_index"], phase) + current_key = None if current is None else ( + current["cycle_index"], current["phase"]) + if key != current_key: + if current is not None: + current["target_hall_at_end"] = hall_snapshot(s, 0) + segments.append(current) + current = new_segment(status, now, hall_snapshot(s, 0)) + if phase == first_phase: + if not started: + started = True + elif status["cycle_index"] >= 1: + # Capture the returned Step-1 pose now, before the + # next Step-1 -> Step-2 movement changes Hall. + current["target_hall_at_end"] = hall_snapshot(s, 0) + elif current is not None: + current["last_status"] = dict(status) + elif can_id == 0x302 and current is not None: + motor = parse_302(data) + if motor is None or motor["motor"] >= 4: + continue + motor_id = motor["motor"] + if motor["active"]: + current["first_active"].setdefault(motor_id, now) + if current["cycle_index"] >= 1 and \ + current["phase"] == first_phase and all( + axis in current["first_active"] + for axis in definition["phases"][first_phase]["moving_axes"] + ): + # Step 3 and Step 1 have the same Hall pose, so their + # boundary has no physical displacement. The next + # observable requirement is that all four axes launch + # the following Step-1 -> Step-2 leg synchronously. + segments.append(current) + current = None + break + elif motor_id in current["first_active"]: + current["terminal"][motor_id] = { + "time": now, + "status": dict(motor), + } + if definition["phases"][current["phase"]].get( + "completion") != "all_targets_reached": + current["arrival"].setdefault(motor_id, now) + current["arrival_source"].setdefault( + motor_id, "0x302 COMPLETE") + elif can_id == 0x303: + diagnostic = parse_303(data) + if diagnostic is not None and diagnostic["fault_flags"]: + failure_status = diagnostic + break + if diagnostic is not None and current is not None: + motor_id = diagnostic["motor"] + current["latest_hall"][motor_id] = diagnostic["hall"] + target = definition["phases"][current["phase"]]["target"][motor_id] + if motor_id in current["first_active"] and \ + abs(diagnostic["hall"] - target) <= HALL_TOLERANCE: + # A phase may roll into the next command before the + # staggered 0x302 slot publishes COMPLETE for the last + # axis. The independent 0x303 Hall target is equivalent + # physical arrival evidence and avoids a telemetry race. + current["arrival"].setdefault(motor_id, now) + current["arrival_source"].setdefault( + motor_id, "0x303 Hall target") + phase_definition = definition["phases"][current["phase"]] + if phase_definition.get("continuous_four_axis_cruise") and \ + current["cruise_checkpoint"] is None: + progress = [] + for axis in range(4): + start = current["start_hall"][axis] + end = phase_definition["target"][axis] + hall = current["latest_hall"][axis] + if start is None or hall is None: + progress.append(0.0) + else: + travel = abs(end - start) + progress.append( + 1.0 if travel == 0 else + min(1.0, abs(hall - start) / float(travel)) + ) + if progress[0] >= LINKED_REFERENCE_PROGRESS and \ + progress[2] >= LINKED_REFERENCE_PROGRESS: + current["cruise_checkpoint"] = { + "elapsed_s": now - current["phase_start"], + "normalized_progress": progress, + "hall": list(current["latest_hall"]), + } + if failure_status is not None: + break + if current is None and started and segments and \ + segments[-1]["cycle_index"] >= 1 and \ + segments[-1]["phase"] == first_phase: + break + + complete = ( + failure_status is None + and len(segments) == len(expected_order) + 1 + and tuple(item["phase"] for item in segments[:-1]) == expected_order + and segments[-1]["phase"] == first_phase + and segments[-1]["cycle_index"] >= 1 + ) + return complete, segments, failure_status + + +def validate_segments(s, label, definition, segments): + phase_results = [] + for index, segment in enumerate(segments[:-1]): + phase_definition = definition["phases"][segment["phase"]] + next_segment = segments[index + 1] + observed_duration = next_segment["phase_start"] - segment["phase_start"] + target_completion = phase_definition.get("completion") == \ + "all_targets_reached" + if target_completion: + expected_duration = None + arrival_grace = 0.0 + timeout_s = phase_definition["timeout_ms"] / 1000.0 + duration_ok = 0.0 < observed_duration <= ( + timeout_s + PHASE_DURATION_TOLERANCE_S) + else: + expected_duration = phase_definition["duration_ms"] / 1000.0 + arrival_grace = phase_definition["arrival_grace_ms"] / 1000.0 + timeout_s = expected_duration + arrival_grace + duration_ok = ( + observed_duration >= expected_duration - + PHASE_DURATION_TOLERANCE_S + and observed_duration <= expected_duration + arrival_grace + + PHASE_DURATION_TOLERANCE_S + ) + + moving_axes = phase_definition["moving_axes"] + terminals = segment["terminal"] + arrivals = segment["arrival"] + active_starts = segment["first_active"] + if moving_axes: + all_active_seen = all(axis in active_starts for axis in moving_axes) + all_arrival_seen = all(axis in arrivals for axis in moving_axes) + start_times = [active_starts[axis] for axis in moving_axes + if axis in active_starts] + terminal_times = [arrivals[axis] for axis in moving_axes + if axis in arrivals] + start_spread = max(start_times) - min(start_times) \ + if len(start_times) == len(moving_axes) else None + arrival_spread = max(terminal_times) - min(terminal_times) \ + if all_arrival_seen else None + latest_arrival = max(terminal_times) - segment["phase_start"] \ + if all_arrival_seen else None + terminal_status_ok = all_arrival_seen if target_completion else all( + value["status"]["task"] == 6 + and value["status"]["result"] == 2 + for value in terminals.values() + ) and all_arrival_seen + used_arrival_grace = False if target_completion else ( + observed_duration > expected_duration + + PHASE_DURATION_TOLERANCE_S + ) + sync_ok = ( + all_active_seen + and all_arrival_seen + and start_spread <= ARRIVAL_SPREAD_TOLERANCE_S + # When the loaded bench cannot meet the nominal arrival time, + # faster axes stop at target while the healthy slow axis uses + # its bounded grace. Simultaneous start remains mandatory; + # arrival spread is only an exact-timing assertion when the + # phase did not need that grace. + and arrival_spread <= ARRIVAL_SPREAD_TOLERANCE_S + and (target_completion or latest_arrival >= + expected_duration - ARRIVAL_EARLY_TOLERANCE_S) + and latest_arrival <= timeout_s + PHASE_DURATION_TOLERANCE_S + and terminal_status_ok + ) + else: + start_spread = 0.0 + arrival_spread = 0.0 + latest_arrival = None + used_arrival_grace = False + sync_ok = not active_starts and segment["last_status"]["active_mask"] == 0 + + target_ok = hall_match( + segment["target_hall_at_end"], phase_definition["target"] + ) + checkpoint = segment["cruise_checkpoint"] + if phase_definition.get("continuous_four_axis_cruise"): + cruise_ok = checkpoint is not None and \ + checkpoint["normalized_progress"][1] >= \ + LINKED_MIN_CUSHION_PROGRESS + else: + cruise_ok = True + passed = duration_ok and sync_ok and target_ok and cruise_ok + details = { + "phase": phase_definition["name"], + "cycle_index": segment["cycle_index"], + "expected_duration_s": expected_duration, + "arrival_grace_s": arrival_grace, + "completion": phase_definition.get("completion", "elapsed_time"), + "timeout_s": timeout_s, + "observed_duration_s": round(observed_duration, 3), + "used_arrival_grace": used_arrival_grace, + "moving_axes": list(moving_axes), + "active_start_spread_s": None if start_spread is None else round(start_spread, 3), + "arrival_spread_s": None if arrival_spread is None else round(arrival_spread, 3), + "latest_arrival_from_phase_start_s": ( + None if latest_arrival is None else round(latest_arrival, 3) + ), + "terminal_status": { + str(axis): terminals[axis]["status"] + for axis in terminals + }, + "arrival_source": { + str(axis): segment["arrival_source"][axis] + for axis in arrivals + }, + "actual_hall_at_phase_end": segment["target_hall_at_end"], + "expected_hall_at_phase_end": list(phase_definition["target"]), + "duration_ok": duration_ok, + "synchronization_ok": sync_ok, + "target_ok": target_ok, + "continuous_four_axis_cruise_ok": cruise_ok, + "cruise_checkpoint": checkpoint, + } + s.record("%s-%s" % (label, phase_definition["name"].upper()), + passed, details, + "continuous cruise, synchronized start/arrival, and Hall target within tolerance") + phase_results.append(passed) + + cycle_duration = segments[-1]["phase_start"] - segments[0]["phase_start"] + if definition["cycle_duration_ms"] is None: + cycle_expected = None + cycle_grace = 0.0 + cycle_limit = sum( + definition["phases"][phase]["timeout_ms"] + for phase in definition["phase_order"] + ) / 1000.0 + cycle_ok = 0.0 < cycle_duration <= cycle_limit + \ + PHASE_DURATION_TOLERANCE_S + else: + cycle_expected = definition["cycle_duration_ms"] / 1000.0 + cycle_grace = sum( + definition["phases"][phase]["arrival_grace_ms"] + for phase in definition["phase_order"] + ) / 1000.0 + cycle_tolerance = PHASE_DURATION_TOLERANCE_S * \ + len(definition["phase_order"]) + cycle_limit = cycle_expected + cycle_grace + cycle_ok = ( + cycle_duration >= cycle_expected - cycle_tolerance + and cycle_duration <= cycle_limit + cycle_tolerance + ) + repeat_hall = segments[-1]["target_hall_at_end"] + repeat_starts = segments[-1]["first_active"] + repeat_axes = definition["phases"][first_phase]["moving_axes"] + repeat_start_values = [repeat_starts[axis] for axis in repeat_axes + if axis in repeat_starts] + repeat_start_spread = max(repeat_start_values) - min(repeat_start_values) \ + if len(repeat_start_values) == len(repeat_axes) else None + repeat_ok = hall_match(repeat_hall, definition["entry_target"]) and \ + repeat_start_spread is not None and \ + repeat_start_spread <= ARRIVAL_SPREAD_TOLERANCE_S + s.record(label + "-CYCLE-REPEAT", cycle_ok and repeat_ok, + {"expected_cycle_s": cycle_expected, + "maximum_cycle_s": cycle_limit, + "observed_cycle_s": round(cycle_duration, 3), + "cycle_index": segments[-1]["cycle_index"], + "actual_repeat_hall": repeat_hall, + "expected_repeat_hall": list(definition["entry_target"]), + "next_cycle_active_start_spread_s": ( + None if repeat_start_spread is None else + round(repeat_start_spread, 3) + )}, + "one complete cycle reaches Step 1 and synchronously starts the next Step 2 leg") + return all(phase_results) and cycle_ok and repeat_ok + + +def run_mode(s, label, definition): + start = s.send_command( + command_payload(0x0E, 0, 0, definition["sequence"], + definition["mode_id"], 0), + expected_ack=1, + expected_reject=0, + timeout_s=2.0, + note=label + " START_DYNAMIC_MODE", + ) + accepted = start is not None and start["ack"] == 1 and \ + start["reject"] == 0 and start["opcode"] == 0x0E + s.record(label + "-START", accepted, start, + "Opcode 0x0E accepted for native mode_id=%d" % definition["mode_id"]) + if not accepted: + return False + + complete, segments, failure = observe_cycle(s, label, definition) + s.record(label + "-PHASE-SEQUENCE", complete, + {"observed": [ + {"cycle_index": item["cycle_index"], "phase": item["phase"]} + for item in segments + ], "failure": failure}, + "0x306 reports one ordered cycle and automatic repeat") + validated = complete and validate_segments(s, label, definition, segments) + stopped = stop_dynamic(s, definition["sequence"] + 1, label) + return validated and stopped + + +def z_main(): + global session + session = None + results = {} + try: + selected = tuple(str(value).strip().upper() for value in SELECTED_MODES) + unknown = [value for value in selected if value not in MODE_DEFINITIONS] + if unknown: + raise RuntimeError("Unknown SELECTED_MODES=" + repr(unknown)) + session = HilSession("07_dynamic_modes") + s = session + s.write_operator_template([ + "Secure the empty seat bench and keep hardware E-stop reachable.", + "ROCKING_HORSE pitches forward/back smoothly with all axes engaged: PASS/FAIL ___", + "DYNAMIC_CRADLE moves forward/returns smoothly without steps: PASS/FAIL ___", + "No unintended thermal output, noise, collision, or cable strain: PASS/FAIL ___", + ]) + s.thermal_off() + s.stop_all(0) + initial = s.capture_state(2.0) + system = initial["system"] + ready = ( + system is not None + and system["firmware_revision"] == EXPECTED_REVISION + and system["position_valid_mask"] == 0x0F + and system["active_mask"] == 0 + and system["faulted_mask"] == 0 + and all( + item is not None + and abs(item["max_hall"] - EXPECTED_MAX_HALL[index]) + <= max(4, round(EXPECTED_MAX_HALL[index] * 0.05)) + for index, item in enumerate(initial["diagnostics"]) + ) + ) + s.record("DYNAMIC-PRECONDITION", ready, initial, + "revision 13, four valid axes, no active/fault, confirmed ranges") + if not ready: + for label in selected: + s.record(label + "-MODE", False, "not executed", + "dynamic precondition failed", status="NOT_RUN") + return + + for label in selected: + if s.stop_requested: + break + results[label] = run_mode(s, label, MODE_DEFINITIONS[label]) + # A native-mode failure is isolated by STOP_DYNAMIC inside + # run_mode(). Continue with the other definition so one + # physically infeasible trajectory cannot hide its HIL result. + time.sleep(0.5) + except Exception as error: + if session is not None: + session.record("SCRIPT", False, repr(error), "unhandled exception") + finally: + if session is not None: + try: + session.stop_all(0) + session.thermal_off() + except Exception as error: + session.log("FINAL_SAFE_OFF_ERROR " + repr(error)) + final_state = None + try: + final_state = session.capture_state(1.0) + except Exception as error: + session.log("FINAL_CAPTURE_ERROR " + repr(error)) + session.finish({ + "selected_modes": list(SELECTED_MODES), + "mode_results": results, + "expected_firmware_revision": EXPECTED_REVISION, + "hall_tolerance_pulses": HALL_TOLERANCE, + "phase_duration_tolerance_s": PHASE_DURATION_TOLERANCE_S, + "arrival_spread_tolerance_s": ARRIVAL_SPREAD_TOLERANCE_S, + "final_state": final_state, + }) diff --git a/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/README_CN.md b/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/README_CN.md index c3f0d5a..4106356 100644 --- a/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/README_CN.md +++ b/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/README_CN.md @@ -41,6 +41,26 @@ Bus-Off、加热ADC错误和DRV8718故障只有在具备对应故障注入条件 脚本启动时会强制重新加载 `hil_common.py`。ZCANPRO使用常驻Python解释器,若不重载,修改公共辅助模块后再次运行可能继续使用旧类定义;日志中的 `HIL_COMMON_VERSION` 可用于确认实际加载版本。 +### Revision 13 动态模式 + +烧录 revision 13 后,在 ZCANPRO 扩展脚本窗口运行 `07_dynamic_modes.py`。脚本先验证 +`0x301` 的固件版本、四轴 PositionValid/MaxHall 与故障状态,再依次运行木马模式和动态摇篮。 +验收证据包括 `0x306` 阶段顺序/自动续环、`0x302` 四轴同步启停与终态、`0x303` 精确 Hall +目标;任一失败或脚本停止都会发送 `STOP_ALL` 并关闭热管理。两种模式均须由停止指令终止, +未收到停止时由ECU在启动累计10分钟后自动停止。 + +木马入口为`[320,190,500,430]`,随后在前俯`[270,250,460,400]`和后仰 +`[370,130,540,460]`之间连续往复,不设置停驻。坐盆峰峰行程120 Hall、折算垂直分量约 +18 mm;水平峰峰行程100 Hall且巡航占空比90%,用于抵消坐盆斜向运动的反向水平分量。每个半周期四轴同批启动,先到目标前 +8 Hall会合,再以50% Duty完成等距末段。配置入口为`Config/seat_dynamic_mode_config.h`,N7 +长期库`config/modes/vehicles/denza_n7/rocking_horse.yaml`必须镜像同一参数。 + +2026-08-04 revision 13实物复测:稳态前俯/后仰启动离散0.077/0.052 s,到位离散 +0.337/0.182 s;四轴在巡航检查点均持续推进,目标误差不超过1 Hall。按实测M0 MaxHall=499 +换算水平峰峰行程约43.1 mm,扣除坐盆估算反向水平分量后净摆幅约26.7 mm;自动进入下一轮, +`STOP_DYNAMIC(0x0F)`后`0x306`全零且无FAULT,PASS。证据为 +`artifacts/hil/rocking_horse_rev13_horizontal_compensation_20260804.json`。 + - 通风1/2/3档、关闭;加热1/2/3档、关闭;通风2档+加热2档。 - 每轴从当前位置偏移约12%并回到原位置,验证M0/M1/M2/M3的执行器、方向、CAN ACK、终态位置和Hall反馈。 - 若SMV8位置有效则直接使用且不发生归零动作;若某轴无效则先仅将该轴回最近端,验证Hall≈0与MaxHall保持不变后再测试。 diff --git a/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/hil_common.py b/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/hil_common.py index 307a6af..725314d 100644 --- a/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/hil_common.py +++ b/firmware/t2g/Seat_Controller_demo/Tests/manual_hil/hil_common.py @@ -9,8 +9,8 @@ import time import zcanpro -SEAT_RX_IDS = (0x301, 0x302, 0x303, 0x304, 0x305, 0x4FA) -HIL_COMMON_VERSION = "2026-07-30-hall-current-stall-v4" +SEAT_RX_IDS = (0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x4FA) +HIL_COMMON_VERSION = "2026-08-04-dynamic-modes-v8" CONFIRMED_MAX_HALL = (480, 374, 917, 647) HOME_KNOWN_RANGE_KEY = 0x4B52 HOME_LEG_TIMEOUT_S = 120 @@ -112,6 +112,20 @@ def parse_305(data): } +def parse_306(data): + if data is None or len(data) < 8: + return None + return { + "mode_id": data[0], + "state": data[1], + "phase": data[2], + "active_mask": data[3] & 0x0F, + "fault_mask": (data[3] >> 4) & 0x0F, + "cycle_index": data[4] | (data[5] << 8), + "phase_elapsed_ms": data[6] | (data[7] << 8), + } + + def command_payload(opcode, motor, direction, sequence, param_a=0, param_b=0, version=1): control = ((version & 0x03) << 4) | ((direction & 0x03) << 2) | \ @@ -228,6 +242,8 @@ class HilSession(object): value["hall_activity_low"] elif can_id == 0x305: self.latest[0x305] = parse_305(data) + elif can_id == 0x306: + self.latest[0x306] = parse_306(data) elif can_id == 0x4FA: self.latest[0x4FA] = data output.append((can_id, data, frame)) @@ -311,7 +327,7 @@ class HilSession(object): def capture_state(self, duration_s=2.0, clear=True): if clear: for key in list(self.latest): - if key in (0x301, 0x305) or isinstance(key, tuple): + if key in (0x301, 0x305, 0x306) or isinstance(key, tuple): del self.latest[key] deadline = time.monotonic() + duration_s while time.monotonic() < deadline and not self.stop_requested: @@ -325,6 +341,7 @@ class HilSession(object): "currents": [self.latest.get((0x304, motor)) for motor in range(4)], "thermal_current": self.latest.get(0x305), + "dynamic_mode": self.latest.get(0x306), } def reset_current_peaks(self, motor=None): diff --git a/platforms/t2g_cabin_bench/calibration/body_can.yaml b/platforms/t2g_cabin_bench/calibration/body_can.yaml new file mode 100644 index 0000000..63dbcc2 --- /dev/null +++ b/platforms/t2g_cabin_bench/calibration/body_can.yaml @@ -0,0 +1,51 @@ +version: 1.0.0 +status: imported_from_can_dev_and_runtime_verified +source: + repository: https://git.kendeji.fun/dev-team/project-code + branch: CAN_DEV + commit: 6e7ed04a468dfcde7efda9e30bc15144bf02faf9 + implementation: Cognitive_Agent/native/canfd/can_read_trans.cpp +adapter: + device: ZLG_USBCANFD_200U + device_type: 41 + device_index: 0 + channel_env: COGNITIVE_AGENT_VEHICLE_CAN_CHANNEL + default_channel: 1 + termination_default: false +can_fd: + clock_hz: 60000000 + controller_mode: 0 + work_mode: normal + standard: iso + arbitration: + bitrate: 500000 + tseg1: 14 + tseg2: 3 + sjw: 2 + smp: 0 + brp: 5 + total_tq: 20 + sample_point_pct: 80 + data: + bitrate: 2000000 + tseg1: 10 + tseg2: 2 + sjw: 2 + smp: 0 + brp: 1 + total_tq: 15 + sample_point_pct: 80 +air_outlet: + direction_convention: + horizontal: minimum_left_maximum_right + vertical: minimum_down_maximum_up + ranges: + driver_left: {horizontal: [-25, 40], vertical: [-40, 30]} + driver_right: {horizontal: [-40, 30], vertical: [-40, 30]} + passenger_left: {horizontal: [-10, 40], vertical: [-40, 30]} + passenger_right: {horizontal: [-40, 5], vertical: [-40, 30]} +safety: + raw_frame_passthrough: false + body_channel_must_differ_from_seat_channel: true + send_only_named_capabilities: true + default_feedback_timeout_ms: 1200 diff --git a/platforms/t2g_cabin_bench/can/dbc/vehicle-native.dbc b/platforms/t2g_cabin_bench/can/dbc/vehicle-native.dbc new file mode 100644 index 0000000..a309bc7 --- /dev/null +++ b/platforms/t2g_cabin_bench/can/dbc/vehicle-native.dbc @@ -0,0 +1,88 @@ +VERSION "CAN_DEV native vehicle controls 6e7ed04" + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + +BS_: + +BU_: CognitiveAgent VehicleECU + +BO_ 478 Media_0x1DE: 8 CognitiveAgent + SG_ Wind_Model_S : 0|4@1+ (1,0) [0|7] "" VehicleECU + SG_ Wind_Volume_Size_S : 4|4@1+ (1,0) [0|7] "" VehicleECU + SG_ Medium_AC_Ctrl_Way_S : 16|2@1+ (1,0) [0|2] "" VehicleECU + SG_ ACB_Close_Button_S : 28|2@1+ (1,0) [0|2] "" VehicleECU + SG_ Ctrl_Set_Main_Driver_Tempt_S : 32|8@1+ (1,0) [18|32] "degC" VehicleECU + SG_ Ctrl_Set_Copilot_Tempratur_S : 40|8@1+ (1,0) [18|32] "degC" VehicleECU + SG_ Ctrl_Set_Rear_Temperature_S : 48|8@1+ (1,0) [18|32] "degC" VehicleECU + +BO_ 1028 Right_BCM_0x404: 8 VehicleECU + SG_ ACHMC_AC_On_Status_S : 8|2@1+ (1,0) [0|2] "" CognitiveAgent + SG_ AC_Ctrl_Way_S : 10|2@1+ (1,0) [0|2] "" CognitiveAgent + SG_ AC_Cycle_Mode_404_S : 12|2@1+ (1,0) [0|3] "" CognitiveAgent + SG_ AC_Wind_Model_404_S : 16|4@1+ (1,0) [0|7] "" CognitiveAgent + SG_ Ac_wind_rnk_S : 20|4@1+ (1,0) [0|7] "" CognitiveAgent + SG_ Main_Driver_Set_Temperature_S : 32|8@1+ (1,0) [0|255] "degC" CognitiveAgent + SG_ Copilot_Driver_Set_Temperature_S : 40|8@1+ (1,0) [0|255] "degC" CognitiveAgent + +BO_ 811 Media_0x32B: 8 CognitiveAgent + SG_ Sub_ID : 0|8@1+ (1,0) [0|255] "" VehicleECU + SG_ Second_Row_Lock_Request_Instruction_S : 14|2@1+ (1,0) [0|2] "" VehicleECU + SG_ Indoor_Light_Request_Command_S : 24|3@1+ (1,0) [0|2] "" VehicleECU + SG_ Atmosphere_Light_Request_Command_S : 27|5@1+ (1,0) [0|7] "" VehicleECU + SG_ Ambient_Red_S : 8|8@1+ (1,0) [0|255] "" VehicleECU + SG_ Ambient_Green_S : 16|8@1+ (1,0) [0|255] "" VehicleECU + SG_ Ambient_Blue_S : 24|8@1+ (1,0) [0|255] "" VehicleECU + SG_ Ambient_Brightness_S : 32|7@1+ (1,0) [0|100] "%" VehicleECU + +BO_ 1073 Media_0x431: 8 CognitiveAgent + SG_ Shade_Voi_Ctrl_Instrct_S : 4|4@1+ (1,0) [0|4] "" VehicleECU + SG_ Left_Front_Window_Ctrl_S : 48|3@1+ (1,0) [0|3] "" VehicleECU + SG_ Right_Front_Window_Ctrl_S : 51|3@1+ (1,0) [0|3] "" VehicleECU + SG_ Left_Rear_Window_Ctrl_S : 56|3@1+ (1,0) [0|3] "" VehicleECU + SG_ Right_Rear_Window_Ctrl_S : 59|3@1+ (1,0) [0|3] "" VehicleECU + +BO_ 1217 Media_0x4C1: 8 CognitiveAgent + SG_ Sub_ID : 0|8@1+ (1,0) [0|255] "" VehicleECU + SG_ Driver_Vent_S : 8|4@1+ (1,0) [0|5] "" VehicleECU + SG_ Driver_Heat_S : 12|4@1+ (1,0) [0|5] "" VehicleECU + SG_ Passenger_Vent_S : 16|4@1+ (1,0) [0|5] "" VehicleECU + SG_ Passenger_Heat_S : 20|4@1+ (1,0) [0|5] "" VehicleECU + SG_ Left_Rear_Vent_S : 24|4@1+ (1,0) [0|5] "" VehicleECU + SG_ Left_Rear_Heat_S : 28|4@1+ (1,0) [0|5] "" VehicleECU + SG_ Right_Rear_Vent_S : 32|4@1+ (1,0) [0|5] "" VehicleECU + SG_ Right_Rear_Heat_S : 36|4@1+ (1,0) [0|5] "" VehicleECU + +BO_ 1269 Media_0x4F5: 8 CognitiveAgent + SG_ Sunroof_Target_Position_S : 24|8@1+ (1,0) [0|255] "%" VehicleECU + SG_ Shade_Target_Position_S : 32|8@1+ (1,0) [0|255] "%" VehicleECU + SG_ RoofLamp_Switch_Set_Item_4F5_S : 50|2@1+ (1,0) [0|2] "" VehicleECU + +BO_ 1263 Media_0x4EF: 8 CognitiveAgent + SG_ Sub_ID : 0|8@1+ (1,0) [0|255] "" VehicleECU + SG_ Outlet_Up_Down_1_S : 8|8@1+ (1,-128) [-128|126] "" VehicleECU + SG_ Outlet_Up_Down_2_S : 16|8@1+ (1,-128) [-128|126] "" VehicleECU + SG_ Outlet_Left_Right_1_S : 24|8@1+ (1,-128) [-128|126] "" VehicleECU + SG_ Outlet_Left_Right_2_S : 32|8@1+ (1,-128) [-128|126] "" VehicleECU + +BO_ 434 Media_0x1B2: 8 CognitiveAgent + SG_ Front_Left_Reading_Light_S : 0|2@1+ (1,0) [0|2] "" VehicleECU + SG_ Front_Right_Reading_Light_S : 2|2@1+ (1,0) [0|2] "" VehicleECU + SG_ Middle_Left_Reading_Light_S : 4|2@1+ (1,0) [0|2] "" VehicleECU + SG_ Middle_Right_Reading_Light_S : 6|2@1+ (1,0) [0|2] "" VehicleECU + SG_ Middle_Left_Rotary_Light_S : 8|2@1+ (1,0) [0|2] "" VehicleECU + SG_ Middle_Right_Rotary_Light_S : 10|2@1+ (1,0) [0|2] "" VehicleECU + SG_ Rear_Left_Reading_Light_S : 12|2@1+ (1,0) [0|2] "" VehicleECU + SG_ Rear_Right_Reading_Light_S : 14|2@1+ (1,0) [0|2] "" VehicleECU + +BO_ 904 Window_Status_0x388: 8 VehicleECU +BO_ 1031 Door_Status_0x407: 8 VehicleECU +BO_ 1066 Seat_Status_0x42A: 8 VehicleECU +BO_ 1070 Light_Status_0x42E: 8 VehicleECU +BO_ 757 Outlet_Status_0x2F5: 8 VehicleECU +BO_ 891 Outlet_Status_0x37B: 8 VehicleECU +BO_ 1050 Shade_Status_0x41A: 8 VehicleECU diff --git a/platforms/t2g_cabin_bench/manifest.yaml b/platforms/t2g_cabin_bench/manifest.yaml new file mode 100644 index 0000000..0a84c9f --- /dev/null +++ b/platforms/t2g_cabin_bench/manifest.yaml @@ -0,0 +1,26 @@ +apiVersion: cognitive-agent/v1alpha1 +kind: PlatformManifest +metadata: + id: t2g-cabin-bench-platform + name: T2G seat and vehicle dual-channel CAN bench + version: 1.0.0 + description: One ZLG USBCANFD-200U owns seat CAN channel 0 and vehicle CAN FD channel 1. +spec: + platform: t2g_cabin_bench + execution_enabled: true + dbc_files: + - ../t2g_seat_bench/can/dbc/seat.dbc + - can/dbc/vehicle-native.dbc + buses: + - name: seat_can + backend: zlgcan + channel_env: COGNITIVE_AGENT_SEAT_CAN_CHANNEL + fd: false + - name: body_can + backend: zlgcan + channel_env: COGNITIVE_AGENT_VEHICLE_CAN_CHANNEL + fd: true + supported_domains: [seat, climate, door, window, outlet, interior_light, ambient_light, roof] + calibrations: + seat: ../t2g_seat_bench/calibration/seat.yaml + body_can: calibration/body_can.yaml diff --git a/platforms/t2g_seat_bench/calibration/seat.yaml b/platforms/t2g_seat_bench/calibration/seat.yaml index 6b27234..0d675b9 100755 --- a/platforms/t2g_seat_bench/calibration/seat.yaml +++ b/platforms/t2g_seat_bench/calibration/seat.yaml @@ -13,6 +13,9 @@ protocol: absolute_position_opcode: 1 timed_duty_opcode: 3 stop_all_opcode: 9 + start_dynamic_mode_opcode: 14 + stop_dynamic_mode_opcode: 15 + dynamic_status_frame_id: 774 stop_all_motor_selector: 0 home_known_range_opcode: 11 home_known_range_key: 19282 @@ -35,6 +38,19 @@ protocol: timed_duty_max_duration_ms: 30000 increase_direction: 1 decrease_direction: 2 +dynamic_modes: + max_runtime_ms: 600000 + arrival_grace_ms: 30000 + rocking_horse: + mode_id: 1 + phases: + - {id: rock_forward, completion: all_targets_reached, timeout_ms: 15000} + - {id: rock_backward, completion: all_targets_reached, timeout_ms: 15000} + cradle: + mode_id: 2 + phases: + - {id: forward, completion: all_targets_reached, timeout_ms: 30000} + - {id: return, completion: all_targets_reached, timeout_ms: 30000} axes: seat.set_longitudinal_position: motor_selector: 0 diff --git a/platforms/t2g_seat_bench/can/dbc/seat.dbc b/platforms/t2g_seat_bench/can/dbc/seat.dbc index 2bf7975..65e1ee0 100755 --- a/platforms/t2g_seat_bench/can/dbc/seat.dbc +++ b/platforms/t2g_seat_bench/can/dbc/seat.dbc @@ -95,8 +95,20 @@ BO_ 773 T2G_Seat_Thermal_Current_Diagnostic_305: 8 T2G_SEAT SG_ Fan_Adc_Error_Count : 48|8@1+ (1,0) [0|255] "" HOST SG_ Heater_Adc_Error_Count : 56|8@1+ (1,0) [0|255] "" HOST +BO_ 774 T2G_Seat_Dynamic_Mode_Status_306: 8 T2G_SEAT + SG_ Dynamic_Mode_ID : 0|8@1+ (1,0) [0|2] "" HOST + SG_ Dynamic_State : 8|8@1+ (1,0) [0|3] "" HOST + SG_ Dynamic_Phase : 16|8@1+ (1,0) [0|6] "" HOST + SG_ Dynamic_Active_Mask : 24|4@1+ (1,0) [0|15] "" HOST + SG_ Dynamic_Fault_Mask : 28|4@1+ (1,0) [0|15] "" HOST + SG_ Dynamic_Cycle_Index : 32|16@1+ (1,0) [0|65535] "cycle" HOST + SG_ Dynamic_Phase_Elapsed_Ms : 48|16@1+ (1,0) [0|65535] "ms" HOST + VAL_ 670 Driver_Seat_Ventilation_On 0 "invalid" 1 "on" 2 "off" 3 "reserved" ; VAL_ 670 Driver_Seat_Heating_On 0 "invalid" 1 "on" 2 "off" 3 "reserved" ; VAL_ 769 Ack 0 "none" 1 "accepted" 2 "rejected" 3 "duplicate" 4 "stop_all_accepted" ; VAL_ 770 Task_State 0 "idle" 1 "accepted" 2 "position_run" 3 "timed_run" 4 "calibration" 5 "stopping" 6 "complete" 7 "fault" ; VAL_ 770 Result 0 "none" 1 "running" 2 "ok" 3 "stopped_by_cmd" 4 "endpoint_reached" 5 "stall" 6 "timeout" 7 "driver_fault" 8 "hall_fault" 9 "invalid_cmd" 10 "interlocked" 11 "calibration_failed" ; +VAL_ 774 Dynamic_Mode_ID 0 "none" 1 "rocking_horse" 2 "cradle" ; +VAL_ 774 Dynamic_State 0 "idle" 1 "entry" 2 "running" 3 "fault" ; +VAL_ 774 Dynamic_Phase 0 "none" 1 "entry" 2 "horse_forward" 3 "horse_backward" 4 "reserved" 5 "cradle_forward" 6 "cradle_return" ; diff --git a/src/cognitive_agent/application/capability_registry.py b/src/cognitive_agent/application/capability_registry.py index 0bddc09..3320f45 100755 --- a/src/cognitive_agent/application/capability_registry.py +++ b/src/cognitive_agent/application/capability_registry.py @@ -1,4 +1,4 @@ -"""Load model-facing capability context from domain-owned catalogs.""" +"""Load model-facing capability context from domain and native-CAN catalogs.""" from __future__ import annotations @@ -21,18 +21,25 @@ class CapabilityRegistry: def _load(self) -> dict[str, Any]: domains = [] - for catalog_path in sorted( - (self.root / "domains").glob("*/config/capabilities.yaml") - ): + catalog_paths = [ + *(self.root / "domains").glob("*/config/capabilities.yaml"), + *(self.root / "config" / "native_can_capabilities").glob("*.yaml"), + ] + for catalog_path in sorted(catalog_paths): if catalog_path.parts[-3] == "_template": continue catalog = yaml.safe_load(catalog_path.read_text(encoding="utf-8")) domain = catalog["spec"]["domain"] + native_can_catalog = catalog_path.parent.name == "native_can_capabilities" domains.append( { "domain": domain, "availability": ( - "executable" if domain in self.executable_domains else "catalog_only" + "native_can" + if native_can_catalog + else "executable" + if domain in self.executable_domains + else "catalog_only" ), "capabilities": catalog["spec"]["capabilities"], } @@ -45,6 +52,9 @@ class CapabilityRegistry: "execution_policy": { "executable_domains": sorted(self.executable_domains), "catalog_only_behavior": "return_as_deferred_request", + "native_can_behavior": ( + "compile_for_body_can_when_hardware_mode_is_authorized" + ), "planning_environment": "dry_run_candidate_synthesis", "named_preset_required": False, "fuzzy_goal_behavior": ( diff --git a/src/cognitive_agent/application/conversation_state.py b/src/cognitive_agent/application/conversation_state.py index d94bc68..26ec711 100755 --- a/src/cognitive_agent/application/conversation_state.py +++ b/src/cognitive_agent/application/conversation_state.py @@ -67,6 +67,13 @@ def _new_state( axis: _motion_state(axis, position) for axis, position in MOTION_INITIAL_POSITIONS.items() }, + "dynamic_mode": { + "mode_id": 0, + "name": "", + "state": "idle", + "repeat": "none", + "max_runtime_ms": 600_000, + }, } for target in TARGETS }, @@ -246,6 +253,28 @@ class ConversationStateStore: state["last_target"] = action["target"] continue target = action["target"] + if action.get("action_type") == "dynamic_mode_stop": + state["devices"][target]["dynamic_mode"] = { + "mode_id": 0, + "name": "", + "state": "idle", + "repeat": "none", + "max_runtime_ms": 600_000, + } + state["last_target"] = target + continue + if action.get("action_type") == "dynamic_mode": + state["devices"][target]["dynamic_mode"] = { + "mode_id": int(action["mode_id"]), + "name": str(action.get("mode_name", "")), + "state": "running", + "repeat": str(action.get("repeat", "infinite")), + "max_runtime_ms": int( + action.get("max_runtime_ms", 600_000) + ), + } + state["last_target"] = target + continue if action.get("action_type") == "position": axis = action["axis"] position_state = _motion_state(axis, action["position_pct"]) diff --git a/src/cognitive_agent/application/mode_profile.py b/src/cognitive_agent/application/mode_profile.py index 33c692f..37da35b 100644 --- a/src/cognitive_agent/application/mode_profile.py +++ b/src/cognitive_agent/application/mode_profile.py @@ -102,6 +102,195 @@ class ModeOperation: } +@dataclass(frozen=True) +class ModeTimelinePhase: + id: str + name: str + duration_ms: int | None + transition: str + targets: dict[str, Any] + effects: dict[str, Any] + completion: str + timeout_ms: int | None + motion: dict[str, Any] + arrival_grace_ms: int = 0 + + @classmethod + def from_dict(cls, document: dict[str, Any]) -> "ModeTimelinePhase": + phase_id = str(document.get("id", "")).strip() + if not phase_id: + raise ValueError("mode timeline phase id must not be empty") + duration_ms = document.get("duration_ms") + completion = str( + document.get( + "completion", + "elapsed_time" if duration_ms is not None else "all_targets_reached", + ) + ).strip() + if completion not in {"elapsed_time", "all_targets_reached"}: + raise ValueError( + f"mode timeline phase {phase_id} completion must be elapsed_time or all_targets_reached" + ) + if completion == "elapsed_time": + if ( + not isinstance(duration_ms, int) + or isinstance(duration_ms, bool) + or duration_ms <= 0 + ): + raise ValueError( + f"mode timeline phase {phase_id} duration_ms must be a positive integer" + ) + elif duration_ms is not None: + raise ValueError( + f"mode timeline phase {phase_id} duration_ms must be omitted for all_targets_reached" + ) + timeout_ms = document.get("timeout_ms") + if timeout_ms is not None and ( + not isinstance(timeout_ms, int) + or isinstance(timeout_ms, bool) + or timeout_ms <= 0 + ): + raise ValueError( + f"mode timeline phase {phase_id} timeout_ms must be a positive integer" + ) + if completion == "all_targets_reached" and timeout_ms is None: + raise ValueError( + f"mode timeline phase {phase_id} timeout_ms is required for all_targets_reached" + ) + arrival_grace_ms = document.get("arrival_grace_ms", 0) + if ( + not isinstance(arrival_grace_ms, int) + or isinstance(arrival_grace_ms, bool) + or arrival_grace_ms < 0 + ): + raise ValueError( + f"mode timeline phase {phase_id} arrival_grace_ms must be a non-negative integer" + ) + targets = document.get("targets", {}) + effects = document.get("effects", {}) + motion = document.get("motion", {}) + if ( + not isinstance(targets, dict) + or not isinstance(effects, dict) + or not isinstance(motion, dict) + ): + raise ValueError( + f"mode timeline phase {phase_id} targets/effects/motion must be objects" + ) + return cls( + id=phase_id, + name=str(document.get("name", phase_id)), + duration_ms=duration_ms, + transition=str(document.get("transition", "hold")), + targets=dict(targets), + effects=dict(effects), + completion=completion, + timeout_ms=timeout_ms, + motion=dict(motion), + arrival_grace_ms=arrival_grace_ms, + ) + + def to_yaml(self) -> dict[str, Any]: + result = { + "id": self.id, + "name": self.name, + "transition": self.transition, + "targets": dict(self.targets), + "effects": dict(self.effects), + "completion": self.completion, + } + if self.duration_ms is not None: + result["duration_ms"] = self.duration_ms + if self.timeout_ms is not None: + result["timeout_ms"] = self.timeout_ms + if self.motion: + result["motion"] = dict(self.motion) + if self.arrival_grace_ms: + result["arrival_grace_ms"] = self.arrival_grace_ms + return result + + +@dataclass(frozen=True) +class ModeTimeline: + repeat: str + cycle_duration_ms: int | None + entry: dict[str, Any] + phases: tuple[ModeTimelinePhase, ...] + max_runtime_ms: int | None = None + + @classmethod + def from_dict(cls, document: dict[str, Any]) -> "ModeTimeline": + repeat = str(document.get("repeat", "")).strip() + if repeat not in {"once", "infinite", "until_stopped_or_timeout"}: + raise ValueError( + "mode timeline repeat must be once, infinite, or until_stopped_or_timeout" + ) + max_runtime_ms = document.get("max_runtime_ms") + if max_runtime_ms is not None and ( + not isinstance(max_runtime_ms, int) + or isinstance(max_runtime_ms, bool) + or max_runtime_ms <= 0 + ): + raise ValueError("mode timeline max_runtime_ms must be a positive integer") + if repeat == "until_stopped_or_timeout" and max_runtime_ms is None: + raise ValueError( + "mode timeline max_runtime_ms is required for until_stopped_or_timeout" + ) + duration_ms = document.get("cycle_duration_ms") + if duration_ms is not None and ( + not isinstance(duration_ms, int) + or isinstance(duration_ms, bool) + or duration_ms <= 0 + ): + raise ValueError("mode timeline cycle_duration_ms must be positive") + raw_entry = document.get("entry", {}) + raw_phases = document.get("phases", []) + if not isinstance(raw_entry, dict): + raise ValueError("mode timeline entry must be an object") + if not isinstance(raw_phases, list) or not raw_phases: + raise ValueError("mode timeline must contain at least one phase") + phases = tuple(ModeTimelinePhase.from_dict(item) for item in raw_phases) + phase_ids = [phase.id for phase in phases] + if len(set(phase_ids)) != len(phase_ids): + raise ValueError("mode timeline phase ids must be unique") + timed_phases = all(phase.duration_ms is not None for phase in phases) + if timed_phases: + calculated_duration = sum( + int(phase.duration_ms or 0) for phase in phases + ) + if calculated_duration != duration_ms: + raise ValueError( + "mode timeline cycle_duration_ms does not equal the sum of phases: " + f"declared={duration_ms}, calculated={calculated_duration}" + ) + elif duration_ms is not None: + raise ValueError( + "mode timeline cycle_duration_ms must be omitted when a phase completes by target arrival" + ) + return cls( + repeat=repeat, + cycle_duration_ms=duration_ms, + entry=dict(raw_entry), + phases=phases, + max_runtime_ms=max_runtime_ms, + ) + + def to_yaml(self) -> dict[str, Any]: + result = { + "repeat": self.repeat, + "entry": dict(self.entry), + "phases": [phase.to_yaml() for phase in self.phases], + } + if self.cycle_duration_ms is not None: + result["cycle_duration_ms"] = self.cycle_duration_ms + if self.max_runtime_ms is not None: + result["max_runtime_ms"] = self.max_runtime_ms + return result + + def public_dict(self) -> dict[str, Any]: + return self.to_yaml() + + @dataclass(frozen=True) class ModeProfile: id: str @@ -113,6 +302,7 @@ class ModeProfile: source: str common: bool = True vehicle_ids: tuple[str, ...] = () + timeline: ModeTimeline | None = None @classmethod def from_yaml(cls, path: Path, profile_root: Path | None = None) -> "ModeProfile": @@ -128,6 +318,9 @@ class ModeProfile: name, [str(alias) for alias in document.get("aliases", [])], ) + raw_timeline = document.get("timeline") + if raw_timeline is not None and not isinstance(raw_timeline, dict): + raise ValueError(f"{path} timeline must be an object") return cls( id=str(document["id"]), name=name, @@ -138,10 +331,15 @@ class ModeProfile: source=str(path), common=common, vehicle_ids=vehicle_ids, + timeline=( + ModeTimeline.from_dict(raw_timeline) + if isinstance(raw_timeline, dict) + else None + ), ) def public_dict(self) -> dict[str, Any]: - return { + result = { "id": self.id, "name": self.name, "aliases": list(self.aliases), @@ -153,7 +351,11 @@ class ModeProfile: "common": self.common, "vehicle_ids": list(self.vehicle_ids), }, + "behavior": "cyclic" if self.timeline is not None else "static", } + if self.timeline is not None: + result["timeline"] = self.timeline.public_dict() + return result class ModeProfileRegistry: @@ -370,7 +572,7 @@ def _mode_profile_document( "common": profile.common, "vehicle_ids": list(profile.vehicle_ids), } - return { + document = { "id": profile.id, "name": profile.name, "aliases": list(profile.aliases), @@ -379,6 +581,9 @@ def _mode_profile_document( "scope": scope, "operations": [operation.to_yaml() for operation in operations], } + if profile.timeline is not None: + document["timeline"] = profile.timeline.to_yaml() + return document def _replace_yaml(path: Path, document: dict[str, Any]) -> None: diff --git a/src/cognitive_agent/application/model_plan_adapter.py b/src/cognitive_agent/application/model_plan_adapter.py index 72136b7..fcbdb7e 100755 --- a/src/cognitive_agent/application/model_plan_adapter.py +++ b/src/cognitive_agent/application/model_plan_adapter.py @@ -27,7 +27,14 @@ SEAT_MOTION_CAPABILITIES = { SEAT_RELATIVE_PHYSICAL_PARAMETERS = {"distance_mm", "angle_delta_deg"} SAVE_PRESET_CAPABILITY = "seat.save_posture_preset" APPLY_PRESET_CAPABILITY = "seat.apply_posture_preset" +DYNAMIC_MODE_CAPABILITY = "seat.start_dynamic_mode" +DYNAMIC_MODE_STOP_CAPABILITY = "seat.stop_dynamic_mode" +DYNAMIC_MODE_MAX_RUNTIME_MS = 600_000 HEX_COLOR = re.compile(r"^#[0-9A-Fa-f]{6}$") +NATIVE_CAN_ONLY_CAPABILITIES = { + "climate.set_control_mode", + "roof.set_shade_motion", +} class ModelPlanAdapter: @@ -69,7 +76,7 @@ class ModelPlanAdapter: ) continue - domain, availability, capability = registered + domain, domain_availability, capability = registered parameters = { str(item["name"]): item.get("value") for item in request.get("parameters", []) @@ -93,7 +100,26 @@ class ModelPlanAdapter: ) continue - if availability != "executable": + availability = ( + "native_can" + if capability_name in NATIVE_CAN_ONLY_CAPABILITIES + else domain_availability + ) + native_only_request = ( + domain == "seat" + and capability_name in SEAT_CAPABILITIES + and ( + request.get("target_scope") in {"left_rear", "right_rear"} + or parameters.get("level") in {4, 5} + ) + ) or ( + capability_name == "climate.set_outlet_mode" + and ( + request.get("target_scope") == "vehicle" + or parameters.get("mode") not in {"face", "feet"} + ) + ) + if availability != "executable" or native_only_request: values = [value for value in parameters.values() if value is not None] deferred.append( { @@ -104,6 +130,11 @@ class ModelPlanAdapter: "requested_value": values[0] if len(values) == 1 else None, "parameters": parameters, "reason": request["reason"], + "execution_backend": ( + "native_can" + if availability == "native_can" or native_only_request + else availability + ), } ) continue @@ -182,6 +213,20 @@ class ModelPlanAdapter: } ) continue + if capability_name == DYNAMIC_MODE_STOP_CAPABILITY: + dynamic_action = self._dynamic_mode_stop_action( + index, request, parameters, ambiguities + ) + if dynamic_action is not None: + actions.append(dynamic_action) + continue + if capability_name == DYNAMIC_MODE_CAPABILITY: + dynamic_action = self._dynamic_mode_action( + index, request, parameters, ambiguities + ) + if dynamic_action is not None: + actions.append(dynamic_action) + continue action = self._seat_action( index, request, parameters, ambiguities, context, vehicle_profile ) @@ -352,6 +397,79 @@ class ModelPlanAdapter: return None return {"target": target, "preset_name": preset_name.strip()} + @staticmethod + def _dynamic_mode_action( + index: int, + request: dict[str, Any], + parameters: dict[str, Any], + ambiguities: list[dict[str, str]], + ) -> dict[str, Any] | None: + target = request.get("target_scope") + if target != "passenger": + ambiguities.append( + { + "field": f"requests[{index}].target_scope", + "question": "当前动态座椅模式仅控制副驾。", + } + ) + return None + mode_id = parameters.get("mode_id") + if ( + not isinstance(mode_id, (int, float)) + or isinstance(mode_id, bool) + or not float(mode_id).is_integer() + or int(mode_id) not in {1, 2} + ): + ambiguities.append( + { + "field": f"requests[{index}].parameters.mode_id", + "question": "动态座椅模式编号必须是 1(木马模式)或 2(动态摇篮)。", + } + ) + return None + normalized_mode_id = int(mode_id) + return { + "action_type": "dynamic_mode", + "target": target, + "mode_id": normalized_mode_id, + "mode_name": ( + "木马模式" + if normalized_mode_id == 1 + else "动态摇篮模式" + ), + "repeat": "until_stopped_or_timeout", + "max_runtime_ms": DYNAMIC_MODE_MAX_RUNTIME_MS, + } + + @staticmethod + def _dynamic_mode_stop_action( + index: int, + request: dict[str, Any], + parameters: dict[str, Any], + ambiguities: list[dict[str, str]], + ) -> dict[str, Any] | None: + target = request.get("target_scope") + if target != "passenger": + ambiguities.append( + { + "field": f"requests[{index}].target_scope", + "question": "当前动态座椅模式仅控制副驾。", + } + ) + return None + if parameters: + ambiguities.append( + { + "field": f"requests[{index}].parameters", + "question": "停止动态座椅模式不接受额外参数。", + } + ) + return None + return { + "action_type": "dynamic_mode_stop", + "target": target, + } + @staticmethod def _find_preset( presets: list[dict[str, Any]], diff --git a/src/cognitive_agent/application/native_can_intent.py b/src/cognitive_agent/application/native_can_intent.py new file mode 100644 index 0000000..7fd7eab --- /dev/null +++ b/src/cognitive_agent/application/native_can_intent.py @@ -0,0 +1,348 @@ +"""Deterministic parsing for the trusted vehicle CAN command vocabulary. + +The parser only emits named capabilities. It never accepts a raw CAN ID or +payload from a user utterance; byte-level compilation stays in NativeCanRuntime. +""" + +from __future__ import annotations + +import re +from typing import Any + + +WINDOW_TARGETS = { + "全部": "all", + "所有": "all", + "四个": "all", + "全车": "all", + "前排": "front", + "后排": "rear", + "左前": "front_left", + "前左": "front_left", + "右前": "front_right", + "前右": "front_right", + "左后": "rear_left", + "后左": "rear_left", + "右后": "rear_right", + "后右": "rear_right", +} +OUTLET_TARGETS = { + "主驾左": "driver_left", + "主驾右": "driver_right", + "副驾左": "passenger_left", + "副驾右": "passenger_right", +} +LIGHT_TARGETS = { + "全部": "all", + "所有": "all", + "左前": "front_left", + "右前": "front_right", + "中排左旋钮": "middle_left_rotary", + "中排右旋钮": "middle_right_rotary", + "中排左": "middle_left", + "中排右": "middle_right", + "左后": "rear_left", + "右后": "rear_right", +} +SEAT_TARGETS = { + "driver": "driver", + "passenger": "passenger", + "left-rear": "left_rear", + "right-rear": "right_rear", +} + + +def _action( + domain: str, + capability: str, + target: str, + parameters: dict[str, Any], + reason: str, +) -> dict[str, Any]: + return { + "domain": domain, + "capability": capability, + "target": target, + "parameters": parameters, + "operation": "set", + "reason": reason, + "execution_backend": "native_can", + } + + +def _parse_exact_command(text: str) -> list[dict[str, Any]]: + command = " ".join(text.strip().lower().split()) + match = re.fullmatch(r"door rear (lock|unlock)", command) + if match: + return [_action("door", "door.set_rear_lock", "rear", {"state": match[1]}, "用户输入了受信任的后排门锁命令。")] + + match = re.fullmatch( + r"window (all|front|rear|front-left|front-right|rear-left|rear-right) (open|close|stop)", + command, + ) + if match: + return [_action("window", "window.set_motion", match[1].replace("-", "_"), {"motion": match[2]}, "用户输入了受信任的车窗动作命令。")] + match = re.fullmatch( + r"window (front-left|front-right|rear-left|rear-right) position (\d+)", + command, + ) + if match and 0 <= int(match[2]) <= 100: + return [_action("window", "window.set_position", match[1].replace("-", "_"), {"position_pct": int(match[2])}, "用户输入了受信任的车窗位置命令。")] + + match = re.fullmatch(r"ac (on|off)", command) + if match: + return [_action("climate", "climate.set_power", "vehicle", {"state": match[1]}, "用户输入了受信任的空调开关命令。")] + match = re.fullmatch(r"ac fan ([1-7])", command) + if match: + return [_action("climate", "climate.set_fan_level", "vehicle", {"level": int(match[1])}, "用户输入了受信任的空调风量命令。")] + match = re.fullmatch( + r"ac mode (face|face-feet|feet|feet-defrost|defrost|face-feet-defrost|face-defrost)", + command, + ) + if match: + return [_action("climate", "climate.set_outlet_mode", "vehicle", {"mode": match[1].replace("-", "_")}, "用户输入了受信任的空调出风模式命令。")] + match = re.fullmatch(r"ac temp (driver|passenger|rear) (\d+)", command) + if match and 18 <= int(match[2]) <= 32: + return [_action("climate", "climate.set_temperature", match[1], {"temperature_c": int(match[2])}, "用户输入了受信任的空调温度命令。")] + match = re.fullmatch(r"ac control (manual|auto)", command) + if match: + return [_action("climate", "climate.set_control_mode", "vehicle", {"mode": match[1]}, "用户输入了受信任的空调控制模式命令。")] + + match = re.fullmatch( + r"outlet (driver-left|driver-right|passenger-left|passenger-right) percent (\d+) (\d+)", + command, + ) + if match and all(0 <= int(value) <= 100 for value in match.groups()[1:]): + return [_action("outlet", "outlet.set_position_percent", match[1].replace("-", "_"), {"horizontal_pct": int(match[2]), "vertical_pct": int(match[3])}, "用户输入了受信任的电动风口百分比命令。")] + match = re.fullmatch( + r"outlet (driver-left|driver-right|passenger-left|passenger-right) position (-?\d+) (-?\d+)", + command, + ) + if match and all(-128 <= int(value) <= 126 for value in match.groups()[1:]): + return [_action("outlet", "outlet.set_calibrated_position", match[1].replace("-", "_"), {"horizontal_value": int(match[2]), "vertical_value": int(match[3])}, "用户输入了受信任的电动风口标定坐标命令。")] + + match = re.fullmatch( + r"seat (driver|passenger|left-rear|right-rear) (heat|vent) (off|[1-5])", + command, + ) + if match: + parameters: dict[str, Any] = {"state": "off" if match[3] == "off" else "on"} + if match[3] != "off": + parameters["level"] = int(match[3]) + capability = "seat.set_heating" if match[2] == "heat" else "seat.set_ventilation" + return [_action("seat", capability, SEAT_TARGETS[match[1]], parameters, "用户输入了受信任的整车座椅热舒适命令。")] + + match = re.fullmatch(r"light (indoor|wall) (on|off)", command) + if match: + capability = "interior_light.set_indoor_power" if match[1] == "indoor" else "interior_light.set_wall_power" + return [_action("interior_light", capability, "vehicle", {"state": match[2]}, "用户输入了受信任的车内灯命令。")] + match = re.fullmatch( + r"light reading (all|front-left|front-right|middle-left|middle-right|middle-left-rotary|middle-right-rotary|rear-left|rear-right) (on|off)", + command, + ) + if match: + return [_action("interior_light", "interior_light.set_reading_power", match[1].replace("-", "_"), {"state": match[2]}, "用户输入了受信任的阅读灯命令。")] + match = re.fullmatch(r"light ambient (on|off)", command) + if match: + return [_action("ambient_light", "ambient_light.set_power", "vehicle", {"state": match[1]}, "用户输入了受信任的氛围灯开关命令。")] + match = re.fullmatch(r"light ambient scene (camping|nap|cinema|meditation|romance)", command) + if match: + mode = {"nap": "rest", "romance": "romantic"}.get(match[1], match[1]) + return [_action("ambient_light", "ambient_light.set_mode", "vehicle", {"mode": mode}, "用户输入了受信任的氛围灯场景命令。")] + match = re.fullmatch(r"light ambient rgb (\d+) (\d+) (\d+) (\d+)", command) + if match: + red, green, blue, brightness = map(int, match.groups()) + if all(1 <= value <= 255 for value in (red, green, blue)) and 0 <= brightness <= 100: + return [_action("ambient_light", "ambient_light.set_illumination", "vehicle", {"color_hex": f"#{red:02X}{green:02X}{blue:02X}", "brightness_pct": brightness}, "用户输入了受信任的氛围灯 RGB 命令。")] + + match = re.fullmatch(r"shade (open|close|half|stop)", command) + if match: + return [_action("roof", "roof.set_shade_motion", "vehicle", {"motion": match[1]}, "用户输入了受信任的遮阳帘动作命令。")] + match = re.fullmatch(r"shade position (\d+)", command) + if match and 0 <= int(match[1]) <= 100: + return [_action("roof", "roof.set_shade_position", "vehicle", {"position_pct": int(match[1])}, "用户输入了受信任的遮阳帘位置命令。")] + return [] + + +def _parse_chinese_commands(text: str) -> list[dict[str, Any]]: + compact = re.sub(r"\s+", "", text) + actions: list[dict[str, Any]] = [] + + if "空调" in compact or re.search(r"(?:AC|A/C)", text, re.IGNORECASE): + if re.search(r"(?:打开|开启|启动)空调", compact): + actions.append(_action("climate", "climate.set_power", "vehicle", {"state": "on"}, "用户要求打开空调。")) + elif re.search(r"(?:关闭|关掉|关上)空调", compact): + actions.append(_action("climate", "climate.set_power", "vehicle", {"state": "off"}, "用户要求关闭空调。")) + + temperature = re.search( + r"(?:(主驾|副驾|后排)(?:空调)?(?:温度)?|空调(?:温度)?|温度)(?:调到|设为|设置为|到)?(1[89]|2\d|3[0-2])(?:℃|度)?", + compact, + ) + if temperature: + target = {"主驾": "driver", "副驾": "passenger", "后排": "rear"}.get(temperature[1], "vehicle") + actions.append(_action("climate", "climate.set_temperature", target, {"temperature_c": int(temperature[2])}, "用户指定了空调温度。")) + + fan = re.search(r"(?:风量|风速)(?:调到|设为|设置为|到)?([1-7])(?:档)?", compact) + if fan: + actions.append(_action("climate", "climate.set_fan_level", "vehicle", {"level": int(fan[1])}, "用户指定了空调风量。")) + + if re.search(r"自动(?:控制|模式)", compact): + actions.append(_action("climate", "climate.set_control_mode", "vehicle", {"mode": "auto"}, "用户指定空调自动控制。")) + elif re.search(r"手动(?:控制|模式)", compact): + actions.append(_action("climate", "climate.set_control_mode", "vehicle", {"mode": "manual"}, "用户指定空调手动控制。")) + + outlet_modes = [ + ("吹面吹脚除霜", "face_feet_defrost"), + ("吹面除霜", "face_defrost"), + ("吹脚除霜", "feet_defrost"), + ("吹面吹脚", "face_feet"), + ("除霜", "defrost"), + ("吹脚", "feet"), + ("吹面", "face"), + ] + for label, mode in outlet_modes: + if label in compact: + actions.append(_action("climate", "climate.set_outlet_mode", "vehicle", {"mode": mode}, "用户指定了空调出风模式。")) + break + + if "车窗" in compact: + target = next((value for label, value in WINDOW_TARGETS.items() if label in compact), "all") + position = re.search(r"(?:位置|开度|调到|设为)(\d{1,3})%", compact) + if position and target not in {"all", "front", "rear"} and int(position[1]) <= 100: + actions.append(_action("window", "window.set_position", target, {"position_pct": int(position[1])}, "用户指定了单个车窗的绝对开度。")) + else: + motion = ( + "stop" if re.search(r"停止|停下|暂停", compact) + else "close" if re.search(r"关闭|关上|升起|关窗", compact) + else "open" if re.search(r"打开|开启|降下|开窗", compact) + else None + ) + if motion: + actions.append(_action("window", "window.set_motion", target, {"motion": motion}, "用户指定了车窗目标和动作。")) + + if re.search(r"后排.*(?:门锁|车门)|(?:门锁|车门).*后排", compact): + state = "unlock" if re.search(r"解锁|开锁", compact) else "lock" if re.search(r"上锁|落锁|锁上", compact) else None + if state: + actions.append(_action("door", "door.set_rear_lock", "rear", {"state": state}, "用户指定了后排门锁状态。")) + + if re.search(r"遮阳帘|天幕帘", compact): + position = re.search(r"(?:位置|开度|调到|设为)(\d{1,3})%", compact) + if position and int(position[1]) <= 100: + actions.append(_action("roof", "roof.set_shade_position", "vehicle", {"position_pct": int(position[1])}, "用户指定了遮阳帘开度。")) + else: + motion = ( + "stop" if re.search(r"停止|停下|暂停", compact) + else "half" if re.search(r"半开|一半", compact) + else "close" if re.search(r"关闭|关上", compact) + else "open" if re.search(r"打开|开启", compact) + else None + ) + if motion: + actions.append(_action("roof", "roof.set_shade_motion", "vehicle", {"motion": motion}, "用户指定了遮阳帘动作。")) + + for label, capability in (("室内灯", "interior_light.set_indoor_power"), ("车内灯", "interior_light.set_indoor_power"), ("壁灯", "interior_light.set_wall_power")): + if label in compact: + state = "off" if re.search(r"关闭|关掉|关上", compact) else "on" if re.search(r"打开|开启", compact) else None + if state: + actions.append(_action("interior_light", capability, "vehicle", {"state": state}, "用户指定了车内灯状态。")) + break + + if "阅读灯" in compact: + target = next((value for label, value in LIGHT_TARGETS.items() if label in compact), "all") + state = "off" if re.search(r"关闭|关掉|关上", compact) else "on" if re.search(r"打开|开启", compact) else None + if state: + actions.append(_action("interior_light", "interior_light.set_reading_power", target, {"state": state}, "用户指定了阅读灯区域和状态。")) + + outlet_target = next((value for label, value in OUTLET_TARGETS.items() if f"{label}风口" in compact), None) + outlet_position = re.search(r"(?:左右|水平)(\d{1,3})%?.*?(?:上下|垂直)(\d{1,3})%?", compact) + if outlet_target and outlet_position and all(int(value) <= 100 for value in outlet_position.groups()): + actions.append(_action("outlet", "outlet.set_position_percent", outlet_target, {"horizontal_pct": int(outlet_position[1]), "vertical_pct": int(outlet_position[2])}, "用户指定了已标定风口的双轴百分比位置。")) + return actions + + +def _signature(action: dict[str, Any]) -> tuple[str, str, str, tuple[tuple[str, str], ...]]: + return ( + str(action.get("domain")), + str(action.get("capability")), + str(action.get("target", action.get("target_scope"))), + tuple(sorted((str(key), repr(value)) for key, value in action.get("parameters", {}).items())), + ) + + +def merge_native_can_intent(parsed: dict[str, Any], utterance: str) -> dict[str, Any]: + """Add deterministic vehicle-CAN actions without duplicating model requests.""" + + clauses = [part for part in re.split(r"[,,。;;!!??]+", utterance) if part.strip()] + exact_actions = [action for clause in clauses for action in _parse_exact_command(clause)] + actions = exact_actions or _parse_chinese_commands(utterance) + if not actions: + return parsed + + result = dict(parsed) + existing = [ + *result.get("actions", []), + *result.get("native_can_actions", []), + *[ + item + for item in result.get("deferred_requests", []) + if item.get("execution_backend") == "native_can" + ], + ] + signatures = {_signature(item) for item in existing} + unique_actions = [item for item in actions if _signature(item) not in signatures] + if not unique_actions: + return result + + result["native_can_actions"] = [ + *result.get("native_can_actions", []), + *unique_actions, + ] + result["deferred_requests"] = [ + *result.get("deferred_requests", []), + *[ + { + "domain": item["domain"], + "capability": item["capability"], + "target_scope": item["target"], + "desired_change": item["operation"], + "requested_value": next(iter(item["parameters"].values())) if len(item["parameters"]) == 1 else None, + "parameters": dict(item["parameters"]), + "reason": item["reason"], + "execution_backend": "native_can", + } + for item in unique_actions + ], + ] + result["model_requests"] = [ + *result.get("model_requests", []), + *[ + { + "domain": item["domain"], + "capability": item["capability"], + "target_scope": item["target"], + "operation": item["operation"], + "parameters": [ + {"name": name, "value": value} + for name, value in item["parameters"].items() + ], + "reason": item["reason"], + } + for item in unique_actions + ], + ] + domains = list(result.get("detected_domains", [])) + for item in unique_actions: + if item["domain"] not in domains: + domains.append(item["domain"]) + result["detected_domains"] = domains + result["ambiguities"] = [ + item + for item in result.get("ambiguities", []) + if item.get("field") != "capability" + ] + result["decision_summary"] = [ + *result.get("decision_summary", []), + *[item["reason"] for item in unique_actions], + ] + result["confidence"] = max(float(result.get("confidence", 0)), 0.98) + return result diff --git a/src/cognitive_agent/application/native_can_runtime.py b/src/cognitive_agent/application/native_can_runtime.py new file mode 100644 index 0000000..3e5892f --- /dev/null +++ b/src/cognitive_agent/application/native_can_runtime.py @@ -0,0 +1,864 @@ +"""Trusted compilation and execution support for CAN_DEV vehicle controls.""" + +from __future__ import annotations + +import hashlib +import json +import time +from dataclasses import dataclass +from datetime import UTC, datetime +from pathlib import Path +from typing import Any, Callable + +import yaml + +from cognitive_agent.infrastructure.can.gateway import CanBus, CanFrame + + +def _now() -> str: + return datetime.now(UTC).isoformat().replace("+00:00", "Z") + + +def _set_bits(payload: bytearray, start: int, length: int, value: int) -> None: + if length <= 0 or start < 0 or start + length > len(payload) * 8: + raise ValueError("invalid bit range") + if value < 0 or value >= (1 << length): + raise ValueError(f"value {value} does not fit in {length} bits") + for offset in range(length): + bit = start + offset + mask = 1 << (bit % 8) + if value & (1 << offset): + payload[bit // 8] |= mask + else: + payload[bit // 8] &= ~mask + + +@dataclass(frozen=True) +class NativeFrameSpec: + frame_id: int + payload: bytes + is_fd: bool = False + bitrate_switch: bool = False + repeat_count: int = 1 + period_ms: int = 0 + feedback_ids: tuple[int, ...] = () + expected_feedback: str = "" + special_handler: str = "" + special_parameters: dict[str, Any] | None = None + + +class NativeCanCompileError(ValueError): + """Raised when a request is outside the CAN_DEV verified vocabulary.""" + + +class NativeCanRuntime: + """Compile named capabilities into byte-exact CAN_DEV frames.""" + + compiler_version = "1.0.0" + mapping_version = "can-dev-6e7ed04" + + def __init__(self, repository_root: Path): + self.root = repository_root + calibration_path = ( + repository_root + / "platforms" + / "t2g_cabin_bench" + / "calibration" + / "body_can.yaml" + ) + self.calibration_path = calibration_path + self.calibration = yaml.safe_load(calibration_path.read_text(encoding="utf-8")) + self.capabilities: dict[str, dict[str, Any]] = {} + catalog_paths = [ + *(repository_root / "domains").glob("*/config/capabilities.yaml"), + *(repository_root / "config" / "native_can_capabilities").glob("*.yaml"), + ] + for path in sorted(catalog_paths): + catalog = yaml.safe_load(path.read_text(encoding="utf-8")) + for capability in catalog.get("spec", {}).get("capabilities", []): + self.capabilities[capability["name"]] = capability + + @property + def supported_capabilities(self) -> frozenset[str]: + return frozenset( + { + "door.set_rear_lock", + "window.set_motion", + "window.set_position", + "climate.set_power", + "climate.set_ac", + "climate.set_fan_level", + "climate.set_outlet_mode", + "climate.set_temperature", + "climate.set_control_mode", + "outlet.set_position_percent", + "outlet.set_calibrated_position", + "seat.set_heating", + "seat.set_ventilation", + "interior_light.set_indoor_power", + "interior_light.set_wall_power", + "interior_light.set_reading_power", + "ambient_light.set_power", + "ambient_light.set_mode", + "ambient_light.set_illumination", + "roof.set_shade_motion", + "roof.set_shade_position", + } + ) + + def supports(self, action: dict[str, Any]) -> bool: + return str(action.get("capability")) in self.supported_capabilities + + def build_function_config( + self, + domain: str, + actions: list[dict[str, Any]], + request_id: str, + provider: str, + ) -> dict[str, Any]: + operations = [] + for index, action in enumerate(actions, start=1): + capability_name = str(action["capability"]) + if capability_name not in self.supported_capabilities: + raise NativeCanCompileError( + f"CAN_DEV does not implement {capability_name}" + ) + capability = self.capabilities[capability_name] + target = str(action.get("target", action.get("target_scope", "vehicle"))) + if target not in capability.get("target_scopes", []): + raise NativeCanCompileError( + f"{capability_name} does not support target {target}" + ) + suffix = capability_name.split(".", 1)[1] + operation_id = f"{target}_{suffix}_{index}"[:63] + operations.append( + { + "id": operation_id, + "capability": capability_name, + "target": { + "device": capability["target_devices"][0], + "zone": target, + }, + "parameters": dict(action.get("parameters", {})), + "timeout_ms": 15_000 if capability_name == "window.set_position" else 4_000, + "failure_policy": "abort", + } + ) + return { + "apiVersion": "cognitive-agent/v1alpha1", + "kind": "FunctionConfig", + "metadata": { + "id": f"native-{domain}-{request_id}", + "name": f"{domain.replace('_', ' ').title()} native CAN function", + "version": "1.0.0", + "request_id": request_id, + "generated_at": _now(), + "labels": { + "provider": provider, + "execution_scope": "vehicle_can_channel_1", + "source_branch": "CAN_DEV", + }, + }, + "spec": { + "domain": domain, + "operations": operations, + "assumptions": [ + "Only named, range-checked CAN_DEV capabilities may reach the body CAN channel.", + "The body CAN channel uses ISO CAN FD at 500 kbit/s arbitration and 2 Mbit/s data rate.", + ], + }, + } + + def compile(self, function_config: dict[str, Any]) -> dict[str, Any]: + commands: list[dict[str, Any]] = [] + for operation_index, operation in enumerate( + function_config["spec"]["operations"], start=1 + ): + specs = self._frame_specs(operation) + for frame_index, spec in enumerate(specs, start=1): + signals: dict[str, int | bool | str] = { + "frame_id": f"0x{spec.frame_id:03X}", + "data_hex": " ".join(f"{byte:02X}" for byte in spec.payload), + "is_fd": spec.is_fd, + "bitrate_switch": spec.bitrate_switch, + "feedback_ids": ",".join( + f"0x{frame_id:03X}" for frame_id in spec.feedback_ids + ), + "expected_feedback": spec.expected_feedback, + } + if spec.special_handler: + signals["special_handler"] = spec.special_handler + signals["special_parameters"] = json.dumps( + spec.special_parameters or {}, + ensure_ascii=False, + sort_keys=True, + ) + command: dict[str, Any] = { + "id": f"native_{operation_index}_{frame_index}_control", + "operation_ref": operation["id"], + "bus": "body_can", + "message": f"Native_0x{spec.frame_id:03X}", + "signals": signals, + "send_offset_ms": (operation_index - 1) * 20, + } + if spec.repeat_count > 1: + command["repeat"] = { + "count": spec.repeat_count, + "period_ms": spec.period_ms, + } + commands.append(command) + + canonical = json.dumps( + function_config, ensure_ascii=False, sort_keys=True + ).encode("utf-8") + metadata = function_config["metadata"] + domain = function_config["spec"]["domain"] + return { + "apiVersion": "cognitive-agent/v1alpha1", + "kind": "CommandPlan", + "metadata": { + "id": f"plan-native-{domain}-{metadata['request_id']}", + "name": f"{domain.replace('_', ' ').title()} native CAN command plan", + "version": "1.0.0", + "request_id": metadata["request_id"], + "labels": { + "execution_scope": "vehicle_can_channel_1", + "source_branch": "CAN_DEV", + }, + }, + "spec": { + "domain": domain, + "platform": "t2g_cabin_bench", + "source": { + "config_id": metadata["id"], + "config_version": metadata["version"], + "config_sha256": hashlib.sha256(canonical).hexdigest(), + "compiler_version": self.compiler_version, + "mapping_version": self.mapping_version, + }, + "commands": commands, + }, + } + + def execute_virtual( + self, + command_plan: dict[str, Any], + function_config: dict[str, Any], + ) -> dict[str, Any]: + started_at = _now() + operations = { + operation["id"]: operation + for operation in function_config["spec"]["operations"] + } + results = [] + for command in command_plan["spec"]["commands"]: + operation = operations[command["operation_ref"]] + results.append( + { + "ref": operation["id"], + "domain": function_config["spec"]["domain"], + "status": "succeeded", + "message": "已完成 CAN_DEV 帧编译;dry-run 未打开物理 CAN。", + "telemetry": { + "target": operation["target"]["zone"], + "requested_parameters": operation["parameters"], + "command_frame": self.command_frame_public(command), + "source_branch": "CAN_DEV", + "simulated": True, + }, + } + ) + return self._report(function_config, results, started_at, "dry_run") + + @staticmethod + def command_frame_public(command: dict[str, Any]) -> dict[str, Any]: + signals = command["signals"] + return { + "frame_id": signals["frame_id"], + "payload_size": len(bytes.fromhex(str(signals["data_hex"]))), + "data_hex": signals["data_hex"], + "channel": 1, + "frame_format": "can_fd" if signals["is_fd"] else "classic_can", + "bitrate_switch": bool(signals["bitrate_switch"]), + "repeat": command.get("repeat", {"count": 1, "period_ms": 0}), + } + + @staticmethod + def _report( + function_config: dict[str, Any], + results: list[dict[str, Any]], + started_at: str, + mode: str, + ) -> dict[str, Any]: + succeeded = all(item["status"] == "succeeded" for item in results) + request_id = function_config["metadata"]["request_id"] + domain = function_config["spec"]["domain"] + return { + "apiVersion": "cognitive-agent/v1alpha1", + "kind": "ExecutionReport", + "metadata": { + "id": f"report-native-{domain}-{request_id}", + "name": f"{domain.replace('_', ' ').title()} native CAN execution report", + "version": "1.0.0", + "request_id": request_id, + "labels": { + "simulation": "false" if mode == "vehicle" else "true", + "source_branch": "CAN_DEV", + }, + }, + "spec": { + "mode": mode, + "status": "succeeded" if succeeded else "failed", + "started_at": started_at, + "finished_at": _now(), + "results": results, + }, + } + + def _frame_specs(self, operation: dict[str, Any]) -> list[NativeFrameSpec]: + capability = operation["capability"] + target = operation["target"]["zone"] + parameters = operation["parameters"] + + if capability in {"climate.set_power", "climate.set_ac"}: + state = self._enum(parameters, "state", {"on": 1, "off": 2}) + payload = bytearray(8) + _set_bits(payload, 28, 2, state) + return [self._classic(0x1DE, payload, 3, 100, (0x404,), f"climate_power:{parameters['state']}")] + if capability == "climate.set_fan_level": + level = self._integer(parameters, "level", 1, 7) + payload = bytearray(8) + _set_bits(payload, 4, 4, level) + return [self._classic(0x1DE, payload, 3, 100, (0x404,), f"climate_fan:{level}")] + if capability == "climate.set_outlet_mode": + mode = self._enum( + parameters, + "mode", + { + "face": 1, + "face_feet": 2, + "feet": 3, + "feet_defrost": 4, + "defrost": 5, + "face_feet_defrost": 6, + "face_defrost": 7, + }, + ) + payload = bytearray(8) + _set_bits(payload, 0, 4, mode) + return [self._classic(0x1DE, payload, 3, 100, (0x404,), f"climate_mode:{mode}")] + if capability == "climate.set_control_mode": + mode = self._enum(parameters, "mode", {"manual": 1, "auto": 2}) + payload = bytearray(8) + _set_bits(payload, 16, 2, mode) + return [self._classic(0x1DE, payload, 3, 100, (0x404,), f"climate_control:{mode}")] + if capability == "climate.set_temperature": + temperature = self._integer(parameters, "temperature_c", 18, 32) + starts = { + "driver": (32,), + "passenger": (40,), + "rear": (48,), + "rear_row": (48,), + "rear_left": (48,), + "rear_right": (48,), + "vehicle": (32, 40), + "front_row": (32, 40), + } + if target not in starts: + raise NativeCanCompileError( + f"climate.set_temperature does not support target {target}" + ) + specs = [] + for start in starts[target]: + payload = bytearray(8) + _set_bits(payload, start, 8, temperature) + label = "driver" if start == 32 else "passenger" if start == 40 else "rear" + specs.append( + self._classic( + 0x1DE, + payload, + 1 if start == 48 else 3, + 100, + (0x404,), + f"climate_temperature:{label}:{temperature}", + ) + ) + return specs + + if capability == "door.set_rear_lock": + state = self._enum(parameters, "state", {"lock": 1, "unlock": 2}) + payload = bytearray(8) + payload[0] = 0x0A + _set_bits(payload, 14, 2, state) + return [self._classic(0x32B, payload, feedback_ids=(0x407,), expected=f"rear_lock:{parameters['state']}")] + + if capability == "window.set_motion": + motion = self._enum(parameters, "motion", {"open": 1, "close": 2, "stop": 3}) + payload = self._window_payload(target, motion) + return [self._fd(0x431, payload, 3, 100, (0x388,), f"window_motion:{target}:{parameters['motion']}")] + if capability == "window.set_position": + position = self._integer(parameters, "position_pct", 0, 100) + if target not in {"front_left", "rear_left", "front_right", "rear_right"}: + raise NativeCanCompileError("absolute window position requires one window") + return [ + NativeFrameSpec( + frame_id=0x431, + payload=self._window_payload(target, 3), + is_fd=True, + bitrate_switch=True, + feedback_ids=(0x388,), + expected_feedback=f"window_position:{target}:{position}", + special_handler="window_position", + special_parameters={"target": target, "position_pct": position}, + ) + ] + + if capability in {"seat.set_heating", "seat.set_ventilation"}: + return [self._body_seat_frame(capability, target, parameters)] + + if capability in {"outlet.set_position_percent", "outlet.set_calibrated_position"}: + return [self._outlet_frame(capability, target, parameters)] + + if capability == "interior_light.set_indoor_power": + state = self._enum(parameters, "state", {"on": 1, "off": 2}) + payload = bytearray(8) + payload[0] = 0x0A + _set_bits(payload, 24, 3, state) + return [self._classic(0x32B, payload, feedback_ids=(0x42E,), expected=f"indoor_light:{parameters['state']}")] + if capability == "interior_light.set_wall_power": + state = self._enum(parameters, "state", {"on": 1, "off": 2}) + payload = bytearray(8) + payload[0] = 0x11 + _set_bits(payload, 20, 2, state) + return [self._classic(0x32B, payload)] + if capability == "interior_light.set_reading_power": + return [self._reading_light_frame(target, parameters)] + + if capability == "ambient_light.set_power": + value = self._enum(parameters, "state", {"off": 6, "on": 7}) + payload = bytearray(8) + payload[0] = 0x0A + _set_bits(payload, 27, 5, value) + return [self._classic(0x32B, payload, feedback_ids=(0x42E,), expected=f"ambient_power:{parameters['state']}")] + if capability == "ambient_light.set_mode": + value = self._enum( + parameters, + "mode", + {"camping": 1, "rest": 2, "cinema": 3, "meditation": 4, "romantic": 5, "off": 6, "on": 7}, + ) + payload = bytearray(8) + payload[0] = 0x0A + _set_bits(payload, 27, 5, value) + return [self._classic(0x32B, payload, feedback_ids=(0x42E,), expected=f"ambient_mode:{value}")] + if capability == "ambient_light.set_illumination": + color = str(parameters.get("color_hex", "")) + if len(color) != 7 or not color.startswith("#"): + raise NativeCanCompileError("color_hex must use #RRGGBB") + try: + red, green, blue = (int(color[index : index + 2], 16) for index in (1, 3, 5)) + except ValueError as exc: + raise NativeCanCompileError("color_hex must use #RRGGBB") from exc + if not all(1 <= value <= 255 for value in (red, green, blue)): + raise NativeCanCompileError("CAN_DEV RGB components must be between 1 and 255") + brightness = self._integer(parameters, "brightness_pct", 0, 100) + payload = bytearray((0x2B, red, green, blue, 0, 0, 0, 0)) + _set_bits(payload, 32, 7, brightness) + return [self._classic(0x32B, payload, feedback_ids=(0x42E,), expected="ambient_rgb")] + + if capability == "roof.set_shade_motion": + motion = self._enum(parameters, "motion", {"open": 1, "close": 2, "half": 3, "stop": 4}) + payload = bytearray(8) + _set_bits(payload, 4, 4, motion) + return [self._classic(0x431, payload, feedback_ids=(0x41A,), expected=f"shade_motion:{motion}")] + if capability == "roof.set_shade_position": + position = self._integer(parameters, "position_pct", 0, 100) + payload = bytearray(8) + payload[3] = 0xFF + payload[4] = position + return [self._classic(0x4F5, payload, feedback_ids=(0x41A,), expected=f"shade_position:{position}")] + + raise NativeCanCompileError(f"CAN_DEV does not implement {capability}") + + @staticmethod + def _classic( + frame_id: int, + payload: bytes | bytearray, + repeat: int = 1, + period_ms: int = 0, + feedback_ids: tuple[int, ...] = (), + expected: str = "", + ) -> NativeFrameSpec: + return NativeFrameSpec( + frame_id, + bytes(payload), + repeat_count=repeat, + period_ms=period_ms, + feedback_ids=feedback_ids, + expected_feedback=expected, + ) + + @staticmethod + def _fd( + frame_id: int, + payload: bytes | bytearray, + repeat: int = 1, + period_ms: int = 0, + feedback_ids: tuple[int, ...] = (), + expected: str = "", + ) -> NativeFrameSpec: + return NativeFrameSpec( + frame_id, + bytes(payload), + is_fd=True, + bitrate_switch=True, + repeat_count=repeat, + period_ms=period_ms, + feedback_ids=feedback_ids, + expected_feedback=expected, + ) + + @staticmethod + def _enum(parameters: dict[str, Any], name: str, values: dict[str, int]) -> int: + value = str(parameters.get(name)) + try: + return values[value] + except KeyError as exc: + raise NativeCanCompileError( + f"{name} must be one of {', '.join(values)}" + ) from exc + + @staticmethod + def _integer( + parameters: dict[str, Any], name: str, minimum: int, maximum: int + ) -> int: + value = parameters.get(name) + if isinstance(value, bool) or not isinstance(value, (int, float)): + raise NativeCanCompileError(f"{name} must be an integer") + integer = int(value) + if integer != value or not minimum <= integer <= maximum: + raise NativeCanCompileError( + f"{name} must be between {minimum} and {maximum}" + ) + return integer + + @staticmethod + def _window_payload(target: str, motion: int) -> bytes: + masks = { + "front_left": 0b0001, + "rear_left": 0b0010, + "front_right": 0b0100, + "rear_right": 0b1000, + "front": 0b0101, + "rear": 0b1010, + "all": 0b1111, + } + try: + mask = masks[target] + except KeyError as exc: + raise NativeCanCompileError(f"unsupported window target {target}") from exc + starts = (48, 56, 51, 59) + payload = bytearray(8) + for index, start in enumerate(starts): + if mask & (1 << index): + _set_bits(payload, start, 3, motion) + return bytes(payload) + + def _outlet_frame( + self, capability: str, target: str, parameters: dict[str, Any] + ) -> NativeFrameSpec: + ranges = self.calibration["air_outlet"]["ranges"] + if target not in ranges: + raise NativeCanCompileError(f"unsupported outlet target {target}") + if capability == "outlet.set_position_percent": + horizontal_pct = self._integer(parameters, "horizontal_pct", 0, 100) + vertical_pct = self._integer(parameters, "vertical_pct", 0, 100) + horizontal_range = ranges[target]["horizontal"] + vertical_range = ranges[target]["vertical"] + horizontal = horizontal_range[0] + ( + (horizontal_range[1] - horizontal_range[0]) * horizontal_pct + 50 + ) // 100 + vertical = vertical_range[0] + ( + (vertical_range[1] - vertical_range[0]) * vertical_pct + 50 + ) // 100 + else: + horizontal = self._integer(parameters, "horizontal_value", -128, 126) + vertical = self._integer(parameters, "vertical_value", -128, 126) + horizontal_range = ranges[target]["horizontal"] + vertical_range = ranges[target]["vertical"] + if not horizontal_range[0] <= horizontal <= horizontal_range[1]: + raise NativeCanCompileError("horizontal_value exceeds the calibrated range") + if not vertical_range[0] <= vertical <= vertical_range[1]: + raise NativeCanCompileError("vertical_value exceeds the calibrated range") + + side, position = target.split("_", 1) + sub_id = 0x02 if side == "driver" else 0x03 + starts = { + "left": (24, 8), + "right": (32, 16), + } + horizontal_start, vertical_start = starts[position] + payload = bytearray((sub_id, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0)) + if sub_id == 0x02: + payload[6] = 0xFF + payload[7] = 0xFF + _set_bits(payload, horizontal_start, 8, horizontal + 128) + _set_bits(payload, vertical_start, 8, vertical + 128) + return self._fd( + 0x4EF, + payload, + 3, + 100, + (0x2F5, 0x37B), + f"outlet:{target}:{horizontal}:{vertical}", + ) + + def _body_seat_frame( + self, capability: str, target: str, parameters: dict[str, Any] + ) -> NativeFrameSpec: + indexes = {"driver": 0, "passenger": 1, "left_rear": 2, "right_rear": 3} + if target not in indexes: + raise NativeCanCompileError(f"unsupported body seat target {target}") + state = str(parameters.get("state")) + if state not in {"on", "off"}: + raise NativeCanCompileError("state must be on or off") + feature = "heating" if capability.endswith("heating") else "ventilation" + index = indexes[target] + payload = bytearray(8) + if state == "off": + payload[0] = 0x20 + starts = (12, 20, 28, 36) if feature == "heating" else (8, 16, 24, 32) + _set_bits(payload, starts[index], 2, 2) + else: + level = self._integer(parameters, "level", 1, 5) + payload[0] = 0x21 + starts = (12, 20, 28, 36) if feature == "heating" else (8, 16, 24, 32) + _set_bits(payload, starts[index], 4, level) + return self._classic(0x4C1, payload, feedback_ids=(0x42A,), expected=f"body_seat:{target}:{feature}:{state}") + + def _reading_light_frame( + self, target: str, parameters: dict[str, Any] + ) -> NativeFrameSpec: + state = self._enum(parameters, "state", {"off": 1, "on": 2}) + if target == "all": + payload = bytearray((0, 0, 3, 0xFF, 0xFF, 0, 0, 0)) + _set_bits(payload, 50, 2, state) + return self._fd(0x4F5, payload, 3, 100, (0x42E,), f"reading_all:{parameters['state']}") + starts = { + "front_left": 0, + "front_right": 2, + "middle_left": 4, + "middle_right": 6, + "middle_left_rotary": 8, + "middle_right_rotary": 10, + "rear_left": 12, + "rear_right": 14, + } + try: + start = starts[target] + except KeyError as exc: + raise NativeCanCompileError(f"unsupported reading-light target {target}") from exc + payload = bytearray(8) + _set_bits(payload, start, 2, state) + return self._fd(0x1B2, payload, 3, 100, expected=f"reading:{target}:{parameters['state']}") + + +class NativeCanExecutor: + """Submit compiled vehicle frames and capture post-command feedback.""" + + def __init__( + self, + bus_factory: Callable[[], CanBus], + *, + feedback_timeout_ms: int = 1_200, + ): + self.bus_factory = bus_factory + self.feedback_timeout_ms = feedback_timeout_ms + + def execute( + self, + runtime: NativeCanRuntime, + command_plan: dict[str, Any], + function_config: dict[str, Any], + ) -> dict[str, Any]: + started_at = _now() + operations = { + operation["id"]: operation + for operation in function_config["spec"]["operations"] + } + results: list[dict[str, Any]] = [] + bus = self.bus_factory() + try: + for command in command_plan["spec"]["commands"]: + operation = operations[command["operation_ref"]] + try: + if command["signals"].get("special_handler") == "window_position": + sent_frames, feedback = self._execute_window_position(bus, command) + else: + sent_frames = self._send_command(bus, command) + feedback = self._wait_feedback(bus, command) + feedback_match = self._feedback_matches(command, feedback) + feedback_required = bool( + str(command["signals"].get("feedback_ids", "")).strip() + ) + verified = ( + (not feedback_required or feedback is not None) + and feedback_match is not False + ) + results.append( + { + "ref": operation["id"], + "domain": function_config["spec"]["domain"], + "status": "succeeded" if verified else "failed", + "message": ( + "CAN 盒已提交车端控制帧并观察到匹配反馈。" + if feedback_match is True + else "CAN 盒已提交车端控制帧并观察到后续状态帧。" + if feedback is not None + else "CAN 盒已提交车端控制帧;当前反馈窗口未观察到对应状态帧。" + ), + "telemetry": { + "target": operation["target"]["zone"], + "requested_parameters": operation["parameters"], + "command_frame": runtime.command_frame_public(command), + "sent_frames": [frame.public() for frame in sent_frames], + "feedback_frame": feedback.public() if feedback else None, + "feedback_observed": feedback is not None, + "feedback_match": feedback_match, + "feedback_required": feedback_required, + "channel": 1, + "simulated": False, + }, + } + ) + except Exception as exc: # noqa: BLE001 - normalize adapter faults + results.append( + { + "ref": operation["id"], + "domain": function_config["spec"]["domain"], + "status": "failed", + "message": str(exc), + "telemetry": { + "target": operation["target"]["zone"], + "requested_parameters": operation["parameters"], + "command_frame": runtime.command_frame_public(command), + "channel": 1, + "simulated": False, + }, + } + ) + break + finally: + bus.close() + return runtime._report(function_config, results, started_at, "vehicle") + + @staticmethod + def _send_command(bus: CanBus, command: dict[str, Any]) -> list[CanFrame]: + signals = command["signals"] + frame_id = int(str(signals["frame_id"]), 0) + payload = bytes.fromhex(str(signals["data_hex"])) + repeat = command.get("repeat", {"count": 1, "period_ms": 0}) + sent: list[CanFrame] = [] + for index in range(int(repeat["count"])): + sent.append( + bus.send( + frame_id, + payload, + is_fd=bool(signals["is_fd"]), + bitrate_switch=bool(signals["bitrate_switch"]), + ) + ) + if index + 1 < int(repeat["count"]): + time.sleep(int(repeat["period_ms"]) / 1000) + return sent + + def _wait_feedback( + self, bus: CanBus, command: dict[str, Any] + ) -> CanFrame | None: + raw_ids = str(command["signals"].get("feedback_ids", "")) + feedback_ids = { + int(value, 0) for value in raw_ids.split(",") if value.strip() + } + if not feedback_ids: + return None + deadline = time.monotonic() + self.feedback_timeout_ms / 1000 + while time.monotonic() < deadline: + remaining_ms = max(1, int((deadline - time.monotonic()) * 1000)) + frame = bus.receive(min(remaining_ms, 100), include_fd=True) + if frame is not None and frame.arbitration_id in feedback_ids: + return frame + return None + + def _execute_window_position( + self, bus: CanBus, command: dict[str, Any] + ) -> tuple[list[CanFrame], CanFrame | None]: + parameters = json.loads(command["signals"]["special_parameters"]) + target = str(parameters["target"]) + goal = int(parameters["position_pct"]) + indexes = {"front_left": 0, "rear_left": 1, "front_right": 2, "rear_right": 3} + index = indexes[target] + before = self._wait_for_id(bus, 0x388, 2_500) + if before is None or len(before.data) < 6 or before.data[2 + index] > 100: + raise RuntimeError("未收到有效且新鲜的 0x388 车窗位置,拒绝启动机构") + current = int(before.data[2 + index]) + if abs(current - goal) <= 3: + return [], before + motion = 1 if goal > current else 2 + start_payload = NativeCanRuntime._window_payload(target, motion) + stop_payload = NativeCanRuntime._window_payload(target, 3) + sent: list[CanFrame] = [] + for attempt in range(3): + sent.append(bus.send(0x431, start_payload, is_fd=True, bitrate_switch=True)) + if attempt < 2: + time.sleep(0.1) + deadline = time.monotonic() + 12 + reached: CanFrame | None = None + try: + while time.monotonic() < deadline: + frame = self._wait_for_id(bus, 0x388, 200) + if frame is None or len(frame.data) < 6 or frame.data[2 + index] > 100: + continue + if abs(int(frame.data[2 + index]) - goal) <= 3: + reached = frame + break + finally: + for attempt in range(3): + sent.append(bus.send(0x431, stop_payload, is_fd=True, bitrate_switch=True)) + if attempt < 2: + time.sleep(0.1) + if reached is None: + raise RuntimeError("车窗在 12 秒内未到达目标,已发送停止序列") + return sent, reached + + @staticmethod + def _wait_for_id(bus: CanBus, frame_id: int, timeout_ms: int) -> CanFrame | None: + deadline = time.monotonic() + timeout_ms / 1000 + while time.monotonic() < deadline: + remaining = max(1, int((deadline - time.monotonic()) * 1000)) + frame = bus.receive(min(remaining, 100), include_fd=True) + if frame is not None and frame.arbitration_id == frame_id: + return frame + return None + + @staticmethod + def _feedback_matches( + command: dict[str, Any], frame: CanFrame | None + ) -> bool | None: + if frame is None: + return None + expected = str(command["signals"].get("expected_feedback", "")) + if not expected or frame.arbitration_id != 0x404 or len(frame.data) < 6: + return None + parts = expected.split(":") + if parts[0] == "climate_power": + actual = frame.data[1] & 0x03 + return actual == (1 if parts[1] == "on" else 2) + if parts[0] == "climate_control": + return ((frame.data[1] >> 2) & 0x03) == int(parts[1]) + if parts[0] == "climate_mode": + return (frame.data[2] & 0x0F) == int(parts[1]) + if parts[0] == "climate_fan": + return ((frame.data[2] >> 4) & 0x0F) == int(parts[1]) + if parts[0] == "climate_temperature": + byte_index = {"driver": 4, "passenger": 5}.get(parts[1]) + return None if byte_index is None else frame.data[byte_index] == int(parts[2]) + return None diff --git a/src/cognitive_agent/application/seat_service.py b/src/cognitive_agent/application/seat_service.py index 5b64e19..fa31355 100755 --- a/src/cognitive_agent/application/seat_service.py +++ b/src/cognitive_agent/application/seat_service.py @@ -8,6 +8,7 @@ import re import sys import time import uuid +from concurrent.futures import ThreadPoolExecutor from copy import deepcopy from datetime import UTC, datetime from pathlib import Path @@ -46,10 +47,16 @@ from cognitive_agent.application.mode_profile import ( # noqa: E402 from cognitive_agent.application.model_plan_adapter import ( # noqa: E402 ModelPlanAdapter, APPLY_PRESET_CAPABILITY, + DYNAMIC_MODE_STOP_CAPABILITY, SAVE_PRESET_CAPABILITY, SEAT_CAPABILITIES, SEAT_MOTION_CAPABILITIES, ) +from cognitive_agent.application.native_can_intent import merge_native_can_intent # noqa: E402 +from cognitive_agent.application.native_can_runtime import ( # noqa: E402 + NativeCanExecutor, + NativeCanRuntime, +) from cognitive_agent.application.seat_calibration import position_pct_to_angle # noqa: E402 from cognitive_agent.application.vehicle_profile import ( # noqa: E402 VehicleProfile, @@ -63,7 +70,9 @@ from cognitive_agent.infrastructure.can.hardware import ( # noqa: E402 HardwareSafetyError, PHYSICAL_BENCH_COORDINATOR, SeatHardwareSettings, + VehicleCanSettings, ) +from cognitive_agent.infrastructure.can.gateway import ZlgChannelConfig # noqa: E402 from cognitive_agent.infrastructure.can.access import ( # noqa: E402 PHYSICAL_BENCH_ACCESS, ) @@ -112,6 +121,18 @@ SEAT_AXIS_TO_CAPABILITY = { SEAT_FUNCTION_TO_CAPABILITY = { function: capability for capability, function in SEAT_CAPABILITIES.items() } +DYNAMIC_MODE_STOP_WORDS = ("停止", "关闭", "结束", "取消", "停下", "退出") +DYNAMIC_MODE_WORDS = ( + "动态模式", + "动态座椅", + "木马模式", + "木马", + "摇摇马", + "骑木马", + "rocking horse", + "动态摇篮", + "摇篮模式", +) class SeatDemoService: @@ -142,6 +163,8 @@ class SeatDemoService: repository_root / "platforms" / "t2g_seat_bench" / "calibration" / "seat.yaml", ) self.hardware_settings = SeatHardwareSettings.from_env(repository_root) + self.vehicle_can_settings = VehicleCanSettings.from_env(repository_root) + self.native_can_runtime = NativeCanRuntime(repository_root) self.hardware_execution = PHYSICAL_BENCH_COORDINATOR self.hardware_access = PHYSICAL_BENCH_ACCESS # Shared by the short-lived hardware executor instances. A process must @@ -192,8 +215,18 @@ class SeatDemoService: "platform": "reference_vehicle", "execution_mode": "dry_run", "execution_modes": ["dry_run", "simulated_hardware", "hardware"], - "hardware_execution_allowed": self.hardware_settings.configured, + "hardware_execution_allowed": ( + self.hardware_settings.configured + and self.vehicle_can_settings.configured + ), "hardware": hardware_info, + "vehicle_can": self.vehicle_can_settings.public_info(), + "multi_channel_can": { + "adapter_ownership": "single_process", + "seat_channel": self.hardware_settings.channel, + "vehicle_channel": self.vehicle_can_settings.channel, + "channels_must_be_distinct": True, + }, "seat_position_memory_synchronized": bool( self._seat_position_memory_state.get("synchronized", False) ), @@ -298,10 +331,13 @@ class SeatDemoService: "actuator_state": context["devices"], } - def _new_hardware_executor(self) -> HardwareSeatExecutor: + def _new_hardware_executor( + self, bus_factory: Any | None = None + ) -> HardwareSeatExecutor: + resolved_bus_factory = bus_factory or self.hardware_settings.bus_factory() return HardwareSeatExecutor( self.hardware_matrix, - self.hardware_settings.bus_factory(), + resolved_bus_factory, thermal_timeout_ms=self.hardware_settings.thermal_timeout_ms, ack_timeout_ms=self.hardware_settings.ack_timeout_ms, axis_maximum_x100={ @@ -319,7 +355,7 @@ class SeatDemoService: ), auto_home=self.hardware_settings.auto_home_enabled, home_timeout_s=self.hardware_settings.home_timeout_s, - firmware_guard=self.hardware_settings.firmware_guard(), + firmware_guard=self.hardware_settings.firmware_guard(resolved_bus_factory), synchronize_position_before_first_motion=( self.hardware_settings.position_sync_enabled ), @@ -414,8 +450,6 @@ class SeatDemoService: or mode_update is not None ) hardware_request = execution_mode == "hardware" - if hardware_request and not control_plane_request: - self.hardware_settings.authorize(approval_token) conversation_id = conversation_id or f"conv-{uuid.uuid4().hex}" if not CONVERSATION_ID_PATTERN.fullmatch(conversation_id): raise ValueError("conversation_id must start with conv- and contain only lowercase letters, numbers, or hyphens") @@ -512,7 +546,40 @@ class SeatDemoService: context, vehicle_profile, ) - parsed = self._apply_mode_profiles(parsed, matched_modes, context, vehicle_profile) + if self._is_dynamic_mode_stop_request(utterance): + parsed = self._apply_dynamic_mode_stop_request(parsed, utterance) + else: + parsed = self._apply_mode_profiles( + parsed, matched_modes, context, vehicle_profile + ) + parsed = merge_native_can_intent(parsed, utterance) + parsed = self._partition_native_actions( + parsed, promote_supported=hardware_request + ) + if hardware_request and not control_plane_request: + if parsed.get("actions"): + self.hardware_settings.authorize(approval_token) + if parsed.get("native_can_actions"): + self.vehicle_can_settings.authorize(approval_token) + if not parsed.get("actions") and not parsed.get("native_can_actions"): + raise HardwareSafetyError( + "hardware mode requires at least one verified seat or vehicle CAN operation" + ) + if parsed.get("actions") and parsed.get("native_can_actions"): + if self.hardware_settings.backend != "zlgcan": + raise HardwareSafetyError( + "linked seat/vehicle execution requires the shared zlgcan backend" + ) + try: + seat_channel = int(self.hardware_settings.channel, 0) + except ValueError as exc: + raise HardwareSafetyError( + "ZLG seat CAN channel must be an integer" + ) from exc + if seat_channel == self.vehicle_can_settings.channel: + raise HardwareSafetyError( + "seat and vehicle CAN must use different adapter channels" + ) self._trace( traces, request_id, @@ -580,14 +647,9 @@ class SeatDemoService: }, ) - if parsed.get("domain_actions") or any( + if parsed.get("domain_actions") or parsed.get("native_can_actions") or any( domain != "seat" for domain in detected_domains ): - if hardware_request and not parsed.get("actions"): - raise HardwareSafetyError( - "hardware mode requires at least one passenger seat operation; " - "non-seat-only requests stay dry-run" - ) return self._process_orchestrated( utterance, request_id, @@ -1405,6 +1467,63 @@ class SeatDemoService: ) return merged + @staticmethod + def _is_dynamic_mode_stop_request(utterance: str) -> bool: + compact = re.sub(r"\s+", "", utterance) + if any(negation in compact for negation in ("不要停止", "无需停止", "别停止")): + return False + return any(word in compact for word in DYNAMIC_MODE_STOP_WORDS) and any( + word in compact for word in DYNAMIC_MODE_WORDS + ) + + def _apply_dynamic_mode_stop_request( + self, + parsed: dict[str, Any], + utterance: str, + ) -> dict[str, Any]: + """Make explicit stop language authoritative over a matched start profile.""" + + stopped = deepcopy(parsed) + stopped["actions"] = [ + action + for action in stopped.get("actions", []) + if action.get("action_type") not in {"dynamic_mode", "dynamic_mode_stop"} + ] + stopped["actions"].append( + {"action_type": "dynamic_mode_stop", "target": "passenger"} + ) + stopped["model_requests"] = [ + request + for request in stopped.get("model_requests", []) + if request.get("capability") + not in {"seat.start_dynamic_mode", DYNAMIC_MODE_STOP_CAPABILITY} + ] + stopped["model_requests"].append( + { + "domain": "seat", + "capability": DYNAMIC_MODE_STOP_CAPABILITY, + "target_scope": "passenger", + "operation": "deactivate", + "parameters": [], + "reason": "用户明确要求停止动态座椅循环。", + "source_span": utterance, + } + ) + stopped["ambiguities"] = [ + item + for item in stopped.get("ambiguities", []) + if item.get("field") != "capability" + ] + stopped["detected_domains"] = self._merge_domains( + ["seat"], stopped.get("detected_domains", []) + ) + stopped["decision_summary"] = [ + "识别到停止动态座椅模式指令;不会重新启动同名长期模式。", + *stopped.get("decision_summary", []), + ] + stopped["confidence"] = max(float(stopped.get("confidence", 0)), 0.99) + return stopped + @staticmethod def _contains_seat_preset_request(parsed: dict[str, Any]) -> bool: capabilities = { @@ -1454,6 +1573,19 @@ class SeatDemoService: action.get("target"), action.get("axis"), ) + if action.get("action_type") == "dynamic_mode_stop": + return ( + "seat", + "dynamic_mode_stop", + action.get("target"), + ) + if action.get("action_type") == "dynamic_mode": + return ( + "seat", + "dynamic_mode", + action.get("target"), + action.get("mode_id"), + ) return ( "seat", "function", @@ -2136,6 +2268,24 @@ class SeatDemoService: "parameters": parameters, "reason": "用户固化的座椅位置模式动作。", } + if action.get("action_type") == "dynamic_mode_stop": + return { + "domain": "seat", + "capability": DYNAMIC_MODE_STOP_CAPABILITY, + "target_scope": action["target"], + "operation": "deactivate", + "parameters": {}, + "reason": "用户固化的动态座椅停止动作。", + } + if action.get("action_type") == "dynamic_mode": + return { + "domain": "seat", + "capability": "seat.start_dynamic_mode", + "target_scope": action["target"], + "operation": "set", + "parameters": {"mode_id": int(action["mode_id"])}, + "reason": "用户固化的固件原生动态座椅模式。", + } function = action.get("function") capability = SEAT_FUNCTION_TO_CAPABILITY.get(str(function)) if capability is None: @@ -2152,6 +2302,71 @@ class SeatDemoService: "reason": "用户固化的座椅舒适功能模式动作。", } + def _partition_native_actions( + self, parsed: dict[str, Any], *, promote_supported: bool = False + ) -> dict[str, Any]: + """Promote verified CAN_DEV capabilities and leave unsupported domains virtual.""" + + result = deepcopy(parsed) + native_actions = list(result.get("native_can_actions", [])) + native_signatures = { + ( + str(action.get("domain")), + str(action.get("capability")), + str(action.get("target", action.get("target_scope", "vehicle"))), + json.dumps(action.get("parameters", {}), sort_keys=True, ensure_ascii=False), + ) + for action in native_actions + } + virtual_actions: list[dict[str, Any]] = [] + for action in result.get("domain_actions", []): + signature = ( + str(action.get("domain")), + str(action.get("capability")), + str(action.get("target", action.get("target_scope", "vehicle"))), + json.dumps(action.get("parameters", {}), sort_keys=True, ensure_ascii=False), + ) + if signature in native_signatures: + continue + if promote_supported and self.native_can_runtime.supports(action): + promoted = dict(action) + promoted["execution_backend"] = "native_can" + native_actions.append(promoted) + else: + virtual_actions.append(action) + + deduplicated: list[dict[str, Any]] = [] + signatures: set[tuple[str, str, str, str]] = set() + for action in native_actions: + signature = ( + str(action.get("domain")), + str(action.get("capability")), + str(action.get("target", action.get("target_scope", "vehicle"))), + json.dumps(action.get("parameters", {}), sort_keys=True, ensure_ascii=False), + ) + if signature not in signatures: + signatures.add(signature) + deduplicated.append(action) + + result["domain_actions"] = virtual_actions + result["native_can_actions"] = deduplicated + detected_domains = list(result.get("detected_domains", [])) + if result.get("actions") and "seat" not in detected_domains: + detected_domains.insert(0, "seat") + for action in [*virtual_actions, *deduplicated]: + if action["domain"] not in detected_domains: + detected_domains.append(action["domain"]) + result["detected_domains"] = detected_domains + result["deferred_requests"] = [ + item + for item in result.get("deferred_requests", []) + if not ( + item.get("execution_backend") == "native_can" + and self.native_can_runtime.supports(item) + ) + ] + return result + def _process_orchestrated( self, utterance: str, @@ -2172,10 +2387,17 @@ class SeatDemoService: vehicle_profile = vehicle_profile or self.vehicle_profiles.default() generation_started = time.perf_counter() intent_ir = build_intent_ir(parsed, utterance, request_id, provider_used) - for action in parsed.get("domain_actions", []): - capability = self.domain_runtimes[action["domain"]].capabilities[ - action["capability"] - ] + intent_actions = [ + *parsed.get("domain_actions", []), + *parsed.get("native_can_actions", []), + ] + for action in intent_actions: + if action in parsed.get("native_can_actions", []): + capability = self.native_can_runtime.capabilities[action["capability"]] + else: + capability = self.domain_runtimes[action["domain"]].capabilities[ + action["capability"] + ] intent_ir["spec"]["requests"].append( { "domain": action["domain"], @@ -2212,6 +2434,20 @@ class SeatDemoService: provider_used, ) + native_config_keys: set[str] = set() + native_actions_by_domain: dict[str, list[dict[str, Any]]] = {} + for action in parsed.get("native_can_actions", []): + native_actions_by_domain.setdefault(action["domain"], []).append(action) + for domain, actions in native_actions_by_domain.items(): + key = f"native_{domain}" + native_config_keys.add(key) + configs[key] = self.native_can_runtime.build_function_config( + domain, + actions, + request_id, + provider_used, + ) + result["function_configs"] = configs result["function_config"] = ( configs.get("seat") or next(iter(configs.values()), None) @@ -2252,7 +2488,8 @@ class SeatDemoService: "message": ambiguity["question"], } ) - validation.append( + if not native_config_keys: + validation.append( { "severity": "warning", "code": "VIRTUAL_EXECUTION_ONLY", @@ -2269,8 +2506,8 @@ class SeatDemoService: "code": "NO_EXECUTABLE_OPERATION", "path": "spec.operations", "message": "模型没有生成任何可执行领域操作。", - } - ) + } + ) if hardware_request: self._adapt_validation_for_hardware(validation) result["validation"] = validation @@ -2310,6 +2547,8 @@ class SeatDemoService: ) else: plans[domain] = self.compiler.compile(config) + elif domain in native_config_keys: + plans[domain] = self.native_can_runtime.compile(config) else: runtime = self.domain_runtimes[domain] plans[domain] = runtime.compile(config) @@ -2388,37 +2627,47 @@ class SeatDemoService: execute_started = time.perf_counter() execution_started_at = _now() - reports: dict[str, dict[str, Any]] = {} - for domain, config in configs.items(): - if domain == "seat": - if hardware_request: - reports[domain] = self._new_hardware_executor().execute( - plans[domain], config, context["devices"] - ) - elif simulated_hardware_request: - reports[domain] = self.simulated_hardware_executor.execute( - plans[domain], - config, - context["devices"], - fault_scenario=simulation_fault, - ) - else: - reports[domain] = self.executor.execute( - plans[domain], config, context["devices"] - ) - else: - reports[domain] = self.domain_runtimes[domain].execute( - plans[domain], config - ) + reports = self._execute_orchestrated_reports( + configs, + plans, + native_config_keys, + context, + hardware_request=hardware_request, + simulated_hardware_request=simulated_hardware_request, + simulation_fault=simulation_fault, + ) report_results = [ item for domain_report in reports.values() for item in domain_report["spec"]["results"] ] + operation_results = [ + item + for item in report_results + if item.get("ref") != "seat-controller-firmware" + ] + operation_domains = { + str(item.get("domain")) for item in operation_results + } + successful_domains = { + domain + for domain in operation_domains + if all( + item.get("status") == "succeeded" + for item in operation_results + if str(item.get("domain")) == domain + ) + } + failed_domains = { + str(item.get("domain")) + for item in operation_results + if item.get("status") == "failed" + } execution_succeeded = all( domain_report["spec"]["status"] == "succeeded" for domain_report in reports.values() ) and all(item.get("status") == "succeeded" for item in report_results) + execution_partially_succeeded = bool(successful_domains and failed_domains) physical_state = ( reports.get("seat", {}).get("spec", {}).get("physical_state") if hardware_request @@ -2477,6 +2726,8 @@ class SeatDemoService: result["validation"] = validation if report_issues: result["status"] = "execution_report_invalid" + elif execution_partially_succeeded: + result["status"] = "partially_succeeded" elif not execution_succeeded: result["status"] = "execution_failed" elif parsed.get("deferred_requests"): @@ -2496,7 +2747,14 @@ class SeatDemoService: "副驾座椅已按物理 CAN 回读闭环执行,其他领域已完成虚拟 CAN 执行。" if hardware_request and execution_succeeded else ( - f"副驾座椅真实执行失败:{failed_execution['message']}" + ( + "跨域指令部分执行成功;成功域=" + f"{','.join(sorted(successful_domains))},失败域=" + f"{','.join(sorted(failed_domains))}:" + f"{failed_execution['message']}" + ) + if execution_partially_succeeded and failed_execution + else f"真实 CAN 执行失败:{failed_execution['message']}" if hardware_request and failed_execution else ( f"模拟台架已执行 {len(report_results)} 个领域操作,物理 CAN 未打开。" @@ -2523,19 +2781,40 @@ class SeatDemoService: "failed_domain": ( failed_execution.get("domain") if failed_execution else None ), + "successful_domains": sorted(successful_domains), + "failed_domains": sorted(failed_domains), + "partially_succeeded": execution_partially_succeeded, }, domain="orchestration", ) - if execution_succeeded and not report_issues: - seat_actions = parsed.get("actions", []) - if hardware_request: + if (execution_succeeded or execution_partially_succeeded) and not report_issues: + seat_actions = ( + parsed.get("actions", []) + if execution_succeeded or "seat" in successful_domains + else [] + ) + if hardware_request and seat_actions and "seat" in reports: seat_actions = self._hardware_feedback_actions( seat_actions, configs["seat"], reports["seat"], ) - all_actions = [*seat_actions, *parsed.get("domain_actions", [])] + all_actions = [ + *seat_actions, + *[ + action + for action in parsed.get("domain_actions", []) + if execution_succeeded + or str(action.get("domain")) in successful_domains + ], + *[ + action + for action in parsed.get("native_can_actions", []) + if execution_succeeded + or str(action.get("domain")) in successful_domains + ], + ] updated_context = self.conversations.apply_successful_actions( conversation_id, utterance, @@ -2559,11 +2838,17 @@ class SeatDemoService: request_id, "state_update", "succeeded", - f"跨域会话状态已更新为第 {updated_context['turn_count']} 轮。", + ( + f"跨域会话状态已更新为第 {updated_context['turn_count']} 轮。" + if execution_succeeded + else "仅成功设备已写入会话状态;失败设备保持执行前状态。" + ), time.perf_counter(), { "seat_state": updated_context["devices"], "domain_state": updated_context["domain_devices"], + "successful_domains": sorted(successful_domains), + "failed_domains": sorted(failed_domains), }, domain="orchestration", ) @@ -2595,6 +2880,111 @@ class SeatDemoService: self._persist(result) return result + def _execute_orchestrated_reports( + self, + configs: dict[str, dict[str, Any]], + plans: dict[str, dict[str, Any]], + native_config_keys: set[str], + context: dict[str, Any], + *, + hardware_request: bool, + simulated_hardware_request: bool, + simulation_fault: str, + ) -> dict[str, dict[str, Any]]: + reports: dict[str, dict[str, Any]] = {} + bridge = None + seat_bus_factory = None + native_bus_factory = None + + if hardware_request and native_config_keys: + channel_configs = [self.vehicle_can_settings.channel_config()] + if "seat" in configs: + seat_channel = int(self.hardware_settings.channel, 0) + channel_configs.insert( + 0, + ZlgChannelConfig( + channel=seat_channel, + arbitration_bitrate=self.hardware_settings.bitrate, + data_bitrate=self.vehicle_can_settings.data_bitrate, + can_fd_iso=True, + ), + ) + bridge = self.vehicle_can_settings.bridge(channel_configs) + native_bus_factory = lambda: bridge.channel_bus( + self.vehicle_can_settings.channel + ) + if "seat" in configs: + seat_channel = int(self.hardware_settings.channel, 0) + seat_bus_factory = lambda: bridge.channel_bus(seat_channel) + + try: + def execute_native_configs() -> dict[str, dict[str, Any]]: + native_reports: dict[str, dict[str, Any]] = {} + for key in sorted(native_config_keys): + if not hardware_request: + native_reports[key] = self.native_can_runtime.execute_virtual( + plans[key], configs[key] + ) + continue + executor = NativeCanExecutor( + native_bus_factory, + feedback_timeout_ms=( + self.vehicle_can_settings.feedback_timeout_ms + ), + ) + native_reports[key] = executor.execute( + self.native_can_runtime, + plans[key], + configs[key], + ) + return native_reports + + def execute_seat_config() -> dict[str, Any]: + config = configs["seat"] + if hardware_request: + seat_executor = ( + self._new_hardware_executor(seat_bus_factory) + if seat_bus_factory is not None + else self._new_hardware_executor() + ) + return seat_executor.execute( + plans["seat"], config, context["devices"] + ) + if simulated_hardware_request: + return self.simulated_hardware_executor.execute( + plans["seat"], + config, + context["devices"], + fault_scenario=simulation_fault, + ) + return self.executor.execute( + plans["seat"], config, context["devices"] + ) + + if hardware_request and native_config_keys and "seat" in configs: + # Both channel views share one adapter owner; executor threads let + # the two channels start within normal USB scheduling jitter. + with ThreadPoolExecutor(max_workers=2) as pool: + native_future = pool.submit(execute_native_configs) + seat_future = pool.submit(execute_seat_config) + reports.update(native_future.result()) + reports["seat"] = seat_future.result() + else: + reports.update(execute_native_configs()) + if "seat" in configs: + reports["seat"] = execute_seat_config() + + for domain, config in configs.items(): + if domain in native_config_keys or domain == "seat": + continue + reports[domain] = self.domain_runtimes[domain].execute( + plans[domain], config + ) + finally: + if bridge is not None: + bridge.close() + return reports + @staticmethod def _build_scene_config( request_id: str, diff --git a/src/cognitive_agent/infrastructure/can/gateway.py b/src/cognitive_agent/infrastructure/can/gateway.py index 1a9e40d..1c43238 100755 --- a/src/cognitive_agent/infrastructure/can/gateway.py +++ b/src/cognitive_agent/infrastructure/can/gateway.py @@ -5,6 +5,7 @@ from __future__ import annotations import json import subprocess import threading +import time from dataclasses import dataclass from pathlib import Path from typing import Any, Protocol @@ -19,6 +20,9 @@ class CanFrame: arbitration_id: int data: bytes timestamp: float | None = None + channel: int | None = None + is_fd: bool = False + bitrate_switch: bool = False def public(self) -> dict[str, Any]: return { @@ -26,13 +30,25 @@ class CanFrame: "payload_size": len(self.data), "data_hex": " ".join(f"{byte:02X}" for byte in self.data), "timestamp": self.timestamp, + "channel": self.channel, + "is_fd": self.is_fd, + "bitrate_switch": self.bitrate_switch, } class CanBus(Protocol): - def send(self, arbitration_id: int, data: bytes) -> CanFrame: ... + def send( + self, + arbitration_id: int, + data: bytes, + *, + is_fd: bool = False, + bitrate_switch: bool = False, + ) -> CanFrame: ... - def receive(self, timeout_ms: int) -> CanFrame | None: ... + def receive( + self, timeout_ms: int, *, include_fd: bool = False + ) -> CanFrame | None: ... def close(self) -> None: ... @@ -58,7 +74,16 @@ class PythonCanBus: except Exception as exc: # noqa: BLE001 - normalize vendor exceptions raise CanGatewayError(f"cannot open {interface} CAN channel {channel}: {exc}") from exc - def send(self, arbitration_id: int, data: bytes) -> CanFrame: + def send( + self, + arbitration_id: int, + data: bytes, + *, + is_fd: bool = False, + bitrate_switch: bool = False, + ) -> CanFrame: + if is_fd: + raise CanGatewayError("PythonCanBus was opened for classic CAN only") if len(data) > 8: raise CanGatewayError("the T2G bench accepts classic CAN frames of at most 8 bytes") message = self._can.Message( @@ -71,9 +96,11 @@ class PythonCanBus: self._bus.send(message, timeout=0.5) except Exception as exc: # noqa: BLE001 raise CanGatewayError(f"CAN transmit failed: {exc}") from exc - return CanFrame(arbitration_id, bytes(data)) + return CanFrame(arbitration_id, bytes(data), is_fd=False) - def receive(self, timeout_ms: int) -> CanFrame | None: + def receive( + self, timeout_ms: int, *, include_fd: bool = False + ) -> CanFrame | None: try: message = self._bus.recv(max(0, timeout_ms) / 1000) except Exception as exc: # noqa: BLE001 @@ -84,14 +111,36 @@ class PythonCanBus: int(message.arbitration_id), bytes(message.data), float(message.timestamp) if message.timestamp is not None else None, + is_fd=bool(getattr(message, "is_fd", False)), + bitrate_switch=bool(getattr(message, "bitrate_switch", False)), ) def close(self) -> None: self._bus.shutdown() -class ZlgCanBridgeBus: - """Use the installed 32-bit ZLG driver from the 64-bit application process.""" +@dataclass(frozen=True) +class ZlgChannelConfig: + """Configuration for one channel on a shared ZLG CAN FD adapter.""" + + channel: int + arbitration_bitrate: int = 500_000 + data_bitrate: int = 2_000_000 + can_fd_iso: bool = True + termination_enabled: bool = True + + def public(self) -> dict[str, Any]: + return { + "channel": self.channel, + "arbitration_bitrate": self.arbitration_bitrate, + "data_bitrate": self.data_bitrate, + "can_fd_iso": self.can_fd_iso, + "termination_enabled": self.termination_enabled, + } + + +class ZlgCanBridgeProcess: + """Own one device handle and expose several independently addressed channels.""" def __init__( self, @@ -100,9 +149,15 @@ class ZlgCanBridgeBus: dll_path: Path, device_type: int, device_index: int, - channel: int, - bitrate: int, + channels: list[ZlgChannelConfig], + transmit_type: int = 0, ): + if not channels: + raise CanGatewayError("at least one ZLG channel must be configured") + channel_ids = [item.channel for item in channels] + if len(channel_ids) != len(set(channel_ids)): + raise CanGatewayError("ZLG channel numbers must be unique") + self._channels = frozenset(channel_ids) command = [ str(python_executable), str(bridge_script), @@ -112,10 +167,10 @@ class ZlgCanBridgeBus: str(device_type), "--device-index", str(device_index), - "--channel", - str(channel), - "--bitrate", - str(bitrate), + "--channels-json", + json.dumps([item.public() for item in channels], separators=(",", ":")), + "--transmit-type", + str(transmit_type), ] try: self._process = subprocess.Popen( # noqa: S603 - paths are trusted server config @@ -135,6 +190,11 @@ class ZlgCanBridgeBus: self.close() raise CanGatewayError(str(ready.get("message", "ZLG CAN bridge did not start"))) + def channel_bus(self, channel: int) -> "ZlgCanChannelBus": + if channel not in self._channels: + raise CanGatewayError(f"ZLG channel {channel} was not initialized") + return ZlgCanChannelBus(self, channel) + def _read_response(self) -> dict[str, Any]: if self._process.stdout is None: raise CanGatewayError("ZLG CAN bridge stdout is unavailable") @@ -160,32 +220,6 @@ class ZlgCanBridgeBus: self._process.stdin.flush() return self._read_response() - def send(self, arbitration_id: int, data: bytes) -> CanFrame: - response = self._request( - { - "operation": "send", - "arbitration_id": arbitration_id, - "data_hex": data.hex(), - } - ) - return CanFrame( - int(response["arbitration_id"]), - bytes.fromhex(response["data_hex"]), - ) - - def receive(self, timeout_ms: int) -> CanFrame | None: - response = self._request( - {"operation": "receive", "timeout_ms": max(0, int(timeout_ms))} - ) - frame = response.get("frame") - if frame is None: - return None - return CanFrame( - int(frame["arbitration_id"]), - bytes.fromhex(frame["data_hex"]), - float(frame["timestamp_us"]) / 1_000_000, - ) - def close(self) -> None: process = getattr(self, "_process", None) if process is None or process.poll() is not None: @@ -202,6 +236,114 @@ class ZlgCanBridgeBus: except subprocess.TimeoutExpired: process.kill() + def __enter__(self) -> "ZlgCanBridgeProcess": + return self + + def __exit__(self, *_: object) -> None: + self.close() + + +class ZlgCanChannelBus: + """Channel-scoped view over a shared :class:`ZlgCanBridgeProcess`.""" + + def __init__(self, bridge: ZlgCanBridgeProcess, channel: int): + self._bridge = bridge + self.channel = channel + + def send( + self, + arbitration_id: int, + data: bytes, + *, + is_fd: bool = False, + bitrate_switch: bool = False, + ) -> CanFrame: + response = self._bridge._request( + { + "operation": "send", + "channel": self.channel, + "arbitration_id": arbitration_id, + "data_hex": data.hex(), + "is_fd": is_fd, + "bitrate_switch": bitrate_switch, + } + ) + return CanFrame( + int(response["arbitration_id"]), + bytes.fromhex(response["data_hex"]), + channel=self.channel, + is_fd=bool(response.get("is_fd", False)), + bitrate_switch=bool(response.get("bitrate_switch", False)), + ) + + def receive( + self, timeout_ms: int, *, include_fd: bool = False + ) -> CanFrame | None: + requested_ms = max(0, int(timeout_ms)) + deadline = time.monotonic() + requested_ms / 1000 + while True: + remaining_ms = max(0, int((deadline - time.monotonic()) * 1000)) + response = self._bridge._request( + { + "operation": "receive", + "channel": self.channel, + # Short slices let another channel transmit or receive while + # this synchronous JSON bridge is waiting for feedback. + "timeout_ms": min(20, remaining_ms), + "include_fd": include_fd, + } + ) + frame = response.get("frame") + if frame is not None: + return CanFrame( + int(frame["arbitration_id"]), + bytes.fromhex(frame["data_hex"]), + float(frame["timestamp_us"]) / 1_000_000, + channel=self.channel, + is_fd=bool(frame.get("is_fd", False)), + bitrate_switch=bool(frame.get("bitrate_switch", False)), + ) + if requested_ms == 0 or time.monotonic() >= deadline: + return None + + def close(self) -> None: + # The owner closes all channel handles together. Executors may safely close views. + return None + + +class ZlgCanBridgeBus(ZlgCanChannelBus): + """Backward-compatible single-channel ZLG bus.""" + + def __init__( + self, + python_executable: Path, + bridge_script: Path, + dll_path: Path, + device_type: int, + device_index: int, + channel: int, + bitrate: int, + termination_enabled: bool = True, + ): + self._owner = ZlgCanBridgeProcess( + python_executable=python_executable, + bridge_script=bridge_script, + dll_path=dll_path, + device_type=device_type, + device_index=device_index, + channels=[ + ZlgChannelConfig( + channel=channel, + arbitration_bitrate=bitrate, + termination_enabled=termination_enabled, + ) + ], + ) + super().__init__(self._owner, channel) + + def close(self) -> None: + self._owner.close() + def __enter__(self) -> "ZlgCanBridgeBus": return self diff --git a/src/cognitive_agent/infrastructure/can/hardware.py b/src/cognitive_agent/infrastructure/can/hardware.py index 78d0ac9..0b76b37 100755 --- a/src/cognitive_agent/infrastructure/can/hardware.py +++ b/src/cognitive_agent/infrastructure/can/hardware.py @@ -19,7 +19,14 @@ from cognitive_agent.infrastructure.firmware import ( T2GSeatProgrammer, ) -from .gateway import CanBus, CanGatewayError, PythonCanBus, ZlgCanBridgeBus +from .gateway import ( + CanBus, + CanGatewayError, + PythonCanBus, + ZlgCanBridgeBus, + ZlgCanBridgeProcess, + ZlgChannelConfig, +) TRUE_VALUES = {"1", "true", "yes", "on"} @@ -32,6 +39,8 @@ CAPABILITY_PROFILE = { "seat.set_cushion_tilt": "combined", "seat.set_backrest_recline": "combined", "seat.set_legrest_height": "combined", + "seat.start_dynamic_mode": "combined", + "seat.stop_dynamic_mode": "combined", } @@ -132,6 +141,7 @@ class SeatHardwareSettings: profiles: frozenset[str] backend: str bitrate: int + termination_enabled: bool channel: str interface: str device_type: int @@ -196,6 +206,9 @@ class SeatHardwareSettings: profiles=_profiles_from_env(), backend=backend, bitrate=_env_int("COGNITIVE_AGENT_SEAT_CAN_BITRATE", 500_000), + termination_enabled=_env_bool( + "COGNITIVE_AGENT_SEAT_CAN_TERMINATION_ENABLED", default=True + ), channel=os.getenv("COGNITIVE_AGENT_SEAT_CAN_CHANNEL", "0").strip(), interface=os.getenv("COGNITIVE_AGENT_SEAT_CAN_INTERFACE", "socketcan").strip(), device_type=_env_int("COGNITIVE_AGENT_ZLGCAN_DEVICE_TYPE", 41), @@ -234,7 +247,7 @@ class SeatHardwareSettings: "COGNITIVE_AGENT_SEAT_HOME_TIMEOUT_S", 120 ), firmware_probe_timeout_ms=_env_int( - "COGNITIVE_AGENT_SEAT_FIRMWARE_PROBE_TIMEOUT_MS", 1_200 + "COGNITIVE_AGENT_SEAT_FIRMWARE_PROBE_TIMEOUT_MS", 3_500 ), firmware_boot_wait_ms=_env_int( "COGNITIVE_AGENT_SEAT_FIRMWARE_BOOT_WAIT_MS", 1_500 @@ -368,6 +381,7 @@ class SeatHardwareSettings: device_index=self.device_index, channel=numeric_channel, bitrate=self.bitrate, + termination_enabled=self.termination_enabled, ) return create_zlg_bus @@ -390,9 +404,11 @@ class SeatHardwareSettings: timeout_ms=self.firmware_program_timeout_ms, ) - def firmware_guard(self) -> T2GFirmwareGuard: + def firmware_guard( + self, bus_factory: Callable[[], CanBus] | None = None + ) -> T2GFirmwareGuard: return T2GFirmwareGuard( - self.bus_factory(), + bus_factory or self.bus_factory(), self._programmer() if self.auto_flash_enabled else None, auto_flash=self.auto_flash_enabled, probe_timeout_ms=self.firmware_probe_timeout_ms, @@ -420,6 +436,7 @@ class SeatHardwareSettings: "adapter_configured": self.adapter_configured, "channel": self.channel, "bitrate": self.bitrate, + "termination_enabled": self.termination_enabled, "frame_format": "classic_can_11_bit", "firmware_profiles": sorted(self.profiles), "firmware_images": images, @@ -450,3 +467,209 @@ class SeatHardwareSettings: "current diagnostics use conservative bench thresholds and do not replace external power limiting", ], } + + +@dataclass(frozen=True) +class VehicleCanSettings: + """Fail-closed channel/timing contract imported from the verified CAN_DEV branch.""" + + repository_root: Path + enabled: bool + approval_required: bool + approval_token: str + backend: str + channel: int + arbitration_bitrate: int + data_bitrate: int + termination_enabled: bool + clock_hz: int + arbitration_tseg1: int + arbitration_tseg2: int + arbitration_sjw: int + arbitration_brp: int + data_tseg1: int + data_tseg2: int + data_sjw: int + data_brp: int + feedback_timeout_ms: int + device_type: int + device_index: int + zlg_python: Path + zlg_dll: Path + bridge_script: Path + + @classmethod + def from_env(cls, repository_root: Path) -> "VehicleCanSettings": + return cls( + repository_root=repository_root, + enabled=_env_bool( + "COGNITIVE_AGENT_VEHICLE_CAN_ENABLED", + default=_env_bool("COGNITIVE_AGENT_HARDWARE_EXECUTION_ENABLED"), + ), + approval_required=_env_bool( + "COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN_REQUIRED", default=True + ), + approval_token=os.getenv("COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN", ""), + backend=os.getenv( + "COGNITIVE_AGENT_VEHICLE_CAN_BACKEND", "zlgcan" + ).strip().lower(), + channel=_env_int("COGNITIVE_AGENT_VEHICLE_CAN_CHANNEL", 1), + arbitration_bitrate=_env_int( + "COGNITIVE_AGENT_VEHICLE_CAN_ARBITRATION_BITRATE", 500_000 + ), + data_bitrate=_env_int( + "COGNITIVE_AGENT_VEHICLE_CAN_DATA_BITRATE", 2_000_000 + ), + termination_enabled=_env_bool( + "COGNITIVE_AGENT_VEHICLE_CAN_TERMINATION_ENABLED", default=False + ), + clock_hz=60_000_000, + arbitration_tseg1=14, + arbitration_tseg2=3, + arbitration_sjw=2, + arbitration_brp=5, + data_tseg1=10, + data_tseg2=2, + data_sjw=2, + data_brp=1, + feedback_timeout_ms=_env_int( + "COGNITIVE_AGENT_VEHICLE_CAN_FEEDBACK_TIMEOUT_MS", 1_500 + ), + device_type=_env_int("COGNITIVE_AGENT_ZLGCAN_DEVICE_TYPE", 41), + device_index=_env_int("COGNITIVE_AGENT_ZLGCAN_DEVICE_INDEX", 0), + zlg_python=Path( + os.getenv( + "COGNITIVE_AGENT_ZLGCAN_PYTHON", + r"C:\Program Files (x86)\ZCANPRO\python38\python.exe", + ) + ), + zlg_dll=Path( + os.getenv( + "COGNITIVE_AGENT_ZLGCAN_DLL", + r"C:\Program Files (x86)\ZCANPRO\zlgcan.dll", + ) + ), + bridge_script=repository_root + / "src" + / "cognitive_agent" + / "infrastructure" + / "can" + / "zlgcan_bridge.py", + ) + + @property + def adapter_configured(self) -> bool: + return bool( + self.backend == "zlgcan" + and self.zlg_python.is_file() + and self.zlg_dll.is_file() + and self.bridge_script.is_file() + ) + + @property + def configured(self) -> bool: + return bool( + self.enabled + and (not self.approval_required or self.approval_token) + and self.adapter_configured + and self.timing_is_verified + ) + + @property + def timing_is_verified(self) -> bool: + return ( + self.arbitration_bitrate == 500_000 + and self.data_bitrate == 2_000_000 + and 60_000_000 + // ((self.arbitration_brp + 1) * (self.arbitration_tseg1 + self.arbitration_tseg2 + 3)) + == 500_000 + and 60_000_000 + // ((self.data_brp + 1) * (self.data_tseg1 + self.data_tseg2 + 3)) + == 2_000_000 + ) + + def authorize(self, supplied_token: str | None) -> None: + if not self.enabled: + raise HardwareSafetyError( + "vehicle CAN execution is disabled; set COGNITIVE_AGENT_VEHICLE_CAN_ENABLED=true" + ) + if self.approval_required: + if not self.approval_token: + raise HardwareSafetyError( + "COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN is not configured" + ) + if not supplied_token or not hmac.compare_digest( + supplied_token, self.approval_token + ): + raise HardwareSafetyError("hardware approval token is invalid") + if self.backend != "zlgcan": + raise HardwareSafetyError( + "vehicle CAN FD currently requires the zlgcan multi-channel backend" + ) + if self.channel < 0: + raise HardwareSafetyError("vehicle CAN channel cannot be negative") + if not self.timing_is_verified: + raise HardwareSafetyError( + "vehicle CAN timing must remain ISO CAN FD 500 kbit/s / 2 Mbit/s at 80% sample point" + ) + if not 100 <= self.feedback_timeout_ms <= 10_000: + raise HardwareSafetyError( + "COGNITIVE_AGENT_VEHICLE_CAN_FEEDBACK_TIMEOUT_MS must be between 100 and 10000" + ) + if not self.adapter_configured: + raise HardwareSafetyError("the configured ZLG CAN FD runtime is not ready") + + def channel_config(self) -> ZlgChannelConfig: + return ZlgChannelConfig( + channel=self.channel, + arbitration_bitrate=self.arbitration_bitrate, + data_bitrate=self.data_bitrate, + can_fd_iso=True, + termination_enabled=self.termination_enabled, + ) + + def bridge(self, channels: list[ZlgChannelConfig]) -> ZlgCanBridgeProcess: + return ZlgCanBridgeProcess( + python_executable=self.zlg_python, + bridge_script=self.bridge_script, + dll_path=self.zlg_dll, + device_type=self.device_type, + device_index=self.device_index, + channels=channels, + ) + + def public_info(self) -> dict[str, Any]: + return { + "enabled": self.enabled, + "configured": self.configured, + "backend": self.backend, + "platform": "t2g_cabin_bench", + "channel": self.channel, + "mode": 0, + "work_mode": "normal", + "can_fd_standard": "ISO", + "termination_enabled": self.termination_enabled, + "clock_hz": self.clock_hz, + "arbitration": { + "bitrate": self.arbitration_bitrate, + "tseg1": self.arbitration_tseg1, + "tseg2": self.arbitration_tseg2, + "sjw": self.arbitration_sjw, + "smp": 0, + "brp": self.arbitration_brp, + "total_tq": 20, + "sample_point_percent": 80, + }, + "data": { + "bitrate": self.data_bitrate, + "tseg1": self.data_tseg1, + "tseg2": self.data_tseg2, + "sjw": self.data_sjw, + "smp": 0, + "brp": self.data_brp, + "total_tq": 15, + "sample_point_percent": 80, + }, + "source_branch": "project-code/CAN_DEV", + "source_commit": "6e7ed04a468dfcde7efda9e30bc15144bf02faf9", + } diff --git a/src/cognitive_agent/infrastructure/can/zlgcan_bridge.py b/src/cognitive_agent/infrastructure/can/zlgcan_bridge.py index 5cf7e94..c16114b 100755 --- a/src/cognitive_agent/infrastructure/can/zlgcan_bridge.py +++ b/src/cognitive_agent/infrastructure/can/zlgcan_bridge.py @@ -1,7 +1,9 @@ -"""32-bit JSON-line bridge for the ZLG zlgcan.dll API. +"""32-bit JSON-line bridge for a multi-channel ZLG CAN FD adapter. -This module deliberately has no project or third-party imports so it can run under -the 32-bit Python bundled with ZCANPRO while the web service uses 64-bit Python. +The module deliberately has no project or third-party imports. It runs under +the 32-bit Python bundled with ZCANPRO while the application uses 64-bit Python. +One bridge owns the physical adapter once and initializes every requested +channel, which avoids two processes racing to open the same USB device. """ from __future__ import annotations @@ -10,10 +12,12 @@ import argparse import ctypes import json import sys +import time ZCAN_TYPE_CANFD = 1 ZCAN_STATUS_OK = 1 +CANFD_BRS = 0x01 class ZcanClassicInit(ctypes.Structure): @@ -62,6 +66,17 @@ class ZcanFrame(ctypes.Structure): ] +class ZcanFdFrame(ctypes.Structure): + _fields_ = [ + ("can_id", ctypes.c_uint32), + ("len", ctypes.c_uint8), + ("flags", ctypes.c_uint8), + ("reserved0", ctypes.c_uint8), + ("reserved1", ctypes.c_uint8), + ("data", ctypes.c_uint8 * 64), + ] + + class ZcanTransmitData(ctypes.Structure): _fields_ = [("frame", ZcanFrame), ("transmit_type", ctypes.c_uint32)] @@ -70,6 +85,14 @@ class ZcanReceiveData(ctypes.Structure): _fields_ = [("frame", ZcanFrame), ("timestamp", ctypes.c_uint64)] +class ZcanTransmitFdData(ctypes.Structure): + _fields_ = [("frame", ZcanFdFrame), ("transmit_type", ctypes.c_uint32)] + + +class ZcanReceiveFdData(ctypes.Structure): + _fields_ = [("frame", ZcanFdFrame), ("timestamp", ctypes.c_uint64)] + + class ZcanChannelErrorInfo(ctypes.Structure): _fields_ = [ ("error_code", ctypes.c_uint32), @@ -87,45 +110,85 @@ class Driver: self.transmit_type = args.transmit_type self.dll = ctypes.WinDLL(args.dll) self._declare_functions() - self.device = self.dll.ZCAN_OpenDevice( - args.device_type, args.device_index, 0 - ) + self.device = self.dll.ZCAN_OpenDevice(args.device_type, args.device_index, 0) if not self.device: raise RuntimeError( - f"ZCAN_OpenDevice failed for device_type={args.device_type}, " - f"device_index={args.device_index}; connect the adapter and close " - "ZCANPRO first" + "ZCAN_OpenDevice failed for device_type={}, device_index={}; " + "connect the adapter and close ZCANPRO first".format( + args.device_type, args.device_index + ) ) - self.channel = None + self.channels = {} try: - bitrate = str(args.bitrate).encode("ascii") - channel_prefix = str(args.channel) - path = (channel_prefix + "/canfd_abit_baud_rate").encode("ascii") - if self.dll.ZCAN_SetValue(self.device, path, bitrate) != ZCAN_STATUS_OK: - raise RuntimeError("ZCAN_SetValue(canfd_abit_baud_rate) failed") - data_path = (channel_prefix + "/canfd_dbit_baud_rate").encode("ascii") - if self.dll.ZCAN_SetValue(self.device, data_path, b"2000000") != ZCAN_STATUS_OK: - raise RuntimeError("ZCAN_SetValue(canfd_dbit_baud_rate) failed") - init = ZcanChannelInit() - # USBCANFD devices require a CANFD channel handle even when the - # application only transmits classic CAN frames through ZCAN_Transmit. - init.can_type = ZCAN_TYPE_CANFD - init.canfd.acc_code = 0 - init.canfd.acc_mask = 0xFFFFFFFF - init.canfd.filter = 0 - init.canfd.mode = 0 - self.channel = self.dll.ZCAN_InitCAN( - self.device, args.channel, ctypes.byref(init) - ) - if not self.channel: - raise RuntimeError("ZCAN_InitCAN failed") - if self.dll.ZCAN_StartCAN(self.channel) != ZCAN_STATUS_OK: - raise RuntimeError("ZCAN_StartCAN failed") - self.dll.ZCAN_ClearBuffer(self.channel) + for config in self._channel_configs(args): + self._initialize_channel(config) except Exception: self.close() raise + @staticmethod + def _channel_configs(args): + if args.channels_json: + configs = json.loads(args.channels_json) + else: + configs = [ + { + "channel": args.channel, + "arbitration_bitrate": args.bitrate, + "data_bitrate": args.data_bitrate, + "can_fd_iso": True, + "termination_enabled": True, + } + ] + if not isinstance(configs, list) or not configs: + raise ValueError("channels-json must be a non-empty JSON array") + channel_ids = [int(item["channel"]) for item in configs] + if len(channel_ids) != len(set(channel_ids)): + raise ValueError("channel numbers must be unique") + return configs + + def _set_value(self, path, value): + result = self.dll.ZCAN_SetValue( + self.device, path.encode("ascii"), str(value).encode("ascii") + ) + if result != ZCAN_STATUS_OK: + raise RuntimeError("ZCAN_SetValue({}) failed".format(path)) + + def _initialize_channel(self, config): + channel_id = int(config["channel"]) + arbitration_bitrate = int(config.get("arbitration_bitrate", 500000)) + data_bitrate = int(config.get("data_bitrate", 2000000)) + can_fd_iso = bool(config.get("can_fd_iso", True)) + if channel_id < 0: + raise ValueError("channel number cannot be negative") + if arbitration_bitrate <= 0 or data_bitrate <= 0: + raise ValueError("CAN bitrates must be positive") + + prefix = str(channel_id) + self._set_value(prefix + "/protocol", 1) + self._set_value(prefix + "/canfd_standard", 0 if can_fd_iso else 1) + self._set_value(prefix + "/canfd_exp", 1) + self._set_value(prefix + "/canfd_abit_baud_rate", arbitration_bitrate) + self._set_value(prefix + "/canfd_dbit_baud_rate", data_bitrate) + + init = ZcanChannelInit() + init.can_type = ZCAN_TYPE_CANFD + init.canfd.acc_code = 0 + init.canfd.acc_mask = 0xFFFFFFFF + init.canfd.filter = 0 + init.canfd.mode = 0 + handle = self.dll.ZCAN_InitCAN(self.device, channel_id, ctypes.byref(init)) + if not handle: + raise RuntimeError("ZCAN_InitCAN failed for channel {}".format(channel_id)) + self.channels[channel_id] = handle + self._set_value( + prefix + "/initenal_resistance", + 1 if bool(config.get("termination_enabled", True)) else 0, + ) + if self.dll.ZCAN_StartCAN(handle) != ZCAN_STATUS_OK: + raise RuntimeError("ZCAN_StartCAN failed for channel {}".format(channel_id)) + self.dll.ZCAN_ClearBuffer(handle) + def _declare_functions(self): handle = ctypes.c_void_p self.dll.ZCAN_OpenDevice.argtypes = [ @@ -168,10 +231,60 @@ class Driver: ctypes.c_int32, ] self.dll.ZCAN_Receive.restype = ctypes.c_uint32 + self.dll.ZCAN_TransmitFD.argtypes = [ + handle, + ctypes.POINTER(ZcanTransmitFdData), + ctypes.c_uint32, + ] + self.dll.ZCAN_TransmitFD.restype = ctypes.c_uint32 + self.dll.ZCAN_ReceiveFD.argtypes = [ + handle, + ctypes.POINTER(ZcanReceiveFdData), + ctypes.c_uint32, + ctypes.c_int32, + ] + self.dll.ZCAN_ReceiveFD.restype = ctypes.c_uint32 - def send(self, arbitration_id, data): + def _handle(self, channel): + channel_id = int(channel) + try: + return self.channels[channel_id] + except KeyError: + raise ValueError("channel {} was not initialized".format(channel_id)) + + def _transmit_error(self, handle, operation): + error = ZcanChannelErrorInfo() + read_ok = self.dll.ZCAN_ReadChannelErrInfo(handle, ctypes.byref(error)) + detail = ( + "; channel_error=0x{:08X}".format(error.error_code) + if read_ok == ZCAN_STATUS_OK + else "; channel error info unavailable" + ) + raise RuntimeError(operation + " did not accept the frame" + detail) + + def send(self, channel, arbitration_id, data, is_fd=False, bitrate_switch=False): if not 0 <= arbitration_id <= 0x7FF: raise ValueError("only 11-bit standard CAN identifiers are allowed") + handle = self._handle(channel) + if is_fd: + valid_lengths = set(range(9)) | {12, 16, 20, 24, 32, 48, 64} + if len(data) not in valid_lengths: + raise ValueError( + "CAN FD payload length must be 0-8, 12, 16, 20, 24, 32, 48 or 64 bytes" + ) + transmit = ZcanTransmitFdData() + transmit.frame.can_id = arbitration_id + transmit.frame.len = len(data) + transmit.frame.flags = CANFD_BRS if bitrate_switch else 0 + for index, byte in enumerate(data): + transmit.frame.data[index] = byte + transmit.transmit_type = self.transmit_type + if self.dll.ZCAN_TransmitFD(handle, ctypes.byref(transmit), 1) != 1: + self._transmit_error(handle, "ZCAN_TransmitFD") + return + + if bitrate_switch: + raise ValueError("bitrate switching is only valid for CAN FD frames") if len(data) > 8: raise ValueError("classic CAN payload exceeds 8 bytes") transmit = ZcanTransmitData() @@ -180,38 +293,63 @@ class Driver: for index, byte in enumerate(data): transmit.frame.data[index] = byte transmit.transmit_type = self.transmit_type - if self.dll.ZCAN_Transmit(self.channel, ctypes.byref(transmit), 1) != 1: - error = ZcanChannelErrorInfo() - read_ok = self.dll.ZCAN_ReadChannelErrInfo( - self.channel, ctypes.byref(error) - ) - detail = ( - f"; channel_error=0x{error.error_code:08X}" - if read_ok == ZCAN_STATUS_OK - else "; channel error info unavailable" - ) - raise RuntimeError("ZCAN_Transmit did not accept the frame" + detail) + if self.dll.ZCAN_Transmit(handle, ctypes.byref(transmit), 1) != 1: + self._transmit_error(handle, "ZCAN_Transmit") - def receive(self, timeout_ms): - receive = ZcanReceiveData() - count = self.dll.ZCAN_Receive( - self.channel, ctypes.byref(receive), 1, int(timeout_ms) - ) - if count == 0: - return None - if count != 1: - raise RuntimeError("ZCAN_Receive returned an unexpected frame count") + @staticmethod + def _classic_public(receive): frame = receive.frame return { "arbitration_id": int(frame.can_id & 0x1FFFFFFF), "data_hex": bytes(frame.data[: frame.can_dlc]).hex(), "timestamp_us": int(receive.timestamp), + "is_fd": False, + "bitrate_switch": False, } + @staticmethod + def _fd_public(receive): + frame = receive.frame + return { + "arbitration_id": int(frame.can_id & 0x1FFFFFFF), + "data_hex": bytes(frame.data[: frame.len]).hex(), + "timestamp_us": int(receive.timestamp), + "is_fd": True, + "bitrate_switch": bool(frame.flags & CANFD_BRS), + } + + def receive(self, channel, timeout_ms, include_fd=False): + handle = self._handle(channel) + deadline = time.monotonic() + max(0, int(timeout_ms)) / 1000.0 + while True: + classic = ZcanReceiveData() + count = self.dll.ZCAN_Receive(handle, ctypes.byref(classic), 1, 0) + if count == 1: + return self._classic_public(classic) + if count != 0: + raise RuntimeError("ZCAN_Receive returned an unexpected frame count") + + if include_fd: + fd_receive = ZcanReceiveFdData() + count = self.dll.ZCAN_ReceiveFD( + handle, ctypes.byref(fd_receive), 1, 0 + ) + if count == 1: + return self._fd_public(fd_receive) + if count != 0: + raise RuntimeError( + "ZCAN_ReceiveFD returned an unexpected frame count" + ) + + remaining = deadline - time.monotonic() + if remaining <= 0: + return None + time.sleep(min(0.002, remaining)) + def close(self): - if self.channel: - self.dll.ZCAN_ResetCAN(self.channel) - self.channel = None + for channel_id in sorted(self.channels, reverse=True): + handle = self.channels.pop(channel_id) + self.dll.ZCAN_ResetCAN(handle) if self.device: self.dll.ZCAN_CloseDevice(self.device) self.device = None @@ -222,8 +360,10 @@ def parse_args(): parser.add_argument("--dll", required=True) parser.add_argument("--device-type", type=int, required=True) parser.add_argument("--device-index", type=int, default=0) + parser.add_argument("--channels-json") parser.add_argument("--channel", type=int, default=0) parser.add_argument("--bitrate", type=int, default=500000) + parser.add_argument("--data-bitrate", type=int, default=2000000) parser.add_argument( "--transmit-type", type=int, @@ -247,6 +387,8 @@ def main(): "ZCAN_StartCAN", "ZCAN_Transmit", "ZCAN_Receive", + "ZCAN_TransmitFD", + "ZCAN_ReceiveFD", ) missing = [name for name in required if not hasattr(dll, name)] emit( @@ -256,9 +398,12 @@ def main(): "missing_exports": missing, "structure_sizes": { "init": ctypes.sizeof(ZcanChannelInit), - "frame": ctypes.sizeof(ZcanFrame), - "tx": ctypes.sizeof(ZcanTransmitData), - "rx": ctypes.sizeof(ZcanReceiveData), + "classic_frame": ctypes.sizeof(ZcanFrame), + "classic_tx": ctypes.sizeof(ZcanTransmitData), + "classic_rx": ctypes.sizeof(ZcanReceiveData), + "fd_frame": ctypes.sizeof(ZcanFdFrame), + "fd_tx": ctypes.sizeof(ZcanTransmitFdData), + "fd_rx": ctypes.sizeof(ZcanReceiveFdData), "error": ctypes.sizeof(ZcanChannelErrorInfo), }, } @@ -268,27 +413,43 @@ def main(): driver = None try: driver = Driver(args) - emit({"ok": True, "event": "ready"}) + emit({"ok": True, "event": "ready", "channels": sorted(driver.channels)}) for line in sys.stdin: try: request = json.loads(line) operation = request.get("operation") if operation == "send": + channel = int(request.get("channel", args.channel)) arbitration_id = int(request["arbitration_id"]) data = bytes.fromhex(request["data_hex"]) - driver.send(arbitration_id, data) + is_fd = bool(request.get("is_fd", False)) + bitrate_switch = bool(request.get("bitrate_switch", False)) + driver.send( + channel, + arbitration_id, + data, + is_fd=is_fd, + bitrate_switch=bitrate_switch, + ) emit( { "ok": True, + "channel": channel, "arbitration_id": arbitration_id, "data_hex": data.hex(), + "is_fd": is_fd, + "bitrate_switch": bitrate_switch, } ) elif operation == "receive": emit( { "ok": True, - "frame": driver.receive(int(request.get("timeout_ms", 0))), + "frame": driver.receive( + int(request.get("channel", args.channel)), + int(request.get("timeout_ms", 0)), + include_fd=bool(request.get("include_fd", False)), + ), } ) elif operation == "close": diff --git a/src/cognitive_agent/infrastructure/firmware/t2g_seat.py b/src/cognitive_agent/infrastructure/firmware/t2g_seat.py index 67705f2..4fccdb5 100755 --- a/src/cognitive_agent/infrastructure/firmware/t2g_seat.py +++ b/src/cognitive_agent/infrastructure/firmware/t2g_seat.py @@ -12,9 +12,11 @@ from typing import Any, Callable from cognitive_agent.infrastructure.can.gateway import CanBus -FIRMWARE_PROTOCOL_SIGNATURE = "seat-controller-smv8-current-diagnostics-v6" -FIRMWARE_PROTOCOL_FRAME_IDS = frozenset({0x301, 0x302, 0x303, 0x304, 0x305, 0x4FA}) -EXPECTED_FIRMWARE_REVISION = 6 +FIRMWARE_PROTOCOL_SIGNATURE = "seat-controller-smv8-dynamic-modes-v13" +FIRMWARE_PROTOCOL_FRAME_IDS = frozenset( + {0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x4FA} +) +EXPECTED_FIRMWARE_REVISION = 13 EXPECTED_MOTOR_MAX_HALL = (480, 374, 917, 647) @@ -168,9 +170,79 @@ class T2GFirmwareGuard: self.auto_flash = auto_flash self.probe_timeout_ms = probe_timeout_ms self.boot_wait_ms = boot_wait_ms + self._last_probe_diagnostics: dict[str, Any] = {} + + def _record_probe_diagnostics( + self, + *, + observed_ids: set[int], + motor_status_ids: set[int], + motor_diagnostic: dict[int, int], + motor_current_ids: set[int], + firmware_revision: int | None, + ) -> None: + expected_motors = {0, 1, 2, 3} + max_hall_counts = [motor_diagnostic.get(motor) for motor in range(4)] + mismatched_max_hall = [ + motor + for motor, expected in enumerate(EXPECTED_MOTOR_MAX_HALL) + if motor_diagnostic.get(motor) is not None + and abs(int(motor_diagnostic[motor]) - expected) + > max(4, round(expected * 0.05)) + ] + self._last_probe_diagnostics = { + "observed_frame_ids": [ + f"0x{item:03X}" for item in sorted(observed_ids) + ], + "missing_frame_ids": [ + f"0x{item:03X}" + for item in sorted(FIRMWARE_PROTOCOL_FRAME_IDS - observed_ids) + ], + "firmware_revision": firmware_revision, + "expected_firmware_revision": EXPECTED_FIRMWARE_REVISION, + "observed_motor_status_ids": sorted(motor_status_ids), + "missing_motor_status_ids": sorted(expected_motors - motor_status_ids), + "observed_motor_diagnostic_ids": sorted(motor_diagnostic), + "missing_motor_diagnostic_ids": sorted( + expected_motors - set(motor_diagnostic) + ), + "observed_motor_current_ids": sorted(motor_current_ids), + "missing_motor_current_ids": sorted(expected_motors - motor_current_ids), + "max_hall_counts": max_hall_counts, + "expected_max_hall_counts": list(EXPECTED_MOTOR_MAX_HALL), + "mismatched_max_hall_ids": mismatched_max_hall, + } + + def _probe_failure_detail(self) -> str: + diagnostics = self._last_probe_diagnostics + if not diagnostics: + return "no qualifying Seat_Controller_demo protocol frames were observed" + + def joined(name: str) -> str: + values = diagnostics.get(name) or [] + return ",".join(str(item) for item in values) or "none" + + revision = diagnostics.get("firmware_revision") + revision_text = "unknown" if revision is None else str(revision) + max_hall = diagnostics.get("max_hall_counts") or [] + max_hall_text = ",".join( + "?" if value is None else str(value) for value in max_hall + ) + return ( + f"observed_frame_ids={joined('observed_frame_ids')}; " + f"missing_frame_ids={joined('missing_frame_ids')}; " + f"firmware_revision={revision_text} " + f"(expected {EXPECTED_FIRMWARE_REVISION}); " + f"missing_motor_status_ids={joined('missing_motor_status_ids')}; " + "missing_motor_diagnostic_ids=" + f"{joined('missing_motor_diagnostic_ids')}; " + f"missing_motor_current_ids={joined('missing_motor_current_ids')}; " + f"max_hall_counts={max_hall_text}; " + f"mismatched_max_hall_ids={joined('mismatched_max_hall_ids')}" + ) def _probe(self, bus: CanBus) -> dict[str, Any] | None: - """Observe the cyclic 0x301..0x305/0x4FA contract without transmitting. + """Observe the cyclic 0x301..0x306/0x4FA contract without transmitting. The 2026-07-30 firmware uses 0x304 and 0x305 for current diagnostics, so the previous request/response identity handshake would collide with @@ -185,12 +257,27 @@ class T2GFirmwareGuard: motor_diagnostic: dict[int, int] = {} motor_current_ids: set[int] = set() firmware_revision: int | None = None + self._last_probe_diagnostics = {} while True: remaining_ms = round((deadline - time.monotonic()) * 1000) if remaining_ms <= 0: + self._record_probe_diagnostics( + observed_ids=observed_ids, + motor_status_ids=motor_status_ids, + motor_diagnostic=motor_diagnostic, + motor_current_ids=motor_current_ids, + firmware_revision=firmware_revision, + ) return None frame = bus.receive(remaining_ms) if frame is None: + self._record_probe_diagnostics( + observed_ids=observed_ids, + motor_status_ids=motor_status_ids, + motor_diagnostic=motor_diagnostic, + motor_current_ids=motor_current_ids, + firmware_revision=firmware_revision, + ) return None arbitration_id = int(frame.arbitration_id) if arbitration_id not in FIRMWARE_PROTOCOL_FRAME_IDS or len(frame.data) < 8: @@ -206,6 +293,14 @@ class T2GFirmwareGuard: elif arbitration_id == 0x304 and data[0] < 4: motor_current_ids.add(data[0]) + self._record_probe_diagnostics( + observed_ids=observed_ids, + motor_status_ids=motor_status_ids, + motor_diagnostic=motor_diagnostic, + motor_current_ids=motor_current_ids, + firmware_revision=firmware_revision, + ) + if ( observed_ids == FIRMWARE_PROTOCOL_FRAME_IDS and firmware_revision == EXPECTED_FIRMWARE_REVISION @@ -254,6 +349,7 @@ class T2GFirmwareGuard: ) from probe_error raise FirmwareProgrammingError( "matching Seat_Controller_demo passive protocol signature was not detected; " + f"{self._probe_failure_detail()}; " "automatic programming is disabled" ) if self.programmer is None: @@ -268,7 +364,8 @@ class T2GFirmwareGuard: verified = self._probe(verified_bus) if verified is None: raise FirmwareProgrammingError( - "programming completed but passive firmware protocol verification failed" + "programming completed but passive firmware protocol verification failed; " + + self._probe_failure_detail() ) except Exception as exc: verified_bus.close() diff --git a/tests/e2e/test_seat_web_api.py b/tests/e2e/test_seat_web_api.py index 7352806..c159cb7 100755 --- a/tests/e2e/test_seat_web_api.py +++ b/tests/e2e/test_seat_web_api.py @@ -111,7 +111,7 @@ class SeatWebApiTests(unittest.TestCase): def test_static_console_and_runtime_endpoint(self) -> None: with self.opener.open(f"{self.base_url}/", timeout=3) as response: html = response.read().decode("utf-8") - with self.opener.open(f"{self.base_url}/app.js?v=seat-hil-9", timeout=3) as response: + with self.opener.open(f"{self.base_url}/app.js?v=seat-hil-13", timeout=3) as response: app_script = response.read().decode("utf-8") with self.opener.open(f"{self.base_url}/api/runtime", timeout=3) as response: runtime = json.loads(response.read().decode("utf-8")) @@ -121,7 +121,7 @@ class SeatWebApiTests(unittest.TestCase): self.assertIn('data-vehicle-model="byd-tang-2024-reference"', html) self.assertIn("整车孪生界面", html) self.assertIn("透明车体 · 实体设备", html) - self.assertIn('src="/app.js?v=seat-hil-9"', html) + self.assertIn('src="/app.js?v=seat-hil-13"', html) self.assertIn('id="hardwareAccessField"', html) self.assertIn("hardware_access_required", app_script) self.assertIn("HARDWARE_REQUEST_TIMEOUT_MS = 15 * 60 * 1000", app_script) diff --git a/tests/integration/test_multidomain_service.py b/tests/integration/test_multidomain_service.py index dcf533f..7530f5a 100755 --- a/tests/integration/test_multidomain_service.py +++ b/tests/integration/test_multidomain_service.py @@ -538,7 +538,7 @@ class MultiDomainServiceTests(unittest.TestCase): vehicle_id="denza_n7", ) - self.assertEqual(result["status"], "execution_failed") + self.assertEqual(result["status"], "partially_succeeded") self.assertEqual(result["execution_report"]["spec"]["status"], "failed") self.assertEqual( result["actuator_state"]["passenger"]["position"]["longitudinal"][ @@ -553,6 +553,10 @@ class MultiDomainServiceTests(unittest.TestCase): "physical_can", ) self.assertEqual( + result["domain_state"]["roof"]["transmittance_pct"], + 20, + ) + self.assertNotEqual( result["domain_state"]["roof"]["transmittance_pct"], initial_roof, ) diff --git a/tests/unit/test_mode_profile.py b/tests/unit/test_mode_profile.py index 93bdc5c..577f2b9 100644 --- a/tests/unit/test_mode_profile.py +++ b/tests/unit/test_mode_profile.py @@ -69,6 +69,8 @@ class ModeProfileRegistryTests(unittest.TestCase): "electric_beach_chair", "queen_passenger_driving", "calf_decompression_float", + "rocking_horse", + "dynamic_cradle", } denza_modes = registry.public_modes(vehicle_id="denza_n7") denza_ids = {mode["id"] for mode in denza_modes} @@ -88,6 +90,104 @@ class ModeProfileRegistryTests(unittest.TestCase): "calf_decompression_float", ) + def test_dynamic_modes_preserve_exact_timelines_and_native_mode_ids(self) -> None: + registry = ModeProfileRegistry(REPOSITORY_ROOT / "config" / "modes") + profiles = { + profile.id: profile + for profile in registry.profiles() + if profile.id in {"rocking_horse", "dynamic_cradle"} + } + + horse = profiles["rocking_horse"] + self.assertIsNotNone(horse.timeline) + assert horse.timeline is not None + self.assertEqual(horse.timeline.repeat, "until_stopped_or_timeout") + self.assertEqual(horse.timeline.max_runtime_ms, 600_000) + self.assertIsNone(horse.timeline.cycle_duration_ms) + self.assertEqual( + [(phase.id, phase.duration_ms) for phase in horse.timeline.phases], + [("rock_forward", None), ("rock_backward", None)], + ) + self.assertEqual( + horse.timeline.entry["targets"]["longitudinal"]["hall_pulse"], + 320, + ) + self.assertEqual( + [phase.completion for phase in horse.timeline.phases], + ["all_targets_reached", "all_targets_reached"], + ) + self.assertEqual([phase.timeout_ms for phase in horse.timeline.phases], [15_000, 15_000]) + self.assertEqual(horse.timeline.phases[0].motion["final_approach_hall_pulses"], 8) + self.assertTrue(horse.timeline.phases[0].motion["continuous_four_axis_cruise"]) + self.assertEqual( + horse.timeline.phases[0].targets["cushion_tilt"]["hall_pulse"], + 250, + ) + self.assertEqual( + horse.timeline.phases[1].targets["cushion_tilt"]["hall_pulse"], + 130, + ) + self.assertEqual( + horse.timeline.phases[0].motion["cruise_duty_percent"]["cushion_tilt"], + 90, + ) + self.assertEqual( + horse.timeline.phases[0].targets["longitudinal"]["hall_pulse"], + 270, + ) + self.assertEqual( + horse.timeline.phases[1].targets["longitudinal"]["hall_pulse"], + 370, + ) + self.assertEqual( + horse.timeline.phases[0].motion["cruise_duty_percent"]["longitudinal"], + 90, + ) + + cradle = profiles["dynamic_cradle"] + self.assertIsNotNone(cradle.timeline) + assert cradle.timeline is not None + self.assertEqual(cradle.timeline.repeat, "until_stopped_or_timeout") + self.assertEqual(cradle.timeline.max_runtime_ms, 600_000) + self.assertIsNone(cradle.timeline.cycle_duration_ms) + self.assertEqual( + [(phase.id, phase.duration_ms) for phase in cradle.timeline.phases], + [("forward", None), ("return", None)], + ) + self.assertEqual( + cradle.timeline.entry["targets"]["longitudinal"]["hall_pulse"], + 391, + ) + self.assertEqual( + [phase.completion for phase in cradle.timeline.phases], + ["all_targets_reached", "all_targets_reached"], + ) + self.assertEqual( + [phase.timeout_ms for phase in cradle.timeline.phases], + [30_000, 30_000], + ) + self.assertEqual( + cradle.timeline.phases[0].motion["final_approach_hall_pulses"], + 12, + ) + self.assertTrue( + cradle.timeline.phases[0].motion["continuous_four_axis_cruise"] + ) + self.assertNotIn("clearance_lead", cradle.timeline.phases[0].motion) + + requests = { + profile.id: registry.requests_for_profiles([profile])[0] + for profile in (horse, cradle) + } + self.assertEqual( + requests["rocking_horse"]["parameters"], + [{"name": "mode_id", "value": 1}], + ) + self.assertEqual( + requests["dynamic_cradle"]["parameters"], + [{"name": "mode_id", "value": 2}], + ) + def test_denza_mode_positions_use_corrected_n7_zero_points(self) -> None: registry = ModeProfileRegistry(REPOSITORY_ROOT / "config" / "modes") expected_positions = { diff --git a/tests/unit/test_native_can_integration.py b/tests/unit/test_native_can_integration.py new file mode 100644 index 0000000..a8b515f --- /dev/null +++ b/tests/unit/test_native_can_integration.py @@ -0,0 +1,167 @@ +from __future__ import annotations + +import unittest +from pathlib import Path +from unittest.mock import patch + +from cognitive_agent.application.native_can_runtime import ( + NativeCanExecutor, + NativeCanRuntime, +) +from cognitive_agent.application.seat_service import REPOSITORY_ROOT, SeatDemoService +from cognitive_agent.infrastructure.can.gateway import CanFrame +from cognitive_agent.infrastructure.can.hardware import VehicleCanSettings + + +class _FakeBus: + def __init__(self, received: list[CanFrame] | None = None) -> None: + self.received = list(received or []) + self.sent: list[CanFrame] = [] + self.closed = False + + def send( + self, + arbitration_id: int, + data: bytes, + *, + is_fd: bool = False, + bitrate_switch: bool = False, + ) -> CanFrame: + frame = CanFrame( + arbitration_id, + data, + channel=1, + is_fd=is_fd, + bitrate_switch=bitrate_switch, + ) + self.sent.append(frame) + return frame + + def receive( + self, timeout_ms: int, *, include_fd: bool = False + ) -> CanFrame | None: + return self.received.pop(0) if self.received else None + + def close(self) -> None: + self.closed = True + + +class NativeCanIntegrationTests(unittest.TestCase): + def setUp(self) -> None: + self.runtime = NativeCanRuntime(REPOSITORY_ROOT) + + def _compile(self, domain: str, actions: list[dict]) -> tuple[dict, dict]: + config = self.runtime.build_function_config( + domain, actions, "req-native-test", "local_rules" + ) + return config, self.runtime.compile(config) + + def test_climate_frames_match_can_dev_layout_and_repeat_policy(self) -> None: + actions = [ + { + "domain": "climate", + "capability": "climate.set_power", + "target": "vehicle", + "operation": "set", + "parameters": {"state": "on"}, + }, + { + "domain": "climate", + "capability": "climate.set_temperature", + "target": "driver", + "operation": "set", + "parameters": {"temperature_c": 24}, + }, + { + "domain": "climate", + "capability": "climate.set_fan_level", + "target": "vehicle", + "operation": "set", + "parameters": {"level": 3}, + }, + ] + _, plan = self._compile("climate", actions) + commands = plan["spec"]["commands"] + + self.assertEqual([item["signals"]["frame_id"] for item in commands], ["0x1DE"] * 3) + self.assertEqual(commands[0]["signals"]["data_hex"], "00 00 00 10 00 00 00 00") + self.assertEqual(commands[1]["signals"]["data_hex"], "00 00 00 00 18 00 00 00") + self.assertEqual(commands[2]["signals"]["data_hex"], "30 00 00 00 00 00 00 00") + self.assertEqual(commands[0]["repeat"], {"count": 3, "period_ms": 100}) + self.assertFalse(commands[0]["signals"]["is_fd"]) + + def test_window_motion_uses_can_fd_with_brs(self) -> None: + _, plan = self._compile( + "window", + [ + { + "domain": "window", + "capability": "window.set_motion", + "target": "front_left", + "operation": "set", + "parameters": {"motion": "open"}, + } + ], + ) + command = plan["spec"]["commands"][0] + self.assertEqual(command["signals"]["frame_id"], "0x431") + self.assertEqual(command["signals"]["data_hex"], "00 00 00 00 00 00 01 00") + self.assertTrue(command["signals"]["is_fd"]) + self.assertTrue(command["signals"]["bitrate_switch"]) + + def test_executor_requires_configured_feedback_for_vehicle_success(self) -> None: + config, plan = self._compile( + "climate", + [ + { + "domain": "climate", + "capability": "climate.set_power", + "target": "vehicle", + "operation": "set", + "parameters": {"state": "on"}, + } + ], + ) + feedback = CanFrame(0x404, bytes((0, 1, 0, 0, 0, 0, 0, 0)), channel=1) + bus = _FakeBus([feedback]) + with patch("cognitive_agent.application.native_can_runtime.time.sleep"): + report = NativeCanExecutor(lambda: bus, feedback_timeout_ms=1).execute( + self.runtime, plan, config + ) + self.assertEqual(report["spec"]["status"], "succeeded") + self.assertEqual(len(bus.sent), 3) + self.assertTrue(bus.closed) + + no_feedback_bus = _FakeBus() + with patch("cognitive_agent.application.native_can_runtime.time.sleep"): + report = NativeCanExecutor( + lambda: no_feedback_bus, feedback_timeout_ms=1 + ).execute(self.runtime, plan, config) + self.assertEqual(report["spec"]["status"], "failed") + + def test_one_sentence_builds_seat_and_vehicle_channel_plans(self) -> None: + service = SeatDemoService(REPOSITORY_ROOT) + result = service.process( + "副驾座椅通风3档,同时打开空调,温度设为24度,风量3档", + provider="local", + ) + self.assertEqual(result["status"], "succeeded") + self.assertEqual(set(result["function_configs"]), {"seat", "native_climate"}) + self.assertEqual(set(result["command_plans"]), {"seat", "native_climate"}) + body_commands = result["command_plans"]["native_climate"]["spec"]["commands"] + self.assertTrue(body_commands) + self.assertTrue(all(item["bus"] == "body_can" for item in body_commands)) + self.assertFalse(result["deferred_requests"]) + + def test_vehicle_timing_contract_matches_requested_60mhz_values(self) -> None: + settings = VehicleCanSettings.from_env(Path(REPOSITORY_ROOT)) + self.assertTrue(settings.timing_is_verified) + info = settings.public_info() + self.assertEqual(info["arbitration"]["bitrate"], 500_000) + self.assertEqual(info["arbitration"]["sample_point_percent"], 80) + self.assertEqual(info["data"]["bitrate"], 2_000_000) + self.assertEqual(info["data"]["sample_point_percent"], 80) + + +if __name__ == "__main__": + unittest.main()