1
0

settings.wxml 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946
  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 == storageProtocolImplementationView}}">
  86. <view class="panel settings-section-panel storage-protocol-guide-panel">
  87. <view class="storage-protocol-guide-kicker">{{storageProtocolImplementationGuide.kicker}}</view>
  88. <view class="storage-protocol-guide-title">{{storageProtocolImplementationGuide.title}}</view>
  89. <view class="storage-protocol-guide-text">{{storageProtocolImplementationGuide.text}}</view>
  90. <view class="storage-protocol-guide-points">
  91. <view
  92. wx:for="{{storageProtocolImplementationGuide.points}}"
  93. wx:key="id"
  94. class="storage-protocol-guide-point"
  95. >
  96. {{item.text}}
  97. </view>
  98. </view>
  99. </view>
  100. <view class="panel settings-section-panel">
  101. <view class="params-section-title">参考文件</view>
  102. <view
  103. wx:for="{{storageProtocolImplementationFiles}}"
  104. wx:key="id"
  105. class="settings-row storage-protocol-file-row {{item.active ? 'is-active' : ''}}"
  106. data-index="{{index}}"
  107. bindtap="selectProtocolImplementationFile"
  108. >
  109. <view class="settings-row-main">
  110. <view class="storage-protocol-file-head">
  111. <view class="param-name">{{item.name}}</view>
  112. <view class="storage-protocol-file-badge">{{item.badge}}</view>
  113. </view>
  114. <view class="param-meta">{{item.role}} · {{item.sourceMeta}}</view>
  115. </view>
  116. <view
  117. wx:if="{{item.sourceAvailable}}"
  118. class="storage-protocol-copy-button"
  119. data-index="{{index}}"
  120. catchtap="copyProtocolImplementationFile"
  121. >
  122. 复制
  123. </view>
  124. <view wx:else class="storage-protocol-copy-button is-disabled">暂未提供</view>
  125. <view class="entry-chevron"></view>
  126. </view>
  127. </view>
  128. <view class="panel settings-section-panel storage-protocol-detail-panel">
  129. <view class="params-section-title storage-protocol-detail-title">
  130. <view class="storage-protocol-detail-name">{{storageProtocolImplementationActiveFile.name}}</view>
  131. <view class="storage-protocol-detail-role">{{storageProtocolImplementationActiveFile.role}}</view>
  132. </view>
  133. <view class="storage-protocol-detail-body">
  134. <view class="storage-protocol-file-location">{{storageProtocolImplementationActiveFile.location}}</view>
  135. <view class="storage-protocol-copy-card">
  136. <view class="storage-protocol-copy-meta">{{storageProtocolImplementationActiveFile.sourceMeta}}</view>
  137. <view
  138. wx:if="{{storageProtocolImplementationActiveFile.sourceAvailable}}"
  139. class="panel-action-button storage-protocol-copy-action"
  140. data-index="{{storageProtocolImplementationActiveIndex}}"
  141. bindtap="copyProtocolImplementationFile"
  142. >
  143. 复制当前文件
  144. </view>
  145. <view wx:else class="panel-action-button storage-protocol-copy-action is-disabled">源码暂未提供</view>
  146. </view>
  147. <view class="storage-protocol-file-summary">{{storageProtocolImplementationActiveFile.summary}}</view>
  148. <view class="storage-protocol-detail-list">
  149. <view
  150. wx:for="{{storageProtocolImplementationActiveFile.details}}"
  151. wx:key="*this"
  152. class="storage-protocol-detail-item"
  153. >
  154. {{item}}
  155. </view>
  156. </view>
  157. </view>
  158. </view>
  159. </block>
  160. <block wx:elif="{{activeSettingsView == 'crc'}}">
  161. <view class="panel params-section-panel crc-algorithm-panel {{crcAlgorithmCollapsed ? 'panel--collapsed' : ''}}">
  162. <view class="param-row input-row">
  163. <picker
  164. class="crc-algorithm-picker"
  165. mode="selector"
  166. range="{{crcPresetOptions}}"
  167. range-key="label"
  168. value="{{crcPresetIndex}}"
  169. bindchange="onCrcPresetChange"
  170. >
  171. <view class="crc-algorithm-picker-content">
  172. <view class="param-main">
  173. <view class="param-name">算法</view>
  174. </view>
  175. <view class="generic-picker-value crc-picker-value">{{crcPresetOptions[crcPresetIndex].label}}</view>
  176. </view>
  177. </picker>
  178. <view
  179. class="collapse-toggle {{crcAlgorithmCollapsed ? 'is-collapsed' : ''}}"
  180. bindtap="toggleCrcAlgorithmPanel"
  181. >
  182. <view class="collapse-indicator"></view>
  183. </view>
  184. </view>
  185. <view wx:if="{{!crcAlgorithmCollapsed && (crcShowCrcConfig || crcShowHmacKey || crcShowPbkdf2Config)}}" class="crc-algorithm-fields">
  186. <block wx:if="{{crcShowCrcConfig}}">
  187. <view class="param-row input-row">
  188. <view class="param-main">
  189. <view class="param-name">位宽</view>
  190. <view class="param-meta">1 - 64</view>
  191. </view>
  192. <view class="input-wrap">
  193. <input class="value-input crc-config-input" type="number" data-field="crcWidth" value="{{crcWidth}}" bindinput="onCrcConfigInput" />
  194. </view>
  195. </view>
  196. <view class="param-row input-row">
  197. <view class="param-main">
  198. <view class="param-name">Poly</view>
  199. <view class="param-meta">HEX</view>
  200. </view>
  201. <view class="input-wrap">
  202. <input class="value-input crc-config-input" data-field="crcPoly" value="{{crcPoly}}" bindinput="onCrcConfigInput" />
  203. </view>
  204. </view>
  205. <view class="param-row input-row">
  206. <view class="param-main">
  207. <view class="param-name">初始值</view>
  208. <view class="param-meta">HEX</view>
  209. </view>
  210. <view class="input-wrap">
  211. <input class="value-input crc-config-input" data-field="crcInitialValue" value="{{crcInitialValue}}" bindinput="onCrcConfigInput" />
  212. </view>
  213. </view>
  214. <view class="param-row input-row">
  215. <view class="param-main">
  216. <view class="param-name">结果异或值</view>
  217. <view class="param-meta">HEX</view>
  218. </view>
  219. <view class="input-wrap">
  220. <input class="value-input crc-config-input" data-field="crcXorOut" value="{{crcXorOut}}" bindinput="onCrcConfigInput" />
  221. </view>
  222. </view>
  223. <view class="crc-switch-row">
  224. <view class="crc-switch-field">
  225. <view class="param-name">输入反转</view>
  226. <switch checked="{{crcReflectIn}}" color="#0f766e" data-field="crcReflectIn" bindchange="onCrcReflectChange" />
  227. </view>
  228. <view class="crc-switch-field">
  229. <view class="param-name">输出反转</view>
  230. <switch checked="{{crcReflectOut}}" color="#0f766e" data-field="crcReflectOut" bindchange="onCrcReflectChange" />
  231. </view>
  232. </view>
  233. </block>
  234. <block wx:elif="{{crcShowHmacKey}}">
  235. <view class="param-row input-row">
  236. <view class="param-main">
  237. <view class="param-name">密钥</view>
  238. <view class="param-meta">UTF-8</view>
  239. </view>
  240. <view class="input-wrap">
  241. <input class="value-input crc-config-input" data-field="crcHmacKey" value="{{crcHmacKey}}" bindinput="onCrcConfigInput" />
  242. </view>
  243. </view>
  244. </block>
  245. <block wx:elif="{{crcShowPbkdf2Config}}">
  246. <view class="param-row input-row">
  247. <view class="param-main">
  248. <view class="param-name">盐值</view>
  249. <view class="param-meta">UTF-8</view>
  250. </view>
  251. <view class="input-wrap">
  252. <input class="value-input crc-config-input" data-field="crcPbkdf2Salt" value="{{crcPbkdf2Salt}}" bindinput="onCrcConfigInput" />
  253. </view>
  254. </view>
  255. <view class="param-row input-row">
  256. <view class="param-main">
  257. <view class="param-name">迭代次数</view>
  258. <view class="param-meta">1 - 100000</view>
  259. </view>
  260. <view class="input-wrap">
  261. <input class="value-input crc-config-input" type="number" data-field="crcPbkdf2Iterations" value="{{crcPbkdf2Iterations}}" bindinput="onCrcConfigInput" />
  262. </view>
  263. </view>
  264. <view class="param-row input-row">
  265. <view class="param-main">
  266. <view class="param-name">输出长度</view>
  267. <view class="param-meta">1 - 4096 Byte</view>
  268. </view>
  269. <view class="input-wrap">
  270. <input class="value-input crc-config-input" type="number" data-field="crcPbkdf2Length" value="{{crcPbkdf2Length}}" bindinput="onCrcConfigInput" />
  271. </view>
  272. </view>
  273. </block>
  274. </view>
  275. </view>
  276. <view class="panel params-section-panel">
  277. <view class="params-section-title crc-data-card-header">
  278. <view class="crc-data-title">数据</view>
  279. <view class="crc-data-header-actions">
  280. <picker
  281. class="crc-data-type-picker"
  282. mode="selector"
  283. range="{{crcInputTypeOptions}}"
  284. range-key="label"
  285. value="{{crcInputTypeIndex}}"
  286. bindchange="onCrcInputTypeChange"
  287. >
  288. <view class="crc-data-type-value">{{crcInputTypeOptions[crcInputTypeIndex].label}}</view>
  289. </picker>
  290. <view class="panel-action-button" bindtap="loadCrcFileFromMessage">加载</view>
  291. <view class="panel-action-button" bindtap="clearCrcInput">清空</view>
  292. <view class="panel-action-button is-active" bindtap="calculateCrc">计算</view>
  293. </view>
  294. </view>
  295. <view wx:if="{{crcFileName}}" class="param-row">
  296. <view class="param-main">
  297. <view class="param-name">文件</view>
  298. <view class="param-meta">{{crcFileSizeText}}</view>
  299. </view>
  300. <view class="crc-file-name">{{crcFileName}}</view>
  301. </view>
  302. <view class="crc-data-wrap">
  303. <textarea
  304. class="crc-data-input"
  305. maxlength="-1"
  306. auto-height
  307. value="{{crcDataText}}"
  308. bindinput="onCrcDataInput"
  309. />
  310. </view>
  311. </view>
  312. <view class="panel params-section-panel">
  313. <view class="params-section-title">结果</view>
  314. <view class="param-row crc-calc-result-row">
  315. <view class="param-main crc-calc-result-main">
  316. <view class="param-name">HEX</view>
  317. <view class="crc-calc-result-value" data-value="{{crcResultHex}}" bindtap="copyToolResult">{{crcResultHex}}</view>
  318. </view>
  319. </view>
  320. <view wx:if="{{crcShowBinResult}}" class="param-row crc-calc-result-row crc-calc-result-row--bin">
  321. <view class="param-main crc-calc-result-main">
  322. <view class="param-name">BIN</view>
  323. <view class="crc-calc-result-value crc-calc-result-value--bin" data-value="{{crcResultBin}}" bindtap="copyToolResult">
  324. <text wx:for="{{crcResultBinLines}}" wx:key="id" class="crc-result-bin-line">{{item.text}}</text>
  325. </view>
  326. </view>
  327. </view>
  328. <view class="param-row crc-calc-result-row">
  329. <view class="param-main crc-calc-result-main">
  330. <view class="param-name">Base64</view>
  331. <view class="crc-calc-result-value" data-value="{{crcResultBase64}}" bindtap="copyToolResult">{{crcResultBase64}}</view>
  332. </view>
  333. </view>
  334. </view>
  335. </block>
  336. <block wx:elif="{{activeSettingsView == 'asciiCode'}}">
  337. <view class="panel params-section-panel">
  338. <view class="params-section-title smd-section-title">
  339. <view class="smd-section-title-text">输入</view>
  340. <view wx:if="{{asciiCodeInputText}}" class="panel-action-button" bindtap="clearAsciiCodeInput">清空</view>
  341. </view>
  342. <view class="param-row input-row">
  343. <view class="param-main">
  344. <view class="param-name">ASCII / 数值</view>
  345. </view>
  346. <view class="input-wrap">
  347. <input
  348. class="value-input smd-code-input ascii-code-input"
  349. type="text"
  350. placeholder="A / 0x41 / 65"
  351. value="{{asciiCodeInputText}}"
  352. bindinput="onAsciiCodeInput"
  353. />
  354. </view>
  355. </view>
  356. <view wx:if="{{asciiCodeErrorText}}" class="filter-error-inline">{{asciiCodeErrorText}}</view>
  357. </view>
  358. <view class="panel params-section-panel">
  359. <view class="params-section-title">结果</view>
  360. <view
  361. wx:for="{{asciiCodeResultRows}}"
  362. wx:for-item="row"
  363. wx:key="label"
  364. class="param-row smd-result-row"
  365. >
  366. <view class="param-main">
  367. <view class="param-name">{{row.label}}</view>
  368. </view>
  369. <view
  370. class="smd-result-value ascii-code-result-value"
  371. data-value="{{row.copyValue || row.value}}"
  372. bindtap="copyToolResult"
  373. >{{row.value}}</view>
  374. </view>
  375. </view>
  376. </block>
  377. <block wx:elif="{{activeSettingsView == 'filter'}}">
  378. <view class="panel params-section-panel">
  379. <view class="params-section-title filter-section-title">
  380. <view class="filter-section-title-text">参数</view>
  381. <view class="filter-mode-actions">
  382. <view class="filter-mode-button" bindtap="toggleFilterNetwork">{{filterNetworkText}}</view>
  383. <view class="filter-mode-button" bindtap="toggleFilterResponse">{{filterResponseText}}</view>
  384. <view class="filter-mode-button" bindtap="clearFilterInputs">清除</view>
  385. </view>
  386. </view>
  387. <view class="param-row input-row">
  388. <view class="param-main">
  389. <view class="param-name">电阻 R</view>
  390. <view wx:if="{{filterComputedKey == 'resistance'}}" class="param-meta">自动计算</view>
  391. </view>
  392. <view class="filter-input-wrap">
  393. <input
  394. class="value-input filter-value-input {{filterComputedKey == 'resistance' ? 'filter-value-input--computed' : ''}}"
  395. type="digit"
  396. data-field="resistance"
  397. value="{{filterResistanceDisplayValue}}"
  398. bindinput="onFilterResistanceInput"
  399. bindblur="onFilterValueBlur"
  400. />
  401. <picker
  402. class="filter-unit-picker"
  403. mode="selector"
  404. range="{{filterResistanceUnitOptions}}"
  405. range-key="label"
  406. value="{{filterResistanceUnitIndex}}"
  407. bindchange="onFilterResistanceUnitChange"
  408. >
  409. <view class="filter-unit-value">{{filterResistanceUnitText}}</view>
  410. </picker>
  411. </view>
  412. </view>
  413. <view class="param-row input-row">
  414. <view class="param-main">
  415. <view class="param-name">{{filterReactiveName}} {{filterReactiveSymbol}}</view>
  416. <view wx:if="{{filterComputedKey == 'reactive'}}" class="param-meta">自动计算</view>
  417. </view>
  418. <view class="filter-input-wrap">
  419. <input
  420. class="value-input filter-value-input {{filterComputedKey == 'reactive' ? 'filter-value-input--computed' : ''}}"
  421. type="digit"
  422. data-field="reactive"
  423. value="{{filterReactiveDisplayValue}}"
  424. bindinput="onFilterReactiveInput"
  425. bindblur="onFilterValueBlur"
  426. />
  427. <picker
  428. class="filter-unit-picker"
  429. mode="selector"
  430. range="{{filterReactiveUnitOptions}}"
  431. range-key="label"
  432. value="{{filterReactiveUnitIndex}}"
  433. bindchange="onFilterReactiveUnitChange"
  434. >
  435. <view class="filter-unit-value">{{filterReactiveUnitText}}</view>
  436. </picker>
  437. </view>
  438. </view>
  439. <view class="param-row input-row">
  440. <view class="param-main">
  441. <view class="param-name">-3dB截止频率</view>
  442. <view wx:if="{{filterComputedKey == 'frequency'}}" class="param-meta">自动计算</view>
  443. </view>
  444. <view class="filter-input-wrap">
  445. <input
  446. class="value-input filter-value-input {{filterComputedKey == 'frequency' ? 'filter-value-input--computed' : ''}}"
  447. type="digit"
  448. data-field="frequency"
  449. value="{{filterFrequencyDisplayValue}}"
  450. bindinput="onFilterFrequencyInput"
  451. bindblur="onFilterValueBlur"
  452. />
  453. <picker
  454. class="filter-unit-picker"
  455. mode="selector"
  456. range="{{filterFrequencyUnitOptions}}"
  457. range-key="label"
  458. value="{{filterFrequencyUnitIndex}}"
  459. bindchange="onFilterFrequencyUnitChange"
  460. >
  461. <view class="filter-unit-value">{{filterFrequencyUnitText}}</view>
  462. </picker>
  463. </view>
  464. </view>
  465. <view wx:if="{{filterErrorText}}" class="filter-error-inline">{{filterErrorText}}</view>
  466. </view>
  467. <view class="panel params-section-panel">
  468. <view class="params-section-title filter-diagram-title">
  469. <view>电路图</view>
  470. <view class="filter-diagram-mode">{{filterNetworkText}} · {{filterResponseText}}</view>
  471. </view>
  472. <view class="filter-diagram">
  473. <view class="filter-schematic">
  474. <view class="filter-schematic-label filter-schematic-label--input">Vin</view>
  475. <view class="filter-schematic-label filter-schematic-label--output">Vout</view>
  476. <view class="filter-schematic-dot filter-schematic-dot--input-top"></view>
  477. <view class="filter-schematic-dot filter-schematic-dot--input-bottom"></view>
  478. <view class="filter-schematic-dot filter-schematic-dot--node-top"></view>
  479. <view class="filter-schematic-dot filter-schematic-dot--node-bottom"></view>
  480. <view class="filter-schematic-dot filter-schematic-dot--output-top"></view>
  481. <view class="filter-schematic-dot filter-schematic-dot--output-bottom"></view>
  482. <view class="filter-schematic-wire filter-schematic-wire--top-input"></view>
  483. <view class="filter-schematic-wire filter-schematic-wire--top-middle"></view>
  484. <view class="filter-schematic-wire filter-schematic-wire--top-output"></view>
  485. <view class="filter-schematic-wire filter-schematic-wire--bottom-input"></view>
  486. <view class="filter-schematic-wire filter-schematic-wire--bottom-output"></view>
  487. <view class="filter-schematic-wire filter-schematic-wire--branch-top"></view>
  488. <view class="filter-schematic-wire filter-schematic-wire--branch-bottom"></view>
  489. <view class="filter-schematic-mark filter-schematic-mark--series">{{filterSeriesLabel}}</view>
  490. <view class="filter-schematic-component filter-schematic-component--series">
  491. <image class="filter-schematic-symbol" src="{{filterSeriesComponentSrc}}" mode="aspectFit" />
  492. </view>
  493. <view class="filter-schematic-mark filter-schematic-mark--shunt">{{filterShuntLabel}}</view>
  494. <view class="filter-schematic-component filter-schematic-component--shunt">
  495. <image class="filter-schematic-symbol filter-schematic-symbol--vertical" src="{{filterShuntComponentSrc}}" mode="aspectFit" />
  496. </view>
  497. </view>
  498. </view>
  499. </view>
  500. </block>
  501. <block wx:elif="{{activeSettingsView == 'reactance'}}">
  502. <view class="panel params-section-panel">
  503. <view class="params-section-title filter-section-title">
  504. <view class="filter-section-title-text">参数</view>
  505. <view class="filter-mode-actions">
  506. <view class="filter-mode-button" bindtap="toggleReactanceMode">{{reactanceModeText}}</view>
  507. <view class="filter-mode-button" bindtap="clearReactanceInputs">清除</view>
  508. </view>
  509. </view>
  510. <view class="param-row input-row">
  511. <view class="param-main">
  512. <view class="param-name">频率 f</view>
  513. </view>
  514. <view class="filter-input-wrap">
  515. <input
  516. class="value-input filter-value-input"
  517. type="digit"
  518. data-field="frequency"
  519. value="{{reactanceFrequencyDisplayValue}}"
  520. bindinput="onReactanceFrequencyInput"
  521. bindblur="onReactanceValueBlur"
  522. />
  523. <picker
  524. class="filter-unit-picker"
  525. mode="selector"
  526. range="{{reactanceFrequencyUnitOptions}}"
  527. range-key="label"
  528. value="{{reactanceFrequencyUnitIndex}}"
  529. bindchange="onReactanceFrequencyUnitChange"
  530. >
  531. <view class="filter-unit-value">{{reactanceFrequencyUnitText}}</view>
  532. </picker>
  533. </view>
  534. </view>
  535. <view class="param-row input-row">
  536. <view class="param-main">
  537. <view class="param-name">{{reactanceReactiveName}} {{reactanceReactiveSymbol}}</view>
  538. </view>
  539. <view class="filter-input-wrap">
  540. <input
  541. class="value-input filter-value-input"
  542. type="digit"
  543. data-field="reactive"
  544. value="{{reactanceReactiveDisplayValue}}"
  545. bindinput="onReactanceReactiveInput"
  546. bindblur="onReactanceValueBlur"
  547. />
  548. <picker
  549. class="filter-unit-picker"
  550. mode="selector"
  551. range="{{reactanceReactiveUnitOptions}}"
  552. range-key="label"
  553. value="{{reactanceReactiveUnitIndex}}"
  554. bindchange="onReactanceReactiveUnitChange"
  555. >
  556. <view class="filter-unit-value">{{reactanceReactiveUnitText}}</view>
  557. </picker>
  558. </view>
  559. </view>
  560. <view wx:if="{{reactanceErrorText}}" class="filter-error-inline">{{reactanceErrorText}}</view>
  561. </view>
  562. <view class="panel params-section-panel">
  563. <view class="params-section-title filter-diagram-title">
  564. <view>结果</view>
  565. <view class="filter-diagram-mode">{{reactanceModeText}}</view>
  566. </view>
  567. <view
  568. wx:for="{{reactanceResultRows}}"
  569. wx:for-item="row"
  570. wx:key="label"
  571. class="param-row smd-result-row"
  572. >
  573. <view class="param-main">
  574. <view class="param-name">{{row.label}}</view>
  575. <view class="param-meta">{{row.meta}}</view>
  576. </view>
  577. <view class="smd-result-value">{{row.value}}</view>
  578. </view>
  579. </view>
  580. </block>
  581. <block wx:elif="{{activeSettingsView == 'smdCode'}}">
  582. <view class="panel params-section-panel">
  583. <view class="params-section-title smd-section-title">
  584. <view class="smd-section-title-text">类型</view>
  585. <view class="smd-mode-actions">
  586. <view
  587. wx:for="{{smdKindOptions}}"
  588. wx:key="key"
  589. class="smd-mode-button {{smdKindKey == item.key ? 'is-active' : ''}}"
  590. data-kind="{{item.key}}"
  591. bindtap="onSmdKindTap"
  592. >
  593. {{item.label}}
  594. </view>
  595. </view>
  596. </view>
  597. <view class="smd-format-row">
  598. <view
  599. wx:for="{{smdFormatOptions}}"
  600. wx:key="key"
  601. class="smd-format-button {{smdFormatKey == item.key ? 'is-active' : ''}}"
  602. data-format="{{item.key}}"
  603. bindtap="onSmdFormatTap"
  604. >
  605. {{item.label}}
  606. </view>
  607. </view>
  608. </view>
  609. <view class="panel params-section-panel">
  610. <view class="params-section-title smd-section-title">
  611. <view class="smd-section-title-text">编码</view>
  612. <view wx:if="{{smdCodeText}}" class="panel-action-button" bindtap="clearSmdCodeInput">清空</view>
  613. </view>
  614. <view class="param-row input-row">
  615. <view class="param-main">
  616. <view class="param-name">EIA</view>
  617. <view class="param-meta">{{smdKindText}} · {{smdFormatText}}</view>
  618. </view>
  619. <view class="input-wrap">
  620. <input
  621. class="value-input smd-code-input"
  622. placeholder="{{smdFormatKey == 'eia96' ? '01A' : smdFormatKey == 'eia198' ? 'A4' : '103'}}"
  623. value="{{smdCodeText}}"
  624. bindinput="onSmdCodeInput"
  625. />
  626. </view>
  627. </view>
  628. </view>
  629. <view class="panel params-section-panel">
  630. <view class="params-section-title">结果</view>
  631. <view class="param-row smd-result-row">
  632. <view class="param-main">
  633. <view class="param-name">显示值</view>
  634. <view class="param-meta {{smdErrorText ? 'param-meta--dirty' : ''}}">{{smdErrorText || smdFormulaText || '输入编码后自动计算'}}</view>
  635. </view>
  636. <view class="smd-result-value {{smdErrorText ? 'smd-result-value--error' : ''}}">{{smdResultText}}</view>
  637. </view>
  638. </view>
  639. </block>
  640. <block wx:elif="{{activeSettingsView == 'refrigeration'}}">
  641. <view class="panel params-section-panel">
  642. <view class="params-section-title smd-section-title refrigeration-title-row">
  643. <view class="smd-section-title-text">公式</view>
  644. <picker
  645. class="refrigeration-mode-picker"
  646. mode="selector"
  647. range="{{coolingModeOptions}}"
  648. range-key="label"
  649. value="{{coolingModeIndex}}"
  650. bindchange="onCoolingModeChange"
  651. >
  652. <view class="generic-picker-value refrigeration-picker-value">
  653. {{coolingModeText}}
  654. </view>
  655. </picker>
  656. </view>
  657. <view class="smd-format-row refrigeration-formula-row">
  658. <view class="refrigeration-formula-text">{{coolingFormulaText}}</view>
  659. </view>
  660. </view>
  661. <view class="panel params-section-panel">
  662. <view class="params-section-title smd-section-title">
  663. <view class="smd-section-title-text">输入</view>
  664. <view wx:if="{{coolingAnyInput}}" class="panel-action-button" bindtap="clearCoolingInputs">清空</view>
  665. </view>
  666. <view
  667. wx:for="{{coolingFieldRows}}"
  668. wx:for-item="field"
  669. wx:key="key"
  670. class="param-row input-row"
  671. >
  672. <view class="param-main">
  673. <view class="param-name">{{field.label}}</view>
  674. <view class="param-meta">{{field.unit}}</view>
  675. </view>
  676. <view class="input-wrap">
  677. <input
  678. class="value-input smd-code-input refrigeration-input"
  679. type="text"
  680. placeholder="{{field.placeholder}}"
  681. value="{{field.value}}"
  682. data-field="{{field.key}}"
  683. bindinput="onCoolingInput"
  684. />
  685. </view>
  686. </view>
  687. </view>
  688. <view class="panel params-section-panel">
  689. <view class="params-section-title">结果</view>
  690. <view wx:if="{{coolingErrorText}}" class="filter-error-inline">{{coolingErrorText}}</view>
  691. <view wx:if="{{!coolingResultRows.length && !coolingErrorText}}" class="param-row smd-result-row">
  692. <view class="param-main">
  693. <view class="param-name">显示值</view>
  694. <view class="param-meta">输入参数后自动计算</view>
  695. </view>
  696. <view class="smd-result-value">--</view>
  697. </view>
  698. <view
  699. wx:for="{{coolingResultRows}}"
  700. wx:for-item="row"
  701. wx:key="label"
  702. class="param-row smd-result-row"
  703. >
  704. <view class="param-main">
  705. <view class="param-name">{{row.label}}</view>
  706. </view>
  707. <view class="smd-result-value">{{row.value}}</view>
  708. </view>
  709. </view>
  710. </block>
  711. <block wx:elif="{{activeSettingsView == 'threePhasePower'}}">
  712. <view class="panel params-section-panel">
  713. <view class="params-section-title smd-section-title">
  714. <view class="smd-section-title-text">参数</view>
  715. <view class="smd-mode-actions">
  716. <view
  717. wx:for="{{threePhaseConnectionOptions}}"
  718. wx:key="key"
  719. class="smd-mode-button {{threePhaseConnectionKey == item.key ? 'is-active' : ''}}"
  720. data-connection="{{item.key}}"
  721. bindtap="onThreePhaseConnectionTap"
  722. >
  723. {{item.label}}
  724. </view>
  725. <view class="panel-action-button" bindtap="clearThreePhaseInputs">清除</view>
  726. </view>
  727. </view>
  728. <view wx:if="{{threePhaseErrorText}}" class="filter-error-inline">{{threePhaseErrorText}}</view>
  729. <view
  730. wx:for="{{threePhaseRows}}"
  731. wx:for-item="row"
  732. wx:key="key"
  733. class="param-row {{row.editable ? 'input-row' : ''}}"
  734. >
  735. <view class="param-main">
  736. <view class="param-name">{{row.label}}</view>
  737. <view wx:if="{{row.unit}}" class="param-meta">{{row.unit}}</view>
  738. </view>
  739. <view wx:if="{{!row.editable}}" class="smd-result-value">{{row.value}}</view>
  740. <view wx:if="{{row.editable}}" class="input-wrap">
  741. <input
  742. class="value-input smd-code-input three-phase-input"
  743. type="text"
  744. placeholder="{{row.placeholder}}"
  745. value="{{row.value}}"
  746. data-field="{{row.field}}"
  747. bindinput="onThreePhaseInput"
  748. />
  749. </view>
  750. </view>
  751. </view>
  752. </block>
  753. </block>
  754. <block wx:else>
  755. <view class="panel settings-section-panel">
  756. <view class="params-section-title">通用设置</view>
  757. <view class="settings-row">
  758. <view class="settings-row-main">
  759. <view class="param-name">夜间模式启用</view>
  760. <view class="param-meta">当前 {{themeMode === 'dark' ? '夜间' : '日间'}}</view>
  761. </view>
  762. <switch
  763. checked="{{nightModeEnabledSwitch}}"
  764. color="#0f766e"
  765. disabled="{{nightModeFollowSystem}}"
  766. bindchange="onNightModeEnabledChange"
  767. />
  768. </view>
  769. <view class="settings-row">
  770. <view class="settings-row-main">
  771. <view class="param-name">夜间模式跟随系统</view>
  772. <view class="param-meta">{{nightModeFollowSystem ? '已跟随' : '手动控制'}}</view>
  773. </view>
  774. <switch
  775. checked="{{nightModeFollowSystem}}"
  776. color="#0f766e"
  777. bindchange="onNightModeFollowSystemChange"
  778. />
  779. </view>
  780. <view class="settings-row">
  781. <view class="settings-row-main">
  782. <view class="param-name">卡片控制</view>
  783. <view class="param-meta">{{parameterCardControlEnabled ? '点击进入组界面' : '点击展开组内容'}}</view>
  784. </view>
  785. <switch
  786. checked="{{parameterCardControlEnabled}}"
  787. color="#0f766e"
  788. bindchange="onParameterCardControlChange"
  789. />
  790. </view>
  791. </view>
  792. <view class="panel settings-section-panel">
  793. <view class="params-section-title">协议</view>
  794. <view class="settings-row">
  795. <view class="settings-row-main">
  796. <view class="param-name">协议模式</view>
  797. <view class="param-meta">{{isNoProtocol ? '仅显示串口收发' : (isStorageAccessProtocol ? '单主单从存储访问' : '标准功能码寄存器')}}</view>
  798. </view>
  799. <picker
  800. mode="selector"
  801. range="{{protocolOptions}}"
  802. range-key="label"
  803. value="{{protocolIndex}}"
  804. bindchange="onProtocolModeChange"
  805. >
  806. <view class="settings-picker-value">{{protocolText}}</view>
  807. </picker>
  808. </view>
  809. <view
  810. wx:if="{{isStorageAccessProtocol}}"
  811. class="settings-row"
  812. >
  813. <view class="settings-row-main">
  814. <view class="param-name">默认大端模式</view>
  815. <view class="param-meta">当前 {{storageAccessDefaultEndianText}}</view>
  816. </view>
  817. <switch
  818. checked="{{storageAccessDefaultEndianBigSwitch}}"
  819. color="#0f766e"
  820. bindchange="onStorageAccessDefaultEndianChange"
  821. />
  822. </view>
  823. <view
  824. wx:if="{{isStorageAccessProtocol}}"
  825. class="settings-row settings-tool-row"
  826. bindtap="openProtocolImplementation"
  827. >
  828. <view class="settings-row-main">
  829. <view class="param-name">协议实现</view>
  830. <view class="param-meta">{{storageProtocolImplementationEntryMeta}}</view>
  831. </view>
  832. <view class="entry-chevron"></view>
  833. </view>
  834. <view wx:if="{{isModbusProtocol}}" class="settings-row settings-row--input">
  835. <view class="settings-row-main">
  836. <view class="param-name">从机地址</view>
  837. <view class="param-meta">00 - FF</view>
  838. </view>
  839. <view class="settings-input-wrap">
  840. <input
  841. class="value-input settings-value-input settings-value-input--hex"
  842. maxlength="2"
  843. value="{{modbusSlaveAddress}}"
  844. data-field="modbusSlaveAddress"
  845. bindinput="onSettingsDraftInput"
  846. bindblur="onModbusSlaveAddressBlur"
  847. bindconfirm="onModbusSlaveAddressBlur"
  848. />
  849. </view>
  850. </view>
  851. <view class="settings-row">
  852. <view class="settings-row-main">
  853. <view class="param-name">自动轮询</view>
  854. <view class="param-meta">{{parameterAutoPollEnabled ? '已启用' : '已停止'}}</view>
  855. </view>
  856. <switch
  857. checked="{{parameterAutoPollEnabled}}"
  858. color="#0f766e"
  859. bindchange="onParameterAutoPollChange"
  860. />
  861. </view>
  862. <view class="settings-row settings-row--input">
  863. <view class="settings-row-main">
  864. <view class="param-name">轮询间隔</view>
  865. <view class="param-meta">{{statusPollMinInterval}} - {{statusPollMaxInterval}} ms</view>
  866. </view>
  867. <view class="settings-input-wrap settings-input-wrap--unit">
  868. <input
  869. class="value-input settings-value-input settings-value-input--unit"
  870. type="number"
  871. value="{{parameterPollInterval}}"
  872. data-field="parameterPollInterval"
  873. bindinput="onSettingsDraftInput"
  874. bindblur="onParameterPollIntervalBlur"
  875. bindconfirm="onParameterPollIntervalBlur"
  876. />
  877. <text class="settings-unit settings-unit--inside">ms</text>
  878. </view>
  879. </view>
  880. <view class="settings-row settings-row--input">
  881. <view class="settings-row-main">
  882. <view class="param-name">最大包长</view>
  883. <view class="param-meta">0 为无限制,最小 {{parameterMinPacketLength}} 字节</view>
  884. </view>
  885. <view class="settings-input-wrap settings-input-wrap--unit">
  886. <input
  887. class="value-input settings-value-input settings-value-input--unit"
  888. type="number"
  889. value="{{parameterMaxPacketLength}}"
  890. data-field="parameterMaxPacketLength"
  891. bindinput="onSettingsDraftInput"
  892. bindblur="onParameterMaxPacketLengthBlur"
  893. bindconfirm="onParameterMaxPacketLengthBlur"
  894. />
  895. <text class="settings-unit settings-unit--inside">B</text>
  896. </view>
  897. </view>
  898. </view>
  899. <view class="panel settings-section-panel">
  900. <view class="params-section-title">工具</view>
  901. <view
  902. wx:for="{{toolEntries}}"
  903. wx:key="view"
  904. class="settings-row settings-tool-row"
  905. data-view="{{item.view}}"
  906. bindtap="openToolEntry"
  907. >
  908. <view class="settings-tool-main">
  909. <view class="settings-tool-icon-frame {{item.icon}}">
  910. <image class="settings-tool-icon-image" src="{{item.iconSrc}}" mode="aspectFit" />
  911. </view>
  912. <view class="param-name settings-tool-title">{{item.label}}</view>
  913. </view>
  914. <view class="entry-chevron"></view>
  915. </view>
  916. </view>
  917. </block>
  918. </view>
  919. </scroll-view>