Skip to content

Commit b13ec7d

Browse files
authored
Merge pull request #63 from projecthorus/gambier2025
Mt Gambier Hunt Additions
2 parents 02b3da3 + ffb63b8 commit b13ec7d

12 files changed

Lines changed: 652 additions & 18 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ Another option to obtain map tiles is [FoxtrotGPS](https://www.foxtrotgps.org/).
106106
To grab map tiles using FoxtrotGPS, we're going to use FoxtrotGPS's [Cached Maps](https://www.foxtrotgps.org/doc/foxtrotgps.html#Cached-Maps) feature.
107107

108108
* Install FoxtrotGPS (Linux only unfortunately, works OK on a Pi!) either [from source](https://www.foxtrotgps.org/releases/), or via your system package manager (`sudo apt-get install foxtrotgps`).
109+
* Warning - Installing foxtrotgps will also install gpsd, which may 'take over' your GPS receiver! If you aren't using GPSD, I'd recommend uninstalling it with: `sudo apt-get purge gpsd`
109110
* Load up FoxtrotGPS, and pan around the area you are intersted in caching. Pick the map layer you want, right-click on the map, and choose 'Map download'. You can then select how many zoom levels you want to cache, and start it downloading (this may take a while!)
110111
* Once you have a set of folders within your `~/Maps` cache directory, you can startup Chasemapper and start using them! Tiles will be served up as they become available.
111112

chasemapper/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88

99
# Now using Semantic Versioning (https://semver.org/) MAJOR.MINOR.PATCH
1010

11-
__version__ = "1.5.4"
11+
__version__ = "1.5.7"

chasemapper/config.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@
5050
"bearing_weight": 1.0,
5151
"bearing_color": "black",
5252
"bearing_custom_color": "#FF0000",
53+
"bearings_only_mode": False,
54+
# TimeSync Hunting Settings (not in config file, but needs to be shared between clients)
55+
"time_seq_enabled": False,
56+
"time_seq_times": [0,0,0,0],
57+
"time_seq_active": 25,
58+
"time_seq_cycle": 120,
59+
5360
# History
5461
"reload_last_position": False,
5562
}
@@ -182,6 +189,18 @@ def parse_config_file(filename):
182189
logging.info("Missing ascent_rate_averaging setting, using default (10)")
183190
chase_config["ascent_rate_averaging"] = 10
184191

192+
try:
193+
chase_config["bearings_only_mode"] = config.getboolean("bearings", "bearings_only_mode")
194+
except:
195+
logging.info("Missing bearing_only_mode setting, using default (False)")
196+
chase_config["bearings_only_mode"] = False
197+
198+
try:
199+
chase_config["doa_confidence_threshold"] = config.getfloat("bearings", "doa_confidence_threshold")
200+
except:
201+
logging.info("Missing DoA Confidence Threshold Setting, using default (4.0)")
202+
chase_config["doa_confidence_threshold"] = 4.0
203+
185204
# Telemetry Source Profiles
186205

187206
_profile_count = config.getint("profile_selection", "profile_count")

chasemapper/gpsd.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ def unpack(self, gpsd_socket_response):
288288

289289
except (ValueError, KeyError) as error:
290290
logging.error("GPSD Parser - Other Error - %s" % str(error))
291+
print(gpsd_socket_response)
291292
return
292293

293294

@@ -418,6 +419,11 @@ def gpsd_process_thread(self):
418419

419420

420421
if __name__ == "__main__":
422+
# Little test script to print out received data from GPSD for debugging.
423+
# Run with: python3 -m chasemapper.gpsd 127.0.0.1
424+
# or whatever IP your gpsd server is running on.
425+
426+
import sys
421427

422428
def print_dict(data):
423429
print(data)
@@ -426,16 +432,7 @@ def print_dict(data):
426432
format="%(asctime)s %(levelname)s:%(message)s", level=logging.DEBUG
427433
)
428434

429-
_gpsd = GPSDAdaptor(callback=print_dict)
430-
time.sleep(30)
435+
_gpsd = GPSDAdaptor(callback=print_dict, hostname=sys.argv[1])
436+
time.sleep(3000)
431437
_gpsd.close()
432438

433-
# gpsd_socket = GPSDSocket()
434-
# data_stream = DataStream()
435-
# gpsd_socket.connect()
436-
# gpsd_socket.watch()
437-
# for new_data in gpsd_socket:
438-
# if new_data:
439-
# data_stream.unpack(new_data)
440-
# print(data_stream.TPV)
441-
# #print(data_stream.SKY)

horusmapper.cfg.example

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ chase_car_speed = True
243243
#
244244
[bearings]
245245

246+
# If true, will hide balloon-related display elements from the map
247+
bearings_only_mode = False
248+
246249
# Number of bearings to store
247250
max_bearings = 300
248251

@@ -260,6 +263,10 @@ car_speed_gate = 10
260263
# 4 degrees/second seems to work fairly well.
261264
turn_rate_threshold = 4.0
262265

266+
# DoA Confidence Threshold
267+
# Used to gate bearings provided by a KrakenSDR system
268+
doa_confidence_threshold = 4.0
269+
263270
# Visual Settings - these can be adjust in the Web GUI during runtime
264271

265272
# Bearing length in km

horusmapper.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ def flask_bearing_entry():
110110
""" Render bearing entry page """
111111
return flask.render_template("bearing_entry.html")
112112

113+
@app.route("/oclock")
114+
def flask_oclock():
115+
""" Render bearing o'clock page """
116+
return flask.render_template("oclock.html")
117+
113118
@app.route("/get_telemetry_archive")
114119
def flask_get_telemetry_archive():
115120
return json.dumps(current_payloads)

static/css/oclock.css

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
.circle {
2+
position: relative;
3+
left: 0;
4+
border: 1px solid black;
5+
padding: 0;
6+
width: 20em;
7+
height: 20em;
8+
border-radius: 50%;
9+
list-style: none;
10+
overflow: hidden;
11+
}
12+
li {
13+
overflow: hidden;
14+
position: absolute;
15+
top: 0; right: 0;
16+
width: 50%; height: 50%;
17+
transform-origin: 0% 100%;
18+
}
19+
.text {
20+
position: absolute;
21+
left: -100%;
22+
width: 200%; height: 200%;
23+
text-align: center;
24+
-webkit-transform: skewY(60deg) rotate(15deg);
25+
-ms-transform: skewY(60deg) rotate(15deg);
26+
transform: skewY(60deg) rotate(15deg);
27+
padding-top: 20px;
28+
}
29+
30+
li:first-child {
31+
-webkit-transform: rotate(15deg) skewY(-60deg);
32+
-ms-transform: rotate(15deg) skewY(-60deg);
33+
transform: rotate(15deg) skewY(-60deg);
34+
}
35+
li:nth-child(2) {
36+
-webkit-transform: rotate(45deg) skewY(-60deg);
37+
-ms-transform: rotate(45deg) skewY(-60deg);
38+
transform: rotate(45deg) skewY(-60deg);
39+
}
40+
li:nth-child(3) {
41+
-webkit-transform: rotate(75deg) skewY(-60deg);
42+
-ms-transform: rotate(75deg) skewY(-60deg);
43+
transform: rotate(75deg) skewY(-60deg);
44+
}
45+
li:nth-child(4) {
46+
-webkit-transform: rotate(105deg) skewY(-60deg);
47+
-ms-transform: rotate(105deg) skewY(-60deg);
48+
transform: rotate(105deg) skewY(-60deg);
49+
}
50+
li:nth-child(5) {
51+
-webkit-transform: rotate(135deg) skewY(-60deg);
52+
-ms-transform: rotate(135deg) skewY(-60deg);
53+
transform: rotate(135deg) skewY(-60deg);
54+
}
55+
li:nth-child(6) {
56+
-webkit-transform: rotate(165deg) skewY(-60deg);
57+
-ms-transform: rotate(165deg) skewY(-60deg);
58+
transform: rotate(165deg) skewY(-60deg);
59+
}
60+
li:nth-child(7) {
61+
-webkit-transform: rotate(195deg) skewY(-60deg);
62+
-ms-transform: rotate(195deg) skewY(-60deg);
63+
transform: rotate(195deg) skewY(-60deg);
64+
}
65+
li:nth-child(8) {
66+
-webkit-transform: rotate(225deg) skewY(-60deg);
67+
-ms-transform: rotate(225deg) skewY(-60deg);
68+
transform: rotate(225deg) skewY(-60deg);
69+
}
70+
li:nth-child(9) {
71+
-webkit-transform: rotate(255deg) skewY(-60deg);
72+
-ms-transform: rotate(255deg) skewY(-60deg);
73+
transform: rotate(255deg) skewY(-60deg);
74+
}
75+
li:nth-child(10) {
76+
-webkit-transform: rotate(285deg) skewY(-60deg);
77+
-ms-transform: rotate(285deg) skewY(-60deg);
78+
transform: rotate(285deg) skewY(-60deg);
79+
}
80+
li:nth-child(11) {
81+
-webkit-transform: rotate(315deg) skewY(-60deg);
82+
-ms-transform: rotate(315deg) skewY(-60deg);
83+
transform: rotate(315deg) skewY(-60deg);
84+
}
85+
li:nth-child(12) {
86+
-webkit-transform: rotate(345deg) skewY(-60deg);
87+
-ms-transform: rotate(345deg) skewY(-60deg);
88+
transform: rotate(345deg) skewY(-60deg);
89+
}
90+
li:first-child .text {
91+
background: green;
92+
}
93+
li:nth-child(2) .text {
94+
background: tomato;
95+
}
96+
li:nth-child(3) .text {
97+
background: aqua;
98+
}
99+
li:nth-child(4) .text {
100+
background: yellow;
101+
}
102+
li:nth-child(5) .text {
103+
background: orange;
104+
}
105+
li:nth-child(6) .text {
106+
background: purple;
107+
}
108+
li:nth-child(7) .text {
109+
background: cyan;
110+
}
111+
li:nth-child(8) .text {
112+
background: brown;
113+
}
114+
li:nth-child(9) .text {
115+
background: gray;
116+
}
117+
li:nth-child(10) .text {
118+
background: pink;
119+
}
120+
li:nth-child(11) .text {
121+
background: maroon;
122+
}
123+
li:nth-child(12) .text {
124+
background: gold;
125+
}

static/js/balloon.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,17 @@ function handleTelemetry(data){
247247

248248
// Update Detailed GPS / Heading Info
249249
if(data.hasOwnProperty('heading_status')){
250-
$("#headingStatus").text(data.heading_status);
250+
if(data.heading_status != null){
251+
$("#headingStatus").text(data.heading_status);
252+
253+
if(data.heading_status.includes("Ongoing")){
254+
$('#car_warning').text("IMU Not Aligned")
255+
$('#car_warning').removeClass();
256+
$('#car_warning').addClass('dataAgeBad');
257+
} else {
258+
$('#car_warning').text("")
259+
}
260+
}
251261
}
252262

253263
if(data.hasOwnProperty('numSV')){

0 commit comments

Comments
 (0)