update live screen
This commit is contained in:
+19
-28
@@ -176,14 +176,25 @@ def oe_flag(msg):
|
|||||||
msgbin = common.hex2bin(msg)
|
msgbin = common.hex2bin(msg)
|
||||||
return int(msgbin[53])
|
return int(msgbin[53])
|
||||||
|
|
||||||
# Uncertainty & accuracy
|
|
||||||
def nic(msg, *argv):
|
def version(msg):
|
||||||
if len(argv) == 1:
|
"""ADS-B Version
|
||||||
# assume ads-b v1, only one supplement bit
|
|
||||||
return nic_v1(msg, *argv)
|
Args:
|
||||||
elif len(argv) == 3:
|
msg (string): 28 bytes hexadecimal message string, TC = 31
|
||||||
# assume ads-b v2, three supplement bits
|
|
||||||
return nic_v2(msg, *argv)
|
Returns:
|
||||||
|
int: version number
|
||||||
|
"""
|
||||||
|
tc = typecode(msg)
|
||||||
|
|
||||||
|
if tc != 31:
|
||||||
|
raise RuntimeError("%s: Not a status operation message, expecting TC = 31" % msg)
|
||||||
|
|
||||||
|
msgbin = common.hex2bin(msg)
|
||||||
|
version = common.bin2int(msgbin[72:75])
|
||||||
|
|
||||||
|
return version
|
||||||
|
|
||||||
|
|
||||||
def nic_v1(msg, nic_sup_b):
|
def nic_v1(msg, nic_sup_b):
|
||||||
@@ -461,23 +472,3 @@ def sil(msg, version):
|
|||||||
sil_sup = common.bin2int(msgbin[86])
|
sil_sup = common.bin2int(msgbin[86])
|
||||||
|
|
||||||
return sil, sil_sup
|
return sil, sil_sup
|
||||||
|
|
||||||
|
|
||||||
def version(msg):
|
|
||||||
"""ADS-B Version
|
|
||||||
|
|
||||||
Args:
|
|
||||||
msg (string): 28 bytes hexadecimal message string, TC = 31
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
int: version number
|
|
||||||
"""
|
|
||||||
tc = typecode(msg)
|
|
||||||
|
|
||||||
if tc != 31:
|
|
||||||
raise RuntimeError("%s: Not a status operation message, expecting TC = 31" % msg)
|
|
||||||
|
|
||||||
msgbin = common.hex2bin(msg)
|
|
||||||
version = common.bin2int(msgbin[72:75])
|
|
||||||
|
|
||||||
return version
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
from __future__ import print_function, division
|
from __future__ import print_function, division
|
||||||
|
import os
|
||||||
import curses
|
import curses
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import time
|
import time
|
||||||
@@ -20,7 +21,7 @@ COLUMNS = [
|
|||||||
('NACv', 5),
|
('NACv', 5),
|
||||||
('NACp', 5),
|
('NACp', 5),
|
||||||
('SIL', 5),
|
('SIL', 5),
|
||||||
('updated', 12),
|
('live', 6),
|
||||||
]
|
]
|
||||||
|
|
||||||
class Screen(Thread):
|
class Screen(Thread):
|
||||||
@@ -45,7 +46,7 @@ class Screen(Thread):
|
|||||||
|
|
||||||
def draw_frame(self):
|
def draw_frame(self):
|
||||||
self.screen.border(0)
|
self.screen.border(0)
|
||||||
self.screen.addstr(0, 2, "Online aircraft ('crtl+c' to exit, 'enter' to select)")
|
self.screen.addstr(0, 2, "Online aircraft ('ESC' to exit, 'Enter' to lock one)")
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
if len(self.acs) == 0:
|
if len(self.acs) == 0:
|
||||||
@@ -64,12 +65,15 @@ class Screen(Thread):
|
|||||||
|
|
||||||
header = ' icao'
|
header = ' icao'
|
||||||
for c, cw in COLUMNS:
|
for c, cw in COLUMNS:
|
||||||
c = 'updated' if c=='t' else c
|
|
||||||
header += (cw-len(c))*' ' + c
|
header += (cw-len(c))*' ' + c
|
||||||
|
|
||||||
|
# fill end with spaces
|
||||||
|
header += (self.scr_w - 2 - len(header)) * ' '
|
||||||
|
|
||||||
if len(header) > self.scr_w - 2:
|
if len(header) > self.scr_w - 2:
|
||||||
header = header[:self.scr_w-3] + '>'
|
header = header[:self.scr_w-3] + '>'
|
||||||
|
|
||||||
|
|
||||||
self.screen.addstr(row, 1, header)
|
self.screen.addstr(row, 1, header)
|
||||||
|
|
||||||
row +=1
|
row +=1
|
||||||
@@ -93,10 +97,18 @@ class Screen(Thread):
|
|||||||
line += icao
|
line += icao
|
||||||
|
|
||||||
for c, cw in COLUMNS:
|
for c, cw in COLUMNS:
|
||||||
val = '' if ac[c] is None else ac[c]
|
if c=='live':
|
||||||
|
val = int(time.time() - ac[c])
|
||||||
|
elif ac[c] is None:
|
||||||
|
val = ''
|
||||||
|
else:
|
||||||
|
val = ac[c]
|
||||||
val_str = str(val)
|
val_str = str(val)
|
||||||
line += (cw-len(val_str))*' ' + val_str
|
line += (cw-len(val_str))*' ' + val_str
|
||||||
|
|
||||||
|
# fill end with spaces
|
||||||
|
line += (self.scr_w - 2 - len(line)) * ' '
|
||||||
|
|
||||||
if len(line) > self.scr_w - 2:
|
if len(line) > self.scr_w - 2:
|
||||||
line = line[:self.scr_w-3] + '>'
|
line = line[:self.scr_w-3] + '>'
|
||||||
|
|
||||||
@@ -122,7 +134,10 @@ class Screen(Thread):
|
|||||||
while True:
|
while True:
|
||||||
c = self.screen.getch()
|
c = self.screen.getch()
|
||||||
|
|
||||||
if c == curses.KEY_HOME:
|
if c == 27:
|
||||||
|
curses.endwin()
|
||||||
|
os._exit(1)
|
||||||
|
elif c == curses.KEY_HOME:
|
||||||
self.x = 1
|
self.x = 1
|
||||||
self.y = 1
|
self.y = 1
|
||||||
elif c == curses.KEY_NPAGE:
|
elif c == curses.KEY_NPAGE:
|
||||||
@@ -145,3 +160,6 @@ class Screen(Thread):
|
|||||||
self.y = y_intent
|
self.y = y_intent
|
||||||
elif c == curses.KEY_ENTER or c == 10 or c == 13:
|
elif c == curses.KEY_ENTER or c == 10 or c == 13:
|
||||||
self.lock_icao = (self.screen.instr(self.y, 1, 6)).decode()
|
self.lock_icao = (self.screen.instr(self.y, 1, 6)).decode()
|
||||||
|
elif c == curses.KEY_F5:
|
||||||
|
self.screen.refresh()
|
||||||
|
self.draw_frame()
|
||||||
|
|||||||
+13
-30
@@ -36,7 +36,7 @@ class Stream():
|
|||||||
|
|
||||||
if icao not in self.acs:
|
if icao not in self.acs:
|
||||||
self.acs[icao] = {
|
self.acs[icao] = {
|
||||||
'updated': None,
|
'live': None,
|
||||||
'lat': None,
|
'lat': None,
|
||||||
'lon': None,
|
'lon': None,
|
||||||
'alt': None,
|
'alt': None,
|
||||||
@@ -54,7 +54,7 @@ class Stream():
|
|||||||
'SIL' : None
|
'SIL' : None
|
||||||
}
|
}
|
||||||
|
|
||||||
self.acs[icao]['updated'] = int(t)
|
self.acs[icao]['live'] = int(t)
|
||||||
|
|
||||||
if 1 <= tc <= 4:
|
if 1 <= tc <= 4:
|
||||||
self.acs[icao]['callsign'] = pms.adsb.callsign(msg)
|
self.acs[icao]['callsign'] = pms.adsb.callsign(msg)
|
||||||
@@ -110,34 +110,19 @@ class Stream():
|
|||||||
local_updated_acs_buffer.append(icao)
|
local_updated_acs_buffer.append(icao)
|
||||||
|
|
||||||
# Uncertainty & accuracy
|
# Uncertainty & accuracy
|
||||||
if (5 <= tc <= 8):
|
ac = self.acs[icao]
|
||||||
if self.acs[icao]['ver'] == 1:
|
|
||||||
if self.acs[icao]['nic_s'] != None:
|
if (5 <= tc <= 8) or (9 <= tc <= 18) or (20 <= tc <= 22):
|
||||||
self.acs[icao]['NIC'] = pms.adsb.nic_v1(msg, self.acs[icao]['nic_s'])
|
if (ac['ver'] == 1) and ('nic_s' in ac.keys()):
|
||||||
elif self.acs[icao]['ver'] == 2:
|
self.acs[icao]['NIC'] = pms.adsb.nic_v1(msg, ac['nic_s'])
|
||||||
if self.acs[icao]['nic_a'] != None and self.acs[icao]['nic_b'] != None:
|
elif (ac['ver'] == 2) and ('nic_a' in ac.keys()) and ('nic_b' in ac.keys()):
|
||||||
self.acs[icao]['NIC'] = pms.adsb.nic_v2(msg, self.acs[icao]['nic_a'], self.acs[icao]['nic_b'], self.acs[icao]['nic_c'])
|
self.acs[icao]['NIC'] = pms.adsb.nic_v2(msg, ac['nic_a'], ac['nic_b'], ac['nic_c'])
|
||||||
if (9 <= tc <= 18):
|
|
||||||
if self.acs[icao]['ver'] == 1:
|
|
||||||
if self.acs[icao]['nic_s'] != None:
|
|
||||||
self.acs[icao]['NIC'] = pms.adsb.nic_v1(msg, self.acs[icao]['nic_s'])
|
|
||||||
elif self.acs[icao]['ver'] == 2:
|
|
||||||
self.acs[icao]['nic_b'] = pms.adsb.nic_b(msg)
|
|
||||||
if self.acs[icao]['nic_a'] != None and self.acs[icao]['nic_b'] != None:
|
|
||||||
self.acs[icao]['NIC'] = pms.adsb.nic_v2(msg, self.acs[icao]['nic_a'], self.acs[icao]['nic_b'], self.acs[icao]['nic_c'])
|
|
||||||
if tc == 19:
|
if tc == 19:
|
||||||
if self.acs[icao]['ver'] in [1, 2]:
|
if ac['ver'] in [1, 2]:
|
||||||
self.acs[icao]['NACv'] = pms.adsb.nac_v(msg)
|
self.acs[icao]['NACv'] = pms.adsb.nac_v(msg)
|
||||||
if (20 <= tc <= 22):
|
|
||||||
if self.acs[icao]['ver'] == 1:
|
|
||||||
if self.acs[icao]['nic_s'] != None:
|
|
||||||
self.acs[icao]['NIC'] = pms.adsb.nic_v1(msg, self.acs[icao]['nic_s'])
|
|
||||||
elif self.acs[icao]['ver'] == 2:
|
|
||||||
if self.acs[icao]['nic_a'] != None and self.acs[icao]['nic_b'] != None:
|
|
||||||
self.acs[icao]['NIC'] = pms.adsb.nic_v2(msg, self.acs[icao]['nic_a'], self.acs[icao]['nic_b'], self.acs[icao]['nic_c'])
|
|
||||||
if tc == 29:
|
if tc == 29:
|
||||||
if self.acs[icao]['ver'] != None:
|
if ac['ver'] != None:
|
||||||
self.acs[icao]['SIL'], self.acs[icao]['sil_s'] = pms.adsb.sil(msg, self.acs[icao]['ver'])
|
self.acs[icao]['SIL'], self.acs[icao]['sil_s'] = pms.adsb.sil(msg, ac['ver'])
|
||||||
self.acs[icao]['NACp'] = pms.adsb.nac_p(msg)
|
self.acs[icao]['NACp'] = pms.adsb.nac_p(msg)
|
||||||
if tc == 31:
|
if tc == 31:
|
||||||
self.acs[icao]['ver'] = pms.adsb.version(msg)
|
self.acs[icao]['ver'] = pms.adsb.version(msg)
|
||||||
@@ -149,8 +134,6 @@ class Stream():
|
|||||||
self.acs[icao]['nic_a'], self.acs[icao]['nic_c'] = pms.adsb.nic_a_c(msg)
|
self.acs[icao]['nic_a'], self.acs[icao]['nic_c'] = pms.adsb.nic_a_c(msg)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# process commb message
|
# process commb message
|
||||||
for t, msg in zip(commb_ts, commb_msgs):
|
for t, msg in zip(commb_ts, commb_msgs):
|
||||||
icao = pms.icao(msg)
|
icao = pms.icao(msg)
|
||||||
@@ -183,7 +166,7 @@ class Stream():
|
|||||||
|
|
||||||
# clear up old data
|
# clear up old data
|
||||||
for icao in list(self.acs.keys()):
|
for icao in list(self.acs.keys()):
|
||||||
if self.t - self.acs[icao]['updated'] > self.cache_timeout:
|
if self.t - self.acs[icao]['live'] > self.cache_timeout:
|
||||||
del self.acs[icao]
|
del self.acs[icao]
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user