settings.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. const settingsService = require('../../store/settings-store.js')
  2. const themeService = require('../../store/theme-store.js')
  3. const bootloaderService = require('../../features/bootloader/service.js')
  4. const transport = require('../../transport/ble-core.js')
  5. const {
  6. createPageToast
  7. } = require('../../utils/page-toast.js')
  8. const {
  9. createToolInitialState,
  10. toolNavigation,
  11. toolPageHandlers
  12. } = require('../../features/tools/index.js')
  13. const {
  14. getSettingsPageState
  15. } = require('../../features/settings/view-model.js')
  16. const protocolImplementation = require('../../features/settings/protocol-implementation.js')
  17. const {
  18. getWxApi
  19. } = require('../../utils/base-utils.js')
  20. function mergeDraftFields(data = {}, nextState = {}, draftFields = {}) {
  21. const draftValues = {}
  22. Object.keys(draftFields).forEach((field) => {
  23. if (draftFields[field]) {
  24. draftValues[field] = data[field]
  25. }
  26. })
  27. return {
  28. ...nextState,
  29. ...draftValues
  30. }
  31. }
  32. Page({
  33. data: {
  34. ...getSettingsPageState(),
  35. ...protocolImplementation.getState(),
  36. ...createToolInitialState(),
  37. activeSettingsTitle: '',
  38. activeSettingsView: ''
  39. },
  40. onLoad() {
  41. this.pageToast = createPageToast(this, this.data)
  42. this.crcFileBytes = null
  43. this.settingsDraftFields = {}
  44. settingsService.init()
  45. themeService.init()
  46. bootloaderService.init()
  47. this.unsubscribeSettings = settingsService.subscribe((settingsState) => {
  48. this.setData(this.mergeSettingsDrafts(getSettingsPageState(settingsState, themeService.getState())))
  49. })
  50. this.unsubscribeTheme = themeService.subscribe((themeState) => {
  51. this.setData(this.mergeSettingsDrafts(getSettingsPageState(settingsService.getState(), themeState)))
  52. })
  53. this.unsubscribeTransport = transport.subscribe((transportState) => {
  54. this.setData(this.mergeSettingsDrafts(getSettingsPageState(
  55. settingsService.getState(),
  56. themeService.getState(),
  57. transportState,
  58. bootloaderService.getState()
  59. )))
  60. })
  61. this.unsubscribeBootloader = bootloaderService.subscribe((bootloaderState) => {
  62. this.setData(this.mergeSettingsDrafts(getSettingsPageState(
  63. settingsService.getState(),
  64. themeService.getState(),
  65. transport.getState(),
  66. bootloaderState
  67. )))
  68. })
  69. },
  70. onTabItemTap() {
  71. this.backToSettingsHome()
  72. },
  73. onShow() {
  74. if (this.pageToast) {
  75. this.pageToast.setActive(true)
  76. }
  77. this.setData(this.mergeSettingsDrafts(getSettingsPageState()))
  78. },
  79. onHide() {
  80. if (this.pageToast) {
  81. this.pageToast.setActive(false)
  82. }
  83. },
  84. onUnload() {
  85. if (this.pageToast) {
  86. this.pageToast.destroy()
  87. this.pageToast = null
  88. }
  89. if (this.unsubscribeSettings) {
  90. this.unsubscribeSettings()
  91. this.unsubscribeSettings = null
  92. }
  93. if (this.unsubscribeTheme) {
  94. this.unsubscribeTheme()
  95. this.unsubscribeTheme = null
  96. }
  97. if (this.unsubscribeTransport) {
  98. this.unsubscribeTransport()
  99. this.unsubscribeTransport = null
  100. }
  101. if (this.unsubscribeBootloader) {
  102. this.unsubscribeBootloader()
  103. this.unsubscribeBootloader = null
  104. }
  105. },
  106. onNightModeEnabledChange(event) {
  107. settingsService.setNightModeEnabled(!!event.detail.value)
  108. },
  109. onNightModeFollowSystemChange(event) {
  110. settingsService.setNightModeFollowSystem(!!event.detail.value)
  111. },
  112. onParameterCardControlChange(event) {
  113. settingsService.setParameterCardControlEnabled(!!event.detail.value)
  114. },
  115. onSettingsDraftInput(event) {
  116. const field = event && event.currentTarget && event.currentTarget.dataset
  117. ? event.currentTarget.dataset.field
  118. : ''
  119. if (!field) return
  120. if (!this.settingsDraftFields) this.settingsDraftFields = {}
  121. this.settingsDraftFields[field] = true
  122. this.setData({
  123. [field]: event.detail.value
  124. })
  125. },
  126. mergeSettingsDrafts(nextState) {
  127. return mergeDraftFields(this.data, nextState, this.settingsDraftFields)
  128. },
  129. clearSettingsDraft(field) {
  130. if (this.settingsDraftFields && field) {
  131. delete this.settingsDraftFields[field]
  132. }
  133. },
  134. onModbusSlaveAddressBlur(event) {
  135. this.clearSettingsDraft('modbusSlaveAddress')
  136. settingsService.setModbusSlaveAddress(event.detail.value)
  137. },
  138. onProtocolModeChange(event) {
  139. const option = this.data.protocolOptions[Number(event.detail.value)]
  140. if (!option) return
  141. settingsService.setProtocolMode(option.key)
  142. },
  143. onParameterAutoPollChange(event) {
  144. settingsService.setParameterAutoPollEnabled(!!event.detail.value)
  145. },
  146. onStorageAccessDefaultEndianChange(event) {
  147. settingsService.setStorageAccessDefaultEndian(event.detail.value ? 'big' : 'little')
  148. },
  149. onParameterPollIntervalBlur(event) {
  150. this.clearSettingsDraft('parameterPollInterval')
  151. settingsService.setParameterPollInterval(event.detail.value)
  152. },
  153. onParameterMaxPacketLengthBlur(event) {
  154. this.clearSettingsDraft('parameterMaxPacketLength')
  155. settingsService.setParameterMaxPacketLength(event.detail.value)
  156. },
  157. openToolEntry(event) {
  158. const view = event.currentTarget.dataset.view
  159. if (!toolNavigation.isToolView(view)) return
  160. if (this.pageToast) this.pageToast.clear()
  161. this.setData({
  162. activeSettingsTitle: toolNavigation.getToolTitle(view),
  163. activeSettingsView: view
  164. })
  165. },
  166. openProtocolImplementation() {
  167. if (this.pageToast) this.pageToast.clear()
  168. this.setData({
  169. activeSettingsTitle: protocolImplementation.TITLE,
  170. activeSettingsView: protocolImplementation.VIEW_ID,
  171. ...protocolImplementation.getState(this.data.storageProtocolImplementationActiveIndex)
  172. })
  173. },
  174. selectProtocolImplementationFile(event) {
  175. const index = Number(event.currentTarget.dataset.index)
  176. this.setData(protocolImplementation.getState(index))
  177. },
  178. copyProtocolImplementationFile(event) {
  179. const index = event && event.currentTarget && event.currentTarget.dataset
  180. ? Number(event.currentTarget.dataset.index)
  181. : this.data.storageProtocolImplementationActiveIndex
  182. const text = protocolImplementation.getSourceText(index)
  183. if (!text) {
  184. if (this.pageToast) this.pageToast.show('源码暂未提供')
  185. return
  186. }
  187. const wxApi = getWxApi()
  188. if (typeof wxApi.setClipboardData !== 'function') {
  189. if (this.pageToast) this.pageToast.show('当前环境不支持复制', 'error')
  190. return
  191. }
  192. wxApi.setClipboardData({
  193. data: text,
  194. fail: () => {
  195. if (this.pageToast) this.pageToast.show('复制失败', 'error')
  196. },
  197. success: () => {
  198. const file = protocolImplementation.getState(index).storageProtocolImplementationActiveFile
  199. if (this.pageToast) this.pageToast.show(`已复制 ${file.name}`)
  200. }
  201. })
  202. },
  203. backToSettingsHome() {
  204. if (this.pageToast) this.pageToast.clear()
  205. this.setData({
  206. activeSettingsTitle: '',
  207. activeSettingsView: ''
  208. })
  209. },
  210. chooseFirmwareFile() {
  211. if (this.data.isBootloaderBusy) return
  212. bootloaderService.chooseFirmwareFile('auto')
  213. },
  214. startFirmwareUpgrade() {
  215. if (!this.data.connectedDevice || !this.data.isFirmwareReady || this.data.isBootloaderBusy) return
  216. bootloaderService.startUpgrade()
  217. },
  218. readProgramChecksum() {
  219. if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
  220. bootloaderService.readProgramChecksum()
  221. },
  222. handshakeBootloader() {
  223. if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
  224. bootloaderService.sendHandshakeKeepAlive()
  225. },
  226. exitBootloader() {
  227. if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
  228. bootloaderService.exitBootloader()
  229. },
  230. ...toolPageHandlers
  231. })