def arguments(): parser = argparse.ArgumentParser(prog="rtlsdr_scan.py", description=''' Scan a range of frequencies and save the results to a file''') parser.add_argument("-s", "--start", help="Start frequency (MHz)", type=int) parser.add_argument("-e", "--end", help="End frequency (MHz)", type=int) parser.add_argument("-g", "--gain", help="Gain (dB)", type=float, default=0) parser.add_argument("-d", "--dwell", help="Dwell time (seconds)", type=float, default=0.1) parser.add_argument("-f", "--fft", help="FFT bins", type=int, default=1024) parser.add_argument("-l", "--lo", help="Local oscillator offset", type=int, default=0) group = parser.add_mutually_exclusive_group() group.add_argument("-i", "--index", help="Device index (from 0)", type=int, default=0) group.add_argument("-r", "--remote", help="Server IP and port", type=str) help = 'Output file (.rfs, ' + File.get_export_pretty() + ')' parser.add_argument("file", help=help, nargs='?') args = parser.parse_args() error = None isGui = True if args.start is not None or args.end is not None: if args.start is not None: if args.end is not None: if args.file is not None: isGui = False else: error = "No filename specified" else: error = "No end frequency specified" else: error = "No start frequency specified" elif args.file is not None: args.dirname, args.filename = os.path.split(args.file) if error is not None: print "Error: {0}".format(error) parser.exit(1) return isGui, (args)
def export_image(filename, format, figure): oldSize = figure.get_size_inches() oldDpi = figure.get_dpi() figure.set_size_inches((8, 4.5)) figure.set_dpi(600) canvas = FigureCanvasAgg(figure) canvas.draw() renderer = canvas.get_renderer() if matplotlib.__version__ >= '1.2': buf = renderer.buffer_rgba() else: buf = renderer.buffer_rgba(0, 0) size = canvas.get_width_height() image = Image.frombuffer('RGBA', size, buf, 'raw', 'RGBA', 0, 1) image = image.convert('RGB') ext = File.get_export_ext(format, File.Exports.IMAGE) image.save(filename, format=ext[1::]) figure.set_size_inches(oldSize) figure.set_dpi(oldDpi)
def __init__(self, pool, args): start = args.start end = args.end gain = args.gain dwell = args.dwell nfft = args.fft lo = args.lo index = args.index remote = args.remote directory, filename = os.path.split(args.file) _null, ext = os.path.splitext(args.file) self.lock = threading.Lock() self.stepsTotal = 0 self.steps = 0 self.spectrum = {} self.settings = Settings(load=False) self.queue = Queue.Queue() error = None if end <= start: error = "Start should be lower than end" elif dwell <= 0: error = "Dwell should be positive" elif nfft <= 0: error = "FFT bins should be positive" elif ext != ".rfs" and File.get_export_type(ext) == -1: error = "File extension should be .rfs, " error += File.get_export_pretty() else: device = Device() if remote is None: self.settings.devices = get_devices() count = len(self.settings.devices) if index > count - 1: error = "Device not found ({0} devices in total):\n".format(count) for device in self.settings.devices: error += "\t{0}: {1}\n".format(device.index, device.name) else: device.isDevice = False url = urlparse('//' + remote) if url.hostname is not None: device.server = url.hostname else: error = "Invalid hostname" if url.port is not None: device.port = url.port else: device.port = 1234 self.settings.devices.append(device) index = len(self.settings.devices) - 1 if error is not None: print "Error: {0}".format(error) exit(1) if end - 1 < start: end = start + 1 if remote is None: gain = nearest(gain, self.settings.devices[index].gains) self.settings.start = start self.settings.stop = end self.settings.dwell = calc_real_dwell(dwell) self.settings.nfft = nfft self.settings.devices[index].gain = gain self.settings.devices[index].lo = lo print "{0} - {1}MHz".format(start, end) print "{0}dB Gain".format(gain) print "{0}s Dwell".format(self.settings.dwell) print "{0} FFT points".format(nfft) print "{0}MHz LO".format(lo) if remote is not None: print remote else: print self.settings.devices[index].name self.scan(self.settings, index, pool) if ext == ".rfs": scanInfo = ScanInfo() scanInfo.setFromSettings(self.settings) save_plot(directory, filename, scanInfo, self.spectrum) else: exportType = File.get_export_type(ext) export_plot(directory, filename, exportType, self.spectrum) print "Done"