aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormorefigs <morefigs@gmail.com>2018-03-28 20:46:54 +1100
committerGitHub <noreply@github.com>2018-03-28 20:46:54 +1100
commita6511997853e5ec8ae9f3abfcc66f097062a3062 (patch)
tree77836ef10893bd519f4734d2fcf7c6c08eed99f4
parent046398c35b660f15235ad141134122afb9e16fcc (diff)
parent98b15822dab1d8cbfd0bb5f1a72827ae63483899 (diff)
downloadpymba-a6511997853e5ec8ae9f3abfcc66f097062a3062.tar.gz
pymba-a6511997853e5ec8ae9f3abfcc66f097062a3062.zip
Merge pull request #65 from seahawk67/master
Support for enum feature range added.
-rw-r--r--pymba/tests/test_enumfeature.py25
-rw-r--r--pymba/vimbadll.py16
-rw-r--r--pymba/vimbafeature.py55
-rw-r--r--pymba/vimbaframe.py1
-rw-r--r--pymba/vimbaobject.py3
5 files changed, 77 insertions, 23 deletions
diff --git a/pymba/tests/test_enumfeature.py b/pymba/tests/test_enumfeature.py
new file mode 100644
index 0000000..7f9dd4c
--- /dev/null
+++ b/pymba/tests/test_enumfeature.py
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+from __future__ import absolute_import, print_function, division
+from pymba import *
+
+
+def test_enumfeature():
+ # get system object
+ with Vimba() as vimba:
+ system = vimba.getSystem()
+
+ # get enum value
+ print ("get enum value (DiscoveryCameraEvent): '%s'" % (system.DiscoveryCameraEvent))
+
+ # get enum range
+ range = system.getFeatureRange('DiscoveryCameraEvent')
+ print ("get enum value range (DiscoveryCameraEvent): '%s'" % (str(range)))
+
+ # set enum value
+ #print ("setting enum value (DiscoveryCameraEvent)...")
+ #system.DiscoveryCameraEvent = 'Unreachable'
+ #print ("enum value (DiscoveryCameraEvent)set to '%s'." % (system.DiscoveryCameraEvent.value))
+
+
+if __name__ == '__main__':
+ test_enumfeature() \ No newline at end of file
diff --git a/pymba/vimbadll.py b/pymba/vimbadll.py
index fb49fec..a6b9f3c 100644
--- a/pymba/vimbadll.py
+++ b/pymba/vimbadll.py
@@ -115,7 +115,7 @@ class VimbaDLL(object):
#
# -- VmbFeatureEnumGet()
# -- VmbFeatureEnumSet()
- # VmbFeatureEnumRangeQuery()
+ # -- VmbFeatureEnumRangeQuery()
# VmbFeatureEnumIsAvailable()
# VmbFeatureEnumAsInt()
# VmbFeatureEnumAsString()
@@ -160,7 +160,6 @@ class VimbaDLL(object):
# -- VmbRegistersWrite()
# Vimba C API DLL
-
_vimbaDLL = dll_loader.LoadLibrary(vimbaC_path)
# version query
@@ -303,6 +302,19 @@ class VimbaDLL(object):
c_char_p,
c_char_p) # value to set
+ # query the range of values of the feature
+ featureEnumRangeQuery = _vimbaDLL.VmbFeatureEnumRangeQuery
+ featureEnumRangeQuery.restype = c_int32
+ featureEnumRangeQuery.argtypes = (c_void_p, # handle
+ # name of the feature
+ c_char_p,
+ # pointer to enum names (array)
+ POINTER(c_char_p),
+ # array length
+ c_uint32,
+ # pointer to num enum names found
+ POINTER(c_uint32))
+
# get the string value of a feature
featureStringGet = _vimbaDLL.VmbFeatureStringGet
featureStringGet.restype = c_int32
diff --git a/pymba/vimbafeature.py b/pymba/vimbafeature.py
index 2881d53..88275ce 100644
--- a/pymba/vimbafeature.py
+++ b/pymba/vimbafeature.py
@@ -61,7 +61,7 @@ class VimbaFeature(object):
self._rangeQueryTypeFuncs = {0: self._unknownRange,
1: self._rangeQueryIntFeature,
2: self._rangeQueryFloatFeature,
- 3: self._unknownRange,
+ 3: self._rangeQueryEnumFeature,
4: self._unknownRange,
5: self._unknownRange,
6: self._unknownRange,
@@ -305,22 +305,37 @@ class VimbaFeature(object):
return (minToGet.value, maxToGet.value)
- # def _rangeQueryEnumFeature(self):
- # """
- # Get the range of an enum feature.
- #
- # :returns: tuple -- min and max range.
- # """
- #
- # create args
- # minToGet = c_uint32()
- # maxToGet = c_uint32()
- #
- # errorCode = VimbaDLL.featureEnumRangeQuery(self._handle,
- # self._name,
- # byref(minToGet),
- # byref(maxToGet))
- # if errorCode != 0:
- # raise VimbaException(errorCode)
- #
- # return (minToGet.value, maxToGet.value)
+ def _rangeQueryEnumFeature(self):
+ """
+ Get the range of an enum feature.
+ :returns: list -- enum names for the given feature.
+ """
+
+ # call once to get number of available enum names
+ # Vimba DLL will return an error code
+ numFound = c_uint32(-1)
+ errorCode = VimbaDLL.featureEnumRangeQuery(self._handle,
+ self._name,
+ None,
+ 0,
+ byref(numFound))
+ if errorCode != 0:
+ raise VimbaException(errorCode)
+
+ # number of names specified by Vimba
+ numEnumNames = numFound.value
+
+ # args
+ enumNamesArray = (c_char_p * numEnumNames)()
+
+ # call again to get the enum names
+ # Vimba DLL will return an error code
+ errorCode = VimbaDLL.featureEnumRangeQuery(self._handle,
+ self._name,
+ enumNamesArray,
+ numEnumNames,
+ byref(numFound))
+ if errorCode != 0:
+ raise VimbaException(errorCode)
+
+ return list(enumName.decode() for enumName in enumNamesArray)
diff --git a/pymba/vimbaframe.py b/pymba/vimbaframe.py
index 83fd9de..a95f6a7 100644
--- a/pymba/vimbaframe.py
+++ b/pymba/vimbaframe.py
@@ -22,6 +22,7 @@ PIXEL_FORMATS = {
"Mono12Packed": 1.5, # ?
"Mono14": 2,
"Mono16": 2,
+ "RGB8": 3,
"RGB8Packed": 3,
"BGR8Packed": 3,
"RGBA8Packed": 4,
diff --git a/pymba/vimbaobject.py b/pymba/vimbaobject.py
index c4f803c..695a011 100644
--- a/pymba/vimbaobject.py
+++ b/pymba/vimbaobject.py
@@ -134,7 +134,8 @@ class VimbaObject(object):
:param featureName: name of the feature to query.
- :returns: tuple -- range as (feature min value, feature max value).
+ :returns: tuple -- range as (feature min value, feature max value, for int or float features only).
+ list -- names of possible enum values (for enum features only).
"""
# can't cache this, need to look it up live
return VimbaFeature(featureName.encode(), self._handle).range