From cbb86dc7faad0a53b66505f68eaa927cb4e2e54b Mon Sep 17 00:00:00 2001 From: Marat Fayzullin Date: Fri, 6 Sep 2024 18:12:31 -0400 Subject: [PATCH] Call links show up now. --- htdocs/lib/MapLocators.js | 30 ++++++++++++++++++++++++------ htdocs/map-google.js | 8 ++++++-- htdocs/map-leaflet.js | 8 ++++++-- owrx/map.py | 32 ++++++++++++++++---------------- owrx/wsjt.py | 2 +- 5 files changed, 53 insertions(+), 27 deletions(-) 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') + '' + list + '
'; }; + 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 )