update pmslive and tcpclient, add support for AVR.
This commit is contained in:
parent
01a573a1af
commit
205725872a
13
README.rst
13
README.rst
@ -66,13 +66,20 @@ To install latest development version (dev-2.0) from the GitHub:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Live view traffic
|
Live view traffic (pmslive)
|
||||||
----------------------------------------------------
|
----------------------------------------------------
|
||||||
Supports Mode-S Beast raw stream
|
Supports **Mode-S Beast** and **AVR** raw stream
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
pmslive --server URL/IP --port PORT --lat0 RECEIVER_LAT --lon0 RECEIVER_LON
|
pmslive --server [server_address] --port [tcp_port] --rawtype [beast_or_avr] --latlon [lat] [lon]
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
--server SERVER server address or IP
|
||||||
|
--port PORT raw data port
|
||||||
|
--rawtype RAWTYPE beast or avr
|
||||||
|
--latlon LAT LON receiver position
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
Stream beast raw data from a TCP server, convert to mode-s messages
|
Stream beast raw data from a TCP server, convert to mode-s messages
|
||||||
'''
|
'''
|
||||||
from __future__ import print_function, division
|
from __future__ import print_function, division
|
||||||
|
import os
|
||||||
import sys
|
import sys
|
||||||
import socket
|
import socket
|
||||||
import time
|
import time
|
||||||
@ -13,12 +14,15 @@ else:
|
|||||||
PY_VERSION = 2
|
PY_VERSION = 2
|
||||||
|
|
||||||
class BaseClient(Thread):
|
class BaseClient(Thread):
|
||||||
def __init__(self, host, port):
|
def __init__(self, host, port, rawtype):
|
||||||
Thread.__init__(self)
|
Thread.__init__(self)
|
||||||
self.host = host
|
self.host = host
|
||||||
self.port = port
|
self.port = port
|
||||||
self.buffer = []
|
self.buffer = []
|
||||||
|
self.rawtype = rawtype
|
||||||
|
if self.rawtype not in ['avr', 'beast']:
|
||||||
|
print("rawtype must be either avr or beast")
|
||||||
|
os._exit(1)
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
while True:
|
while True:
|
||||||
@ -33,6 +37,33 @@ class BaseClient(Thread):
|
|||||||
print("Socket connection error: %s. reconnecting..." % err)
|
print("Socket connection error: %s. reconnecting..." % err)
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
|
|
||||||
|
|
||||||
|
def read_avr_buffer(self):
|
||||||
|
# -- testing --
|
||||||
|
# for b in self.buffer:
|
||||||
|
# print(chr(b), b)
|
||||||
|
|
||||||
|
# Append message with 0-9,A-F,a-f, until stop sign
|
||||||
|
|
||||||
|
messages = []
|
||||||
|
|
||||||
|
msg_stop = False
|
||||||
|
for b in self.buffer:
|
||||||
|
if b == 59:
|
||||||
|
msg_stop = True
|
||||||
|
ts = time.time()
|
||||||
|
messages.append([self.current_msg, ts])
|
||||||
|
if b == 42:
|
||||||
|
msg_stop = False
|
||||||
|
self.current_msg = ''
|
||||||
|
|
||||||
|
if (not msg_stop) and (48<=b<=57 or 65<=b<=70 or 97<=b<=102):
|
||||||
|
self.current_msg = self.current_msg + chr(b)
|
||||||
|
|
||||||
|
self.buffer = []
|
||||||
|
|
||||||
|
return messages
|
||||||
|
|
||||||
def read_beast_buffer(self):
|
def read_beast_buffer(self):
|
||||||
'''
|
'''
|
||||||
<esc> "1" : 6 byte MLAT timestamp, 1 byte signal level,
|
<esc> "1" : 6 byte MLAT timestamp, 1 byte signal level,
|
||||||
@ -91,6 +122,8 @@ class BaseClient(Thread):
|
|||||||
# extract messages
|
# extract messages
|
||||||
messages = []
|
messages = []
|
||||||
for mm in messages_mlat:
|
for mm in messages_mlat:
|
||||||
|
ts = time.time()
|
||||||
|
|
||||||
msgtype = mm[0]
|
msgtype = mm[0]
|
||||||
# print(''.join('%02X' % i for i in mm))
|
# print(''.join('%02X' % i for i in mm))
|
||||||
|
|
||||||
@ -108,11 +141,10 @@ class BaseClient(Thread):
|
|||||||
# incomplete message
|
# incomplete message
|
||||||
continue
|
continue
|
||||||
|
|
||||||
ts = time.time()
|
|
||||||
|
|
||||||
messages.append([msg, ts])
|
messages.append([msg, ts])
|
||||||
return messages
|
return messages
|
||||||
|
|
||||||
|
|
||||||
def handle_messages(self, messages):
|
def handle_messages(self, messages):
|
||||||
"""re-implement this method to handle the messages"""
|
"""re-implement this method to handle the messages"""
|
||||||
for msg, t in messages:
|
for msg, t in messages:
|
||||||
@ -136,7 +168,10 @@ class BaseClient(Thread):
|
|||||||
# continue
|
# continue
|
||||||
# -- Removed!! Cause delay in low data rate scenario --
|
# -- Removed!! Cause delay in low data rate scenario --
|
||||||
|
|
||||||
|
if self.rawtype == 'beast':
|
||||||
messages = self.read_beast_buffer()
|
messages = self.read_beast_buffer()
|
||||||
|
elif self.rawtype == 'avr':
|
||||||
|
messages = self.read_avr_buffer()
|
||||||
|
|
||||||
if not messages:
|
if not messages:
|
||||||
continue
|
continue
|
@ -7,7 +7,7 @@ import argparse
|
|||||||
import curses
|
import curses
|
||||||
from threading import Lock
|
from threading import Lock
|
||||||
import pyModeS as pms
|
import pyModeS as pms
|
||||||
from pyModeS.extra.beastclient import BaseClient
|
from pyModeS.extra.tcpclient import BaseClient
|
||||||
from pyModeS.streamer.stream import Stream
|
from pyModeS.streamer.stream import Stream
|
||||||
from pyModeS.streamer.screen import Screen
|
from pyModeS.streamer.screen import Screen
|
||||||
|
|
||||||
@ -19,19 +19,21 @@ COMMB_TS = []
|
|||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('--server', help='server address or IP', required=True)
|
parser.add_argument('--server', help='server address or IP', required=True)
|
||||||
parser.add_argument('--port', help='Raw beast port', required=True)
|
parser.add_argument('--port', help='raw data port', required=True)
|
||||||
parser.add_argument('--lat0', help='Latitude of receiver', required=True)
|
parser.add_argument('--rawtype', help='beast or avr', required=True)
|
||||||
parser.add_argument('--lon0', help='Longitude of receiver', required=True)
|
parser.add_argument('--latlon', help='receiver position', nargs=2, metavar=('LAT', 'LON'), required=True)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
SERVER = args.server
|
SERVER = args.server
|
||||||
PORT = int(args.port)
|
PORT = int(args.port)
|
||||||
LAT0 = float(args.lat0) # 51.9899 for TU Delft
|
RAWTYPE = args.rawtype
|
||||||
LON0 = float(args.lon0) # 4.3754
|
LAT0 = float(args.latlon[0])
|
||||||
|
LON0 = float(args.latlon[1])
|
||||||
|
|
||||||
|
|
||||||
class ModesClient(BaseClient):
|
class ModesClient(BaseClient):
|
||||||
def __init__(self, host, port):
|
def __init__(self, host, port, rawtype):
|
||||||
super(ModesClient, self).__init__(host, port)
|
super(ModesClient, self).__init__(host, port, rawtype)
|
||||||
|
|
||||||
def handle_messages(self, messages):
|
def handle_messages(self, messages):
|
||||||
local_buffer_adsb_msg = []
|
local_buffer_adsb_msg = []
|
||||||
@ -66,7 +68,7 @@ class ModesClient(BaseClient):
|
|||||||
# redirect all stdout to null, avoiding messing up with the screen
|
# redirect all stdout to null, avoiding messing up with the screen
|
||||||
sys.stdout = open(os.devnull, 'w')
|
sys.stdout = open(os.devnull, 'w')
|
||||||
|
|
||||||
client = ModesClient(host=SERVER, port=PORT)
|
client = ModesClient(host=SERVER, port=PORT, rawtype=RAWTYPE)
|
||||||
client.daemon = True
|
client.daemon = True
|
||||||
client.start()
|
client.start()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user