Source code for rf_info.rf_info

#!/usr/bin/env python3

from iso3166 import countries
from .countrymap import COUNTRY_MAP


[docs]def parse_freq(freq, unit): argfreq = freq.replace('.', '').replace(',', '').replace('_', '').replace(' ', '') if unit.lower() == 'khz': mindigits = 3 elif unit.lower() == 'mhz': mindigits = 6 elif unit.lower() == 'ghz': mindigits = 9 elif unit.lower() == 'hz': if argfreq.isnumeric(): return int(argfreq) else: raise ValueError('Invalid Frequency Specified') else: raise ValueError('Invalid Unit Specified') if '.' in freq: first_occurrence = freq.index('.') + 1 nfreq = (freq[:first_occurrence] + freq[first_occurrence:].replace(".", "")).split('.') while len(nfreq[1]) < mindigits: nfreq[1] = nfreq[1] + '0' return int(''.join(nfreq)) else: for each in range(mindigits): argfreq = argfreq + '0' argfreq = str(int(argfreq)) return int(argfreq)
[docs]class Frequency(): def __init__(self, freq, unit='hz', country='us'): # Hack for pytest to test cli inputs if unit == '': unit = 'hz' if country == '': country = 'us' # Determine Country and import country data try: scountry = countries.get(country) except KeyError: raise ValueError('Invalid Country Specified') cc = scountry.alpha2.upper() if cc not in COUNTRY_MAP: raise ValueError('Specified Country is Not Supported') from .data.international import ISM, IEEE, ITU, NATO, WAVEGUIDE, MICROWAVE from .data.satellites import SATELLITES if COUNTRY_MAP[cc] == 'a': from .data.a_allocations import ALLOCATIONS elif COUNTRY_MAP[cc] == 'b': from .data.b_allocations import ALLOCATIONS elif COUNTRY_MAP[cc] == 'c': from .data.c_allocations import ALLOCATIONS if scountry.alpha2.upper() == 'US': from .data.us import BROADCAST, AMATEUR, WIFI, SERVICES # Parse Frequency and unit inputs if (isinstance(freq, float) or isinstance(freq, str) or isinstance(freq, int)) and type(freq) != bool: intfreq = parse_freq(str(freq), unit) else: raise TypeError('Invalid Frequency Type') if intfreq < 1 or intfreq > 999999999999: raise ValueError('Frequency Out of Range') # Display Frequency dispfreq = str(intfreq)[::-1] while len(dispfreq) < 9: dispfreq = dispfreq + '0' dispfreq = '.'.join(dispfreq[i:i + 3] for i in range(0, len(dispfreq), 3)) self.display = dispfreq[::-1] # Unit frequencies self.units = {'hz': int(intfreq), 'khz': float(intfreq / 1000), 'mhz': float(intfreq / 1000000), 'ghz': float(intfreq / 1000000000)} # Wavelength data meter = 300000000 / intfreq if meter >= 1: self.wavelength = '{:,}'.format(int(meter)) self.wavelength = '{}m'.format(self.wavelength) elif meter >= 0.01: sub = int(str(meter).split('.')[1]) self.wavelength = '{}cm'.format(str(sub)[:2]) elif meter < 0.01: sub = int(str(meter).split('.')[1]) * 1000 self.wavelength = '{}mm'.format(str(sub)[:2]) # ITU data itu = ITU[intfreq] if itu: self.itu = {'number': itu[0], 'band': itu[2], 'abbr': itu[1]} else: self.itu = {'number': None, 'band': None, 'abbr': None} # IEEE data ieee = IEEE[intfreq] if ieee: self.ieee = {'band': ieee[0], 'description': ieee[1]} else: self.ieee = {'band': None, 'description': None} # NATO data nato = NATO[intfreq] if nato: self.nato = {'band': nato[0]} else: self.nato = {'band': None} # ISM Band data if ISM[intfreq] is not None: keys = ['type', 'description'] self.ism = dict(zip(keys, ISM[intfreq])) else: self.ism = {'band': None, 'description': None} # Waveguide data waveguide = WAVEGUIDE[intfreq] if waveguide: self.waveguide = {'band': waveguide[0]} else: self.waveguide = {'band': None} # Microwave data if MICROWAVE[intfreq] is None: self.microwave = {'band': None, 'allocation': None} else: self.microwave = {'band': MICROWAVE[intfreq][0], 'allocation': MICROWAVE[intfreq][1]} # Set Country self.country = {'name': scountry.name, 'abbr': scountry.alpha2.upper()} # Broadcasting data broadcasting = ALLOCATIONS[intfreq][3] if 'BROADCAST' in locals(): broadcast = BROADCAST[intfreq] if broadcasting: if broadcast is not None: if len(broadcast) > 0: self.broadcasting = {'allocated': True, 'details': broadcast} else: self.broadcasting = {'allocated': True, 'details': tuple()} else: self.broadcasting = {'allocated': False, 'details': tuple()} else: self.broadcasting = {'allocated': False, 'details': tuple()} # Wifi data if 'WIFI' in locals(): wifi = WIFI[intfreq] if wifi is not None: self.wifi = {'allocated': True, 'details': wifi} else: self.wifi = {'allocated': False, 'details': None} else: self.wifi = {'allocated': False, 'details': None} # Amateur radio data amateur = ALLOCATIONS[intfreq][0] if 'AMATEUR' in locals(): amateurdetail = AMATEUR[intfreq] if amateur: if amateurdetail is not None: self.amateur = {'allocated': True, 'modes': amateurdetail[0], 'license': amateurdetail[1], 'power': amateurdetail[2]} else: self.amateur = {'allocated': True, 'modes': None, 'license': None, 'power': None} else: self.amateur = {'allocated': False, 'modes': None, 'license': None, 'power': None} else: self.amateur = {'allocated': False, 'modes': None, 'license': None, 'power': None} # Satellite data satellite = ALLOCATIONS[intfreq][4] if 'SATELLITES' in locals(): satdetail = SATELLITES[intfreq] if satdetail is not None: self.satellite = {'allocated': True, 'name': satdetail[0], 'sat-id': satdetail[1], 'link': satdetail[2], 'modes': satdetail[3], 'callsign': satdetail[4], 'status': satdetail[5]} elif satellite: self.satellite = {'allocated': True, 'name': None, 'sat-id': None, 'link': None, 'modes': None, 'callsign': None, 'status': None} else: self.satellite = {'allocated': False, 'name': None, 'sat-id': None, 'link': None, 'modes': None, 'callsign': None, 'status': None} else: self.satellite = {'allocated': False, 'name': None, 'sat-id': None, 'link': None, 'modes': None, 'callsign': None, 'status': None} # Other Services data if 'SERVICES' in locals(): services = SERVICES[intfreq] if services is not None: self.services = services else: self.services = None else: self.services = None # Fixed & Mobile station data self.station = {'fixed': ALLOCATIONS[intfreq][1], 'mobile': ALLOCATIONS[intfreq][2]} # IEEE Allocation self.ieee_allocation = {'primary': tuple(ALLOCATIONS[intfreq][5]), 'secondary': tuple(ALLOCATIONS[intfreq][6]), 'notes': tuple(ALLOCATIONS[intfreq][7])}
[docs] def info(self): return self.__dict__
[docs] def details(self): return self.__dict__
def __repr__(self): return "rf_info.Frequency('{}', 'hz', '{}')".format(self.display, self.country['abbr'].lower()) def __str__(self): return '{} - {} hz'.format(self.display, self.units['hz']) def __int__(self): return int(self.units['hz']) def __add__(self, other): if isinstance(other, Frequency): return Frequency(self.units['hz'] + other.units['hz']) elif isinstance(other, int): return Frequency(self.units['hz'] + other) elif isinstance(other, str): otherf = Frequency(other) return Frequency(self.units['hz'] + otherf.units['hz']) else: raise TypeError def __sub__(self, other): if isinstance(other, Frequency): return Frequency(self.units['hz'] - other.units['hz']) elif isinstance(other, int): return Frequency(self.units['hz'] - other) elif isinstance(other, str): otherf = Frequency(other) return Frequency(self.units['hz'] - otherf.units['hz']) else: raise TypeError def __len__(self): return len(str(self.units['hz']))