tool-page.js 11 KB

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