[ground_segment] Svinfo python viewer (#1860)

View Space Vehicle Azim and Elev with UsedInNav and Quality Colors and CNO bars in a python window.
This commit is contained in:
Christophe De Wagter
2016-09-25 23:09:10 +02:00
committed by Felix Ruess
parent f907ded25f
commit af59d22c52
3 changed files with 151 additions and 0 deletions
+1
View File
@@ -64,6 +64,7 @@
<program name="ADS-B Intruders receiver" command="sw/ground_segment/misc/sbs2ivy">
<arg flag="--ac" constant="@AC_ID"/>
</program>
<program name="SVInfo" command="sw/ground_segment/python/svinfo/svinfo.py"/>
</section>
<section name="sessions">
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env python
import wx
import svinfoviewer
class SVInfoFrame(wx.App):
def OnInit(self):
self.main = svinfoviewer.SVInfoFrame()
self.main.Show()
self.SetTopWindow(self.main)
return True
def main():
application = SVInfoFrame(0)
application.MainLoop()
if __name__ == '__main__':
main()
@@ -0,0 +1,132 @@
import wx
import sys
import os
import time
import threading
import math
import pynotify
sys.path.append(os.getenv("PAPARAZZI_HOME") + "/sw/ext/pprzlink/lib/v1.0/python")
from pprzlink.ivy import IvyMessagesInterface
WIDTH = 300
BARH = 140
CHANNEL = 16
def QIColour(qi):
return {
0: wx.Colour(64,64,64), # This channel is idle
1: wx.Colour(128,128,128), # Searching
2: wx.Colour(0,128,128), # Signal aquired
3: wx.Colour(255,0,0), # Signal detected but unusable
4: wx.Colour(0,0,255), # Code Lock on Signal
5: wx.Colour(0,255,0), # Code and Carrier locked
6: wx.Colour(0,255,0), # Code and Carrier locked
7: wx.Colour(0,255,0), # Code and Carrier locked
}[qi]
class SvChannel(object):
def __init__(self, chn, msg):
self.chn = chn
self.SVID = int(msg['SVID'])
self.Flags = int(msg['Flags'])
self.QI = int(msg['QI'])
self.CNO = int(msg['CNO'])
self.Elev = int(msg['Elev'])
self.Azim = int(msg['Azim'])
class SVInfoFrame(wx.Frame):
def message_recv(self, ac_id, msg):
if msg.name == "SVINFO":
chn = int(msg['chn'])
self.sv[chn] = SvChannel(chn, msg)
wx.CallAfter(self.update)
def update(self):
self.Refresh()
def OnSize(self, event):
self.w = event.GetSize()[0]
self.h = event.GetSize()[1]
self.Refresh()
def OnPaint(self, e):
tdx = -5
tdy = -7
th = 15
w = self.w
h = self.w
if h < self.w + 50:
h = self.w + 50
bar = self.h-w-th-th
dc = wx.PaintDC(self)
brush = wx.Brush("white")
dc.SetBackground(brush)
dc.Clear()
# Background
dc.SetBrush(wx.Brush(wx.Colour(0,0,0), wx.TRANSPARENT))
dc.DrawCircle(w/2,w/2,w/2-1)
dc.DrawCircle(w/2,w/2,w/4-1)
dc.DrawCircle(w/2,w/2,1)
font = wx.Font(11, wx.ROMAN, wx.BOLD, wx.NORMAL)
dc.SetFont(font)
dc.DrawText("N",w/2+tdx,2)
dc.DrawText("S",w/2+tdx,w-17)
dc.DrawText("E",w-15,w/2+tdy)
dc.DrawText("W",2,w/2+tdy)
# SV
for chn in self.sv:
sv = self.sv[chn]
c = QIColour(sv.QI)
used = sv.Flags & 1
s = 7 + used * 5
el = float(sv.Elev) / 90.0 * float(w) / 2.0
az = float(sv.Azim) * math.pi / 180.0
y = float(w)/2.0 - math.cos(az) * el
x = float(w)/2.0 + math.sin(az) * el
dc.SetBrush(wx.Brush(c, wx.SOLID))
dc.DrawCircle(int(x),int(y),s)
font = wx.Font(8, wx.ROMAN, wx.NORMAL, wx.NORMAL)
dc.SetFont(font)
dc.DrawText(str(sv.SVID),x+tdx,y+tdy)
bh = float(bar-th-th) * float(sv.CNO) / 55.0
dc.DrawRectangle(w/CHANNEL*chn+5 * (1-used),self.h-th-bh,w/CHANNEL-2 - 10 * (1-used),bh)
dc.DrawText(str(chn),w/CHANNEL*chn,self.h-th)
dc.DrawText(str(sv.CNO),w/CHANNEL*chn,self.h-bar)
def __init__(self):
self.w = WIDTH
self.h = WIDTH + BARH
wx.Frame.__init__(self, id=-1, parent=None, name=u'SVInfoFrame',
size=wx.Size(self.w, self.h), title=u'SV Info')
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.sv = {}
self.interface = IvyMessagesInterface("svinfoframe")
self.interface.subscribe(self.message_recv)
def OnClose(self, event):
self.interface.shutdown()
self.Destroy()