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
这个提交包含在:
@@ -10,7 +10,7 @@ var WAVES = [
|
||||
{ key: 'uv', code: 3, label: '紫外' },
|
||||
{ key: 'yellow', code: 4, label: '暖黄' }
|
||||
]
|
||||
var REGION_LABELS = { 1: '左区/IO1', 2: '中上/IO2', 4: '中区/IO3', 8: '中下/IO4', 16: '右区/IO5' }
|
||||
var REGION_LABELS = { 1: '右区/IO1', 2: '左区/IO2', 4: '上区/IO3', 8: '中区/IO4', 16: '下区/IO5' }
|
||||
var RUN_STATES = { 0: 'IDLE', 1: '检测', 2: '治疗', 255: '故障(0xFF)' }
|
||||
|
||||
function hex(bytes) {
|
||||
|
||||
@@ -37,11 +37,11 @@
|
||||
<view class="card">
|
||||
<view class="card-title">点分区 → 该区 2 秒治疗(对物理位置)</view>
|
||||
<view class="face-map">
|
||||
<view class="face-region forehead" bindtap="onTapRegion" data-mask="2">中上\nIO2</view>
|
||||
<view class="face-region left-cheek" bindtap="onTapRegion" data-mask="1">左\nIO1</view>
|
||||
<view class="face-region right-cheek" bindtap="onTapRegion" data-mask="16">右\nIO5</view>
|
||||
<view class="face-region nose" bindtap="onTapRegion" data-mask="4">中\nIO3</view>
|
||||
<view class="face-region chin" bindtap="onTapRegion" data-mask="8">中下\nIO4</view>
|
||||
<view class="face-region forehead" bindtap="onTapRegion" data-mask="4">上\nIO3</view>
|
||||
<view class="face-region left-cheek" bindtap="onTapRegion" data-mask="2">左\nIO2</view>
|
||||
<view class="face-region right-cheek" bindtap="onTapRegion" data-mask="1">右\nIO1</view>
|
||||
<view class="face-region nose" bindtap="onTapRegion" data-mask="8">中\nIO4</view>
|
||||
<view class="face-region chin" bindtap="onTapRegion" data-mask="16">下\nIO5</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -35,26 +35,26 @@
|
||||
<view class="card-title">{{i18n.report.faceTitle}}</view>
|
||||
<!-- 脸型图(与「使用设置」同款布局);位置↔faceZones 下标:1=中上 0=左 4=右 2=中 3=中下 -->
|
||||
<view class="face-map">
|
||||
<view class="face-region forehead {{faceZones[1].colorClass}}" bindtap="onTapZone" data-wave="{{faceZones[1].waveKey}}">
|
||||
<view class="fz-name">{{faceZones[1].name}}</view>
|
||||
<view class="fz-mode" wx:if="{{faceZones[1].hasProblem}}">{{faceZones[1].modeLabel}}</view>
|
||||
</view>
|
||||
<view class="face-region left-cheek {{faceZones[0].colorClass}}" bindtap="onTapZone" data-wave="{{faceZones[0].waveKey}}">
|
||||
<view class="fz-name">{{faceZones[0].name}}</view>
|
||||
<view class="fz-mode" wx:if="{{faceZones[0].hasProblem}}">{{faceZones[0].modeLabel}}</view>
|
||||
</view>
|
||||
<view class="face-region right-cheek {{faceZones[4].colorClass}}" bindtap="onTapZone" data-wave="{{faceZones[4].waveKey}}">
|
||||
<view class="fz-name">{{faceZones[4].name}}</view>
|
||||
<view class="fz-mode" wx:if="{{faceZones[4].hasProblem}}">{{faceZones[4].modeLabel}}</view>
|
||||
</view>
|
||||
<view class="face-region nose {{faceZones[2].colorClass}}" bindtap="onTapZone" data-wave="{{faceZones[2].waveKey}}">
|
||||
<view class="face-region forehead {{faceZones[2].colorClass}}" bindtap="onTapZone" data-wave="{{faceZones[2].waveKey}}">
|
||||
<view class="fz-name">{{faceZones[2].name}}</view>
|
||||
<view class="fz-mode" wx:if="{{faceZones[2].hasProblem}}">{{faceZones[2].modeLabel}}</view>
|
||||
</view>
|
||||
<view class="face-region chin {{faceZones[3].colorClass}}" bindtap="onTapZone" data-wave="{{faceZones[3].waveKey}}">
|
||||
<view class="face-region left-cheek {{faceZones[1].colorClass}}" bindtap="onTapZone" data-wave="{{faceZones[1].waveKey}}">
|
||||
<view class="fz-name">{{faceZones[1].name}}</view>
|
||||
<view class="fz-mode" wx:if="{{faceZones[1].hasProblem}}">{{faceZones[1].modeLabel}}</view>
|
||||
</view>
|
||||
<view class="face-region right-cheek {{faceZones[0].colorClass}}" bindtap="onTapZone" data-wave="{{faceZones[0].waveKey}}">
|
||||
<view class="fz-name">{{faceZones[0].name}}</view>
|
||||
<view class="fz-mode" wx:if="{{faceZones[0].hasProblem}}">{{faceZones[0].modeLabel}}</view>
|
||||
</view>
|
||||
<view class="face-region nose {{faceZones[3].colorClass}}" bindtap="onTapZone" data-wave="{{faceZones[3].waveKey}}">
|
||||
<view class="fz-name">{{faceZones[3].name}}</view>
|
||||
<view class="fz-mode" wx:if="{{faceZones[3].hasProblem}}">{{faceZones[3].modeLabel}}</view>
|
||||
</view>
|
||||
<view class="face-region chin {{faceZones[4].colorClass}}" bindtap="onTapZone" data-wave="{{faceZones[4].waveKey}}">
|
||||
<view class="fz-name">{{faceZones[4].name}}</view>
|
||||
<view class="fz-mode" wx:if="{{faceZones[4].hasProblem}}">{{faceZones[4].modeLabel}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 底部图例:各光简要功效(果果指定保留) -->
|
||||
<view class="face-legend">
|
||||
|
||||
@@ -23,13 +23,13 @@ Page({
|
||||
},
|
||||
|
||||
_getRegionText: function (regionMask) {
|
||||
// 掩码 = IO 纵列布局:0x01左 0x02中上 0x04中 0x08中下 0x10右
|
||||
// 掩码 = IO↔物理位置(实测):0x01右 0x02左 0x04上 0x08中 0x10下
|
||||
var REGION_MAP = {
|
||||
1: 'common.regions.left',
|
||||
2: 'common.regions.top',
|
||||
4: 'common.regions.middle',
|
||||
8: 'common.regions.bottom',
|
||||
16: 'common.regions.right'
|
||||
1: 'common.regions.right',
|
||||
2: 'common.regions.left',
|
||||
4: 'common.regions.top',
|
||||
8: 'common.regions.middle',
|
||||
16: 'common.regions.bottom'
|
||||
}
|
||||
if (regionMask === 0x1F) return i18n.t('treating.allRegions')
|
||||
var names = []
|
||||
|
||||
@@ -34,8 +34,8 @@ Page({
|
||||
var app = getApp()
|
||||
this.setData({ statusBarHeight: app.globalData.statusBarHeight })
|
||||
i18n.bind(this)
|
||||
// 顺序对应 data.regions 的掩码 0x01..0x10(IO1..IO5 = 左/中上/中/中下/右)
|
||||
var regionKeys = ['left', 'top', 'middle', 'bottom', 'right']
|
||||
// 顺序对应 data.regions 掩码 0x01..0x10 = IO1..IO5 = 右/左/上/中/下(实测)
|
||||
var regionKeys = ['right', 'left', 'top', 'middle', 'bottom']
|
||||
var regions = this.data.regions
|
||||
regions.forEach(function (r, i) {
|
||||
r.name = i18n.t('common.regions.' + regionKeys[i])
|
||||
|
||||
@@ -27,11 +27,11 @@
|
||||
|
||||
<!-- 位置↔idx 对应新纵列布局:idx0=左(0x01) idx1=中上(0x02) idx2=中(0x04) idx3=中下(0x08) idx4=右(0x10) -->
|
||||
<view class="face-map">
|
||||
<view class="face-region forehead {{regions[1].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="1">{{i18n.common.regions.top}}</view>
|
||||
<view class="face-region left-cheek {{regions[0].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="0">{{i18n.common.regions.left}}</view>
|
||||
<view class="face-region right-cheek {{regions[4].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="4">{{i18n.common.regions.right}}</view>
|
||||
<view class="face-region nose {{regions[2].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="2">{{i18n.common.regions.middle}}</view>
|
||||
<view class="face-region chin {{regions[3].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="3">{{i18n.common.regions.bottom}}</view>
|
||||
<view class="face-region forehead {{regions[2].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="2">{{i18n.common.regions.top}}</view>
|
||||
<view class="face-region left-cheek {{regions[1].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="1">{{i18n.common.regions.left}}</view>
|
||||
<view class="face-region right-cheek {{regions[0].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="0">{{i18n.common.regions.right}}</view>
|
||||
<view class="face-region nose {{regions[3].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="3">{{i18n.common.regions.middle}}</view>
|
||||
<view class="face-region chin {{regions[4].checked ? 'active' : ''}} {{selectedMode === 0 ? 'disabled' : ''}}" bindtap="onToggleRegion" data-idx="4">{{i18n.common.regions.bottom}}</view>
|
||||
</view>
|
||||
|
||||
<button class="btn-primary" bindtap="onStart" disabled="{{submitting}}" loading="{{submitting}}">
|
||||
|
||||
在新工单中引用
屏蔽一个用户