From 736de8f24fc9539120fc43d5c3e59bc3b6c33fb2 Mon Sep 17 00:00:00 2001 From: Roy Gollub Date: Wed, 14 Aug 2024 13:35:17 +0200 Subject: [PATCH 1/7] # Release 2.2.0 ## New features - Provide version of module via 'OnNewStatusModuleVersion' - Function 'getParameters' to provide PersistentData parameters - Check if features of module can be used on device and provide this via 'OnNewStatusModuleIsActive' event / 'getStatusModuleActive' function ## Improvements - New UI design available (e.g. selectable via CSK_Module_PersistentData v4.1.0 or higher), see 'OnNewStatusCSKStyle' - 'loadParameters' returns its success - 'sendParameters' can control if sent data should be saved directly by CSK_Module_PersistentData - Added browser tab information --- CHANGELOG.md | 12 + .../UI_sample.png | Bin 0 -> 31095 bytes .../CSK_Module_DeviceNetworkConfig.css | 54 +- .../CSK_Module_DeviceNetworkConfig.html | 673 ++++++++++-------- .../pages/src/converter.ts | 61 ++ .../pages/src/index.ts | 4 + CSK_Module_DeviceNetworkConfig/project.mf.xml | 37 +- .../CSK_Module_DeviceNetworkConfig.lua | 13 +- .../DeviceNetworkConfig_Controller.lua | 99 ++- .../DeviceNetworkConfig_Model.lua | 12 +- .../DeviceNetworkConfig/helper/checkAPIs.lua | 47 ++ README.md | 14 +- docu/CSK_Module_DeviceNetworkConfig.html | 538 +++++++++++--- docu/media/UI_Screenshot.png | Bin 53355 -> 73681 bytes docu/media/src/UI_sample.pptx | Bin 0 -> 101612 bytes 15 files changed, 1109 insertions(+), 455 deletions(-) create mode 100644 CSK_Module_DeviceNetworkConfig/pages/assets/CSK_Module_DeviceNetworkConfig/UI_sample.png create mode 100644 CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/helper/checkAPIs.lua create mode 100644 docu/media/src/UI_sample.pptx diff --git a/CHANGELOG.md b/CHANGELOG.md index cd42d41..36c4730 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ # Changelog All notable changes to this project will be documented in this file. +## Release 2.2.0 + +### New features +- Provide version of module via 'OnNewStatusModuleVersion' +- Function 'getParameters' to provide PersistentData parameters +- Check if features of module can be used on device and provide this via 'OnNewStatusModuleIsActive' event / 'getStatusModuleActive' function + +### Improvements +- New UI design available (e.g. selectable via CSK_Module_PersistentData v4.1.0 or higher), see 'OnNewStatusCSKStyle' +- 'loadParameters' returns its success +- 'sendParameters' can control if sent data should be saved directly by CSK_Module_PersistentData +- Added browser tab information ## Release 2.1.0 diff --git a/CSK_Module_DeviceNetworkConfig/pages/assets/CSK_Module_DeviceNetworkConfig/UI_sample.png b/CSK_Module_DeviceNetworkConfig/pages/assets/CSK_Module_DeviceNetworkConfig/UI_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..08022d514151399332676b05f6af9ee2ace0ba07 GIT binary patch literal 31095 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 C2zvqm literal 0 HcmV?d00001 diff --git a/CSK_Module_DeviceNetworkConfig/pages/pages/CSK_Module_DeviceNetworkConfig/CSK_Module_DeviceNetworkConfig.css b/CSK_Module_DeviceNetworkConfig/pages/pages/CSK_Module_DeviceNetworkConfig/CSK_Module_DeviceNetworkConfig.css index eadc5e2..d2060d1 100644 --- a/CSK_Module_DeviceNetworkConfig/pages/pages/CSK_Module_DeviceNetworkConfig/CSK_Module_DeviceNetworkConfig.css +++ b/CSK_Module_DeviceNetworkConfig/pages/pages/CSK_Module_DeviceNetworkConfig/CSK_Module_DeviceNetworkConfig.css @@ -1,10 +1,56 @@ +.myCustomMinWidth_CSK_Module_DeviceNetworkConfig { + min-width: 60px; +} + +.myCustomSpacerVert10_CSK_Module_DeviceNetworkConfig { + min-height: 10px; +} + +.myCustomSpacerVert20_CSK_Module_DeviceNetworkConfig { + min-height: 20px; +} + +.myCustomFrameNoColor_CSK_Module_DeviceNetworkConfig { + margin: 6px; + border-radius: 10px; + border-style: solid; + border-width: 0px; + border-color: 007CC1; + background-color: white; +} + .myCustomFrame_CSK_Module_DeviceNetworkConfig { + margin: 6px; + border-radius: 10px; border-style: solid; border-width: 1px; - border-color: grey; - margin: 6px; + border-color: #007CC1; + background-color: white; } -.myCustomMinWidth_CSK_Module_DeviceNetworkConfig { - min-width: 60px; +.myCustomLabel_CSK_Module_DeviceNetworkConfig { + font-size:30px; + color: grey; + margin-top: 10px; +} + +.myCustomFrameLabel_CSK_Module_DeviceNetworkConfig { + background: white; + position:relative; + top: calc(-1.2rem); + left: calc(1rem); + font-size: medium; +} + +.myCustomBorderBottom_CSK_Module_DeviceNetworkConfig { + border-bottom: 1px solid lightgray; + margin-inline: calc(1rem); +} + +.myCustomBackground_CSK_Module_DeviceNetworkConfig { +} + +.myCustomButton_CSK_Module_DeviceNetworkConfig { + border-radius: 30px; + padding-right: 0px; } diff --git a/CSK_Module_DeviceNetworkConfig/pages/pages/CSK_Module_DeviceNetworkConfig/CSK_Module_DeviceNetworkConfig.html b/CSK_Module_DeviceNetworkConfig/pages/pages/CSK_Module_DeviceNetworkConfig/CSK_Module_DeviceNetworkConfig.html index 871f7a7..7bbb005 100644 --- a/CSK_Module_DeviceNetworkConfig/pages/pages/CSK_Module_DeviceNetworkConfig/CSK_Module_DeviceNetworkConfig.html +++ b/CSK_Module_DeviceNetworkConfig/pages/pages/CSK_Module_DeviceNetworkConfig/CSK_Module_DeviceNetworkConfig.html @@ -1,288 +1,387 @@ - - - - - - - - - - Applied network configuration will be saved persistently. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Applied network configuration will be saved persistently. + + + + + + ... Currently processing ... + + + + + + + New config accepted + + + + + New config NOT accepted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To delete a nameserver, please select a DNS entry from the list and press 'Remove'. +
+ A maximum of three nameserves can be added. Nameservers that are added automatically via DHCP cannot be deleted. +
+ Please note that the DNS entries can only be persistent, if the app 'CSK_Module_PersistentData' is loaded. +
+ Nameservers that are added automatically via DHCP cannot be deleted. +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + + Please login with at least user level 'Maintenance' or higher to see this page. - -
- - - - ... Currently processing ... - - - - - - - New config accepted - - - - - New config NOT accepted - - - - - - Refresh - - - -

