1
0

settings.wxml 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. <navigation-bar background="{{themeMode === 'dark' ? '#111827' : '#FFF'}}"></navigation-bar>
  2. <view wx:if="{{toastText}}" class="page-toast page-toast--{{toastType}} {{themeClass}}">
  3. {{toastText}}
  4. </view>
  5. <view wx:if="{{activeSettingsView}}" class="subpage-fixed-header {{themeClass}}">
  6. <view class="subpage-page-header">
  7. <view class="subpage-back" bindtap="backToSettingsHome">
  8. <view class="subpage-back-icon"></view>
  9. </view>
  10. <view class="subpage-page-title">{{activeSettingsTitle}}</view>
  11. </view>
  12. </view>
  13. <scroll-view class="scrollarea {{themeClass}} {{activeSettingsView ? 'scrollarea--subpage' : ''}}" scroll-y type="list">
  14. <view class="page-shell">
  15. <block wx:if="{{activeSettingsView}}">
  16. <block wx:if="{{activeSettingsView == 'bootloader'}}">
  17. <view class="panel params-section-panel upgrade-panel">
  18. <view class="panel-header panel-header--with-actions">
  19. <view class="panel-icon icon-chip">
  20. <image class="panel-icon-image" src="/assets/icons/chip-white.png" mode="aspectFit" />
  21. </view>
  22. <view class="panel-title">BootLoader</view>
  23. <view class="panel-actions upgrade-actions">
  24. <view
  25. class="panel-action-button {{isBootloaderBusy ? 'is-disabled' : ''}}"
  26. bindtap="chooseFirmwareFile"
  27. >
  28. 加载
  29. </view>
  30. <view
  31. class="panel-action-button {{connectedDevice && !isBootloaderBusy ? '' : 'is-disabled'}}"
  32. bindtap="handshakeBootloader"
  33. >
  34. 握手
  35. </view>
  36. <view
  37. class="panel-action-button {{connectedDevice && !isBootloaderBusy ? '' : 'is-disabled'}}"
  38. bindtap="readProgramChecksum"
  39. >
  40. 读取
  41. </view>
  42. <view
  43. class="panel-action-button {{connectedDevice && !isBootloaderBusy ? '' : 'is-disabled'}}"
  44. bindtap="exitBootloader"
  45. >
  46. 退出
  47. </view>
  48. <view
  49. class="panel-action-button {{connectedDevice && isFirmwareReady && !isBootloaderBusy ? '' : 'is-disabled'}}"
  50. bindtap="startFirmwareUpgrade"
  51. >
  52. 升级
  53. </view>
  54. </view>
  55. </view>
  56. <view class="upgrade-body">
  57. <view class="upgrade-row">
  58. <text class="upgrade-label">芯片型号</text>
  59. <text class="upgrade-value">{{chipModel}}</text>
  60. </view>
  61. <view class="upgrade-row upgrade-row--file">
  62. <view class="upgrade-file-head">
  63. <text class="upgrade-label">固件文件</text>
  64. <view class="upgrade-file-meta">
  65. <text class="upgrade-file-meta-item upgrade-file-meta-item--program">{{deviceProgramCrcText}}</text>
  66. <text class="upgrade-file-meta-item upgrade-file-meta-item--checksum">{{firmwareChecksumText}}</text>
  67. <text class="upgrade-file-meta-item upgrade-file-meta-item--size">{{firmwareSizeText}}</text>
  68. </view>
  69. </view>
  70. <text class="upgrade-file-name">{{firmwareName ? firmwareName : '--'}}</text>
  71. </view>
  72. <view class="upgrade-row">
  73. <text class="upgrade-label">Bootloader</text>
  74. <text class="upgrade-value">{{bootloaderVersion}} / {{bootloaderChipId}}</text>
  75. </view>
  76. <view wx:if="{{bootloaderStatusText || bootloaderDetailText}}" class="upgrade-status {{isFirmwareReady ? 'upgrade-status--ready' : ''}}">
  77. {{bootloaderStatusText}}<text wx:if="{{bootloaderDetailText}}"> · {{bootloaderDetailText}}</text>
  78. </view>
  79. <view class="upgrade-progress">
  80. <view class="upgrade-progress-bar" style="width: {{bootloaderProgress}}%;"></view>
  81. </view>
  82. </view>
  83. </view>
  84. </block>
  85. <block wx:elif="{{activeSettingsView == 'crc'}}">
  86. <view class="panel params-section-panel crc-algorithm-panel {{crcAlgorithmCollapsed ? 'panel--collapsed' : ''}}">
  87. <view class="param-row input-row">
  88. <picker
  89. class="crc-algorithm-picker"
  90. mode="selector"
  91. range="{{crcPresetOptions}}"
  92. range-key="label"
  93. value="{{crcPresetIndex}}"
  94. bindchange="onCrcPresetChange"
  95. >
  96. <view class="crc-algorithm-picker-content">
  97. <view class="param-main">
  98. <view class="param-name">算法</view>
  99. </view>
  100. <view class="generic-picker-value crc-picker-value">{{crcPresetOptions[crcPresetIndex].label}}</view>
  101. </view>
  102. </picker>
  103. <view
  104. class="collapse-toggle {{crcAlgorithmCollapsed ? 'is-collapsed' : ''}}"
  105. bindtap="toggleCrcAlgorithmPanel"
  106. >
  107. <view class="collapse-indicator"></view>
  108. </view>
  109. </view>
  110. <view wx:if="{{!crcAlgorithmCollapsed && (crcShowCrcConfig || crcShowHmacKey || crcShowPbkdf2Config)}}" class="crc-algorithm-fields">
  111. <block wx:if="{{crcShowCrcConfig}}">
  112. <view class="param-row input-row">
  113. <view class="param-main">
  114. <view class="param-name">位宽</view>
  115. <view class="param-meta">1 - 64</view>
  116. </view>
  117. <view class="input-wrap">
  118. <input class="value-input crc-config-input" type="number" data-field="crcWidth" value="{{crcWidth}}" bindinput="onCrcConfigInput" />
  119. </view>
  120. </view>
  121. <view class="param-row input-row">
  122. <view class="param-main">
  123. <view class="param-name">Poly</view>
  124. <view class="param-meta">HEX</view>
  125. </view>
  126. <view class="input-wrap">
  127. <input class="value-input crc-config-input" data-field="crcPoly" value="{{crcPoly}}" bindinput="onCrcConfigInput" />
  128. </view>
  129. </view>
  130. <view class="param-row input-row">
  131. <view class="param-main">
  132. <view class="param-name">初始值</view>
  133. <view class="param-meta">HEX</view>
  134. </view>
  135. <view class="input-wrap">
  136. <input class="value-input crc-config-input" data-field="crcInitialValue" value="{{crcInitialValue}}" bindinput="onCrcConfigInput" />
  137. </view>
  138. </view>
  139. <view class="param-row input-row">
  140. <view class="param-main">
  141. <view class="param-name">结果异或值</view>
  142. <view class="param-meta">HEX</view>
  143. </view>
  144. <view class="input-wrap">
  145. <input class="value-input crc-config-input" data-field="crcXorOut" value="{{crcXorOut}}" bindinput="onCrcConfigInput" />
  146. </view>
  147. </view>
  148. <view class="crc-switch-row">
  149. <view class="crc-switch-field">
  150. <view class="param-name">输入反转</view>
  151. <switch checked="{{crcReflectIn}}" color="#0f766e" data-field="crcReflectIn" bindchange="onCrcReflectChange" />
  152. </view>
  153. <view class="crc-switch-field">
  154. <view class="param-name">输出反转</view>
  155. <switch checked="{{crcReflectOut}}" color="#0f766e" data-field="crcReflectOut" bindchange="onCrcReflectChange" />
  156. </view>
  157. </view>
  158. </block>
  159. <block wx:elif="{{crcShowHmacKey}}">
  160. <view class="param-row input-row">
  161. <view class="param-main">
  162. <view class="param-name">密钥</view>
  163. <view class="param-meta">UTF-8</view>
  164. </view>
  165. <view class="input-wrap">
  166. <input class="value-input crc-config-input" data-field="crcHmacKey" value="{{crcHmacKey}}" bindinput="onCrcConfigInput" />
  167. </view>
  168. </view>
  169. </block>
  170. <block wx:elif="{{crcShowPbkdf2Config}}">
  171. <view class="param-row input-row">
  172. <view class="param-main">
  173. <view class="param-name">盐值</view>
  174. <view class="param-meta">UTF-8</view>
  175. </view>
  176. <view class="input-wrap">
  177. <input class="value-input crc-config-input" data-field="crcPbkdf2Salt" value="{{crcPbkdf2Salt}}" bindinput="onCrcConfigInput" />
  178. </view>
  179. </view>
  180. <view class="param-row input-row">
  181. <view class="param-main">
  182. <view class="param-name">迭代次数</view>
  183. <view class="param-meta">1 - 100000</view>
  184. </view>
  185. <view class="input-wrap">
  186. <input class="value-input crc-config-input" type="number" data-field="crcPbkdf2Iterations" value="{{crcPbkdf2Iterations}}" bindinput="onCrcConfigInput" />
  187. </view>
  188. </view>
  189. <view class="param-row input-row">
  190. <view class="param-main">
  191. <view class="param-name">输出长度</view>
  192. <view class="param-meta">1 - 4096 Byte</view>
  193. </view>
  194. <view class="input-wrap">
  195. <input class="value-input crc-config-input" type="number" data-field="crcPbkdf2Length" value="{{crcPbkdf2Length}}" bindinput="onCrcConfigInput" />
  196. </view>
  197. </view>
  198. </block>
  199. </view>
  200. </view>
  201. <view class="panel params-section-panel">
  202. <view class="params-section-title crc-data-card-header">
  203. <view class="crc-data-title">数据</view>
  204. <view class="crc-data-header-actions">
  205. <picker
  206. class="crc-data-type-picker"
  207. mode="selector"
  208. range="{{crcInputTypeOptions}}"
  209. range-key="label"
  210. value="{{crcInputTypeIndex}}"
  211. bindchange="onCrcInputTypeChange"
  212. >
  213. <view class="crc-data-type-value">{{crcInputTypeOptions[crcInputTypeIndex].label}}</view>
  214. </picker>
  215. <view class="panel-action-button" bindtap="loadCrcFileFromMessage">加载</view>
  216. <view class="panel-action-button" bindtap="clearCrcInput">清空</view>
  217. <view class="panel-action-button is-active" bindtap="calculateCrc">计算</view>
  218. </view>
  219. </view>
  220. <view wx:if="{{crcFileName}}" class="param-row">
  221. <view class="param-main">
  222. <view class="param-name">文件</view>
  223. <view class="param-meta">{{crcFileSizeText}}</view>
  224. </view>
  225. <view class="crc-file-name">{{crcFileName}}</view>
  226. </view>
  227. <view class="crc-data-wrap">
  228. <textarea
  229. class="crc-data-input"
  230. maxlength="-1"
  231. auto-height
  232. value="{{crcDataText}}"
  233. bindinput="onCrcDataInput"
  234. />
  235. </view>
  236. </view>
  237. <view class="panel params-section-panel">
  238. <view class="params-section-title">结果</view>
  239. <view class="param-row crc-calc-result-row">
  240. <view class="param-main crc-calc-result-main">
  241. <view class="param-name">HEX</view>
  242. <view class="crc-calc-result-value" data-value="{{crcResultHex}}" bindtap="copyToolResult">{{crcResultHex}}</view>
  243. </view>
  244. </view>
  245. <view wx:if="{{crcShowBinResult}}" class="param-row crc-calc-result-row crc-calc-result-row--bin">
  246. <view class="param-main crc-calc-result-main">
  247. <view class="param-name">BIN</view>
  248. <view class="crc-calc-result-value crc-calc-result-value--bin" data-value="{{crcResultBin}}" bindtap="copyToolResult">
  249. <text wx:for="{{crcResultBinLines}}" wx:key="id" class="crc-result-bin-line">{{item.text}}</text>
  250. </view>
  251. </view>
  252. </view>
  253. <view class="param-row crc-calc-result-row">
  254. <view class="param-main crc-calc-result-main">
  255. <view class="param-name">Base64</view>
  256. <view class="crc-calc-result-value" data-value="{{crcResultBase64}}" bindtap="copyToolResult">{{crcResultBase64}}</view>
  257. </view>
  258. </view>
  259. <view wx:if="{{crcErrorText}}" class="param-row">
  260. <view class="param-main">
  261. <view class="param-name">错误</view>
  262. </view>
  263. <view class="crc-error-value">{{crcErrorText}}</view>
  264. </view>
  265. </view>
  266. </block>
  267. <block wx:elif="{{activeSettingsView == 'filter'}}">
  268. <view class="panel params-section-panel">
  269. <view class="params-section-title filter-section-title">
  270. <view class="filter-section-title-text">参数</view>
  271. <view class="filter-mode-actions">
  272. <view class="filter-mode-button" bindtap="toggleFilterNetwork">{{filterNetworkText}}</view>
  273. <view class="filter-mode-button" bindtap="toggleFilterResponse">{{filterResponseText}}</view>
  274. <view class="filter-mode-button" bindtap="clearFilterInputs">清除</view>
  275. </view>
  276. </view>
  277. <view class="param-row input-row">
  278. <view class="param-main">
  279. <view class="param-name">电阻 R</view>
  280. <view wx:if="{{filterComputedKey == 'resistance'}}" class="param-meta">自动计算</view>
  281. </view>
  282. <view class="filter-input-wrap">
  283. <input
  284. class="value-input filter-value-input {{filterComputedKey == 'resistance' ? 'filter-value-input--computed' : ''}}"
  285. type="digit"
  286. placeholder="--"
  287. data-field="resistance"
  288. value="{{filterResistanceDisplayValue}}"
  289. bindinput="onFilterResistanceInput"
  290. bindblur="onFilterValueBlur"
  291. />
  292. <picker
  293. class="filter-unit-picker"
  294. mode="selector"
  295. range="{{filterResistanceUnitOptions}}"
  296. range-key="label"
  297. value="{{filterResistanceUnitIndex}}"
  298. bindchange="onFilterResistanceUnitChange"
  299. >
  300. <view class="filter-unit-value">{{filterResistanceUnitText}}</view>
  301. </picker>
  302. </view>
  303. </view>
  304. <view class="param-row input-row">
  305. <view class="param-main">
  306. <view class="param-name">{{filterReactiveName}} {{filterReactiveSymbol}}</view>
  307. <view wx:if="{{filterComputedKey == 'reactive'}}" class="param-meta">自动计算</view>
  308. </view>
  309. <view class="filter-input-wrap">
  310. <input
  311. class="value-input filter-value-input {{filterComputedKey == 'reactive' ? 'filter-value-input--computed' : ''}}"
  312. type="digit"
  313. placeholder="--"
  314. data-field="reactive"
  315. value="{{filterReactiveDisplayValue}}"
  316. bindinput="onFilterReactiveInput"
  317. bindblur="onFilterValueBlur"
  318. />
  319. <picker
  320. class="filter-unit-picker"
  321. mode="selector"
  322. range="{{filterReactiveUnitOptions}}"
  323. range-key="label"
  324. value="{{filterReactiveUnitIndex}}"
  325. bindchange="onFilterReactiveUnitChange"
  326. >
  327. <view class="filter-unit-value">{{filterReactiveUnitText}}</view>
  328. </picker>
  329. </view>
  330. </view>
  331. <view class="param-row input-row">
  332. <view class="param-main">
  333. <view class="param-name">-3dB截止频率</view>
  334. <view wx:if="{{filterComputedKey == 'frequency'}}" class="param-meta">自动计算</view>
  335. </view>
  336. <view class="filter-input-wrap">
  337. <input
  338. class="value-input filter-value-input {{filterComputedKey == 'frequency' ? 'filter-value-input--computed' : ''}}"
  339. type="digit"
  340. placeholder="--"
  341. data-field="frequency"
  342. value="{{filterFrequencyDisplayValue}}"
  343. bindinput="onFilterFrequencyInput"
  344. bindblur="onFilterValueBlur"
  345. />
  346. <picker
  347. class="filter-unit-picker"
  348. mode="selector"
  349. range="{{filterFrequencyUnitOptions}}"
  350. range-key="label"
  351. value="{{filterFrequencyUnitIndex}}"
  352. bindchange="onFilterFrequencyUnitChange"
  353. >
  354. <view class="filter-unit-value">{{filterFrequencyUnitText}}</view>
  355. </picker>
  356. </view>
  357. </view>
  358. <view wx:if="{{filterErrorText}}" class="filter-error-inline">{{filterErrorText}}</view>
  359. </view>
  360. <view class="panel params-section-panel">
  361. <view class="params-section-title filter-diagram-title">
  362. <view>电路图</view>
  363. <view class="filter-diagram-mode">{{filterNetworkText}} · {{filterResponseText}}</view>
  364. </view>
  365. <view class="filter-diagram">
  366. <view class="filter-schematic">
  367. <view class="filter-schematic-label filter-schematic-label--input">Vin</view>
  368. <view class="filter-schematic-label filter-schematic-label--output">Vout</view>
  369. <view class="filter-schematic-dot filter-schematic-dot--input-top"></view>
  370. <view class="filter-schematic-dot filter-schematic-dot--input-bottom"></view>
  371. <view class="filter-schematic-dot filter-schematic-dot--node-top"></view>
  372. <view class="filter-schematic-dot filter-schematic-dot--node-bottom"></view>
  373. <view class="filter-schematic-dot filter-schematic-dot--output-top"></view>
  374. <view class="filter-schematic-dot filter-schematic-dot--output-bottom"></view>
  375. <view class="filter-schematic-wire filter-schematic-wire--top-input"></view>
  376. <view class="filter-schematic-wire filter-schematic-wire--top-middle"></view>
  377. <view class="filter-schematic-wire filter-schematic-wire--top-output"></view>
  378. <view class="filter-schematic-wire filter-schematic-wire--bottom-input"></view>
  379. <view class="filter-schematic-wire filter-schematic-wire--bottom-output"></view>
  380. <view class="filter-schematic-wire filter-schematic-wire--branch-top"></view>
  381. <view class="filter-schematic-wire filter-schematic-wire--branch-bottom"></view>
  382. <view class="filter-schematic-mark filter-schematic-mark--series">{{filterSeriesLabel}}</view>
  383. <view class="filter-schematic-component filter-schematic-component--series">
  384. <image class="filter-schematic-symbol" src="{{filterSeriesComponentSrc}}" mode="aspectFit" />
  385. </view>
  386. <view class="filter-schematic-mark filter-schematic-mark--shunt">{{filterShuntLabel}}</view>
  387. <view class="filter-schematic-component filter-schematic-component--shunt">
  388. <image class="filter-schematic-symbol filter-schematic-symbol--vertical" src="{{filterShuntComponentSrc}}" mode="aspectFit" />
  389. </view>
  390. </view>
  391. </view>
  392. </view>
  393. </block>
  394. <block wx:elif="{{activeSettingsView == 'reactance'}}">
  395. <view class="panel params-section-panel">
  396. <view class="params-section-title filter-section-title">
  397. <view class="filter-section-title-text">参数</view>
  398. <view class="filter-mode-actions">
  399. <view class="filter-mode-button" bindtap="toggleReactanceMode">{{reactanceModeText}}</view>
  400. <view class="filter-mode-button" bindtap="clearReactanceInputs">清除</view>
  401. </view>
  402. </view>
  403. <view class="param-row input-row">
  404. <view class="param-main">
  405. <view class="param-name">频率 f</view>
  406. </view>
  407. <view class="filter-input-wrap">
  408. <input
  409. class="value-input filter-value-input"
  410. type="digit"
  411. placeholder="--"
  412. data-field="frequency"
  413. value="{{reactanceFrequencyDisplayValue}}"
  414. bindinput="onReactanceFrequencyInput"
  415. bindblur="onReactanceValueBlur"
  416. />
  417. <picker
  418. class="filter-unit-picker"
  419. mode="selector"
  420. range="{{reactanceFrequencyUnitOptions}}"
  421. range-key="label"
  422. value="{{reactanceFrequencyUnitIndex}}"
  423. bindchange="onReactanceFrequencyUnitChange"
  424. >
  425. <view class="filter-unit-value">{{reactanceFrequencyUnitText}}</view>
  426. </picker>
  427. </view>
  428. </view>
  429. <view class="param-row input-row">
  430. <view class="param-main">
  431. <view class="param-name">{{reactanceReactiveName}} {{reactanceReactiveSymbol}}</view>
  432. </view>
  433. <view class="filter-input-wrap">
  434. <input
  435. class="value-input filter-value-input"
  436. type="digit"
  437. placeholder="--"
  438. data-field="reactive"
  439. value="{{reactanceReactiveDisplayValue}}"
  440. bindinput="onReactanceReactiveInput"
  441. bindblur="onReactanceValueBlur"
  442. />
  443. <picker
  444. class="filter-unit-picker"
  445. mode="selector"
  446. range="{{reactanceReactiveUnitOptions}}"
  447. range-key="label"
  448. value="{{reactanceReactiveUnitIndex}}"
  449. bindchange="onReactanceReactiveUnitChange"
  450. >
  451. <view class="filter-unit-value">{{reactanceReactiveUnitText}}</view>
  452. </picker>
  453. </view>
  454. </view>
  455. <view wx:if="{{reactanceErrorText}}" class="filter-error-inline">{{reactanceErrorText}}</view>
  456. </view>
  457. <view class="panel params-section-panel">
  458. <view class="params-section-title filter-diagram-title">
  459. <view>结果</view>
  460. <view class="filter-diagram-mode">{{reactanceModeText}}</view>
  461. </view>
  462. <view
  463. wx:for="{{reactanceResultRows}}"
  464. wx:for-item="row"
  465. wx:key="label"
  466. class="param-row smd-result-row"
  467. >
  468. <view class="param-main">
  469. <view class="param-name">{{row.label}}</view>
  470. <view class="param-meta">{{row.meta}}</view>
  471. </view>
  472. <view class="smd-result-value">{{row.value}}</view>
  473. </view>
  474. </view>
  475. </block>
  476. <block wx:elif="{{activeSettingsView == 'smdCode'}}">
  477. <view class="panel params-section-panel">
  478. <view class="params-section-title smd-section-title">
  479. <view class="smd-section-title-text">类型</view>
  480. <view class="smd-mode-actions">
  481. <view
  482. wx:for="{{smdKindOptions}}"
  483. wx:key="key"
  484. class="smd-mode-button {{smdKindKey == item.key ? 'is-active' : ''}}"
  485. data-kind="{{item.key}}"
  486. bindtap="onSmdKindTap"
  487. >
  488. {{item.label}}
  489. </view>
  490. </view>
  491. </view>
  492. <view class="smd-format-row">
  493. <view
  494. wx:for="{{smdFormatOptions}}"
  495. wx:key="key"
  496. class="smd-format-button {{smdFormatKey == item.key ? 'is-active' : ''}}"
  497. data-format="{{item.key}}"
  498. bindtap="onSmdFormatTap"
  499. >
  500. {{item.label}}
  501. </view>
  502. </view>
  503. </view>
  504. <view class="panel params-section-panel">
  505. <view class="params-section-title smd-section-title">
  506. <view class="smd-section-title-text">编码</view>
  507. <view wx:if="{{smdCodeText}}" class="panel-action-button" bindtap="clearSmdCodeInput">清空</view>
  508. </view>
  509. <view class="param-row input-row">
  510. <view class="param-main">
  511. <view class="param-name">EIA</view>
  512. <view class="param-meta">{{smdKindText}} · {{smdFormatText}}</view>
  513. </view>
  514. <view class="input-wrap">
  515. <input
  516. class="value-input smd-code-input"
  517. placeholder="{{smdFormatKey == 'eia96' ? '01A' : smdFormatKey == 'eia198' ? 'A4' : '103'}}"
  518. value="{{smdCodeText}}"
  519. bindinput="onSmdCodeInput"
  520. />
  521. </view>
  522. </view>
  523. </view>
  524. <view class="panel params-section-panel">
  525. <view class="params-section-title">结果</view>
  526. <view class="param-row smd-result-row">
  527. <view class="param-main">
  528. <view class="param-name">显示值</view>
  529. <view class="param-meta {{smdErrorText ? 'param-meta--dirty' : ''}}">{{smdErrorText || smdFormulaText || '输入编码后自动计算'}}</view>
  530. </view>
  531. <view class="smd-result-value {{smdErrorText ? 'smd-result-value--error' : ''}}">{{smdResultText}}</view>
  532. </view>
  533. </view>
  534. </block>
  535. <block wx:elif="{{activeSettingsView == 'refrigeration'}}">
  536. <view class="panel params-section-panel">
  537. <view class="params-section-title smd-section-title refrigeration-title-row">
  538. <view class="smd-section-title-text">公式</view>
  539. <picker
  540. class="refrigeration-mode-picker"
  541. mode="selector"
  542. range="{{coolingModeOptions}}"
  543. range-key="label"
  544. value="{{coolingModeIndex}}"
  545. bindchange="onCoolingModeChange"
  546. >
  547. <view class="generic-picker-value refrigeration-picker-value">
  548. {{coolingModeText}}
  549. </view>
  550. </picker>
  551. </view>
  552. <view class="smd-format-row refrigeration-formula-row">
  553. <view class="refrigeration-formula-text">{{coolingFormulaText}}</view>
  554. </view>
  555. </view>
  556. <view class="panel params-section-panel">
  557. <view class="params-section-title smd-section-title">
  558. <view class="smd-section-title-text">输入</view>
  559. <view wx:if="{{coolingAnyInput}}" class="panel-action-button" bindtap="clearCoolingInputs">清空</view>
  560. </view>
  561. <view
  562. wx:for="{{coolingFieldRows}}"
  563. wx:for-item="field"
  564. wx:key="key"
  565. class="param-row input-row"
  566. >
  567. <view class="param-main">
  568. <view class="param-name">{{field.label}}</view>
  569. <view class="param-meta">{{field.unit}}</view>
  570. </view>
  571. <view class="input-wrap">
  572. <input
  573. class="value-input smd-code-input refrigeration-input"
  574. type="text"
  575. placeholder="{{field.placeholder}}"
  576. value="{{field.value}}"
  577. data-field="{{field.key}}"
  578. bindinput="onCoolingInput"
  579. />
  580. </view>
  581. </view>
  582. </view>
  583. <view class="panel params-section-panel">
  584. <view class="params-section-title">结果</view>
  585. <view wx:if="{{coolingErrorText}}" class="filter-error-inline">{{coolingErrorText}}</view>
  586. <view wx:if="{{!coolingResultRows.length && !coolingErrorText}}" class="param-row smd-result-row">
  587. <view class="param-main">
  588. <view class="param-name">显示值</view>
  589. <view class="param-meta">输入参数后自动计算</view>
  590. </view>
  591. <view class="smd-result-value">--</view>
  592. </view>
  593. <view
  594. wx:for="{{coolingResultRows}}"
  595. wx:for-item="row"
  596. wx:key="label"
  597. class="param-row smd-result-row"
  598. >
  599. <view class="param-main">
  600. <view class="param-name">{{row.label}}</view>
  601. </view>
  602. <view class="smd-result-value">{{row.value}}</view>
  603. </view>
  604. </view>
  605. </block>
  606. <block wx:elif="{{activeSettingsView == 'threePhasePower'}}">
  607. <view class="panel params-section-panel">
  608. <view class="params-section-title smd-section-title">
  609. <view class="smd-section-title-text">参数</view>
  610. <view class="smd-mode-actions">
  611. <view
  612. wx:for="{{threePhaseConnectionOptions}}"
  613. wx:key="key"
  614. class="smd-mode-button {{threePhaseConnectionKey == item.key ? 'is-active' : ''}}"
  615. data-connection="{{item.key}}"
  616. bindtap="onThreePhaseConnectionTap"
  617. >
  618. {{item.label}}
  619. </view>
  620. <view class="panel-action-button" bindtap="clearThreePhaseInputs">清除</view>
  621. </view>
  622. </view>
  623. <view wx:if="{{threePhaseErrorText}}" class="filter-error-inline">{{threePhaseErrorText}}</view>
  624. <view
  625. wx:for="{{threePhaseRows}}"
  626. wx:for-item="row"
  627. wx:key="key"
  628. class="param-row {{row.editable ? 'input-row' : ''}}"
  629. >
  630. <view class="param-main">
  631. <view class="param-name">{{row.label}}</view>
  632. <view wx:if="{{row.unit}}" class="param-meta">{{row.unit}}</view>
  633. </view>
  634. <view wx:if="{{!row.editable}}" class="smd-result-value">{{row.value}}</view>
  635. <view wx:if="{{row.editable}}" class="input-wrap">
  636. <input
  637. class="value-input smd-code-input three-phase-input"
  638. type="text"
  639. placeholder="{{row.placeholder}}"
  640. value="{{row.value}}"
  641. data-field="{{row.field}}"
  642. bindinput="onThreePhaseInput"
  643. />
  644. </view>
  645. </view>
  646. </view>
  647. </block>
  648. </block>
  649. <block wx:else>
  650. <view class="panel settings-section-panel">
  651. <view class="params-section-title">通用设置</view>
  652. <view class="settings-row">
  653. <view class="settings-row-main">
  654. <view class="param-name">夜间模式启用</view>
  655. <view class="param-meta">当前 {{themeMode === 'dark' ? '夜间' : '日间'}}</view>
  656. </view>
  657. <switch
  658. checked="{{nightModeEnabledSwitch}}"
  659. color="#0f766e"
  660. disabled="{{nightModeFollowSystem}}"
  661. bindchange="onNightModeEnabledChange"
  662. />
  663. </view>
  664. <view class="settings-row">
  665. <view class="settings-row-main">
  666. <view class="param-name">夜间模式跟随系统</view>
  667. <view class="param-meta">{{nightModeFollowSystem ? '已跟随' : '手动控制'}}</view>
  668. </view>
  669. <switch
  670. checked="{{nightModeFollowSystem}}"
  671. color="#0f766e"
  672. bindchange="onNightModeFollowSystemChange"
  673. />
  674. </view>
  675. </view>
  676. <view class="panel settings-section-panel">
  677. <view class="params-section-title">协议</view>
  678. <view class="settings-row">
  679. <view class="settings-row-main">
  680. <view class="param-name">协议模式</view>
  681. <view class="param-meta">{{isStorageAccessProtocol ? '单主单从存储访问' : '标准功能码寄存器'}}</view>
  682. </view>
  683. <picker
  684. mode="selector"
  685. range="{{protocolOptions}}"
  686. range-key="label"
  687. value="{{protocolIndex}}"
  688. bindchange="onProtocolModeChange"
  689. >
  690. <view class="settings-picker-value">{{protocolText}}</view>
  691. </picker>
  692. </view>
  693. <view wx:if="{{isModbusProtocol}}" class="settings-row settings-row--input">
  694. <view class="settings-row-main">
  695. <view class="param-name">从机地址</view>
  696. <view class="param-meta">00 - FF</view>
  697. </view>
  698. <view class="settings-input-wrap">
  699. <input
  700. class="value-input settings-value-input settings-value-input--hex"
  701. maxlength="2"
  702. value="{{modbusSlaveAddress}}"
  703. bindblur="onModbusSlaveAddressBlur"
  704. bindconfirm="onModbusSlaveAddressBlur"
  705. />
  706. </view>
  707. </view>
  708. <view class="settings-row">
  709. <view class="settings-row-main">
  710. <view class="param-name">自动轮询</view>
  711. <view class="param-meta">{{parameterAutoPollEnabled ? '已启用' : '已停止'}}</view>
  712. </view>
  713. <switch
  714. checked="{{parameterAutoPollEnabled}}"
  715. color="#0f766e"
  716. bindchange="onParameterAutoPollChange"
  717. />
  718. </view>
  719. <view class="settings-row settings-row--input">
  720. <view class="settings-row-main">
  721. <view class="param-name">轮询间隔</view>
  722. <view class="param-meta">{{statusPollMinInterval}} - {{statusPollMaxInterval}} ms</view>
  723. </view>
  724. <view class="settings-input-wrap settings-input-wrap--unit">
  725. <input
  726. class="value-input settings-value-input settings-value-input--unit"
  727. type="number"
  728. value="{{parameterPollInterval}}"
  729. bindblur="onParameterPollIntervalBlur"
  730. bindconfirm="onParameterPollIntervalBlur"
  731. />
  732. <text class="settings-unit settings-unit--inside">ms</text>
  733. </view>
  734. </view>
  735. <view class="settings-row settings-row--input">
  736. <view class="settings-row-main">
  737. <view class="param-name">最大包长</view>
  738. <view class="param-meta">0 为无限制,最小 {{parameterMinPacketLength}} 字节</view>
  739. </view>
  740. <view class="settings-input-wrap settings-input-wrap--unit">
  741. <input
  742. class="value-input settings-value-input settings-value-input--unit"
  743. type="number"
  744. value="{{parameterMaxPacketLength}}"
  745. bindblur="onParameterMaxPacketLengthBlur"
  746. bindconfirm="onParameterMaxPacketLengthBlur"
  747. />
  748. <text class="settings-unit settings-unit--inside">B</text>
  749. </view>
  750. </view>
  751. </view>
  752. <view class="panel settings-section-panel">
  753. <view class="params-section-title">工具</view>
  754. <view
  755. wx:for="{{toolEntries}}"
  756. wx:key="view"
  757. class="settings-row settings-tool-row"
  758. data-view="{{item.view}}"
  759. bindtap="openToolEntry"
  760. >
  761. <view class="settings-tool-main">
  762. <view class="settings-tool-icon-frame {{item.icon}}">
  763. <image class="settings-tool-icon-image" src="{{item.iconSrc}}" mode="aspectFit" />
  764. </view>
  765. <view class="param-name settings-tool-title">{{item.label}}</view>
  766. </view>
  767. <view class="entry-chevron"></view>
  768. </view>
  769. </view>
  770. </block>
  771. </view>
  772. </scroll-view>