def start_listeners(profile): """ Stop any currently running listeners, and startup a set of data listeners based on the supplied profile Args: profile (dict): A dictionary containing: 'name' (str): Profile name 'telemetry_source_type' (str): Data source type (ozimux or horus_udp) 'telemetry_source_port' (int): Data source port 'car_source_type' (str): Car Position source type (none, horus_udp or gpsd) 'car_source_port' (int): Car Position source port """ global data_listeners # Stop any existing listeners. for _thread in data_listeners: try: _thread.close() except Exception as e: logging.error("Error closing thread - %s" % str(e)) # Reset the listeners array. data_listeners = [] # Start up a OziMux listener, if we are using one. if profile['telemetry_source_type'] == "ozimux": logging.info("Using OziMux data source on UDP Port %d" % profile['telemetry_source_port']) _ozi_listener = OziListener(telemetry_callback=ozi_listener_callback, port=profile['telemetry_source_port']) data_listeners.append(_ozi_listener) # Start up UDP Broadcast Listener (which we use for car positions even if not for the payload) # Case 1 - Both telemetry and car position sources are set to horus_udp, and have the same port set. Only start a single UDP listener if (profile['telemetry_source_type'] == "horus_udp") and ( profile['car_source_type'] == "horus_udp") and (profile['car_source_port'] == profile['telemetry_source_port']): # In this case, we start a single Horus UDP listener. logging.info("Starting single Horus UDP listener on port %d" % profile['telemetry_source_port']) _telem_horus_udp_listener = UDPListener( summary_callback=udp_listener_summary_callback, gps_callback=udp_listener_car_callback, bearing_callback=udp_listener_bearing_callback, port=profile['telemetry_source_port']) _telem_horus_udp_listener.start() data_listeners.append(_telem_horus_udp_listener) else: if profile['telemetry_source_type'] == "horus_udp": # Telemetry via Horus UDP - Start up a listener logging.info("Starting Telemetry Horus UDP listener on port %d" % profile['telemetry_source_port']) _telem_horus_udp_listener = UDPListener( summary_callback=udp_listener_summary_callback, gps_callback=None, bearing_callback=udp_listener_bearing_callback, port=profile['telemetry_source_port']) _telem_horus_udp_listener.start() data_listeners.append(_telem_horus_udp_listener) if profile['car_source_type'] == "horus_udp": # Car Position via Horus UDP - Start up a listener logging.info( "Starting Car Position Horus UDP listener on port %d" % profile['car_source_port']) _car_horus_udp_listener = UDPListener( summary_callback=None, gps_callback=udp_listener_car_callback, bearing_callback=udp_listener_bearing_callback, port=profile['car_source_port']) _car_horus_udp_listener.start() data_listeners.append(_car_horus_udp_listener) elif profile['car_source_type'] == "gpsd": # GPSD Car Position Source logging.info("Starting GPSD Car Position Listener.") _gpsd_gps = GPSDAdaptor( hostname=chasemapper_config['car_gpsd_host'], port=chasemapper_config['car_gpsd_port'], callback=udp_listener_car_callback) data_listeners.append(_gpsd_gps) elif profile['car_source_type'] == "serial": # Serial GPS Source. logging.info("Starting Serial GPS Listener.") _serial_gps = SerialGPS( serial_port=chasemapper_config['car_serial_port'], serial_baud=chasemapper_config['car_serial_baud'], callback=udp_listener_car_callback) data_listeners.append(_serial_gps) else: # No Car position. logging.info("No car position data source.")
def start_listeners(profile): """ Stop any currently running listeners, and startup a set of data listeners based on the supplied profile Args: profile (dict): A dictionary containing: 'name' (str): Profile name 'telemetry_source_type' (str): Data source type (ozimux or horus_udp) 'telemetry_source_port' (int): Data source port 'car_source_type' (str): Car Position source type (none, horus_udp, gpsd, or station) 'car_source_port' (int): Car Position source port 'online_tracker' (str): Which online tracker to upload chase-car info to ('habitat' or 'sondehub') """ global data_listeners, current_profile, online_uploader, chasemapper_config current_profile = profile # Stop any existing listeners. for _thread in data_listeners: try: _thread.close() except Exception as e: logging.error("Error closing thread - %s" % str(e)) # Shut-down any online uploaders if online_uploader != None: online_uploader.close() online_uploader = None # Reset the listeners array. data_listeners = [] # Start up a new online uploader immediately if uploading is already enabled. if chasemapper_config["habitat_upload_enabled"] == True: if profile["online_tracker"] == "habitat": online_uploader = HabitatChaseUploader( update_rate=chasemapper_config["habitat_update_rate"], callsign=chasemapper_config["habitat_call"], ) elif profile["online_tracker"] == "sondehub": online_uploader = SondehubChaseUploader( update_rate=chasemapper_config["habitat_update_rate"], callsign=chasemapper_config["habitat_call"], ) else: logging.error("Unknown Online Tracker %s, not starting uploader" % (profile["online_tracker"])) # Start up a OziMux listener, if we are using one. if profile["telemetry_source_type"] == "ozimux": logging.info("Using OziMux data source on UDP Port %d" % profile["telemetry_source_port"]) _ozi_listener = OziListener( telemetry_callback=ozi_listener_callback, port=profile["telemetry_source_port"], ) data_listeners.append(_ozi_listener) # Start up UDP Broadcast Listener (which we use for car positions even if not for the payload) # Case 1 - Both telemetry and car position sources are set to horus_udp, and have the same port set. Only start a single UDP listener if ((profile["telemetry_source_type"] == "horus_udp") and (profile["car_source_type"] == "horus_udp") and (profile["car_source_port"] == profile["telemetry_source_port"])): # In this case, we start a single Horus UDP listener. logging.info("Starting single Horus UDP listener on port %d" % profile["telemetry_source_port"]) _telem_horus_udp_listener = UDPListener( summary_callback=udp_listener_summary_callback, gps_callback=udp_listener_car_callback, bearing_callback=udp_listener_bearing_callback, port=profile["telemetry_source_port"], ) _telem_horus_udp_listener.start() data_listeners.append(_telem_horus_udp_listener) else: if profile["telemetry_source_type"] == "horus_udp": # Telemetry via Horus UDP - Start up a listener logging.info("Starting Telemetry Horus UDP listener on port %d" % profile["telemetry_source_port"]) _telem_horus_udp_listener = UDPListener( summary_callback=udp_listener_summary_callback, gps_callback=None, bearing_callback=udp_listener_bearing_callback, port=profile["telemetry_source_port"], ) _telem_horus_udp_listener.start() data_listeners.append(_telem_horus_udp_listener) if profile["car_source_type"] == "horus_udp": # Car Position via Horus UDP - Start up a listener logging.info( "Starting Car Position Horus UDP listener on port %d" % profile["car_source_port"]) _car_horus_udp_listener = UDPListener( summary_callback=None, gps_callback=udp_listener_car_callback, bearing_callback=udp_listener_bearing_callback, port=profile["car_source_port"], ) _car_horus_udp_listener.start() data_listeners.append(_car_horus_udp_listener) elif profile["car_source_type"] == "gpsd": # GPSD Car Position Source logging.info("Starting GPSD Car Position Listener.") _gpsd_gps = GPSDAdaptor( hostname=chasemapper_config["car_gpsd_host"], port=chasemapper_config["car_gpsd_port"], callback=udp_listener_car_callback, ) data_listeners.append(_gpsd_gps) elif profile["car_source_type"] == "serial": # Serial GPS Source. logging.info("Starting Serial GPS Listener.") _serial_gps = SerialGPS( serial_port=chasemapper_config["car_serial_port"], serial_baud=chasemapper_config["car_serial_baud"], callback=udp_listener_car_callback, ) data_listeners.append(_serial_gps) elif profile["car_source_type"] == "station": logging.info("Using Stationary receiver position.") else: # No Car position. logging.info("No car position data source.")