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') {