aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven <sven.riede@alliedvision.com>2018-02-12 16:02:57 +0100
committerSven <sven.riede@alliedvision.com>2018-02-12 16:02:57 +0100
commit1932a81e4c6a5f472c114f42bcc78f5bbdb7485a (patch)
tree17fe6b59376374f9ca43ef3c06140b9dd2134abf
parentf3d647264f59cbd49ff31d4d69c47d4c9f64a842 (diff)
downloadpymba-1932a81e4c6a5f472c114f42bcc78f5bbdb7485a.tar.gz
pymba-1932a81e4c6a5f472c114f42bcc78f5bbdb7485a.zip
- search for VimbaC DLL in current directory first
- function added for getting range of enum features (as strings)
-rw-r--r--pymba/vimbadll.py45
-rw-r--r--pymba/vimbafeature.py55
-rw-r--r--pymba/vimbaobject.py5
3 files changed, 69 insertions, 36 deletions
diff --git a/pymba/vimbadll.py b/pymba/vimbadll.py
index 5ea0288..ae8007a 100644
--- a/pymba/vimbadll.py
+++ b/pymba/vimbadll.py
@@ -12,21 +12,26 @@ from .vimbaexception import VimbaException
if sys_plat == "win32":
def find_win_dll(arch):
- """ Finds the highest versioned windows dll for the specified architecture. """
- bases = [
- r'C:\Program Files\Allied Vision Technologies\AVTVimba_%i.%i\VimbaC\Bin\Win%i\VimbaC.dll',
- r'C:\Program Files\Allied Vision\Vimba_%i.%i\VimbaC\Bin\Win%i\VimbaC.dll'
- ]
dlls = []
- for base in bases:
- for major in range(3):
- for minor in range(10):
- candidate = base % (major, minor, arch)
- if os.path.isfile(candidate):
- dlls.append(candidate)
+ candidate = r'.\VimbaC.dll'
+ if os.path.isfile(candidate):
+ # use local copy
+ dlls.append(candidate)
+ else:
+ """ Finds the highest versioned windows dll for the specified architecture. """
+ bases = [
+ r'C:\Program Files\Allied Vision Technologies\AVTVimba_%i.%i\VimbaC\Bin\Win%i\VimbaC.dll',
+ r'C:\Program Files\Allied Vision\Vimba_%i.%i\VimbaC\Bin\Win%i\VimbaC.dll'
+ ]
+ for base in bases:
+ for major in range(3):
+ for minor in range(10):
+ candidate = base % (major, minor, arch)
+ if os.path.isfile(candidate):
+ dlls.append(candidate)
if not dlls:
if 'VIMBA_HOME' in os.environ:
- candidate = os.environ ['VIMBA_HOME'] + '\VimbaC\Bin\Win%i\VimbaC.dll' % (arch)
+ candidate = os.path.join(os.environ ['VIMBA_HOME'], r'VimbaC\Bin\Win%i\VimbaC.dll' % (arch))
if os.path.isfile(candidate):
dlls.append(candidate)
if not dlls:
@@ -115,7 +120,7 @@ class VimbaDLL(object):
#
# -- VmbFeatureEnumGet()
# -- VmbFeatureEnumSet()
- # VmbFeatureEnumRangeQuery()
+ # -- VmbFeatureEnumRangeQuery()
# VmbFeatureEnumIsAvailable()
# VmbFeatureEnumAsInt()
# VmbFeatureEnumAsString()
@@ -160,7 +165,6 @@ class VimbaDLL(object):
# -- VmbRegistersWrite()
# Vimba C API DLL
-
_vimbaDLL = dll_loader.LoadLibrary(vimbaC_path)
# version query
@@ -303,6 +307,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 6692d80..97473ef 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/vimbaobject.py b/pymba/vimbaobject.py
index c4f803c..69a047c 100644
--- a/pymba/vimbaobject.py
+++ b/pymba/vimbaobject.py
@@ -134,10 +134,11 @@ 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
+ return VimbaFeature(featureName, self._handle).range
def runFeatureCommand(self, featureName):
"""