diff --git a/htdocs/map.js b/htdocs/map.js
index 6354604..d2253ad 100644
--- a/htdocs/map.js
+++ b/htdocs/map.js
@@ -57,6 +57,7 @@
title: update.callsign
}, getMarkerOpacityOptions(update.lastseen) ));
marker.lastseen = update.lastseen;
+ marker.mode = update.mode;
// TODO the trim should happen on the server side
if (expectedCallsign && expectedCallsign == update.callsign.trim()) {
@@ -94,6 +95,7 @@
}, getRectangleOpacityOptions(update.lastseen) ));
rectangle.lastseen = update.lastseen;
rectangle.locator = update.location.locator;
+ rectangle.mode = update.mode;
if (expectedLocator && expectedLocator == update.location.locator) {
map.panTo(center);
@@ -182,7 +184,7 @@
var showLocatorInfoWindow = function(locator, pos) {
if (!infowindow) infowindow = new google.maps.InfoWindow();
var inLocator = $.map(rectangles, function(r, callsign) {
- return {callsign: callsign, locator: r.locator, lastseen: r.lastseen}
+ return {callsign: callsign, locator: r.locator, lastseen: r.lastseen, mode: r.mode}
}).filter(function(d) {
return d.locator == locator;
}).sort(function(a, b){
@@ -194,7 +196,7 @@
'
' +
inLocator.map(function(i){
var timestring = moment(i.lastseen).fromNow();
- return '- ' + i.callsign + ' (' + timestring + ')
'
+ return '- ' + i.callsign + ' (' + timestring + ' via ' + i.mode + ')
'
}).join("") +
'
'
);
@@ -208,7 +210,7 @@
var timestring = moment(marker.lastseen).fromNow();
infowindow.setContent(
'' + callsign + '
' +
- '' + timestring + '
'
+ '' + timestring + ' via ' + marker.mode + '
'
);
infowindow.open(map, marker);
}
diff --git a/owrx/map.py b/owrx/map.py
index 2819a3e..4d65a49 100644
--- a/owrx/map.py
+++ b/owrx/map.py
@@ -44,7 +44,8 @@ class Map(object):
{
"callsign": callsign,
"location": record["location"].__dict__(),
- "lastseen": record["updated"].timestamp() * 1000
+ "lastseen": record["updated"].timestamp() * 1000,
+ "mode" : record["mode"]
}
for (callsign, record) in self.positions.items()
])
@@ -55,14 +56,15 @@ class Map(object):
except ValueError:
pass
- def updateLocation(self, callsign, loc: Location):
+ def updateLocation(self, callsign, loc: Location, mode: str):
ts = datetime.now()
- self.positions[callsign] = {"location": loc, "updated": ts}
+ self.positions[callsign] = {"location": loc, "updated": ts, "mode": mode}
self.broadcast([
{
"callsign": callsign,
"location": loc.__dict__(),
- "lastseen": ts.timestamp() * 1000
+ "lastseen": ts.timestamp() * 1000,
+ "mode" : mode
}
])
diff --git a/owrx/meta.py b/owrx/meta.py
index ad3f0d3..8a85bad 100644
--- a/owrx/meta.py
+++ b/owrx/meta.py
@@ -71,7 +71,8 @@ class YsfMetaEnricher(object):
def enrich(self, meta):
if "source" in meta and "lat" in meta and "lon" in meta:
# TODO parsing the float values should probably happen earlier
- Map.getSharedInstance().updateLocation(meta["source"], LatLngLocation(float(meta["lat"]), float(meta["lon"])))
+ loc = LatLngLocation(float(meta["lat"]), float(meta["lon"]))
+ Map.getSharedInstance().updateLocation(meta["source"], loc, "YSF")
return None
diff --git a/owrx/wsjt.py b/owrx/wsjt.py
index 1e8c271..6bb6dfe 100644
--- a/owrx/wsjt.py
+++ b/owrx/wsjt.py
@@ -118,9 +118,15 @@ class WsjtParser(object):
self.handler = handler
self.locator_pattern = re.compile(".*\s([A-Z0-9]+)\s([A-R]{2}[0-9]{2})$")
+ modes = {
+ "~": "FT8"
+ }
+
def parse(self, data):
try:
msg = data.decode().rstrip()
+ # sample
+ # '222100 -15 -0.0 508 ~ CQ EA7MJ IM66'
# known debug messages we know to skip
if msg.startswith(""):
return
@@ -133,15 +139,17 @@ class WsjtParser(object):
out["db"] = float(msg[7:10])
out["dt"] = float(msg[11:15])
out["freq"] = int(msg[16:20])
+ modeChar = msg[21:22]
+ out["mode"] = mode = WsjtParser.modes[modeChar] if modeChar in WsjtParser.modes else "unknown"
wsjt_msg = msg[24:60].strip()
- self.getLocator(wsjt_msg)
+ self.parseLocator(wsjt_msg, mode)
out["msg"] = wsjt_msg
self.handler.write_wsjt_message(out)
except ValueError:
logger.exception("error while parsing wsjt message")
- def getLocator(self, msg):
+ def parseLocator(self, msg, mode):
m = self.locator_pattern.match(msg)
if m is None:
return
@@ -149,4 +157,4 @@ class WsjtParser(object):
# likely this just means roger roger goodbye.
if m.group(2) == "RR73":
return
- Map.getSharedInstance().updateLocation(m.group(1), LocatorLocation(m.group(2)))
+ Map.getSharedInstance().updateLocation(m.group(1), LocatorLocation(m.group(2)), mode)