diff --git a/htdocs/lib/MapLocators.js b/htdocs/lib/MapLocators.js
index e51a9673..9ca99517 100644
--- a/htdocs/lib/MapLocators.js
+++ b/htdocs/lib/MapLocators.js
@@ -13,6 +13,7 @@ function LocatorManager(spectral = true) {
this.locators = {};
this.bands = {};
this.modes = {};
+ this.calls = [];
// The color scale used
this.colorScale = chroma.scale(colors).mode('hsl');
@@ -57,9 +58,6 @@ LocatorManager.prototype.update = function(id, data, map) {
// Do not update unless locator present
if (!(id in this.locators)) return false;
- // Filter out link messages
- if ('callee' in data) return this.updateLink(id, data, map);
-
// Make sure we have valid band and mode names
if (!data.band) data.band = 'other';
if (!data.mode) data.mode = 'other';
@@ -89,9 +87,28 @@ LocatorManager.prototype.update = function(id, data, map) {
return true;
};
-LocatorManager.prototype.updateLink = function(id, data, map) {
- // @@@ TODO!!!
- return false;
+LocatorManager.prototype.updateCall = function(data, map) {
+ // Create an arc
+ data.arc = new google.maps.Polyline({
+ path: [
+ this.id2latlng(data.src.locator),
+ this.id2latlng(data.dst.locator)
+ ],
+ geodesic: true,
+ strokeColor: "#000000",
+ strokeOpacity: 0.2,
+ strokeWeight: 1
+ });
+ data.arc.setMap(map);
+
+ // Push into array, limit array length
+ this.calls.push(data);
+ if (this.calls.length > 15) {
+ var old = this.calls.shift();
+ old.arc.setMap();
+ }
+
+ return true;
};
LocatorManager.prototype.getSortedKeys = function(colorMap) {
@@ -336,3 +353,4 @@ Locator.prototype.getInfoHTML = function(locator, pos, receiverMarker = null) {
+ Utils.makeListTitle('Active Callsigns')
+ '
';
};
+
diff --git a/htdocs/map-google.js b/htdocs/map-google.js
index 17b790bd..fe3739c6 100644
--- a/htdocs/map-google.js
+++ b/htdocs/map-google.js
@@ -146,9 +146,13 @@ MapManager.prototype.processUpdates = function(updates) {
}
updates.forEach(function(update) {
- // TODO: Process caller-callee links here!!!
- if (!('location' in update)) return;
+ // Process caller-callee updates
+ if ('caller' in update) {
+ self.lman.updateCall(update, map);
+ return;
+ }
+ // Process position updates
switch (update.location.type) {
case 'latlon':
var marker = self.mman.find(update.callsign);
diff --git a/htdocs/map-leaflet.js b/htdocs/map-leaflet.js
index 448a0503..5c9c6107 100644
--- a/htdocs/map-leaflet.js
+++ b/htdocs/map-leaflet.js
@@ -433,9 +433,13 @@ MapManager.prototype.processUpdates = function(updates) {
}
updates.forEach(function(update) {
- // TODO: Process caller-callee links here!!!
- if (!('location' in update)) return;
+ // Process caller-callee updates
+ if ('caller' in update) {
+ self.lman.updateCall(update, map);
+ return;
+ }
+ // Process position updates
switch (update.location.type) {
case 'latlon':
var marker = self.mman.find(update.callsign);
diff --git a/owrx/map.py b/owrx/map.py
index 6c5c36aa..da1d4043 100644
--- a/owrx/map.py
+++ b/owrx/map.py
@@ -36,7 +36,7 @@ class Map(object):
def __init__(self):
self.clients = []
self.positions = {}
- self.links = []
+ self.calls = []
self.positionsLock = threading.Lock()
def removeLoop():
@@ -69,7 +69,7 @@ class Map(object):
positions = [
self._makeRecord(key, record) for (key, record) in self.positions.items()
] + [
- self._makeLink(link) for link in self.links
+ self._makeCall(call) for call in self.calls
]
client.write_update(positions)
@@ -80,15 +80,15 @@ class Map(object):
except ValueError:
pass
- def _makeLink(self, link):
+ def _makeCall(self, call):
return {
- "caller": link["caller"],
- "callee": link["callee"],
- "src": link["src"].__dict__(),
- "dst": link["dst"].__dict__(),
- "lastseen": link.timestamp() * 1000,
- "mode": link["mode"],
- "band": link["band"].getName() if link["band"] is not None else None
+ "caller": call["caller"],
+ "callee": call["callee"],
+ "src": call["src"].__dict__(),
+ "dst": call["dst"].__dict__(),
+ "lastseen": call["timestamp"].timestamp() * 1000,
+ "mode": call["mode"],
+ "band": call["band"].getName() if call["band"] is not None else None
}
def _makeRecord(self, callsign, record):
@@ -101,7 +101,7 @@ class Map(object):
"hops": record["hops"]
}
- def updateLink(self, key, callee, mode: str, band: Band = None, timestamp: datetime = None):
+ def updateCall(self, key, callee, mode: str, band: Band = None, timestamp: datetime = None):
logger.info("{0} call from {1} to {2}".format(mode, key, callee))
# if we get an external timestamp, make sure it's not already expired
@@ -117,7 +117,7 @@ class Map(object):
if key in self.positions and callee in self.positions:
src = self.positions[key]["location"]
dst = self.positions[callee]["location"]
- link = {
+ call = {
"caller": key,
"callee": callee,
"timestamp": timestamp,
@@ -126,10 +126,10 @@ class Map(object):
"src": src,
"dst": dst
}
- broadcast = self._makeLink(link)
- self.links.append(link)
- if len(self.links) > 15:
- self.links.pop(0)
+ broadcast = self._makeCall(call)
+ self.calls.append(call)
+ if len(self.calls) > 15:
+ self.calls.pop(0)
if broadcast is not None:
self.broadcast([broadcast])
diff --git a/owrx/wsjt.py b/owrx/wsjt.py
index f9c2b805..e59e201b 100644
--- a/owrx/wsjt.py
+++ b/owrx/wsjt.py
@@ -293,7 +293,7 @@ class WsjtParser(AudioChopperParser):
)
ReportingEngine.getSharedInstance().spot(out)
if "callsign" in out and "callee" in out:
- Map.getSharedInstance().updateLink(
+ Map.getSharedInstance().updateCall(
out["callsign"], out["callee"], mode, band
)