diff --git a/horusmapper.py b/horusmapper.py index 2656855..eecfcb6 100644 --- a/horusmapper.py +++ b/horusmapper.py @@ -85,6 +85,7 @@ car_track = GenericTrack() # Bearing store bearing_store = None +bearing_mode = False # Flag to indicate if we are receiving bearings # Habitat/Sondehub Chase-Car uploader object online_uploader = None @@ -881,17 +882,19 @@ def udp_listener_car_callback(data): bearing_store.update_car_position(_state) # Add the car position to the logger, but only if we are moving (>10kph = ~3m/s) - if (_speed > 3.0) and chase_logger: + # .. or if are receving bearing data, in which case we want to store high resolution position data. + if ( (_speed > 3.0) or bearing_mode) and chase_logger: _car_position_update["speed"] = _speed _car_position_update["heading"] = _heading chase_logger.add_car_position(_car_position_update) def udp_listener_bearing_callback(data): - global bearing_store, chase_logger + global bearing_store, bearing_mode, chase_logger if bearing_store != None: bearing_store.add_bearing(data) + bearing_mode = True if chase_logger: chase_logger.add_bearing(data) diff --git a/log_playback.py b/log_playback.py index e336022..07ec4c3 100644 --- a/log_playback.py +++ b/log_playback.py @@ -20,7 +20,7 @@ import traceback from dateutil.parser import * -def send_bearing(json_data, udp_port=55672): +def send_bearing(json_data, udp_port=55672, hostname=''): """ Grab bearing data out of a json log entry and send it via UDP. @@ -38,11 +38,11 @@ def send_bearing(json_data, udp_port=55672): """ packet = { 'type' : 'BEARING', - 'bearing' : json_data['bearing'], - 'confidence': json_data['confidence'], - 'power': json_data['power'], - 'raw_bearing_angles': json_data['raw_bearing_angles'], - 'raw_doa': json_data['raw_doa'], + 'bearing' : int(json_data['bearing']), + 'confidence': int(json_data['confidence']), + 'power': int(json_data['power']), + 'raw_bearing_angles': [int(x) for x in json_data['raw_bearing_angles']], + 'raw_doa': [round(x,2) for x in json_data['raw_doa']], 'bearing_type': 'relative', 'source': 'playback' } @@ -59,8 +59,11 @@ def send_bearing(json_data, udp_port=55672): pass s.bind(('',udp_port)) try: - s.sendto(json.dumps(packet).encode('ascii'), ('', udp_port)) - except socket.error: + s.sendto(json.dumps(packet).encode('ascii'), (hostname, udp_port)) + except socket.error as e: + s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port)) + + if hostname != '': s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port)) @@ -88,6 +91,9 @@ def send_car_position(json_data, udp_port=55672): 'valid': True } + if 'heading' in json_data: + packet['heading'] = json_data['heading'] + # Set up our UDP socket s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.settimeout(1) @@ -147,7 +153,7 @@ def send_balloon_telemetry(json_data, udp_port=55672): s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port)) -def playback_json(filename, udp_port=55672, speed=1.0, start_time = 0): +def playback_json(filename, udp_port=55672, speed=1.0, start_time = 0, hostname=''): """ Read in a JSON log file and play it back in real-time, or with a speed factor """ with open(filename, 'r') as _log_file: @@ -173,20 +179,22 @@ def playback_json(filename, udp_port=55672, speed=1.0, start_time = 0): # Running timer _run_time = (_new_time - _first_time).total_seconds() + if _run_time < start_time: continue _time_min = int(_run_time)//60 _time_sec = _run_time%60.0 - time.sleep(_time_delta/speed) + if (_time_delta < 100): + time.sleep(_time_delta/speed) if _log_data['log_type'] == 'CAR POSITION': send_car_position(_log_data, udp_port) print("%02d:%.2f - Car Position" % (_time_min, _time_sec)) elif _log_data['log_type'] == 'BEARING': - send_bearing(_log_data, udp_port) + send_bearing(_log_data, udp_port, hostname=hostname) print("%02d:%.2f - Bearing Data" % (_time_min, _time_sec)) elif _log_data['log_type'] == 'BALLOON TELEMETRY': @@ -226,5 +234,5 @@ if __name__ == '__main__': else: print("USAGE: python log_playback.py filename.log ") - playback_json(filename, udp_port, speed, start_time) + playback_json(filename, udp_port, speed, start_time, hostname=hostname)