|
|
|
|
import { loadDeviceConfig, loadProtocolConfig, saveDeviceConfig, saveProtocolConfig } from './api.js';
|
|
|
|
|
import { createNavigation } from './navigation.js';
|
|
|
|
|
import { createDeviceDataController } from './device/deviceData.js';
|
|
|
|
|
import { bindDeviceFileActions, bindProtocolFileActions } from './device/deviceFile.js';
|
|
|
|
|
import { createSsidController } from './device/ssid.js';
|
|
|
|
|
import { createCanController } from './protocol/can.js';
|
|
|
|
|
import { createModbusController } from './protocol/modbus.js';
|
|
|
|
|
import { createOdometerController } from './protocol/odometer.js';
|
|
|
|
|
import { createOpcUaController } from './protocol/opcua.js';
|
|
|
|
|
import { createProtocolDataController } from './protocol/protocolData.js';
|
|
|
|
|
import { getRegisterConfigValidationError, isValidRegisterConfig } from './protocol/protocolValidation.js';
|
|
|
|
|
import { byId, queryAll } from './utils/dom.js';
|
|
|
|
|
|
|
|
|
|
async function initializeApp() {
|
|
|
|
|
const navigation = createNavigation();
|
|
|
|
|
const ssidController = createSsidController({
|
|
|
|
|
listElement: byId('ssid-list'),
|
|
|
|
|
templateElement: byId('ssid-template'),
|
|
|
|
|
addButton: byId('add-ssid'),
|
|
|
|
|
countryCodeInput: byId('wifi_country_code'),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const deviceController = createDeviceDataController({ ssidController });
|
|
|
|
|
const protocolController = createProtocolDataController({
|
|
|
|
|
navigation,
|
|
|
|
|
modbusController: createModbusController(),
|
|
|
|
|
opcUaController: createOpcUaController(),
|
|
|
|
|
canController: createCanController(),
|
|
|
|
|
odometerController: createOdometerController(),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
navigation.initialize();
|
|
|
|
|
ssidController.bindEvents();
|
|
|
|
|
deviceController.initialize();
|
|
|
|
|
protocolController.initialize();
|
|
|
|
|
|
|
|
|
|
bindDeviceFileActions({
|
|
|
|
|
onLoadLocal: (data) => deviceController.loadFromData(data),
|
|
|
|
|
getDownloadData: () => deviceController.collectDeviceData(),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
bindProtocolFileActions({
|
|
|
|
|
onLoadLocal: (data) => {
|
|
|
|
|
const validationError = getRegisterConfigValidationError(data);
|
|
|
|
|
if (validationError) {
|
|
|
|
|
alert(`The contents of the selected file are not valid.\n${validationError}`);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protocolController.loadFromRegisterJson(data);
|
|
|
|
|
},
|
|
|
|
|
getDownloadData: () => protocolController.collectProtocolData(),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
queryAll('.save-file').forEach((button) => {
|
|
|
|
|
button.addEventListener('click', async () => {
|
|
|
|
|
const devicePayload = deviceController.collectDeviceData();
|
|
|
|
|
const protocolPayload = protocolController.normalizeRegisterForPost(
|
|
|
|
|
protocolController.collectProtocolData(),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const validationError = getRegisterConfigValidationError(protocolPayload);
|
|
|
|
|
if (validationError) {
|
|
|
|
|
alert(`Register settings are currently invalid.\n${validationError}`);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const [deviceResponse, protocolResponse] = await Promise.all([
|
|
|
|
|
saveDeviceConfig(devicePayload),
|
|
|
|
|
saveProtocolConfig(protocolPayload),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const isDeviceSaved = deviceResponse.ok && deviceResponse.data?.success === true;
|
|
|
|
|
const isProtocolSaved = protocolResponse.ok && protocolResponse.data?.success === true;
|
|
|
|
|
|
|
|
|
|
if (isDeviceSaved && isProtocolSaved) {
|
|
|
|
|
alert('saved successfully');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const failureMessages = [
|
|
|
|
|
!isDeviceSaved ? (deviceResponse.data?.message || `Device save failed (${deviceResponse.status})`) : null,
|
|
|
|
|
!isProtocolSaved ? (protocolResponse.data?.message || `Protocol save failed (${protocolResponse.status})`) : null,
|
|
|
|
|
].filter(Boolean);
|
|
|
|
|
|
|
|
|
|
alert(failureMessages.join('\n') || 'save failure');
|
|
|
|
|
console.error('device response:', deviceResponse, 'protocol response:', protocolResponse);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Error during transfer:', error);
|
|
|
|
|
alert('save failure');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const deviceData = await loadDeviceConfig();
|
|
|
|
|
if (deviceData) {
|
|
|
|
|
deviceController.loadFromData(deviceData);
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Device load failed:', error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const protocolData = await loadProtocolConfig();
|
|
|
|
|
if (protocolData) {
|
|
|
|
|
protocolController.loadFromRegisterJson(protocolData);
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Protocol load failed:', error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', initializeApp);
|