diff options
| author | Sven <sven.riede@alliedvision.com> | 2018-02-12 16:02:57 +0100 |
|---|---|---|
| committer | Sven <sven.riede@alliedvision.com> | 2018-02-12 16:02:57 +0100 |
| commit | 1932a81e4c6a5f472c114f42bcc78f5bbdb7485a (patch) | |
| tree | 17fe6b59376374f9ca43ef3c06140b9dd2134abf | |
| parent | f3d647264f59cbd49ff31d4d69c47d4c9f64a842 (diff) | |
| download | pymba-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.py | 45 | ||||
| -rw-r--r-- | pymba/vimbafeature.py | 55 | ||||
| -rw-r--r-- | pymba/vimbaobject.py | 5 |
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): """ |
