2016-02-18 21:28:03 +00:00
|
|
|
import logging
|
2018-09-03 17:58:35 +00:00
|
|
|
from math import log10
|
2017-10-03 11:31:24 +00:00
|
|
|
|
2018-01-04 11:52:19 +00:00
|
|
|
from mgrs import MGRS
|
|
|
|
|
2018-09-03 17:58:35 +00:00
|
|
|
from ogn.utils import haversine
|
2016-02-18 21:28:03 +00:00
|
|
|
from ogn.commands.dbutils import session
|
2017-05-26 20:56:38 +00:00
|
|
|
from ogn.model import AircraftBeacon, ReceiverBeacon, Location
|
2017-10-03 11:31:24 +00:00
|
|
|
from ogn.parser import parse, ParseError
|
2018-09-03 17:58:35 +00:00
|
|
|
from ogn.gateway.process_tools import DbSaver, Converter, DummyMerger, AIRCRAFT_TYPES, RECEIVER_TYPES
|
2017-10-03 11:31:24 +00:00
|
|
|
|
2016-02-18 21:28:03 +00:00
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
2018-01-04 11:52:19 +00:00
|
|
|
myMGRS = MGRS()
|
2016-02-18 21:28:03 +00:00
|
|
|
|
|
|
|
|
2018-09-03 17:58:35 +00:00
|
|
|
|
|
|
|
def _replace_lonlat_with_wkt(message, reference_receiver=None):
|
2018-01-19 18:14:57 +00:00
|
|
|
latitude = message['latitude']
|
|
|
|
longitude = message['longitude']
|
|
|
|
|
2018-04-27 19:48:14 +00:00
|
|
|
if reference_receiver is not None:
|
2018-09-03 17:58:35 +00:00
|
|
|
distance,bearing = haversine(reference_receiver['latitude'], reference_receiver['longitude'], latitude, longitude)
|
|
|
|
message['distance'] = distance
|
|
|
|
message['radial'] = round(bearing)
|
2018-10-21 15:34:03 +00:00
|
|
|
if 'signal_quality' in message and message['signal_quality'] is not None and distance >= 1:
|
|
|
|
message['quality'] = message['signal_quality'] + 20 * log10(message['distance'] / 10000) # normalized to 10km
|
2018-02-11 10:55:29 +00:00
|
|
|
|
2018-01-19 18:14:57 +00:00
|
|
|
location = Location(longitude, latitude)
|
2016-04-24 17:34:25 +00:00
|
|
|
message['location_wkt'] = location.to_wkt()
|
2018-01-19 18:14:57 +00:00
|
|
|
message['location_mgrs'] = myMGRS.toMGRS(latitude, longitude).decode('utf-8')
|
2016-04-24 17:34:25 +00:00
|
|
|
del message['latitude']
|
|
|
|
del message['longitude']
|
|
|
|
return message
|
|
|
|
|
2018-04-27 19:48:14 +00:00
|
|
|
|
2018-09-03 17:58:35 +00:00
|
|
|
receivers = dict()
|
2016-04-24 17:34:25 +00:00
|
|
|
|
2018-09-03 17:58:35 +00:00
|
|
|
def string_to_message(raw_string, reference_date):
|
2018-04-27 19:48:14 +00:00
|
|
|
global receivers
|
2016-10-03 13:14:44 +00:00
|
|
|
|
2018-09-03 17:58:35 +00:00
|
|
|
try:
|
|
|
|
message = parse(raw_string, reference_date)
|
|
|
|
except NotImplementedError as e:
|
|
|
|
logger.error('No parser implemented for message: {}'.format(raw_string))
|
|
|
|
return None
|
|
|
|
except ParseError as e:
|
|
|
|
logger.error('Parsing error with message: {}'.format(raw_string))
|
|
|
|
return None
|
|
|
|
except TypeError as e:
|
|
|
|
logger.error('TypeError with message: {}'.format(raw_string))
|
|
|
|
return None
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(raw_string)
|
|
|
|
logger.error(e)
|
|
|
|
return None
|
|
|
|
|
|
|
|
# update reference receivers and distance to the receiver
|
|
|
|
if message['aprs_type'] == 'position':
|
|
|
|
if message['beacon_type'] in RECEIVER_TYPES:
|
|
|
|
receivers.update({message['name']: {'latitude': message['latitude'], 'longitude': message['longitude']}})
|
|
|
|
message = _replace_lonlat_with_wkt(message)
|
|
|
|
elif message['beacon_type'] in AIRCRAFT_TYPES:
|
|
|
|
reference_receiver = receivers.get(message['receiver_name'])
|
|
|
|
message = _replace_lonlat_with_wkt(message, reference_receiver=reference_receiver)
|
|
|
|
if 'gps_quality' in message and message['gps_quality'] is not None and 'horizontal' in message['gps_quality']:
|
|
|
|
message['gps_quality_horizontal'] = message['gps_quality']['horizontal']
|
|
|
|
message['gps_quality_vertical'] = message['gps_quality']['vertical']
|
|
|
|
|
|
|
|
# update raw_message
|
|
|
|
message['raw_message'] = raw_string
|
|
|
|
|
|
|
|
return message
|
|
|
|
|
|
|
|
|
|
|
|
# Build the processing pipeline
|
|
|
|
saver = DbSaver(session=session)
|
|
|
|
converter = Converter(callback=saver)
|
|
|
|
merger = DummyMerger(callback=converter)
|
|
|
|
|
|
|
|
|
|
|
|
def process_raw_message(raw_message, reference_date=None, merger=merger):
|
|
|
|
logger.debug('Received message: {}'.format(raw_message))
|
|
|
|
message = string_to_message(raw_message, reference_date)
|
|
|
|
merger.add_message(message)
|
|
|
|
|
|
|
|
|