You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
516 lines
18 KiB
516 lines
18 KiB
#!/usr/bin/python
|
|
# -*- coding:utf-8 -*-
|
|
# -*-mode:python ; tab-width:4 -*- ex:set tabstop=4 shiftwidth=4 expandtab: -*-
|
|
|
|
#以下已废弃,请使用上面的类型
|
|
|
|
from .gxiapi import *
|
|
from .ImageProc import *
|
|
from .StatusProcessor import *
|
|
|
|
if sys.version_info.major > 2:
|
|
INT_TYPE = int
|
|
else:
|
|
INT_TYPE = (int, long)
|
|
|
|
class Feature:
|
|
def __init__(self, handle, feature):
|
|
"""
|
|
:param handle: The handle of the device
|
|
:param feature: The feature code ID
|
|
"""
|
|
self.__handle = handle
|
|
self.__feature = feature
|
|
self.feature_name = self.get_name()
|
|
|
|
def get_name(self):
|
|
"""
|
|
brief: Getting Feature Name
|
|
return: Success: feature name
|
|
Failed: convert feature ID to string
|
|
"""
|
|
status, name = gx_get_feature_name(self.__handle, self.__feature)
|
|
if status != GxStatusList.SUCCESS:
|
|
name = (hex(self.__feature)).__str__()
|
|
|
|
return name
|
|
|
|
def is_implemented(self):
|
|
"""
|
|
brief: Determining whether the feature is implemented
|
|
return: is_implemented
|
|
"""
|
|
status, is_implemented = gx_is_implemented(self.__handle, self.__feature)
|
|
if status == GxStatusList.SUCCESS:
|
|
return is_implemented
|
|
elif status == GxStatusList.INVALID_PARAMETER:
|
|
return False
|
|
else:
|
|
StatusProcessor.process(status, 'Feature', 'is_implemented')
|
|
|
|
def is_readable(self):
|
|
"""
|
|
brief: Determining whether the feature is readable
|
|
return: is_readable
|
|
"""
|
|
implemented = self.is_implemented()
|
|
if not implemented:
|
|
return False
|
|
|
|
status, is_readable = gx_is_readable(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'Feature', 'is_readable')
|
|
return is_readable
|
|
|
|
def is_writable(self):
|
|
"""
|
|
brief: Determining whether the feature is writable
|
|
return: is_writable
|
|
"""
|
|
implemented = self.is_implemented()
|
|
if not implemented:
|
|
return False
|
|
|
|
status, is_writable = gx_is_writable(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'Feature', 'is_writable')
|
|
return is_writable
|
|
|
|
|
|
class IntFeature(Feature):
|
|
def __init__(self, handle, feature):
|
|
"""
|
|
:param handle: The handle of the device
|
|
:param feature: The feature code ID
|
|
"""
|
|
Feature.__init__(self, handle, feature)
|
|
self.__handle = handle
|
|
self.__feature = feature
|
|
|
|
def __range_dict(self, int_range):
|
|
"""
|
|
:brief Convert GxIntRange to dictionary
|
|
:param int_range: GxIntRange
|
|
:return: range_dicts
|
|
"""
|
|
range_dicts = {
|
|
"min": int_range.min,
|
|
"max": int_range.max,
|
|
"inc": int_range.inc
|
|
}
|
|
return range_dicts
|
|
|
|
def get_range(self):
|
|
"""
|
|
:brief Getting integer range
|
|
:return: integer range dictionary
|
|
"""
|
|
implemented = self.is_implemented()
|
|
if not implemented:
|
|
#print("%s.get_range is not support" % self.feature_name)
|
|
raise NoImplemented("%s.get_range is not support" % self.feature_name)
|
|
|
|
status, int_range = gx_get_int_range(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'IntFeature', 'get_range')
|
|
return self.__range_dict(int_range)
|
|
|
|
def get(self):
|
|
"""
|
|
:brief Getting integer value
|
|
:return: integer value
|
|
"""
|
|
readable = self.is_readable()
|
|
if not readable:
|
|
#print("%s.get is not readable" % self.feature_name)
|
|
raise InvalidAccess("%s.get is not readable" % self.feature_name)
|
|
|
|
status, int_value = gx_get_int(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'IntFeature', 'get')
|
|
return int_value
|
|
|
|
def set(self, int_value):
|
|
"""
|
|
:brief Setting integer value
|
|
:param int_value
|
|
:return: None
|
|
"""
|
|
if not isinstance(int_value, INT_TYPE):
|
|
raise ParameterTypeError("IntFeature.set: "
|
|
"Expected int_value type is int, not %s" % type(int_value))
|
|
|
|
writeable = self.is_writable()
|
|
if not writeable:
|
|
#print("%s.set: is not writeable" % self.feature_name)
|
|
raise InvalidAccess("%s.set: is not writeable" % self.feature_name)
|
|
|
|
int_range = self.get_range()
|
|
check_ret = range_check(int_value, int_range["min"], int_range["max"], int_range["inc"])
|
|
if not check_ret:
|
|
#print("IntFeature.set: "
|
|
# "int_value out of bounds, %s.range=[%d, %d, %d]" %
|
|
# (self.feature_name, int_range["min"], int_range["max"], int_range["inc"]))
|
|
raise OutOfRange("IntFeature.set: "
|
|
"int_value out of bounds, %s.range=[%d, %d, %d]" %
|
|
(self.feature_name, int_range["min"], int_range["max"], int_range["inc"]))
|
|
return
|
|
|
|
status = gx_set_int(self.__handle, self.__feature, int_value)
|
|
StatusProcessor.process(status, 'IntFeature', 'set')
|
|
|
|
|
|
class FloatFeature(Feature):
|
|
def __init__(self, handle, feature):
|
|
"""
|
|
:param handle: The handle of the device
|
|
:param feature: The feature code ID
|
|
"""
|
|
Feature.__init__(self, handle, feature)
|
|
self.__handle = handle
|
|
self.__feature = feature
|
|
|
|
def __range_dict(self, float_range):
|
|
"""
|
|
:brief Convert GxFloatRange to dictionary
|
|
:param float_range: GxFloatRange
|
|
:return: range_dicts
|
|
"""
|
|
range_dicts = {
|
|
"min": float_range.min,
|
|
"max": float_range.max,
|
|
"inc": float_range.inc,
|
|
"unit": string_decoding(float_range.unit),
|
|
"inc_is_valid": float_range.inc_is_valid
|
|
}
|
|
return range_dicts
|
|
|
|
def get_range(self):
|
|
"""
|
|
:brief Getting float range
|
|
:return: float range dictionary
|
|
"""
|
|
implemented = self.is_implemented()
|
|
if not implemented:
|
|
#print("%s.get_range is not support" % self.feature_name)
|
|
raise NoImplemented("%s.get_range is not support" % self.feature_name)
|
|
|
|
status, float_range = gx_get_float_range(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'FloatFeature', 'get_range')
|
|
return self.__range_dict(float_range)
|
|
|
|
def get(self):
|
|
"""
|
|
:brief Getting float value
|
|
:return: float value
|
|
"""
|
|
readable = self.is_readable()
|
|
if not readable:
|
|
#print("%s.get: is not readable" % self.feature_name)
|
|
raise InvalidAccess("%s.get: is not readable" % self.feature_name)
|
|
|
|
status, float_value = gx_get_float(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'FloatFeature', 'get')
|
|
return float_value
|
|
|
|
def set(self, float_value):
|
|
"""
|
|
:brief Setting float value
|
|
:param float_value
|
|
:return: None
|
|
"""
|
|
if not isinstance(float_value, (INT_TYPE, float)):
|
|
raise ParameterTypeError("FloatFeature.set: "
|
|
"Expected float_value type is float, not %s" % type(float_value))
|
|
|
|
writeable = self.is_writable()
|
|
if not writeable:
|
|
#print("%s.set: is not writeable" % self.feature_name)
|
|
raise InvalidAccess("%s.set: is not writeable" % self.feature_name)
|
|
|
|
float_range = self.get_range()
|
|
check_ret = range_check(float_value, float_range["min"], float_range["max"])
|
|
if not check_ret:
|
|
#print("FloatFeature.set: float_value out of bounds, %s.range=[%f, %f]" %
|
|
# (self.feature_name, float_range["min"], float_range["max"]))
|
|
raise OutOfRange("FloatFeature.set: float_value out of bounds, %s.range=[%f, %f]" %
|
|
(self.feature_name, float_range["min"], float_range["max"]))
|
|
return
|
|
|
|
status = gx_set_float(self.__handle, self.__feature, float_value)
|
|
StatusProcessor.process(status, 'FloatFeature', 'set')
|
|
|
|
|
|
class EnumFeature(Feature):
|
|
def __init__(self, handle, feature):
|
|
"""
|
|
:param handle: The handle of the device
|
|
:param feature: The feature code ID
|
|
"""
|
|
Feature.__init__(self, handle, feature)
|
|
self.__handle = handle
|
|
self.__feature = feature
|
|
|
|
def get_range(self):
|
|
"""
|
|
:brief Getting range of Enum feature
|
|
:return: enum_dict: enum range dictionary
|
|
"""
|
|
implemented = self.is_implemented()
|
|
if not implemented:
|
|
#print("%s.get_range: is not support" % self.feature_name)
|
|
raise NoImplemented("%s.get_range: is not support" % self.feature_name)
|
|
|
|
status, enum_num = gx_get_enum_entry_nums(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'EnumFeature', 'get_range')
|
|
|
|
status, enum_list = gx_get_enum_description(self.__handle, self.__feature, enum_num)
|
|
StatusProcessor.process(status, 'EnumFeature', 'get_range')
|
|
|
|
enum_dict = {}
|
|
for i in range(enum_num):
|
|
enum_dict[string_decoding(enum_list[i].symbolic)] = enum_list[i].value
|
|
|
|
return enum_dict
|
|
|
|
def get(self):
|
|
"""
|
|
:brief Getting value of Enum feature
|
|
:return: enum_value: enum value
|
|
enum_str: string for enum description
|
|
"""
|
|
readable = self.is_readable()
|
|
if not readable:
|
|
#print("%s.get: is not readable" % self.feature_name)
|
|
raise InvalidAccess("%s.get: is not readable" % self.feature_name)
|
|
|
|
status, enum_value = gx_get_enum(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'EnumFeature', 'get')
|
|
|
|
range_dict = self.get_range()
|
|
new_dicts = {v: k for k, v in range_dict.items()}
|
|
return enum_value, new_dicts[enum_value]
|
|
|
|
def set(self, enum_value):
|
|
"""
|
|
:brief Setting enum value
|
|
:param enum_value
|
|
:return: None
|
|
"""
|
|
if not isinstance(enum_value, INT_TYPE):
|
|
raise ParameterTypeError("EnumFeature.set: "
|
|
"Expected enum_value type is int, not %s" % type(enum_value))
|
|
|
|
writeable = self.is_writable()
|
|
if not writeable:
|
|
#print("%s.set: is not writeable" % self.feature_name)
|
|
raise InvalidAccess("%s.set: is not writeable" % self.feature_name)
|
|
|
|
range_dict = self.get_range()
|
|
enum_value_list = range_dict.values()
|
|
if enum_value not in enum_value_list:
|
|
#print("EnumFeature.set: enum_value out of bounds, %s.range:%s" %
|
|
# (self.feature_name, range_dict.__str__()))
|
|
raise OutOfRange("EnumFeature.set: enum_value out of bounds, %s.range:%s" %
|
|
(self.feature_name, range_dict.__str__()))
|
|
return
|
|
|
|
status = gx_set_enum(self.__handle, self.__feature, enum_value)
|
|
StatusProcessor.process(status, 'EnumFeature', 'set')
|
|
|
|
|
|
class BoolFeature(Feature):
|
|
def __init__(self, handle, feature):
|
|
"""
|
|
:param handle: The handle of the device
|
|
:param feature: The feature code ID
|
|
"""
|
|
Feature.__init__(self, handle, feature)
|
|
self.__handle = handle
|
|
self.__feature = feature
|
|
|
|
def get(self):
|
|
"""
|
|
:brief Getting bool value
|
|
:return: bool value[bool]
|
|
"""
|
|
readable = self.is_readable()
|
|
if not readable:
|
|
# print("%s.get is not readable" % self.feature_name)
|
|
raise InvalidAccess("%s.get is not readable" % self.feature_name)
|
|
|
|
status, bool_value = gx_get_bool(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'BoolFeature', 'get')
|
|
return bool_value
|
|
|
|
def set(self, bool_value):
|
|
"""
|
|
:brief Setting bool value
|
|
:param bool_value[bool]
|
|
:return: None
|
|
"""
|
|
if not isinstance(bool_value, bool):
|
|
raise ParameterTypeError("BoolFeature.set: "
|
|
"Expected bool_value type is bool, not %s" % type(bool_value))
|
|
|
|
writeable = self.is_writable()
|
|
if not writeable:
|
|
#print("%s.set: is not writeable" % self.feature_name)
|
|
raise InvalidAccess("%s.set: is not writeable" % self.feature_name)
|
|
|
|
status = gx_set_bool(self.__handle, self.__feature, bool_value)
|
|
StatusProcessor.process(status, 'BoolFeature', 'set')
|
|
|
|
|
|
class StringFeature(Feature):
|
|
def __init__(self, handle, feature):
|
|
"""
|
|
:param handle: The handle of the device
|
|
:param feature: The feature code ID
|
|
"""
|
|
Feature.__init__(self, handle, feature)
|
|
self.__handle = handle
|
|
self.__feature = feature
|
|
|
|
def get_string_max_length(self):
|
|
"""
|
|
:brief Getting the maximum length that string can set
|
|
:return: length: the maximum length that string can set
|
|
"""
|
|
implemented = self.is_implemented()
|
|
if not implemented:
|
|
#print("%s.get_string_max_length is not support" % self.feature_name)
|
|
raise NoImplemented("%s.get_string_max_length is not support" % self.feature_name)
|
|
|
|
status, length = gx_get_string_max_length(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'StringFeature', 'get_string_max_length')
|
|
return length
|
|
|
|
def get(self):
|
|
"""
|
|
:brief Getting string value
|
|
:return: strings
|
|
"""
|
|
readable = self.is_readable()
|
|
if not readable:
|
|
#print("%s.get is not readable" % self.feature_name)
|
|
raise InvalidAccess("%s.get is not readable" % self.feature_name)
|
|
|
|
status, strings = gx_get_string(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'StringFeature', 'get')
|
|
return strings
|
|
|
|
def set(self, input_string):
|
|
"""
|
|
:brief Setting string value
|
|
:param input_string[string]
|
|
:return: None
|
|
"""
|
|
if not isinstance(input_string, str):
|
|
raise ParameterTypeError("StringFeature.set: "
|
|
"Expected input_string type is str, not %s" % type(input_string))
|
|
|
|
writeable = self.is_writable()
|
|
if not writeable:
|
|
#print("%s.set: is not writeable" % self.feature_name)
|
|
raise InvalidAccess("%s.set: is not writeable" % self.feature_name)
|
|
|
|
max_length = self.get_string_max_length()
|
|
if input_string.__len__() > max_length:
|
|
#print("StringFeature.set: " "input_string length out of bounds, %s.length_max:%s" % (self.feature_name, max_length))
|
|
raise OutOfRange("StringFeature.set: "
|
|
"input_string length out of bounds, %s.length_max:%s"
|
|
% (self.feature_name, max_length))
|
|
return
|
|
|
|
status = gx_set_string(self.__handle, self.__feature, input_string)
|
|
StatusProcessor.process(status, 'StringFeature', 'set')
|
|
|
|
|
|
class BufferFeature(Feature):
|
|
def __init__(self, handle, feature):
|
|
"""
|
|
:param handle: The handle of the device
|
|
:param feature: The feature code ID
|
|
"""
|
|
Feature.__init__(self, handle, feature)
|
|
self.__handle = handle
|
|
self.__feature = feature
|
|
|
|
def get_buffer_length(self):
|
|
"""
|
|
:brief Getting buffer length
|
|
:return: length: buffer length
|
|
"""
|
|
implemented = self.is_implemented()
|
|
if not implemented:
|
|
#print("%s.get_buffer_length is not support" % self.feature_name)
|
|
raise NoImplemented("%s.get_buffer_length is not support" % self.feature_name)
|
|
|
|
status, length = gx_get_buffer_length(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'BuffFeature', 'get_buffer_length')
|
|
return length
|
|
|
|
def get_buffer(self):
|
|
"""
|
|
:brief Getting buffer data
|
|
:return: Buffer object
|
|
|
|
"""
|
|
readable = self.is_readable()
|
|
if not readable:
|
|
#print("%s.get_buffer is not readable" % self.feature_name)
|
|
raise InvalidAccess("%s.get_buffer is not readable" % self.feature_name)
|
|
|
|
status, buf = gx_get_buffer(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'BuffFeature', 'get_buffer')
|
|
return Buffer(buf)
|
|
|
|
def set_buffer(self, buf):
|
|
"""
|
|
:brief Setting buffer data
|
|
:param buf: Buffer object
|
|
:return: None
|
|
"""
|
|
if not isinstance(buf, Buffer):
|
|
raise ParameterTypeError("BuffFeature.set_buffer: "
|
|
"Expected buff type is Buffer, not %s" % type(buf))
|
|
|
|
writeable = self.is_writable()
|
|
if not writeable:
|
|
#print("%s.set_buffer is not writeable" % self.feature_name)
|
|
raise InvalidAccess("%s.set_buffer is not writeable" % self.feature_name)
|
|
|
|
max_length = self.get_buffer_length()
|
|
if buf.get_length() > max_length:
|
|
#print("BuffFeature.set_buffer: "
|
|
# "buff length out of bounds, %s.length_max:%s" % (self.feature_name, max_length))
|
|
raise OutOfRange("BuffFeature.set_buffer: "
|
|
"buff length out of bounds, %s.length_max:%s" % (self.feature_name, max_length))
|
|
return
|
|
|
|
status = gx_set_buffer(self.__handle, self.__feature,
|
|
buf.get_ctype_array(), buf.get_length())
|
|
StatusProcessor.process(status, 'BuffFeature', 'set_buffer')
|
|
|
|
|
|
class CommandFeature(Feature):
|
|
def __init__(self, handle, feature):
|
|
"""
|
|
:param handle: The handle of the device
|
|
:param feature: The feature code ID
|
|
"""
|
|
Feature.__init__(self, handle, feature)
|
|
self.__handle = handle
|
|
self.__feature = feature
|
|
|
|
def send_command(self):
|
|
"""
|
|
:brief Sending command
|
|
:return: None
|
|
"""
|
|
implemented = self.is_implemented()
|
|
if not implemented:
|
|
#print("%s.send_command is not support" % self.feature_name)
|
|
raise NoImplemented("%s.send_command is not support" % self.feature_name)
|
|
|
|
status = gx_send_command(self.__handle, self.__feature)
|
|
StatusProcessor.process(status, 'CommandFeature', 'send_command')
|
|
|