Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions src/RTLSDR.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ export
set_rate,
get_freq,
set_freq,
get_gains,
get_gain,
set_gain,
set_agc_mode,
set_tuner_gain_mode

Expand All @@ -24,8 +27,8 @@ mutable struct RtlSdr
valid_ptr::Bool
dongle_ptr::Ptr{rtlsdr_dev}

function RtlSdr()
dp = rtlsdr_open()
function RtlSdr(index::Int64=0)
dp = rtlsdr_open(index)

r = new(true, dp)

Expand Down Expand Up @@ -73,6 +76,35 @@ function get_freq(r::RtlSdr)
return Int(freq)
end

"""
`get_gains(r::RtlSdr)`

Interface for `rtlsdr_get_tuner_gains`.
Gains are in tenths of a dB.
"""
function get_gains(r::RtlSdr)
@assert r.valid_ptr
return rtlsdr_get_tuner_gains(r.dongle_ptr)
end

"""
`set_gain(r::RtlSdr, gain_db)`

Interface for `rtlsdr_set_tuner_gain`.
"""
function set_gain(r::RtlSdr, gain_db)
@assert r.valid_ptr
# Implement rounding, taking after roger-'s pyrtlsdr
avail_gains = get_gains(r)
errors = [abs((10 * gain_db) - avail_gain) for avail_gain in get_gains(r)]
closest_gain_idx = findall(errors .== minimum(errors))[1] # broadcast find
rtlsdr_set_tuner_gain(r.dongle_ptr, avail_gains[closest_gain_idx])
end
function get_gain(r::RtlSdr)
@assert r.valid_ptr
return rtlsdr_get_tuner_gain(r.dongle_ptr) / 10
end

"""
Interface for `rtlsdr_set_agc_mode`
"""
Expand Down
62 changes: 38 additions & 24 deletions src/c_interface.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ mutable struct RTLSDRError <: Exception
end

# returns a pointer to
function rtlsdr_open()
index = 0
function rtlsdr_open(index::Int64=0)
rd = Array{Ptr{rtlsdr_dev},1}(undef,1)
ret = ccall( (:rtlsdr_open, "librtlsdr"),
Cint,
Expand Down Expand Up @@ -83,14 +82,41 @@ function rtlsdr_set_sample_rate(rf::Ref{rtlsdr_dev}, sample_rate)
end

# gain
function rtlsdr_set_agc_mode(rf::Ref{rtlsdr_dev}, on)
function rtlsdr_set_tuner_gain(rf::Ref{rtlsdr_dev}, gain)
ret = ccall( (:rtlsdr_set_tuner_gain, "librtlsdr"),
Cint,
(Ref{rtlsdr_dev},Cint),
rf,
on
rf,
gain
)
if ret != 0; throw(RTLSDRError("RTLSDR.jl reports: Error setting tuner gain (error code $ret).")); end
end

function rtlsdr_get_tuner_gain(rf::Ref{rtlsdr_dev})
gain = ccall( (:rtlsdr_get_tuner_gain, "librtlsdr"),
Cint,
(Ref{rtlsdr_dev},),
rf
)
return gain[1]
end

function rtlsdr_get_tuner_gains(rf::Ref{rtlsdr_dev})
buf = Vector{Cint}(undef, 50) # max 50 gain settings. no RTL has this many.
num_gains = ccall( (:rtlsdr_get_tuner_gains, "librtlsdr"),
Cint,
(Ref{rtlsdr_dev}, Ref{Cint}),
rf,
buf
)
if ret != 0; throw(RTLSDRError("RTLSDR.jl reports: Error setting AGC mode (error code $ret).")); end
if num_gains == 0
throw(RTLSDRError("RTLSDR.jl reports: Error getting gains."))
end
avail_gains = Vector{Int32}(undef, num_gains)
for i = 1:num_gains
avail_gains[i] = buf[i]
end
return avail_gains
end

function rtlsdr_set_tuner_gain_mode(rf::Ref{rtlsdr_dev}, manual)
Expand All @@ -103,29 +129,17 @@ function rtlsdr_set_tuner_gain_mode(rf::Ref{rtlsdr_dev}, manual)
if ret != 0; throw(RTLSDRError("RTLSDR.jl reports: Error setting tuner gain mode (error code $ret).")); end
end

function rtlsdr_set_tuner_gain(rf::Ref{rtlsdr_dev}, gain)
function rtlsdr_set_agc_mode(rf::Ref{rtlsdr_dev}, on)
ret = ccall( (:rtlsdr_set_tuner_gain, "librtlsdr"),
Cint,
(Ref{rtlsdr_dev},Cint),
rf,
gain
)
if ret != 0; throw(RTLSDRError("RTLSDR.jl reports: Error setting tuner gain (error code $ret).")); end
end

function rtlsdr_get_tuner_gain(rf::Ref{rtlsdr_dev})
gain = Array{Cint,1}(undef,1)
ret = ccall( (:rtlsdr_get_tuner_gain, "librtlsdr"),
Cint,
(Ref{rtlsdr_dev},Ptr{Cint}),
rf,
gain
)
if ret != 0; throw(RTLSDRError("RTLSDR.jl reports: Error getting tuner gain (error code $ret).")); end
return gain[1]
rf,
on
)
if ret != 0; throw(RTLSDRError("RTLSDR.jl reports: Error setting AGC mode (error code $ret).")); end
end


# reading
function read_bytes(rf::Ref{rtlsdr_dev}, num_bytes)
buf = Vector{Cuchar}(undef,num_bytes)
bytes_read = Ref{Cint}(0)
Expand Down