/
ivy_msg_interface.py
77 lines (68 loc) · 2.41 KB
/
ivy_msg_interface.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
from __future__ import absolute_import, print_function
from ivy.std_api import *
import logging
import os
import sys
import re
class IvyMessagesInterface():
def __init__(self, callback, init=True, verbose=True, bind_regex="(.*)"):
self.callback = callback
self.ivy_id = 0
self.verbose = verbose
self.init_ivy(init, bind_regex)
def stop(self):
IvyUnBindMsg(self.ivy_id)
def shutdown(self):
self.stop()
IvyStop()
def __init__del__(self):
try:
IvyUnBindMsg(self.ivy_id)
except:
pass
def init_ivy(self, init, bind_regex):
if init:
IvyInit("Messages %i" % os.getpid(), "READY", 0, lambda x,y: y, lambda x,y: y)
logging.getLogger('Ivy').setLevel(logging.WARN)
IvyStart("")
self.ivy_id = IvyBindMsg(self.on_ivy_msg, bind_regex)
def on_ivy_msg(self, agent, *larg):
""" Split ivy message up into the separate parts
Basically parts/args in string are separated by space, but char array can also contain a space:
|f,o,o, ,b,a,r| in old format or "foo bar" in new format
"""
# first split on array delimiters
l = re.split('([|\"][^|]*[|\"])', larg[0])
# strip spaces and filter out emtpy strings
l = [str.strip(s) for s in l if str.strip(s) is not '']
data = []
for s in l:
# split non-array strings further up
if '|' not in s and '"' not in s:
data += s.split(' ')
else:
data.append(s)
# ignore ivy message with less than 3 elements
if len(data) < 3:
return
# check which message class it is
# pass non-telemetry messages with ac_id 0
if data[0] in ["ground", "ground_dl", "dl"]:
msg_class = data[0]
msg_name = data[1]
ac_id = 0
values = list(filter(None, data[2:]))
elif data[0] == "sim":
return
else:
try:
ac_id = int(data[0])
except ValueError:
if self.verbose:
print("ignoring message " + ' '.join(data))
sys.stdout.flush()
return
msg_class = "telemetry"
msg_name = data[1]
values = list(filter(None, data[2:]))
self.callback(msg_class, msg_name, ac_id, values)