Add selection of bearing sources. Add bearing-o-clock utility

pull/38/head
Mark Jessop 2021-06-19 17:25:19 +09:30
rodzic 9258120a52
commit f2c343eb81
5 zmienionych plików z 110 dodań i 2 usunięć

Wyświetl plik

@ -8,4 +8,4 @@
# Now using Semantic Versioning (https://semver.org/) MAJOR.MINOR.PATCH
__version__ = "1.3.1"
__version__ = "1.3.2"

Wyświetl plik

@ -44,6 +44,8 @@ class Bearings(object):
# }
self.bearings = {}
self.bearing_sources = []
self.bearing_lock = Lock()
# Internal record of the chase car position, which is updated with incoming GPS data.
@ -183,6 +185,10 @@ class Bearings(object):
"source": _source,
}
# Allow override of the heading valid calculations if a hearing_override field is supplied
if "heading_override" in bearing:
_new_bearing["heading_valid"] = bearing["heading_override"]
elif bearing["bearing_type"] == "absolute":
# Absolute bearing - use the provided data as-is
@ -213,6 +219,10 @@ class Bearings(object):
self.bearings["%.4f" % _arrival_time] = _new_bearing
if _source not in self.bearing_sources:
self.bearing_sources.append(_source)
logging.info(f"Bearing Handler - New source of bearings: {_source}")
# Now we need to do a clean-up of our bearing list.
# At this point, we should always have at least 2 bearings in our store
if len(self.bearings) == 1:

Wyświetl plik

@ -15,6 +15,8 @@
var bearing_store = {};
var bearing_sources = [];
var bearings_on = true;
var bearings_only_mode = false;
@ -67,6 +69,7 @@ function destroyAllBearings(){
});
bearing_store = {};
bearing_sources = [];
}
@ -86,6 +89,11 @@ function bearingValid(bearing){
}
}
// Disable showing of this bearing if the source is not selected
if (!document.getElementById("bearing_source_" + bearing.source).checked){
_show_bearing = false;
}
return _show_bearing;
}
@ -106,6 +114,18 @@ function addBearing(timestamp, bearing, live){
bearing_store[timestamp] = bearing;
if ( !bearing_sources.includes(bearing.source)){
bearing_sources.push(bearing.source);
_new_bearing_div_name = "bearing_source_" + bearing.source;
bearing_sources_div = "<div class='paramRow'><b>Source: " + bearing.source + "</b> <input type='checkbox' class='paramSelector' id='"+_new_bearing_div_name+"'></div>";
$("#bearing_source_selector").append(bearing_sources_div);
$("#"+_new_bearing_div_name).prop('checked',true);
$("#"+_new_bearing_div_name).change(function(){
redrawBearings();
});
}
// Calculate the end position.
var _end = calculateDestination(L.latLng([bearing_store[timestamp].lat, bearing_store[timestamp].lon]), bearing_store[timestamp].true_bearing, bearing_length);

Wyświetl plik

@ -898,7 +898,6 @@
<b>Show Stationary Bearings</b> <input type="checkbox" class="paramSelector" id="showStationaryBearings">
</div>
<div class="paramRow">
<button type="button" class="paramSelector" id="clearBearingsBtn" onclick='destroyAllBearings();'>Clear Map</button></br>
</div>
@ -906,6 +905,9 @@
<button type="button" class="paramSelector" id="flushBearingsBtn" onclick='flushBearings();'>Flush Bearing Store</button></br>
</div>
<h3>Bearing Sources</h3>
<div id="bearing_source_selector"></div>
<h3>Bearing Style</h3>
<div class="paramRow">
<b>Bearing Length (km)</b><input type="text" class="paramEntry" id="bearingLength" value="10"><br/>

Wyświetl plik

@ -0,0 +1,76 @@
#!/usr/bin/env python
#
# ChaseMapper - Bearing o'Clock
#
# Add bearings based on O'Clock position (1 through 12)
# Run with: python bearing_o_clock.py bearing_source_name
#
# Copyright (C) 2019 Mark Jessop <vk5qi@rfhead.net>
# Released under GNU GPL v3 or later
#
#
import json
import socket
import sys
import time
import datetime
import traceback
def send_relative_bearing(bearing, source, heading_override=False, udp_port=55672):
"""
Send a basic relative bearing
"""
packet = {
'type' : 'BEARING',
'bearing' : bearing,
'bearing_type': 'relative',
'source': source
}
if heading_override:
packet["heading_override"] = True
# Set up our UDP socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.settimeout(1)
# Set up socket for broadcast, and allow re-use of the address
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
except:
pass
s.bind(('',udp_port))
try:
s.sendto(json.dumps(packet).encode('ascii'), ('<broadcast>', udp_port))
except socket.error:
s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port))
if __name__ == "__main__":
if len(sys.argv) > 1:
_source = sys.argv[1]
else:
_source = "o_clock_entry"
try:
while True:
print("Enter O-Clock Bearing (1-12):")
_val = input()
try:
_val_int = int(_val)
_bearing = (_val_int%12)*30
print(f"Sending Relative Bearing: {_bearing}")
send_relative_bearing(_bearing, _source, heading_override=True)
except Exception as e:
print(f"Error handling input: {str(e)}")
except KeyboardInterrupt:
sys.exit(0)