You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
4.6 KiB

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);