1
0

settings.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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. Page({
  21. data: {
  22. ...getSettingsPageState(),
  23. ...protocolImplementation.getState(),
  24. ...createToolInitialState(),
  25. activeSettingsTitle: '',
  26. activeSettingsView: ''
  27. },
  28. onLoad() {
  29. this.pageToast = createPageToast(this, this.data)
  30. this.crcFileBytes = null
  31. settingsService.init()
  32. themeService.init()
  33. bootloaderService.init()
  34. this.unsubscribeSettings = settingsService.subscribe((settingsState) => {
  35. this.setData(getSettingsPageState(settingsState, themeService.getState()))
  36. })
  37. this.unsubscribeTheme = themeService.subscribe((themeState) => {
  38. this.setData(getSettingsPageState(settingsService.getState(), themeState))
  39. })
  40. this.unsubscribeTransport = transport.subscribe((transportState) => {
  41. this.setData(getSettingsPageState(
  42. settingsService.getState(),
  43. themeService.getState(),
  44. transportState,
  45. bootloaderService.getState()
  46. ))
  47. })
  48. this.unsubscribeBootloader = bootloaderService.subscribe((bootloaderState) => {
  49. this.setData(getSettingsPageState(
  50. settingsService.getState(),
  51. themeService.getState(),
  52. transport.getState(),
  53. bootloaderState
  54. ))
  55. })
  56. },
  57. onTabItemTap() {
  58. this.backToSettingsHome()
  59. },
  60. onShow() {
  61. if (this.pageToast) {
  62. this.pageToast.setActive(true)
  63. }
  64. this.setData(getSettingsPageState())
  65. },
  66. onHide() {
  67. if (this.pageToast) {
  68. this.pageToast.setActive(false)
  69. }
  70. },
  71. onUnload() {
  72. if (this.pageToast) {
  73. this.pageToast.destroy()
  74. this.pageToast = null
  75. }
  76. if (this.unsubscribeSettings) {
  77. this.unsubscribeSettings()
  78. this.unsubscribeSettings = null
  79. }
  80. if (this.unsubscribeTheme) {
  81. this.unsubscribeTheme()
  82. this.unsubscribeTheme = null
  83. }
  84. if (this.unsubscribeTransport) {
  85. this.unsubscribeTransport()
  86. this.unsubscribeTransport = null
  87. }
  88. if (this.unsubscribeBootloader) {
  89. this.unsubscribeBootloader()
  90. this.unsubscribeBootloader = null
  91. }
  92. },
  93. onNightModeEnabledChange(event) {
  94. settingsService.setNightModeEnabled(!!event.detail.value)
  95. },
  96. onNightModeFollowSystemChange(event) {
  97. settingsService.setNightModeFollowSystem(!!event.detail.value)
  98. },
  99. onParameterCardControlChange(event) {
  100. settingsService.setParameterCardControlEnabled(!!event.detail.value)
  101. },
  102. onSettingsDraftInput(event) {
  103. const field = event && event.currentTarget && event.currentTarget.dataset
  104. ? event.currentTarget.dataset.field
  105. : ''
  106. if (!field) return
  107. this.setData({
  108. [field]: event.detail.value
  109. })
  110. },
  111. onModbusSlaveAddressBlur(event) {
  112. settingsService.setModbusSlaveAddress(event.detail.value)
  113. },
  114. onProtocolModeChange(event) {
  115. const option = this.data.protocolOptions[Number(event.detail.value)]
  116. if (!option) return
  117. settingsService.setProtocolMode(option.key)
  118. },
  119. onParameterAutoPollChange(event) {
  120. settingsService.setParameterAutoPollEnabled(!!event.detail.value)
  121. },
  122. onParameterPollIntervalBlur(event) {
  123. settingsService.setParameterPollInterval(event.detail.value)
  124. },
  125. onParameterMaxPacketLengthBlur(event) {
  126. settingsService.setParameterMaxPacketLength(event.detail.value)
  127. },
  128. openToolEntry(event) {
  129. const view = event.currentTarget.dataset.view
  130. if (!toolNavigation.isToolView(view)) return
  131. if (this.pageToast) this.pageToast.clear()
  132. this.setData({
  133. activeSettingsTitle: toolNavigation.getToolTitle(view),
  134. activeSettingsView: view
  135. })
  136. },
  137. openProtocolImplementation() {
  138. if (this.pageToast) this.pageToast.clear()
  139. this.setData({
  140. activeSettingsTitle: protocolImplementation.TITLE,
  141. activeSettingsView: protocolImplementation.VIEW_ID,
  142. ...protocolImplementation.getState(this.data.storageProtocolImplementationActiveIndex)
  143. })
  144. },
  145. selectProtocolImplementationFile(event) {
  146. const index = Number(event.currentTarget.dataset.index)
  147. this.setData(protocolImplementation.getState(index))
  148. },
  149. copyProtocolImplementationFile(event) {
  150. const index = event && event.currentTarget && event.currentTarget.dataset
  151. ? Number(event.currentTarget.dataset.index)
  152. : this.data.storageProtocolImplementationActiveIndex
  153. const text = protocolImplementation.getSourceText(index)
  154. if (!text) {
  155. if (this.pageToast) this.pageToast.show('源码暂未提供')
  156. return
  157. }
  158. const wxApi = getWxApi()
  159. if (typeof wxApi.setClipboardData !== 'function') {
  160. if (this.pageToast) this.pageToast.show('当前环境不支持复制', 'error')
  161. return
  162. }
  163. wxApi.setClipboardData({
  164. data: text,
  165. fail: () => {
  166. if (this.pageToast) this.pageToast.show('复制失败', 'error')
  167. },
  168. success: () => {
  169. const file = protocolImplementation.getState(index).storageProtocolImplementationActiveFile
  170. if (this.pageToast) this.pageToast.show(`已复制 ${file.name}`)
  171. }
  172. })
  173. },
  174. backToSettingsHome() {
  175. if (this.pageToast) this.pageToast.clear()
  176. this.setData({
  177. activeSettingsTitle: '',
  178. activeSettingsView: ''
  179. })
  180. },
  181. chooseFirmwareFile() {
  182. if (this.data.isBootloaderBusy) return
  183. bootloaderService.chooseFirmwareFile('auto')
  184. },
  185. startFirmwareUpgrade() {
  186. if (!this.data.connectedDevice || !this.data.isFirmwareReady || this.data.isBootloaderBusy) return
  187. bootloaderService.startUpgrade()
  188. },
  189. readProgramChecksum() {
  190. if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
  191. bootloaderService.readProgramChecksum()
  192. },
  193. handshakeBootloader() {
  194. if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
  195. bootloaderService.sendHandshakeKeepAlive()
  196. },
  197. exitBootloader() {
  198. if (!this.data.connectedDevice || this.data.isBootloaderBusy) return
  199. bootloaderService.exitBootloader()
  200. },
  201. ...toolPageHandlers
  202. })