| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- const {
- migrateLegacyGroupsToProtocol,
- persistGroups,
- readStoredGroups
- } = require('./persistence.js')
- const {
- getWxApi
- } = require('../../utils/platform-utils.js')
- const {
- normalizeStorageCodeInfoCard,
- DATA_TYPE_OPTIONS,
- REGISTER_TYPE_OPTIONS,
- normalizeGroup
- } = require('../../domain/parameter-groups/model.js')
- const STORAGE_CODE_INFO_KEY = 'parameter-groups-code-info'
- const PROTOCOL_MODE = {
- MODBUS_RTU: 'modbus-rtu',
- STORAGE_ACCESS: 'storage-access'
- }
- let initialized = false
- const subscribers = []
- const DEFAULT_STORAGE_CODE_INFO_CARD = normalizeStorageCodeInfoCard(null)
- let state = {
- activeProtocolMode: PROTOCOL_MODE.STORAGE_ACCESS,
- parameterDataTypeOptions: DATA_TYPE_OPTIONS,
- parameterGroupsByProtocol: {
- [PROTOCOL_MODE.MODBUS_RTU]: [],
- [PROTOCOL_MODE.STORAGE_ACCESS]: []
- },
- parameterRegisterTypeOptions: REGISTER_TYPE_OPTIONS,
- storageCodeInfoCard: DEFAULT_STORAGE_CODE_INFO_CARD
- }
- function normalizeProtocolMode(protocolMode) {
- return protocolMode === PROTOCOL_MODE.MODBUS_RTU
- ? PROTOCOL_MODE.MODBUS_RTU
- : PROTOCOL_MODE.STORAGE_ACCESS
- }
- function getActiveProtocolMode() {
- return normalizeProtocolMode(state.activeProtocolMode)
- }
- function getActiveGroups() {
- return state.parameterGroupsByProtocol[getActiveProtocolMode()] || []
- }
- function getGroupsForProtocol(protocolMode = getActiveProtocolMode()) {
- return state.parameterGroupsByProtocol[normalizeProtocolMode(protocolMode)] || []
- }
- function getCodeInfoContext(card = state.storageCodeInfoCard) {
- return card && card.codeInfoContext
- ? card.codeInfoContext
- : {}
- }
- function normalizeGroupsForProtocol(parameterGroups = [], protocolMode = getActiveProtocolMode(), options = {}) {
- const codeInfoContext = protocolMode === PROTOCOL_MODE.STORAGE_ACCESS
- ? getCodeInfoContext(options.storageCodeInfoCard)
- : {}
- return Array.isArray(parameterGroups)
- ? parameterGroups.map((group) => normalizeGroup({
- ...group,
- codeInfoContext
- }))
- : []
- }
- function notify() {
- const nextState = getState()
- subscribers.slice().forEach((subscriber) => {
- subscriber(nextState)
- })
- }
- function persistActiveGroups(options = {}) {
- if (options.persist === false) return
- persistGroups(getActiveGroups(), getActiveProtocolMode())
- }
- function setState(changedData, options = {}) {
- state = {
- ...state,
- ...changedData
- }
- persistActiveGroups(options)
- notify()
- }
- function setGroups(parameterGroups, options = {}) {
- const protocolMode = normalizeProtocolMode(options.protocolMode || getActiveProtocolMode())
- const normalizedGroups = normalizeGroupsForProtocol(parameterGroups, protocolMode)
- const parameterGroupsByProtocol = {
- ...state.parameterGroupsByProtocol,
- [protocolMode]: normalizedGroups
- }
- state = {
- ...state,
- parameterGroupsByProtocol
- }
- if (options.persist !== false) persistGroups(normalizedGroups, protocolMode)
- notify()
- }
- function persistStorageCodeInfoCard(card) {
- const wxApi = getWxApi()
- if (typeof wxApi.setStorageSync !== 'function') return
- try {
- wxApi.setStorageSync(STORAGE_CODE_INFO_KEY, JSON.stringify(card || null))
- } catch (error) {}
- }
- function readStorageCodeInfoCard() {
- const wxApi = getWxApi()
- if (typeof wxApi.getStorageSync !== 'function') return DEFAULT_STORAGE_CODE_INFO_CARD
- try {
- const jsonText = wxApi.getStorageSync(STORAGE_CODE_INFO_KEY)
- return jsonText ? normalizeStorageCodeInfoCard(JSON.parse(jsonText)) : DEFAULT_STORAGE_CODE_INFO_CARD
- } catch (error) {
- return DEFAULT_STORAGE_CODE_INFO_CARD
- }
- }
- function setStorageCodeInfo(codeInfo, options = {}) {
- const card = normalizeStorageCodeInfoCard(codeInfo)
- const storageGroups = state.parameterGroupsByProtocol[PROTOCOL_MODE.STORAGE_ACCESS] || []
- const normalizedStorageGroups = normalizeGroupsForProtocol(storageGroups, PROTOCOL_MODE.STORAGE_ACCESS, {
- storageCodeInfoCard: card
- })
- state = {
- ...state,
- parameterGroupsByProtocol: {
- ...state.parameterGroupsByProtocol,
- [PROTOCOL_MODE.STORAGE_ACCESS]: normalizedStorageGroups
- },
- storageCodeInfoCard: card
- }
- if (options.persist !== false) persistGroups(normalizedStorageGroups, PROTOCOL_MODE.STORAGE_ACCESS)
- if (options.persist !== false) persistStorageCodeInfoCard(card)
- notify()
- }
- function updateGroups(mapper, options = {}) {
- if (typeof mapper !== 'function') return
- const protocolMode = normalizeProtocolMode(options.protocolMode || getActiveProtocolMode())
- setGroups(getGroupsForProtocol(protocolMode).map((group, index) => mapper(group, index)), {
- ...options,
- protocolMode
- })
- }
- function switchProtocolMode(protocolMode, options = {}) {
- const normalizedProtocolMode = normalizeProtocolMode(protocolMode)
- init(normalizedProtocolMode)
- if (state.activeProtocolMode === normalizedProtocolMode) {
- if (options.notify !== false) notify()
- return
- }
- state = {
- ...state,
- activeProtocolMode: normalizedProtocolMode
- }
- if (options.notify !== false) notify()
- }
- function init(protocolMode = state.activeProtocolMode) {
- const normalizedProtocolMode = normalizeProtocolMode(protocolMode)
- if (initialized) return
- const storageCodeInfoCard = readStorageCodeInfoCard()
- migrateLegacyGroupsToProtocol(normalizedProtocolMode)
- const protocolOrder = normalizedProtocolMode === PROTOCOL_MODE.MODBUS_RTU
- ? [PROTOCOL_MODE.MODBUS_RTU, PROTOCOL_MODE.STORAGE_ACCESS]
- : [PROTOCOL_MODE.STORAGE_ACCESS, PROTOCOL_MODE.MODBUS_RTU]
- const parameterGroupsByProtocol = {
- [PROTOCOL_MODE.MODBUS_RTU]: [],
- [PROTOCOL_MODE.STORAGE_ACCESS]: []
- }
- protocolOrder.forEach((targetProtocolMode) => {
- parameterGroupsByProtocol[targetProtocolMode] = normalizeGroupsForProtocol(
- readStoredGroups(targetProtocolMode),
- targetProtocolMode
- )
- })
- state = {
- ...state,
- activeProtocolMode: normalizedProtocolMode,
- storageCodeInfoCard,
- parameterGroupsByProtocol
- }
- initialized = true
- }
- function getState() {
- return {
- activeProtocolMode: getActiveProtocolMode(),
- parameterDataTypeOptions: DATA_TYPE_OPTIONS,
- parameterGroups: getActiveGroups(),
- parameterRegisterTypeOptions: REGISTER_TYPE_OPTIONS,
- storageCodeInfoCard: state.storageCodeInfoCard
- }
- }
- function getGroups() {
- return getActiveGroups()
- }
- function findGroup(groupId, protocolMode = getActiveProtocolMode()) {
- return getGroupsForProtocol(protocolMode).find((group) => group.id === groupId)
- }
- function subscribe(subscriber) {
- if (typeof subscriber !== 'function') return () => {}
- init()
- subscribers.push(subscriber)
- subscriber(getState())
- return () => {
- const index = subscribers.indexOf(subscriber)
- if (index >= 0) subscribers.splice(index, 1)
- }
- }
- module.exports = {
- DATA_TYPE_OPTIONS,
- REGISTER_TYPE_OPTIONS,
- findGroup,
- getGroups,
- getState,
- init,
- setGroups,
- setState,
- setStorageCodeInfo,
- switchProtocolMode,
- subscribe,
- updateGroups
- }
|