diff --git a/chasemapper/config.py b/chasemapper/config.py index 11d7309..f5ad670 100644 --- a/chasemapper/config.py +++ b/chasemapper/config.py @@ -41,6 +41,9 @@ default_config = { 'range_ring_color': 'red', 'range_ring_custom_color': '#FF0000', + # Chase Car Speedometer + 'chase_car_speed': True, + # Bearing processing 'max_bearings': 300, 'max_bearing_age': 30*60, @@ -121,6 +124,12 @@ def parse_config_file(filename): chase_config['offline_tile_layers'].append(_dir) logging.info("Found Map Layers: %s" % str(chase_config['offline_tile_layers'])) + try: + chase_config['chase_car_speed'] = config.getboolean('speedo', 'chase_car_speed') + except: + logging.info("Missing Chase Car Speedo Setting, using default (disabled)") + chase_config['chase_car_speed'] = False + # Telemetry Source Profiles _profile_count = config.getint('profile_selection', 'profile_count') diff --git a/horusmapper.cfg.example b/horusmapper.cfg.example index 8ed28f0..6b02eb1 100644 --- a/horusmapper.cfg.example +++ b/horusmapper.cfg.example @@ -165,6 +165,11 @@ range_ring_color = red # Custom range ring color, in hexadecimal #RRGGBB range_ring_custom_color = #FF0000 +# +# Chase Car Speedometer +# +[speedo] +chase_car_speed = True # # Bearing Processing diff --git a/horusmapper.py b/horusmapper.py index f1006ee..aaa2ce3 100644 --- a/horusmapper.py +++ b/horusmapper.py @@ -269,7 +269,8 @@ def handle_new_payload_position(data): flask_emit_event('telemetry_event', current_payloads[_callsign]['telem']) # Add the position into the logger - chase_logger.add_balloon_telemetry(data) + if chase_logger: + chase_logger.add_balloon_telemetry(data) def handle_modem_stats(data): @@ -429,7 +430,8 @@ def run_prediction(): flask_emit_event('predictor_update', _client_data) # Add the prediction run to the logger. - chase_logger.add_balloon_prediction(_client_data) + if chase_logger: + chase_logger.add_balloon_prediction(_client_data) # Clear the predictor-running semaphore predictor_semaphore = False @@ -684,7 +686,7 @@ 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: + if (_speed > 3.0) and chase_logger: _car_position_update['speed'] = _speed _car_position_update['heading'] = _heading chase_logger.add_car_position(_car_position_update) @@ -695,7 +697,8 @@ def udp_listener_bearing_callback(data): if bearing_store != None: bearing_store.add_bearing(data) - chase_logger.add_bearing(data) + if chase_logger: + chase_logger.add_bearing(data) # Data Age Monitoring Thread @@ -849,6 +852,7 @@ if __name__ == "__main__": parser.add_argument("-c", "--config", type=str, default="horusmapper.cfg", help="Configuration file.") parser.add_argument("-v", "--verbose", action="store_true", default=False, help="Verbose output.") parser.add_argument("-l", "--log", type=str, default=None, help="Custom log file name. (Default: ./log_files/.log") + parser.add_argument("--nolog", action="store_true", default=False, help="Inhibit all logging.") args = parser.parse_args() # Configure logging @@ -868,8 +872,11 @@ if __name__ == "__main__": web_handler = WebHandler() logging.getLogger().addHandler(web_handler) - # Start the Chase Logger - chase_logger = ChaseLogger(filename=args.log) + # Start the Chase Logger (if logging not inhibited.) + if not args.nolog: + chase_logger = ChaseLogger(filename=args.log) + else: + logging.info("Chase Logging has been inhibited, not starting logger.") # Attempt to read in config file. chasemapper_config = read_config(args.config) @@ -925,7 +932,8 @@ if __name__ == "__main__": data_monitor_thread_running = False # Close the chase logger - chase_logger.close() + if chase_logger: + chase_logger.close() if habitat_uploader != None: habitat_uploader.close() diff --git a/log_playback.py b/log_playback.py index 4fa8996..e336022 100644 --- a/log_playback.py +++ b/log_playback.py @@ -59,9 +59,9 @@ def send_bearing(json_data, udp_port=55672): pass s.bind(('',udp_port)) try: - s.sendto(json.dumps(packet), ('', udp_port)) + s.sendto(json.dumps(packet).encode('ascii'), ('', udp_port)) except socket.error: - s.sendto(json.dumps(packet), ('127.0.0.1', udp_port)) + s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port)) def send_car_position(json_data, udp_port=55672): @@ -100,9 +100,9 @@ def send_car_position(json_data, udp_port=55672): pass s.bind(('',udp_port)) try: - s.sendto(json.dumps(packet), ('', udp_port)) + s.sendto(json.dumps(packet).encode('ascii'), ('', udp_port)) except socket.error: - s.sendto(json.dumps(packet), ('127.0.0.1', udp_port)) + s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port)) def send_balloon_telemetry(json_data, udp_port=55672): @@ -142,9 +142,9 @@ def send_balloon_telemetry(json_data, udp_port=55672): pass s.bind(('',udp_port)) try: - s.sendto(json.dumps(packet), ('', udp_port)) + s.sendto(json.dumps(packet).encode('ascii'), ('', udp_port)) except socket.error: - s.sendto(json.dumps(packet), ('127.0.0.1', udp_port)) + 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): @@ -223,6 +223,8 @@ if __name__ == '__main__': filename = sys.argv[1] speed = float(sys.argv[2]) start_time = float(sys.argv[3])*60 + else: + print("USAGE: python log_playback.py filename.log ") playback_json(filename, udp_port, speed, start_time) diff --git a/static/css/chasemapper.css b/static/css/chasemapper.css index c759846..61528f0 100644 --- a/static/css/chasemapper.css +++ b/static/css/chasemapper.css @@ -57,6 +57,12 @@ html, body, #map { font-size:5em; } +.chaseCarSpeed { + color:black; + font-weight: bold; + font-size:3em; +} + .dataAgeHeader { color:black; font-weight: bold; diff --git a/static/js/balloon.js b/static/js/balloon.js index a6298be..e4e5337 100644 --- a/static/js/balloon.js +++ b/static/js/balloon.js @@ -176,6 +176,15 @@ function handleTelemetry(data){ // Update range rings, if they are enabled. recenterRangeRings(data.position); + // Update Chase Car Speed + if (document.getElementById("showCarSpeed").checked){ + $("#chase_car_speed").text( (chase_car_position.speed*3.6).toFixed(0) + " kph"); + $("#chase_car_speed_header").text("Chase Car Speed"); + } else { + $("#chase_car_speed").text(""); + $("#chase_car_speed_header").text(""); + } + if (chase_car_position.marker == 'NONE'){ // Create marker! chase_car_position.marker = L.marker(chase_car_position.latest_data,{title:"Chase Car", icon: carIcon, rotationOrigin: "center center"}) diff --git a/static/js/settings.js b/static/js/settings.js index 42a36a1..395780c 100644 --- a/static/js/settings.js +++ b/static/js/settings.js @@ -55,6 +55,9 @@ function serverSettingsUpdate(data){ $('#ringColorSelect').val(chase_config.range_ring_color); $('#ringCustomColor').val(chase_config.range_ring_custom_color); $('#rangeRingsEnabled').prop('checked', chase_config.range_rings_enabled); + + // Chase Car Speedometer + $('#showCarSpeed').prop('checked', chase_config.chase_car_speed); // Bearing settings $('#bearingLength').val(chase_config.bearing_length.toFixed(0)); diff --git a/templates/index.html b/templates/index.html index cadea64..209e5e9 100644 --- a/templates/index.html +++ b/templates/index.html @@ -315,6 +315,21 @@ }) .addTo(map); + // Chase Car Speed Display + L.control.custom({ + position: 'bottomleft', + content : "
", + classes : 'btn-group-vertical btn-group-sm', + id: 'speed_display', + style : + { + margin: '5px', + padding: '0px 0 0 0', + cursor: 'pointer', + } + }) + .addTo(map); + // Time-to-landing display - shows the time until landing for the currently tracked payload. L.control.custom({ position: 'bottomleft', @@ -741,6 +756,11 @@ Custom Color
+

Speed Display

+
+ Show Chase Car Speed: +
+