Interface settings

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Apply new network configuration - - - - - -

DNS settings

-

To delete a nameserver, please select a DNS entry from the list and press "Remove".
- A maximum of three nameserves can be added.
- Nameservers that are added automatically via DHCP cannot be deleted.

- Please note that the DNS entries can only be persisted, if the app "CSK_Module_PersistentData" is loaded.

- - - - - - - - - - - - - - Add - - - - - - - - - - - - - - - - - - - Remove - - - - - - - - - -

Tools

- - - - - - - PING - - - - - - - - - - - - - -
-
-
- - - - - Please login with at least user level 'Maintenance' or higher to see this page. - - - - - - -
- - - - -
- -
+ + + + + + + + + + + + Module is not supported on this device... + + UI sample + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSK_Module_DeviceNetworkConfig/pages/src/converter.ts b/CSK_Module_DeviceNetworkConfig/pages/src/converter.ts index 51af689..14b9619 100644 --- a/CSK_Module_DeviceNetworkConfig/pages/src/converter.ts +++ b/CSK_Module_DeviceNetworkConfig/pages/src/converter.ts @@ -15,4 +15,65 @@ export function InvalidUpstreamIPv4Display(inState) { } return null +} + +export function changeStyle(theme) { + const style: HTMLStyleElement = document.createElement('style'); + style.id ='blub' + if (theme == 'CSK_Style'){ + var headerToolbar = `.sopasjs-ui-header-toolbar-wrapper { background-color: #FFFFFF; }` + var uiHeader = `.sopasjs-ui-header>.app-logo { margin-right:0px; }` + var appLogo = `.app-logo { background-color:#FFFFFF; background-image: url(data:image/png;base64,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) }` + var uiNavbar =`.sopasjs-ui-navbar-wrapper { background-color: #737F85; }` + var navbarMenuLiActive = `.sopasjs-navbar-menu>li.active { background-color: #283c45; }` + var navbarMenuLiActiveA = `.sopasjs-navbar-menu>li.active>a { background-color: #283c45; }` + var navbarMeluLi = `.sopasjs-navbar-menu>li { color: #FFFFFF; }` + var navbarMeluLiA = `.sopasjs-navbar-menu>li>a { color: #FFFFFF; }` + var headerToolbarButtonHighlight = `.sopasjs-ui-header-toolbar-button.sopasjs-ui-navigation-navbutton>a.highlight { background-color: #737F85; }` + var toolbarButton = `.sopasjs-ui-header-toolbar-button>a { color: #283c45; }` + + var customBackground = `.CSK_Module_DeviceNetworkConfig .myCustomBackground_CSK_Module_DeviceNetworkConfig { background-color: #737F8522; }` // font-family: "Open Sans"; }` + + style.innerHTML = headerToolbar; + style.innerHTML += uiHeader; + style.innerHTML += appLogo; + style.innerHTML += uiNavbar; + style.innerHTML += navbarMenuLiActive; + style.innerHTML += navbarMenuLiActiveA; + style.innerHTML += navbarMeluLi; + style.innerHTML += navbarMeluLiA; + style.innerHTML += headerToolbarButtonHighlight; + style.innerHTML += toolbarButton; + + style.innerHTML += customBackground; + } + else if (theme == 'None'){ + var headerToolbar = `.sopasjs-ui-header-toolbar-wrapper { background-color: #007fc3; }` + var uiHeader = `.sopasjs-ui-header>.app-logo { margin-right:10px; }` + var appLogo = `.app-logo { background-color:#007fc3; background-image: url('data:image/png;base64,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') }` + var uiNavbar =`.sopasjs-ui-navbar-wrapper { background-color: #f6f8f9; }` + var navbarMenuLiActive = `.sopasjs-navbar-menu>li.active { background-color: #007fc3; }` + var navbarMenuLiActiveA = `.sopasjs-navbar-menu>li.active>a { background-color: #007fc3; }` + var navbarMeluLi = `.sopasjs-navbar-menu>li { color: #697987; }` + var navbarMeluLiA = `.sopasjs-navbar-menu>li>a { color: #505f6b; }` + var headerToolbarButtonHighlight = `.sopasjs-ui-header-toolbar-button.sopasjs-ui-navigation-navbutton>a.highlight { background-color: #006093; }` + var toolbarButton = `.sopasjs-ui-header-toolbar-button>a { color: #cce5f3; }` + + var customBackground = `.CSK_Module_DeviceNetworkConfig .myCustomBackground_CSK_Module_DeviceNetworkConfig { background-color: #fff; }` // font-family: "sans-serif"; }` + + style.innerHTML = headerToolbar; + style.innerHTML += uiHeader; + style.innerHTML += appLogo; + style.innerHTML += uiNavbar; + style.innerHTML += navbarMenuLiActive; + style.innerHTML += navbarMenuLiActiveA; + style.innerHTML += navbarMeluLi; + style.innerHTML += navbarMeluLiA; + style.innerHTML += headerToolbarButtonHighlight; + style.innerHTML += toolbarButton; + + style.innerHTML += customBackground; + } + document.head.append(style); + return theme } \ No newline at end of file diff --git a/CSK_Module_DeviceNetworkConfig/pages/src/index.ts b/CSK_Module_DeviceNetworkConfig/pages/src/index.ts index 9f71c59..9f529cb 100644 --- a/CSK_Module_DeviceNetworkConfig/pages/src/index.ts +++ b/CSK_Module_DeviceNetworkConfig/pages/src/index.ts @@ -9,4 +9,8 @@ document.addEventListener('sopasjs-ready', () => { const page_1 = document.querySelector('div.sopasjs-ui-navbar-wrapper > div > ul > li:nth-child(3) > a > i'); page_1.classList.remove('fa-file'); page_1.classList.add('fa-wrench'); + + setTimeout(() => { + document.title = 'CSK_Module_DeviceNetworkConfig' + }, 500); }) \ No newline at end of file diff --git a/CSK_Module_DeviceNetworkConfig/project.mf.xml b/CSK_Module_DeviceNetworkConfig/project.mf.xml index 6b0040e..47d3d31 100644 --- a/CSK_Module_DeviceNetworkConfig/project.mf.xml +++ b/CSK_Module_DeviceNetworkConfig/project.mf.xml @@ -120,6 +120,18 @@ See following descriptions of events/functions regarding further information. Highlights the DNS 'IP' in UI if format of IP is not correct. + + Notify UI style to use for CSK modules. + + + + Notify version of module. + + + + Notify if module can be used on device. + + Function to register "OnResume" of the module UI (only as helper function). @@ -191,25 +203,36 @@ See following descriptions of events/functions regarding further information. Function to set the name of the parameters if saved/loaded via the CSK_PersistentData module. - - Send parameters to CSK_PersistentData module if possible to save them. + + Configure if this module should load its saved parameters at app/device boot up. + Load parameters for this module from the CSK_PersistentData module if possible and use them. + - - Configure if this module should load its saved parameters at app/device boot up. - + + released + Function to get all parameters of the client in JSON format. + + + + Send parameters to CSK_PersistentData module if possible to save them. + + + + Function to get status if module is active. + SICK AG - 2.1.0 + 2.2.0 low false false false - true + false diff --git a/CSK_Module_DeviceNetworkConfig/scripts/CSK_Module_DeviceNetworkConfig.lua b/CSK_Module_DeviceNetworkConfig/scripts/CSK_Module_DeviceNetworkConfig.lua index 4fff678..6d2ac51 100644 --- a/CSK_Module_DeviceNetworkConfig/scripts/CSK_Module_DeviceNetworkConfig.lua +++ b/CSK_Module_DeviceNetworkConfig/scripts/CSK_Module_DeviceNetworkConfig.lua @@ -26,6 +26,12 @@ --**********************Start Global Scope ********************************* --************************************************************************** ----------------------------------------------------------- +-- If app property "LuaLoadAllEngineAPI" is FALSE, use this to load and check for required APIs +-- This can improve performance of garbage collection +_G.availableAPIs = require('Configuration.DeviceNetworkConfig.helper.checkAPIs') -- can be used to adjust function scope of the module related on available APIs of the device +----------------------------------------------------------- +--************************************************************************** +----------------------------------------------------------- -- Logger _G.logger = Log.SharedLogger.create('ModuleLogger') _G.logHandle = Log.Handler.create() @@ -39,12 +45,17 @@ _G.logHandle:applyConfig() -- Check this script regarding DeviceNetworkConfig_Model parameters and functions _G.deviceNetworkConfig_Model = require('Configuration/DeviceNetworkConfig/DeviceNetworkConfig_Model') +if _G.availableAPIs.default == false or _G.availableAPIs.specific == false then + _G.logger:warning("CSK_DeviceNetworkConfig: Relevant CROWN(s) not available on device. Module is not supported...") +else + _G.deviceNetworkConfig_Model.refreshInterfaces() +end + --************************************************************************** --**********************End Global Scope *********************************** --************************************************************************** --**********************Start Function Scope ******************************* --************************************************************************** -_G.deviceNetworkConfig_Model.refreshInterfaces() --- Function to react on startup event of the app local function main() diff --git a/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/DeviceNetworkConfig_Controller.lua b/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/DeviceNetworkConfig_Controller.lua index c2e49a5..02d1c13 100644 --- a/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/DeviceNetworkConfig_Controller.lua +++ b/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/DeviceNetworkConfig_Controller.lua @@ -8,7 +8,7 @@ --************************************************************************** --************************ Start Global Scope ****************************** --************************************************************************** -local NAME_OF_MODULE = 'CSK_DeviceNetworkConfig' +local nameOfModule = 'CSK_DeviceNetworkConfig' -- Timer to update UI via events after page was loaded local tmrDeviceNetworkConfig = Timer.create() @@ -31,6 +31,11 @@ local jsonInterfaceListContent -- available interfaces as JSON local deviceNetworkConfig_Model -- ************************ UI Events Start ******************************** + +Script.serveEvent('CSK_DeviceNetworkConfig.OnNewStatusModuleVersion', 'DeviceNetworkConfig_OnNewStatusModuleVersion') +Script.serveEvent('CSK_DeviceNetworkConfig.OnNewStatusCSKStyle', 'DeviceNetworkConfig_OnNewStatusCSKStyle') +Script.serveEvent('CSK_DeviceNetworkConfig.OnNewStatusModuleIsActive', 'DeviceNetworkConfig_OnNewStatusModuleIsActive') + Script.serveEvent("CSK_DeviceNetworkConfig.OnNewStatusLoadParameterOnReboot", "DeviceNetworkConfig_OnNewStatusLoadParameterOnReboot") Script.serveEvent("CSK_DeviceNetworkConfig.OnPersistentDataModuleAvailable", "DeviceNetworkConfig_OnPersistentDataModuleAvailable") Script.serveEvent("CSK_DeviceNetworkConfig.OnNewParameterName", "DeviceNetworkConfig_OnNewParameterName") @@ -169,19 +174,25 @@ end -- Get a list of all configured nameservers local function getNameserverList() local retValue = {} - for _,v in pairs(Ethernet.DNS.getNameservers()) do - -- To enable the display in the dynamic table using the keyword "dns" - ---@diagnostic disable-next-line: param-type-mismatch - table.insert(retValue, {dns= v}) + if _G.availableAPIs.specific == true then + for _,v in pairs(Ethernet.DNS.getNameservers()) do + -- To enable the display in the dynamic table using the keyword "dns" + ---@diagnostic disable-next-line: param-type-mismatch + table.insert(retValue, {dns= v}) + end end - -- If only 127.0.0.1 is use, hide it + -- If only 127.0.0.1 is used, hide it if #retValue == 1 then if retValue[1].dns == "127.0.0.1" then retValue = {} end end + if #retValue == 0 then + table.insert(retValue, {dns= '-'}) + end + return retValue end @@ -240,7 +251,7 @@ local function updateNameservers(nameserverList) for _,ip in pairs(l_cleanedList) do l_statusOutput = l_statusOutput .. ip .. " " end - _G.logger:info(NAME_OF_MODULE .. ": Added nameservers (" .. l_statusOutput ..")") + _G.logger:fine(nameOfModule .. ": Added nameservers (" .. l_statusOutput ..")") -- Store nameserver entries permanently CSK_DeviceNetworkConfig.sendParameters() @@ -312,9 +323,16 @@ Script.serveFunction('CSK_DeviceNetworkConfig.selectDNSViaUI', selectDNSViaUI) --- Function to send all relevant values to UI on resume local function handleOnExpiredTmrDeviceNetworkConfig() + + Script.notifyEvent("DeviceNetworkConfig_OnNewStatusModuleVersion", 'v' .. deviceNetworkConfig_Model.version) + Script.notifyEvent("DeviceNetworkConfig_OnNewStatusCSKStyle", deviceNetworkConfig_Model.styleForUI) + Script.notifyEvent("DeviceNetworkConfig_OnNewStatusModuleIsActive", _G.availableAPIs.default and _G.availableAPIs.specific) + updateUserLevel() - refresh() + if _G.availableAPIs.default and _G.availableAPIs.specific then + refresh() + end currentInterfaceName = '-' currentIP = '-' currentSubnet = '-' @@ -443,10 +461,10 @@ local function applyConfig() if deviceNetworkConfig_Model.helperFuncs.checkIP(currentIP) and deviceNetworkConfig_Model.helperFuncs.checkIP(currentSubnet) and deviceNetworkConfig_Model.helperFuncs.checkIP(currentGateway) or currentGateway == '' then Script.notifyEvent("DeviceNetworkConfig_OnNewEthernetConfigStatus", 'processing') if currentDHCP == true then - _G.logger:info(NAME_OF_MODULE .. ": Applying device's Ethernet config: \n Interface " .. currentInterfaceName .. " \n DHCP: " .. tostring(currentDHCP)) + _G.logger:info(nameOfModule .. ": Applying device's Ethernet config: \n Interface " .. currentInterfaceName .. " \n DHCP: " .. tostring(currentDHCP)) deviceNetworkConfig_Model.applyEthernetConfig(currentInterfaceName, currentDHCP, nil, nil, nil) else - _G.logger:info(NAME_OF_MODULE .. ": Applying device's Ethernet config: \n Interface " .. currentInterfaceName .. " \n DHCP: " .. tostring(currentDHCP) .. " \n IP: " .. currentIP.. " \n Subnet: " .. currentSubnet .. " \n Gateway: " .. currentGateway) + _G.logger:info(nameOfModule .. ": Applying device's Ethernet config: \n Interface " .. currentInterfaceName .. " \n DHCP: " .. tostring(currentDHCP) .. " \n IP: " .. currentIP.. " \n Subnet: " .. currentSubnet .. " \n Gateway: " .. currentGateway) deviceNetworkConfig_Model.applyEthernetConfig(currentInterfaceName, currentDHCP, currentIP, currentSubnet, currentGateway) end refresh() @@ -454,35 +472,42 @@ local function applyConfig() else Script.notifyEvent("DeviceNetworkConfig_OnNewEthernetConfigStatus", 'error') end - _G.logger:info(NAME_OF_MODULE .. ": Applying device's Ethernet config finished") + _G.logger:info(nameOfModule .. ": Applying device's Ethernet config finished") end Script.serveFunction("CSK_DeviceNetworkConfig.applyConfig", applyConfig) --- Function to react 'Ethernet.Interface.OnLinkActiveChanged' event local function handleOnLinkActiveChanged(ifName, linkActive) refresh() - _G.logger:info(NAME_OF_MODULE .. ': New link status = ' .. tostring(linkActive) .. ' on interface ' .. ifName) + _G.logger:fine(nameOfModule .. ': New link status = ' .. tostring(linkActive) .. ' on interface ' .. ifName) end Script.register("Ethernet.Interface.OnLinkActiveChanged", handleOnLinkActiveChanged) +local function getParameters() + return deviceNetworkConfig_Model.helperFuncs.json.encode(deviceNetworkConfig_Model.parameters) +end +Script.serveFunction('CSK_DeviceNetworkConfig.getParameters', getParameters) + -- ********************************************************************************** -- Following function can be adapted for CSK_PersistentData module usage -- ********************************************************************************** local function setParameterName(name) - _G.logger:info(NAME_OF_MODULE .. ": Set parameter name: " .. tostring(name)) + _G.logger:fine(nameOfModule .. ": Set parameter name: " .. tostring(name)) deviceNetworkConfig_Model.parametersName = tostring(name) end Script.serveFunction("CSK_DeviceNetworkConfig.setParameterName", setParameterName) -local function sendParameters() +local function sendParameters(noDataSave) if deviceNetworkConfig_Model.persistentModuleAvailable then CSK_PersistentData.addParameter(deviceNetworkConfig_Model.helperFuncs.convertTable2Container(deviceNetworkConfig_Model.parameters), deviceNetworkConfig_Model.parametersName) - CSK_PersistentData.setModuleParameterName(NAME_OF_MODULE, deviceNetworkConfig_Model.parametersName, deviceNetworkConfig_Model.parameterLoadOnReboot) - _G.logger:info(NAME_OF_MODULE .. ": Send DeviceNetworkConfig parameters with name '" .. deviceNetworkConfig_Model.parametersName .. "' to CSK_PersistentData module.") - CSK_PersistentData.saveData() + CSK_PersistentData.setModuleParameterName(nameOfModule, deviceNetworkConfig_Model.parametersName, deviceNetworkConfig_Model.parameterLoadOnReboot) + _G.logger:fine(nameOfModule .. ": Send DeviceNetworkConfig parameters with name '" .. deviceNetworkConfig_Model.parametersName .. "' to CSK_PersistentData module.") + if not noDataSave then + CSK_PersistentData.saveData() + end else - _G.logger:warning(NAME_OF_MODULE .. ": CSK_PersistentData Module not available.") + _G.logger:warning(nameOfModule .. ": CSK_PersistentData Module not available.") end end Script.serveFunction("CSK_DeviceNetworkConfig.sendParameters", sendParameters) @@ -491,49 +516,55 @@ local function loadParameters() if deviceNetworkConfig_Model.persistentModuleAvailable then local data = CSK_PersistentData.getParameter(deviceNetworkConfig_Model.parametersName) if data then - _G.logger:info(NAME_OF_MODULE .. ": Loaded parameters from CSK_PersistentData module.") + _G.logger:info(nameOfModule .. ": Loaded parameters from CSK_PersistentData module.") deviceNetworkConfig_Model.parameters = deviceNetworkConfig_Model.helperFuncs.convertContainer2Table(data) -- Load nameservers updateNameservers(deviceNetworkConfig_Model.parameters.nameservers) CSK_DeviceNetworkConfig.pageCalled() + return true else - _G.logger:warning(NAME_OF_MODULE .. ": Loading parameters from CSK_PersistentData module did not work.") + _G.logger:warning(nameOfModule .. ": Loading parameters from CSK_PersistentData module did not work.") + return false end else - _G.logger:warning(NAME_OF_MODULE .. ": CSK_PersistentData Module not available.") + _G.logger:warning(nameOfModule .. ": CSK_PersistentData Module not available.") + return false end end Script.serveFunction("CSK_DeviceNetworkConfig.loadParameters", loadParameters) local function setLoadOnReboot(status) deviceNetworkConfig_Model.parameterLoadOnReboot = status - _G.logger:info(NAME_OF_MODULE .. ": Set new status to load setting on reboot: " .. tostring(status)) + _G.logger:fine(nameOfModule .. ": Set new status to load setting on reboot: " .. tostring(status)) end Script.serveFunction("CSK_DeviceNetworkConfig.setLoadOnReboot", setLoadOnReboot) --- Function to react on initial load of persistent parameters local function handleOnInitialDataLoaded() - if string.sub(CSK_PersistentData.getVersion(), 1, 1) == '1' then + if _G.availableAPIs.default and _G.availableAPIs.specific then + _G.logger:fine(nameOfModule .. ': Try to initially load parameter from CSK_PersistentData module.') + if string.sub(CSK_PersistentData.getVersion(), 1, 1) == '1' then - _G.logger:warning(NAME_OF_MODULE .. ': CSK_PersistentData module is too old and will not work. Please update CSK_PersistentData module.') + _G.logger:warning(nameOfModule .. ': CSK_PersistentData module is too old and will not work. Please update CSK_PersistentData module.') - deviceNetworkConfig_Model.persistentModuleAvailable = false - else + deviceNetworkConfig_Model.persistentModuleAvailable = false + else - local parameterName, loadOnReboot = CSK_PersistentData.getModuleParameterName(NAME_OF_MODULE) + local parameterName, loadOnReboot = CSK_PersistentData.getModuleParameterName(nameOfModule) - if parameterName then - deviceNetworkConfig_Model.parametersName = parameterName - deviceNetworkConfig_Model.parameterLoadOnReboot = loadOnReboot - end + if parameterName then + deviceNetworkConfig_Model.parametersName = parameterName + deviceNetworkConfig_Model.parameterLoadOnReboot = loadOnReboot + end - if deviceNetworkConfig_Model.parameterLoadOnReboot then - loadParameters() + if deviceNetworkConfig_Model.parameterLoadOnReboot then + loadParameters() + end + Script.notifyEvent('DeviceNetworkConfig_OnDataLoadedOnReboot') end - Script.notifyEvent('DeviceNetworkConfig_OnDataLoadedOnReboot') end end Script.register("CSK_PersistentData.OnInitialDataLoaded", handleOnInitialDataLoaded) diff --git a/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/DeviceNetworkConfig_Model.lua b/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/DeviceNetworkConfig_Model.lua index c2378af..f2cdce9 100644 --- a/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/DeviceNetworkConfig_Model.lua +++ b/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/DeviceNetworkConfig_Model.lua @@ -29,13 +29,16 @@ deviceNetworkConfig_Model.helperFuncs = require('Configuration/DeviceNetworkConf deviceNetworkConfig_Model.interfacesTable = {} -- table to hold setup of available ethernet interfaces deviceNetworkConfig_Model.ping_ip_adress = "" -- IP address to check for ping +deviceNetworkConfig_Model.styleForUI = 'None' -- Optional parameter to set UI style +deviceNetworkConfig_Model.version = Engine.getCurrentAppVersion() -- Version of module + deviceNetworkConfig_Model.parameters = {} deviceNetworkConfig_Model.parameters.nameservers = {}; -- Name servers (DNS) -- Default values for persistent data -- If available, following values will be updated from data of CSK_PersistentData module (check CSK_PersistentData module for this) deviceNetworkConfig_Model.parametersName = 'CSK_DeviceNetworkConfig_Parameter' -- name of parameter dataset to be used for this module -deviceNetworkConfig_Model.parameterLoadOnReboot = true -- Status if parameter dataset should be loaded on app/device reboot +deviceNetworkConfig_Model.parameterLoadOnReboot = false -- Status if parameter dataset should be loaded on app/device reboot --************************************************************************** --********************** End Global Scope ********************************** @@ -43,6 +46,13 @@ deviceNetworkConfig_Model.parameterLoadOnReboot = true -- Status if parameter da --**********************Start Function Scope ******************************* --************************************************************************** +--- Function to react on UI style change +local function handleOnStyleChanged(theme) + deviceNetworkConfig_Model.styleForUI = theme + Script.notifyEvent("DeviceNetworkConfig_OnNewStatusCSKStyle", deviceNetworkConfig_Model.styleForUI) +end +Script.register('CSK_PersistentData.OnNewStatusCSKStyle', handleOnStyleChanged) + ---Function to get current setting of ethernet interfaces local function refreshInterfaces() deviceNetworkConfig_Model.interfacesTable = {} diff --git a/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/helper/checkAPIs.lua b/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/helper/checkAPIs.lua new file mode 100644 index 0000000..907a6fe --- /dev/null +++ b/CSK_Module_DeviceNetworkConfig/scripts/Configuration/DeviceNetworkConfig/helper/checkAPIs.lua @@ -0,0 +1,47 @@ +---@diagnostic disable: undefined-global, redundant-parameter, missing-parameter + +-- Load all relevant APIs for this module +--************************************************************************** + +local availableAPIs = {} + +-- Function to load all default APIs +local function loadAPIs() + CSK_DeviceNetworkConfig = require 'API.CSK_DeviceNetworkConfig' + + Log = require 'API.Log' + Log.Handler = require 'API.Log.Handler' + Log.SharedLogger = require 'API.Log.SharedLogger' + + Container = require 'API.Container' + + Engine = require 'API.Engine' + File = require 'API.File' + Object = require 'API.Object' + Parameters = require 'API.Parameters' + Timer = require 'API.Timer' + + -- Check if related CSK modules are available to be used + local appList = Engine.listApps() + for i = 1, #appList do + if appList[i] == 'CSK_Module_PersistentData' then + CSK_PersistentData = require 'API.CSK_PersistentData' + elseif appList[i] == 'CSK_Module_UserManagement' then + CSK_UserManagement = require 'API.CSK_UserManagement' + end + end +end + +-- Function to load specific APIs +local function loadSpecificAPIs() + -- If you want to check for specific APIs/functions supported on the device the module is running, place relevant APIs here + Ethernet = require 'API.Ethernet' + Ethernet.DNS = require 'API.Ethernet.DNS' + Ethernet.Interface = require 'API.Ethernet.Interface' +end + +availableAPIs.default = xpcall(loadAPIs, debug.traceback) -- TRUE if all default APIs were loaded correctly +availableAPIs.specific = xpcall(loadSpecificAPIs, debug.traceback) -- TRUE if all specific APIs were loaded correctly + +return availableAPIs +--************************************************************************** \ No newline at end of file diff --git a/README.md b/README.md index 4255839..b4d73c6 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,16 @@ For further information check out the [documentation](https://raw.githack.com/SI ## Information -Tested on: -1. SIM1012 - Firmware 2.3.0 -2. SIM1000fx - Firmware 1.7.2 +Tested on: +|Device|Firmware|Module version +|--|--|--| +|SICK AppEngine|V1.7.0|V2.2.0| +|SIM1012|V2.4.2|V2.2.0| +|SIM1000FX|V1.7.2|**Please note** -> This application / module is part of the SICK AppSpace Coding Starter Kit developing approach. +> This module is part of the SICK AppSpace Coding Starter Kit developing approach. It is programmed in an object oriented way. Some of the modules use kind of "classes" in Lua to make it possible to reuse code / classes in other projects. In general it is not neccessary to code this way, but the architecture of this app can serve as a sample to be used especially for bigger projects and to make it easier to share code. Please check the [documentation](https://github.com/SICKAppSpaceCodingStarterKit/.github/blob/main/docu/SICKAppSpaceCodingStarterKit_Documentation.md) of CSK for further information. @@ -23,7 +27,7 @@ Please check the [documentation](https://github.com/SICKAppSpaceCodingStarterKit |Module|Version|Remark |--|--|--| -|CSK_Module_PersistentData|[V4.0.0](https://github.com/SICKAppSpaceCodingStarterKit/CSK_Module_PersistentData/releases/tag/v4.0.0)|Necessary to persist the DNS settings +|CSK_Module_PersistentData|[>=V4.0.0](https://github.com/SICKAppSpaceCodingStarterKit/CSK_Module_PersistentData)|Necessary to persist the DNS settings ## Topics Coding Starter Kit, CSK, Module, SICK-AppSpace, Ethernet, Interface, Config, Device, DNS, DHCP, IP, PING diff --git a/docu/CSK_Module_DeviceNetworkConfig.html b/docu/CSK_Module_DeviceNetworkConfig.html index 06125ac..97361e9 100644 --- a/docu/CSK_Module_DeviceNetworkConfig.html +++ b/docu/CSK_Module_DeviceNetworkConfig.html @@ -6,7 +6,7 @@ -Documentation - CSK_Module_DeviceNetworkConfig 2.1.0 +Documentation - CSK_Module_DeviceNetworkConfig 2.2.0