Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def render_union(u):
value = get_union_value(u)
if 'boolean' in uavcan.get_active_union_field(u):
return bool(value)
if isinstance(value, int):
return value
if isinstance(value, float):
return round_float(value)
if 'uavcan.protocol.param.Empty' in str(value):
return ''
return value
def _extract_struct_fields(m):
if isinstance(m, uavcan.transport.CompoundValue):
out = CompactMessage(uavcan.get_uavcan_data_type(m).full_name)
for field_name, field in uavcan.get_fields(m).items():
if uavcan.is_union(m) and uavcan.get_active_union_field(m) != field_name:
continue
val = _extract_struct_fields(field)
if val is not None:
out._add_field(field_name, val)
return out
elif isinstance(m, uavcan.transport.ArrayValue):
# cannot say I'm breaking the rules
container = bytes if uavcan.get_uavcan_data_type(m).is_string_like else list
# if I can glue them back together
return container(filter(lambda x: x is not None, (_extract_struct_fields(item) for item in m)))
elif isinstance(m, uavcan.transport.PrimitiveValue):
return m.value
elif isinstance(m, (int, float, bool)):
return m
elif isinstance(m, uavcan.transport.VoidValue):
pass
def _assign(self, value_union):
value = get_union_value(value_union)
if uavcan.get_active_union_field(value_union) == 'real_value':
value = round_float(value)
if hasattr(self._value_widget, 'setValue'):
self._value_widget.setValue(value)
self._update_callback(value)
elif hasattr(self._value_widget, 'setChecked'):
self._value_widget.setChecked(bool(value))
self._update_callback(bool(value))
else:
self._value_widget.setText(str(value))
self._update_callback(value)
def indent_newline():
buf.write(os.linesep + ' ' * 2 * indent_level)
# Decomposing PrimitiveValue to value and type. This is ugly but it's by design...
if isinstance(obj, PrimitiveValue):
uavcan_type = uavcan.get_uavcan_data_type(obj)
obj = obj.value
# CompoundValue
if isinstance(obj, CompoundValue):
first_field = True
# Rendering all fields than can be rendered
for field_name, field in uavcan.get_fields(obj).items():
if uavcan.is_union(obj) and uavcan.get_active_union_field(obj) != field_name:
continue
if isinstance(field, VoidValue):
continue
if (first_field and indent_level > 0) or not first_field:
indent_newline()
first_field = False
rendered_field = _to_yaml_impl(field, indent_level=indent_level + 1, parent=obj, name=field_name)
write('%s: %s', field_name, rendered_field)
# Special case - empty non-union struct is rendered as empty map
if first_field and not uavcan.is_union(obj):
if indent_level > 0:
indent_newline()
write('{}')
# ArrayValue
self._node = node
self._target_node_id = target_node_id
self._param_struct = param_struct
self._update_callback = update_callback
min_val = get_union_value(param_struct.min_value)
if 'uavcan.protocol.param.Empty' in str(min_val):
min_val = None
max_val = get_union_value(param_struct.max_value)
if 'uavcan.protocol.param.Empty' in str(max_val):
max_val = None
value = get_union_value(param_struct.value)
self._value_widget = None
value_type = uavcan.get_active_union_field(param_struct.value)
if value_type == 'integer_value':
min_val = min_val if min_val is not None else -0x8000000000000000
max_val = max_val if max_val is not None else 0x7FFFFFFFFFFFFFFF
if min_val >= -0x80000000 and \
max_val <= +0x7FFFFFFF:
self._value_widget = QSpinBox(self)
self._value_widget.setMaximum(max_val)
self._value_widget.setMinimum(min_val)
self._value_widget.setValue(value)
if value_type == 'real_value':
min_val = round_float(min_val) if min_val is not None else -3.4028235e+38
max_val = round_float(max_val) if max_val is not None else 3.4028235e+38
value = round_float(value)
if value_type == 'boolean_value':
self._value_widget = QCheckBox(self)
def _do_send(self):
value_type = uavcan.get_active_union_field(self._param_struct.value)
try:
if value_type == 'integer_value':
if hasattr(self._value_widget, 'value'):
value = int(self._value_widget.value())
else:
value = int(self._value_widget.text())
self._param_struct.value.integer_value = value
elif value_type == 'real_value':
value = float(self._value_widget.text())
self._param_struct.value.real_value = value
elif value_type == 'boolean_value':
value = bool(self._value_widget.isChecked())
self._param_struct.value.boolean_value = value
elif value_type == 'string_value':
value = self._value_widget.text()
def get_union_value(u):
return getattr(u, uavcan.get_active_union_field(u))
def _to_json_compatible_object_impl(obj):
# Decomposing PrimitiveValue to value and type. This is ugly but it's by design...
if isinstance(obj, PrimitiveValue):
obj = obj.value
# CompoundValue
if isinstance(obj, CompoundValue):
output = dict()
for field_name, field in uavcan.get_fields(obj).items():
if uavcan.is_union(obj) and uavcan.get_active_union_field(obj) != field_name:
continue
if isinstance(field, VoidValue):
continue
output[field_name] = to_json_compatible_object(field)
return output
# ArrayValue
elif isinstance(obj, ArrayValue):
t = uavcan.get_uavcan_data_type(obj)
if t.value_type.category == t.value_type.CATEGORY_PRIMITIVE:
def is_nice_character(ch):
if ch.is_printable() or ch.isspace():
return True
if ch in b'\n\r\t':
return True