From 711cccdc3c32f00cddc21470c42c91f71a868959 Mon Sep 17 00:00:00 2001 From: Mark Jessop Date: Thu, 26 Jul 2018 21:30:07 +0930 Subject: [PATCH] Rotate chase car marker based on heading. Allow enlarging of summary data with a tap/click. --- horusmapper.py | 7 +++++-- static/css/chasemapper.css | 4 ++++ static/img/car-blue-flip.png | Bin 0 -> 11255 bytes static/js/tables.js | 23 ++++++++++++++++++++- static/js/utils.js | 6 ++++++ templates/index.html | 38 +++++++++++++++++++++++++++-------- 6 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 static/img/car-blue-flip.png diff --git a/horusmapper.py b/horusmapper.py index 0a29538..5caaaf3 100644 --- a/horusmapper.py +++ b/horusmapper.py @@ -461,7 +461,7 @@ def udp_listener_summary_callback(data): output['lat'] = data['latitude'] output['lon'] = data['longitude'] output['alt'] = data['altitude'] - output['callsign'] = "Payload" # data['callsign'] # Quick hack to limit to a single balloon + output['callsign'] = data['callsign'] # Process the 'short time' value if we have been provided it. if 'time' in data.keys(): @@ -476,6 +476,8 @@ def udp_listener_summary_callback(data): def udp_listener_car_callback(data): ''' Handle car position data ''' + # TODO: Make a generic car position function, and have this function pass data into it + # so we can add support for other chase car position inputs. global car_track logging.debug("Car Position:" + str(data)) _lat = data['latitude'] @@ -496,9 +498,10 @@ def udp_listener_car_callback(data): _state = car_track.get_latest_state() _heading = _state['heading'] + _speed = _state['speed'] # Push the new car position to the web client - flask_emit_event('telemetry_event', {'callsign': 'CAR', 'position':[_lat,_lon,_alt], 'vel_v':0.0, 'heading': _heading}) + flask_emit_event('telemetry_event', {'callsign': 'CAR', 'position':[_lat,_lon,_alt], 'vel_v':0.0, 'heading': _heading, 'speed':_speed}) # Add other listeners here... diff --git a/static/css/chasemapper.css b/static/css/chasemapper.css index 7fe6266..903bf6b 100644 --- a/static/css/chasemapper.css +++ b/static/css/chasemapper.css @@ -74,6 +74,10 @@ html, body, #map { font-size:1.5em; } +.largeTableRow { + font-size:200%; +} + #followPayloadButton { width:45px; height:45px; diff --git a/static/img/car-blue-flip.png b/static/img/car-blue-flip.png new file mode 100644 index 0000000000000000000000000000000000000000..25f369cf4f5eb276a433a67d2f240bdc7b39c85f GIT binary patch literal 11255 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 literal 0 HcmV?d00001 diff --git a/static/js/tables.js b/static/js/tables.js index 435a167..78ee194 100644 --- a/static/js/tables.js +++ b/static/js/tables.js @@ -1,6 +1,20 @@ // // +// Allow for the summary window to be expanded with a tap. +var summary_enlarged = false; + +function toggleSummarySize(){ + var row = $("#summary_table").tabulator("getRow", 1); + if(summary_enlarged == false){ + row.getElement().addClass("largeTableRow"); + summary_enlarged = true; + }else{ + row.getElement().removeClass("largeTableRow"); + summary_enlarged = false; + } + $("#summary_table").tabulator("redraw", true); +} // Initialise tables function initTables(){ @@ -29,13 +43,20 @@ function initTables(){ {title:"Elevation", field:"elevation", headerSort:false}, {title:"Range", field:"range", headerSort:false}, ], - data:[{alt:'-----m', speed:'---kph', vel_v:'-.-m/s', azimuth:'---°', elevation:'--°', range:'----m'}] + data:[{id: 1, alt:'-----m', speed:'---kph', vel_v:'-.-m/s', azimuth:'---°', elevation:'--°', range:'----m'}], + rowClick:function(e, row){ + toggleSummarySize(); + }, + rowTap:function(e, row){ + toggleSummarySize(); + } }); //var dummy_data = {alt:'-----m', speed:'---kph', vel_v:'-.-m/s', azimuth:'---°', elev:'--°', range:'----m'}; //$("#summary_table").tabulator("setData", dummy_data); } + function updateTelemetryTable(){ var telem_data = []; diff --git a/static/js/utils.js b/static/js/utils.js index a1091ea..f14496a 100644 --- a/static/js/utils.js +++ b/static/js/utils.js @@ -54,6 +54,12 @@ var carIcon = L.icon({ iconAnchor: [27,12] // Revisit this }); +var carIconFlip = L.icon({ + iconUrl: "/static/img/car-blue-flip.png", + iconSize: [55,25], + iconAnchor: [27,12] // Revisit this +}); + // calculates look angles between two points // format of a and b should be {lon: 0, lat: 0, alt: 0} diff --git a/templates/index.html b/templates/index.html index 8c96be7..203f507 100644 --- a/templates/index.html +++ b/templates/index.html @@ -18,18 +18,20 @@ + + + + - - @@ -304,7 +306,8 @@ balloon_positions[callsign] = { latest_data: telem, age: 0, - colour: colour_values[colour_idx] + colour: colour_values[colour_idx], + visible: true }; // Balloon Path balloon_positions[callsign].path = L.polyline(data.path,{title:callsign + " Path", color:balloon_positions[callsign].colour}).addTo(map); @@ -399,7 +402,7 @@ function updateSummaryDisplay(){ // Update the 'Payload Summary' display. - var _summary_update = {}; + var _summary_update = {id:1}; // See if there is any payload data. if (balloon_positions.hasOwnProperty(balloon_currently_following) == true){ // There is balloon data! @@ -430,10 +433,16 @@ }else{ // No balloon data! - _summary_update = {alt:'-----m', speed:'---kph', vel_v:'-.-m/s', azimuth:'---°', elevation:'--°', range:'----m'} + _summary_update = {id: 1, alt:'-----m', speed:'---kph', vel_v:'-.-m/s', azimuth:'---°', elevation:'--°', range:'----m'} } // Update table $("#summary_table").tabulator("setData", [_summary_update]); + if (summary_enlarged == true){ + var row = $("#summary_table").tabulator("getRow", 1); + row.getElement().addClass("largeTableRow"); + $("#summary_table").tabulator("redraw", true); + } + } @@ -457,11 +466,12 @@ if (data.callsign == 'CAR'){ // Update car position. chase_car_position.latest_data = data.position; - chase_car_position.heading = data.heading; + chase_car_position.heading = data.heading; // degrees true + chase_car_position.speed = data.speed; // m/s // TODO: Update car marker. if (chase_car_position.marker == 'NONE'){ // Create marker! - chase_car_position.marker = L.marker(chase_car_position.latest_data,{title:"Chase Car", icon: carIcon}) + chase_car_position.marker = L.marker(chase_car_position.latest_data,{title:"Chase Car", icon: carIcon, rotationOrigin: "center center"}) .addTo(map); chase_car_position.path = L.polyline([chase_car_position.latest_data],{title:"Chase Car", color:'black', weight:1.5}); // If the user wants the chase car tail, add it to the map. @@ -470,7 +480,19 @@ } } else { chase_car_position.marker.setLatLng(chase_car_position.latest_data).update(); - // TODO: Rotate chase car with direction of travel. + } + // Rotate car icon based on heading, but only if we're going faster than 20kph (5.5m/s). + if(chase_car_position.speed > 5.5){ // TODO: Remove magic number! + var _car_heading = chase_car_position.heading - 90.0; + if (_car_heading<=90.0){ + chase_car_position.marker.setIcon(carIcon); + chase_car_position.marker.setRotationAngle(_car_heading); + }else{ + // We are travelling West - we need to use the flipped car icon. + _car_heading = _car_heading - 180.0; + chase_car_position.marker.setIcon(carIconFlip); + chase_car_position.marker.setRotationAngle(_car_heading); + } } car_data_age = 0.0; }else{