const genericModbusService = require('../generic-modbus/service.js') const settingsService = require('../../store/settings-store.js') const themeService = require('../../store/theme-store.js') const transport = require('../../transport/ble-core.js') function getGenericOption(options, index) { return options[Number(index)] || options[0] || {} } function getPageState() { const settingsState = settingsService.getState() const transportState = transport.getState() const isPrivateProtocol = settingsState.modbusProtocolMode !== 'generic' return { ...genericModbusService.getState(), ...themeService.getState(), ...settingsState, connectedDevice: transportState.connectedDevice, isGenericProtocol: !isPrivateProtocol, isPrivateProtocol } } function resolveActiveParamView(currentView) { return currentView === 'genericModbusGroup' ? currentView : 'genericModbus' } function getSettingsPageState(currentData, settingsState) { const isPrivateProtocol = settingsState.modbusProtocolMode !== 'generic' return { ...settingsState, activeParamView: resolveActiveParamView(currentData.activeParamView), isGenericProtocol: !isPrivateProtocol, isPrivateProtocol } } function getVisiblePageState(currentData) { const settingsState = settingsService.getState() const transportState = transport.getState() const isPrivateProtocol = settingsState.modbusProtocolMode !== 'generic' const pageState = { ...genericModbusService.getState(), ...themeService.getState(), ...settingsState, connectedDevice: transportState.connectedDevice, isGenericProtocol: !isPrivateProtocol, isPrivateProtocol } return { ...pageState, activeParamView: resolveActiveParamView(currentData.activeParamView) } } function getTransportPageState(transportState = transport.getState()) { return { connectedDevice: transportState.connectedDevice } } function createGenericModbusDialogState(overrides = {}) { const registerType = getGenericOption(genericModbusService.REGISTER_TYPE_OPTIONS, 0) const dataType = getGenericOption(genericModbusService.DATA_TYPE_OPTIONS, 0) return { cancelText: '取消', confirmText: '确认', dataTypeIndex: 0, dataTypeText: dataType.label || '', groupId: '', groupName: '', mode: '', name: '', quantity: '1', registerIndex: -1, registerTypeIndex: 0, registerTypeText: registerType.label || '', remark: '', startAddress: '0000', title: '', textByteLength: '32', showTextLength: false, unit: '', visible: false, maxValue: '', minValue: '', addressText: '', displayValue: '', rawValueText: '', showDataType: false, showRange: false, showUnit: false, readOnly: false, parsedStructRegisters: [], structDefinition: '', structParsedSummary: '', ...overrides } } function createGenericGroupDialogState(group) { const isEdit = !!group const registerTypeIndex = isEdit ? (group.registerTypeIndex || 0) : 0 const registerType = getGenericOption(genericModbusService.REGISTER_TYPE_OPTIONS, registerTypeIndex) return createGenericModbusDialogState({ confirmText: isEdit ? '保存' : '确认', groupId: isEdit ? group.id : '', groupName: isEdit ? group.name : '寄存器组', layout: isEdit ? (group.layout || 'register') : 'register', mode: isEdit ? 'editGroup' : 'createGroup', quantity: isEdit ? String(group.quantity || 1) : '1', registerTypeIndex, registerTypeText: registerType.label || '', startAddress: isEdit && group.startAddressText ? group.startAddressText.replace(/^0x/i, '') : '0000', title: isEdit ? '编辑寄存器组' : '添加寄存器组', visible: true }) } function createGenericRegisterDialogState(mode, group, register, registerIndex) { const isView = mode === 'viewRegister' const dataTypeIndex = register.dataTypeIndex || 0 const dataType = getGenericOption(genericModbusService.DATA_TYPE_OPTIONS, dataTypeIndex) return createGenericModbusDialogState({ cancelText: isView ? '关闭' : '取消', confirmText: isView ? '' : '保存', dataTypeIndex, dataTypeText: register.dataTypeText || dataType.label || '', groupId: group.id, groupName: group.name, mode, name: register.name, registerIndex, registerTypeIndex: group.registerTypeIndex || 0, remark: register.remark || '', startAddress: group.startAddressText ? group.startAddressText.replace(/^0x/i, '') : '0000', title: isView ? '寄存器信息' : '寄存器配置', textByteLength: String(register.textByteLength || '32'), showTextLength: !!register.showTextLength, unit: register.unit || '', visible: true, maxValue: register.maxValue || '', minValue: register.minValue || '', addressText: register.addressRangeText || register.addressText || '', displayValue: register.displayValue || '', rawValueText: register.rawValueText || '--', sourceMetaText: register.sourceMetaText || '', showDataType: !!register.showDataType, showRange: !!register.showRange, showUnit: !!register.showUnit, readOnly: isView }) } function getGenericDialogDataTypeState(dialog, dataTypeOptions, dataTypeIndex) { const dataType = getGenericOption(dataTypeOptions, dataTypeIndex) const isTextType = dataType.kind === 'text' const showUnit = dataType.kind === 'number' && dataType.key !== 'hex' return { dataTypeIndex, dataTypeText: dataType.label || '', maxValue: isTextType ? '' : dialog.maxValue, minValue: isTextType ? '' : dialog.minValue, showRange: !isTextType, showTextLength: isTextType, showUnit, textByteLength: isTextType ? (dialog.textByteLength || '32') : dialog.textByteLength, unit: showUnit ? dialog.unit : '' } } function createGenericGroupConfig(dialog) { const registers = Array.isArray(dialog.parsedStructRegisters) ? dialog.parsedStructRegisters : [] return { groupName: dialog.groupName, layout: registers.length ? 'struct' : (dialog.layout || 'register'), quantity: registers.length ? String(registers.length) : dialog.quantity, registerTypeIndex: dialog.registerTypeIndex, startAddress: dialog.startAddress, ...(registers.length ? { registers: registers.map((register) => ({ bitOffset: register.bitOffset, bitWidth: register.bitWidth, byteStart: register.byteStart, dataType: register.dataType, isBitField: !!register.isBitField, isStructField: true, name: register.name, structByteLength: register.structByteLength, textByteLength: register.textByteLength })) } : {}) } } function createGenericRegisterChangedData(dialog, dataTypeOptions) { const dataType = getGenericOption(dataTypeOptions, dialog.dataTypeIndex) const isTextType = dataType.kind === 'text' const showUnit = dataType.kind === 'number' && dataType.key !== 'hex' return { name: dialog.name, dataType: dataType.key, maxValue: isTextType ? '' : dialog.maxValue, minValue: isTextType ? '' : dialog.minValue, remark: dialog.remark, textByteLength: isTextType ? dialog.textByteLength : '', unit: showUnit ? dialog.unit : '' } } function findGenericGroup(groups, groupId) { return (groups || []).find((item) => item.id === groupId) || null } function findGenericRegister(groups, groupId, registerIndex) { const group = findGenericGroup(groups, groupId) const register = group && group.registers ? group.registers[registerIndex] : null return { group, register } } function getActiveGenericGroup(groups, groupId) { return findGenericGroup(groups, groupId) || null } module.exports = { createGenericGroupConfig, createGenericGroupDialogState, createGenericModbusDialogState, createGenericRegisterChangedData, createGenericRegisterDialogState, findGenericGroup, findGenericRegister, getActiveGenericGroup, getGenericDialogDataTypeState, getGenericOption, getPageState, getSettingsPageState, getTransportPageState, getVisiblePageState, resolveActiveParamView }