Compare commits
1 Commits
main
...
feat/tocal
Author | SHA1 | Date | |
---|---|---|---|
|
59a3ca7344 |
4
aprs.py
4
aprs.py
@ -10,6 +10,8 @@ from datetime import datetime
|
||||
import kiss
|
||||
import aprslib
|
||||
|
||||
import pick_pretty_description from aprs_to_callsign
|
||||
|
||||
MYCALL = os.environ.get("MYCALL", "N0CALL")
|
||||
KISS_HOST = os.environ.get("KISS_HOST", "10.10.10.91")
|
||||
KISS_PORT = os.environ.get("KISS_PORT", "8001")
|
||||
@ -28,7 +30,7 @@ def parse_frame(date, frame):
|
||||
except (aprslib.ParseError, aprslib.UnknownFormat) as exp:
|
||||
logger.error(f"Failed to parse frame: {frame}")
|
||||
return str(frame)
|
||||
formatted_string = date.strftime('%H:%M:%S.%f')[:-3] + " " + "{} -> {} -> {}:".format(parsed["from"], parsed["via"], parsed["to"])
|
||||
formatted_string = date.strftime('%H:%M:%S.%f')[:-3] + " " + "{} -> {} -> {}:".format(parsed["from"], parsed["via"], pick_pretty_description(parsed["to"])))
|
||||
formatted_string += " <{:.4f} {:.4f}>".format(parsed["latitude"], parsed["longitude"]) if "longitude" in parsed and "latitude" in parsed else ""
|
||||
formatted_string += " tUNIT: " + ",".join(parsed["tUNIT"]) if "tUNIT" in parsed else ""
|
||||
formatted_string += " tPARM: " + ",".join(parsed["tPARM"]) if "tPARM" in parsed else ""
|
||||
|
171
aprs_to_callsign.py
Normal file
171
aprs_to_callsign.py
Normal file
@ -0,0 +1,171 @@
|
||||
# source: http://aprs.org/aprs11/tocalls.txt
|
||||
ALTNET_DESCRIPTION = 'An ALTNET is defined to be ANY AX.25 TOCALL that is NOT one of the normal APRS TOCALL'
|
||||
|
||||
TOCALLS = {
|
||||
# slightly trasformed table from the source
|
||||
'AP1WWX': 'TAPR T-238+ WX station',
|
||||
'AP4Ry': 'APRS4R software interface',
|
||||
'APnnnD': 'Painter Engineering uSmartDigi D-Gate DSTAR Gateway',
|
||||
'APnnnU': 'Painter Engineering uSmartDigi Digipeater',
|
||||
'APAF': 'AFilter.',
|
||||
'APAG': 'AGATE',
|
||||
'APAGW': "SV2AGW's AGWtracker",
|
||||
'APA': 'AFilterX.',
|
||||
'APAH': 'AHub',
|
||||
'APAND1': 'APRSdroid (replaced by APDRxx',
|
||||
'APAW': 'AGWPE',
|
||||
'APB': 'Beacons or Rabbit TCPIP micros?',
|
||||
'APBL': 'BigRedBee BeeLine',
|
||||
'APBLO': 'MOdel Rocketry K7RKT',
|
||||
'APC': 'Cellular applications',
|
||||
'APCBB': 'for VE7UDP Blackberry Applications',
|
||||
'APCLEY': 'EYTraker GPRS/GSM tracker by ZS6EY',
|
||||
'APCLW': 'EYWeather GPRS/GSM WX station by ZS6EY',
|
||||
'APCLEZ': 'Telit EZ10 GSM application ZS6CEY',
|
||||
'APCY': 'Cybiko applications',
|
||||
'APRSd': 'etc',
|
||||
'APD4': 'UP4DAR platform',
|
||||
'APDD': 'DV-RPTR Modem and Control Center Software',
|
||||
'APDF': 'Automatic DF units',
|
||||
'APDG': 'D-Star Gateways by G4KLX ircDDB',
|
||||
'APDH': 'WinDV (DUTCH*Star DV Node for Windows)',
|
||||
'APDInn': 'DIXPRS - Bela, HA5DI',
|
||||
'APDK': 'KI4LKF g2_ircddb Dstar gateway software',
|
||||
'APDO': 'ON8JL Standalone DStar Node',
|
||||
'APDPRS': 'D-Star originated posits',
|
||||
'APDR': 'APrsDRoid replaces old APAND1.',
|
||||
'APDS': 'SP9UOB for dsDigi and ds-tracker',
|
||||
'APDT': 'APRStouch Tone (DTMF)',
|
||||
'APDU': 'U2APRS by JA7UDE',
|
||||
'APDW': 'DireWolf, WB2OSZ',
|
||||
'APE': 'Telemetry devices',
|
||||
'APERQ': 'Experimental tracker by PE1RXQ',
|
||||
'APF': 'Firenet',
|
||||
'APFG': 'Flood Gage (KP4DJT)',
|
||||
'APG': 'Gates, etc',
|
||||
'APGO': 'for AA3NJ PDA application',
|
||||
'APH': 'HamHud, etc',
|
||||
'APHK': 'for LA1BR tracker/digipeater',
|
||||
'API': 'Icom, etc',
|
||||
'APICQ': 'for ICQ',
|
||||
'APJA': 'JavAPRS',
|
||||
'APJE': 'JeAPRS',
|
||||
'APJI': 'jAPRSIgate',
|
||||
'APJS': 'javAPRSSrvr',
|
||||
'APK0': "Kenwood TH-D7's",
|
||||
'APK003': 'Kenwood TH-D72',
|
||||
'APK1': "Kenwood D700's",
|
||||
'APR102': 'Kenwood D710',
|
||||
'APKRAM': 'KRAMstuff.com - Mark. G7LEU',
|
||||
'APL': 'Linux applications',
|
||||
'APM': 'MacAPRS, etc',
|
||||
'APN': 'Network nodes, digis, etc',
|
||||
'APN3': 'Kantronics KPC-3 rom versions',
|
||||
'APN9': 'Kantronics KPC-9612 Roms',
|
||||
'APNA': "WB6ZSU's APRServe",
|
||||
'APND': 'DIGI_NED ssid routing ok',
|
||||
'APNM': 'MJF TNC roms',
|
||||
'APNP': 'Paccom TNC roms',
|
||||
'APNT': "SV2AGW's TNT tnc as a digi",
|
||||
'APNU': 'UIdigi; ssid routing ok',
|
||||
'APN': 'TNC-X (K6DBG)',
|
||||
'APNK01': 'Kenwood D700 (APK101) type',
|
||||
'APNK80': 'KAM version 8.0',
|
||||
'APNKMP': 'KAM+',
|
||||
'APOA': 'OpenAPRS - Greg Carter',
|
||||
'APOT': 'OpenTrack',
|
||||
'APOD1w': 'OpenTrack with 1 wire WX',
|
||||
'APOU2k': 'OpenTrack for Ultimeter',
|
||||
'APP': 'pocketAPRS, etc',
|
||||
'APPT': 'KetaiTracker by JF6LZE, Takeki (msg capable)',
|
||||
'APQ': 'Earthquake data',
|
||||
'APR8': 'APRSdos versions 800+',
|
||||
'APRD': 'APRSdata, APRSdr',
|
||||
'APRG': 'aprsg igate software, OH2GVE',
|
||||
'APRHH2': 'HamHud 2',
|
||||
'APRK': 'APRStk',
|
||||
'APRNOW': 'W5GGW ipad application',
|
||||
'APRRT': 'RPC electronics',
|
||||
'APRS': 'Generic, (obsolete. Digis should use APNxxx instead)',
|
||||
'APR': '>APRSmax 40 ',
|
||||
'APR': "OH2MQK's RX-igate <39",
|
||||
'APRTLM': "used in MIM's and Mic-lites, etc",
|
||||
'APRtfc': 'APRStraffic',
|
||||
'APRST': 'APRStt (Touch tone)',
|
||||
'APSK63': 'APRS Messenger -over-PSK63',
|
||||
'APSK25': 'APRS Messenger GMSK-250',
|
||||
'APTIGR': 'TigerTrack',
|
||||
'APTT': 'Tiny Track',
|
||||
'APT2': 'Tiny Track II',
|
||||
'APT3': 'Tiny Track III',
|
||||
'APTA': "K4ATM's tiny track",
|
||||
'APTW': 'Byons WXTrac',
|
||||
'APTV': 'for ATV/APRN and SSTV application',
|
||||
'APU1': 'UIview 16 bit applications',
|
||||
'APU2': 'UIview 32 bit apps',
|
||||
'APU3': 'UIview terminal program',
|
||||
'APV': 'VoIP Voice over Internet application',
|
||||
'APVR': 'IRLP',
|
||||
'APVL': 'I-LINK',
|
||||
'APVE': 'ECHO link',
|
||||
'APW': 'WinAPRS, etc',
|
||||
'APWS': "DF4IAN's WS2300 WX station",
|
||||
'APWM': 'APRSISCE KJ4ERJ',
|
||||
'APWW': 'APRSISCE win32 version',
|
||||
'AP': 'Xastir',
|
||||
'APR': 'Xrouter',
|
||||
'APY': 'Yeasu',
|
||||
'APZ': 'Experimental',
|
||||
'APZ0': 'Xastir (old versions. See APX) ssid routing ok',
|
||||
'APZMDR': 'HaMDR trackers - hessu * hes.iki.fi' ,
|
||||
'APZPAD': 'Smart Palm',
|
||||
'APZWIT': 'MAP27 radio (Mountain Rescue) EI7IG',
|
||||
}
|
||||
|
||||
# def filter_by_dest(aprs_destination):
|
||||
# '''
|
||||
# Just a shorthand to filter through the dict
|
||||
# '''
|
||||
# return { key:TOCALLS[key] for key in TOCALLS.keys() if aprs_destination.lower() in key.lower()}
|
||||
|
||||
def search_for_dest(aprs_destination):
|
||||
i = 2
|
||||
filter_by_dest = lambda to_call: { key:TOCALLS[key] for key in TOCALLS.keys() if to_call.lower() in key.lower()}
|
||||
pick_by_prefix = lambda i: filter_by_dest(aprs_destination[:i])
|
||||
results_ammount = lambda i: len(pick_by_prefix(i))
|
||||
results = {aprs_destination: ''}
|
||||
while results_ammount(i) > 0:
|
||||
if i == 6:
|
||||
break
|
||||
i += 1
|
||||
if results_ammount(i) == 1:
|
||||
return pick_by_prefix(i)
|
||||
else:
|
||||
return results
|
||||
|
||||
# list(pick_description(parsed["to"]).values())[0]
|
||||
def pick_description(aprs_destination, filter_altnets=True):
|
||||
descr = ALTNET_DESCRIPTION if not filter_altnets else ''
|
||||
match_tocall = lambda x: aprs_destination.lower().startswith(x.lower())
|
||||
if not match_tocall('ap'):
|
||||
# ALL, BEACON, CQ, QST, GPSxxx
|
||||
if match_tocall('ALL'):
|
||||
descr = 'ALL'
|
||||
elif match_tocall('BEACON'):
|
||||
descr = 'BEACON'
|
||||
elif match_tocall('CQ'):
|
||||
descr = 'CQ'
|
||||
elif match_tocall('QST'):
|
||||
descr = 'QST'
|
||||
elif match_tocall('GPS'):
|
||||
descr = 'GPS'
|
||||
return {aprs_destination: descr}
|
||||
else:
|
||||
return search_for_dest(aprs_destination)
|
||||
|
||||
def pick_pretty_description(aprs_destination, filter_altnets=True):
|
||||
'''
|
||||
For now it's just two first words from description.
|
||||
'''
|
||||
result = pick_description(aprs_destination, filter_altnets)
|
||||
return ' '.join(list(result.values())[0].split()[:2])
|
Loading…
Reference in New Issue
Block a user