aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormorefigs <morefigs@gmail.com>2019-01-22 16:03:20 +1100
committermorefigs <morefigs@gmail.com>2019-01-22 16:03:20 +1100
commita96013435f3239e2780ee01173666dc004103d12 (patch)
tree6abf9426188d738f5a17d079c2a8704e6d6febf4
parent37464638be0c50de7c908f121d6309207435ad48 (diff)
downloadpymba-a96013435f3239e2780ee01173666dc004103d12.tar.gz
pymba-a96013435f3239e2780ee01173666dc004103d12.zip
clean up feature class
-rw-r--r--pymba/vimba_feature.py470
1 files changed, 177 insertions, 293 deletions
diff --git a/pymba/vimba_feature.py b/pymba/vimba_feature.py
index 3e838f0..d500d3d 100644
--- a/pymba/vimba_feature.py
+++ b/pymba/vimba_feature.py
@@ -1,19 +1,27 @@
-# -*- coding: utf-8 -*-
-from __future__ import absolute_import
-from . import vimba_structure as structs
-from .vimba_exception import VimbaException
-from .vimba_dll import VimbaDLL
-from ctypes import *
-
-# class may extend a generic Vimba entity class one day...
+from ctypes import byref, sizeof, c_uint32, c_double, c_char_p, c_bool, c_int64, create_string_buffer
+from typing import Tuple, List
+from .vimba_exception import VimbaException
+from . import vimba_c
-class VimbaFeature(object):
+class VimbaFeature:
"""
A feature of a Vimba object.
"""
+ (
+ _FEATURE_DATA_UNKNOWN,
+ _FEATURE_DATA_INT,
+ _FEATURE_DATA_FLOAT,
+ _FEATURE_DATA_ENUM,
+ _FEATURE_DATA_STRING,
+ _FEATURE_DATA_BOOL,
+ _FEATURE_DATA_COMMAND,
+ _FEATURE_DATA_RAW,
+ _FEATURE_DATA_NONE,
+ ) = range(9)
+
@property
def name(self):
return self._name.decode()
@@ -25,317 +33,193 @@ class VimbaFeature(object):
# lookup relevant function for feature type and pass to that function
@property
def value(self):
- return self._getSetTypeFuncs[self._info.featureDataType][0]()
+ return self._feature_data_value_funcs[self._info.featureDataType][0]()
@value.setter
def value(self, val):
- self._getSetTypeFuncs[self._info.featureDataType][1](val)
+ self._feature_data_value_funcs[self._info.featureDataType][1](val)
@property
def range(self):
- return self._rangeQueryTypeFuncs[self._info.featureDataType]()
+ return self._feature_data_range_funcs[self._info.featureDataType]()
def __init__(self, name, handle):
-
- # set name and handle
self._name = name.encode()
self._handle = handle
- # set own info
- self._info = self._getInfo()
-
# type functions dict for looking up correct get/set function to use
- self._getSetTypeFuncs = {0: (self._notYetImplemented, self._notYetImplemented), # todo
- 1: (self._getIntFeature, self._setIntFeature),
- 2: (self._getFloatFeature, self._setFloatFeature),
- 3: (self._getEnumFeature, self._setEnumFeature),
- 4: (self._getStringFeature, self._setStringFeature),
- 5: (self._getBoolFeature, self._setBoolFeature),
- # todo
- 6: (self._notYetImplemented, self._notYetImplemented),
- # todo
- 7: (self._notYetImplemented, self._notYetImplemented),
- 8: (self._notYetImplemented, self._notYetImplemented)} # todo
+ self._feature_data_value_funcs = {
+ self._FEATURE_DATA_UNKNOWN: None,
+ self._FEATURE_DATA_INT: (self._get_int, self._set_int),
+ self._FEATURE_DATA_FLOAT: (self._get_float, self._set_float),
+ self._FEATURE_DATA_ENUM: (self._get_enum, self._set_enum),
+ self._FEATURE_DATA_STRING: (self._get_string, self._set_string),
+ self._FEATURE_DATA_BOOL: (self._get_bool, self._set_bool),
+ self._FEATURE_DATA_COMMAND: None,
+ self._FEATURE_DATA_RAW: None,
+ self._FEATURE_DATA_NONE: None,
+ }
# type functions dict for looking up correct range function to use
- self._rangeQueryTypeFuncs = {0: self._unknownRange,
- 1: self._rangeQueryIntFeature,
- 2: self._rangeQueryFloatFeature,
- 3: self._rangeQueryEnumFeature,
- 4: self._unknownRange,
- 5: self._unknownRange,
- 6: self._unknownRange,
- 7: self._unknownRange,
- 8: self._unknownRange}
-
- def getInfo(self):
- """
- Get info of the feature.
-
- :returns: VimbaFeatureInfo object -- feature information..
- """
- return self._info
-
- def _getInfo(self):
- """
- Get info of the feature.
-
- :returns: VimbaFeatureInfo object -- feature information..
- """
- # args for Vimba call
- featureInfo = structs.VimbaFeatureInfo()
-
- # Vimba DLL will return an error code
- errorCode = VimbaDLL.featureInfoQuery(self._handle,
- self._name,
- byref(featureInfo),
- sizeof(featureInfo))
- if errorCode != 0:
- raise VimbaException(errorCode)
-
- return featureInfo
-
- def _notYetImplemented(self, val=None):
- """
- Raises exception if feature value type is not yet defined.
- """
- raise VimbaException(-1001)
-
- def _getIntFeature(self):
- """
- Get the value of an integer feature.
-
- :returns: int -- value of the specified feature.
- """
-
- # create args
- valueToGet = c_int64()
-
- errorCode = VimbaDLL.featureIntGet(self._handle,
- self._name,
- byref(valueToGet))
- if errorCode != 0:
- raise VimbaException(errorCode)
-
- return valueToGet.value
-
- def _setIntFeature(self, valueToSet):
- """
- Set the value of an integer feature.
-
- :param valueToSet: the int value to set for the feature.
- """
-
- errorCode = VimbaDLL.featureIntSet(self._handle,
- self._name,
- valueToSet)
- if errorCode != 0:
- raise VimbaException(errorCode)
-
- def _getFloatFeature(self):
- """
- Get the value of a float feature.
-
- :returns: float -- value of the specified feature.
- """
-
- # create args
- valueToGet = c_double()
-
- errorCode = VimbaDLL.featureFloatGet(self._handle,
- self._name,
- byref(valueToGet))
- if errorCode != 0:
- raise VimbaException(errorCode)
-
- return valueToGet.value
-
- def _setFloatFeature(self, valueToSet):
- """
- Set the value of a float feature.
-
- :param valueToSet: the float value to set for the feature.
- """
-
- errorCode = VimbaDLL.featureFloatSet(self._handle,
- self._name,
- valueToSet)
- if errorCode != 0:
- raise VimbaException(errorCode)
-
- def _getEnumFeature(self):
- """
- Get the value of an enum feature.
-
- :returns: enum -- value of the specified feature.
- """
-
- # create args
- valueToGet = c_char_p()
-
- errorCode = VimbaDLL.featureEnumGet(self._handle,
+ self._feature_data_range_funcs = {
+ self._FEATURE_DATA_UNKNOWN: None,
+ self._FEATURE_DATA_INT: self._range_query_int,
+ self._FEATURE_DATA_FLOAT: self._range_query_float,
+ self._FEATURE_DATA_ENUM: self._range_query_enum,
+ self._FEATURE_DATA_STRING: None,
+ self._FEATURE_DATA_BOOL: None,
+ self._FEATURE_DATA_COMMAND: None,
+ self._FEATURE_DATA_RAW: None,
+ self._FEATURE_DATA_NONE: None,
+ }
+
+ # get info once
+ self._info = self._get_info()
+
+ def _get_info(self) -> vimba_c.VmbFeatureInfo:
+ feature_info = vimba_c.VmbFeatureInfo()
+ error = vimba_c.vmb_feature_info_query(self._handle,
+ self._name,
+ byref(feature_info),
+ sizeof(feature_info))
+ if error:
+ raise VimbaException(error)
+
+ return feature_info
+
+ def _get_int(self) -> int:
+ value = c_int64()
+ error = vimba_c.vmb_feature_int_get(self._handle,
self._name,
- byref(valueToGet))
- if errorCode != 0:
- raise VimbaException(errorCode)
-
- return valueToGet.value.decode()
+ byref(value))
+ if error:
+ raise VimbaException(error)
- def _setEnumFeature(self, valueToSet):
- """
- Set the value of an enum feature.
+ return value.value
- :param valueToSet: the enum value to set for the feature.
- """
-
- errorCode = VimbaDLL.featureEnumSet(self._handle,
+ def _set_int(self, value: int) -> None:
+ error = vimba_c.vmb_feature_int_set(self._handle,
self._name,
- valueToSet.encode())
- if errorCode != 0:
- raise VimbaException(errorCode)
-
- def _getStringFeature(self):
- """
- Get the value of a string feature.
-
- :returns: string -- value of the specified feature.
- """
+ value)
+ if error:
+ raise VimbaException(error)
- # create args
- bufferSize = 256
- valueToGet = create_string_buffer('\000' * bufferSize)
- sizeFilled = c_uint32()
-
- errorCode = VimbaDLL.featureStringGet(self._handle,
+ def _get_float(self) -> float:
+ value = c_double()
+ error = vimba_c.vmb_feature_float_get(self._handle,
self._name,
- valueToGet,
- bufferSize,
- byref(sizeFilled))
- if errorCode != 0:
- raise VimbaException(errorCode)
- return valueToGet.value.decode()
-
- def _setStringFeature(self, valueToSet):
- """
- Set the value of a string feature.
+ byref(value))
+ if error:
+ raise VimbaException(error)
- :param valueToSet: the string value to set for the feature.
- """
+ return value.value
- errorCode = VimbaDLL.featureStringSet(self._handle,
+ def _set_float(self, value: float) -> None:
+ error = vimba_c.vmb_feature_float_set(self._handle,
self._name,
- valueToSet.encode())
- if errorCode != 0:
- raise VimbaException(errorCode)
-
- def _getBoolFeature(self):
- """
- Get the value of a bool feature.
-
- :returns: bool -- value of the specified feature.
- """
-
- # create args
- valueToGet = c_bool()
-
- errorCode = VimbaDLL.featureBoolGet(self._handle,
- self._name,
- byref(valueToGet))
- if errorCode != 0:
- raise VimbaException(errorCode)
+ value)
+ if error:
+ raise VimbaException(error)
- return valueToGet.value
-
- def _setBoolFeature(self, valueToSet):
- """
- Set the value of a bool feature.
-
- :param valueToSet: the bool value to set for the feature.
- """
-
- errorCode = VimbaDLL.featureBoolSet(self._handle,
- self._name,
- valueToSet)
- if errorCode != 0:
- raise VimbaException(errorCode)
-
- def _unknownRange(self):
- """
- Returns empty for ranges that have not been implemented.
- """
- return ''
-
- def _rangeQueryIntFeature(self):
- """
- Get the range of an int feature.
-
- :returns: tuple -- min and max range.
- """
-
- # create args
- minToGet = c_int64()
- maxToGet = c_int64()
-
- errorCode = VimbaDLL.featureIntRangeQuery(self._handle,
- self._name,
- byref(minToGet),
- byref(maxToGet))
- if errorCode != 0:
- raise VimbaException(errorCode)
-
- return int(str(minToGet.value)), int(str(maxToGet.value))
+ def _get_enum(self) -> str:
+ value = c_char_p()
+ error = vimba_c.vmb_feature_enum_get(self._handle,
+ self._name,
+ byref(value))
+ if error:
+ raise VimbaException(error)
- def _rangeQueryFloatFeature(self):
- """
- Get the range of a float feature.
+ return value.value.decode()
- :returns: tuple -- min and max range.
- """
+ def _set_enum(self, value: str):
+ error = vimba_c.vmb_feature_enum_set(self._handle,
+ self._name,
+ value.encode())
+ if error:
+ raise VimbaException(error)
+
+ def _get_string(self) -> str:
+ buffer_size = 256
+ value = create_string_buffer('\x00' * buffer_size)
+ size_filled = c_uint32()
+
+ error = vimba_c.vmb_feature_string_get(self._handle,
+ self._name,
+ value,
+ buffer_size,
+ byref(size_filled))
+ if error:
+ raise VimbaException(error)
+ return value.value.decode()
+
+ def _set_string(self, value: str) -> None:
+ error = vimba_c.vmb_feature_string_set(self._handle,
+ self._name,
+ value.encode())
+ if error:
+ raise VimbaException(error)
+
+ def _get_bool(self) -> bool:
+ value = c_bool()
+ error = vimba_c.vmb_feature_bool_get(self._handle,
+ self._name,
+ byref(value))
+ if error:
+ raise VimbaException(error)
- # create args
- minToGet = c_double()
- maxToGet = c_double()
+ return value.value
- errorCode = VimbaDLL.featureFloatRangeQuery(self._handle,
+ def _set_bool(self, value: bool):
+ error = vimba_c.vmb_feature_bool_set(self._handle,
+ self._name,
+ value)
+ if error:
+ raise VimbaException(error)
+
+ def _range_query_int(self) -> Tuple[int, int]:
+ range_min = c_int64()
+ range_max = c_int64()
+ error = vimba_c.vmb_feature_int_range_query(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.
- """
-
+ byref(range_min),
+ byref(range_max))
+ if error:
+ raise VimbaException(error)
+
+ return int(range_min.value), int(range_max.value)
+
+ def _range_query_float(self) -> Tuple[float, float]:
+ range_min = c_double()
+ range_max = c_double()
+ error = vimba_c.vmb_feature_float_range_query(self._handle,
+ self._name,
+ byref(range_min),
+ byref(range_max))
+ if error:
+ raise VimbaException(error)
+
+ return range_min.value, range_max.value
+
+ def _range_query_enum(self) -> List[str]:
# 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)
+ num_found = c_uint32(-1)
+ error = vimba_c.vmb_feature_enum_range_query(self._handle,
+ self._name,
+ None,
+ 0,
+ byref(num_found))
+ if error:
+ raise VimbaException(error)
+
+ # call again to get the actual enum names
+ num_enum_names = num_found.value
+ enum_names = (c_char_p * num_enum_names)()
+ error = vimba_c.vmb_feature_enum_range_query(self._handle,
+ self._name,
+ enum_names,
+ num_enum_names,
+ byref(num_found))
+ if error:
+ raise VimbaException(error)
+
+ return list(enum_name.decode() for enum_name in enum_names)