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 kiss | ||||||
| import aprslib | import aprslib | ||||||
|  |  | ||||||
|  | import pick_pretty_description from aprs_to_callsign | ||||||
|  |  | ||||||
| MYCALL = os.environ.get("MYCALL", "N0CALL") | MYCALL = os.environ.get("MYCALL", "N0CALL") | ||||||
| KISS_HOST = os.environ.get("KISS_HOST", "10.10.10.91") | KISS_HOST = os.environ.get("KISS_HOST", "10.10.10.91") | ||||||
| KISS_PORT = os.environ.get("KISS_PORT", "8001") | KISS_PORT = os.environ.get("KISS_PORT", "8001") | ||||||
| @@ -28,7 +30,7 @@ def parse_frame(date, frame): | |||||||
|     except (aprslib.ParseError, aprslib.UnknownFormat) as exp: |     except (aprslib.ParseError, aprslib.UnknownFormat) as exp: | ||||||
|         logger.error(f"Failed to parse frame: {frame}") |         logger.error(f"Failed to parse frame: {frame}") | ||||||
|         return str(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 += " <{:.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 += " tUNIT: " + ",".join(parsed["tUNIT"]) if "tUNIT" in parsed else "" | ||||||
|     formatted_string += " tPARM: " + ",".join(parsed["tPARM"]) if "tPARM" 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]) | ||||||
		Reference in New Issue
	
	Block a user