diff --git a/src/main/java/org/mobidgim/mobidigimproject/service/SettingService.java b/src/main/java/org/mobidgim/mobidigimproject/service/SettingService.java index 9bea2c9..475b0bf 100644 --- a/src/main/java/org/mobidgim/mobidigimproject/service/SettingService.java +++ b/src/main/java/org/mobidgim/mobidigimproject/service/SettingService.java @@ -97,7 +97,7 @@ public class SettingService { if (request.getProtocol() != Protocol.OPC_UA) request.setOPC_UA(null); if (request.getProtocol() != Protocol.MODBUS) request.setMODBUS(null); if (request.getCanInput() != CanInput.ON) request.setCAN(null); - if (!"on".equalsIgnoreCase(request.getOdoMeter())) { + if (!"on".equalsIgnoreCase(request.getOdoOn())) { request.setOdometerSpeed(null); request.setOdometerDir(null); } diff --git a/src/main/resources/static/js/navigation.js b/src/main/resources/static/js/navigation.js index b830fca..e3e9483 100644 --- a/src/main/resources/static/js/navigation.js +++ b/src/main/resources/static/js/navigation.js @@ -19,7 +19,7 @@ export function createNavigation() { const topbarProtocolActions = document.querySelector('.topbar-protocol-actions'); const protocolSelect = byId('reg_protocol'); const canInputSelect = byId('reg_can_input'); - const odometerSelect = byId('OdoMeter'); + const odometerSelect = byId('odo_on'); function showPage(pageName) { Object.values(pages).forEach((page) => { diff --git a/src/main/resources/static/js/protocol/odometer.js b/src/main/resources/static/js/protocol/odometer.js index 00d33c8..d876e56 100644 --- a/src/main/resources/static/js/protocol/odometer.js +++ b/src/main/resources/static/js/protocol/odometer.js @@ -2,14 +2,15 @@ import { byId } from '../utils/dom.js'; function buildRow(target, data = {}) { const safeData = data && typeof data === 'object' ? data : {}; + const sourceValue = safeData.source ?? safeData.odo_speed_source ?? ''; return ` ${target} @@ -39,7 +40,7 @@ export function createOdometerController() { } return { - odo_speed_source: row.querySelector('.odometer-source-input')?.value?.trim() ?? '', + source: row.querySelector('.odometer-source-input')?.value?.trim() ?? '', id: row.querySelector('.odometer-id-input')?.value?.trim() ?? '', shift: row.querySelector('.odometer-shift-input')?.value?.trim() ?? '', expr: row.querySelector('.odometer-expr-input')?.value?.trim() ?? '', diff --git a/src/main/resources/static/js/protocol/protocolData.js b/src/main/resources/static/js/protocol/protocolData.js index 5ec435e..4a35720 100644 --- a/src/main/resources/static/js/protocol/protocolData.js +++ b/src/main/resources/static/js/protocol/protocolData.js @@ -4,7 +4,26 @@ import { byId } from '../utils/dom.js'; export const normProtocol = (value) => String(value ?? '').trim().replace(/[-\s]+/g, '_').toUpperCase(); export const getOpcArr = (data) => data?.OPC_UA ?? data?.['OPC-UA'] ?? []; -const checkboxIds = ['ai0', 'ai1', 'ai2', 'ai3', 'di0', 'di1', 'di2', 'di3']; +function normalizeLegacyOdometerKeys(register) { + if (!register || typeof register !== 'object') { + return register; + } + + if (register.OdoMeter !== undefined && register.odo_on === undefined) { + register.odo_on = register.OdoMeter; + } + + if (register.odo_Meter !== undefined && register.odo_on === undefined) { + register.odo_on = register.odo_Meter; + } + + delete register.OdoMeter; + delete register.odo_Meter; + + return register; +} + +const checkboxIds = ['ai0', 'ai1', 'di0', 'di1']; const toLower = (value) => String(value ?? '').trim().toLowerCase(); const toUpper = (value) => String(value ?? '').trim().toUpperCase(); @@ -31,7 +50,7 @@ function normalizeValueForElement(htmlId, value) { return normProtocol(value); case 'reg_can_input': case 'reg_dr_on_off': - case 'OdoMeter': + case 'odo_on': case 'reg_two_byte_order': return toLower(value); case 'reg_four_byte_order': @@ -46,7 +65,7 @@ function normalizeValueForElement(htmlId, value) { } export function normalizeRegisterForPost(register) { - const normalized = JSON.parse(JSON.stringify(register || {})); + const normalized = normalizeLegacyOdometerKeys(JSON.parse(JSON.stringify(register || {}))); const toUpperSnake = (value) => String(value ?? '').trim().toUpperCase().replace(/[-\s]+/g, '_'); if (normalized.protocol) { @@ -57,12 +76,8 @@ export function normalizeRegisterForPost(register) { normalized.can_input = String(normalized.can_input).trim().toUpperCase(); } - if (normalized.OdoMeter) { - normalized.OdoMeter = String(normalized.OdoMeter).trim().toLowerCase(); - } - - if (normalized.odo_Meter) { - normalized.odo_Meter = String(normalized.odo_Meter).trim().toLowerCase(); + if (normalized.odo_on) { + normalized.odo_on = String(normalized.odo_on).trim().toLowerCase(); } if (normalized.MEID !== undefined && normalized.MEID !== null) { @@ -100,7 +115,7 @@ export function createProtocolDataController({ const protocolSelect = byId('reg_protocol'); const canInputSelect = byId('reg_can_input'); const drOnOffSelect = byId('reg_dr_on_off'); - const odometerSelect = byId('OdoMeter'); + const odometerSelect = byId('odo_on'); function syncProtocolMenus() { navigation.toggleProtocolMenus(protocolSelect?.value, canInputSelect?.value, odometerSelect?.value); @@ -137,7 +152,7 @@ export function createProtocolDataController({ } function collectProtocolData() { - const register = getLastLoadedRegisterData(); + const register = normalizeLegacyOdometerKeys(getLastLoadedRegisterData()); Object.entries(REGISTER_ID_MAP).forEach(([htmlId, dtoKey]) => { const element = byId(htmlId); @@ -160,10 +175,10 @@ export function createProtocolDataController({ const odometerData = odometerController.collectData(); if (toLower(register.dr_on) !== 'on') { - register.odo_Meter = 'off'; + register.odo_on = 'off'; register.odo_speed = null; register.odo_direction = null; - } else if (String(register.odo_Meter ?? '').toLowerCase() === 'on') { + } else if (String((register.odo_on ?? register.odo_Meter) ?? '').toLowerCase() === 'on') { register.odo_speed = odometerData.odo_speed; register.odo_direction = odometerData.odo_direction; } else { @@ -171,6 +186,7 @@ export function createProtocolDataController({ register.odo_direction = null; } + normalizeLegacyOdometerKeys(register); return register; } @@ -179,7 +195,9 @@ export function createProtocolDataController({ return; } - setLastLoadedRegisterData(register); + const normalizedRegister = normalizeLegacyOdometerKeys({ ...register }); + + setLastLoadedRegisterData(normalizedRegister); Object.entries(REGISTER_ID_MAP).forEach(([htmlId, dtoKey]) => { const element = byId(htmlId); @@ -187,8 +205,8 @@ export function createProtocolDataController({ return; } - if (Object.prototype.hasOwnProperty.call(register, dtoKey)) { - const value = register[dtoKey]; + if (Object.prototype.hasOwnProperty.call(normalizedRegister, dtoKey)) { + const value = normalizedRegister[dtoKey]; if (element.type === 'checkbox') { element.checked = value === '1' || value === true; } else { @@ -207,22 +225,22 @@ export function createProtocolDataController({ checkboxIds.forEach((id) => { const checkbox = byId(id); if (checkbox) { - checkbox.checked = register[id] === '1' || register[id] === true; + checkbox.checked = normalizedRegister[id] === '1' || normalizedRegister[id] === true; } }); - if (register.protocol && protocolSelect) { - const protocol = normProtocol(register.protocol); + if (normalizedRegister.protocol && protocolSelect) { + const protocol = normProtocol(normalizedRegister.protocol); protocolSelect.value = protocol; - setLastLoadedRegisterData({ ...register, protocol }); + setLastLoadedRegisterData({ ...normalizedRegister, protocol }); } - modbusController.renderRows(Array.isArray(register.MODBUS) ? register.MODBUS : []); - opcUaController.renderRows(Array.isArray(getOpcArr(register)) ? getOpcArr(register) : []); - canController.renderRows(Array.isArray(register.CAN) ? register.CAN : []); + modbusController.renderRows(Array.isArray(normalizedRegister.MODBUS) ? normalizedRegister.MODBUS : []); + opcUaController.renderRows(Array.isArray(getOpcArr(normalizedRegister)) ? getOpcArr(normalizedRegister) : []); + canController.renderRows(Array.isArray(normalizedRegister.CAN) ? normalizedRegister.CAN : []); odometerController.renderRows({ - odo_speed: register.odo_speed ?? null, - odo_direction: register.odo_direction ?? null, + odo_speed: normalizedRegister.odo_speed ?? null, + odo_direction: normalizedRegister.odo_direction ?? null, }); syncOdometerAvailability(); syncProtocolMenusDeferred(); diff --git a/src/main/resources/static/js/protocol/protocolValidation.js b/src/main/resources/static/js/protocol/protocolValidation.js index 8577ebf..e7bb0b5 100644 --- a/src/main/resources/static/js/protocol/protocolValidation.js +++ b/src/main/resources/static/js/protocol/protocolValidation.js @@ -30,7 +30,7 @@ export function getRegisterConfigValidationError(data) { } if (String(data.dr_on ?? '').toLowerCase() !== 'on' && String(data.odo_on ?? '').toLowerCase() === 'on') { - return "'odo_Meter' cannot be on when 'dr_on' is off."; + return "'odo_on' cannot be on when 'dr_on' is off."; } if (data.protocol === 'MODBUS') { @@ -82,13 +82,13 @@ export function getRegisterConfigValidationError(data) { const direction = data.odo_direction; for (const [label, item] of [['odo_speed', speed], ['odo_direction', direction]]) { - if (!hasAnyValue(item, ['odo_speed_source', 'id', 'shift', 'expr', 'mask'])) { + if (!hasAnyValue(item, ['source', 'odo_speed_source', 'id', 'shift', 'expr', 'mask'])) { continue; } - const source = String(item?.odo_speed_source ?? '').trim().toLowerCase(); + const source = String(item?.source ?? item?.odo_speed_source ?? '').trim().toLowerCase(); if (!source) { - return `${label} missing 'odo_speed_source'.`; + return `${label} missing 'source'.`; } if (source === 'can') {