def client_settings_update(data): global chasemapper_config, habitat_uploader _predictor_change = "none" if (chasemapper_config["pred_enabled"] == False) and (data["pred_enabled"] == True): _predictor_change = "restart" elif (chasemapper_config["pred_enabled"] == True) and ( data["pred_enabled"] == False ): _predictor_change = "stop" _habitat_change = "none" if (chasemapper_config["habitat_upload_enabled"] == False) and ( data["habitat_upload_enabled"] == True ): _habitat_change = "start" elif (chasemapper_config["habitat_upload_enabled"] == True) and ( data["habitat_upload_enabled"] == False ): _habitat_change = "stop" # Overwrite local config data with data from the client. chasemapper_config = data if _predictor_change == "restart": # Wait until any current predictions have finished. while predictor_semaphore: time.sleep(0.1) # Attempt to start the predictor. initPredictor() elif _predictor_change == "stop": # Wait until any current predictions have finished. while predictor_semaphore: time.sleep(0.1) predictor = None # Start or Stop the Habitat Chase-Car Uploader. if _habitat_change == "start": if habitat_uploader == None: habitat_uploader = HabitatChaseUploader( update_rate=chasemapper_config["habitat_update_rate"], callsign=chasemapper_config["habitat_call"], ) elif _habitat_change == "stop": habitat_uploader.close() habitat_uploader = None # Update the habitat uploader with a new update rate, if one has changed. if habitat_uploader != None: habitat_uploader.set_update_rate(chasemapper_config["habitat_update_rate"]) habitat_uploader.set_callsign(chasemapper_config["habitat_call"]) # Push settings back out to all clients. flask_emit_event("server_settings_update", chasemapper_config)
# Set speed gate for car position object car_track.heading_gate_threshold = chasemapper_config['car_speed_gate'] # Start listeners using the default profile selection. start_listeners( chasemapper_config['profiles'][chasemapper_config['selected_profile']]) # Start up the predictor, if enabled. if chasemapper_config['pred_enabled']: initPredictor() # Start up the Habitat Chase-Car Uploader, if enabled if chasemapper_config['habitat_upload_enabled']: habitat_uploader = HabitatChaseUploader( update_rate=chasemapper_config['habitat_update_rate'], callsign=chasemapper_config['habitat_call']) # Start up the data age monitor thread. _data_age_monitor = Thread(target=check_data_age) _data_age_monitor.start() # Run the Flask app, which will block until CTRL-C'd. socketio.run(app, host=chasemapper_config['flask_host'], port=chasemapper_config['flask_port']) # Close the predictor and data age monitor threads. predictor_thread_running = False data_monitor_thread_running = False
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.")
def client_settings_update(data): global chasemapper_config, online_uploader _predictor_change = "none" if (chasemapper_config["pred_enabled"] == False) and (data["pred_enabled"] == True): _predictor_change = "restart" elif (chasemapper_config["pred_enabled"] == True) and (data["pred_enabled"] == False): _predictor_change = "stop" _habitat_change = "none" if (chasemapper_config["habitat_upload_enabled"] == False) and (data["habitat_upload_enabled"] == True): _habitat_change = "start" elif (chasemapper_config["habitat_upload_enabled"] == True) and (data["habitat_upload_enabled"] == False): _habitat_change = "stop" # Overwrite local config data with data from the client. chasemapper_config = data if _predictor_change == "restart": # Wait until any current predictions have finished. while predictor_semaphore: time.sleep(0.1) # Attempt to start the predictor. initPredictor() elif _predictor_change == "stop": # Wait until any current predictions have finished. while predictor_semaphore: time.sleep(0.1) predictor = None # Start or Stop the Habitat Chase-Car Uploader. if _habitat_change == "start": if online_uploader == None: _tracker = chasemapper_config["profiles"][ chasemapper_config["selected_profile"]]["online_tracker"] if _tracker == "habitat": online_uploader = HabitatChaseUploader( update_rate=chasemapper_config["habitat_update_rate"], callsign=chasemapper_config["habitat_call"], ) elif _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." % _tracker) elif _habitat_change == "stop": online_uploader.close() online_uploader = None # Update the habitat uploader with a new update rate, if one has changed. if online_uploader != None: online_uploader.set_update_rate( chasemapper_config["habitat_update_rate"]) online_uploader.set_callsign(chasemapper_config["habitat_call"]) # Push settings back out to all clients. flask_emit_event("server_settings_update", chasemapper_config)
# Set speed gate for car position object car_track.heading_gate_threshold = chasemapper_config["car_speed_gate"] # Start listeners using the default profile selection. start_listeners( chasemapper_config["profiles"][chasemapper_config["selected_profile"]] ) # Start up the predictor, if enabled. if chasemapper_config["pred_enabled"]: initPredictor() # Start up the Habitat Chase-Car Uploader, if enabled if chasemapper_config["habitat_upload_enabled"]: habitat_uploader = HabitatChaseUploader( update_rate=chasemapper_config["habitat_update_rate"], callsign=chasemapper_config["habitat_call"], ) # Read in last known position, if enabled if chasemapper_config["reload_last_position"]: logging.info("Read in last position requested") try: handle_new_payload_position(read_last_balloon_telemetry(), False) except Exception as e: logging.warning("Unable to read in last position") else: logging.debug("Read in last position not requested") # Start up the data age monitor thread. _data_age_monitor = Thread(target=check_data_age)