mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-06 07:53:43 +08:00
[python] pep8: 4 spaces, print_function
This commit is contained in:
@@ -18,120 +18,120 @@ HEIGHT = 800
|
||||
BORDER = 1
|
||||
|
||||
class MessagesFrame(wx.Frame):
|
||||
def message_recv(self, ac_id, name, values):
|
||||
if self.aircrafts.has_key(ac_id):
|
||||
if self.aircrafts[ac_id].messages.has_key(name):
|
||||
if time.time() - self.aircrafts[ac_id].messages[name].last_seen < 0.2:
|
||||
return
|
||||
def message_recv(self, ac_id, name, values):
|
||||
if self.aircrafts.has_key(ac_id) and self.aircrafts[ac_id].messages.has_key(name):
|
||||
if time.time() - self.aircrafts[ac_id].messages[name].last_seen < 0.2:
|
||||
return
|
||||
|
||||
wx.CallAfter(self.gui_update, ac_id, name, values)
|
||||
wx.CallAfter(self.gui_update, ac_id, name, values)
|
||||
|
||||
def find_page(self, book, name):
|
||||
if book.GetPageCount() < 1:
|
||||
return 0
|
||||
start = 0
|
||||
end = book.GetPageCount()
|
||||
def find_page(self, book, name):
|
||||
if book.GetPageCount() < 1:
|
||||
return 0
|
||||
start = 0
|
||||
end = book.GetPageCount()
|
||||
|
||||
while (start < end):
|
||||
if book.GetPageText(start) > name:
|
||||
return start
|
||||
start = start + 1
|
||||
|
||||
while (start < end):
|
||||
if book.GetPageText(start) > name:
|
||||
return start
|
||||
start = start + 1
|
||||
|
||||
return start
|
||||
def update_leds(self):
|
||||
wx.CallAfter(self.update_leds_real)
|
||||
|
||||
def update_leds(self):
|
||||
wx.CallAfter(self.update_leds_real)
|
||||
def update_leds_real(self):
|
||||
for ac_id in self.aircrafts:
|
||||
aircraft = self.aircrafts[ac_id]
|
||||
for msg_str in aircraft.messages:
|
||||
message = aircraft.messages[msg_str]
|
||||
if message.last_seen + 0.2 < time.time():
|
||||
aircraft.messages_book.SetPageImage(message.index, 0)
|
||||
|
||||
def update_leds_real(self):
|
||||
for ac_id in self.aircrafts:
|
||||
aircraft = self.aircrafts[ac_id]
|
||||
for msg_str in aircraft.messages:
|
||||
message = aircraft.messages[msg_str]
|
||||
if message.last_seen + 0.2 < time.time():
|
||||
aircraft.messages_book.SetPageImage(message.index, 0)
|
||||
self.timer = threading.Timer(0.1, self.update_leds)
|
||||
self.timer.start()
|
||||
|
||||
self.timer = threading.Timer(0.1, self.update_leds)
|
||||
self.timer.start()
|
||||
def setup_image_list(self, notebook):
|
||||
imageList = wx.ImageList(24,24)
|
||||
|
||||
def setup_image_list(self, notebook):
|
||||
imageList = wx.ImageList(24,24)
|
||||
image = wx.Image(PPRZ_HOME + "/data/pictures/gray_led24.png")
|
||||
bitmap = wx.BitmapFromImage(image)
|
||||
imageList.Add(bitmap)
|
||||
|
||||
image = wx.Image(PPRZ_HOME + "/data/pictures/gray_led24.png")
|
||||
bitmap = wx.BitmapFromImage(image)
|
||||
imageList.Add(bitmap)
|
||||
image = wx.Image(PPRZ_HOME + "/data/pictures/green_led24.png")
|
||||
bitmap = wx.BitmapFromImage(image)
|
||||
imageList.Add(bitmap)
|
||||
|
||||
image = wx.Image(PPRZ_HOME + "/data/pictures/green_led24.png")
|
||||
bitmap = wx.BitmapFromImage(image)
|
||||
imageList.Add(bitmap)
|
||||
notebook.AssignImageList(imageList)
|
||||
|
||||
notebook.AssignImageList(imageList)
|
||||
def add_new_aircraft(self, ac_id):
|
||||
self.aircrafts[ac_id] = messages_tool.Aircraft(ac_id)
|
||||
ac_panel = wx.Panel(self.notebook, -1)
|
||||
self.notebook.AddPage(ac_panel, str(ac_id))
|
||||
messages_book = wx.Notebook(ac_panel, style=wx.NB_LEFT)
|
||||
self.setup_image_list(messages_book)
|
||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
sizer.Add(messages_book, 1, wx.EXPAND)
|
||||
ac_panel.SetSizer(sizer)
|
||||
sizer.Layout()
|
||||
self.aircrafts[ac_id].messages_book = messages_book
|
||||
|
||||
def add_new_aircraft(self, ac_id):
|
||||
self.aircrafts[ac_id] = messages_tool.Aircraft(ac_id)
|
||||
ac_panel = wx.Panel(self.notebook, -1)
|
||||
self.notebook.AddPage(ac_panel, str(ac_id))
|
||||
messages_book = wx.Notebook(ac_panel, style=wx.NB_LEFT)
|
||||
self.setup_image_list(messages_book)
|
||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
sizer.Add(messages_book, 1, wx.EXPAND)
|
||||
ac_panel.SetSizer(sizer)
|
||||
sizer.Layout()
|
||||
self.aircrafts[ac_id].messages_book = messages_book
|
||||
def add_new_message(self, aircraft, name):
|
||||
messages_book = aircraft.messages_book
|
||||
aircraft.messages[name] = messages_tool.Message("telemetry", name)
|
||||
field_panel = wx.Panel(messages_book)
|
||||
grid_sizer = wx.FlexGridSizer(len(aircraft.messages[name].field_names), 2)
|
||||
|
||||
def add_new_message(self, aircraft, name):
|
||||
messages_book = aircraft.messages_book
|
||||
aircraft.messages[name] = messages_tool.Message("telemetry", name)
|
||||
field_panel = wx.Panel(messages_book)
|
||||
grid_sizer = wx.FlexGridSizer(len(aircraft.messages[name].field_names), 2)
|
||||
index = self.find_page(messages_book, name)
|
||||
messages_book.InsertPage(index, field_panel, name, imageId = 1)
|
||||
aircraft.messages[name].index = index
|
||||
|
||||
index = self.find_page(messages_book, name)
|
||||
messages_book.InsertPage(index, field_panel, name, imageId = 1)
|
||||
aircraft.messages[name].index = index
|
||||
# update indexes of pages which are to be moved
|
||||
for message_name in aircraft.messages:
|
||||
aircraft.messages[message_name].index = self.find_page(messages_book, message_name)
|
||||
|
||||
# update indexes of pages which are to be moved
|
||||
for message_name in aircraft.messages:
|
||||
aircraft.messages[message_name].index = self.find_page(messages_book, message_name)
|
||||
for field_name in aircraft.messages[name].field_names:
|
||||
name_text = wx.StaticText(field_panel, -1, field_name)
|
||||
size = name_text.GetSize()
|
||||
size.x = LABEL_WIDTH
|
||||
name_text.SetMinSize(size)
|
||||
grid_sizer.Add(name_text, 1, wx.ALL, BORDER)
|
||||
value_control = wx.StaticText(field_panel, -1, "42", style=wx.ST_NO_AUTORESIZE)
|
||||
size = value_control.GetSize()
|
||||
size.x = LABEL_WIDTH
|
||||
value_control.SetMinSize(size)
|
||||
grid_sizer.Add(value_control, 1, wx.ALL, BORDER)
|
||||
aircraft.messages[name].field_controls.append(value_control)
|
||||
|
||||
for field_name in aircraft.messages[name].field_names:
|
||||
name_text = wx.StaticText(field_panel, -1, field_name)
|
||||
size = name_text.GetSize()
|
||||
size.x = LABEL_WIDTH
|
||||
name_text.SetMinSize(size)
|
||||
grid_sizer.Add(name_text, 1, wx.ALL, BORDER)
|
||||
value_control = wx.StaticText(field_panel, -1, "42", style=wx.ST_NO_AUTORESIZE)
|
||||
size = value_control.GetSize()
|
||||
size.x = LABEL_WIDTH
|
||||
value_control.SetMinSize(size)
|
||||
grid_sizer.Add(value_control, 1, wx.ALL, BORDER)
|
||||
aircraft.messages[name].field_controls.append(value_control)
|
||||
field_panel.SetAutoLayout(True)
|
||||
field_panel.SetSizer(grid_sizer)
|
||||
field_panel.Layout()
|
||||
field_panel.SetAutoLayout(True)
|
||||
field_panel.SetSizer(grid_sizer)
|
||||
field_panel.Layout()
|
||||
|
||||
def gui_update(self, ac_id, name, values):
|
||||
if not self.aircrafts.has_key(ac_id):
|
||||
self.add_new_aircraft(ac_id)
|
||||
def gui_update(self, ac_id, name, values):
|
||||
if not self.aircrafts.has_key(ac_id):
|
||||
self.add_new_aircraft(ac_id)
|
||||
|
||||
aircraft = self.aircrafts[ac_id]
|
||||
aircraft = self.aircrafts[ac_id]
|
||||
|
||||
if not aircraft.messages.has_key(name):
|
||||
self.add_new_message(aircraft, name)
|
||||
if not aircraft.messages.has_key(name):
|
||||
self.add_new_message(aircraft, name)
|
||||
|
||||
aircraft.messages_book.SetPageImage(aircraft.messages[name].index, 1)
|
||||
self.aircrafts[ac_id].messages[name].last_seen = time.time()
|
||||
aircraft.messages_book.SetPageImage(aircraft.messages[name].index, 1)
|
||||
self.aircrafts[ac_id].messages[name].last_seen = time.time()
|
||||
|
||||
for index in range(0, len(values)):
|
||||
aircraft.messages[name].field_controls[index].SetLabel(values[index])
|
||||
for index in range(0, len(values)):
|
||||
aircraft.messages[name].field_controls[index].SetLabel(values[index])
|
||||
|
||||
def __init__(self):
|
||||
wx.Frame.__init__(self, id=-1, parent=None, name=u'MessagesFrame', size=wx.Size(WIDTH, HEIGHT), style=wx.DEFAULT_FRAME_STYLE, title=u'Messages')
|
||||
self.notebook = wx.Notebook(self)
|
||||
self.aircrafts = {}
|
||||
def __init__(self):
|
||||
wx.Frame.__init__(self, id=-1, parent=None, name=u'MessagesFrame', size=wx.Size(WIDTH, HEIGHT), style=wx.DEFAULT_FRAME_STYLE, title=u'Messages')
|
||||
self.notebook = wx.Notebook(self)
|
||||
self.aircrafts = {}
|
||||
|
||||
sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizer.Add(self.notebook, 1, wx.EXPAND)
|
||||
self.SetSizer(sizer)
|
||||
sizer.Layout()
|
||||
self.timer = threading.Timer(0.1, self.update_leds)
|
||||
self.timer.start()
|
||||
self.interface = messages_tool.IvyMessagesInterface(self.message_recv)
|
||||
sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizer.Add(self.notebook, 1, wx.EXPAND)
|
||||
self.SetSizer(sizer)
|
||||
sizer.Layout()
|
||||
self.timer = threading.Timer(0.1, self.update_leds)
|
||||
self.timer.start()
|
||||
self.interface = messages_tool.IvyMessagesInterface(self.message_recv)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
from __future__ import print_function
|
||||
|
||||
import messages_xml_map
|
||||
from ivy.std_api import *
|
||||
import logging
|
||||
@@ -5,59 +7,59 @@ import time
|
||||
import os
|
||||
|
||||
class Message:
|
||||
def __init__(self, class_name, name):
|
||||
messages_xml_map.ParseMessages()
|
||||
self.field_value = []
|
||||
self.field_names = messages_xml_map.message_dictionary[class_name][name]
|
||||
self.field_controls = []
|
||||
self.index = None
|
||||
self.last_seen = time.clock()
|
||||
self.name = name
|
||||
def __init__(self, class_name, name):
|
||||
messages_xml_map.ParseMessages()
|
||||
self.field_value = []
|
||||
self.field_names = messages_xml_map.message_dictionary[class_name][name]
|
||||
self.field_controls = []
|
||||
self.index = None
|
||||
self.last_seen = time.clock()
|
||||
self.name = name
|
||||
|
||||
class Aircraft:
|
||||
def __init__(self, id):
|
||||
self.ac_id = id
|
||||
self.messages = {}
|
||||
self.messages_book = None
|
||||
def __init__(self, id):
|
||||
self.ac_id = id
|
||||
self.messages = {}
|
||||
self.messages_book = None
|
||||
|
||||
class IvyMessagesInterface():
|
||||
def __init__(self, callback, initIvy = True):
|
||||
self.callback = callback
|
||||
self.ivy_id = 0
|
||||
self.InitIvy(initIvy)
|
||||
def __init__(self, callback, initIvy = True):
|
||||
self.callback = callback
|
||||
self.ivy_id = 0
|
||||
self.InitIvy(initIvy)
|
||||
|
||||
def Stop(self):
|
||||
IvyUnBindMsg(self.ivy_id)
|
||||
def Stop(self):
|
||||
IvyUnBindMsg(self.ivy_id)
|
||||
|
||||
def __del__(self):
|
||||
try:
|
||||
IvyUnBindMsg(self.ivy_id)
|
||||
except:
|
||||
pass
|
||||
def __init__del__(self):
|
||||
try:
|
||||
IvyUnBindMsg(self.ivy_id)
|
||||
except:
|
||||
pass
|
||||
|
||||
def InitIvy(self, initIvy):
|
||||
if initIvy:
|
||||
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.OnIvyMsg, "(.*)")
|
||||
def InitIvy(self, initIvy):
|
||||
if initIvy:
|
||||
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.OnIvyMsg, "(.*)")
|
||||
|
||||
def OnIvyMsg(self, agent, *larg):
|
||||
data = larg[0].split(' ')
|
||||
try:
|
||||
ac_id = int(data[0])
|
||||
name = data[1]
|
||||
values = data[2:]
|
||||
self.callback(ac_id, name, values)
|
||||
except ValueError:
|
||||
pass
|
||||
except:
|
||||
raise
|
||||
def OnIvyMsg(self, agent, *larg):
|
||||
data = larg[0].split(' ')
|
||||
try:
|
||||
ac_id = int(data[0])
|
||||
name = data[1]
|
||||
values = data[2:]
|
||||
self.callback(ac_id, name, values)
|
||||
except ValueError:
|
||||
pass
|
||||
except:
|
||||
raise
|
||||
|
||||
def test():
|
||||
message = Message("WHIRLY")
|
||||
print message
|
||||
print message.field_names
|
||||
|
||||
message = Message("WHIRLY")
|
||||
print(message)
|
||||
print(message.field_names)
|
||||
|
||||
if __name__ == '__main__':
|
||||
test()
|
||||
test()
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import sys
|
||||
import getopt
|
||||
@@ -12,67 +14,65 @@ message_dictionary_id_name = {}
|
||||
message_dictionary_name_id = {}
|
||||
|
||||
def Usage(scmd):
|
||||
lpathitem = scmd.split('/')
|
||||
fmt = '''Usage: %s [-h | --help] [-f FILE | --file=FILE]
|
||||
lpathitem = scmd.split('/')
|
||||
fmt = '''Usage: %s [-h | --help] [-f FILE | --file=FILE]
|
||||
where
|
||||
\t-h | --help print this message
|
||||
\t-f FILE | --file=FILE where FILE is path to messages.xml
|
||||
\t-f FILE | --file=FILE where FILE is path to messages.xml
|
||||
'''
|
||||
print fmt % lpathitem[-1]
|
||||
print(fmt % lpathitem[-1])
|
||||
|
||||
def GetOptions():
|
||||
try:
|
||||
optlist, left_args = getopt.getopt(sys.argv[1:],'hf:', ['help','file='])
|
||||
except getopt.GetoptError:
|
||||
# print help information and exit:
|
||||
Usage(sys.argv[0])
|
||||
sys.exit(2)
|
||||
for o, a in optlist:
|
||||
if o in ("-h", "--help"):
|
||||
Usage(sys.argv[0])
|
||||
sys.exit()
|
||||
elif o in ("-f", "--file"):
|
||||
messages_path = a
|
||||
try:
|
||||
optlist, left_args = getopt.getopt(sys.argv[1:],'hf:', ['help','file='])
|
||||
except getopt.GetoptError:
|
||||
# print help information and exit:
|
||||
Usage(sys.argv[0])
|
||||
sys.exit(2)
|
||||
for o, a in optlist:
|
||||
if o in ("-h", "--help"):
|
||||
Usage(sys.argv[0])
|
||||
sys.exit()
|
||||
elif o in ("-f", "--file"):
|
||||
messages_path = a
|
||||
|
||||
|
||||
def ParseMessages():
|
||||
from lxml import etree
|
||||
tree = etree.parse( messages_path)
|
||||
for the_class in tree.xpath("//class[@name]"):
|
||||
class_name = the_class.attrib['name']
|
||||
if not message_dictionary.has_key(class_name):
|
||||
message_dictionary_id_name[class_name] = {}
|
||||
message_dictionary_name_id[class_name] = {}
|
||||
message_dictionary[class_name] = {}
|
||||
message_dictionary_types[class_name] = {}
|
||||
for the_message in the_class.xpath("message[@name]"):
|
||||
message_name = the_message.attrib['name']
|
||||
if the_message.attrib.has_key('id'):
|
||||
message_id = the_message.attrib['id']
|
||||
else:
|
||||
message_id = the_message.attrib['ID']
|
||||
if (message_id[0:2] == "0x"):
|
||||
message_id = int(message_id, 16)
|
||||
else:
|
||||
message_id = int(message_id)
|
||||
from lxml import etree
|
||||
tree = etree.parse( messages_path)
|
||||
for the_class in tree.xpath("//class[@name]"):
|
||||
class_name = the_class.attrib['name']
|
||||
if not message_dictionary.has_key(class_name):
|
||||
message_dictionary_id_name[class_name] = {}
|
||||
message_dictionary_name_id[class_name] = {}
|
||||
message_dictionary[class_name] = {}
|
||||
message_dictionary_types[class_name] = {}
|
||||
for the_message in the_class.xpath("message[@name]"):
|
||||
message_name = the_message.attrib['name']
|
||||
if the_message.attrib.has_key('id'):
|
||||
message_id = the_message.attrib['id']
|
||||
else:
|
||||
message_id = the_message.attrib['ID']
|
||||
if (message_id[0:2] == "0x"):
|
||||
message_id = int(message_id, 16)
|
||||
else:
|
||||
message_id = int(message_id)
|
||||
|
||||
message_dictionary_id_name[class_name][message_id] = message_name
|
||||
message_dictionary_name_id[class_name][message_name] = message_id
|
||||
message_dictionary_id_name[class_name][message_id] = message_name
|
||||
message_dictionary_name_id[class_name][message_name] = message_id
|
||||
|
||||
# insert this message into our dictionary as a list with room for the fields
|
||||
message_dictionary[class_name][message_name] = []
|
||||
message_dictionary_types[class_name][message_id] = []
|
||||
# insert this message into our dictionary as a list with room for the fields
|
||||
message_dictionary[class_name][message_name] = []
|
||||
message_dictionary_types[class_name][message_id] = []
|
||||
|
||||
for the_field in the_message.xpath('field[@name]'):
|
||||
# for now, just save the field names -- in the future maybe expand this to save a struct?
|
||||
message_dictionary[class_name][message_name].append( the_field.attrib['name'])
|
||||
message_dictionary_types[class_name][message_id].append( the_field.attrib['type'])
|
||||
|
||||
for the_field in the_message.xpath('field[@name]'):
|
||||
# for now, just save the field names -- in the future maybe expand this to save a struct?
|
||||
message_dictionary[class_name][message_name].append( the_field.attrib['name'])
|
||||
message_dictionary_types[class_name][message_id].append( the_field.attrib['type'])
|
||||
|
||||
def test():
|
||||
GetOptions()
|
||||
ParseMessages()
|
||||
|
||||
GetOptions()
|
||||
ParseMessages()
|
||||
|
||||
if __name__ == '__main__':
|
||||
test()
|
||||
|
||||
|
||||
test()
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
from ivy.std_api import *
|
||||
import os
|
||||
import logging
|
||||
@@ -12,73 +14,73 @@ _SHOW_IVY_MSGS_ = False
|
||||
|
||||
class IvySettingsInterface(PaparazziACSettings):
|
||||
def __init__(self, ac_ids):
|
||||
PaparazziACSettings.__init__(self, ac_ids[0])
|
||||
self.update_callback = None
|
||||
self.InitIvy()
|
||||
self.ac_ids = ac_ids
|
||||
PaparazziACSettings.__init__(self, ac_ids[0])
|
||||
self.update_callback = None
|
||||
self.InitIvy()
|
||||
self.ac_ids = ac_ids
|
||||
|
||||
def ProcessMessage(self, message_values, fromRemote):
|
||||
# Extract aircraft id from message and ignore if not matching
|
||||
msg_ac_id = int(message_values[0])
|
||||
if (msg_ac_id != self.ac_ids[0]):
|
||||
return
|
||||
# Extract aircraft id from message and ignore if not matching
|
||||
msg_ac_id = int(message_values[0])
|
||||
if (msg_ac_id != self.ac_ids[0]):
|
||||
return
|
||||
|
||||
# Extract setting value
|
||||
setting_index = int(message_values[1])
|
||||
setting_value = message_values[2]
|
||||
# Extract setting value
|
||||
setting_index = int(message_values[1])
|
||||
setting_value = message_values[2]
|
||||
|
||||
# Store value from message
|
||||
self.lookup[setting_index].value = setting_value
|
||||
# Store value from message
|
||||
self.lookup[setting_index].value = setting_value
|
||||
|
||||
# Callback (if present)
|
||||
if self.update_callback != None:
|
||||
self.update_callback(setting_index, setting_value, fromRemote)
|
||||
# Callback (if present)
|
||||
if self.update_callback != None:
|
||||
self.update_callback(setting_index, setting_value, fromRemote)
|
||||
|
||||
if _SHOW_IVY_MSGS_:
|
||||
print "index: %s value %s " % (setting_index, setting_value)
|
||||
if _SHOW_IVY_MSGS_:
|
||||
print("index: %s value %s " % (setting_index, setting_value))
|
||||
|
||||
# Called for DL_VALUE (from aircraft)
|
||||
def OnValueMsg(self, agent, *larg):
|
||||
# Extract field values
|
||||
message_values = larg[0].split(' ')
|
||||
message_values = message_values[0:1] + message_values[2:]
|
||||
self.ProcessMessage(message_values, True)
|
||||
# Extract field values
|
||||
message_values = larg[0].split(' ')
|
||||
message_values = message_values[0:1] + message_values[2:]
|
||||
self.ProcessMessage(message_values, True)
|
||||
|
||||
# Called for DL_SETTING (from ground)
|
||||
def OnSettingMsg(self, agent, *larg):
|
||||
# Extract field values
|
||||
message_values = larg[0].split(' ')
|
||||
self.ProcessMessage(message_values, False)
|
||||
# Extract field values
|
||||
message_values = larg[0].split(' ')
|
||||
self.ProcessMessage(message_values, False)
|
||||
|
||||
def RegisterCallback(self, callback_function):
|
||||
self.update_callback = callback_function
|
||||
|
||||
def InitIvy(self):
|
||||
# initialising the bus
|
||||
IvyInit("settings_app", # application name for Ivy
|
||||
"", # ready message
|
||||
0, # main loop is local (ie. using IvyMainloop)
|
||||
lambda x,y: y, # handler called on connection/deconnection
|
||||
lambda x,y: y # handler called when a diemessage is received
|
||||
)
|
||||
self.update_callback = callback_function
|
||||
|
||||
# starting the bus
|
||||
logging.getLogger('Ivy').setLevel(logging.WARN)
|
||||
IvyStart("")
|
||||
IvyBindMsg(self.OnValueMsg, "(^.* DL_VALUE .*)")
|
||||
IvyBindMsg(self.OnSettingMsg, "dl DL_SETTING (.*)")
|
||||
def InitIvy(self):
|
||||
# initialising the bus
|
||||
IvyInit("settings_app", # application name for Ivy
|
||||
"", # ready message
|
||||
0, # main loop is local (ie. using IvyMainloop)
|
||||
lambda x,y: y, # handler called on connection/deconnection
|
||||
lambda x,y: y # handler called when a diemessage is received
|
||||
)
|
||||
|
||||
# starting the bus
|
||||
logging.getLogger('Ivy').setLevel(logging.WARN)
|
||||
IvyStart("")
|
||||
IvyBindMsg(self.OnValueMsg, "(^.* DL_VALUE .*)")
|
||||
IvyBindMsg(self.OnSettingMsg, "dl DL_SETTING (.*)")
|
||||
|
||||
def SendSetting(self, setting_index):
|
||||
for ac_id in self.ac_ids:
|
||||
IvySendMsg("dl DL_SETTING %s %s %s" % (ac_id, setting_index, self.lookup[setting_index].value))
|
||||
for ac_id in self.ac_ids:
|
||||
IvySendMsg("dl DL_SETTING %s %s %s" % (ac_id, setting_index, self.lookup[setting_index].value))
|
||||
|
||||
def OnClose(self):
|
||||
IvyStop()
|
||||
|
||||
|
||||
def main():
|
||||
ac_id = [ 11 ]
|
||||
ivy_interface = IvySettingsInterface(ac_id)
|
||||
ac_id = [ 11 ]
|
||||
ivy_interface = IvySettingsInterface(ac_id)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
main()
|
||||
|
||||
@@ -1,115 +1,118 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import sys
|
||||
from lxml import etree
|
||||
|
||||
# Class for all settings
|
||||
class PaparazziACSettings:
|
||||
"Paparazzi Settings Class"
|
||||
ac_id = 0
|
||||
groups = []
|
||||
lookup = []
|
||||
name_lookup = {}
|
||||
# Takes a string file path for settings XML file and
|
||||
# returns a settings AC object
|
||||
"Paparazzi Settings Class"
|
||||
ac_id = 0
|
||||
groups = []
|
||||
lookup = []
|
||||
name_lookup = {}
|
||||
# Takes a string file path for settings XML file and
|
||||
# returns a settings AC object
|
||||
|
||||
def __init__(self, ac_id):
|
||||
self.ac_id = ac_id
|
||||
paparazzi_home = os.getenv("PAPARAZZI_HOME")
|
||||
conf_xml_path = "%s/conf/conf.xml" % paparazzi_home
|
||||
conf_tree = etree.parse(conf_xml_path)
|
||||
# extract aircraft node from conf.xml file
|
||||
ac_node = conf_tree.xpath('/conf/aircraft[@ac_id=%i]' % ac_id)
|
||||
if (len(ac_node) != 1):
|
||||
print "Aircraft ID %i not found." % ac_id
|
||||
def __init__(self, ac_id):
|
||||
self.ac_id = ac_id
|
||||
paparazzi_home = os.getenv("PAPARAZZI_HOME")
|
||||
conf_xml_path = "%s/conf/conf.xml" % paparazzi_home
|
||||
conf_tree = etree.parse(conf_xml_path)
|
||||
# extract aircraft node from conf.xml file
|
||||
ac_node = conf_tree.xpath('/conf/aircraft[@ac_id=%i]' % ac_id)
|
||||
if (len(ac_node) != 1):
|
||||
print("Aircraft ID %i not found." % ac_id)
|
||||
|
||||
# get settings file path from aircraft xml node
|
||||
settings_xml_path = "%s/conf/%s" % (paparazzi_home, ac_node[0].attrib['settings'])
|
||||
# get settings file path from aircraft xml node
|
||||
settings_xml_path = "%s/conf/%s" % (paparazzi_home, ac_node[0].attrib['settings'])
|
||||
|
||||
# save AC name for reference
|
||||
self.name = ac_node[0].attrib['name']
|
||||
# save AC name for reference
|
||||
self.name = ac_node[0].attrib['name']
|
||||
|
||||
tree = etree.parse(settings_xml_path)
|
||||
|
||||
index = 0 # keep track of index/id of setting starting at 0
|
||||
for the_tab in tree.xpath("//dl_settings"):
|
||||
if the_tab.attrib.has_key('NAME'):
|
||||
setting_group = PaparazziSettingsGroup(the_tab.attrib['NAME'])
|
||||
elif the_tab.attrib.has_key('NAME'):
|
||||
setting_group = PaparazziSettingsGroup(the_tab.attrib['name'])
|
||||
else:
|
||||
continue
|
||||
|
||||
for the_setting in the_tab.xpath('dl_setting'):
|
||||
if the_setting.attrib.has_key('shortname'):
|
||||
name = the_setting.attrib['shortname']
|
||||
elif the_setting.attrib.has_key('VAR'):
|
||||
name = the_setting.attrib['VAR']
|
||||
else:
|
||||
name = the_setting.attrib['var']
|
||||
settings = PaparazziSetting(name)
|
||||
settings.index = index
|
||||
if the_setting.attrib.has_key('MIN'):
|
||||
settings.min_value = float(the_setting.attrib['MIN'])
|
||||
else:
|
||||
settings.min_value = float(the_setting.attrib['min'])
|
||||
if the_setting.attrib.has_key('MAX'):
|
||||
settings.max_value = float(the_setting.attrib['MAX'])
|
||||
else:
|
||||
settings.max_value = float(the_setting.attrib['max'])
|
||||
if the_setting.attrib.has_key('STEP'):
|
||||
settings.step = float(the_setting.attrib['STEP'])
|
||||
else:
|
||||
settings.step = float(the_setting.attrib['step'])
|
||||
if (the_setting.attrib.has_key('values')):
|
||||
settings.values = the_setting.attrib['values'].split('|')
|
||||
count = int((settings.max_value - settings.min_value + settings.step) / settings.step)
|
||||
if (len(settings.values) != count):
|
||||
print "Warning: wrong number of values (%i) for %s (expected %i)" % (len(settings.values), name, count)
|
||||
|
||||
setting_group.member_list.append(settings)
|
||||
self.lookup.append(settings)
|
||||
self.name_lookup[name] = settings
|
||||
index = index + 1
|
||||
|
||||
self.groups.append(setting_group)
|
||||
def GetACName(self):
|
||||
return self.name
|
||||
tree = etree.parse(settings_xml_path)
|
||||
|
||||
index = 0 # keep track of index/id of setting starting at 0
|
||||
for the_tab in tree.xpath("//dl_settings"):
|
||||
if the_tab.attrib.has_key('NAME'):
|
||||
setting_group = PaparazziSettingsGroup(the_tab.attrib['NAME'])
|
||||
elif the_tab.attrib.has_key('NAME'):
|
||||
setting_group = PaparazziSettingsGroup(the_tab.attrib['name'])
|
||||
else:
|
||||
continue
|
||||
|
||||
for the_setting in the_tab.xpath('dl_setting'):
|
||||
if the_setting.attrib.has_key('shortname'):
|
||||
name = the_setting.attrib['shortname']
|
||||
elif the_setting.attrib.has_key('VAR'):
|
||||
name = the_setting.attrib['VAR']
|
||||
else:
|
||||
name = the_setting.attrib['var']
|
||||
settings = PaparazziSetting(name)
|
||||
settings.index = index
|
||||
if the_setting.attrib.has_key('MIN'):
|
||||
settings.min_value = float(the_setting.attrib['MIN'])
|
||||
else:
|
||||
settings.min_value = float(the_setting.attrib['min'])
|
||||
if the_setting.attrib.has_key('MAX'):
|
||||
settings.max_value = float(the_setting.attrib['MAX'])
|
||||
else:
|
||||
settings.max_value = float(the_setting.attrib['max'])
|
||||
if the_setting.attrib.has_key('STEP'):
|
||||
settings.step = float(the_setting.attrib['STEP'])
|
||||
else:
|
||||
settings.step = float(the_setting.attrib['step'])
|
||||
|
||||
if (the_setting.attrib.has_key('values')):
|
||||
settings.values = the_setting.attrib['values'].split('|')
|
||||
count = int((settings.max_value - settings.min_value + settings.step) / settings.step)
|
||||
if (len(settings.values) != count):
|
||||
print("Warning: wrong number of values (%i) for %s (expected %i)" % (len(settings.values), name, count))
|
||||
|
||||
setting_group.member_list.append(settings)
|
||||
self.lookup.append(settings)
|
||||
self.name_lookup[name] = settings
|
||||
index = index + 1
|
||||
|
||||
self.groups.append(setting_group)
|
||||
|
||||
def GetACName(self):
|
||||
return self.name
|
||||
|
||||
# Class for named group of settings
|
||||
class PaparazziSettingsGroup:
|
||||
"Paparazzi Setting Group Class"
|
||||
name = 0
|
||||
member_list = []
|
||||
"Paparazzi Setting Group Class"
|
||||
name = 0
|
||||
member_list = []
|
||||
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.member_list = []
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.member_list = []
|
||||
|
||||
# Class for a single paparazzi setting
|
||||
class PaparazziSetting:
|
||||
"Paparazzi Setting Class"
|
||||
shortname = ""
|
||||
min_value = 0
|
||||
max_value = 1
|
||||
step = 1
|
||||
index = 0
|
||||
value = None
|
||||
values = None
|
||||
def __init__(self, shortname):
|
||||
self.shortname = shortname
|
||||
"Paparazzi Setting Class"
|
||||
shortname = ""
|
||||
min_value = 0
|
||||
max_value = 1
|
||||
step = 1
|
||||
index = 0
|
||||
value = None
|
||||
values = None
|
||||
|
||||
def __init__(self, shortname):
|
||||
self.shortname = shortname
|
||||
|
||||
|
||||
def test():
|
||||
ac_id = 164
|
||||
ac_settings = PaparazziACSettings(ac_id)
|
||||
for setting_group in ac_settings.groups:
|
||||
print setting_group.name
|
||||
ac_id = 164
|
||||
ac_settings = PaparazziACSettings(ac_id)
|
||||
for setting_group in ac_settings.groups:
|
||||
print(setting_group.name)
|
||||
for setting in setting_group.member_list:
|
||||
print " " + setting.shortname
|
||||
print(" " + setting.shortname)
|
||||
|
||||
if __name__ == '__main__':
|
||||
test()
|
||||
|
||||
|
||||
test()
|
||||
|
||||
Reference in New Issue
Block a user