1
0

settings.wxml 37 KB

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