def handle_new_payload_position(data): _lat = data['lat'] _lon = data['lon'] _alt = data['alt'] _time_dt = data['time_dt'] _callsign = data['callsign'] _short_time = _time_dt.strftime("%H:%M:%S") if _callsign not in current_payloads: # New callsign! Create entries in data stores. current_payload_tracks[_callsign] = GenericTrack() current_payloads[_callsign] = { 'telem': { 'callsign': _callsign, 'position': [_lat, _lon, _alt], 'max_alt': 0.0, 'vel_v': 0.0, 'speed': 0.0, 'short_time': _short_time, 'time_to_landing': "", 'server_time': time.time() }, 'path': [], 'pred_path': [], 'pred_landing': [], 'burst': [], 'abort_path': [], 'abort_landing': [], 'max_alt': 0.0, 'snr': -255.0 } # Add new data into the payload's track, and get the latest ascent rate. current_payload_tracks[_callsign].add_telemetry({ 'time': _time_dt, 'lat': _lat, 'lon': _lon, 'alt': _alt, 'comment': _callsign }) _state = current_payload_tracks[_callsign].get_latest_state() if _state != None: _vel_v = _state['ascent_rate'] _speed = _state['speed'] # If this payload is in descent, calculate the time to landing. # Use < -1.0, to avoid jitter when the payload is on the ground. if _vel_v < -1.0: # Try and get the altitude of the chase car - we use this as the expected 'ground' level. _car_state = car_track.get_latest_state() if _car_state != None: _ground_asl = _car_state['alt'] else: _ground_asl = 0.0 # Calculate _ttl = time_to_landing(_alt, _vel_v, ground_asl=_ground_asl) if _ttl is None: _ttl = "" elif _ttl == 0: _ttl = "LANDED" else: _min = _ttl // 60 _sec = _ttl % 60 _ttl = "%02d:%02d" % (_min, _sec) else: _ttl = "" else: _vel_v = 0.0 _ttl = "" # Now update the main telemetry store. current_payloads[_callsign]['telem'] = { 'callsign': _callsign, 'position': [_lat, _lon, _alt], 'vel_v': _vel_v, 'speed': _speed, 'short_time': _short_time, 'time_to_landing': _ttl, 'server_time': time.time() } current_payloads[_callsign]['path'].append([_lat, _lon, _alt]) # Copy out any extra fields we may want to pass onto the GUI. for _field in EXTRA_FIELDS: if _field in data: current_payloads[_callsign]['telem'][_field] = data[_field] # Check if the current payload altitude is higher than our previous maximum altitude. if _alt > current_payloads[_callsign]['max_alt']: current_payloads[_callsign]['max_alt'] = _alt # Add the payload maximum altitude into the telemetry snapshot dictionary. current_payloads[_callsign]['telem']['max_alt'] = current_payloads[ _callsign]['max_alt'] # Update the web client. flask_emit_event('telemetry_event', current_payloads[_callsign]['telem']) # Add the position into the logger chase_logger.add_balloon_telemetry(data)
def handle_new_payload_position(data, log_position=True): _lat = data["lat"] _lon = data["lon"] _alt = data["alt"] _time_dt = data["time_dt"] _callsign = data["callsign"] _short_time = _time_dt.strftime("%H:%M:%S") if _callsign not in current_payloads: # New callsign! Create entries in data stores. current_payload_tracks[_callsign] = GenericTrack() current_payloads[_callsign] = { "telem": { "callsign": _callsign, "position": [_lat, _lon, _alt], "max_alt": 0.0, "vel_v": 0.0, "speed": 0.0, "short_time": _short_time, "time_to_landing": "", "server_time": time.time(), }, "path": [], "pred_path": [], "pred_landing": [], "burst": [], "abort_path": [], "abort_landing": [], "max_alt": 0.0, "snr": -255.0, } # Add new data into the payload's track, and get the latest ascent rate. current_payload_tracks[_callsign].add_telemetry({ "time": _time_dt, "lat": _lat, "lon": _lon, "alt": _alt, "comment": _callsign }) _state = current_payload_tracks[_callsign].get_latest_state() if _state != None: _vel_v = _state["ascent_rate"] _speed = _state["speed"] # If this payload is in descent, calculate the time to landing. # Use < -1.0, to avoid jitter when the payload is on the ground. if _vel_v < -1.0: # Try and get the altitude of the chase car - we use this as the expected 'ground' level. _car_state = car_track.get_latest_state() if _car_state != None: _ground_asl = _car_state["alt"] else: _ground_asl = 0.0 # Calculate _ttl = time_to_landing(_alt, _vel_v, ground_asl=_ground_asl) if _ttl is None: _ttl = "" elif _ttl == 0: _ttl = "LANDED" else: _min = _ttl // 60 _sec = _ttl % 60 _ttl = "%02d:%02d" % (_min, _sec) else: _ttl = "" else: _vel_v = 0.0 _ttl = "" # Now update the main telemetry store. current_payloads[_callsign]["telem"] = { "callsign": _callsign, "position": [_lat, _lon, _alt], "vel_v": _vel_v, "speed": _speed, "short_time": _short_time, "time_to_landing": _ttl, "server_time": time.time(), } current_payloads[_callsign]["path"].append([_lat, _lon, _alt]) # Copy out any extra fields we may want to pass onto the GUI. for _field in EXTRA_FIELDS: if _field in data: current_payloads[_callsign]["telem"][_field] = data[_field] # Check if the current payload altitude is higher than our previous maximum altitude. if _alt > current_payloads[_callsign]["max_alt"]: current_payloads[_callsign]["max_alt"] = _alt # Add the payload maximum altitude into the telemetry snapshot dictionary. current_payloads[_callsign]["telem"]["max_alt"] = current_payloads[ _callsign]["max_alt"] # Update the web client. flask_emit_event("telemetry_event", current_payloads[_callsign]["telem"]) # Add the position into the logger if chase_logger and log_position: chase_logger.add_balloon_telemetry(data) else: logging.debug("Point not logged.")