Browse Source

odometer 프로토콜 필드 처리 수정

v2
최원형 3 months ago
parent
commit
ac3e7f2e76
  1. 2
      src/main/java/org/mobidgim/mobidigimproject/service/SettingService.java
  2. 2
      src/main/resources/static/js/navigation.js
  3. 7
      src/main/resources/static/js/protocol/odometer.js
  4. 68
      src/main/resources/static/js/protocol/protocolData.js
  5. 8
      src/main/resources/static/js/protocol/protocolValidation.js

2
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.OPC_UA) request.setOPC_UA(null);
if (request.getProtocol() != Protocol.MODBUS) request.setMODBUS(null); if (request.getProtocol() != Protocol.MODBUS) request.setMODBUS(null);
if (request.getCanInput() != CanInput.ON) request.setCAN(null); if (request.getCanInput() != CanInput.ON) request.setCAN(null);
if (!"on".equalsIgnoreCase(request.getOdoMeter())) { if (!"on".equalsIgnoreCase(request.getOdoOn())) {
request.setOdometerSpeed(null); request.setOdometerSpeed(null);
request.setOdometerDir(null); request.setOdometerDir(null);
} }

2
src/main/resources/static/js/navigation.js

@ -19,7 +19,7 @@ export function createNavigation() {
const topbarProtocolActions = document.querySelector('.topbar-protocol-actions'); const topbarProtocolActions = document.querySelector('.topbar-protocol-actions');
const protocolSelect = byId('reg_protocol'); const protocolSelect = byId('reg_protocol');
const canInputSelect = byId('reg_can_input'); const canInputSelect = byId('reg_can_input');
const odometerSelect = byId('OdoMeter'); const odometerSelect = byId('odo_on');
function showPage(pageName) { function showPage(pageName) {
Object.values(pages).forEach((page) => { Object.values(pages).forEach((page) => {

7
src/main/resources/static/js/protocol/odometer.js

@ -2,14 +2,15 @@ import { byId } from '../utils/dom.js';
function buildRow(target, data = {}) { function buildRow(target, data = {}) {
const safeData = data && typeof data === 'object' ? data : {}; const safeData = data && typeof data === 'object' ? data : {};
const sourceValue = safeData.source ?? safeData.odo_speed_source ?? '';
return ` return `
<tr class="odometer-row" data-target="${target}"> <tr class="odometer-row" data-target="${target}">
<td>${target}</td> <td>${target}</td>
<td> <td>
<select class="odometer-source-input"> <select class="odometer-source-input">
<option value="can" ${safeData.odo_speed_source === 'can' ? 'selected' : ''}>can</option> <option value="can" ${sourceValue === 'can' ? 'selected' : ''}>can</option>
<option value="hw" ${safeData.odo_speed_source === 'hw' ? 'selected' : ''}>hw</option> <option value="hw" ${sourceValue === 'hw' ? 'selected' : ''}>hw</option>
</select> </select>
</td> </td>
<td><input class="odometer-id-input" value="${safeData.id ?? ''}"></td> <td><input class="odometer-id-input" value="${safeData.id ?? ''}"></td>
@ -39,7 +40,7 @@ export function createOdometerController() {
} }
return { 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() ?? '', id: row.querySelector('.odometer-id-input')?.value?.trim() ?? '',
shift: row.querySelector('.odometer-shift-input')?.value?.trim() ?? '', shift: row.querySelector('.odometer-shift-input')?.value?.trim() ?? '',
expr: row.querySelector('.odometer-expr-input')?.value?.trim() ?? '', expr: row.querySelector('.odometer-expr-input')?.value?.trim() ?? '',

68
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 normProtocol = (value) => String(value ?? '').trim().replace(/[-\s]+/g, '_').toUpperCase();
export const getOpcArr = (data) => data?.OPC_UA ?? data?.['OPC-UA'] ?? []; 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 toLower = (value) => String(value ?? '').trim().toLowerCase();
const toUpper = (value) => String(value ?? '').trim().toUpperCase(); const toUpper = (value) => String(value ?? '').trim().toUpperCase();
@ -31,7 +50,7 @@ function normalizeValueForElement(htmlId, value) {
return normProtocol(value); return normProtocol(value);
case 'reg_can_input': case 'reg_can_input':
case 'reg_dr_on_off': case 'reg_dr_on_off':
case 'OdoMeter': case 'odo_on':
case 'reg_two_byte_order': case 'reg_two_byte_order':
return toLower(value); return toLower(value);
case 'reg_four_byte_order': case 'reg_four_byte_order':
@ -46,7 +65,7 @@ function normalizeValueForElement(htmlId, value) {
} }
export function normalizeRegisterForPost(register) { 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, '_'); const toUpperSnake = (value) => String(value ?? '').trim().toUpperCase().replace(/[-\s]+/g, '_');
if (normalized.protocol) { if (normalized.protocol) {
@ -57,12 +76,8 @@ export function normalizeRegisterForPost(register) {
normalized.can_input = String(normalized.can_input).trim().toUpperCase(); normalized.can_input = String(normalized.can_input).trim().toUpperCase();
} }
if (normalized.OdoMeter) { if (normalized.odo_on) {
normalized.OdoMeter = String(normalized.OdoMeter).trim().toLowerCase(); normalized.odo_on = String(normalized.odo_on).trim().toLowerCase();
}
if (normalized.odo_Meter) {
normalized.odo_Meter = String(normalized.odo_Meter).trim().toLowerCase();
} }
if (normalized.MEID !== undefined && normalized.MEID !== null) { if (normalized.MEID !== undefined && normalized.MEID !== null) {
@ -100,7 +115,7 @@ export function createProtocolDataController({
const protocolSelect = byId('reg_protocol'); const protocolSelect = byId('reg_protocol');
const canInputSelect = byId('reg_can_input'); const canInputSelect = byId('reg_can_input');
const drOnOffSelect = byId('reg_dr_on_off'); const drOnOffSelect = byId('reg_dr_on_off');
const odometerSelect = byId('OdoMeter'); const odometerSelect = byId('odo_on');
function syncProtocolMenus() { function syncProtocolMenus() {
navigation.toggleProtocolMenus(protocolSelect?.value, canInputSelect?.value, odometerSelect?.value); navigation.toggleProtocolMenus(protocolSelect?.value, canInputSelect?.value, odometerSelect?.value);
@ -137,7 +152,7 @@ export function createProtocolDataController({
} }
function collectProtocolData() { function collectProtocolData() {
const register = getLastLoadedRegisterData(); const register = normalizeLegacyOdometerKeys(getLastLoadedRegisterData());
Object.entries(REGISTER_ID_MAP).forEach(([htmlId, dtoKey]) => { Object.entries(REGISTER_ID_MAP).forEach(([htmlId, dtoKey]) => {
const element = byId(htmlId); const element = byId(htmlId);
@ -160,10 +175,10 @@ export function createProtocolDataController({
const odometerData = odometerController.collectData(); const odometerData = odometerController.collectData();
if (toLower(register.dr_on) !== 'on') { if (toLower(register.dr_on) !== 'on') {
register.odo_Meter = 'off'; register.odo_on = 'off';
register.odo_speed = null; register.odo_speed = null;
register.odo_direction = 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_speed = odometerData.odo_speed;
register.odo_direction = odometerData.odo_direction; register.odo_direction = odometerData.odo_direction;
} else { } else {
@ -171,6 +186,7 @@ export function createProtocolDataController({
register.odo_direction = null; register.odo_direction = null;
} }
normalizeLegacyOdometerKeys(register);
return register; return register;
} }
@ -179,7 +195,9 @@ export function createProtocolDataController({
return; return;
} }
setLastLoadedRegisterData(register); const normalizedRegister = normalizeLegacyOdometerKeys({ ...register });
setLastLoadedRegisterData(normalizedRegister);
Object.entries(REGISTER_ID_MAP).forEach(([htmlId, dtoKey]) => { Object.entries(REGISTER_ID_MAP).forEach(([htmlId, dtoKey]) => {
const element = byId(htmlId); const element = byId(htmlId);
@ -187,8 +205,8 @@ export function createProtocolDataController({
return; return;
} }
if (Object.prototype.hasOwnProperty.call(register, dtoKey)) { if (Object.prototype.hasOwnProperty.call(normalizedRegister, dtoKey)) {
const value = register[dtoKey]; const value = normalizedRegister[dtoKey];
if (element.type === 'checkbox') { if (element.type === 'checkbox') {
element.checked = value === '1' || value === true; element.checked = value === '1' || value === true;
} else { } else {
@ -207,22 +225,22 @@ export function createProtocolDataController({
checkboxIds.forEach((id) => { checkboxIds.forEach((id) => {
const checkbox = byId(id); const checkbox = byId(id);
if (checkbox) { if (checkbox) {
checkbox.checked = register[id] === '1' || register[id] === true; checkbox.checked = normalizedRegister[id] === '1' || normalizedRegister[id] === true;
} }
}); });
if (register.protocol && protocolSelect) { if (normalizedRegister.protocol && protocolSelect) {
const protocol = normProtocol(register.protocol); const protocol = normProtocol(normalizedRegister.protocol);
protocolSelect.value = protocol; protocolSelect.value = protocol;
setLastLoadedRegisterData({ ...register, protocol }); setLastLoadedRegisterData({ ...normalizedRegister, protocol });
} }
modbusController.renderRows(Array.isArray(register.MODBUS) ? register.MODBUS : []); modbusController.renderRows(Array.isArray(normalizedRegister.MODBUS) ? normalizedRegister.MODBUS : []);
opcUaController.renderRows(Array.isArray(getOpcArr(register)) ? getOpcArr(register) : []); opcUaController.renderRows(Array.isArray(getOpcArr(normalizedRegister)) ? getOpcArr(normalizedRegister) : []);
canController.renderRows(Array.isArray(register.CAN) ? register.CAN : []); canController.renderRows(Array.isArray(normalizedRegister.CAN) ? normalizedRegister.CAN : []);
odometerController.renderRows({ odometerController.renderRows({
odo_speed: register.odo_speed ?? null, odo_speed: normalizedRegister.odo_speed ?? null,
odo_direction: register.odo_direction ?? null, odo_direction: normalizedRegister.odo_direction ?? null,
}); });
syncOdometerAvailability(); syncOdometerAvailability();
syncProtocolMenusDeferred(); syncProtocolMenusDeferred();

8
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') { 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') { if (data.protocol === 'MODBUS') {
@ -82,13 +82,13 @@ export function getRegisterConfigValidationError(data) {
const direction = data.odo_direction; const direction = data.odo_direction;
for (const [label, item] of [['odo_speed', speed], ['odo_direction', 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; continue;
} }
const source = String(item?.odo_speed_source ?? '').trim().toLowerCase(); const source = String(item?.source ?? item?.odo_speed_source ?? '').trim().toLowerCase();
if (!source) { if (!source) {
return `${label} missing 'odo_speed_source'.`; return `${label} missing 'source'.`;
} }
if (source === 'can') { if (source === 'can') {

Loading…
Cancel
Save