fix(mapping): correct region↔IO mapping per on-device measurement

Measured on real hardware: IO1=right IO2=left IO3=top IO4=middle IO5=bottom
(0x01=right 0x02=left 0x04=top 0x08=middle 0x10=bottom). The earlier verbal
'left=IO1/upper=IO2...' spec was wrong; this reverts to the original Phase-1
mapping, which the measurement confirms.

- protocol.js REGION constants + getRegionName + REGION_NAMES
- CRITICAL: buildVendorCommand ioMasks was built from REGION.* constants whose
  values just flipped, scrambling IO slot order; pin to literal [0x01..0x10]
- diagnosis.js REGION_DEFS key↔mask; pd_region_map values unchanged (PD is
  keyed by orientation, which is stable) — right=PD5 left=PD1 top=PD2
  middle=PD3,6,7 bottom=PD4
- common.js region labels back to right/left/top/middle/bottom (上/中/下)
- treatment-setup / manual-treatment / treating / scan-report / ble-debug
  face-map bindings and REGION_MAP realigned
- verified: mock pipeline lands left→IO2, middle→IO4 correctly
这个提交包含在:
Guoguo
2026-07-28 07:22:36 -07:00
父节点 74b0c5fa86
当前提交 21dccd2274
修改 11 个文件,包含 75 行新增73 行删除
@@ -22,13 +22,13 @@ Page({
],
selectedFunctionId: 'rejuvenate',
selectedWavelength: 2,
// 掩码 = IO 纵列布局(与 treatment-setup 一致):=0x01 中上=0x02 =0x04 中=0x08 =0x10
// 掩码 = IO↔物理位置(实测):=0x01 =0x02 =0x04 中=0x08 =0x10
regions: [
{ key: 'left', mask: 0x01, checked: true },
{ key: 'top', mask: 0x02, checked: true },
{ key: 'middle', mask: 0x04, checked: true },
{ key: 'bottom', mask: 0x08, checked: true },
{ key: 'right', mask: 0x10, checked: true }
{ key: 'right', mask: 0x01, checked: true },
{ key: 'left', mask: 0x02, checked: true },
{ key: 'top', mask: 0x04, checked: true },
{ key: 'middle', mask: 0x08, checked: true },
{ key: 'bottom', mask: 0x10, checked: true }
],
// safety: a single session must NOT exceed 10 minutes (hardware caps at 10).
durations: [5, 10],
@@ -26,11 +26,11 @@
<view class="page-title section-title">{{i18n.manual.regionTitle}}</view>
<!-- 脸型图布局(与「使用设置」一致);位置↔idx:0=左 1=中上 2=中 3=中下 4=右 -->
<view class="face-map">
<view class="face-region forehead {{regions[1].checked ? 'active' : ''}}" bindtap="onToggleRegion" data-idx="1">{{i18n.common.regions.top}}</view>
<view class="face-region left-cheek {{regions[0].checked ? 'active' : ''}}" bindtap="onToggleRegion" data-idx="0">{{i18n.common.regions.left}}</view>
<view class="face-region right-cheek {{regions[4].checked ? 'active' : ''}}" bindtap="onToggleRegion" data-idx="4">{{i18n.common.regions.right}}</view>
<view class="face-region nose {{regions[2].checked ? 'active' : ''}}" bindtap="onToggleRegion" data-idx="2">{{i18n.common.regions.middle}}</view>
<view class="face-region chin {{regions[3].checked ? 'active' : ''}}" bindtap="onToggleRegion" data-idx="3">{{i18n.common.regions.bottom}}</view>
<view class="face-region forehead {{regions[2].checked ? 'active' : ''}}" bindtap="onToggleRegion" data-idx="2">{{i18n.common.regions.top}}</view>
<view class="face-region left-cheek {{regions[1].checked ? 'active' : ''}}" bindtap="onToggleRegion" data-idx="1">{{i18n.common.regions.left}}</view>
<view class="face-region right-cheek {{regions[0].checked ? 'active' : ''}}" bindtap="onToggleRegion" data-idx="0">{{i18n.common.regions.right}}</view>
<view class="face-region nose {{regions[3].checked ? 'active' : ''}}" bindtap="onToggleRegion" data-idx="3">{{i18n.common.regions.middle}}</view>
<view class="face-region chin {{regions[4].checked ? 'active' : ''}}" bindtap="onToggleRegion" data-idx="4">{{i18n.common.regions.bottom}}</view>
</view>
<view class="page-title section-title">{{i18n.manual.durationTitle}}</view>