From 769b5466499ba4aa46ee6d2169d2472273eca1c4 Mon Sep 17 00:00:00 2001 From: Roy Gollub Date: Mon, 27 Jan 2025 08:58:39 +0100 Subject: [PATCH 1/2] # Release 4.2.0 ## New features - Edit values within parameters via UI - Trigger other modules to load specific parameters --- CHANGELOG.md | 6 + .../CSK_Module_PersistentData.html | 294 +++- CSK_Module_PersistentData/project.mf.xml | 84 +- ...SK_Module_PersistentData_AsyncLoadData.lua | 76 + .../PersistentData_Controller.lua | 388 ++++- .../PersistentData/PersistentData_Model.lua | 26 +- .../PersistentData/helper/funcs.lua | 20 +- README.md | 2 + docu/CSK_Module_PersistentData.html | 1390 ++++++++++++++--- docu/media/UI_Screenshot.png | Bin 103932 -> 139930 bytes 10 files changed, 2050 insertions(+), 236 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a220ca5..5210248 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ # Changelog All notable changes to this project will be documented in this file. +## Release 4.2.0 + +### New features +- Edit values within parameters via UI +- Trigger other modules to load specific parameters + ## Release 4.1.0 ### New features diff --git a/CSK_Module_PersistentData/pages/pages/CSK_Module_PersistentData/CSK_Module_PersistentData.html b/CSK_Module_PersistentData/pages/pages/CSK_Module_PersistentData/CSK_Module_PersistentData.html index 524b7e0..6f78c85 100644 --- a/CSK_Module_PersistentData/pages/pages/CSK_Module_PersistentData/CSK_Module_PersistentData.html +++ b/CSK_Module_PersistentData/pages/pages/CSK_Module_PersistentData/CSK_Module_PersistentData.html @@ -44,13 +44,16 @@ Error - + Please check log... + + + name="CSK_PersistentData/OnNewThreadFeedbackStatus" update-on-resume> @@ -185,11 +188,13 @@ - @@ -283,6 +288,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CSK_Module_PersistentData/project.mf.xml b/CSK_Module_PersistentData/project.mf.xml index 5bc0e5e..49e31ba 100644 --- a/CSK_Module_PersistentData/project.mf.xml +++ b/CSK_Module_PersistentData/project.mf.xml @@ -121,6 +121,60 @@ After that, do not forget to save the received data as stated in step 4. + Notify event to trigger other modules to load their related data. + + Notify what parameter type was selected within a parameter set. + + + + Notfiy if currently selected parameter holds table data. + + + + Notify name of selected parameter within parameter table. + + + + Notify list of parameter names within parameter table. + + + + Notify string value of currently selected parameter. + + + + Notify number value of currently selected parameter. + + + + Notify string value of currently selected parameter. + + + + Notify list of available CSK modules. + + + + Notify preselected module to send currently selected parameter. + + + + Notify event to trigger a module to load specific parameters. + + + + + + Notify instance of preselected module to send currently selected parameter. + + + + Notify if selected module to send parameters is a multi module. + + + + Notify current thread status. + + Save current parameter set. @@ -222,15 +276,41 @@ To make this permanent, it is needed to save the persistent data afterwards (see Function to get info what parameter file is currently in use. + + Function to select parameter within UI. + + + + Function to set selected parameter within selected parameter set table. + + + + Function to preset value for selected parameter. + + + + Function to set preconfigured value to parameter. + + + Function to select module to send parameters. + + + + Function to trigger a module to load currently selected parameters (optionally for specific instance). Needs to be preconfigured via 'setModuleToSendParameters' and (optionally) 'setModuleInstanceToSendParameters'. + + + Function to select instance of selected module to send parameters. + + SICK AG - 4.1.0 + 4.2.0 low false false false - true + false diff --git a/CSK_Module_PersistentData/scripts/CSK_Module_PersistentData_AsyncLoadData.lua b/CSK_Module_PersistentData/scripts/CSK_Module_PersistentData_AsyncLoadData.lua index 10c1340..f4558c1 100644 --- a/CSK_Module_PersistentData/scripts/CSK_Module_PersistentData_AsyncLoadData.lua +++ b/CSK_Module_PersistentData/scripts/CSK_Module_PersistentData_AsyncLoadData.lua @@ -1,5 +1,7 @@ ---@diagnostic disable: undefined-global, redundant-parameter, missing-parameter +Script.serveEvent("CSK_PersistentData.OnNewThreadFeedbackStatus", "PersistentData_OnNewThreadFeedbackStatus") + -- If App property "LuaLoadAllEngineAPI" is FALSE, use this to load and check for required APIs -- This can improve performance of garbage collection local availableAPIs = require('Configuration/PersistentData/helper/checkAPIs') -- check for available APIs @@ -12,6 +14,17 @@ _G.logger = Log.SharedLogger.create('ModuleLogger') local json = require("Configuration.PersistentData.helper.Json") local scriptParams = Script.getStartArgument() -- Get parameters from model +-- Timer to hide UI messages after 5 seconds +local logTmr = Timer.create() +logTmr:setExpirationTime(5000) +logTmr:setPeriodic(false) + +--- Function to hide UI message +local function handleOnLogTmrExpired() + Script.notifyEvent('PersistentData_OnNewThreadFeedbackStatus', 'EMPTY') +end +Timer.register(logTmr, 'OnExpired', handleOnLogTmrExpired) + --- Function to trigger other modules to load their specific parameters ---@param data Container Data container with parameters to load. local function handleOnNewDataToLoad(data) @@ -85,3 +98,66 @@ local function handleOnNewDataToLoad(data) end Script.register('CSK_PersistentData.OnNewDataToLoad', handleOnNewDataToLoad) + +--- Function to trigger other modules to load specific parameters +---@param moduleName string Name of module. +---@param parameterName string Name of parameters to load. +---@param instance? int Optional number of instance of module. +local function handleOnNewStatusSendParametersToModule(moduleName, parameterName, instance) + + local name = string.gsub(moduleName, '_Module_', '_') + name = string.gsub(name, '_Application_', '_') + + _G.logger:fine(nameOfModule .. ": Try to set parameters " .. tostring(parameterName) .. " to module " .. tostring(name) .. " (optional instance = " .. tostring(instance) .. ").") + local instanceSelectionExists = false + local setInstanceExists = false + local instanceAmountExists = false + + if instance then + instanceSelectionExists = Script.isServedAsFunction(name .. '.setSelectedInstance') + setInstanceExists = Script.isServedAsFunction(name .. '.setInstance') + instanceAmountExists = Script.isServedAsFunction(name .. '.getInstancesAmount') + + if instanceAmountExists then + local _, amount = Script.callFunction(name .. '.getInstancesAmount') + if amount <= instance then + if instanceSelectionExists then + Script.callFunction(name .. '.setSelectedInstance', instance) + elseif setInstanceExists then + Script.callFunction(name .. '.setInstance', instance) + else + _G.logger:warning(nameOfModule .. ": Not possible to set instance.") + Script.notifyEvent('PersistentData_OnNewThreadFeedbackStatus', 'ERR') + logTmr:start() + return + end + else + _G.logger:warning(nameOfModule .. ": Instance does not exists.") + Script.notifyEvent('PersistentData_OnNewThreadFeedbackStatus', 'ERR') + logTmr:start() + return + end + end + end + + local setParameterNameExists = Script.isServedAsFunction(name .. '.setParameterName') + local loadParametersExists = Script.isServedAsFunction(name .. '.loadParameters') + + if setParameterNameExists and loadParametersExists then + Script.callFunction(name .. '.setParameterName', parameterName) + Script.sleep(1000) + local _, suc = Script.callFunction(name .. '.loadParameters') + if suc == nil or suc == false then + Script.notifyEvent('PersistentData_OnNewThreadFeedbackStatus', 'ERR') + logTmr:start() + else + Script.notifyEvent('PersistentData_OnNewThreadFeedbackStatus', 'OK') + logTmr:start() + end + else + _G.logger:warning(nameOfModule .. ": Not possible to load parameters.") + Script.notifyEvent('PersistentData_OnNewThreadFeedbackStatus', 'ERR') + logTmr:start() + end +end +Script.register('CSK_PersistentData.OnNewStatusSendParametersToModule', handleOnNewStatusSendParametersToModule) diff --git a/CSK_Module_PersistentData/scripts/Configuration/PersistentData/PersistentData_Controller.lua b/CSK_Module_PersistentData/scripts/Configuration/PersistentData/PersistentData_Controller.lua index d0a97a8..e1406e5 100644 --- a/CSK_Module_PersistentData/scripts/Configuration/PersistentData/PersistentData_Controller.lua +++ b/CSK_Module_PersistentData/scripts/Configuration/PersistentData/PersistentData_Controller.lua @@ -23,8 +23,6 @@ local tmrCheckAllModules = Timer.create() tmrCheckAllModules:setExpirationTime(10000) tmrCheckAllModules:setPeriodic(false) -local currentSelectedParameters = '' -- Selected Parameter - -- ************************ UI Events Start ******************************** Script.serveEvent('CSK_PersistentData.OnNewStatusModuleVersion', 'PersistentData_OnNewStatusModuleVersion') Script.serveEvent('CSK_PersistentData.OnNewStatusCSKStyle', 'PersistentData_OnNewStatusCSKStyle') @@ -39,6 +37,22 @@ Script.serveEvent("CSK_PersistentData.OnNewParameterSelection", "PersistentData_ Script.serveEvent("CSK_PersistentData.OnNewParameterTableInfo", "PersistentData_OnNewParameterTableInfo") Script.serveEvent('CSK_PersistentData.OnNewStatusTempFileAvailable', 'PersistentData_OnNewStatusTempFileAvailable') +Script.serveEvent('CSK_PersistentData.OnNewStatusParameterTypeSelected', 'PersistentData_OnNewStatusParameterTypeSelected') +Script.serveEvent('CSK_PersistentData.OnNewStatusStringValueOfSelecteParameter', 'PersistentData_OnNewStatusStringValueOfSelecteParameter') +Script.serveEvent('CSK_PersistentData.OnNewStatusNumberValueOfSelecteParameter', 'PersistentData_OnNewStatusNumberValueOfSelecteParameter') +Script.serveEvent('CSK_PersistentData.OnNewStatusBooleanValueOfSelecteParameter', 'PersistentData_OnNewStatusBooleanValueOfSelecteParameter') + +Script.serveEvent('CSK_PersistentData.OnNewStatusSelectedParameterIsTable', 'PersistentData_OnNewStatusSelectedParameterIsTable') +Script.serveEvent('CSK_PersistentData.OnNewStatusListOfTableParameters', 'PersistentData_OnNewStatusListOfTableParameters') +Script.serveEvent('CSK_PersistentData.OnNewStatusSelectedParameterWithinTable', 'PersistentData_OnNewStatusSelectedParameterWithinTable') + +Script.serveEvent('CSK_PersistentData.OnNewStatusListOfModules', 'PersistentData_OnNewStatusListOfModules') +Script.serveEvent('CSK_PersistentData.OnNewStatusSelectedModuleToSendParameter', 'PersistentData_OnNewStatusSelectedModuleToSendParameter') +Script.serveEvent('CSK_PersistentData.OnNewStatusSelectionIsMultiModule', 'PersistentData_OnNewStatusSelectionIsMultiModule') +Script.serveEvent('CSK_PersistentData.OnNewStatusSelectedModuleInstanceToSendParameter', 'PersistentData_OnNewStatusSelectedModuleInstanceToSendParameter') + +Script.serveEvent('CSK_PersistentData.OnNewStatusSendParametersToModule', 'PersistentData_OnNewStatusSendParametersToModule') + Script.serveEvent("CSK_PersistentData.OnUserLevelOperatorActive", "PersistentData_OnUserLevelOperatorActive") Script.serveEvent("CSK_PersistentData.OnUserLevelMaintenanceActive", "PersistentData_OnUserLevelMaintenanceActive") Script.serveEvent("CSK_PersistentData.OnUserLevelServiceActive", "PersistentData_OnUserLevelServiceActive") @@ -125,10 +139,27 @@ local function handleOnExpiredTmrPersistendData() Script.notifyEvent('PersistentData_OnNewContent', persistentData_Model.contentList) Script.notifyEvent('PersistentData_OnNewFeedbackStatus', 'EMPTY') Script.notifyEvent('PersistentData_OnNewDatasetList', persistentData_Model.funcs.createJsonList(persistentData_Model.data)) - if currentSelectedParameters ~= '' then - Script.notifyEvent('PersistentData_OnNewParameterSelection', currentSelectedParameters) + if persistentData_Model.currentlySelectedDataSet ~= '' then + Script.notifyEvent('PersistentData_OnNewParameterSelection', persistentData_Model.currentlySelectedDataSet) end - Script.notifyEvent('PersistentData_OnNewParameterTableInfo', persistentData_Model.funcs.createJsonListForTableView(persistentData_Model.data[currentSelectedParameters])) + + persistentData_Model.currentlySelectedParameterName = '' + persistentData_Model.currentlySelectedParameterType = '' + persistentData_Model.currentlySelectedParameterNameTableList = '' + persistentData_Model.currentlySelectedParameterValue = '' + + persistentData_Model.currentlySelectedModuleToLoadParameters = '' + persistentData_Model.currentlySelectedModuleInstanceToLoadParameters = 0 + + Script.notifyEvent('PersistentData_OnNewStatusSelectedParameterIsTable', false) + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + + Script.notifyEvent('PersistentData_OnNewStatusListOfModules', persistentData_Model.funcs.createStringListBySimpleTable(persistentData_Model.listOfCSKModules)) + Script.notifyEvent('PersistentData_OnNewStatusSelectedModuleToSendParameter', '') + Script.notifyEvent('PersistentData_OnNewStatusSelectionIsMultiModule', false) + Script.notifyEvent('PersistentData_OnNewStatusSelectedModuleInstanceToSendParameter', 0) + + Script.notifyEvent('PersistentData_OnNewParameterTableInfo', persistentData_Model.funcs.createJsonListForTableView(persistentData_Model.data[persistentData_Model.currentlySelectedDataSet])) Script.notifyEvent('PersistentData_OnNewStatusTempFileAvailable', File.exists(persistentData_Model.tempPath)) end Timer.register(tmrPersistendData, "OnExpired", handleOnExpiredTmrPersistendData) @@ -281,19 +312,354 @@ Script.serveFunction("CSK_PersistentData.getModuleParameterName", getModuleParam local function setSelectedParameterName(selection) if persistentData_Model.data[selection] then _G.logger:fine(nameOfModule .. ': Selected parameter: ' .. tostring(selection)) - currentSelectedParameters = selection + persistentData_Model.currentlySelectedDataSet = selection else _G.logger:info(nameOfModule .. ': Parameter not available: ' .. tostring(selection)) end - Script.notifyEvent('PersistentData_OnNewParameterTableInfo', persistentData_Model.funcs.createJsonListForTableView(persistentData_Model.data[currentSelectedParameters])) + Script.notifyEvent('PersistentData_OnNewParameterTableInfo', persistentData_Model.funcs.createJsonListForTableView(persistentData_Model.data[persistentData_Model.currentlySelectedDataSet])) + + persistentData_Model.currentlySelectedParameterName = '' + persistentData_Model.currentlySelectedParameterType = '' + persistentData_Model.currentlySelectedParameterNameTableList = '' + persistentData_Model.currentlySelectedParameterValue = '' + + Script.notifyEvent('PersistentData_OnNewStatusSelectedParameterIsTable', false) + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') end Script.serveFunction("CSK_PersistentData.setSelectedParameterName", setSelectedParameterName) +--- Function to check if selection in UIs DynamicTable can find related pattern +---@param selection string Full text of selection +---@param pattern string Pattern to search for +---@param findEnd bool Find end after pattern +---@return string? Success if pattern was found or even postfix after pattern till next quotation marks if findEnd was set to TRUE +local function checkSelection(selection, pattern, findEnd) + if selection ~= "" then + local _, pos = string.find(selection, pattern) + if pos == nil then + return nil + else + if findEnd then + pos = tonumber(pos) + local endPos = string.find(selection, '"', pos+1) + if endPos then + local tempSelection = string.sub(selection, pos+1, endPos-1) + if tempSelection ~= nil and tempSelection ~= '-' then + return tempSelection + end + else + return nil + end + else + return 'true' + end + end + end + return nil +end + +local function setSelectedParameterWithinTableViaUI(selection) + local tempSelection = checkSelection(selection, '"ParameterName":"', true) + if tempSelection then + local isSelected = checkSelection(selection, '"selected":true', false) + if isSelected then + persistentData_Model.currentlySelectedParameterName = tempSelection + local isTable = string.find(tempSelection, ' // ') + if isTable then + -- Mainly a table + local mainTable = string.sub(tempSelection, 1, isTable-1) + local subTable = string.sub(tempSelection, isTable + 4, #tempSelection) + + local mainValue = persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][mainTable][subTable] + local typeOfMainValue = type(mainValue) + + if typeOfMainValue == 'string' or typeOfMainValue == 'number' or typeOfMainValue == 'boolean' then + Script.notifyEvent('PersistentData_OnNewStatusSelectedParameterIsTable', false) + persistentData_Model.currentlySelectedParameterType = typeOfMainValue + persistentData_Model.currentlySelectedParameterNameOfTable = mainTable + persistentData_Model.currentlySelectedParameterNameOfSubTable = subTable + persistentData_Model.currentlySelectedParameterWithinSubTable = '' + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', typeOfMainValue) + if mainValue ~= nil then + persistentData_Model.currentlySelectedParameterValue = mainValue + end + if typeOfMainValue == 'string' then + if string.find(subTable, 'passwords') or string.find(subTable, 'password') or string.find(subTable, 'Password') or string.find(mainTable, 'passwords') or string.find(mainTable, 'password') or string.find(mainTable, 'Password') then + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + else + Script.notifyEvent('PersistentData_OnNewStatusStringValueOfSelecteParameter', mainValue) + end + elseif typeOfMainValue == 'number' then + Script.notifyEvent('PersistentData_OnNewStatusNumberValueOfSelecteParameter', mainValue) + elseif typeOfMainValue == 'boolean' then + Script.notifyEvent('PersistentData_OnNewStatusBooleanValueOfSelecteParameter', mainValue) + end + + elseif typeOfMainValue == 'table' then + -- Parameter consists of internal table + Script.notifyEvent('PersistentData_OnNewStatusSelectedParameterIsTable', true) + + -- List of parameters + Script.notifyEvent('PersistentData_OnNewStatusListOfTableParameters', persistentData_Model.funcs.createJsonList(persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][mainTable][subTable])) + Script.sleep(200) + + local tempKey = '' + -- Get first table entry + for paramKey, _ in pairs(persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][mainTable][subTable]) do + tempKey = paramKey + break + end + persistentData_Model.currentlySelectedParameterWithinSubTable = tempKey + Script.notifyEvent('PersistentData_OnNewStatusSelectedParameterWithinTable', tempKey) + local value = persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][mainTable][subTable][tempKey] + local valueType = type(value) + + if valueType == 'string' or valueType == 'number' or valueType == 'boolean' then + persistentData_Model.currentlySelectedParameterType = valueType + persistentData_Model.currentlySelectedParameterNameOfTable = mainTable + persistentData_Model.currentlySelectedParameterNameOfSubTable = subTable + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', valueType) + persistentData_Model.currentlySelectedParameterValue = value + if valueType == 'string' then + if string.find(subTable, 'passwords') or string.find(subTable, 'password') or string.find(subTable, 'Password') or string.find(mainTable, 'passwords') or string.find(mainTable, 'password') or string.find(mainTable, 'Password') or string.find(tempKey, 'passwords') or string.find(tempKey, 'password') or string.find(tempKey, 'Password') then + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + else + Script.notifyEvent('PersistentData_OnNewStatusStringValueOfSelecteParameter', value) + end + elseif valueType == 'number' then + Script.notifyEvent('PersistentData_OnNewStatusNumberValueOfSelecteParameter', value) + elseif valueType == 'boolean' then + Script.notifyEvent('PersistentData_OnNewStatusBooleanValueOfSelecteParameter', value) + end + else + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + persistentData_Model.currentlySelectedParameterType = '' + persistentData_Model.currentlySelectedParameterNameOfTable = '' + persistentData_Model.currentlySelectedParameterNameOfSubTable = '' + persistentData_Model.currentlySelectedParameterWithinSubTable = '' + persistentData_Model.currentlySelectedParameterValue = '' + end + + else + -- Not supported to change other data types + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + persistentData_Model.currentlySelectedParameterType = '' + persistentData_Model.currentlySelectedParameterNameOfTable = '' + persistentData_Model.currentlySelectedParameterNameOfSubTable = '' + persistentData_Model.currentlySelectedParameterWithinSubTable = '' + persistentData_Model.currentlySelectedParameterValue = '' + end + + else + -- Not table content + Script.notifyEvent('PersistentData_OnNewStatusSelectedParameterIsTable', false) + local value = persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][tempSelection] + local valueType = type(value) + + if valueType == 'string' or valueType == 'number' or valueType == 'boolean' then + persistentData_Model.currentlySelectedParameterType = valueType + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', valueType) + persistentData_Model.currentlySelectedParameterValue = value + if valueType == 'string' then + if string.find(tempSelection, 'passwords') or string.find(tempSelection, 'password') or string.find(tempSelection, 'Password') then + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + else + Script.notifyEvent('PersistentData_OnNewStatusStringValueOfSelecteParameter', value) + end + elseif valueType == 'number' then + Script.notifyEvent('PersistentData_OnNewStatusNumberValueOfSelecteParameter', value) + elseif valueType == 'boolean' then + Script.notifyEvent('PersistentData_OnNewStatusBooleanValueOfSelecteParameter', value) + end + persistentData_Model.currentlySelectedParameterNameOfTable = '' + persistentData_Model.currentlySelectedParameterNameOfSubTable = '' + persistentData_Model.currentlySelectedParameterWithinSubTable = '' + else + -- Not supported to change other data types + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + persistentData_Model.currentlySelectedParameterType = '' + persistentData_Model.currentlySelectedParameterNameOfTable = '' + persistentData_Model.currentlySelectedParameterNameOfSubTable = '' + persistentData_Model.currentlySelectedParameterWithinSubTable = '' + + persistentData_Model.currentlySelectedParameterValue = '' + end + end + else + -- Deselected + persistentData_Model.currentlySelectedParameterName = '' + persistentData_Model.currentlySelectedParameterNameOfTable = '' + persistentData_Model.currentlySelectedParameterNameOfSubTable = '' + persistentData_Model.currentlySelectedParameterWithinSubTable = '' + persistentData_Model.currentlySelectedParameterValue = '' + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + Script.notifyEvent('PersistentData_OnNewStatusSelectedParameterIsTable', false) + end + else + -- No selection + persistentData_Model.currentlySelectedParameterName = '' + persistentData_Model.currentlySelectedParameterNameOfTable = '' + persistentData_Model.currentlySelectedParameterNameOfSubTable = '' + persistentData_Model.currentlySelectedParameterWithinSubTable = '' + persistentData_Model.currentlySelectedParameterValue = '' + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + Script.notifyEvent('PersistentData_OnNewStatusSelectedParameterIsTable', false) + end + Script.notifyEvent('PersistentData_OnNewParameterTableInfo', persistentData_Model.funcs.createJsonListForTableView(persistentData_Model.data[persistentData_Model.currentlySelectedDataSet], persistentData_Model.currentlySelectedParameterName)) +end +Script.serveFunction('CSK_PersistentData.setSelectedParameterWithinTableViaUI', setSelectedParameterWithinTableViaUI) + +local function setParameterSelectionWithinTable(selection) + local checkValue + if persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterNameOfTable] then + if persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterNameOfTable][persistentData_Model.currentlySelectedParameterNameOfSubTable] then + checkValue = persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterNameOfTable][persistentData_Model.currentlySelectedParameterNameOfSubTable][selection] + end + end + if checkValue ~= nil then + persistentData_Model.currentlySelectedParameterValue = value + persistentData_Model.currentlySelectedParameterWithinSubTable = selection + + local typeOfMainValue = type(checkValue) + + if typeOfMainValue == 'string' or typeOfMainValue == 'number' or typeOfMainValue == 'boolean' then + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', typeOfMainValue) + persistentData_Model.currentlySelectedParameterType = typeOfMainValue + + if persistentData_Model.currentlySelectedParameterType == 'string' then + if string.find(selection, 'passwords') or string.find(selection, 'password') or string.find(selection, 'Password') then + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + else + Script.notifyEvent('PersistentData_OnNewStatusStringValueOfSelecteParameter', checkValue) + end + elseif persistentData_Model.currentlySelectedParameterType == 'number' then + Script.notifyEvent('PersistentData_OnNewStatusNumberValueOfSelecteParameter', checkValue) + elseif persistentData_Model.currentlySelectedParameterType == 'boolean' then + Script.notifyEvent('PersistentData_OnNewStatusBooleanValueOfSelecteParameter', checkValue) + end + else + -- Not supported to change other data types + Script.notifyEvent('PersistentData_OnNewStatusParameterTypeSelected', 'empty') + persistentData_Model.currentlySelectedParameterValue = '' + persistentData_Model.currentlySelectedParameterType = '' + end + else + persistentData_Model.currentlySelectedParameterValue = '' + persistentData_Model.currentlySelectedParameterType = '' + end +end +Script.serveFunction('CSK_PersistentData.setParameterSelectionWithinTable', setParameterSelectionWithinTable) + +local function setNewValueForSelectedParameter(value) + persistentData_Model.currentlySelectedParameterValue = value +end +Script.serveFunction('CSK_PersistentData.setNewValueForSelectedParameter', setNewValueForSelectedParameter) + +local function setNewValueToParameterViaUI() + -- Set new value + if persistentData_Model.currentlySelectedParameterValue ~= '' and persistentData_Model.currentlySelectedParameterValue ~= nil then + if persistentData_Model.currentlySelectedParameterNameOfTable ~= '' then + if persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterNameOfTable] then + if persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterNameOfTable][persistentData_Model.currentlySelectedParameterNameOfSubTable] then + if persistentData_Model.currentlySelectedParameterWithinSubTable ~= '' then + local checkValue = persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterNameOfTable][persistentData_Model.currentlySelectedParameterNameOfSubTable][persistentData_Model.currentlySelectedParameterWithinSubTable] + if checkValue ~= nil then + local checkType = type(checkValue) + local newType = type(persistentData_Model.currentlySelectedParameterValue) + if checkType == newType then + _G.logger:fine(nameOfModule .. ': Updated parameter "' .. tostring(persistentData_Model.currentlySelectedParameterWithinSubTable) .. '" with new value = ' .. tostring(persistentData_Model.currentlySelectedParameterValue)) + persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterNameOfTable][persistentData_Model.currentlySelectedParameterNameOfSubTable][persistentData_Model.currentlySelectedParameterWithinSubTable] = persistentData_Model.currentlySelectedParameterValue + else + _G.logger:info(nameOfModule .. ": No value update. New value not of same type.") + end + else + _G.logger:info(nameOfModule .. ": No value update. Internal value does not exist.") + end + else + -- No extra internal table + local checkValue = persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterNameOfTable][persistentData_Model.currentlySelectedParameterNameOfSubTable] + if checkValue ~= nil then + local checkType = type(checkValue) + local newType = type(persistentData_Model.currentlySelectedParameterValue) + if checkType == newType then + _G.logger:fine(nameOfModule .. ': Updated parameter "' .. tostring(persistentData_Model.currentlySelectedParameterNameOfSubTable) .. '" with new value = ' .. tostring(persistentData_Model.currentlySelectedParameterValue)) + persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterNameOfTable][persistentData_Model.currentlySelectedParameterNameOfSubTable] = persistentData_Model.currentlySelectedParameterValue + else + _G.logger:info(nameOfModule .. ": No value update. New value not of same type.") + end + else + _G.logger:info(nameOfModule .. ": No value update. Internal value does not exist.") + end + end + else + _G.logger:info(nameOfModule .. ": No value update. Internal value does not exist.") + end + else + _G.logger:info(nameOfModule .. ": No value update. Internal value does not exist.") + end + + else + -- No table content + local checkValue = persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterName] + local checkType = type(checkValue) + local newType = type(persistentData_Model.currentlySelectedParameterValue) + + if checkType == newType then + _G.logger:fine(nameOfModule .. ': Updated parameter "' .. tostring(persistentData_Model.currentlySelectedParameterName) .. '" with new value = ' .. tostring(persistentData_Model.currentlySelectedParameterValue)) + persistentData_Model.data[persistentData_Model.currentlySelectedDataSet][persistentData_Model.currentlySelectedParameterName] = persistentData_Model.currentlySelectedParameterValue + else + _G.logger:info(nameOfModule .. ": No value update. New value not of same type.") + end + end + else + _G.logger:info(nameOfModule .. ": No value available.") + end + Script.notifyEvent('PersistentData_OnNewParameterTableInfo', persistentData_Model.funcs.createJsonListForTableView(persistentData_Model.data[persistentData_Model.currentlySelectedDataSet], persistentData_Model.currentlySelectedParameterName)) + +end +Script.serveFunction('CSK_PersistentData.setNewValueToParameterViaUI', setNewValueToParameterViaUI) + +local function setModuleToSendParameters(selection) + _G.logger:fine(nameOfModule .. ': Select module ' .. tostring(selection) .. ' to send parameters.') + persistentData_Model.currentlySelectedModuleToLoadParameters = selection + local checkIfMulti = string.find(selection, 'Multi') + if checkIfMulti then + Script.notifyEvent('PersistentData_OnNewStatusSelectionIsMultiModule', true) + persistentData_Model.currentlySelectedModuleInstanceToLoadParameters = 1 + Script.notifyEvent('PersistentData_OnNewStatusSelectedModuleInstanceToSendParameter', 1) + else + Script.notifyEvent('PersistentData_OnNewStatusSelectionIsMultiModule', false) + persistentData_Model.currentlySelectedModuleInstanceToLoadParameters = 0 + Script.notifyEvent('PersistentData_OnNewStatusSelectedModuleInstanceToSendParameter', 0) + end +end +Script.serveFunction('CSK_PersistentData.setModuleToSendParameters', setModuleToSendParameters) + +local function setModuleInstanceToSendParameters(instance) + _G.logger:fine(nameOfModule .. ': Select instance ' .. tostring(instance) .. ' to send parameters.') + persistentData_Model.currentlySelectedModuleInstanceToLoadParameters = selection +end +Script.serveFunction('CSK_PersistentData.setModuleInstanceToSendParameters', setModuleInstanceToSendParameters) + +local function sendParameterToModuleViaUI() + local checkIfMulti = string.find(persistentData_Model.currentlySelectedModuleToLoadParameters, 'Multi') + if checkIfMulti and persistentData_Model.currentlySelectedModuleInstanceToLoadParameters ~= 0 then + Script.notifyEvent('PersistentData_OnNewStatusSendParametersToModule', persistentData_Model.currentlySelectedModuleToLoadParameters, persistentData_Model.currentlySelectedDataSet, persistentData_Model.currentlySelectedModuleInstanceToLoadParameters) + else + Script.notifyEvent('PersistentData_OnNewStatusSendParametersToModule', persistentData_Model.currentlySelectedModuleToLoadParameters, persistentData_Model.currentlySelectedDataSet) + end +end +Script.serveFunction('CSK_PersistentData.sendParameterToModuleViaUI', sendParameterToModuleViaUI) + +-------------------------------------------------- +-------------------------------------------------- +-------------------------------------------------- + local function removeParameterViaUI() - if currentSelectedParameters ~= '' then - _G.logger:fine(nameOfModule .. ': Remove parameter: ' .. tostring(currentSelectedParameters)) - persistentData_Model.removeParameter(currentSelectedParameters) - currentSelectedParameters = '' + if persistentData_Model.currentlySelectedDataSet ~= '' then + _G.logger:fine(nameOfModule .. ': Remove parameter: ' .. tostring(persistentData_Model.currentlySelectedDataSet)) + persistentData_Model.removeParameter(persistentData_Model.currentlySelectedDataSet) + persistentData_Model.currentlySelectedDataSet = '' tmrPersistendData:start() else _G.logger:info(nameOfModule .. ': Parameter to remove not available.') diff --git a/CSK_Module_PersistentData/scripts/Configuration/PersistentData/PersistentData_Model.lua b/CSK_Module_PersistentData/scripts/Configuration/PersistentData/PersistentData_Model.lua index ec39aba..5c72f12 100644 --- a/CSK_Module_PersistentData/scripts/Configuration/PersistentData/PersistentData_Model.lua +++ b/CSK_Module_PersistentData/scripts/Configuration/PersistentData/PersistentData_Model.lua @@ -28,6 +28,29 @@ persistentData_Model.initialLoading = false -- status to check if parameter data persistentData_Model.version = Engine.getCurrentAppVersion() -- Version of module persistentData_Model.moduleSaveCheck = {} -- Check if modules successfully send their parameters if they all were triggered to save +persistentData_Model.currentlySelectedDataSet = '' -- Selected DataSet of parameters +persistentData_Model.currentlySelectedParameterName = '' -- Name of selected parameter within parameter set via UI +persistentData_Model.currentlySelectedParameterNameOfTable = '' -- Name of selected table within parameter +persistentData_Model.currentlySelectedParameterNameOfSubTable = '' -- Name of selected subtable within parameter +persistentData_Model.currentlySelectedParameterWithinSubTable = '' -- Name of selected parameter within subtable +persistentData_Model.currentlySelectedParameterType = '' -- Data type of selected parameter within UI +persistentData_Model.currentlySelectedParameterNameTableList = '' -- Optional list of parameter names within selected parameter table +persistentData_Model.currentlySelectedParameterValue = '' -- Value of selected parameter within UI + +persistentData_Model.listOfCSKModules = {} -- List of available CSK modules +persistentData_Model.currentlySelectedModuleToLoadParameters = '' -- Selected module to trigger to load currently selected parameter + +for _, value in pairs(Engine.listApps()) do + local checkCSK = string.find(value, 'CSK_') + if checkCSK then + table.insert(persistentData_Model.listOfCSKModules, value) + end +end + +if #persistentData_Model.listOfCSKModules >= 1 then + persistentData_Model.currentlySelectedModuleToLoadParameters = persistentData_Model.listOfCSKModules[1] +end +persistentData_Model.currentlySelectedModuleInstanceToLoadParameters = 0 -- Optional instance of module to load parameters -- Handle processing to trigger other modules to load their specific parameters Script.startScript('CSK_Module_PersistentData_AsyncLoadData') -- Additional thread needed, as otherwise the module will block itself @@ -38,8 +61,7 @@ persistentData_Model.parameters.parameterNames = {} -- store table of what param persistentData_Model.parameters.loadOnReboot = {} -- store table if parameter should be loaded for module on app/device reboot persistentData_Model.parameters.totalInstances = {} -- store table of total instances to create for this module --- INFO: following functions can also be used like this in other modules -persistentData_Model.funcs = require('Configuration/PersistentData/helper/funcs') +persistentData_Model.funcs = require('Configuration/PersistentData/helper/funcs') -- Helper functions --************************************************************************** --********************** End Global Scope ********************************** diff --git a/CSK_Module_PersistentData/scripts/Configuration/PersistentData/helper/funcs.lua b/CSK_Module_PersistentData/scripts/Configuration/PersistentData/helper/funcs.lua index 0c8df55..b4d9a25 100644 --- a/CSK_Module_PersistentData/scripts/Configuration/PersistentData/helper/funcs.lua +++ b/CSK_Module_PersistentData/scripts/Configuration/PersistentData/helper/funcs.lua @@ -109,8 +109,9 @@ funcs.createJsonList = createJsonList --- Function to create a JSON string for dynamic table in UI ---@param content string[] Table with data entries +---@param selectedParam string? Selected row ---@return string jsonstring String list -local function createJsonListForTableView(content) +local function createJsonListForTableView(content, selectedParam) local orderedTable = {} local parameterList = {} @@ -120,7 +121,6 @@ local function createJsonListForTableView(content) end table.sort(orderedTable) for _, value in ipairs(orderedTable) do - if type(content[value]) == 'table' then local orderedSubTable = {} for m in pairs(content[value]) do @@ -129,17 +129,25 @@ local function createJsonListForTableView(content) table.sort(orderedSubTable) for _, subValue in ipairs(orderedSubTable) do + local isSelected = false + if value .. ' // ' .. tostring(subValue) == selectedParam then + isSelected = true + end if value == 'passwords' or string.find(value, 'password') or string.find(value, 'Password') then - table.insert(parameterList, {ParameterName = value .. ' // ' .. tostring(subValue), Value = '...Password...'}) + table.insert(parameterList, {ParameterName = value .. ' // ' .. tostring(subValue), Value = '...Password...', selected = isSelected}) else - table.insert(parameterList, {ParameterName = value .. ' // ' .. tostring(subValue), Value = tostring(content[value][subValue])}) + table.insert(parameterList, {ParameterName = value .. ' // ' .. tostring(subValue), Value = tostring(content[value][subValue]), selected = isSelected}) end end else + local isSelected = false + if value == selectedParam then + isSelected = true + end if value == 'passwords' or string.find(value, 'password') or string.find(value, 'Password') then - table.insert(parameterList, {ParameterName = value, Value = '...Password...'}) + table.insert(parameterList, {ParameterName = value, Value = '...Password...', selected = isSelected}) else - table.insert(parameterList, {ParameterName = value, Value = tostring(content[value])}) + table.insert(parameterList, {ParameterName = value, Value = tostring(content[value]), selected = isSelected}) end end end diff --git a/README.md b/README.md index 760223b..9953ec6 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,11 @@ Tested on |Device|Firmware|Module version| |--|--|--| +|SICK AppEngine|v1.7.0|v4.2.0| |SICK AppEngine|v1.7.0|v4.1.0| |SICK AppEngine|v1.5.0|v4.0.1| |InspectorP631|v4.2.1|v4.0.1| +|SIM1012|v2.4.2|v4.2.0| |SIM1012|v2.4.2|v4.1.0| |SIM1012|v2.2.0|v4.0.0| diff --git a/docu/CSK_Module_PersistentData.html b/docu/CSK_Module_PersistentData.html index 4bb84ed..f82fcae 100644 --- a/docu/CSK_Module_PersistentData.html +++ b/docu/CSK_Module_PersistentData.html @@ -6,7 +6,7 @@ -Documentation - CSK_Module_PersistentData 4.1.0 +Documentation - CSK_Module_PersistentData 4.2.0