From 23fc08c8798d7c325a72fbee4175813efe4fe70f Mon Sep 17 00:00:00 2001 From: Arturs Artamonovs Date: Fri, 29 Nov 2024 11:28:01 +0000 Subject: RtlSdrIQ: can read samples from rtlsdr and dump those to file --- Radio/Utils/RtlSdrIQ/main.swift | 77 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 8 deletions(-) (limited to 'Radio/Utils/RtlSdrIQ') diff --git a/Radio/Utils/RtlSdrIQ/main.swift b/Radio/Utils/RtlSdrIQ/main.swift index 20573a9..c3d5732 100644 --- a/Radio/Utils/RtlSdrIQ/main.swift +++ b/Radio/Utils/RtlSdrIQ/main.swift @@ -9,13 +9,15 @@ import Foundation import libr820 import ArgumentParser +let NUM_SAMPLES=1024 + //set the command line arguments struct CommandLineArgs: ParsableCommand { @Argument var file:String = "" @Option(name:.shortAndLong) var device_idx: Int = 0 @Option(name:.shortAndLong) var samplerate: Int = 2048000 @Option(name:.shortAndLong) var gain: Int = 0 - @Option(name: .shortAndLong) var frequency: Int = 100000000 + @Option(name:.shortAndLong) var frequency: Int = 100000000 @Option(name:.shortAndLong) var nsamples: Int = 1024 @Flag(name: .shortAndLong) var verbose: Bool = false @Flag(name: .shortAndLong) var async: Bool = false @@ -40,6 +42,7 @@ if (args.device_idx < 0) || (args.device_idx > count-1) { let device = R820Tuner() device.open(index: UInt32(args.device_idx)) +//prepare dongle to receive some data let _ = device.setSampleRate(samplerate: UInt32(args.samplerate)) let _ = device.setCenterFreq(freq: UInt32(args.frequency)) if args.gain == 0 { @@ -48,15 +51,73 @@ if args.gain == 0 { let _ = device.setTunerGain(gain: Int32(args.gain)) } let _ = device.resetBuffer() -let buf_ptr = UnsafeMutableRawPointer.allocate(byteCount: args.nsamples, alignment: 1) + +//prepare file descriptor if args specify that +let currentExePath = Process().currentDirectoryPath +var fileDescriptor = FileManager.default +var fileArgUrl:URL? +var fileHandle:FileHandle? +if args.file != "" { + fileArgUrl = URL(fileURLWithFileSystemRepresentation: args.file, isDirectory: false, relativeTo: nil) + if (checkIfFileExists(args.file)) { + //remove file + do { + try fileDescriptor.removeItem(atPath: fileArgUrl!.path()) + } catch { + print("Couldn't delete file that exists \(fileArgUrl!.path())") + } + } + + //create file + fileDescriptor.createFile(atPath: fileArgUrl!.path(), contents: nil) + try fileHandle = FileHandle(forWritingTo: fileArgUrl!) + try fileHandle?.seekToEnd() +} + +//prepare loop buffers to process data +let buf_ptr = UnsafeMutableRawPointer.allocate(byteCount: NUM_SAMPLES, alignment: 1) var nbytes:Int32 = 0 -let r = device.readSync(buf: buf_ptr, len: Int32(args.nsamples), n_read: &nbytes) -print("Reading samples return code (\(r)) read \(nbytes) bytes\n") -for i in 0..