1
0

page.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. const {
  2. crcTool
  3. } = require('../../tools/crc-hash/index.js')
  4. const filterCalculator = require('../../tools/filter/index.js')
  5. const smdCodeCalculator = require('../../tools/smd-code/index.js')
  6. const refrigerationCalculator = require('../../tools/refrigeration/index.js')
  7. const reactanceCalculator = require('../../tools/reactance/index.js')
  8. const threePhasePowerCalculator = require('../../tools/three-phase-power/index.js')
  9. const {
  10. getWxApi
  11. } = require('../../utils/platform-utils.js')
  12. const {
  13. loadSelectedFile
  14. } = require('../../repositories/file.js')
  15. function createToolInitialState() {
  16. return {
  17. ...crcTool.createInitialState(),
  18. ...filterCalculator.createInitialState(),
  19. ...smdCodeCalculator.createInitialState(),
  20. ...refrigerationCalculator.createInitialState(),
  21. ...reactanceCalculator.createInitialState(),
  22. ...threePhasePowerCalculator.createInitialState()
  23. }
  24. }
  25. const toolPageHandlers = {
  26. copyToolResult(event) {
  27. const value = event && event.currentTarget && event.currentTarget.dataset
  28. ? event.currentTarget.dataset.value
  29. : ''
  30. const text = String(value === undefined || value === null ? '' : value).trim()
  31. if (!text || text === '--') return
  32. const wxApi = getWxApi()
  33. if (typeof wxApi.setClipboardData !== 'function') {
  34. if (this.pageToast) this.pageToast.show('当前环境不支持复制', 'error')
  35. return
  36. }
  37. wxApi.setClipboardData({
  38. data: text,
  39. fail: () => {
  40. if (this.pageToast) this.pageToast.show('复制失败', 'error')
  41. },
  42. success: () => {
  43. if (this.pageToast) this.pageToast.show('已复制')
  44. }
  45. })
  46. },
  47. onCrcPresetChange(event) {
  48. const presetIndex = Number(event.detail.value)
  49. this.setData({
  50. ...crcTool.createPresetState(presetIndex),
  51. crcErrorText: ''
  52. })
  53. },
  54. onCrcInputTypeChange(event) {
  55. this.setData({
  56. crcErrorText: '',
  57. crcInputTypeIndex: Number(event.detail.value)
  58. })
  59. },
  60. onCrcConfigInput(event) {
  61. const field = event.currentTarget.dataset.field
  62. if (!field) return
  63. const isCrcConfigField = crcTool.CRC_CONFIG_FIELDS.includes(field)
  64. const nextData = {
  65. [field]: event.detail.value,
  66. crcErrorText: ''
  67. }
  68. if (isCrcConfigField) {
  69. nextData.crcAlgorithmCollapsed = false
  70. nextData.crcPresetIndex = crcTool.getCustomPresetIndex()
  71. }
  72. this.setData(nextData)
  73. },
  74. onCrcReflectChange(event) {
  75. const field = event.currentTarget.dataset.field
  76. if (!field) return
  77. this.setData({
  78. [field]: !!event.detail.value,
  79. crcAlgorithmCollapsed: false,
  80. crcErrorText: '',
  81. crcPresetIndex: crcTool.getCustomPresetIndex()
  82. })
  83. },
  84. toggleCrcAlgorithmPanel() {
  85. this.setData({
  86. crcAlgorithmCollapsed: !this.data.crcAlgorithmCollapsed
  87. })
  88. },
  89. onCrcDataInput(event) {
  90. this.crcFileBytes = null
  91. this.setData({
  92. crcDataText: event.detail.value,
  93. crcErrorText: '',
  94. crcFileName: '',
  95. crcFileSizeText: ''
  96. })
  97. },
  98. calculateCrc() {
  99. try {
  100. this.setData(crcTool.calculateFromState(this.data, this.crcFileBytes))
  101. } catch (error) {
  102. const message = error && error.message ? error.message : '计算失败'
  103. this.setData({
  104. crcErrorText: message
  105. })
  106. if (this.pageToast) this.pageToast.show(message, 'error')
  107. }
  108. },
  109. async loadCrcFileFromMessage() {
  110. try {
  111. const file = await loadSelectedFile('message')
  112. this.crcFileBytes = file.bytes
  113. this.setData({
  114. crcDataLengthText: file.sizeText,
  115. crcDataText: '',
  116. crcErrorText: '',
  117. crcFileName: file.name,
  118. crcFileSizeText: file.sizeText
  119. })
  120. this.calculateCrc()
  121. } catch (error) {
  122. const message = error && (error.errMsg || error.message)
  123. ? (error.errMsg || error.message)
  124. : '读取文件失败'
  125. if (!/cancel/i.test(message) && this.pageToast) {
  126. this.pageToast.show(message, 'error')
  127. }
  128. }
  129. },
  130. clearCrcInput() {
  131. this.crcFileBytes = null
  132. this.setData({
  133. crcDataLengthText: '0 bytes',
  134. crcDataText: '',
  135. crcErrorText: '',
  136. crcFileName: '',
  137. crcFileSizeText: '',
  138. crcResultBase64: '--',
  139. crcResultBin: '--',
  140. crcResultBinLines: [
  141. {
  142. id: 'bin-line-0',
  143. text: '--'
  144. }
  145. ],
  146. crcResultHex: '--'
  147. })
  148. },
  149. setFilterState(changedData) {
  150. this.setData(filterCalculator.updateState(this.data, changedData))
  151. },
  152. toggleFilterNetwork() {
  153. this.setFilterState({
  154. filterNetworkIndex: this.data.filterNetworkKey === 'rl' ? 0 : 1
  155. })
  156. },
  157. toggleFilterResponse() {
  158. this.setFilterState({
  159. filterResponseIndex: this.data.filterResponseKey === 'highpass' ? 0 : 1
  160. })
  161. },
  162. onFilterNetworkChange(event) {
  163. this.setFilterState({
  164. filterNetworkIndex: Number(event.detail.value)
  165. })
  166. },
  167. onFilterResponseChange(event) {
  168. this.setFilterState({
  169. filterResponseIndex: Number(event.detail.value)
  170. })
  171. },
  172. onFilterResistanceInput(event) {
  173. this.setFilterState({
  174. filterResistanceValue: event.detail.value
  175. })
  176. },
  177. onFilterReactiveInput(event) {
  178. this.setFilterState({
  179. filterReactiveValue: event.detail.value
  180. })
  181. },
  182. onFilterFrequencyInput(event) {
  183. this.setFilterState({
  184. filterFrequencyValue: event.detail.value
  185. })
  186. },
  187. clearFilterInputs() {
  188. this.ignoreFilterBlurUntil = Date.now() + 300
  189. this.setFilterState({
  190. filterFrequencyValue: '',
  191. filterReactiveValue: '',
  192. filterResistanceValue: ''
  193. })
  194. },
  195. onFilterResistanceUnitChange(event) {
  196. this.setFilterState({
  197. filterResistanceUnitIndex: Number(event.detail.value)
  198. })
  199. },
  200. onFilterReactiveUnitChange(event) {
  201. const unitIndex = Number(event.detail.value)
  202. const field = this.data.filterNetworkKey === 'rl'
  203. ? 'filterInductanceUnitIndex'
  204. : 'filterCapacitanceUnitIndex'
  205. this.setFilterState({
  206. [field]: unitIndex
  207. })
  208. },
  209. onFilterFrequencyUnitChange(event) {
  210. this.setFilterState({
  211. filterFrequencyUnitIndex: Number(event.detail.value)
  212. })
  213. },
  214. onFilterValueBlur(event) {
  215. if (this.ignoreFilterBlurUntil && Date.now() < this.ignoreFilterBlurUntil) return
  216. const field = event.currentTarget.dataset.field
  217. const valueKeyMap = {
  218. frequency: 'filterFrequencyValue',
  219. reactive: 'filterReactiveValue',
  220. resistance: 'filterResistanceValue'
  221. }
  222. const valueKey = valueKeyMap[field]
  223. if (this.data.filterComputedKey === field && valueKey && !this.data[valueKey]) return
  224. this.setData(filterCalculator.normalizeValue(this.data, field, event.detail.value))
  225. },
  226. setSmdCodeState(changedData) {
  227. this.setData(smdCodeCalculator.updateState(this.data, changedData))
  228. },
  229. onSmdKindTap(event) {
  230. const kind = event.currentTarget.dataset.kind
  231. const kindIndex = (this.data.smdKindOptions || []).findIndex((item) => item.key === kind)
  232. if (kindIndex < 0) return
  233. this.setSmdCodeState({
  234. smdFormatIndex: 0,
  235. smdFormatKey: '',
  236. smdKindIndex: kindIndex
  237. })
  238. },
  239. onSmdFormatTap(event) {
  240. const format = event.currentTarget.dataset.format
  241. const formatIndex = (this.data.smdFormatOptions || []).findIndex((item) => item.key === format)
  242. if (formatIndex < 0) return
  243. this.setSmdCodeState({
  244. smdFormatIndex: formatIndex,
  245. smdFormatKey: format
  246. })
  247. },
  248. onSmdCodeInput(event) {
  249. this.setSmdCodeState({
  250. smdCodeText: event.detail.value
  251. })
  252. },
  253. clearSmdCodeInput() {
  254. this.setSmdCodeState({
  255. smdCodeText: ''
  256. })
  257. },
  258. setCoolingState(changedData) {
  259. this.setData(refrigerationCalculator.updateState(this.data, changedData))
  260. },
  261. onCoolingModeTap(event) {
  262. const mode = event.currentTarget.dataset.mode
  263. const modeIndex = (this.data.coolingModeOptions || []).findIndex((item) => item.key === mode)
  264. if (modeIndex < 0) return
  265. this.setCoolingState({
  266. coolingModeIndex: modeIndex
  267. })
  268. },
  269. onCoolingModeChange(event) {
  270. this.setCoolingState({
  271. coolingModeIndex: Number(event.detail.value)
  272. })
  273. },
  274. onCoolingInput(event) {
  275. const field = event.currentTarget.dataset.field
  276. if (!field) return
  277. this.setCoolingState({
  278. [field]: event.detail.value
  279. })
  280. },
  281. clearCoolingInputs() {
  282. this.setData(refrigerationCalculator.clearInputs(this.data))
  283. },
  284. setThreePhasePowerState(changedData) {
  285. this.setData(threePhasePowerCalculator.updateState(this.data, changedData))
  286. },
  287. onThreePhaseConnectionTap(event) {
  288. const connection = event.currentTarget.dataset.connection
  289. const connectionIndex = (this.data.threePhaseConnectionOptions || []).findIndex((item) => item.key === connection)
  290. if (connectionIndex < 0) return
  291. this.setThreePhasePowerState({
  292. threePhaseConnectionIndex: connectionIndex
  293. })
  294. },
  295. onThreePhaseInput(event) {
  296. const field = event.currentTarget.dataset.field
  297. if (!field) return
  298. const changedData = {
  299. [field]: event.detail.value
  300. }
  301. if (threePhasePowerCalculator.ELECTRICAL_INPUT_KEYS.includes(field)) {
  302. changedData.threePhaseElectricalDriver = field
  303. }
  304. if (threePhasePowerCalculator.POWER_DRIVER_KEYS.includes(field)) {
  305. changedData.threePhasePowerDriver = field
  306. }
  307. this.setThreePhasePowerState(changedData)
  308. },
  309. clearThreePhaseInputs() {
  310. this.setData(threePhasePowerCalculator.clearInputs(this.data))
  311. },
  312. setReactanceState(changedData) {
  313. this.setData(reactanceCalculator.updateState(this.data, changedData))
  314. },
  315. toggleReactanceMode() {
  316. this.setReactanceState({
  317. reactanceModeIndex: this.data.reactanceModeKey === 'inductive' ? 0 : 1
  318. })
  319. },
  320. onReactanceFrequencyInput(event) {
  321. this.setReactanceState({
  322. reactanceFrequencyValue: event.detail.value
  323. })
  324. },
  325. onReactanceReactiveInput(event) {
  326. this.setReactanceState({
  327. reactanceReactiveValue: event.detail.value
  328. })
  329. },
  330. clearReactanceInputs() {
  331. this.ignoreReactanceBlurUntil = Date.now() + 300
  332. this.setData(reactanceCalculator.clearInputs(this.data))
  333. },
  334. onReactanceFrequencyUnitChange(event) {
  335. this.setReactanceState({
  336. reactanceFrequencyUnitIndex: Number(event.detail.value)
  337. })
  338. },
  339. onReactanceReactiveUnitChange(event) {
  340. const unitIndex = Number(event.detail.value)
  341. const field = this.data.reactanceModeKey === 'inductive'
  342. ? 'reactanceInductanceUnitIndex'
  343. : 'reactanceCapacitanceUnitIndex'
  344. this.setReactanceState({
  345. [field]: unitIndex
  346. })
  347. },
  348. onReactanceValueBlur(event) {
  349. if (this.ignoreReactanceBlurUntil && Date.now() < this.ignoreReactanceBlurUntil) return
  350. const field = event.currentTarget.dataset.field
  351. this.setData(reactanceCalculator.normalizeValue(this.data, field, event.detail.value))
  352. }
  353. }
  354. module.exports = {
  355. createToolInitialState,
  356. toolPageHandlers
  357. }