---
id: preset-r-go-live
title: Go-Live 选 R / Preset R
doc_type: design-record
status: in-dev
target_release: "8.3"
last_updated: 2026-09-16
sources:
  - { type: slack, ref: "thread 1782972570.160449 @CSC0M4V34 (7/2–7/3)", url: "https://tvunetworks.slack.com/archives/CSC0M4V34/p1782972570160449" }
  - { type: slack, ref: "thread 1789524393.868679 @C087EUM316Y (9/16, taoyang 走查 84059)", url: "https://tvunetworks.slack.com/archives/C087EUM316Y/p1789525163916639?thread_ts=1789524393.868679&cid=C087EUM316Y" }
  - { type: jira, ref: "V4-2309", url: "https://tvunetworks.atlassian.net/browse/V4-2309" }
figma:
  file: 0054ib0nLmt27bC3QlGDl7
  nodes:
    - { id: "8062:545", label: "整页 Go-Live flow (单源 + 4源)", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=8062-545" }
    - { id: "8062:8070", label: "Section 1 · 单源 Go-Live 选 R (V3, 83059 bug 本页)", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=8062-8070" }
    - { id: "8152:205", label: "Section 2 · 4-Source Receiver Flow (V4)", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=8152-205" }
    - { id: "8062:6873", label: "单源 picker · 未选态（2026-09-16 修正，见 §7）", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=8062-6873" }
    - { id: "8153:521", label: "4 源 picker Ch2 · 未选态（2026-09-16 修正，见 §7）", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=8153-521" }
---

# Feature Design Record — Go-Live 选 R / Preset R

> Status: 逻辑于 2026-07-02/03 Slack thread 定稿(V4-2309 已重开跟踪),目标 8.3。Figma 两页(单源 + 4源)已加 dated 橙色逻辑更新块。接口(setPresetR/getPresetR)由 renhu 实现中。

- **来源 Sources**: Slack thread(CSC0M4V34, 7/2–7/3)· Jira V4-2309
- **目标版本**: 8.3(讨论中以版本号 "83059" 指代)
- **Scope**: TM1100 等 pack 本机 Touch Screen(LCD)Go-Live 选 R;并影响 Config-T / Remote Control 三端一致
- **Figma**: Touch-Screen v7.7/8.0,页面 `4140:13`,Section `8062:8070`(单源 V3)+ `8152:205`(4源 V4)

## 1. Problem

83059(= 8.3)场景:T 与 R1 live 过 → stop live → 触摸屏选择 R2(未 live)→ 用 Remote Control 发起 live,实际 live 的仍是 R1。
根因:Remote Control 取 `lastliveR`(只记录 live 成功过的 R);触摸屏"选了但没 live"的 R 只存在 LCD 本地,Config-T / Remote Control 拿不到 → 三端行为不一致。

## 2. 概念对齐(理清的三个 R)

- **lastliveR**:最近一次 live 成功的 R。
- **defaultR**:文件传输 / autosync 用的 R(与 live 无关)。
- **Preset R(新概念)**:界面上选好、准备用来 live 的 R。本需求核心。

## 3. Goals（8.3 逻辑,thread 定稿）

1. **Preset R 持久化 & 三端共用** — 触屏选中的 R 经 `setPresetR` 持久化;Go Live 一律取 `getPresetR`;LCD / Config-T / Remote Control 共用同一 Preset R,行为一致。
2. **回显/取值优先级链** — ① Preset R 在线 → 用 Preset R;② Preset R 离线 → 回退 `lastliveR`;③ 都无/离线 → 回显空,Live 按钮置灰,需用户手动选一个在线 R 才能 Live。
3. **Picker 仅列在线设备** — 选 R 列表只展示 `link !== '0'` 的在线设备;离线 R 不进列表。
4. **V4 四路各自独立 Preset R** — 每路一个 Preset R(4 接口,端口 5x03);接口同刻只返回一个 `SOURCE`(preset / lastlive),UI 不区分显示,一律当"当前要 live 的 R"。
5. **不提供清空** — Preset R 无清空入口;换 R 即 `setPresetR` 覆盖(选过一次后不会再为空)。

## 4. Non-goals / 待定

- **[TODO] solo 模式 R 优先级**(V4 特有,V3 无 solo)— solo R 与 Preset R 优先级未定,待 PM/研发确认。
- 单源 picker 的产品 UI 布局本身不改,仅新增 Preset R 背书逻辑。

## 5. 接口(renhu 规范 v3,实现中）

- `GET /setPresetR?RpeerID=0x…`(设置)/ `?RpeerID=0`(清除,回"未设置");返回 `errorcode` 0/-2/-3。
- `GET /getPresetR` → `{SOURCE: "preset"|"lastlive", ID, NAME}`;都无 → `-1`。
- `T_INFO` 新增 `PRESET_R` 节点(与 `IFB_R` 同级),供界面轮询回显;节点不存在 = preset 和 lastlive 都没有。
- 三端接入:LCD/Config-T 选中/确认调 `setPresetR`,界面回显调 `getPresetR`;Remote Control 参数从 `getlastLiveR` 改 `getPresetR`。V4 四路各一套。

## 6. Figma 交付

两页均在既有交付下方新增 dated 橙色"逻辑更新块"(不删旧内容,新逻辑橙字 + 日期 2026-07-03),对应节点见 frontmatter。4源页含全部 5 点 + solo TODO;单源页含 1/2/3/5 点 + 83059 现场说明。产品 UI 未改。

## 7. 未选态（空 Preset R）的画法

§3 第 2 条的第 ③ 分支（preset 和 lastlive 都无 → 回显空）此前**只有文字规则、Figma 上没有对应帧**：picker 的三帧全画成已选态。根因是 §3 第 5 条「不提供清空，选过一次后不会再为空」让空态看着像不会发生的场景——但**冷启动 / 从未选过**时它就是初始态。

**判定某帧是不是未选态，看底栏**（口径来自 handoff §1k 实测）：

| 底栏 | 语义 | 首行 | 选中标记 |
|---|---|---|---|
| 只有 `Go Live` | 未选 R，点 Live 直接跳进来 | 候选 R **白字** | 停在首行 |
| `OK` + `Go Live` | 已选态，从 home 点 Receiver 行进来改选 | 当前值 **绿字** | 停在当前值行 |

**未选态的处置**：首行候选 R **绿字改白字** · **选中标记对（高亮 rect + 三角）停在列表第一项** · 其余列表项照旧白字。**连体绿框 VECTOR 保留**——字段行与面板的归属关系在未选态下依然成立。

> ⛔ 两版作废表述（owner 2026-09-16 两次纠正）：
> ① 原文「**隐藏**选中标记对」作废 —— 那是照搬 V4-2333 Test Signal 线 C0 帧的做法，**不适用于 LCD**：LCD 靠物理上下键操作，进页面时光标总得停在某处；没有三角，用户不知道按上下键会移动哪一行。
> ② 原文「**隐藏字段行值**」作废 —— 把首行整个藏掉会让面板第一格空出来。首行的 `PM_X7L` **既是当前值回显、也是列表的第一个候选 R**；没有预设 R 时该去掉的是**绿色**（绿 = 当前要 live 的 R 这层语义），不是**那一行**。
> ⇒ 未选态 = 首行白字 + 光标停首行，**既不是"什么都不画"，也不是"空一格"**。

## 8. 选项列表的行距与层序（owner 2026-09-16 定调）

**行距 = 固定 40px，⛔ 不再沿用原稿的不均匀间距。** 原稿分隔线间距为 `36.96 / 36.02 / 35.07 / 36.02 / 35.07`（文字按等距 37 排、分隔线却不均），导致各行文字相对格子中线的偏移逐行漂移 `−4.93 / −2.42 / −0.97 / +1.49 / +2.95`。平时看不出来，**一给选中行加高亮底就暴露**。

| 项 | 取值 | 备注 |
|---|---|---|
| 行距 | **40**（等距，5 行共 200） | 36px 与 40px 两版都实画对比过，owner 选 40 |
| 文字 | 高 19，`y = 行顶 + (40−19)/2`，上下留白各 **10.5** | 判据用「上留白 == 下留白」，⛔ 不用「中心差」——前者可证伪 |
| 高亮块 | `127 × 36.2`，上下各内缩 **1.9** | 内缩量取自原稿实测 |
| 选中三角 | 视觉中心对齐行中线 | 旋转节点，须用 `absoluteBoundingBox` 量，⛔ 不能用 `.y` |
| 连体绿框 VECTOR | `M 0 0 L 434 0 L 434 200 L 300 200 L 300 40 L 0 40 L 0 0 Z` | `200` = 5×行距，`40` = 第 1 行高（阶梯拐点）。**改行距必须同步改这两个数** |

**层序：连体绿框必须在最上层。** 原稿层序是 `… Receiver → 绿框 → 高亮块 → 三角 → 文字`，绿框在高亮块之下 ⇒ **高亮块会压掉绿框的边线**。原稿的高亮块停在面板中间行、不贴边，所以没暴露；标记一移到第一行（紧贴绿框顶边与左边）就露出来。绿框的 `fills` 是 `visible:false`、只有 `strokes` 上色，**放到最上层不会遮挡任何文字**。

- 实测佐证：把绿框 `appendChild` 到 `Content` 末尾后，渲染图中品牌绿像素 **+126**，且面板左上角局部增量与整帧增量**完全相等**（126 = 126）⇒ 增益精确来自那个转角，无别处副作用。

**一屏容量（内容区高 218，`clipsContent=true` 为硬边界）**：40px ⇒ **5 行**（第 6 行需 240.95 > 218，装不下，靠 `▼▲` 翻页）；36px ⇒ 6 行。owner 选 40 即接受「一屏 5 行」。

> ⚠️ **待跟进**：40 偏离 [`lcd-canonical-spec.md`](./lcd-canonical-spec.md) §2 登记的普通行 35 / 当前值行 36（V4-2333 实测终态亦为 6 行装进 211px ≈ 35.2/行）。按 DS §M21.4，这属于**产品级视觉契约的新值**，其他 LCD 选项列表页（Test Signal / Return Video / Stream / Progressive Download / Upload / Source Switcher / Speed Test 的选 R 页）应否一并改为 40，需 owner 另行拍板；未改之前本页与它们行高不一致。

**选中三角恒白**（owner 2026-09-16 定调）：左侧三角标记一律 `#f1f1f1`，**不跟 Receiver 状态变色**——它指示的是「光标停在哪一行」，不是状态。2025-11-05 需求图 `6922:24862` 里画的绿三角**不作数**（详见 `2026-06-02-v4-2312-channel-status-indicator-spec.md` §3 的作废标注）。

**实测佐证**（2026-09-16 程序化扫本 page 全部 26 个三角形 VECTOR）：白 `#f1f1f1` 9 个（选中标记 + 下翻页）· 禁用灰 `#5a5a5a` 4 个（上翻页禁用态）· 无填充 13 个（实例内其他图标）· **绿色 0 个**。五个选中标记 `8062:7022` / `8062:8041` / `10120:22073` / `8153:558` / `8184:458` 全部 `#f1f1f1`。

## Revision Log

- **2026-09-16** · 未选态画法 + 行距/层序整治（Slack thread `1789524393.868679` @ `C087EUM316Y`，taoyang 走查 84059 起头，owner 五轮纠正）—— 落点两帧：`8062:6873`（单源）+ `8153:521`（4 源 Ch2，按 §M-DISCIPLINE.SCOPE 全集排查发现，taoyang 未提）。终态见 §7 §8。owner 逐条定调、每条都推翻了 AI 的前一版：① **三角恒白** `#f1f1f1`（作废 v4-2312 spec §3「绿色图标」；实测本 page 26 个三角 = 白 9 / 禁用灰 4 / 无填充 13 / 绿 0）② **未选态光标停首项**，非隐藏标记对 ③ **首行绿字改白字**，非隐藏整行 ④ **行距固定 40px**（36 / 40 两版实画对比后选定）⑤ **连体绿框提至最上层**（高亮块原本压掉边线；改后绿像素 +126 且局部增量 = 整帧增量）。机检：本轮触碰的分隔线 / 绿框 Boolean / 绿框 VECTOR / 高亮块 / 三角**改前改后均未被任何规则命中**，5 个文字仍只有既有 `binding-fidelity`（字号未套样式 + 填充未绑 token），全文件命中节点总数稳定 `2502 → 2502`、新增 0；`overlap` PASS。`library-origin` / `binding-fidelity` / `library-binding` / `default-white-bg` 为本文件 file-wide owner-deferred 存量债，未动。**遗留待定**：① 40px 偏离 canonical 35/36，其他 LCD 选 R 页是否跟进（见 §8 末）② 该组帧均未标 `SCREEN · ` 前缀 ⇒ `language-isolation` 闸 `checkedUnits=0`（fail-open，⛔ 不等于通过），未单独改以免组内不一致。同轮回答 taoyang 另两问（顶部绿字语义 = 「当前要 live 的 R」回显 · 红色 R 选中后仍显红）见 §2 与 `2026-06-02-v4-2312-channel-status-indicator-spec.md` §3。
- **2026-07-03** · 8.3 / V4-2309 · Preset R 引入 —— 选 R 持久化为 Preset R,Go Live 三端共用 `getPresetR`;离线回退链 preset→lastlive→空+Live 禁用;picker 仅列在线;V4 四路各一 Preset R;不提供清空。来源:Slack thread(CSC0M4V34, 7/2–7/3)。Figma 两页加橙色更新块。solo 优先级留 TODO。
- **(更早)** · 单源 + 4-Source Receiver Flow 基线交付 —— 无 design-record(本文件为回填);逻辑仅存于 Figma 注释。
