Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def callback(event):
nonlocal result
if event is not None:
logger.debug('Response %r from %d\n%s',
uavcan.get_uavcan_data_type(event.response),
event.transfer.source_node_id,
uavcan.to_yaml(event.response))
assert event.transfer.source_node_id == dest_node_id
result = event.response
else:
raise Node.TimeoutException('Request to node %d with payload %r has timed out in %.3f seconds' %
(dest_node_id, payload, timeout or uavcan.node.DEFAULT_SERVICE_TIMEOUT))
logger.debug('Synchronously requesting %r from %d\n%s',
uavcan.get_uavcan_data_type(payload), dest_node_id, uavcan.to_yaml(payload))
self.request_async(payload, dest_node_id, callback, timeout, priority)
while result is None:
self.spin_for(0.1)
return result
def callback(event):
nonlocal result
if event is not None:
logger.debug('Response %r from %d\n%s',
uavcan.get_uavcan_data_type(event.response),
event.transfer.source_node_id,
uavcan.to_yaml(event.response))
assert event.transfer.source_node_id == dest_node_id
result = event.response
else:
raise Node.TimeoutException('Request to node %d with payload %r has timed out in %.3f seconds' %
(dest_node_id, payload, timeout or uavcan.node.DEFAULT_SERVICE_TIMEOUT))
def value_to_constant_name(struct, field_name, keep_literal=False):
"""
This function accepts a UAVCAN struct (message, request, or response), and a field name; and returns
the name of constant or bit mask that match the value. If no match could be established, the literal
value will be returned as is.
Args:
struct: UAVCAN struct to work with
field_name: Name of the field to work with
keep_literal: Whether to include the input integer value in the output string
Returns: Name of the constant or flags if match could be detected, otherwise integer as is.
"""
# Extracting constants
uavcan_type = uavcan.get_uavcan_data_type(struct)
if uavcan.is_request(struct):
consts = uavcan_type.request_constants
fields = uavcan_type.request_fields
elif uavcan.is_response(struct):
consts = uavcan_type.response_constants
fields = uavcan_type.response_fields
else:
consts = uavcan_type.constants
fields = uavcan_type.fields
assert len(fields) > 0
# noinspection PyShadowingNames
def format_output(name, value, remove_common_prefix):
if remove_common_prefix:
num_seps = len(field_name.split('_'))
def _read(self, e):
logger.debug("[#{0:03d}:uavcan.protocol.file.Read] {1!r} @ offset {2:d}"
.format(e.transfer.source_node_id, e.request.path.path.decode(), e.request.offset))
try:
with open(self._resolve_path(e.request.path), "rb") as f:
f.seek(e.request.offset)
resp = uavcan.protocol.file.Read.Response()
read_size = uavcan.get_uavcan_data_type(uavcan.get_fields(resp)['data']).max_size
resp.data = bytearray(f.read(read_size))
resp.error.value = resp.error.OK
except Exception:
logger.exception("[#{0:03d}:uavcan.protocol.file.Read] error")
resp = uavcan.protocol.file.Read.Response()
resp.error.value = resp.error.UNKNOWN_ERROR
return resp
layout.addWidget(self._zero_button)
self.setLayout(layout)
self.setMinimumHeight(400)
def zero(self):
self._slider.setValue(0)
def get_value(self):
return self._slider.value()
class ESCPanel(QDialog):
DEFAULT_INTERVAL = 0.1
CMD_BIT_LENGTH = uavcan.get_uavcan_data_type(uavcan.equipment.esc.RawCommand().cmd).value_type.bitlen
CMD_MAX = 2 ** (CMD_BIT_LENGTH - 1) - 1
CMD_MIN = -(2 ** (CMD_BIT_LENGTH - 1))
def __init__(self, parent, node):
super(ESCPanel, self).__init__(parent)
self.setWindowTitle('ESC Management Panel')
self.setAttribute(Qt.WA_DeleteOnClose) # This is required to stop background timers!
self._node = node
self._sliders = [PercentSlider(self) for _ in range(4)]
self._num_sliders = QSpinBox(self)
self._num_sliders.setMinimum(len(self._sliders))
self._num_sliders.setMaximum(20)
self._num_sliders.setValue(len(self._sliders))
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
else:
raise ValueError(':(')
def process_next():
nonlocal num_broadcasted
try:
do_broadcast()
except Exception:
logger.error('Automatic broadcast failed, job cancelled', exc_info=True)
timer_handle.remove()
else:
num_broadcasted += 1
if (count is not None and num_broadcasted >= count) or (time.monotonic() >= deadline):
logger.info('Background publisher for %r has stopped',
uavcan.get_uavcan_data_type(payload).full_name)
timer_handle.remove()
# 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
return False
# Catch a string masquerading as an array
if t.is_string_like and all(map(is_nice_character, obj)):
return obj.decode()
# Return the array!
output = []
for x in obj:
output.append(to_json_compatible_object(x))