diff --git a/server/trackdirect/TrackDirectDataCollector.py b/server/trackdirect/TrackDirectDataCollector.py index 56188c9ae51d899a649b528c4054aacb3e2bcaa1..cea4ebd3f25e33c4da0a8c7a8e8105c0bfdaba80 100644 --- a/server/trackdirect/TrackDirectDataCollector.py +++ b/server/trackdirect/TrackDirectDataCollector.py @@ -78,6 +78,7 @@ class TrackDirectDataCollector(): connection = AprsISConnection( self.callsign, self.passcode, self.sourceHostname, self.sourcePort) connection.setFrequencyLimit(self.hardFrequencyLimit) + connection.setSourceId(self.sourceId) def onPacketRead(line): if (not reactor.running): @@ -246,7 +247,14 @@ class TrackDirectDataCollector(): Boolean """ if (packet.mapId in [1, 5, 7, 9] and packet.isMoving == 1): - if (packet.timestamp - int(self.frequencyLimit) < packet.markerPrevPacketTimestamp): + frequencyLimitToApply = int(self.frequencyLimit) + + if (packet.ogn is not None and packet.ogn.ognTurnRate is not None): + turnRate = abs(float(packet.ogn.ognTurnRate)) + if (turnRate > 0) : + frequencyLimitToApply = int(frequencyLimitToApply / (1+turnRate)) + + if ((packet.timestamp - frequencyLimitToApply) < packet.markerPrevPacketTimestamp): # This station is sending faster than config limit return True diff --git a/server/trackdirect/parser/AprsISConnection.py b/server/trackdirect/parser/AprsISConnection.py index 7cda20c74b9f0b9667cf6056c27e42b6b5ebbae2..d4613f6a11257c1c7ad1ff25498196815fc3010a 100644 --- a/server/trackdirect/parser/AprsISConnection.py +++ b/server/trackdirect/parser/AprsISConnection.py @@ -5,6 +5,7 @@ import collections import psycopg2 import datetime import time +import re class AprsISConnection(aprslib.IS): @@ -25,6 +26,7 @@ class AprsISConnection(aprslib.IS): self.logger = logging.getLogger("aprslib.IS") self.frequencyLimit = None self.stationHashTimestamps = {} + self.sourceId = 1 def setFrequencyLimit(self, frequencyLimit): """Set frequency limit @@ -42,6 +44,14 @@ class AprsISConnection(aprslib.IS): """ return self.frequencyLimit + def setSourceId(self, sourceId): + """Set what source packet is from (APRS, CWOP ...) + + Args: + sourceId (int): Id that corresponds to id in source-table + """ + self.sourceId = sourceId + def filteredConsumer(self, callback, blocking=True, raw=False): """The filtered consume method @@ -86,11 +96,22 @@ class AprsISConnection(aprslib.IS): except: return False + # Try to find turn rate and reduce frequency limit if high turn rate + frequencyLimitToApply = int(self.frequencyLimit) + if (self.sourceId == 5) : + match = re.search("(\+|\-)(\d\.\d)rot ", line) + try: + turnRate = abs(float(match.group(2))) + if (turnRate > 0) : + frequencyLimitToApply = int(frequencyLimitToApply / (1+turnRate)) + except: + pass + latestTimestampOnMap = 0 if (name in self.stationHashTimestamps): latestTimestampOnMap = self.stationHashTimestamps[name] - if ((int(time.time()) - 1) - int(self.frequencyLimit) < latestTimestampOnMap): + if (((int(time.time()) - 1) - frequencyLimitToApply) < latestTimestampOnMap): # This sender is sending faster than config limit return True self.stationHashTimestamps[name] = int(time.time()) - 1