[python] add pprz_env with usable default IVY_BUS

- pprz_env.IVY_BUS is either the env variable IVY_BUS or appropriate default (checks for OSX)
- some fixes for udp_link

should fix #1495 and the python part of #204
This commit is contained in:
Felix Ruess
2015-12-22 11:47:43 +01:00
parent eaf971bfad
commit 34e076e2f7
7 changed files with 57 additions and 24 deletions
@@ -16,6 +16,7 @@ import messagepicker
PPRZ_SRC = getenv("PAPARAZZI_SRC", path.normpath(path.join(path.dirname(path.abspath(__file__)), '../../../../'))) PPRZ_SRC = getenv("PAPARAZZI_SRC", path.normpath(path.join(path.dirname(path.abspath(__file__)), '../../../../')))
sys.path.append(PPRZ_SRC + "/sw/lib/python") sys.path.append(PPRZ_SRC + "/sw/lib/python")
import pprz_env
from pprz_msg import messages_xml_map from pprz_msg import messages_xml_map
@@ -244,7 +245,7 @@ class PlotPanel(object):
# is given ; this is performed by IvyStart (C) # is given ; this is performed by IvyStart (C)
try: try:
logging.getLogger('Ivy').setLevel(logging.WARN) logging.getLogger('Ivy').setLevel(logging.WARN)
IvyStart("") IvyStart(pprz_env.IVY_BUS)
# binding to every message # binding to every message
# IvyBindMsg(self.OnIvyMsg, "(.*)") # IvyBindMsg(self.OnIvyMsg, "(.*)")
except: except:
@@ -31,6 +31,8 @@ from ivy.std_api import *
PPRZ_HOME = os.getenv("PAPARAZZI_HOME") PPRZ_HOME = os.getenv("PAPARAZZI_HOME")
sys.path.append(PPRZ_HOME + "/sw/lib/python") sys.path.append(PPRZ_HOME + "/sw/lib/python")
import pprz_env
from pprz_msg import messages_xml_map from pprz_msg import messages_xml_map
class Circular_Buffer: class Circular_Buffer:
@@ -161,7 +163,7 @@ class Link_Combiner:
# starting the bus # starting the bus
logging.getLogger('Ivy').setLevel(logging.WARN) logging.getLogger('Ivy').setLevel(logging.WARN)
IvyStart("") IvyStart(pprz_env.IVY_BUS)
IvyBindMsg(self.onIvyMessage, "^([^ ]+) TELEMETRY_MESSAGE ([^ ]+) ([^ ]+) ([^ ]+)$") IvyBindMsg(self.onIvyMessage, "^([^ ]+) TELEMETRY_MESSAGE ([^ ]+) ([^ ]+) ([^ ]+)$")
def onIvyMessage(self, agent, *larg): def onIvyMessage(self, agent, *larg):
+27 -8
View File
@@ -9,9 +9,14 @@ import sys
import threading import threading
import time import time
sys.path.append(os.getenv("PAPARAZZI_HOME") + "/sw/lib/python") # if PAPARAZZI_SRC not set, then assume the tree containing this
# file is a reasonable substitute
PPRZ_SRC = os.getenv("PAPARAZZI_SRC", os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),
'../../../../')))
sys.path.append(PPRZ_SRC + "/sw/lib/python")
import messages_xml_map import pprz_env
from pprz_msg import messages_xml_map
PING_PERIOD = 5.0 PING_PERIOD = 5.0
STATUS_PERIOD = 1.0 STATUS_PERIOD = 1.0
@@ -39,12 +44,13 @@ class DownLinkStatus():
class IvyUdpLink(): class IvyUdpLink():
def __init__(self): def __init__(self):
self.InitIvy() self.InitIvy()
self.ivy_id = 0
self.status_timer = threading.Timer(STATUS_PERIOD, self.sendStatus) self.status_timer = threading.Timer(STATUS_PERIOD, self.sendStatus)
self.ping_timer = threading.Timer(STATUS_PERIOD, self.sendPing) self.ping_timer = threading.Timer(STATUS_PERIOD, self.sendPing)
self.ac_downlink_status = {} self.ac_downlink_status = {}
self.rx_err = 0 self.rx_err = 0
messages_xml_map.ParseMessages() messages_xml_map.parse_messages()
self.data_types = {'float': ['f', 4], self.data_types = {'float': ['f', 4],
'uint8': ['B', 1], 'uint8': ['B', 1],
'uint16': ['H', 2], 'uint16': ['H', 2],
@@ -54,6 +60,15 @@ class IvyUdpLink():
'int32': ['l', 4] 'int32': ['l', 4]
} }
def __del__(self):
self.stop()
def stop(self):
self.status_timer.cancel()
self.ping_timer.cancel()
IvyUnBindMsg(self.ivy_id)
IvyStop()
def Unpack(self, data_fields, type, start, length): def Unpack(self, data_fields, type, start, length):
return struct.unpack(type, "".join(data_fields[start:start + length]))[0] return struct.unpack(type, "".join(data_fields[start:start + length]))[0]
@@ -68,8 +83,8 @@ class IvyUdpLink():
# starting the bus # starting the bus
logging.getLogger('Ivy').setLevel(logging.WARN) logging.getLogger('Ivy').setLevel(logging.WARN)
IvyStart("") IvyStart(pprz_env.IVY_BUS)
IvyBindMsg(self.OnSettingMsg, "(^.* SETTING .*)") self.ivy_id = IvyBindMsg(self.OnSettingMsg, "(^.* SETTING .*)")
def calculate_checksum(self, msg): def calculate_checksum(self, msg):
ck_a = 0 ck_a = 0
@@ -227,14 +242,18 @@ class IvyUdpLink():
self.server.bind(('0.0.0.0', DOWNLINK_PORT)) self.server.bind(('0.0.0.0', DOWNLINK_PORT))
self.status_timer.start() self.status_timer.start()
self.ping_timer.start() self.ping_timer.start()
while True: try:
(msg, address) = self.server.recvfrom(2048) while True:
self.ProcessPacket(msg, address) (msg, address) = self.server.recvfrom(2048)
self.ProcessPacket(msg, address)
except KeyboardInterrupt:
print("Stopping server on request")
def main(): def main():
udp_interface = IvyUdpLink() udp_interface = IvyUdpLink()
udp_interface.Run() udp_interface.Run()
udp_interface.stop()
if __name__ == '__main__': if __name__ == '__main__':
+6 -8
View File
@@ -6,22 +6,20 @@ import logging
import os import os
import sys import sys
import re import re
import pprz_env
# if PAPARAZZI_SRC not set, then assume the tree containing this sys.path.append(pprz_env.PAPARAZZI_SRC + "/sw/lib/python")
# file is a reasonable substitute
PPRZ_SRC = os.getenv("PAPARAZZI_SRC", os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),
'../../../../')))
sys.path.append(PPRZ_SRC + "/sw/lib/python")
from pprz_msg.message import PprzMessage from pprz_msg.message import PprzMessage
from pprz_msg import messages_xml_map from pprz_msg import messages_xml_map
class IvyMessagesInterface(object): class IvyMessagesInterface(object):
def __init__(self, callback=None, init=True, verbose=False, bind_regex='(.*)'): def __init__(self, callback=None, init=True, verbose=False, bind_regex='(.*)', ivy_bus=pprz_env.IVY_BUS):
self.callback = callback self.callback = callback
self.ivy_id = 0 self.ivy_id = 0
self.verbose = verbose self.verbose = verbose
self.ivy_bus = ivy_bus
# make sure all messages are parsed before we start creating them in callbacks # make sure all messages are parsed before we start creating them in callbacks
messages_xml_map.parse_messages() messages_xml_map.parse_messages()
self.init_ivy(init, bind_regex) self.init_ivy(init, bind_regex)
@@ -36,7 +34,7 @@ class IvyMessagesInterface(object):
except IvyIllegalStateError as e: except IvyIllegalStateError as e:
print(e) print(e)
def __init__del__(self): def __del__(self):
try: try:
IvyUnBindMsg(self.ivy_id) IvyUnBindMsg(self.ivy_id)
except: except:
@@ -46,7 +44,7 @@ class IvyMessagesInterface(object):
if init: if init:
IvyInit("Messages %i" % os.getpid(), "READY", 0, lambda x,y: y, lambda x,y: y) IvyInit("Messages %i" % os.getpid(), "READY", 0, lambda x,y: y, lambda x,y: y)
logging.getLogger('Ivy').setLevel(logging.WARN) logging.getLogger('Ivy').setLevel(logging.WARN)
IvyStart("") IvyStart(self.ivy_bus)
self.ivy_id = IvyBindMsg(self.on_ivy_msg, bind_regex) self.ivy_id = IvyBindMsg(self.on_ivy_msg, bind_regex)
def on_ivy_msg(self, agent, *larg): def on_ivy_msg(self, agent, *larg):
+13
View File
@@ -0,0 +1,13 @@
import os
import platform
PAPARAZZI_SRC = os.getenv("PAPARAZZI_SRC", os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),
'../../..')))
PAPARAZZI_HOME = os.getenv("PAPARAZZI_HOME", PAPARAZZI_SRC)
if os.getenv('IVY_BUS') is not None:
IVY_BUS = os.getenv('IVY_BUS')
elif platform.system() == 'Darwin':
IVY_BUS = "224.255.255.255:2010"
else:
IVY_BUS = ""
+1 -1
View File
@@ -39,7 +39,7 @@ class SerialMessagesInterface(threading.Thread):
def shutdown(self): def shutdown(self):
self.stop() self.stop()
def __init__del__(self): def __del__(self):
try: try:
self.ser.close() self.ser.close()
except: except:
+5 -5
View File
@@ -3,17 +3,17 @@
from __future__ import absolute_import, print_function from __future__ import absolute_import, print_function
from ivy.std_api import * from ivy.std_api import *
import os
import logging import logging
import sys import sys
import pprz_env
sys.path.append(pprz_env.PAPARAZZI_SRC + "/sw/lib/python")
PPRZ_SRC = os.getenv("PAPARAZZI_SRC", os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),
'../../..')))
sys.path.append(PPRZ_SRC + "/sw/lib/python")
from settings_xml_parse import PaparazziACSettings from settings_xml_parse import PaparazziACSettings
_SHOW_IVY_MSGS_ = False _SHOW_IVY_MSGS_ = False
class IvySettingsInterface(PaparazziACSettings): class IvySettingsInterface(PaparazziACSettings):
def __init__(self, ac_ids): def __init__(self, ac_ids):
PaparazziACSettings.__init__(self, ac_ids[0]) PaparazziACSettings.__init__(self, ac_ids[0])
@@ -68,7 +68,7 @@ class IvySettingsInterface(PaparazziACSettings):
# starting the bus # starting the bus
logging.getLogger('Ivy').setLevel(logging.WARN) logging.getLogger('Ivy').setLevel(logging.WARN)
IvyStart("") IvyStart(pprz_env.IVY_BUS)
IvyBindMsg(self.OnValueMsg, "(^.* DL_VALUE .*)") IvyBindMsg(self.OnValueMsg, "(^.* DL_VALUE .*)")
IvyBindMsg(self.OnSettingMsg, "dl DL_SETTING (.*)") IvyBindMsg(self.OnSettingMsg, "dl DL_SETTING (.*)")