Skip to content

Commit f37a26a

Browse files
Release 6.1.0 (#2)
# Release 6.1.0 ## New features - Function to set image pool size - Check if persistent data to load provides all relevant parameters. Otherwise add default values. - React on "OnStopFlowConfigProviders" event of FlowConfig module to stop cameras ## Improvements - Prevent to change camera type via UI if camera is already connected
1 parent 7d6d5e0 commit f37a26a

12 files changed

Lines changed: 603 additions & 281 deletions

File tree

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
# Changelog
22
All notable changes to this project will be documented in this file.
33

4+
## Release 6.1.0
5+
6+
### New features
7+
- Function to set image pool size
8+
- Check if persistent data to load provides all relevant parameters. Otherwise add default values.
9+
- React on "OnStopFlowConfigProviders" event of FlowConfig module to stop cameras if in "Continuous Mode"
10+
11+
### Improvements
12+
- Prevent to change camera type via UI if camera is already connected
13+
414
## Release 6.0.0
515

616
### New features

CSK_Module_MultiRemoteCamera/pages/pages/CSK_Module_MultiRemoteCamera/CSK_Module_MultiRemoteCamera.html

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,11 @@
508508
path="param/args/status"
509509
auto-commit>
510510
</crown-binding>
511+
<crown-edpws-binding
512+
property="disabled"
513+
name="CSK_MultiRemoteCamera/OnCameraConnected"
514+
update-on-resume>
515+
</crown-edpws-binding>
511516
</davinci-toggle-switch>
512517
</layout-row>
513518
<stacked-view id="SV_GigEVision">
@@ -560,6 +565,11 @@
560565
protocol="crownMSGPACK"
561566
crown-path="camModel">
562567
</crown-set>
568+
<crown-edpws-binding
569+
property="disabled"
570+
name="CSK_MultiRemoteCamera/OnCameraConnected"
571+
update-on-resume>
572+
</crown-edpws-binding>
563573
</davinci-drop-down>
564574
</layout-column>
565575
</layout-row>
@@ -630,6 +640,45 @@
630640
update-on-resume>
631641
</crown-edpws-binding>
632642
</stacked-view>
643+
<layout-row id="RowLayout63"
644+
style="align-items: center">
645+
<layout-column id="ColumnLayout18"
646+
style="align-items: stretch">
647+
<davinci-value-display
648+
id="VD_ImagePoolSize"
649+
value="Image pool size:"
650+
title="Limits the number of images which can be acquired and used at the same time.">
651+
</davinci-value-display>
652+
</layout-column>
653+
<layout-column id="ColumnLayout19"
654+
style="align-items: stretch">
655+
<davinci-numeric-field
656+
id="NF_ImagePoolSize"
657+
type="outline" min="1"
658+
max="100" ticks="1"
659+
group-separator=","
660+
decimal-separator="."
661+
format-pattern="0"
662+
title="Limits the number of images which can be acquired and used at the same time.">
663+
<crown-binding
664+
event="change"
665+
name="CSK_MultiRemoteCamera/setImagePoolSize"
666+
path="param/args/size"
667+
auto-commit>
668+
</crown-binding>
669+
<crown-edpws-binding
670+
property="value"
671+
name="CSK_MultiRemoteCamera/OnNewImagePoolSize"
672+
update-on-resume>
673+
</crown-edpws-binding>
674+
<crown-edpws-binding
675+
property="disabled"
676+
name="CSK_MultiRemoteCamera/OnCameraConnected"
677+
update-on-resume>
678+
</crown-edpws-binding>
679+
</davinci-numeric-field>
680+
</layout-column>
681+
</layout-row>
633682
<layout-row id="RowLayout38"
634683
style="align-items: center">
635684
<layout-column id="ColumnLayout52"

CSK_Module_MultiRemoteCamera/project.mf.xml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,10 @@ INFO: Other modules can check via "Script.isServedAsEvent" if event of sepecific
326326
<desc>Notify if module can be used on device.</desc>
327327
<param desc="Status" multiplicity="1" name="status" type="bool"/>
328328
</event>
329+
<event name="OnNewImagePoolSize">
330+
<desc>Notfiy image pool size to use for camera.</desc>
331+
<param desc="Size" multiplicity="1" name="size" type="int"/>
332+
</event>
329333
<function name="pageCalled">
330334
<desc>Function to register "OnResume" of the module UI (only as helper function).</desc>
331335
<return desc="Empty string (only needed to simplify binding)." multiplicity="1" name="emptyString" type="string"/>
@@ -594,6 +598,14 @@ According to the selected model it will use some predefined GigE Vision paramete
594598
<function name="resetModule">
595599
<desc>Function to reset main configuration of module.</desc>
596600
</function>
601+
<function name="setImagePoolSize">
602+
<desc>Function to limit the number of images which can be acquired and used at the same time</desc>
603+
<param desc="Size of the internal image pool (default = 10)." multiplicity="1" name="size" type="int"/>
604+
</function>
605+
<function name="stopFlowConfigRelevantProvider">
606+
<desc>Function to stop FlowConfig relevant providers.</desc>
607+
<param desc="Instance of camera to stop." multiplicity="1" name="instance" type="int"/>
608+
</function>
597609
</serves>
598610
</crown>
599611
<crown name="MultiRemoteCamera_FC">
@@ -628,7 +640,7 @@ According to the selected model it will use some predefined GigE Vision paramete
628640
</crown>
629641
</crown>
630642
<meta key="author">SICK AG</meta>
631-
<meta key="version">6.0.0</meta>
643+
<meta key="version">6.1.0</meta>
632644
<meta key="priority">low</meta>
633645
<meta key="copy-protected">false</meta>
634646
<meta key="read-protected">false</meta>

CSK_Module_MultiRemoteCamera/scripts/Sensors/MultiRemoteCamera/FlowConfig/MultiRemoteCamera_FlowConfig.lua

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,19 @@ local function handleOnClearOldFlow()
2121
end
2222
Script.register('CSK_FlowConfig.OnClearOldFlow', handleOnClearOldFlow)
2323

24+
--- Function to react if FlowConfig was updated
25+
local function handleOnStopProvider()
26+
if _G.availableAPIs.default and _G.availableAPIs.imageProvider then
27+
for i = 1, #multiRemoteCamera_Instances do
28+
if multiRemoteCamera_Instances[i].parameters.flowConfigPriority then
29+
CSK_MultiRemoteCamera.stopFlowConfigRelevantProvider(i)
30+
break
31+
end
32+
end
33+
end
34+
end
35+
Script.register('CSK_FlowConfig.OnStopFlowConfigProviders', handleOnStopProvider)
36+
2437
--- Function to get access to the multiRemoteCamera_Instances
2538
---@param handle handle Handle of multiRemoteCamera_Instances object
2639
local function setMultiRemoteCamera_Instances_Handle(handle)

CSK_Module_MultiRemoteCamera/scripts/Sensors/MultiRemoteCamera/FlowConfig/MultiRemoteCamera_OnNewImage.lua

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,24 @@ local nameOfModule = 'CSK_MultiRemoteCamera'
88
-- Required to keep track of already allocated resource
99
local instanceTable = {}
1010

11+
--- Timer to start camera via FlowConfig if in CONTINUOUS (FIXED_FREQUENCY) mode
12+
local tmrStartCamera = Timer.create()
13+
tmrStartCamera:setExpirationTime(5000)
14+
tmrStartCamera:setPeriodic(false)
15+
16+
--- Function to start camera via FlowConig
17+
local function handleOnExpired()
18+
local amount = CSK_MultiRemoteCamera.getInstancesAmount()
19+
for i=1, amount do
20+
CSK_MultiRemoteCamera.setSelectedInstance(i)
21+
local mode = CSK_MultiRemoteCamera.getAcquisitionMode()
22+
if mode == 'FIXED_FREQUENCY' then
23+
CSK_MultiRemoteCamera.startCamera()
24+
end
25+
end
26+
end
27+
Timer.register(tmrStartCamera, 'OnExpired', handleOnExpired)
28+
1129
local function register(handle, _ , callback)
1230

1331
Container.remove(handle, "CB_Function")
@@ -35,6 +53,8 @@ local function register(handle, _ , callback)
3553
end
3654
Script.register('CSK_FlowConfig.OnNewFlowConfig', localCallback)
3755

56+
tmrStartCamera:start()
57+
3858
return true
3959
end
4060
Script.serveFunction(BLOCK_NAMESPACE ..".register", register)

CSK_Module_MultiRemoteCamera/scripts/Sensors/MultiRemoteCamera/MultiRemoteCamera_Controller.lua

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ Script.serveEvent("CSK_MultiRemoteCamera.OnNewStatusSaveAllImagesActive", "Multi
9393
Script.serveEvent("CSK_MultiRemoteCamera.OnNewStatusTempImageActive", "MultiRemoteCamera_OnNewStatusTempImageActive")
9494
Script.serveEvent("CSK_MultiRemoteCamera.OnNewCameraOverviewTable", "MultiRemoteCamera_OnNewCameraOverviewTable")
9595
Script.serveEvent("CSK_MultiRemoteCamera.OnNewProcessingMode", "MultiRemoteCamera_OnNewProcessingMode")
96+
Script.serveEvent('CSK_MultiRemoteCamera.OnNewImagePoolSize', 'MultiRemoteCamera_OnNewImagePoolSize')
9697
Script.serveEvent("CSK_MultiRemoteCamera.OnNewSwitchMode", "MultiRemoteCamera_OnNewSwitchMode")
9798
Script.serveEvent("CSK_MultiRemoteCamera.OnNewMonitoring", "MultiRemoteCamera_OnNewMonitoring")
9899
Script.serveEvent("CSK_MultiRemoteCamera.OnNewMonitoringState", "MultiRemoteCamera_OnNewMonitoringState") --for UI
@@ -304,6 +305,7 @@ local function handleOnExpiredTmrCamera()
304305
Script.notifyEvent('MultiRemoteCamera_OnNewGigEVisionConfigTableContent', multiRemoteCamera_Instances[selectedInstance].gigEVisionConfigUITable)
305306
end
306307
end
308+
Script.notifyEvent('MultiRemoteCamera_OnNewImagePoolSize', multiRemoteCamera_Instances[selectedInstance].parameters.imagePoolSize)
307309
Script.notifyEvent('MultiRemoteCamera_OnNewMonitoring', multiRemoteCamera_Instances[selectedInstance].parameters.monitorCamera)
308310
Script.notifyEvent('MultiRemoteCamera_OnNewSwitchMode', multiRemoteCamera_Instances[selectedInstance].parameters.switchMode)
309311

@@ -522,6 +524,12 @@ local function getGigEVision()
522524
end
523525
Script.serveFunction("CSK_MultiRemoteCamera.getGigEVision", getGigEVision)
524526

527+
local function setImagePoolSize(size)
528+
_G.logger:fine(nameOfModule .. ": Set image pool size = " .. tostring(size))
529+
multiRemoteCamera_Instances[selectedInstance].parameters.imagePoolSize = size
530+
end
531+
Script.serveFunction('CSK_MultiRemoteCamera.setImagePoolSize', setImagePoolSize)
532+
525533
local function setSwitchMode (status)
526534
for i = 1, #multiRemoteCamera_Instances do
527535
multiRemoteCamera_Instances[i].parameters.switchMode = status
@@ -957,6 +965,14 @@ local function getStatusModuleActive()
957965
end
958966
Script.serveFunction('CSK_MultiRemoteCamera.getStatusModuleActive', getStatusModuleActive)
959967

968+
local function stopFlowConfigRelevantProvider(instance)
969+
if multiRemoteCamera_Instances[instance].parameters.acquisitionMode == 'FIXED_FREQUENCY' then
970+
setSelectedInstance(instance)
971+
stopCamera()
972+
end
973+
end
974+
Script.serveFunction('CSK_MultiRemoteCamera.stopFlowConfigRelevantProvider', stopFlowConfigRelevantProvider)
975+
960976
local function clearFlowConfigRelevantConfiguration()
961977
-- Nothing to do so far
962978
end
@@ -1007,6 +1023,9 @@ local function loadParameters()
10071023
if data then
10081024
_G.logger:info(nameOfModule .. ": Loaded parameters from CSK_PersistentData module.")
10091025
multiRemoteCamera_Instances[selectedInstance].parameters = helperFuncs.convertContainer2Table(data)
1026+
1027+
multiRemoteCamera_Instances[selectedInstance].parameters = helperFuncs.checkParameters(multiRemoteCamera_Instances[selectedInstance].parameters, helperFuncs.defaultParameters)
1028+
10101029
multiRemoteCamera_Instances[selectedInstance]:setNewConfig()
10111030
updateImageProcessingParameter()
10121031
pageCalled()

CSK_Module_MultiRemoteCamera/scripts/Sensors/MultiRemoteCamera/MultiRemoteCamera_Model.lua

Lines changed: 8 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -87,45 +87,12 @@ function multiRemoteCamera.create(cameraNo)
8787
self.triggerFunction = nil -- Internally used function to SW trigger the camera
8888

8989
self.parameters = {}
90-
self.parameters.flowConfigPriority = CSK_FlowConfig ~= nil or false -- Status if FlowConfig should have priority for FlowConfig relevant configurations
90+
self.parameters = require('Sensors/MultiRemoteCamera/MultiRemoteCamera_Parameters') -- Load default parameters
91+
92+
-- Instance specific parameters
9193
self.parameters.cameraNo = cameraNo -- Instance no of this camera
9294
self.parameters.camSum = cameraNo -- Amount of all cameras
93-
self.parameters.switchMode = false -- Is camera connected via switch to SIM?
94-
-- gigEvision or false -- GigE Vision camera?
95-
if _G.availableAPIs.GigEVision == true then
96-
self.parameters.gigEvision = true
97-
else
98-
self.parameters.gigEvision = false
99-
end
10095
self.parameters.cameraIP = '192.168.1.10' .. tostring(cameraNo-1) -- IP of camera
101-
self.parameters.shutterTime = 20000 -- Shutter time to use
102-
self.parameters.gain = 1.0 -- Gain
103-
self.parameters.framerate = 1 -- Frame rate in "FIXED_FREQUENCY" mode
104-
self.parameters.acquisitionMode = 'SOFTWARE_TRIGGER' -- 'FIXED_FREQUENCY' / 'SOFTWARE_TRIGGER' / 'HARDWARE_TRIGGER'
105-
self.parameters.swTriggerEvent = '' -- Opt. event to trigger camera in SW mode
106-
self.parameters.hardwareTriggerDelay = 0 -- Opt. delay for HW trigger
107-
self.parameters.triggerDelayBlockName = nil -- Name of specific delay bock within cFlow
108-
self.parameters.colorMode = 'MONO8' --'COLOR8' / 'MONO8' / 'RAW8'
109-
self.parameters.xStartFOV = 0 -- Field of view xStart
110-
self.parameters.xEndFOV = 100 -- Field of view xEnd
111-
self.parameters.yStartFOV = 0 -- Field of view yStart
112-
self.parameters.yEndFOV = 100 -- Field of view yEnd
113-
self.parameters.processingFile = 'CSK_MultiRemoteCamera_ImageProcessing' -- Script to use for processing in thread
114-
self.parameters.monitorCamera = false -- Opt. monitor camera status in "CameraOverview" UI
115-
self.parameters.customGigEVisionConfig = {} -- Custom GigEVision setting, content are 3 tables ".parameter", ".type", ".value"
116-
self.parameters.cameraModel = "PicoMidiCam2" -- 'a2A1920-51gcBAS', 'CustomConfig'
117-
118-
-- Image processing parameters
119-
self.parameters.processingMode = "BOTH" -- 'SCRIPT', 'APP', 'BOTH' --> see "setProcessingMode"
120-
self.parameters.maxImageQueueSize = 5 -- max. size of image queue
121-
self.parameters.savingImagePath = '/public/' -- path of images to save (SD or public)
122-
self.parameters.imageFilePrefix = 'Image_' -- prefix for images to be saved
123-
self.parameters.saveAllImages = false -- Save all incoming images
124-
self.parameters.tempSaveImage = false -- Save latest image to opt. save it later
125-
self.parameters.resizeFactor = 1.0 -- factor to resize the incoming image, 0.1 - 1.0
126-
self.parameters.imageSaveFormat = 'bmp' -- bmp / jpg / png
127-
self.parameters.imageSaveJpgFormatCompression = 90
128-
self.parameters.imageSavePngFormatCompression = 6
12996

13097
Script.serveEvent("CSK_MultiRemoteCamera.OnRegisterCamera" .. tostring(cameraNo), "MultiRemoteCamera_OnRegisterCamera" .. tostring(cameraNo), 'handle:1:Image.Provider.RemoteCamera')
13198
Script.serveEvent("CSK_MultiRemoteCamera.OnDeregisterCamera" .. tostring(cameraNo), "MultiRemoteCamera_OnDeregisterCamera" .. tostring(cameraNo), 'handle:1:Image.Provider.RemoteCamera')
@@ -201,6 +168,7 @@ end
201168
function multiRemoteCamera:connectCamera()
202169

203170
self.CameraProvider = Image.Provider.RemoteCamera.create()
171+
Image.Provider.RemoteCamera.setImagePoolSize(self.CameraProvider, self.parameters.imagePoolSize)
204172

205173
if self.parameters.gigEvision then
206174
self.CameraProvider:setType('GIGE_VISIONCAM')
@@ -265,7 +233,9 @@ end
265233

266234
--- Function to stop the camera
267235
function multiRemoteCamera:stopCamera()
268-
self.CameraProvider:stop()
236+
if self.CameraProvider then
237+
self.CameraProvider:stop()
238+
end
269239
end
270240

271241
--- Function to set new camera config
@@ -280,7 +250,7 @@ function multiRemoteCamera:setNewConfig()
280250
_G.logger:fine(nameOfModule .. ": GigEVision Config")
281251
_G.logger:fine(nameOfModule .. ": Camera-Model: " .. self.parameters.cameraModel)
282252
_G.logger:fine(nameOfModule .. ": Mode = " .. self.parameters.acquisitionMode)
283-
253+
284254
if self.parameters.cameraModel ~= "CustomConfig" then
285255
self.customCameraActive = false
286256
_G.logger:fine(nameOfModule .. ": Camera-Model: " .. self.parameters.cameraModel)

0 commit comments

Comments
 (0)