Ver Fonte

bootloader卡片调整

avery há 2 dias atrás
pai
commit
805a52973d

+ 1 - 4
features/settings/view-model.js

@@ -1,7 +1,6 @@
 const settingsService = require('../../store/settings-store.js')
 const themeService = require('../../store/theme-store.js')
 const transport = require('../../transport/ble-core.js')
-const bootloaderService = require('../bootloader/service.js')
 const {
   toolNavigation
 } = require('../tools/index.js')
@@ -10,8 +9,7 @@ const protocolImplementation = require('./protocol-implementation.js')
 function getSettingsPageState(
   settingsState = settingsService.getState(),
   themeState = themeService.getState(),
-  transportState = transport.getState(),
-  bootloaderState = bootloaderService.getState()
+  transportState = transport.getState()
 ) {
   const nightModeEnabledSwitch = settingsState.nightModeFollowSystem
     ? themeState.themeMode === 'dark'
@@ -32,7 +30,6 @@ function getSettingsPageState(
   return {
     ...settingsState,
     ...themeState,
-    ...bootloaderState,
     connectedDevice: transportState.connectedDevice,
     isNoProtocol,
     isModbusProtocol,

+ 0 - 1
features/tools/index.js

@@ -18,7 +18,6 @@ const smdCodeHandlers = require('./handlers/smd-code.js')
 const threePhasePowerHandlers = require('./handlers/three-phase-power.js')
 
 const TOOL_MODULES = [
-  { view: 'bootloader', label: 'BootLoader升级', icon: 'icon-chip', iconSrc: '/assets/icons/chip-white.png' },
   { view: 'crc', label: 'CRC与哈希计算', icon: 'icon-crc', iconSrc: '/assets/icons/hash-white.png', calculator: crcTool, handlers: crcHandlers.handlers },
   { view: 'asciiCode', label: 'ASCII/数值转换', icon: 'icon-terminal', iconSrc: '/assets/icons/terminal-white.png', calculator: asciiCodeTool, handlers: asciiCodeHandlers.handlers },
   { view: 'filter', label: '滤波器计算', icon: 'icon-filter', iconSrc: '/assets/icons/funnel-white.png', calculator: filterCalculator, handlers: filterHandlers.handlers },

+ 42 - 0
pages/communication/communication.js

@@ -1,5 +1,6 @@
 const settingsService = require('../../store/settings-store.js')
 const themeService = require('../../store/theme-store.js')
+const bootloaderService = require('../../features/bootloader/service.js')
 const transport = require('../../transport/ble-core.js')
 const {
   createPageToast
@@ -37,6 +38,7 @@ Page({
     ...transport.getState(),
     ...parameterGroupService.getState(),
     ...manualRtuService.getState(),
+    ...bootloaderService.getState(),
     logs: decorateLogs(transport.getState().logs, 'hex'),
     logMode: 'hex',
     logModeToggleText: getLogModeToggleText('hex'),
@@ -59,6 +61,7 @@ Page({
     this.pageToast = createPageToast(this, this.data)
     this.lastSyncedSlaveAddress = ''
     transport.init()
+    bootloaderService.init()
     parameterGroupService.init()
     settingsService.init()
     themeService.init()
@@ -107,6 +110,10 @@ Page({
     this.unsubscribeManualRtu = manualRtuService.subscribe((manualState) => {
       this.setData(getManualStatePayload(manualState))
     })
+
+    this.unsubscribeBootloader = bootloaderService.subscribe((bootloaderState) => {
+      this.setData(bootloaderState)
+    })
   },
 
   onShow() {
@@ -151,6 +158,11 @@ Page({
       this.unsubscribeManualRtu()
       this.unsubscribeManualRtu = null
     }
+
+    if (this.unsubscribeBootloader) {
+      this.unsubscribeBootloader()
+      this.unsubscribeBootloader = null
+    }
   },
 
   noop() {},
@@ -314,6 +326,36 @@ Page({
     this.setData(nextState)
   },
 
+  chooseFirmwareFile() {
+    if (this.data.isBootloaderBusy) return
+
+    bootloaderService.chooseFirmwareFile('auto')
+  },
+
+  startFirmwareUpgrade() {
+    if (!this.data.connectedDevice || !this.data.isFirmwareReady || this.data.isBootloaderBusy) return
+
+    bootloaderService.startUpgrade()
+  },
+
+  readProgramChecksum() {
+    if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
+
+    bootloaderService.readProgramChecksum()
+  },
+
+  handshakeBootloader() {
+    if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
+
+    bootloaderService.sendHandshakeKeepAlive()
+  },
+
+  exitBootloader() {
+    if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
+
+    bootloaderService.exitBootloader()
+  },
+
   async sendStorageAccessProtocolFrame() {
     try {
       if (!this.data.connectedDevice) {

+ 68 - 0
pages/communication/communication.wxml

@@ -143,6 +143,74 @@
       </view>
     </view>
 
+    <view wx:if="{{isStorageAccessProtocol}}" class="panel communication-panel upgrade-panel">
+      <view class="panel-header panel-header--with-actions">
+        <view class="panel-icon icon-chip">
+          <image class="panel-icon-image" src="/assets/icons/chip-white.png" mode="aspectFit" />
+        </view>
+        <view class="panel-title">BootLoader</view>
+        <view class="panel-actions communication-actions upgrade-actions">
+          <view
+            class="panel-action-button {{isBootloaderBusy ? 'is-disabled' : ''}}"
+            bindtap="chooseFirmwareFile"
+          >
+            加载
+          </view>
+          <view
+            class="panel-action-button {{connectedDevice && !isBootloaderBusy ? '' : 'is-disabled'}}"
+            bindtap="handshakeBootloader"
+          >
+            握手
+          </view>
+          <view
+            class="panel-action-button {{connectedDevice && !isBootloaderBusy ? '' : 'is-disabled'}}"
+            bindtap="readProgramChecksum"
+          >
+            读取
+          </view>
+          <view
+            class="panel-action-button {{connectedDevice && !isBootloaderBusy ? '' : 'is-disabled'}}"
+            bindtap="exitBootloader"
+          >
+            退出
+          </view>
+          <view
+            class="panel-action-button {{connectedDevice && isFirmwareReady && !isBootloaderBusy ? '' : 'is-disabled'}}"
+            bindtap="startFirmwareUpgrade"
+          >
+            升级
+          </view>
+        </view>
+      </view>
+      <view class="upgrade-body">
+        <view class="upgrade-row">
+          <text class="upgrade-label">芯片型号</text>
+          <text class="upgrade-value">{{chipModel}}</text>
+        </view>
+        <view class="upgrade-row upgrade-row--file">
+          <view class="upgrade-file-head">
+            <text class="upgrade-label">固件文件</text>
+            <view class="upgrade-file-meta">
+              <text class="upgrade-file-meta-item upgrade-file-meta-item--program">{{deviceProgramCrcText}}</text>
+              <text class="upgrade-file-meta-item upgrade-file-meta-item--checksum">{{firmwareChecksumText}}</text>
+              <text class="upgrade-file-meta-item upgrade-file-meta-item--size">{{firmwareSizeText}}</text>
+            </view>
+          </view>
+          <text class="upgrade-file-name">{{firmwareName ? firmwareName : '--'}}</text>
+        </view>
+        <view class="upgrade-row">
+          <text class="upgrade-label">Bootloader</text>
+          <text class="upgrade-value">{{bootloaderVersion}} / {{bootloaderChipId}}</text>
+        </view>
+        <view wx:if="{{bootloaderStatusText || bootloaderDetailText}}" class="upgrade-status {{isFirmwareReady ? 'upgrade-status--ready' : ''}}">
+          {{bootloaderStatusText}}<text wx:if="{{bootloaderDetailText}}"> · {{bootloaderDetailText}}</text>
+        </view>
+        <view class="upgrade-progress">
+          <view class="upgrade-progress-bar" style="width: {{bootloaderProgress}}%;"></view>
+        </view>
+      </view>
+    </view>
+
     <view class="panel communication-panel">
       <view class="panel-header panel-header--with-actions">
         <view class="panel-icon icon-history">

+ 152 - 1
pages/communication/communication.wxss

@@ -273,6 +273,137 @@
   text-align: left;
 }
 
+.upgrade-actions {
+  flex-wrap: wrap;
+  justify-content: flex-end;
+  max-width: 286rpx;
+  row-gap: 8rpx;
+}
+
+.upgrade-body {
+  padding: 8rpx 24rpx 24rpx;
+}
+
+.upgrade-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 20rpx;
+  min-height: 62rpx;
+  border-top: 1rpx solid #edf2f7;
+}
+
+.upgrade-row:first-child {
+  border-top: 0;
+}
+
+.upgrade-row--file {
+  display: block;
+  min-height: 0;
+  padding-top: 14rpx;
+  padding-bottom: 14rpx;
+}
+
+.upgrade-file-head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 14rpx;
+}
+
+.upgrade-file-meta {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  gap: 10rpx;
+  min-width: 0;
+  flex: 1;
+  overflow: hidden;
+}
+
+.upgrade-file-meta-item {
+  flex: none;
+  min-width: 0;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.upgrade-file-meta-item--program {
+  color: var(--accent-dark);
+  font-weight: 800;
+}
+
+.upgrade-file-meta-item--checksum,
+.upgrade-file-meta-item--size {
+  color: #64748b;
+}
+
+.upgrade-file-name {
+  display: block;
+  margin-top: 8rpx;
+  color: #111827;
+  font-size: 24rpx;
+  line-height: 1.35;
+  font-weight: 700;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.upgrade-label {
+  flex: none;
+  color: #64748b;
+  font-size: 24rpx;
+  line-height: 1.35;
+}
+
+.upgrade-value {
+  min-width: 0;
+  flex: 1;
+  color: #111827;
+  font-size: 24rpx;
+  line-height: 1.35;
+  text-align: right;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.upgrade-status {
+  margin-top: 14rpx;
+  padding: 14rpx 16rpx;
+  border-radius: 12rpx;
+  background: #f8fafc;
+  color: #64748b;
+  font-size: 23rpx;
+  line-height: 1.45;
+  font-weight: 700;
+  word-break: break-all;
+}
+
+.upgrade-status--ready {
+  background: #effaf8;
+  color: var(--accent-dark);
+}
+
+.upgrade-progress {
+  position: relative;
+  height: 14rpx;
+  margin-top: 16rpx;
+  border-radius: 999rpx;
+  background: #e5e7eb;
+  overflow: hidden;
+}
+
+.upgrade-progress-bar {
+  height: 100%;
+  min-width: 0;
+  border-radius: inherit;
+  background: linear-gradient(90deg, #10b981 0%, #0f8f87 100%);
+  transition: width 0.18s ease;
+}
+
 .empty-log {
   padding: 42rpx 24rpx;
   color: #64748b;
@@ -397,7 +528,8 @@
 
 .theme-dark .log-scroll,
 .theme-dark .log-row,
-.theme-dark .protocol-row {
+.theme-dark .protocol-row,
+.theme-dark .upgrade-row {
   border-color: #263241;
 }
 
@@ -427,6 +559,25 @@
   color: #94a3b8;
 }
 
+.theme-dark .upgrade-file-meta-item--checksum,
+.theme-dark .upgrade-file-meta-item--size,
+.theme-dark .upgrade-file-name,
+.theme-dark .upgrade-value {
+  color: #cbd5e1;
+}
+
+.theme-dark .upgrade-file-meta-item--program {
+  color: #5eead4;
+}
+
+.theme-dark .upgrade-progress {
+  background: #263241;
+}
+
+.theme-dark .upgrade-progress-bar {
+  background: linear-gradient(90deg, #2dd4bf 0%, #14b8a6 100%);
+}
+
 @media (max-width: 360px) {
   .protocol-value-picker,
   .protocol-row-input {

+ 1 - 47
pages/settings/settings.js

@@ -1,6 +1,5 @@
 const settingsService = require('../../store/settings-store.js')
 const themeService = require('../../store/theme-store.js')
-const bootloaderService = require('../../features/bootloader/service.js')
 const transport = require('../../transport/ble-core.js')
 const {
   createPageToast
@@ -48,7 +47,6 @@ Page({
     this.settingsDraftFields = {}
     settingsService.init()
     themeService.init()
-    bootloaderService.init()
 
     this.unsubscribeSettings = settingsService.subscribe((settingsState) => {
       this.setData(this.mergeSettingsDrafts(getSettingsPageState(settingsState, themeService.getState())))
@@ -60,16 +58,7 @@ Page({
       this.setData(this.mergeSettingsDrafts(getSettingsPageState(
         settingsService.getState(),
         themeService.getState(),
-        transportState,
-        bootloaderService.getState()
-      )))
-    })
-    this.unsubscribeBootloader = bootloaderService.subscribe((bootloaderState) => {
-      this.setData(this.mergeSettingsDrafts(getSettingsPageState(
-        settingsService.getState(),
-        themeService.getState(),
-        transport.getState(),
-        bootloaderState
+        transportState
       )))
     })
   },
@@ -112,11 +101,6 @@ Page({
       this.unsubscribeTransport()
       this.unsubscribeTransport = null
     }
-
-    if (this.unsubscribeBootloader) {
-      this.unsubscribeBootloader()
-      this.unsubscribeBootloader = null
-    }
   },
 
   onNightModeEnabledChange(event) {
@@ -246,35 +230,5 @@ Page({
     })
   },
 
-  chooseFirmwareFile() {
-    if (this.data.isBootloaderBusy) return
-
-    bootloaderService.chooseFirmwareFile('auto')
-  },
-
-  startFirmwareUpgrade() {
-    if (!this.data.connectedDevice || !this.data.isFirmwareReady || this.data.isBootloaderBusy) return
-
-    bootloaderService.startUpgrade()
-  },
-
-  readProgramChecksum() {
-    if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
-
-    bootloaderService.readProgramChecksum()
-  },
-
-  handshakeBootloader() {
-    if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
-
-    bootloaderService.sendHandshakeKeepAlive()
-  },
-
-  exitBootloader() {
-    if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
-
-    bootloaderService.exitBootloader()
-  },
-
   ...toolPageHandlers
 })

+ 1 - 71
pages/settings/settings.wxml

@@ -13,77 +13,7 @@
 <scroll-view class="scrollarea {{themeClass}} {{activeSettingsView ? 'scrollarea--subpage' : ''}}" scroll-y type="list">
   <view class="page-shell">
     <block wx:if="{{activeSettingsView}}">
-    <block wx:if="{{activeSettingsView == 'bootloader'}}">
-      <view class="panel params-section-panel upgrade-panel">
-        <view class="panel-header panel-header--with-actions">
-          <view class="panel-icon icon-chip">
-            <image class="panel-icon-image" src="/assets/icons/chip-white.png" mode="aspectFit" />
-          </view>
-          <view class="panel-title">BootLoader</view>
-          <view class="panel-actions upgrade-actions">
-            <view
-              class="panel-action-button {{isBootloaderBusy ? 'is-disabled' : ''}}"
-              bindtap="chooseFirmwareFile"
-            >
-              加载
-            </view>
-            <view
-              class="panel-action-button {{connectedDevice && !isBootloaderBusy ? '' : 'is-disabled'}}"
-              bindtap="handshakeBootloader"
-            >
-              握手
-            </view>
-            <view
-              class="panel-action-button {{connectedDevice && !isBootloaderBusy ? '' : 'is-disabled'}}"
-              bindtap="readProgramChecksum"
-            >
-              读取
-            </view>
-            <view
-              class="panel-action-button {{connectedDevice && !isBootloaderBusy ? '' : 'is-disabled'}}"
-              bindtap="exitBootloader"
-            >
-              退出
-            </view>
-            <view
-              class="panel-action-button {{connectedDevice && isFirmwareReady && !isBootloaderBusy ? '' : 'is-disabled'}}"
-              bindtap="startFirmwareUpgrade"
-            >
-              升级
-            </view>
-          </view>
-        </view>
-        <view class="upgrade-body">
-          <view class="upgrade-row">
-            <text class="upgrade-label">芯片型号</text>
-            <text class="upgrade-value">{{chipModel}}</text>
-          </view>
-          <view class="upgrade-row upgrade-row--file">
-            <view class="upgrade-file-head">
-              <text class="upgrade-label">固件文件</text>
-              <view class="upgrade-file-meta">
-                <text class="upgrade-file-meta-item upgrade-file-meta-item--program">{{deviceProgramCrcText}}</text>
-                <text class="upgrade-file-meta-item upgrade-file-meta-item--checksum">{{firmwareChecksumText}}</text>
-                <text class="upgrade-file-meta-item upgrade-file-meta-item--size">{{firmwareSizeText}}</text>
-              </view>
-            </view>
-            <text class="upgrade-file-name">{{firmwareName ? firmwareName : '--'}}</text>
-          </view>
-          <view class="upgrade-row">
-            <text class="upgrade-label">Bootloader</text>
-            <text class="upgrade-value">{{bootloaderVersion}} / {{bootloaderChipId}}</text>
-          </view>
-          <view wx:if="{{bootloaderStatusText || bootloaderDetailText}}" class="upgrade-status {{isFirmwareReady ? 'upgrade-status--ready' : ''}}">
-            {{bootloaderStatusText}}<text wx:if="{{bootloaderDetailText}}"> · {{bootloaderDetailText}}</text>
-          </view>
-          <view class="upgrade-progress">
-            <view class="upgrade-progress-bar" style="width: {{bootloaderProgress}}%;"></view>
-          </view>
-        </view>
-      </view>
-    </block>
-
-    <block wx:elif="{{activeSettingsView == storageProtocolImplementationView}}">
+    <block wx:if="{{activeSettingsView == storageProtocolImplementationView}}">
       <view class="panel settings-section-panel storage-protocol-guide-panel">
         <view class="storage-protocol-guide-kicker">{{storageProtocolImplementationGuide.kicker}}</view>
         <view class="storage-protocol-guide-title">{{storageProtocolImplementationGuide.title}}</view>

+ 0 - 149
pages/settings/settings.wxss

@@ -260,155 +260,6 @@
   text-overflow: ellipsis;
 }
 
-.upgrade-actions {
-  flex-wrap: wrap;
-  justify-content: flex-end;
-  max-width: 286rpx;
-  row-gap: 8rpx;
-}
-
-.upgrade-body {
-  padding: 8rpx 24rpx 24rpx;
-}
-
-.upgrade-row {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  gap: 20rpx;
-  min-height: 62rpx;
-  border-top: 1rpx solid #edf2f7;
-}
-
-.upgrade-row:first-child {
-  border-top: 0;
-}
-
-.upgrade-row--file {
-  display: block;
-  min-height: 0;
-  padding-top: 14rpx;
-  padding-bottom: 14rpx;
-}
-
-.upgrade-file-head {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  gap: 14rpx;
-}
-
-.upgrade-file-meta {
-  display: flex;
-  align-items: center;
-  justify-content: flex-end;
-  gap: 10rpx;
-  min-width: 0;
-  flex: 1;
-  overflow: hidden;
-}
-
-.upgrade-file-meta-item {
-  flex: none;
-  min-width: 0;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.upgrade-file-meta-item--program {
-  color: var(--accent-dark);
-  font-weight: 800;
-}
-
-.upgrade-file-meta-item--checksum,
-.upgrade-file-meta-item--size {
-  color: #64748b;
-}
-
-.upgrade-file-name {
-  display: block;
-  margin-top: 8rpx;
-  color: #111827;
-  font-size: 24rpx;
-  line-height: 1.35;
-  font-weight: 700;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.upgrade-label {
-  flex: none;
-  color: #64748b;
-  font-size: 24rpx;
-  line-height: 1.35;
-}
-
-.upgrade-value {
-  min-width: 0;
-  flex: 1;
-  color: #111827;
-  font-size: 24rpx;
-  line-height: 1.35;
-  text-align: right;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.upgrade-status {
-  margin-top: 14rpx;
-  padding: 14rpx 16rpx;
-  border-radius: 12rpx;
-  background: #f8fafc;
-  color: #64748b;
-  font-size: 23rpx;
-  line-height: 1.45;
-  font-weight: 700;
-  word-break: break-all;
-}
-
-.upgrade-status--ready {
-  background: #effaf8;
-  color: var(--accent-dark);
-}
-
-.upgrade-progress {
-  position: relative;
-  height: 14rpx;
-  margin-top: 16rpx;
-  border-radius: 999rpx;
-  background: #e5e7eb;
-  overflow: hidden;
-}
-
-.upgrade-progress-bar {
-  height: 100%;
-  min-width: 0;
-  border-radius: inherit;
-  background: linear-gradient(90deg, #10b981 0%, #0f8f87 100%);
-  transition: width 0.18s ease;
-}
-
-.theme-dark .upgrade-file-meta-item--checksum,
-.theme-dark .upgrade-file-meta-item--size,
-.theme-dark .upgrade-file-name {
-  color: #cbd5e1;
-}
-
-.theme-dark .upgrade-file-meta-item--program {
-  color: #5eead4;
-}
-
-.theme-dark .upgrade-progress {
-  background: #263241;
-}
-
-.theme-dark .upgrade-progress-bar {
-  background: linear-gradient(90deg, #2dd4bf 0%, #14b8a6 100%);
-}
-
 .settings-input-wrap {
   flex: none;
   display: flex;