diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
index 3351063..aef35ea 100644
--- a/apps/CMakeLists.txt
+++ b/apps/CMakeLists.txt
@@ -34,5 +34,7 @@ GR_PYTHON_INSTALL(
flowgraphs/satnogs_fsk9600_g3ruh_ax25.py
flowgraphs/satnogs_afsk1200_ax25.py
flowgraphs/satnogs_example_flowgraph.py
+ flowgraphs/satnogs_fsk_ax25.py
+ flowgraphs/satnogs_msk_ax25.py
DESTINATION bin
)
diff --git a/apps/flowgraphs/fsk_ax25.grc b/apps/flowgraphs/fsk_ax25.grc
new file mode 100644
index 0000000..dd733ac
--- /dev/null
+++ b/apps/flowgraphs/fsk_ax25.grc
@@ -0,0 +1,3454 @@
+
+
+
+ Thu Aug 9 19:37:02 2018
+
+ options
+
+ author
+ Manolis Surligas (surligas@gmail.com)
+
+
+ window_size
+ 2*1080,1080
+
+
+ category
+ [GRC Hier Blocks]
+
+
+ comment
+
+
+
+ description
+ Generic FSK AX.25 decoder
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (8, 20)
+
+
+ _rotation
+ 0
+
+
+ generate_options
+ no_gui
+
+
+ hier_block_src_path
+ .:
+
+
+ id
+ satnogs_fsk_ax25
+
+
+ max_nouts
+ 0
+
+
+ qt_qss_theme
+
+
+
+ realtime_scheduling
+
+
+
+ run_command
+ {python} -u {filename}
+
+
+ run_options
+ run
+
+
+ run
+ True
+
+
+ sizing_mode
+ fixed
+
+
+ thread_safe_setters
+
+
+
+ title
+ satnogs_fsk_ax25
+
+
+ placement
+ (0,0)
+
+
+
+ variable
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (664, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ audio_samp_rate
+
+
+ value
+ 48000
+
+
+
+ analog_quadrature_demod_cf
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (1248, 196)
+
+
+ _rotation
+ 0
+
+
+ gain
+ 1.2
+
+
+ id
+ analog_quadrature_demod_cf_0_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+
+ analog_quadrature_demod_cf
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (992, 316)
+
+
+ _rotation
+ 0
+
+
+ gain
+ 0.9
+
+
+ id
+ analog_quadrature_demod_cf_0_0_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (280, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ antenna
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ satnogs.not_set_antenna
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+ SDR RX sampling rate
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (584, 724)
+
+
+ _rotation
+ 0
+
+
+ id
+ baudrate
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ 9600.0
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (200, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ bb_gain
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ satnogs.not_set_rx_bb_gain
+
+
+
+ dc_blocker_xx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (1432, 188)
+
+
+ _rotation
+ 0
+
+
+ id
+ dc_blocker_xx_0
+
+
+ length
+ 1024
+
+
+ long_form
+ True
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ type
+ ff
+
+
+
+ dc_blocker_xx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (1208, 308)
+
+
+ _rotation
+ 0
+
+
+ id
+ dc_blocker_xx_0_0
+
+
+ length
+ 1024
+
+
+ long_form
+ True
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ type
+ ff
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (480, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ dev_args
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ satnogs.not_set_dev_args
+
+
+
+ digital_binary_slicer_fb
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (1512, 592)
+
+
+ _rotation
+ 180
+
+
+ id
+ digital_binary_slicer_fb_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+
+ digital_clock_recovery_mm_xx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (1616, 164)
+
+
+ _rotation
+ 0
+
+
+ gain_mu
+ 0.175
+
+
+ gain_omega
+ 0.25*0.175*0.175
+
+
+ id
+ digital_clock_recovery_mm_xx_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ mu
+ 0.5
+
+
+ omega_relative_limit
+ 0.005
+
+
+ omega
+ 2
+
+
+ type
+ float
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (40, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ doppler_correction_per_sec
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ intx
+
+
+ value
+ 1000
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (360, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ enable_iq_dump
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ intx
+
+
+ value
+ 0
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (176, 716)
+
+
+ _rotation
+ 180
+
+
+ id
+ file_path
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ test.wav
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (120, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ if_gain
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ satnogs.not_set_rx_if_gain
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (472, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ iq_file_path
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ /tmp/iq.dat
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+ To avoid the SDR carrier at the DC
+we shift the LO a little further
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (272, 716)
+
+
+ _rotation
+ 0
+
+
+ id
+ lo_offset
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ 100e3
+
+
+
+ osmosdr_source
+
+ alias
+
+
+
+ ant0
+ satnogs.handle_rx_antenna(rx_sdr_device, antenna)
+
+
+ bb_gain0
+ satnogs.handle_rx_bb_gain(rx_sdr_device, bb_gain)
+
+
+ bw0
+ satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx)
+
+
+ dc_offset_mode0
+ 2
+
+
+ corr0
+ ppm
+
+
+ freq0
+ rx_freq - lo_offset
+
+
+ gain_mode0
+ False
+
+
+ if_gain0
+ satnogs.handle_rx_if_gain(rx_sdr_device, if_gain)
+
+
+ iq_balance_mode0
+ 0
+
+
+ gain0
+ satnogs.handle_rx_rf_gain(rx_sdr_device, rf_gain)
+
+
+ ant10
+
+
+
+ bb_gain10
+ 20
+
+
+ bw10
+ 0
+
+
+ dc_offset_mode10
+ 0
+
+
+ corr10
+ 0
+
+
+ freq10
+ 100e6
+
+
+ gain_mode10
+ False
+
+
+ if_gain10
+ 20
+
+
+ iq_balance_mode10
+ 0
+
+
+ gain10
+ 10
+
+
+ ant11
+
+
+
+ bb_gain11
+ 20
+
+
+ bw11
+ 0
+
+
+ dc_offset_mode11
+ 0
+
+
+ corr11
+ 0
+
+
+ freq11
+ 100e6
+
+
+ gain_mode11
+ False
+
+
+ if_gain11
+ 20
+
+
+ iq_balance_mode11
+ 0
+
+
+ gain11
+ 10
+
+
+ ant12
+
+
+
+ bb_gain12
+ 20
+
+
+ bw12
+ 0
+
+
+ dc_offset_mode12
+ 0
+
+
+ corr12
+ 0
+
+
+ freq12
+ 100e6
+
+
+ gain_mode12
+ False
+
+
+ if_gain12
+ 20
+
+
+ iq_balance_mode12
+ 0
+
+
+ gain12
+ 10
+
+
+ ant13
+
+
+
+ bb_gain13
+ 20
+
+
+ bw13
+ 0
+
+
+ dc_offset_mode13
+ 0
+
+
+ corr13
+ 0
+
+
+ freq13
+ 100e6
+
+
+ gain_mode13
+ False
+
+
+ if_gain13
+ 20
+
+
+ iq_balance_mode13
+ 0
+
+
+ gain13
+ 10
+
+
+ ant14
+
+
+
+ bb_gain14
+ 20
+
+
+ bw14
+ 0
+
+
+ dc_offset_mode14
+ 0
+
+
+ corr14
+ 0
+
+
+ freq14
+ 100e6
+
+
+ gain_mode14
+ False
+
+
+ if_gain14
+ 20
+
+
+ iq_balance_mode14
+ 0
+
+
+ gain14
+ 10
+
+
+ ant15
+
+
+
+ bb_gain15
+ 20
+
+
+ bw15
+ 0
+
+
+ dc_offset_mode15
+ 0
+
+
+ corr15
+ 0
+
+
+ freq15
+ 100e6
+
+
+ gain_mode15
+ False
+
+
+ if_gain15
+ 20
+
+
+ iq_balance_mode15
+ 0
+
+
+ gain15
+ 10
+
+
+ ant16
+
+
+
+ bb_gain16
+ 20
+
+
+ bw16
+ 0
+
+
+ dc_offset_mode16
+ 0
+
+
+ corr16
+ 0
+
+
+ freq16
+ 100e6
+
+
+ gain_mode16
+ False
+
+
+ if_gain16
+ 20
+
+
+ iq_balance_mode16
+ 0
+
+
+ gain16
+ 10
+
+
+ ant17
+
+
+
+ bb_gain17
+ 20
+
+
+ bw17
+ 0
+
+
+ dc_offset_mode17
+ 0
+
+
+ corr17
+ 0
+
+
+ freq17
+ 100e6
+
+
+ gain_mode17
+ False
+
+
+ if_gain17
+ 20
+
+
+ iq_balance_mode17
+ 0
+
+
+ gain17
+ 10
+
+
+ ant18
+
+
+
+ bb_gain18
+ 20
+
+
+ bw18
+ 0
+
+
+ dc_offset_mode18
+ 0
+
+
+ corr18
+ 0
+
+
+ freq18
+ 100e6
+
+
+ gain_mode18
+ False
+
+
+ if_gain18
+ 20
+
+
+ iq_balance_mode18
+ 0
+
+
+ gain18
+ 10
+
+
+ ant19
+
+
+
+ bb_gain19
+ 20
+
+
+ bw19
+ 0
+
+
+ dc_offset_mode19
+ 0
+
+
+ corr19
+ 0
+
+
+ freq19
+ 100e6
+
+
+ gain_mode19
+ False
+
+
+ if_gain19
+ 20
+
+
+ iq_balance_mode19
+ 0
+
+
+ gain19
+ 10
+
+
+ ant1
+
+
+
+ bb_gain1
+ 20
+
+
+ bw1
+ 0
+
+
+ dc_offset_mode1
+ 0
+
+
+ corr1
+ 0
+
+
+ freq1
+ 100e6
+
+
+ gain_mode1
+ False
+
+
+ if_gain1
+ 20
+
+
+ iq_balance_mode1
+ 0
+
+
+ gain1
+ 10
+
+
+ ant20
+
+
+
+ bb_gain20
+ 20
+
+
+ bw20
+ 0
+
+
+ dc_offset_mode20
+ 0
+
+
+ corr20
+ 0
+
+
+ freq20
+ 100e6
+
+
+ gain_mode20
+ False
+
+
+ if_gain20
+ 20
+
+
+ iq_balance_mode20
+ 0
+
+
+ gain20
+ 10
+
+
+ ant21
+
+
+
+ bb_gain21
+ 20
+
+
+ bw21
+ 0
+
+
+ dc_offset_mode21
+ 0
+
+
+ corr21
+ 0
+
+
+ freq21
+ 100e6
+
+
+ gain_mode21
+ False
+
+
+ if_gain21
+ 20
+
+
+ iq_balance_mode21
+ 0
+
+
+ gain21
+ 10
+
+
+ ant22
+
+
+
+ bb_gain22
+ 20
+
+
+ bw22
+ 0
+
+
+ dc_offset_mode22
+ 0
+
+
+ corr22
+ 0
+
+
+ freq22
+ 100e6
+
+
+ gain_mode22
+ False
+
+
+ if_gain22
+ 20
+
+
+ iq_balance_mode22
+ 0
+
+
+ gain22
+ 10
+
+
+ ant23
+
+
+
+ bb_gain23
+ 20
+
+
+ bw23
+ 0
+
+
+ dc_offset_mode23
+ 0
+
+
+ corr23
+ 0
+
+
+ freq23
+ 100e6
+
+
+ gain_mode23
+ False
+
+
+ if_gain23
+ 20
+
+
+ iq_balance_mode23
+ 0
+
+
+ gain23
+ 10
+
+
+ ant24
+
+
+
+ bb_gain24
+ 20
+
+
+ bw24
+ 0
+
+
+ dc_offset_mode24
+ 0
+
+
+ corr24
+ 0
+
+
+ freq24
+ 100e6
+
+
+ gain_mode24
+ False
+
+
+ if_gain24
+ 20
+
+
+ iq_balance_mode24
+ 0
+
+
+ gain24
+ 10
+
+
+ ant25
+
+
+
+ bb_gain25
+ 20
+
+
+ bw25
+ 0
+
+
+ dc_offset_mode25
+ 0
+
+
+ corr25
+ 0
+
+
+ freq25
+ 100e6
+
+
+ gain_mode25
+ False
+
+
+ if_gain25
+ 20
+
+
+ iq_balance_mode25
+ 0
+
+
+ gain25
+ 10
+
+
+ ant26
+
+
+
+ bb_gain26
+ 20
+
+
+ bw26
+ 0
+
+
+ dc_offset_mode26
+ 0
+
+
+ corr26
+ 0
+
+
+ freq26
+ 100e6
+
+
+ gain_mode26
+ False
+
+
+ if_gain26
+ 20
+
+
+ iq_balance_mode26
+ 0
+
+
+ gain26
+ 10
+
+
+ ant27
+
+
+
+ bb_gain27
+ 20
+
+
+ bw27
+ 0
+
+
+ dc_offset_mode27
+ 0
+
+
+ corr27
+ 0
+
+
+ freq27
+ 100e6
+
+
+ gain_mode27
+ False
+
+
+ if_gain27
+ 20
+
+
+ iq_balance_mode27
+ 0
+
+
+ gain27
+ 10
+
+
+ ant28
+
+
+
+ bb_gain28
+ 20
+
+
+ bw28
+ 0
+
+
+ dc_offset_mode28
+ 0
+
+
+ corr28
+ 0
+
+
+ freq28
+ 100e6
+
+
+ gain_mode28
+ False
+
+
+ if_gain28
+ 20
+
+
+ iq_balance_mode28
+ 0
+
+
+ gain28
+ 10
+
+
+ ant29
+
+
+
+ bb_gain29
+ 20
+
+
+ bw29
+ 0
+
+
+ dc_offset_mode29
+ 0
+
+
+ corr29
+ 0
+
+
+ freq29
+ 100e6
+
+
+ gain_mode29
+ False
+
+
+ if_gain29
+ 20
+
+
+ iq_balance_mode29
+ 0
+
+
+ gain29
+ 10
+
+
+ ant2
+
+
+
+ bb_gain2
+ 20
+
+
+ bw2
+ 0
+
+
+ dc_offset_mode2
+ 0
+
+
+ corr2
+ 0
+
+
+ freq2
+ 100e6
+
+
+ gain_mode2
+ False
+
+
+ if_gain2
+ 20
+
+
+ iq_balance_mode2
+ 0
+
+
+ gain2
+ 10
+
+
+ ant30
+
+
+
+ bb_gain30
+ 20
+
+
+ bw30
+ 0
+
+
+ dc_offset_mode30
+ 0
+
+
+ corr30
+ 0
+
+
+ freq30
+ 100e6
+
+
+ gain_mode30
+ False
+
+
+ if_gain30
+ 20
+
+
+ iq_balance_mode30
+ 0
+
+
+ gain30
+ 10
+
+
+ ant31
+
+
+
+ bb_gain31
+ 20
+
+
+ bw31
+ 0
+
+
+ dc_offset_mode31
+ 0
+
+
+ corr31
+ 0
+
+
+ freq31
+ 100e6
+
+
+ gain_mode31
+ False
+
+
+ if_gain31
+ 20
+
+
+ iq_balance_mode31
+ 0
+
+
+ gain31
+ 10
+
+
+ ant3
+
+
+
+ bb_gain3
+ 20
+
+
+ bw3
+ 0
+
+
+ dc_offset_mode3
+ 0
+
+
+ corr3
+ 0
+
+
+ freq3
+ 100e6
+
+
+ gain_mode3
+ False
+
+
+ if_gain3
+ 20
+
+
+ iq_balance_mode3
+ 0
+
+
+ gain3
+ 10
+
+
+ ant4
+
+
+
+ bb_gain4
+ 20
+
+
+ bw4
+ 0
+
+
+ dc_offset_mode4
+ 0
+
+
+ corr4
+ 0
+
+
+ freq4
+ 100e6
+
+
+ gain_mode4
+ False
+
+
+ if_gain4
+ 20
+
+
+ iq_balance_mode4
+ 0
+
+
+ gain4
+ 10
+
+
+ ant5
+
+
+
+ bb_gain5
+ 20
+
+
+ bw5
+ 0
+
+
+ dc_offset_mode5
+ 0
+
+
+ corr5
+ 0
+
+
+ freq5
+ 100e6
+
+
+ gain_mode5
+ False
+
+
+ if_gain5
+ 20
+
+
+ iq_balance_mode5
+ 0
+
+
+ gain5
+ 10
+
+
+ ant6
+
+
+
+ bb_gain6
+ 20
+
+
+ bw6
+ 0
+
+
+ dc_offset_mode6
+ 0
+
+
+ corr6
+ 0
+
+
+ freq6
+ 100e6
+
+
+ gain_mode6
+ False
+
+
+ if_gain6
+ 20
+
+
+ iq_balance_mode6
+ 0
+
+
+ gain6
+ 10
+
+
+ ant7
+
+
+
+ bb_gain7
+ 20
+
+
+ bw7
+ 0
+
+
+ dc_offset_mode7
+ 0
+
+
+ corr7
+ 0
+
+
+ freq7
+ 100e6
+
+
+ gain_mode7
+ False
+
+
+ if_gain7
+ 20
+
+
+ iq_balance_mode7
+ 0
+
+
+ gain7
+ 10
+
+
+ ant8
+
+
+
+ bb_gain8
+ 20
+
+
+ bw8
+ 0
+
+
+ dc_offset_mode8
+ 0
+
+
+ corr8
+ 0
+
+
+ freq8
+ 100e6
+
+
+ gain_mode8
+ False
+
+
+ if_gain8
+ 20
+
+
+ iq_balance_mode8
+ 0
+
+
+ gain8
+ 10
+
+
+ ant9
+
+
+
+ bb_gain9
+ 20
+
+
+ bw9
+ 0
+
+
+ dc_offset_mode9
+ 0
+
+
+ corr9
+ 0
+
+
+ freq9
+ 100e6
+
+
+ gain_mode9
+ False
+
+
+ if_gain9
+ 20
+
+
+ iq_balance_mode9
+ 0
+
+
+ gain9
+ 10
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ args
+ satnogs.handle_rx_dev_args(rx_sdr_device, dev_args)
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (216, 284)
+
+
+ _rotation
+ 0
+
+
+ id
+ osmosdr_source_0
+
+
+ maxoutbuf
+ 0
+
+
+ clock_source0
+
+
+
+ time_source0
+
+
+
+ clock_source1
+
+
+
+ time_source1
+
+
+
+ clock_source2
+
+
+
+ time_source2
+
+
+
+ clock_source3
+
+
+
+ time_source3
+
+
+
+ clock_source4
+
+
+
+ time_source4
+
+
+
+ clock_source5
+
+
+
+ time_source5
+
+
+
+ clock_source6
+
+
+
+ time_source6
+
+
+
+ clock_source7
+
+
+
+ time_source7
+
+
+
+ minoutbuf
+ 0
+
+
+ nchan
+ 1
+
+
+ num_mboards
+ 1
+
+
+ type
+ fc32
+
+
+ sample_rate
+ satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx)
+
+
+ sync
+
+
+
+
+ pfb_arb_resampler_xxx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (472, 348)
+
+
+ _rotation
+ 0
+
+
+ id
+ pfb_arb_resampler_xxx_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ nfilts
+ 32
+
+
+ rrate
+ audio_samp_rate/satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx)
+
+
+ samp_delay
+ 0
+
+
+ atten
+ 100
+
+
+ taps
+
+
+
+ type
+ ccf
+
+
+
+ pfb_arb_resampler_xxx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (984, 172)
+
+
+ _rotation
+ 0
+
+
+ id
+ pfb_arb_resampler_xxx_0_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ nfilts
+ 32
+
+
+ rrate
+ (2.0*baudrate)/audio_samp_rate
+
+
+ samp_delay
+ 0
+
+
+ atten
+ 100
+
+
+ taps
+
+
+
+ type
+ ccf
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (584, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ ppm
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ intx
+
+
+ value
+ 0
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (40, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ rf_gain
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ satnogs.not_set_rx_rf_gain
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (392, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ rigctl_port
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ intx
+
+
+ value
+ 4532
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (312, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ rx_freq
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ 100e6
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (200, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ rx_sdr_device
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ usrpb200
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (472, 724)
+
+
+ _rotation
+ 0
+
+
+ id
+ samp_rate_rx
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ satnogs.not_set_samp_rate_rx
+
+
+
+ satnogs_ax25_decoder_bm
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ descrambling
+ True
+
+
+ _coordinate
+ (1240, 492)
+
+
+ _rotation
+ 180
+
+
+ id
+ satnogs_ax25_decoder_bm_0
+
+
+ maxoutbuf
+ 0
+
+
+ max_frame_len
+ 1024
+
+
+ minoutbuf
+ 0
+
+
+ promisc
+ True
+
+
+ addr
+ 'GND'
+
+
+ ssid
+ 0
+
+
+
+ satnogs_ax25_decoder_bm
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ descrambling
+ False
+
+
+ _coordinate
+ (1240, 612)
+
+
+ _rotation
+ 180
+
+
+ id
+ satnogs_ax25_decoder_bm_0_0
+
+
+ maxoutbuf
+ 0
+
+
+ max_frame_len
+ 1024
+
+
+ minoutbuf
+ 0
+
+
+ promisc
+ True
+
+
+ addr
+ 'GND'
+
+
+ ssid
+ 0
+
+
+
+ satnogs_coarse_doppler_correction_cc
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (744, 184)
+
+
+ _rotation
+ 0
+
+
+ id
+ satnogs_coarse_doppler_correction_cc_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ sampling_rate
+ audio_samp_rate
+
+
+ target_freq
+ rx_freq
+
+
+
+ satnogs_frame_file_sink
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (936, 684)
+
+
+ _rotation
+ 180
+
+
+ id
+ satnogs_frame_file_sink_0_1_0
+
+
+ output_type
+ 0
+
+
+ prefix_name
+ decoded_data_file_path
+
+
+
+ satnogs_iq_sink
+
+ append
+ False
+
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ filename
+ iq_file_path
+
+
+ _coordinate
+ (1272, 44)
+
+
+ _rotation
+ 0
+
+
+ id
+ satnogs_iq_sink_0
+
+
+ scale
+ 16768
+
+
+ status
+ enable_iq_dump
+
+
+
+ satnogs_ogg_encoder
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ filename
+ file_path
+
+
+ _coordinate
+ (1384, 300)
+
+
+ _rotation
+ 0
+
+
+ id
+ satnogs_ogg_encoder_0
+
+
+ quality
+ 1.0
+
+
+ samp_rate
+ audio_samp_rate
+
+
+
+ satnogs_quad_demod_filter_ff
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (1664, 580)
+
+
+ _rotation
+ 180
+
+
+ gain
+ 1.2
+
+
+ id
+ satnogs_quad_demod_filter_ff_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ win
+ 80
+
+
+
+ satnogs_tcp_rigctl_msg_source
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (216, 148)
+
+
+ _rotation
+ 0
+
+
+ id
+ satnogs_tcp_rigctl_msg_source_0
+
+
+ addr
+ "127.0.0.1"
+
+
+ mtu
+ 1500
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ mode
+ False
+
+
+ port
+ rigctl_port
+
+
+ interval
+ 1000
+
+
+
+ satnogs_udp_msg_sink
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (936, 596)
+
+
+ _rotation
+ 180
+
+
+ id
+ satnogs_udp_msg_sink_0_0
+
+
+ addr
+ udp_IP
+
+
+ mtu
+ 1500
+
+
+ port
+ udp_port
+
+
+
+ satnogs_waterfall_sink
+
+ alias
+
+
+
+ center_freq
+ 0.0
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ fft_size
+ 1024
+
+
+ filename
+ waterfall_file_path
+
+
+ _coordinate
+ (1024, 20)
+
+
+ _rotation
+ 180
+
+
+ id
+ satnogs_waterfall_sink_0
+
+
+ mode
+ 1
+
+
+ pps
+ 10
+
+
+ samp_rate
+ audio_samp_rate
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (664, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ udp_IP
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ 127.0.0.1
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (568, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ udp_port
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ intx
+
+
+ value
+ 16887
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (40, 716)
+
+
+ _rotation
+ 0
+
+
+ id
+ waterfall_file_path
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ /tmp/waterfall.dat
+
+
+
+ analog_quadrature_demod_cf_0_0
+ dc_blocker_xx_0
+ 0
+ 0
+
+
+ analog_quadrature_demod_cf_0_0_0
+ dc_blocker_xx_0_0
+ 0
+ 0
+
+
+ dc_blocker_xx_0
+ digital_clock_recovery_mm_xx_0
+ 0
+ 0
+
+
+ dc_blocker_xx_0_0
+ satnogs_ogg_encoder_0
+ 0
+ 0
+
+
+ digital_binary_slicer_fb_0
+ satnogs_ax25_decoder_bm_0
+ 0
+ 0
+
+
+ digital_binary_slicer_fb_0
+ satnogs_ax25_decoder_bm_0_0
+ 0
+ 0
+
+
+ digital_clock_recovery_mm_xx_0
+ satnogs_quad_demod_filter_ff_0
+ 0
+ 0
+
+
+ osmosdr_source_0
+ pfb_arb_resampler_xxx_0
+ 0
+ 0
+
+
+ pfb_arb_resampler_xxx_0
+ satnogs_coarse_doppler_correction_cc_0
+ 0
+ 0
+
+
+ pfb_arb_resampler_xxx_0_0
+ analog_quadrature_demod_cf_0_0
+ 0
+ 0
+
+
+ pfb_arb_resampler_xxx_0_0
+ satnogs_iq_sink_0
+ 0
+ 0
+
+
+ pfb_arb_resampler_xxx_0_0
+ satnogs_waterfall_sink_0
+ 0
+ 0
+
+
+ satnogs_ax25_decoder_bm_0
+ satnogs_frame_file_sink_0_1_0
+ pdu
+ frame
+
+
+ satnogs_ax25_decoder_bm_0
+ satnogs_udp_msg_sink_0_0
+ pdu
+ in
+
+
+ satnogs_ax25_decoder_bm_0_0
+ satnogs_frame_file_sink_0_1_0
+ pdu
+ frame
+
+
+ satnogs_ax25_decoder_bm_0_0
+ satnogs_udp_msg_sink_0_0
+ pdu
+ in
+
+
+ satnogs_coarse_doppler_correction_cc_0
+ analog_quadrature_demod_cf_0_0_0
+ 0
+ 0
+
+
+ satnogs_coarse_doppler_correction_cc_0
+ pfb_arb_resampler_xxx_0_0
+ 0
+ 0
+
+
+ satnogs_quad_demod_filter_ff_0
+ digital_binary_slicer_fb_0
+ 0
+ 0
+
+
+ satnogs_tcp_rigctl_msg_source_0
+ satnogs_coarse_doppler_correction_cc_0
+ freq
+ freq
+
+
diff --git a/apps/flowgraphs/fsk_ax25.py b/apps/flowgraphs/fsk_ax25.py
new file mode 100755
index 0000000..460ea6c
--- /dev/null
+++ b/apps/flowgraphs/fsk_ax25.py
@@ -0,0 +1,350 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+##################################################
+# GNU Radio Python Flow Graph
+# Title: fsk_ax25
+# Author: Manolis Surligas (surligas@gmail.com)
+# Description: Generic FSK AX.25 decoder
+# Generated: Thu Aug 9 21:26:11 2018
+##################################################
+
+from gnuradio import analog
+from gnuradio import digital
+from gnuradio import eng_notation
+from gnuradio import filter
+from gnuradio import gr
+from gnuradio.eng_option import eng_option
+from gnuradio.filter import firdes
+from gnuradio.filter import pfb
+from optparse import OptionParser
+import math
+import osmosdr
+import satnogs
+import time
+
+
+class fsk_ax25(gr.top_block):
+
+ def __init__(self, antenna=satnogs.not_set_antenna, baudrate=9600.0, bb_gain=satnogs.not_set_rx_bb_gain, dev_args=satnogs.not_set_dev_args, doppler_correction_per_sec=1000, enable_iq_dump=0, file_path='test.wav', if_gain=satnogs.not_set_rx_if_gain, iq_file_path='/tmp/iq.dat', lo_offset=100e3, ppm=0, rf_gain=satnogs.not_set_rx_rf_gain, rigctl_port=4532, rx_freq=100e6, rx_sdr_device='usrpb200', samp_rate_rx=satnogs.not_set_samp_rate_rx, udp_IP='127.0.0.1', udp_port=16887, waterfall_file_path='/tmp/waterfall.dat'):
+ gr.top_block.__init__(self, "fsk_ax25")
+
+ ##################################################
+ # Parameters
+ ##################################################
+ self.antenna = antenna
+ self.baudrate = baudrate
+ self.bb_gain = bb_gain
+ self.dev_args = dev_args
+ self.doppler_correction_per_sec = doppler_correction_per_sec
+ self.enable_iq_dump = enable_iq_dump
+ self.file_path = file_path
+ self.if_gain = if_gain
+ self.iq_file_path = iq_file_path
+ self.lo_offset = lo_offset
+ self.ppm = ppm
+ self.rf_gain = rf_gain
+ self.rigctl_port = rigctl_port
+ self.rx_freq = rx_freq
+ self.rx_sdr_device = rx_sdr_device
+ self.samp_rate_rx = samp_rate_rx
+ self.udp_IP = udp_IP
+ self.udp_port = udp_port
+ self.waterfall_file_path = waterfall_file_path
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.audio_samp_rate = audio_samp_rate = 48000
+
+ ##################################################
+ # Blocks
+ ##################################################
+ self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink(audio_samp_rate, 0.0, 10, 1024, waterfall_file_path, 1)
+ self.satnogs_udp_msg_sink_0_0 = satnogs.udp_msg_sink(udp_IP, udp_port, 1500)
+ self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source("127.0.0.1", rigctl_port, False, 1000, 1500)
+ self.satnogs_quad_demod_filter_ff_0 = satnogs.quad_demod_filter_ff(1.2)
+ self.satnogs_ogg_encoder_0 = satnogs.ogg_encoder(file_path, audio_samp_rate, 1.0)
+ self.satnogs_iq_sink_0 = satnogs.iq_sink(16768, iq_file_path, False, enable_iq_dump)
+ self.satnogs_frame_file_sink_0_1_0 = satnogs.frame_file_sink('decoded_data_file_path', 0)
+ self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, audio_samp_rate)
+ self.satnogs_ax25_decoder_bm_0_0 = satnogs.ax25_decoder_bm('GND', 0, True, False, 1024)
+ self.satnogs_ax25_decoder_bm_0 = satnogs.ax25_decoder_bm('GND', 0, True, True, 1024)
+ self.pfb_arb_resampler_xxx_0_0 = pfb.arb_resampler_ccf(
+ (2.0*baudrate)/audio_samp_rate,
+ taps=None,
+ flt_size=32)
+ self.pfb_arb_resampler_xxx_0_0.declare_sample_delay(0)
+
+ self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf(
+ audio_samp_rate/satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx),
+ taps=None,
+ flt_size=32)
+ self.pfb_arb_resampler_xxx_0.declare_sample_delay(0)
+
+ self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + satnogs.handle_rx_dev_args(rx_sdr_device, dev_args) )
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx))
+ self.osmosdr_source_0.set_center_freq(rx_freq - lo_offset, 0)
+ self.osmosdr_source_0.set_freq_corr(ppm, 0)
+ self.osmosdr_source_0.set_dc_offset_mode(2, 0)
+ self.osmosdr_source_0.set_iq_balance_mode(0, 0)
+ self.osmosdr_source_0.set_gain_mode(False, 0)
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(rx_sdr_device, rf_gain), 0)
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(rx_sdr_device, if_gain), 0)
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(rx_sdr_device, bb_gain), 0)
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(rx_sdr_device, antenna), 0)
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx), 0)
+
+ self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_ff(2, 0.25*0.175*0.175, 0.5, 0.175, 0.005)
+ self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb()
+ self.dc_blocker_xx_0_0 = filter.dc_blocker_ff(1024, True)
+ self.dc_blocker_xx_0 = filter.dc_blocker_ff(1024, True)
+ self.analog_quadrature_demod_cf_0_0_0 = analog.quadrature_demod_cf(0.9)
+ self.analog_quadrature_demod_cf_0_0 = analog.quadrature_demod_cf(1.2)
+
+
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0, 'pdu'), (self.satnogs_frame_file_sink_0_1_0, 'frame'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0, 'pdu'), (self.satnogs_udp_msg_sink_0_0, 'in'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0_0, 'pdu'), (self.satnogs_frame_file_sink_0_1_0, 'frame'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0_0, 'pdu'), (self.satnogs_udp_msg_sink_0_0, 'in'))
+ self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_coarse_doppler_correction_cc_0, 'freq'))
+ self.connect((self.analog_quadrature_demod_cf_0_0, 0), (self.dc_blocker_xx_0, 0))
+ self.connect((self.analog_quadrature_demod_cf_0_0_0, 0), (self.dc_blocker_xx_0_0, 0))
+ self.connect((self.dc_blocker_xx_0, 0), (self.digital_clock_recovery_mm_xx_0, 0))
+ self.connect((self.dc_blocker_xx_0_0, 0), (self.satnogs_ogg_encoder_0, 0))
+ self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_ax25_decoder_bm_0, 0))
+ self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_ax25_decoder_bm_0_0, 0))
+ self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.satnogs_quad_demod_filter_ff_0, 0))
+ self.connect((self.osmosdr_source_0, 0), (self.pfb_arb_resampler_xxx_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.analog_quadrature_demod_cf_0_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.satnogs_iq_sink_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.satnogs_waterfall_sink_0, 0))
+ self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.analog_quadrature_demod_cf_0_0_0, 0))
+ self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.pfb_arb_resampler_xxx_0_0, 0))
+ self.connect((self.satnogs_quad_demod_filter_ff_0, 0), (self.digital_binary_slicer_fb_0, 0))
+
+ def get_antenna(self):
+ return self.antenna
+
+ def set_antenna(self, antenna):
+ self.antenna = antenna
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(self.rx_sdr_device, self.antenna), 0)
+
+ def get_baudrate(self):
+ return self.baudrate
+
+ def set_baudrate(self, baudrate):
+ self.baudrate = baudrate
+ self.pfb_arb_resampler_xxx_0_0.set_rate((2.0*self.baudrate)/self.audio_samp_rate)
+
+ def get_bb_gain(self):
+ return self.bb_gain
+
+ def set_bb_gain(self, bb_gain):
+ self.bb_gain = bb_gain
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0)
+
+ def get_dev_args(self):
+ return self.dev_args
+
+ def set_dev_args(self, dev_args):
+ self.dev_args = dev_args
+
+ def get_doppler_correction_per_sec(self):
+ return self.doppler_correction_per_sec
+
+ def set_doppler_correction_per_sec(self, doppler_correction_per_sec):
+ self.doppler_correction_per_sec = doppler_correction_per_sec
+
+ def get_enable_iq_dump(self):
+ return self.enable_iq_dump
+
+ def set_enable_iq_dump(self, enable_iq_dump):
+ self.enable_iq_dump = enable_iq_dump
+
+ def get_file_path(self):
+ return self.file_path
+
+ def set_file_path(self, file_path):
+ self.file_path = file_path
+
+ def get_if_gain(self):
+ return self.if_gain
+
+ def set_if_gain(self, if_gain):
+ self.if_gain = if_gain
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(self.rx_sdr_device, self.if_gain), 0)
+
+ def get_iq_file_path(self):
+ return self.iq_file_path
+
+ def set_iq_file_path(self, iq_file_path):
+ self.iq_file_path = iq_file_path
+
+ def get_lo_offset(self):
+ return self.lo_offset
+
+ def set_lo_offset(self, lo_offset):
+ self.lo_offset = lo_offset
+ self.osmosdr_source_0.set_center_freq(self.rx_freq - self.lo_offset, 0)
+
+ def get_ppm(self):
+ return self.ppm
+
+ def set_ppm(self, ppm):
+ self.ppm = ppm
+ self.osmosdr_source_0.set_freq_corr(self.ppm, 0)
+
+ def get_rf_gain(self):
+ return self.rf_gain
+
+ def set_rf_gain(self, rf_gain):
+ self.rf_gain = rf_gain
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(self.rx_sdr_device, self.rf_gain), 0)
+
+ def get_rigctl_port(self):
+ return self.rigctl_port
+
+ def set_rigctl_port(self, rigctl_port):
+ self.rigctl_port = rigctl_port
+
+ def get_rx_freq(self):
+ return self.rx_freq
+
+ def set_rx_freq(self, rx_freq):
+ self.rx_freq = rx_freq
+ self.satnogs_coarse_doppler_correction_cc_0.set_new_freq_locked(self.rx_freq)
+ self.osmosdr_source_0.set_center_freq(self.rx_freq - self.lo_offset, 0)
+
+ def get_rx_sdr_device(self):
+ return self.rx_sdr_device
+
+ def set_rx_sdr_device(self, rx_sdr_device):
+ self.rx_sdr_device = rx_sdr_device
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(self.rx_sdr_device, self.rf_gain), 0)
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(self.rx_sdr_device, self.if_gain), 0)
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0)
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(self.rx_sdr_device, self.antenna), 0)
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx), 0)
+
+ def get_samp_rate_rx(self):
+ return self.samp_rate_rx
+
+ def set_samp_rate_rx(self, samp_rate_rx):
+ self.samp_rate_rx = samp_rate_rx
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx), 0)
+
+ def get_udp_IP(self):
+ return self.udp_IP
+
+ def set_udp_IP(self, udp_IP):
+ self.udp_IP = udp_IP
+
+ def get_udp_port(self):
+ return self.udp_port
+
+ def set_udp_port(self, udp_port):
+ self.udp_port = udp_port
+
+ def get_waterfall_file_path(self):
+ return self.waterfall_file_path
+
+ def set_waterfall_file_path(self, waterfall_file_path):
+ self.waterfall_file_path = waterfall_file_path
+
+ def get_audio_samp_rate(self):
+ return self.audio_samp_rate
+
+ def set_audio_samp_rate(self, audio_samp_rate):
+ self.audio_samp_rate = audio_samp_rate
+ self.pfb_arb_resampler_xxx_0_0.set_rate((2.0*self.baudrate)/self.audio_samp_rate)
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+
+
+def argument_parser():
+ description = 'Generic FSK AX.25 decoder'
+ parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description)
+ parser.add_option(
+ "", "--antenna", dest="antenna", type="string", default=satnogs.not_set_antenna,
+ help="Set antenna [default=%default]")
+ parser.add_option(
+ "", "--baudrate", dest="baudrate", type="eng_float", default=eng_notation.num_to_str(9600.0),
+ help="Set baudrate [default=%default]")
+ parser.add_option(
+ "", "--bb-gain", dest="bb_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_bb_gain),
+ help="Set bb_gain [default=%default]")
+ parser.add_option(
+ "", "--dev-args", dest="dev_args", type="string", default=satnogs.not_set_dev_args,
+ help="Set dev_args [default=%default]")
+ parser.add_option(
+ "", "--doppler-correction-per-sec", dest="doppler_correction_per_sec", type="intx", default=1000,
+ help="Set doppler_correction_per_sec [default=%default]")
+ parser.add_option(
+ "", "--enable-iq-dump", dest="enable_iq_dump", type="intx", default=0,
+ help="Set enable_iq_dump [default=%default]")
+ parser.add_option(
+ "", "--file-path", dest="file_path", type="string", default='test.wav',
+ help="Set file_path [default=%default]")
+ parser.add_option(
+ "", "--if-gain", dest="if_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_if_gain),
+ help="Set if_gain [default=%default]")
+ parser.add_option(
+ "", "--iq-file-path", dest="iq_file_path", type="string", default='/tmp/iq.dat',
+ help="Set iq_file_path [default=%default]")
+ parser.add_option(
+ "", "--lo-offset", dest="lo_offset", type="eng_float", default=eng_notation.num_to_str(100e3),
+ help="Set lo_offset [default=%default]")
+ parser.add_option(
+ "", "--ppm", dest="ppm", type="intx", default=0,
+ help="Set ppm [default=%default]")
+ parser.add_option(
+ "", "--rf-gain", dest="rf_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_rf_gain),
+ help="Set rf_gain [default=%default]")
+ parser.add_option(
+ "", "--rigctl-port", dest="rigctl_port", type="intx", default=4532,
+ help="Set rigctl_port [default=%default]")
+ parser.add_option(
+ "", "--rx-freq", dest="rx_freq", type="eng_float", default=eng_notation.num_to_str(100e6),
+ help="Set rx_freq [default=%default]")
+ parser.add_option(
+ "", "--rx-sdr-device", dest="rx_sdr_device", type="string", default='usrpb200',
+ help="Set rx_sdr_device [default=%default]")
+ parser.add_option(
+ "", "--samp-rate-rx", dest="samp_rate_rx", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_samp_rate_rx),
+ help="Set samp_rate_rx [default=%default]")
+ parser.add_option(
+ "", "--udp-IP", dest="udp_IP", type="string", default='127.0.0.1',
+ help="Set udp_IP [default=%default]")
+ parser.add_option(
+ "", "--udp-port", dest="udp_port", type="intx", default=16887,
+ help="Set udp_port [default=%default]")
+ parser.add_option(
+ "", "--waterfall-file-path", dest="waterfall_file_path", type="string", default='/tmp/waterfall.dat',
+ help="Set waterfall_file_path [default=%default]")
+ return parser
+
+
+def main(top_block_cls=fsk_ax25, options=None):
+ if options is None:
+ options, _ = argument_parser().parse_args()
+
+ tb = top_block_cls(antenna=options.antenna, baudrate=options.baudrate, bb_gain=options.bb_gain, dev_args=options.dev_args, doppler_correction_per_sec=options.doppler_correction_per_sec, enable_iq_dump=options.enable_iq_dump, file_path=options.file_path, if_gain=options.if_gain, iq_file_path=options.iq_file_path, lo_offset=options.lo_offset, ppm=options.ppm, rf_gain=options.rf_gain, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device, samp_rate_rx=options.samp_rate_rx, udp_IP=options.udp_IP, udp_port=options.udp_port, waterfall_file_path=options.waterfall_file_path)
+ tb.start()
+ try:
+ raw_input('Press Enter to quit: ')
+ except EOFError:
+ pass
+ tb.stop()
+ tb.wait()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/apps/flowgraphs/msk_ax25.grc b/apps/flowgraphs/msk_ax25.grc
new file mode 100644
index 0000000..ab0ee61
--- /dev/null
+++ b/apps/flowgraphs/msk_ax25.grc
@@ -0,0 +1,3454 @@
+
+
+
+ Thu Aug 9 19:37:02 2018
+
+ options
+
+ author
+ Manolis Surligas (surligas@gmail.com)
+
+
+ window_size
+ 2*1080,1080
+
+
+ category
+ [GRC Hier Blocks]
+
+
+ comment
+
+
+
+ description
+ Generic MSK AX.25 decoder
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (8, 20)
+
+
+ _rotation
+ 0
+
+
+ generate_options
+ no_gui
+
+
+ hier_block_src_path
+ .:
+
+
+ id
+ satnogs_msk_ax25
+
+
+ max_nouts
+ 0
+
+
+ qt_qss_theme
+
+
+
+ realtime_scheduling
+
+
+
+ run_command
+ {python} -u {filename}
+
+
+ run_options
+ run
+
+
+ run
+ True
+
+
+ sizing_mode
+ fixed
+
+
+ thread_safe_setters
+
+
+
+ title
+ satnogs_msk_ax25
+
+
+ placement
+ (0,0)
+
+
+
+ variable
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (664, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ audio_samp_rate
+
+
+ value
+ 48000
+
+
+
+ analog_quadrature_demod_cf
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (1248, 196)
+
+
+ _rotation
+ 0
+
+
+ gain
+ 1.2
+
+
+ id
+ analog_quadrature_demod_cf_0_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+
+ analog_quadrature_demod_cf
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (992, 316)
+
+
+ _rotation
+ 0
+
+
+ gain
+ 0.9
+
+
+ id
+ analog_quadrature_demod_cf_0_0_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (280, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ antenna
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ satnogs.not_set_antenna
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+ SDR RX sampling rate
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (584, 724)
+
+
+ _rotation
+ 0
+
+
+ id
+ baudrate
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ 9600.0
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (200, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ bb_gain
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ satnogs.not_set_rx_bb_gain
+
+
+
+ dc_blocker_xx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (1432, 188)
+
+
+ _rotation
+ 0
+
+
+ id
+ dc_blocker_xx_0
+
+
+ length
+ 1024
+
+
+ long_form
+ True
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ type
+ ff
+
+
+
+ dc_blocker_xx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (1208, 308)
+
+
+ _rotation
+ 0
+
+
+ id
+ dc_blocker_xx_0_0
+
+
+ length
+ 1024
+
+
+ long_form
+ True
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ type
+ ff
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (480, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ dev_args
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ satnogs.not_set_dev_args
+
+
+
+ digital_binary_slicer_fb
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (1512, 592)
+
+
+ _rotation
+ 180
+
+
+ id
+ digital_binary_slicer_fb_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+
+ digital_clock_recovery_mm_xx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (1616, 164)
+
+
+ _rotation
+ 0
+
+
+ gain_mu
+ 0.175
+
+
+ gain_omega
+ 0.25*0.175*0.175
+
+
+ id
+ digital_clock_recovery_mm_xx_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ mu
+ 0.5
+
+
+ omega_relative_limit
+ 0.005
+
+
+ omega
+ 2
+
+
+ type
+ float
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (40, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ doppler_correction_per_sec
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ intx
+
+
+ value
+ 1000
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (360, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ enable_iq_dump
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ intx
+
+
+ value
+ 0
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (176, 716)
+
+
+ _rotation
+ 180
+
+
+ id
+ file_path
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ test.wav
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (120, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ if_gain
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ satnogs.not_set_rx_if_gain
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (472, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ iq_file_path
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ /tmp/iq.dat
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+ To avoid the SDR carrier at the DC
+we shift the LO a little further
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (272, 716)
+
+
+ _rotation
+ 0
+
+
+ id
+ lo_offset
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ 100e3
+
+
+
+ osmosdr_source
+
+ alias
+
+
+
+ ant0
+ satnogs.handle_rx_antenna(rx_sdr_device, antenna)
+
+
+ bb_gain0
+ satnogs.handle_rx_bb_gain(rx_sdr_device, bb_gain)
+
+
+ bw0
+ satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx)
+
+
+ dc_offset_mode0
+ 2
+
+
+ corr0
+ ppm
+
+
+ freq0
+ rx_freq - lo_offset
+
+
+ gain_mode0
+ False
+
+
+ if_gain0
+ satnogs.handle_rx_if_gain(rx_sdr_device, if_gain)
+
+
+ iq_balance_mode0
+ 0
+
+
+ gain0
+ satnogs.handle_rx_rf_gain(rx_sdr_device, rf_gain)
+
+
+ ant10
+
+
+
+ bb_gain10
+ 20
+
+
+ bw10
+ 0
+
+
+ dc_offset_mode10
+ 0
+
+
+ corr10
+ 0
+
+
+ freq10
+ 100e6
+
+
+ gain_mode10
+ False
+
+
+ if_gain10
+ 20
+
+
+ iq_balance_mode10
+ 0
+
+
+ gain10
+ 10
+
+
+ ant11
+
+
+
+ bb_gain11
+ 20
+
+
+ bw11
+ 0
+
+
+ dc_offset_mode11
+ 0
+
+
+ corr11
+ 0
+
+
+ freq11
+ 100e6
+
+
+ gain_mode11
+ False
+
+
+ if_gain11
+ 20
+
+
+ iq_balance_mode11
+ 0
+
+
+ gain11
+ 10
+
+
+ ant12
+
+
+
+ bb_gain12
+ 20
+
+
+ bw12
+ 0
+
+
+ dc_offset_mode12
+ 0
+
+
+ corr12
+ 0
+
+
+ freq12
+ 100e6
+
+
+ gain_mode12
+ False
+
+
+ if_gain12
+ 20
+
+
+ iq_balance_mode12
+ 0
+
+
+ gain12
+ 10
+
+
+ ant13
+
+
+
+ bb_gain13
+ 20
+
+
+ bw13
+ 0
+
+
+ dc_offset_mode13
+ 0
+
+
+ corr13
+ 0
+
+
+ freq13
+ 100e6
+
+
+ gain_mode13
+ False
+
+
+ if_gain13
+ 20
+
+
+ iq_balance_mode13
+ 0
+
+
+ gain13
+ 10
+
+
+ ant14
+
+
+
+ bb_gain14
+ 20
+
+
+ bw14
+ 0
+
+
+ dc_offset_mode14
+ 0
+
+
+ corr14
+ 0
+
+
+ freq14
+ 100e6
+
+
+ gain_mode14
+ False
+
+
+ if_gain14
+ 20
+
+
+ iq_balance_mode14
+ 0
+
+
+ gain14
+ 10
+
+
+ ant15
+
+
+
+ bb_gain15
+ 20
+
+
+ bw15
+ 0
+
+
+ dc_offset_mode15
+ 0
+
+
+ corr15
+ 0
+
+
+ freq15
+ 100e6
+
+
+ gain_mode15
+ False
+
+
+ if_gain15
+ 20
+
+
+ iq_balance_mode15
+ 0
+
+
+ gain15
+ 10
+
+
+ ant16
+
+
+
+ bb_gain16
+ 20
+
+
+ bw16
+ 0
+
+
+ dc_offset_mode16
+ 0
+
+
+ corr16
+ 0
+
+
+ freq16
+ 100e6
+
+
+ gain_mode16
+ False
+
+
+ if_gain16
+ 20
+
+
+ iq_balance_mode16
+ 0
+
+
+ gain16
+ 10
+
+
+ ant17
+
+
+
+ bb_gain17
+ 20
+
+
+ bw17
+ 0
+
+
+ dc_offset_mode17
+ 0
+
+
+ corr17
+ 0
+
+
+ freq17
+ 100e6
+
+
+ gain_mode17
+ False
+
+
+ if_gain17
+ 20
+
+
+ iq_balance_mode17
+ 0
+
+
+ gain17
+ 10
+
+
+ ant18
+
+
+
+ bb_gain18
+ 20
+
+
+ bw18
+ 0
+
+
+ dc_offset_mode18
+ 0
+
+
+ corr18
+ 0
+
+
+ freq18
+ 100e6
+
+
+ gain_mode18
+ False
+
+
+ if_gain18
+ 20
+
+
+ iq_balance_mode18
+ 0
+
+
+ gain18
+ 10
+
+
+ ant19
+
+
+
+ bb_gain19
+ 20
+
+
+ bw19
+ 0
+
+
+ dc_offset_mode19
+ 0
+
+
+ corr19
+ 0
+
+
+ freq19
+ 100e6
+
+
+ gain_mode19
+ False
+
+
+ if_gain19
+ 20
+
+
+ iq_balance_mode19
+ 0
+
+
+ gain19
+ 10
+
+
+ ant1
+
+
+
+ bb_gain1
+ 20
+
+
+ bw1
+ 0
+
+
+ dc_offset_mode1
+ 0
+
+
+ corr1
+ 0
+
+
+ freq1
+ 100e6
+
+
+ gain_mode1
+ False
+
+
+ if_gain1
+ 20
+
+
+ iq_balance_mode1
+ 0
+
+
+ gain1
+ 10
+
+
+ ant20
+
+
+
+ bb_gain20
+ 20
+
+
+ bw20
+ 0
+
+
+ dc_offset_mode20
+ 0
+
+
+ corr20
+ 0
+
+
+ freq20
+ 100e6
+
+
+ gain_mode20
+ False
+
+
+ if_gain20
+ 20
+
+
+ iq_balance_mode20
+ 0
+
+
+ gain20
+ 10
+
+
+ ant21
+
+
+
+ bb_gain21
+ 20
+
+
+ bw21
+ 0
+
+
+ dc_offset_mode21
+ 0
+
+
+ corr21
+ 0
+
+
+ freq21
+ 100e6
+
+
+ gain_mode21
+ False
+
+
+ if_gain21
+ 20
+
+
+ iq_balance_mode21
+ 0
+
+
+ gain21
+ 10
+
+
+ ant22
+
+
+
+ bb_gain22
+ 20
+
+
+ bw22
+ 0
+
+
+ dc_offset_mode22
+ 0
+
+
+ corr22
+ 0
+
+
+ freq22
+ 100e6
+
+
+ gain_mode22
+ False
+
+
+ if_gain22
+ 20
+
+
+ iq_balance_mode22
+ 0
+
+
+ gain22
+ 10
+
+
+ ant23
+
+
+
+ bb_gain23
+ 20
+
+
+ bw23
+ 0
+
+
+ dc_offset_mode23
+ 0
+
+
+ corr23
+ 0
+
+
+ freq23
+ 100e6
+
+
+ gain_mode23
+ False
+
+
+ if_gain23
+ 20
+
+
+ iq_balance_mode23
+ 0
+
+
+ gain23
+ 10
+
+
+ ant24
+
+
+
+ bb_gain24
+ 20
+
+
+ bw24
+ 0
+
+
+ dc_offset_mode24
+ 0
+
+
+ corr24
+ 0
+
+
+ freq24
+ 100e6
+
+
+ gain_mode24
+ False
+
+
+ if_gain24
+ 20
+
+
+ iq_balance_mode24
+ 0
+
+
+ gain24
+ 10
+
+
+ ant25
+
+
+
+ bb_gain25
+ 20
+
+
+ bw25
+ 0
+
+
+ dc_offset_mode25
+ 0
+
+
+ corr25
+ 0
+
+
+ freq25
+ 100e6
+
+
+ gain_mode25
+ False
+
+
+ if_gain25
+ 20
+
+
+ iq_balance_mode25
+ 0
+
+
+ gain25
+ 10
+
+
+ ant26
+
+
+
+ bb_gain26
+ 20
+
+
+ bw26
+ 0
+
+
+ dc_offset_mode26
+ 0
+
+
+ corr26
+ 0
+
+
+ freq26
+ 100e6
+
+
+ gain_mode26
+ False
+
+
+ if_gain26
+ 20
+
+
+ iq_balance_mode26
+ 0
+
+
+ gain26
+ 10
+
+
+ ant27
+
+
+
+ bb_gain27
+ 20
+
+
+ bw27
+ 0
+
+
+ dc_offset_mode27
+ 0
+
+
+ corr27
+ 0
+
+
+ freq27
+ 100e6
+
+
+ gain_mode27
+ False
+
+
+ if_gain27
+ 20
+
+
+ iq_balance_mode27
+ 0
+
+
+ gain27
+ 10
+
+
+ ant28
+
+
+
+ bb_gain28
+ 20
+
+
+ bw28
+ 0
+
+
+ dc_offset_mode28
+ 0
+
+
+ corr28
+ 0
+
+
+ freq28
+ 100e6
+
+
+ gain_mode28
+ False
+
+
+ if_gain28
+ 20
+
+
+ iq_balance_mode28
+ 0
+
+
+ gain28
+ 10
+
+
+ ant29
+
+
+
+ bb_gain29
+ 20
+
+
+ bw29
+ 0
+
+
+ dc_offset_mode29
+ 0
+
+
+ corr29
+ 0
+
+
+ freq29
+ 100e6
+
+
+ gain_mode29
+ False
+
+
+ if_gain29
+ 20
+
+
+ iq_balance_mode29
+ 0
+
+
+ gain29
+ 10
+
+
+ ant2
+
+
+
+ bb_gain2
+ 20
+
+
+ bw2
+ 0
+
+
+ dc_offset_mode2
+ 0
+
+
+ corr2
+ 0
+
+
+ freq2
+ 100e6
+
+
+ gain_mode2
+ False
+
+
+ if_gain2
+ 20
+
+
+ iq_balance_mode2
+ 0
+
+
+ gain2
+ 10
+
+
+ ant30
+
+
+
+ bb_gain30
+ 20
+
+
+ bw30
+ 0
+
+
+ dc_offset_mode30
+ 0
+
+
+ corr30
+ 0
+
+
+ freq30
+ 100e6
+
+
+ gain_mode30
+ False
+
+
+ if_gain30
+ 20
+
+
+ iq_balance_mode30
+ 0
+
+
+ gain30
+ 10
+
+
+ ant31
+
+
+
+ bb_gain31
+ 20
+
+
+ bw31
+ 0
+
+
+ dc_offset_mode31
+ 0
+
+
+ corr31
+ 0
+
+
+ freq31
+ 100e6
+
+
+ gain_mode31
+ False
+
+
+ if_gain31
+ 20
+
+
+ iq_balance_mode31
+ 0
+
+
+ gain31
+ 10
+
+
+ ant3
+
+
+
+ bb_gain3
+ 20
+
+
+ bw3
+ 0
+
+
+ dc_offset_mode3
+ 0
+
+
+ corr3
+ 0
+
+
+ freq3
+ 100e6
+
+
+ gain_mode3
+ False
+
+
+ if_gain3
+ 20
+
+
+ iq_balance_mode3
+ 0
+
+
+ gain3
+ 10
+
+
+ ant4
+
+
+
+ bb_gain4
+ 20
+
+
+ bw4
+ 0
+
+
+ dc_offset_mode4
+ 0
+
+
+ corr4
+ 0
+
+
+ freq4
+ 100e6
+
+
+ gain_mode4
+ False
+
+
+ if_gain4
+ 20
+
+
+ iq_balance_mode4
+ 0
+
+
+ gain4
+ 10
+
+
+ ant5
+
+
+
+ bb_gain5
+ 20
+
+
+ bw5
+ 0
+
+
+ dc_offset_mode5
+ 0
+
+
+ corr5
+ 0
+
+
+ freq5
+ 100e6
+
+
+ gain_mode5
+ False
+
+
+ if_gain5
+ 20
+
+
+ iq_balance_mode5
+ 0
+
+
+ gain5
+ 10
+
+
+ ant6
+
+
+
+ bb_gain6
+ 20
+
+
+ bw6
+ 0
+
+
+ dc_offset_mode6
+ 0
+
+
+ corr6
+ 0
+
+
+ freq6
+ 100e6
+
+
+ gain_mode6
+ False
+
+
+ if_gain6
+ 20
+
+
+ iq_balance_mode6
+ 0
+
+
+ gain6
+ 10
+
+
+ ant7
+
+
+
+ bb_gain7
+ 20
+
+
+ bw7
+ 0
+
+
+ dc_offset_mode7
+ 0
+
+
+ corr7
+ 0
+
+
+ freq7
+ 100e6
+
+
+ gain_mode7
+ False
+
+
+ if_gain7
+ 20
+
+
+ iq_balance_mode7
+ 0
+
+
+ gain7
+ 10
+
+
+ ant8
+
+
+
+ bb_gain8
+ 20
+
+
+ bw8
+ 0
+
+
+ dc_offset_mode8
+ 0
+
+
+ corr8
+ 0
+
+
+ freq8
+ 100e6
+
+
+ gain_mode8
+ False
+
+
+ if_gain8
+ 20
+
+
+ iq_balance_mode8
+ 0
+
+
+ gain8
+ 10
+
+
+ ant9
+
+
+
+ bb_gain9
+ 20
+
+
+ bw9
+ 0
+
+
+ dc_offset_mode9
+ 0
+
+
+ corr9
+ 0
+
+
+ freq9
+ 100e6
+
+
+ gain_mode9
+ False
+
+
+ if_gain9
+ 20
+
+
+ iq_balance_mode9
+ 0
+
+
+ gain9
+ 10
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ args
+ satnogs.handle_rx_dev_args(rx_sdr_device, dev_args)
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (216, 284)
+
+
+ _rotation
+ 0
+
+
+ id
+ osmosdr_source_0
+
+
+ maxoutbuf
+ 0
+
+
+ clock_source0
+
+
+
+ time_source0
+
+
+
+ clock_source1
+
+
+
+ time_source1
+
+
+
+ clock_source2
+
+
+
+ time_source2
+
+
+
+ clock_source3
+
+
+
+ time_source3
+
+
+
+ clock_source4
+
+
+
+ time_source4
+
+
+
+ clock_source5
+
+
+
+ time_source5
+
+
+
+ clock_source6
+
+
+
+ time_source6
+
+
+
+ clock_source7
+
+
+
+ time_source7
+
+
+
+ minoutbuf
+ 0
+
+
+ nchan
+ 1
+
+
+ num_mboards
+ 1
+
+
+ type
+ fc32
+
+
+ sample_rate
+ satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx)
+
+
+ sync
+
+
+
+
+ pfb_arb_resampler_xxx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (472, 348)
+
+
+ _rotation
+ 0
+
+
+ id
+ pfb_arb_resampler_xxx_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ nfilts
+ 32
+
+
+ rrate
+ audio_samp_rate/satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx)
+
+
+ samp_delay
+ 0
+
+
+ atten
+ 100
+
+
+ taps
+
+
+
+ type
+ ccf
+
+
+
+ pfb_arb_resampler_xxx
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (984, 172)
+
+
+ _rotation
+ 0
+
+
+ id
+ pfb_arb_resampler_xxx_0_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ nfilts
+ 32
+
+
+ rrate
+ (2.0*baudrate)/audio_samp_rate
+
+
+ samp_delay
+ 0
+
+
+ atten
+ 100
+
+
+ taps
+
+
+
+ type
+ ccf
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (584, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ ppm
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ intx
+
+
+ value
+ 0
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (40, 636)
+
+
+ _rotation
+ 0
+
+
+ id
+ rf_gain
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ satnogs.not_set_rx_rf_gain
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (392, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ rigctl_port
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ intx
+
+
+ value
+ 4532
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (312, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ rx_freq
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ 100e6
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (200, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ rx_sdr_device
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ usrpb200
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (472, 724)
+
+
+ _rotation
+ 0
+
+
+ id
+ samp_rate_rx
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ eng_float
+
+
+ value
+ satnogs.not_set_samp_rate_rx
+
+
+
+ satnogs_ax25_decoder_bm
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ descrambling
+ True
+
+
+ _coordinate
+ (1240, 492)
+
+
+ _rotation
+ 180
+
+
+ id
+ satnogs_ax25_decoder_bm_0
+
+
+ maxoutbuf
+ 0
+
+
+ max_frame_len
+ 1024
+
+
+ minoutbuf
+ 0
+
+
+ promisc
+ True
+
+
+ addr
+ 'GND'
+
+
+ ssid
+ 0
+
+
+
+ satnogs_ax25_decoder_bm
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ descrambling
+ False
+
+
+ _coordinate
+ (1240, 612)
+
+
+ _rotation
+ 180
+
+
+ id
+ satnogs_ax25_decoder_bm_0_0
+
+
+ maxoutbuf
+ 0
+
+
+ max_frame_len
+ 1024
+
+
+ minoutbuf
+ 0
+
+
+ promisc
+ True
+
+
+ addr
+ 'GND'
+
+
+ ssid
+ 0
+
+
+
+ satnogs_coarse_doppler_correction_cc
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (744, 184)
+
+
+ _rotation
+ 0
+
+
+ id
+ satnogs_coarse_doppler_correction_cc_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ sampling_rate
+ audio_samp_rate
+
+
+ target_freq
+ rx_freq
+
+
+
+ satnogs_frame_file_sink
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (936, 684)
+
+
+ _rotation
+ 180
+
+
+ id
+ satnogs_frame_file_sink_0_1_0
+
+
+ output_type
+ 0
+
+
+ prefix_name
+ decoded_data_file_path
+
+
+
+ satnogs_iq_sink
+
+ append
+ False
+
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ filename
+ iq_file_path
+
+
+ _coordinate
+ (1272, 44)
+
+
+ _rotation
+ 0
+
+
+ id
+ satnogs_iq_sink_0
+
+
+ scale
+ 16768
+
+
+ status
+ enable_iq_dump
+
+
+
+ satnogs_ogg_encoder
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ filename
+ file_path
+
+
+ _coordinate
+ (1384, 300)
+
+
+ _rotation
+ 0
+
+
+ id
+ satnogs_ogg_encoder_0
+
+
+ quality
+ 1.0
+
+
+ samp_rate
+ audio_samp_rate
+
+
+
+ satnogs_quad_demod_filter_ff
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (1664, 580)
+
+
+ _rotation
+ 180
+
+
+ gain
+ 1.2
+
+
+ id
+ satnogs_quad_demod_filter_ff_0
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ win
+ 80
+
+
+
+ satnogs_tcp_rigctl_msg_source
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (216, 148)
+
+
+ _rotation
+ 0
+
+
+ id
+ satnogs_tcp_rigctl_msg_source_0
+
+
+ addr
+ "127.0.0.1"
+
+
+ mtu
+ 1500
+
+
+ maxoutbuf
+ 0
+
+
+ minoutbuf
+ 0
+
+
+ mode
+ False
+
+
+ port
+ rigctl_port
+
+
+ interval
+ 1000
+
+
+
+ satnogs_udp_msg_sink
+
+ alias
+
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ 1
+
+
+ _coordinate
+ (936, 596)
+
+
+ _rotation
+ 180
+
+
+ id
+ satnogs_udp_msg_sink_0_0
+
+
+ addr
+ udp_IP
+
+
+ mtu
+ 1500
+
+
+ port
+ udp_port
+
+
+
+ satnogs_waterfall_sink
+
+ alias
+
+
+
+ center_freq
+ 0.0
+
+
+ comment
+
+
+
+ affinity
+
+
+
+ _enabled
+ True
+
+
+ fft_size
+ 1024
+
+
+ filename
+ waterfall_file_path
+
+
+ _coordinate
+ (1024, 20)
+
+
+ _rotation
+ 180
+
+
+ id
+ satnogs_waterfall_sink_0
+
+
+ mode
+ 1
+
+
+ pps
+ 10
+
+
+ samp_rate
+ audio_samp_rate
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (664, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ udp_IP
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ 127.0.0.1
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (568, 556)
+
+
+ _rotation
+ 0
+
+
+ id
+ udp_port
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ intx
+
+
+ value
+ 16887
+
+
+
+ parameter
+
+ alias
+
+
+
+ comment
+
+
+
+ _enabled
+ True
+
+
+ _coordinate
+ (40, 716)
+
+
+ _rotation
+ 0
+
+
+ id
+ waterfall_file_path
+
+
+ label
+
+
+
+ short_id
+
+
+
+ hide
+ none
+
+
+ type
+ string
+
+
+ value
+ /tmp/waterfall.dat
+
+
+
+ analog_quadrature_demod_cf_0_0
+ dc_blocker_xx_0
+ 0
+ 0
+
+
+ analog_quadrature_demod_cf_0_0_0
+ dc_blocker_xx_0_0
+ 0
+ 0
+
+
+ dc_blocker_xx_0
+ digital_clock_recovery_mm_xx_0
+ 0
+ 0
+
+
+ dc_blocker_xx_0_0
+ satnogs_ogg_encoder_0
+ 0
+ 0
+
+
+ digital_binary_slicer_fb_0
+ satnogs_ax25_decoder_bm_0
+ 0
+ 0
+
+
+ digital_binary_slicer_fb_0
+ satnogs_ax25_decoder_bm_0_0
+ 0
+ 0
+
+
+ digital_clock_recovery_mm_xx_0
+ satnogs_quad_demod_filter_ff_0
+ 0
+ 0
+
+
+ osmosdr_source_0
+ pfb_arb_resampler_xxx_0
+ 0
+ 0
+
+
+ pfb_arb_resampler_xxx_0
+ satnogs_coarse_doppler_correction_cc_0
+ 0
+ 0
+
+
+ pfb_arb_resampler_xxx_0_0
+ analog_quadrature_demod_cf_0_0
+ 0
+ 0
+
+
+ pfb_arb_resampler_xxx_0_0
+ satnogs_iq_sink_0
+ 0
+ 0
+
+
+ pfb_arb_resampler_xxx_0_0
+ satnogs_waterfall_sink_0
+ 0
+ 0
+
+
+ satnogs_ax25_decoder_bm_0
+ satnogs_frame_file_sink_0_1_0
+ pdu
+ frame
+
+
+ satnogs_ax25_decoder_bm_0
+ satnogs_udp_msg_sink_0_0
+ pdu
+ in
+
+
+ satnogs_ax25_decoder_bm_0_0
+ satnogs_frame_file_sink_0_1_0
+ pdu
+ frame
+
+
+ satnogs_ax25_decoder_bm_0_0
+ satnogs_udp_msg_sink_0_0
+ pdu
+ in
+
+
+ satnogs_coarse_doppler_correction_cc_0
+ analog_quadrature_demod_cf_0_0_0
+ 0
+ 0
+
+
+ satnogs_coarse_doppler_correction_cc_0
+ pfb_arb_resampler_xxx_0_0
+ 0
+ 0
+
+
+ satnogs_quad_demod_filter_ff_0
+ digital_binary_slicer_fb_0
+ 0
+ 0
+
+
+ satnogs_tcp_rigctl_msg_source_0
+ satnogs_coarse_doppler_correction_cc_0
+ freq
+ freq
+
+
diff --git a/apps/flowgraphs/msk_ax25.py b/apps/flowgraphs/msk_ax25.py
new file mode 100755
index 0000000..929a91c
--- /dev/null
+++ b/apps/flowgraphs/msk_ax25.py
@@ -0,0 +1,350 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+##################################################
+# GNU Radio Python Flow Graph
+# Title: msk_ax25
+# Author: Manolis Surligas (surligas@gmail.com)
+# Description: Generic MSK AX.25 decoder
+# Generated: Thu Aug 9 21:26:02 2018
+##################################################
+
+from gnuradio import analog
+from gnuradio import digital
+from gnuradio import eng_notation
+from gnuradio import filter
+from gnuradio import gr
+from gnuradio.eng_option import eng_option
+from gnuradio.filter import firdes
+from gnuradio.filter import pfb
+from optparse import OptionParser
+import math
+import osmosdr
+import satnogs
+import time
+
+
+class msk_ax25(gr.top_block):
+
+ def __init__(self, antenna=satnogs.not_set_antenna, baudrate=9600.0, bb_gain=satnogs.not_set_rx_bb_gain, dev_args=satnogs.not_set_dev_args, doppler_correction_per_sec=1000, enable_iq_dump=0, file_path='test.wav', if_gain=satnogs.not_set_rx_if_gain, iq_file_path='/tmp/iq.dat', lo_offset=100e3, ppm=0, rf_gain=satnogs.not_set_rx_rf_gain, rigctl_port=4532, rx_freq=100e6, rx_sdr_device='usrpb200', samp_rate_rx=satnogs.not_set_samp_rate_rx, udp_IP='127.0.0.1', udp_port=16887, waterfall_file_path='/tmp/waterfall.dat'):
+ gr.top_block.__init__(self, "msk_ax25")
+
+ ##################################################
+ # Parameters
+ ##################################################
+ self.antenna = antenna
+ self.baudrate = baudrate
+ self.bb_gain = bb_gain
+ self.dev_args = dev_args
+ self.doppler_correction_per_sec = doppler_correction_per_sec
+ self.enable_iq_dump = enable_iq_dump
+ self.file_path = file_path
+ self.if_gain = if_gain
+ self.iq_file_path = iq_file_path
+ self.lo_offset = lo_offset
+ self.ppm = ppm
+ self.rf_gain = rf_gain
+ self.rigctl_port = rigctl_port
+ self.rx_freq = rx_freq
+ self.rx_sdr_device = rx_sdr_device
+ self.samp_rate_rx = samp_rate_rx
+ self.udp_IP = udp_IP
+ self.udp_port = udp_port
+ self.waterfall_file_path = waterfall_file_path
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.audio_samp_rate = audio_samp_rate = 48000
+
+ ##################################################
+ # Blocks
+ ##################################################
+ self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink(audio_samp_rate, 0.0, 10, 1024, waterfall_file_path, 1)
+ self.satnogs_udp_msg_sink_0_0 = satnogs.udp_msg_sink(udp_IP, udp_port, 1500)
+ self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source("127.0.0.1", rigctl_port, False, 1000, 1500)
+ self.satnogs_quad_demod_filter_ff_0 = satnogs.quad_demod_filter_ff(1.2)
+ self.satnogs_ogg_encoder_0 = satnogs.ogg_encoder(file_path, audio_samp_rate, 1.0)
+ self.satnogs_iq_sink_0 = satnogs.iq_sink(16768, iq_file_path, False, enable_iq_dump)
+ self.satnogs_frame_file_sink_0_1_0 = satnogs.frame_file_sink('decoded_data_file_path', 0)
+ self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, audio_samp_rate)
+ self.satnogs_ax25_decoder_bm_0_0 = satnogs.ax25_decoder_bm('GND', 0, True, False, 1024)
+ self.satnogs_ax25_decoder_bm_0 = satnogs.ax25_decoder_bm('GND', 0, True, True, 1024)
+ self.pfb_arb_resampler_xxx_0_0 = pfb.arb_resampler_ccf(
+ (2.0*baudrate)/audio_samp_rate,
+ taps=None,
+ flt_size=32)
+ self.pfb_arb_resampler_xxx_0_0.declare_sample_delay(0)
+
+ self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf(
+ audio_samp_rate/satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx),
+ taps=None,
+ flt_size=32)
+ self.pfb_arb_resampler_xxx_0.declare_sample_delay(0)
+
+ self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + satnogs.handle_rx_dev_args(rx_sdr_device, dev_args) )
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx))
+ self.osmosdr_source_0.set_center_freq(rx_freq - lo_offset, 0)
+ self.osmosdr_source_0.set_freq_corr(ppm, 0)
+ self.osmosdr_source_0.set_dc_offset_mode(2, 0)
+ self.osmosdr_source_0.set_iq_balance_mode(0, 0)
+ self.osmosdr_source_0.set_gain_mode(False, 0)
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(rx_sdr_device, rf_gain), 0)
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(rx_sdr_device, if_gain), 0)
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(rx_sdr_device, bb_gain), 0)
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(rx_sdr_device, antenna), 0)
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx), 0)
+
+ self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_ff(2, 0.25*0.175*0.175, 0.5, 0.175, 0.005)
+ self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb()
+ self.dc_blocker_xx_0_0 = filter.dc_blocker_ff(1024, True)
+ self.dc_blocker_xx_0 = filter.dc_blocker_ff(1024, True)
+ self.analog_quadrature_demod_cf_0_0_0 = analog.quadrature_demod_cf(0.9)
+ self.analog_quadrature_demod_cf_0_0 = analog.quadrature_demod_cf(1.2)
+
+
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0, 'pdu'), (self.satnogs_frame_file_sink_0_1_0, 'frame'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0, 'pdu'), (self.satnogs_udp_msg_sink_0_0, 'in'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0_0, 'pdu'), (self.satnogs_frame_file_sink_0_1_0, 'frame'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0_0, 'pdu'), (self.satnogs_udp_msg_sink_0_0, 'in'))
+ self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_coarse_doppler_correction_cc_0, 'freq'))
+ self.connect((self.analog_quadrature_demod_cf_0_0, 0), (self.dc_blocker_xx_0, 0))
+ self.connect((self.analog_quadrature_demod_cf_0_0_0, 0), (self.dc_blocker_xx_0_0, 0))
+ self.connect((self.dc_blocker_xx_0, 0), (self.digital_clock_recovery_mm_xx_0, 0))
+ self.connect((self.dc_blocker_xx_0_0, 0), (self.satnogs_ogg_encoder_0, 0))
+ self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_ax25_decoder_bm_0, 0))
+ self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_ax25_decoder_bm_0_0, 0))
+ self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.satnogs_quad_demod_filter_ff_0, 0))
+ self.connect((self.osmosdr_source_0, 0), (self.pfb_arb_resampler_xxx_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.analog_quadrature_demod_cf_0_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.satnogs_iq_sink_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.satnogs_waterfall_sink_0, 0))
+ self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.analog_quadrature_demod_cf_0_0_0, 0))
+ self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.pfb_arb_resampler_xxx_0_0, 0))
+ self.connect((self.satnogs_quad_demod_filter_ff_0, 0), (self.digital_binary_slicer_fb_0, 0))
+
+ def get_antenna(self):
+ return self.antenna
+
+ def set_antenna(self, antenna):
+ self.antenna = antenna
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(self.rx_sdr_device, self.antenna), 0)
+
+ def get_baudrate(self):
+ return self.baudrate
+
+ def set_baudrate(self, baudrate):
+ self.baudrate = baudrate
+ self.pfb_arb_resampler_xxx_0_0.set_rate((2.0*self.baudrate)/self.audio_samp_rate)
+
+ def get_bb_gain(self):
+ return self.bb_gain
+
+ def set_bb_gain(self, bb_gain):
+ self.bb_gain = bb_gain
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0)
+
+ def get_dev_args(self):
+ return self.dev_args
+
+ def set_dev_args(self, dev_args):
+ self.dev_args = dev_args
+
+ def get_doppler_correction_per_sec(self):
+ return self.doppler_correction_per_sec
+
+ def set_doppler_correction_per_sec(self, doppler_correction_per_sec):
+ self.doppler_correction_per_sec = doppler_correction_per_sec
+
+ def get_enable_iq_dump(self):
+ return self.enable_iq_dump
+
+ def set_enable_iq_dump(self, enable_iq_dump):
+ self.enable_iq_dump = enable_iq_dump
+
+ def get_file_path(self):
+ return self.file_path
+
+ def set_file_path(self, file_path):
+ self.file_path = file_path
+
+ def get_if_gain(self):
+ return self.if_gain
+
+ def set_if_gain(self, if_gain):
+ self.if_gain = if_gain
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(self.rx_sdr_device, self.if_gain), 0)
+
+ def get_iq_file_path(self):
+ return self.iq_file_path
+
+ def set_iq_file_path(self, iq_file_path):
+ self.iq_file_path = iq_file_path
+
+ def get_lo_offset(self):
+ return self.lo_offset
+
+ def set_lo_offset(self, lo_offset):
+ self.lo_offset = lo_offset
+ self.osmosdr_source_0.set_center_freq(self.rx_freq - self.lo_offset, 0)
+
+ def get_ppm(self):
+ return self.ppm
+
+ def set_ppm(self, ppm):
+ self.ppm = ppm
+ self.osmosdr_source_0.set_freq_corr(self.ppm, 0)
+
+ def get_rf_gain(self):
+ return self.rf_gain
+
+ def set_rf_gain(self, rf_gain):
+ self.rf_gain = rf_gain
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(self.rx_sdr_device, self.rf_gain), 0)
+
+ def get_rigctl_port(self):
+ return self.rigctl_port
+
+ def set_rigctl_port(self, rigctl_port):
+ self.rigctl_port = rigctl_port
+
+ def get_rx_freq(self):
+ return self.rx_freq
+
+ def set_rx_freq(self, rx_freq):
+ self.rx_freq = rx_freq
+ self.satnogs_coarse_doppler_correction_cc_0.set_new_freq_locked(self.rx_freq)
+ self.osmosdr_source_0.set_center_freq(self.rx_freq - self.lo_offset, 0)
+
+ def get_rx_sdr_device(self):
+ return self.rx_sdr_device
+
+ def set_rx_sdr_device(self, rx_sdr_device):
+ self.rx_sdr_device = rx_sdr_device
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(self.rx_sdr_device, self.rf_gain), 0)
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(self.rx_sdr_device, self.if_gain), 0)
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0)
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(self.rx_sdr_device, self.antenna), 0)
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx), 0)
+
+ def get_samp_rate_rx(self):
+ return self.samp_rate_rx
+
+ def set_samp_rate_rx(self, samp_rate_rx):
+ self.samp_rate_rx = samp_rate_rx
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx), 0)
+
+ def get_udp_IP(self):
+ return self.udp_IP
+
+ def set_udp_IP(self, udp_IP):
+ self.udp_IP = udp_IP
+
+ def get_udp_port(self):
+ return self.udp_port
+
+ def set_udp_port(self, udp_port):
+ self.udp_port = udp_port
+
+ def get_waterfall_file_path(self):
+ return self.waterfall_file_path
+
+ def set_waterfall_file_path(self, waterfall_file_path):
+ self.waterfall_file_path = waterfall_file_path
+
+ def get_audio_samp_rate(self):
+ return self.audio_samp_rate
+
+ def set_audio_samp_rate(self, audio_samp_rate):
+ self.audio_samp_rate = audio_samp_rate
+ self.pfb_arb_resampler_xxx_0_0.set_rate((2.0*self.baudrate)/self.audio_samp_rate)
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+
+
+def argument_parser():
+ description = 'Generic MSK AX.25 decoder'
+ parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description)
+ parser.add_option(
+ "", "--antenna", dest="antenna", type="string", default=satnogs.not_set_antenna,
+ help="Set antenna [default=%default]")
+ parser.add_option(
+ "", "--baudrate", dest="baudrate", type="eng_float", default=eng_notation.num_to_str(9600.0),
+ help="Set baudrate [default=%default]")
+ parser.add_option(
+ "", "--bb-gain", dest="bb_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_bb_gain),
+ help="Set bb_gain [default=%default]")
+ parser.add_option(
+ "", "--dev-args", dest="dev_args", type="string", default=satnogs.not_set_dev_args,
+ help="Set dev_args [default=%default]")
+ parser.add_option(
+ "", "--doppler-correction-per-sec", dest="doppler_correction_per_sec", type="intx", default=1000,
+ help="Set doppler_correction_per_sec [default=%default]")
+ parser.add_option(
+ "", "--enable-iq-dump", dest="enable_iq_dump", type="intx", default=0,
+ help="Set enable_iq_dump [default=%default]")
+ parser.add_option(
+ "", "--file-path", dest="file_path", type="string", default='test.wav',
+ help="Set file_path [default=%default]")
+ parser.add_option(
+ "", "--if-gain", dest="if_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_if_gain),
+ help="Set if_gain [default=%default]")
+ parser.add_option(
+ "", "--iq-file-path", dest="iq_file_path", type="string", default='/tmp/iq.dat',
+ help="Set iq_file_path [default=%default]")
+ parser.add_option(
+ "", "--lo-offset", dest="lo_offset", type="eng_float", default=eng_notation.num_to_str(100e3),
+ help="Set lo_offset [default=%default]")
+ parser.add_option(
+ "", "--ppm", dest="ppm", type="intx", default=0,
+ help="Set ppm [default=%default]")
+ parser.add_option(
+ "", "--rf-gain", dest="rf_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_rf_gain),
+ help="Set rf_gain [default=%default]")
+ parser.add_option(
+ "", "--rigctl-port", dest="rigctl_port", type="intx", default=4532,
+ help="Set rigctl_port [default=%default]")
+ parser.add_option(
+ "", "--rx-freq", dest="rx_freq", type="eng_float", default=eng_notation.num_to_str(100e6),
+ help="Set rx_freq [default=%default]")
+ parser.add_option(
+ "", "--rx-sdr-device", dest="rx_sdr_device", type="string", default='usrpb200',
+ help="Set rx_sdr_device [default=%default]")
+ parser.add_option(
+ "", "--samp-rate-rx", dest="samp_rate_rx", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_samp_rate_rx),
+ help="Set samp_rate_rx [default=%default]")
+ parser.add_option(
+ "", "--udp-IP", dest="udp_IP", type="string", default='127.0.0.1',
+ help="Set udp_IP [default=%default]")
+ parser.add_option(
+ "", "--udp-port", dest="udp_port", type="intx", default=16887,
+ help="Set udp_port [default=%default]")
+ parser.add_option(
+ "", "--waterfall-file-path", dest="waterfall_file_path", type="string", default='/tmp/waterfall.dat',
+ help="Set waterfall_file_path [default=%default]")
+ return parser
+
+
+def main(top_block_cls=msk_ax25, options=None):
+ if options is None:
+ options, _ = argument_parser().parse_args()
+
+ tb = top_block_cls(antenna=options.antenna, baudrate=options.baudrate, bb_gain=options.bb_gain, dev_args=options.dev_args, doppler_correction_per_sec=options.doppler_correction_per_sec, enable_iq_dump=options.enable_iq_dump, file_path=options.file_path, if_gain=options.if_gain, iq_file_path=options.iq_file_path, lo_offset=options.lo_offset, ppm=options.ppm, rf_gain=options.rf_gain, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device, samp_rate_rx=options.samp_rate_rx, udp_IP=options.udp_IP, udp_port=options.udp_port, waterfall_file_path=options.waterfall_file_path)
+ tb.start()
+ try:
+ raw_input('Press Enter to quit: ')
+ except EOFError:
+ pass
+ tb.stop()
+ tb.wait()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/apps/flowgraphs/satnogs_fsk_ax25.py b/apps/flowgraphs/satnogs_fsk_ax25.py
new file mode 100755
index 0000000..bb2c1b8
--- /dev/null
+++ b/apps/flowgraphs/satnogs_fsk_ax25.py
@@ -0,0 +1,345 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+##################################################
+# GNU Radio Python Flow Graph
+# Title: satnogs_fsk_ax25
+# Author: Manolis Surligas (surligas@gmail.com)
+# Description: Generic FSK AX.25 decoder
+# Generated: Thu Aug 9 21:31:20 2018
+##################################################
+
+from gnuradio import analog
+from gnuradio import digital
+from gnuradio import eng_notation
+from gnuradio import filter
+from gnuradio import gr
+from gnuradio.eng_option import eng_option
+from gnuradio.filter import firdes
+from gnuradio.filter import pfb
+from optparse import OptionParser
+import math
+import osmosdr
+import satnogs
+import time
+
+
+class satnogs_fsk_ax25(gr.top_block):
+
+ def __init__(self, antenna=satnogs.not_set_antenna, baudrate=9600.0, bb_gain=satnogs.not_set_rx_bb_gain, dev_args=satnogs.not_set_dev_args, doppler_correction_per_sec=1000, enable_iq_dump=0, file_path='test.wav', if_gain=satnogs.not_set_rx_if_gain, iq_file_path='/tmp/iq.dat', lo_offset=100e3, ppm=0, rf_gain=satnogs.not_set_rx_rf_gain, rigctl_port=4532, rx_freq=100e6, rx_sdr_device='usrpb200', samp_rate_rx=satnogs.not_set_samp_rate_rx, udp_IP='127.0.0.1', udp_port=16887, waterfall_file_path='/tmp/waterfall.dat'):
+ gr.top_block.__init__(self, "satnogs_fsk_ax25")
+
+ ##################################################
+ # Parameters
+ ##################################################
+ self.antenna = antenna
+ self.baudrate = baudrate
+ self.bb_gain = bb_gain
+ self.dev_args = dev_args
+ self.doppler_correction_per_sec = doppler_correction_per_sec
+ self.enable_iq_dump = enable_iq_dump
+ self.file_path = file_path
+ self.if_gain = if_gain
+ self.iq_file_path = iq_file_path
+ self.lo_offset = lo_offset
+ self.ppm = ppm
+ self.rf_gain = rf_gain
+ self.rigctl_port = rigctl_port
+ self.rx_freq = rx_freq
+ self.rx_sdr_device = rx_sdr_device
+ self.samp_rate_rx = samp_rate_rx
+ self.udp_IP = udp_IP
+ self.udp_port = udp_port
+ self.waterfall_file_path = waterfall_file_path
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.audio_samp_rate = audio_samp_rate = 48000
+
+ ##################################################
+ # Blocks
+ ##################################################
+ self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink(audio_samp_rate, 0.0, 10, 1024, waterfall_file_path, 1)
+ self.satnogs_udp_msg_sink_0_0 = satnogs.udp_msg_sink(udp_IP, udp_port, 1500)
+ self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source("127.0.0.1", rigctl_port, False, 1000, 1500)
+ self.satnogs_quad_demod_filter_ff_0 = satnogs.quad_demod_filter_ff(1.2)
+ self.satnogs_ogg_encoder_0 = satnogs.ogg_encoder(file_path, audio_samp_rate, 1.0)
+ self.satnogs_iq_sink_0 = satnogs.iq_sink(16768, iq_file_path, False, enable_iq_dump)
+ self.satnogs_frame_file_sink_0_1_0 = satnogs.frame_file_sink('decoded_data_file_path', 0)
+ self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, audio_samp_rate)
+ self.satnogs_ax25_decoder_bm_0_0 = satnogs.ax25_decoder_bm('GND', 0, True, False, 1024)
+ self.satnogs_ax25_decoder_bm_0 = satnogs.ax25_decoder_bm('GND', 0, True, True, 1024)
+ self.pfb_arb_resampler_xxx_0_0 = pfb.arb_resampler_ccf(
+ (2.0*baudrate)/audio_samp_rate,
+ taps=None,
+ flt_size=32)
+ self.pfb_arb_resampler_xxx_0_0.declare_sample_delay(0)
+
+ self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf(
+ audio_samp_rate/satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx),
+ taps=None,
+ flt_size=32)
+ self.pfb_arb_resampler_xxx_0.declare_sample_delay(0)
+
+ self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + satnogs.handle_rx_dev_args(rx_sdr_device, dev_args) )
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx))
+ self.osmosdr_source_0.set_center_freq(rx_freq - lo_offset, 0)
+ self.osmosdr_source_0.set_freq_corr(ppm, 0)
+ self.osmosdr_source_0.set_dc_offset_mode(2, 0)
+ self.osmosdr_source_0.set_iq_balance_mode(0, 0)
+ self.osmosdr_source_0.set_gain_mode(False, 0)
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(rx_sdr_device, rf_gain), 0)
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(rx_sdr_device, if_gain), 0)
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(rx_sdr_device, bb_gain), 0)
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(rx_sdr_device, antenna), 0)
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx), 0)
+
+ self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_ff(2, 0.25*0.175*0.175, 0.5, 0.175, 0.005)
+ self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb()
+ self.dc_blocker_xx_0_0 = filter.dc_blocker_ff(1024, True)
+ self.dc_blocker_xx_0 = filter.dc_blocker_ff(1024, True)
+ self.analog_quadrature_demod_cf_0_0_0 = analog.quadrature_demod_cf(0.9)
+ self.analog_quadrature_demod_cf_0_0 = analog.quadrature_demod_cf(1.2)
+
+
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0, 'pdu'), (self.satnogs_frame_file_sink_0_1_0, 'frame'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0, 'pdu'), (self.satnogs_udp_msg_sink_0_0, 'in'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0_0, 'pdu'), (self.satnogs_frame_file_sink_0_1_0, 'frame'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0_0, 'pdu'), (self.satnogs_udp_msg_sink_0_0, 'in'))
+ self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_coarse_doppler_correction_cc_0, 'freq'))
+ self.connect((self.analog_quadrature_demod_cf_0_0, 0), (self.dc_blocker_xx_0, 0))
+ self.connect((self.analog_quadrature_demod_cf_0_0_0, 0), (self.dc_blocker_xx_0_0, 0))
+ self.connect((self.dc_blocker_xx_0, 0), (self.digital_clock_recovery_mm_xx_0, 0))
+ self.connect((self.dc_blocker_xx_0_0, 0), (self.satnogs_ogg_encoder_0, 0))
+ self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_ax25_decoder_bm_0, 0))
+ self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_ax25_decoder_bm_0_0, 0))
+ self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.satnogs_quad_demod_filter_ff_0, 0))
+ self.connect((self.osmosdr_source_0, 0), (self.pfb_arb_resampler_xxx_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.analog_quadrature_demod_cf_0_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.satnogs_iq_sink_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.satnogs_waterfall_sink_0, 0))
+ self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.analog_quadrature_demod_cf_0_0_0, 0))
+ self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.pfb_arb_resampler_xxx_0_0, 0))
+ self.connect((self.satnogs_quad_demod_filter_ff_0, 0), (self.digital_binary_slicer_fb_0, 0))
+
+ def get_antenna(self):
+ return self.antenna
+
+ def set_antenna(self, antenna):
+ self.antenna = antenna
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(self.rx_sdr_device, self.antenna), 0)
+
+ def get_baudrate(self):
+ return self.baudrate
+
+ def set_baudrate(self, baudrate):
+ self.baudrate = baudrate
+ self.pfb_arb_resampler_xxx_0_0.set_rate((2.0*self.baudrate)/self.audio_samp_rate)
+
+ def get_bb_gain(self):
+ return self.bb_gain
+
+ def set_bb_gain(self, bb_gain):
+ self.bb_gain = bb_gain
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0)
+
+ def get_dev_args(self):
+ return self.dev_args
+
+ def set_dev_args(self, dev_args):
+ self.dev_args = dev_args
+
+ def get_doppler_correction_per_sec(self):
+ return self.doppler_correction_per_sec
+
+ def set_doppler_correction_per_sec(self, doppler_correction_per_sec):
+ self.doppler_correction_per_sec = doppler_correction_per_sec
+
+ def get_enable_iq_dump(self):
+ return self.enable_iq_dump
+
+ def set_enable_iq_dump(self, enable_iq_dump):
+ self.enable_iq_dump = enable_iq_dump
+
+ def get_file_path(self):
+ return self.file_path
+
+ def set_file_path(self, file_path):
+ self.file_path = file_path
+
+ def get_if_gain(self):
+ return self.if_gain
+
+ def set_if_gain(self, if_gain):
+ self.if_gain = if_gain
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(self.rx_sdr_device, self.if_gain), 0)
+
+ def get_iq_file_path(self):
+ return self.iq_file_path
+
+ def set_iq_file_path(self, iq_file_path):
+ self.iq_file_path = iq_file_path
+
+ def get_lo_offset(self):
+ return self.lo_offset
+
+ def set_lo_offset(self, lo_offset):
+ self.lo_offset = lo_offset
+ self.osmosdr_source_0.set_center_freq(self.rx_freq - self.lo_offset, 0)
+
+ def get_ppm(self):
+ return self.ppm
+
+ def set_ppm(self, ppm):
+ self.ppm = ppm
+ self.osmosdr_source_0.set_freq_corr(self.ppm, 0)
+
+ def get_rf_gain(self):
+ return self.rf_gain
+
+ def set_rf_gain(self, rf_gain):
+ self.rf_gain = rf_gain
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(self.rx_sdr_device, self.rf_gain), 0)
+
+ def get_rigctl_port(self):
+ return self.rigctl_port
+
+ def set_rigctl_port(self, rigctl_port):
+ self.rigctl_port = rigctl_port
+
+ def get_rx_freq(self):
+ return self.rx_freq
+
+ def set_rx_freq(self, rx_freq):
+ self.rx_freq = rx_freq
+ self.satnogs_coarse_doppler_correction_cc_0.set_new_freq_locked(self.rx_freq)
+ self.osmosdr_source_0.set_center_freq(self.rx_freq - self.lo_offset, 0)
+
+ def get_rx_sdr_device(self):
+ return self.rx_sdr_device
+
+ def set_rx_sdr_device(self, rx_sdr_device):
+ self.rx_sdr_device = rx_sdr_device
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(self.rx_sdr_device, self.rf_gain), 0)
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(self.rx_sdr_device, self.if_gain), 0)
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0)
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(self.rx_sdr_device, self.antenna), 0)
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx), 0)
+
+ def get_samp_rate_rx(self):
+ return self.samp_rate_rx
+
+ def set_samp_rate_rx(self, samp_rate_rx):
+ self.samp_rate_rx = samp_rate_rx
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx), 0)
+
+ def get_udp_IP(self):
+ return self.udp_IP
+
+ def set_udp_IP(self, udp_IP):
+ self.udp_IP = udp_IP
+
+ def get_udp_port(self):
+ return self.udp_port
+
+ def set_udp_port(self, udp_port):
+ self.udp_port = udp_port
+
+ def get_waterfall_file_path(self):
+ return self.waterfall_file_path
+
+ def set_waterfall_file_path(self, waterfall_file_path):
+ self.waterfall_file_path = waterfall_file_path
+
+ def get_audio_samp_rate(self):
+ return self.audio_samp_rate
+
+ def set_audio_samp_rate(self, audio_samp_rate):
+ self.audio_samp_rate = audio_samp_rate
+ self.pfb_arb_resampler_xxx_0_0.set_rate((2.0*self.baudrate)/self.audio_samp_rate)
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+
+
+def argument_parser():
+ description = 'Generic FSK AX.25 decoder'
+ parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description)
+ parser.add_option(
+ "", "--antenna", dest="antenna", type="string", default=satnogs.not_set_antenna,
+ help="Set antenna [default=%default]")
+ parser.add_option(
+ "", "--baudrate", dest="baudrate", type="eng_float", default=eng_notation.num_to_str(9600.0),
+ help="Set baudrate [default=%default]")
+ parser.add_option(
+ "", "--bb-gain", dest="bb_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_bb_gain),
+ help="Set bb_gain [default=%default]")
+ parser.add_option(
+ "", "--dev-args", dest="dev_args", type="string", default=satnogs.not_set_dev_args,
+ help="Set dev_args [default=%default]")
+ parser.add_option(
+ "", "--doppler-correction-per-sec", dest="doppler_correction_per_sec", type="intx", default=1000,
+ help="Set doppler_correction_per_sec [default=%default]")
+ parser.add_option(
+ "", "--enable-iq-dump", dest="enable_iq_dump", type="intx", default=0,
+ help="Set enable_iq_dump [default=%default]")
+ parser.add_option(
+ "", "--file-path", dest="file_path", type="string", default='test.wav',
+ help="Set file_path [default=%default]")
+ parser.add_option(
+ "", "--if-gain", dest="if_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_if_gain),
+ help="Set if_gain [default=%default]")
+ parser.add_option(
+ "", "--iq-file-path", dest="iq_file_path", type="string", default='/tmp/iq.dat',
+ help="Set iq_file_path [default=%default]")
+ parser.add_option(
+ "", "--lo-offset", dest="lo_offset", type="eng_float", default=eng_notation.num_to_str(100e3),
+ help="Set lo_offset [default=%default]")
+ parser.add_option(
+ "", "--ppm", dest="ppm", type="intx", default=0,
+ help="Set ppm [default=%default]")
+ parser.add_option(
+ "", "--rf-gain", dest="rf_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_rf_gain),
+ help="Set rf_gain [default=%default]")
+ parser.add_option(
+ "", "--rigctl-port", dest="rigctl_port", type="intx", default=4532,
+ help="Set rigctl_port [default=%default]")
+ parser.add_option(
+ "", "--rx-freq", dest="rx_freq", type="eng_float", default=eng_notation.num_to_str(100e6),
+ help="Set rx_freq [default=%default]")
+ parser.add_option(
+ "", "--rx-sdr-device", dest="rx_sdr_device", type="string", default='usrpb200',
+ help="Set rx_sdr_device [default=%default]")
+ parser.add_option(
+ "", "--samp-rate-rx", dest="samp_rate_rx", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_samp_rate_rx),
+ help="Set samp_rate_rx [default=%default]")
+ parser.add_option(
+ "", "--udp-IP", dest="udp_IP", type="string", default='127.0.0.1',
+ help="Set udp_IP [default=%default]")
+ parser.add_option(
+ "", "--udp-port", dest="udp_port", type="intx", default=16887,
+ help="Set udp_port [default=%default]")
+ parser.add_option(
+ "", "--waterfall-file-path", dest="waterfall_file_path", type="string", default='/tmp/waterfall.dat',
+ help="Set waterfall_file_path [default=%default]")
+ return parser
+
+
+def main(top_block_cls=satnogs_fsk_ax25, options=None):
+ if options is None:
+ options, _ = argument_parser().parse_args()
+
+ tb = top_block_cls(antenna=options.antenna, baudrate=options.baudrate, bb_gain=options.bb_gain, dev_args=options.dev_args, doppler_correction_per_sec=options.doppler_correction_per_sec, enable_iq_dump=options.enable_iq_dump, file_path=options.file_path, if_gain=options.if_gain, iq_file_path=options.iq_file_path, lo_offset=options.lo_offset, ppm=options.ppm, rf_gain=options.rf_gain, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device, samp_rate_rx=options.samp_rate_rx, udp_IP=options.udp_IP, udp_port=options.udp_port, waterfall_file_path=options.waterfall_file_path)
+ tb.start()
+ tb.wait()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/apps/flowgraphs/satnogs_msk_ax25.py b/apps/flowgraphs/satnogs_msk_ax25.py
new file mode 100755
index 0000000..8cfe17f
--- /dev/null
+++ b/apps/flowgraphs/satnogs_msk_ax25.py
@@ -0,0 +1,345 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+##################################################
+# GNU Radio Python Flow Graph
+# Title: satnogs_msk_ax25
+# Author: Manolis Surligas (surligas@gmail.com)
+# Description: Generic MSK AX.25 decoder
+# Generated: Thu Aug 9 21:31:32 2018
+##################################################
+
+from gnuradio import analog
+from gnuradio import digital
+from gnuradio import eng_notation
+from gnuradio import filter
+from gnuradio import gr
+from gnuradio.eng_option import eng_option
+from gnuradio.filter import firdes
+from gnuradio.filter import pfb
+from optparse import OptionParser
+import math
+import osmosdr
+import satnogs
+import time
+
+
+class satnogs_msk_ax25(gr.top_block):
+
+ def __init__(self, antenna=satnogs.not_set_antenna, baudrate=9600.0, bb_gain=satnogs.not_set_rx_bb_gain, dev_args=satnogs.not_set_dev_args, doppler_correction_per_sec=1000, enable_iq_dump=0, file_path='test.wav', if_gain=satnogs.not_set_rx_if_gain, iq_file_path='/tmp/iq.dat', lo_offset=100e3, ppm=0, rf_gain=satnogs.not_set_rx_rf_gain, rigctl_port=4532, rx_freq=100e6, rx_sdr_device='usrpb200', samp_rate_rx=satnogs.not_set_samp_rate_rx, udp_IP='127.0.0.1', udp_port=16887, waterfall_file_path='/tmp/waterfall.dat'):
+ gr.top_block.__init__(self, "satnogs_msk_ax25")
+
+ ##################################################
+ # Parameters
+ ##################################################
+ self.antenna = antenna
+ self.baudrate = baudrate
+ self.bb_gain = bb_gain
+ self.dev_args = dev_args
+ self.doppler_correction_per_sec = doppler_correction_per_sec
+ self.enable_iq_dump = enable_iq_dump
+ self.file_path = file_path
+ self.if_gain = if_gain
+ self.iq_file_path = iq_file_path
+ self.lo_offset = lo_offset
+ self.ppm = ppm
+ self.rf_gain = rf_gain
+ self.rigctl_port = rigctl_port
+ self.rx_freq = rx_freq
+ self.rx_sdr_device = rx_sdr_device
+ self.samp_rate_rx = samp_rate_rx
+ self.udp_IP = udp_IP
+ self.udp_port = udp_port
+ self.waterfall_file_path = waterfall_file_path
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.audio_samp_rate = audio_samp_rate = 48000
+
+ ##################################################
+ # Blocks
+ ##################################################
+ self.satnogs_waterfall_sink_0 = satnogs.waterfall_sink(audio_samp_rate, 0.0, 10, 1024, waterfall_file_path, 1)
+ self.satnogs_udp_msg_sink_0_0 = satnogs.udp_msg_sink(udp_IP, udp_port, 1500)
+ self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source("127.0.0.1", rigctl_port, False, 1000, 1500)
+ self.satnogs_quad_demod_filter_ff_0 = satnogs.quad_demod_filter_ff(1.2)
+ self.satnogs_ogg_encoder_0 = satnogs.ogg_encoder(file_path, audio_samp_rate, 1.0)
+ self.satnogs_iq_sink_0 = satnogs.iq_sink(16768, iq_file_path, False, enable_iq_dump)
+ self.satnogs_frame_file_sink_0_1_0 = satnogs.frame_file_sink('decoded_data_file_path', 0)
+ self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, audio_samp_rate)
+ self.satnogs_ax25_decoder_bm_0_0 = satnogs.ax25_decoder_bm('GND', 0, True, False, 1024)
+ self.satnogs_ax25_decoder_bm_0 = satnogs.ax25_decoder_bm('GND', 0, True, True, 1024)
+ self.pfb_arb_resampler_xxx_0_0 = pfb.arb_resampler_ccf(
+ (2.0*baudrate)/audio_samp_rate,
+ taps=None,
+ flt_size=32)
+ self.pfb_arb_resampler_xxx_0_0.declare_sample_delay(0)
+
+ self.pfb_arb_resampler_xxx_0 = pfb.arb_resampler_ccf(
+ audio_samp_rate/satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx),
+ taps=None,
+ flt_size=32)
+ self.pfb_arb_resampler_xxx_0.declare_sample_delay(0)
+
+ self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + satnogs.handle_rx_dev_args(rx_sdr_device, dev_args) )
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx))
+ self.osmosdr_source_0.set_center_freq(rx_freq - lo_offset, 0)
+ self.osmosdr_source_0.set_freq_corr(ppm, 0)
+ self.osmosdr_source_0.set_dc_offset_mode(2, 0)
+ self.osmosdr_source_0.set_iq_balance_mode(0, 0)
+ self.osmosdr_source_0.set_gain_mode(False, 0)
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(rx_sdr_device, rf_gain), 0)
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(rx_sdr_device, if_gain), 0)
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(rx_sdr_device, bb_gain), 0)
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(rx_sdr_device, antenna), 0)
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(rx_sdr_device, samp_rate_rx), 0)
+
+ self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_ff(2, 0.25*0.175*0.175, 0.5, 0.175, 0.005)
+ self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb()
+ self.dc_blocker_xx_0_0 = filter.dc_blocker_ff(1024, True)
+ self.dc_blocker_xx_0 = filter.dc_blocker_ff(1024, True)
+ self.analog_quadrature_demod_cf_0_0_0 = analog.quadrature_demod_cf(0.9)
+ self.analog_quadrature_demod_cf_0_0 = analog.quadrature_demod_cf(1.2)
+
+
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0, 'pdu'), (self.satnogs_frame_file_sink_0_1_0, 'frame'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0, 'pdu'), (self.satnogs_udp_msg_sink_0_0, 'in'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0_0, 'pdu'), (self.satnogs_frame_file_sink_0_1_0, 'frame'))
+ self.msg_connect((self.satnogs_ax25_decoder_bm_0_0, 'pdu'), (self.satnogs_udp_msg_sink_0_0, 'in'))
+ self.msg_connect((self.satnogs_tcp_rigctl_msg_source_0, 'freq'), (self.satnogs_coarse_doppler_correction_cc_0, 'freq'))
+ self.connect((self.analog_quadrature_demod_cf_0_0, 0), (self.dc_blocker_xx_0, 0))
+ self.connect((self.analog_quadrature_demod_cf_0_0_0, 0), (self.dc_blocker_xx_0_0, 0))
+ self.connect((self.dc_blocker_xx_0, 0), (self.digital_clock_recovery_mm_xx_0, 0))
+ self.connect((self.dc_blocker_xx_0_0, 0), (self.satnogs_ogg_encoder_0, 0))
+ self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_ax25_decoder_bm_0, 0))
+ self.connect((self.digital_binary_slicer_fb_0, 0), (self.satnogs_ax25_decoder_bm_0_0, 0))
+ self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.satnogs_quad_demod_filter_ff_0, 0))
+ self.connect((self.osmosdr_source_0, 0), (self.pfb_arb_resampler_xxx_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.analog_quadrature_demod_cf_0_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.satnogs_iq_sink_0, 0))
+ self.connect((self.pfb_arb_resampler_xxx_0_0, 0), (self.satnogs_waterfall_sink_0, 0))
+ self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.analog_quadrature_demod_cf_0_0_0, 0))
+ self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.pfb_arb_resampler_xxx_0_0, 0))
+ self.connect((self.satnogs_quad_demod_filter_ff_0, 0), (self.digital_binary_slicer_fb_0, 0))
+
+ def get_antenna(self):
+ return self.antenna
+
+ def set_antenna(self, antenna):
+ self.antenna = antenna
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(self.rx_sdr_device, self.antenna), 0)
+
+ def get_baudrate(self):
+ return self.baudrate
+
+ def set_baudrate(self, baudrate):
+ self.baudrate = baudrate
+ self.pfb_arb_resampler_xxx_0_0.set_rate((2.0*self.baudrate)/self.audio_samp_rate)
+
+ def get_bb_gain(self):
+ return self.bb_gain
+
+ def set_bb_gain(self, bb_gain):
+ self.bb_gain = bb_gain
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0)
+
+ def get_dev_args(self):
+ return self.dev_args
+
+ def set_dev_args(self, dev_args):
+ self.dev_args = dev_args
+
+ def get_doppler_correction_per_sec(self):
+ return self.doppler_correction_per_sec
+
+ def set_doppler_correction_per_sec(self, doppler_correction_per_sec):
+ self.doppler_correction_per_sec = doppler_correction_per_sec
+
+ def get_enable_iq_dump(self):
+ return self.enable_iq_dump
+
+ def set_enable_iq_dump(self, enable_iq_dump):
+ self.enable_iq_dump = enable_iq_dump
+
+ def get_file_path(self):
+ return self.file_path
+
+ def set_file_path(self, file_path):
+ self.file_path = file_path
+
+ def get_if_gain(self):
+ return self.if_gain
+
+ def set_if_gain(self, if_gain):
+ self.if_gain = if_gain
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(self.rx_sdr_device, self.if_gain), 0)
+
+ def get_iq_file_path(self):
+ return self.iq_file_path
+
+ def set_iq_file_path(self, iq_file_path):
+ self.iq_file_path = iq_file_path
+
+ def get_lo_offset(self):
+ return self.lo_offset
+
+ def set_lo_offset(self, lo_offset):
+ self.lo_offset = lo_offset
+ self.osmosdr_source_0.set_center_freq(self.rx_freq - self.lo_offset, 0)
+
+ def get_ppm(self):
+ return self.ppm
+
+ def set_ppm(self, ppm):
+ self.ppm = ppm
+ self.osmosdr_source_0.set_freq_corr(self.ppm, 0)
+
+ def get_rf_gain(self):
+ return self.rf_gain
+
+ def set_rf_gain(self, rf_gain):
+ self.rf_gain = rf_gain
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(self.rx_sdr_device, self.rf_gain), 0)
+
+ def get_rigctl_port(self):
+ return self.rigctl_port
+
+ def set_rigctl_port(self, rigctl_port):
+ self.rigctl_port = rigctl_port
+
+ def get_rx_freq(self):
+ return self.rx_freq
+
+ def set_rx_freq(self, rx_freq):
+ self.rx_freq = rx_freq
+ self.satnogs_coarse_doppler_correction_cc_0.set_new_freq_locked(self.rx_freq)
+ self.osmosdr_source_0.set_center_freq(self.rx_freq - self.lo_offset, 0)
+
+ def get_rx_sdr_device(self):
+ return self.rx_sdr_device
+
+ def set_rx_sdr_device(self, rx_sdr_device):
+ self.rx_sdr_device = rx_sdr_device
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_gain(satnogs.handle_rx_rf_gain(self.rx_sdr_device, self.rf_gain), 0)
+ self.osmosdr_source_0.set_if_gain(satnogs.handle_rx_if_gain(self.rx_sdr_device, self.if_gain), 0)
+ self.osmosdr_source_0.set_bb_gain(satnogs.handle_rx_bb_gain(self.rx_sdr_device, self.bb_gain), 0)
+ self.osmosdr_source_0.set_antenna(satnogs.handle_rx_antenna(self.rx_sdr_device, self.antenna), 0)
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx), 0)
+
+ def get_samp_rate_rx(self):
+ return self.samp_rate_rx
+
+ def set_samp_rate_rx(self, samp_rate_rx):
+ self.samp_rate_rx = samp_rate_rx
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_sample_rate(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+ self.osmosdr_source_0.set_bandwidth(satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx), 0)
+
+ def get_udp_IP(self):
+ return self.udp_IP
+
+ def set_udp_IP(self, udp_IP):
+ self.udp_IP = udp_IP
+
+ def get_udp_port(self):
+ return self.udp_port
+
+ def set_udp_port(self, udp_port):
+ self.udp_port = udp_port
+
+ def get_waterfall_file_path(self):
+ return self.waterfall_file_path
+
+ def set_waterfall_file_path(self, waterfall_file_path):
+ self.waterfall_file_path = waterfall_file_path
+
+ def get_audio_samp_rate(self):
+ return self.audio_samp_rate
+
+ def set_audio_samp_rate(self, audio_samp_rate):
+ self.audio_samp_rate = audio_samp_rate
+ self.pfb_arb_resampler_xxx_0_0.set_rate((2.0*self.baudrate)/self.audio_samp_rate)
+ self.pfb_arb_resampler_xxx_0.set_rate(self.audio_samp_rate/satnogs.handle_samp_rate_rx(self.rx_sdr_device, self.samp_rate_rx))
+
+
+def argument_parser():
+ description = 'Generic MSK AX.25 decoder'
+ parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description)
+ parser.add_option(
+ "", "--antenna", dest="antenna", type="string", default=satnogs.not_set_antenna,
+ help="Set antenna [default=%default]")
+ parser.add_option(
+ "", "--baudrate", dest="baudrate", type="eng_float", default=eng_notation.num_to_str(9600.0),
+ help="Set baudrate [default=%default]")
+ parser.add_option(
+ "", "--bb-gain", dest="bb_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_bb_gain),
+ help="Set bb_gain [default=%default]")
+ parser.add_option(
+ "", "--dev-args", dest="dev_args", type="string", default=satnogs.not_set_dev_args,
+ help="Set dev_args [default=%default]")
+ parser.add_option(
+ "", "--doppler-correction-per-sec", dest="doppler_correction_per_sec", type="intx", default=1000,
+ help="Set doppler_correction_per_sec [default=%default]")
+ parser.add_option(
+ "", "--enable-iq-dump", dest="enable_iq_dump", type="intx", default=0,
+ help="Set enable_iq_dump [default=%default]")
+ parser.add_option(
+ "", "--file-path", dest="file_path", type="string", default='test.wav',
+ help="Set file_path [default=%default]")
+ parser.add_option(
+ "", "--if-gain", dest="if_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_if_gain),
+ help="Set if_gain [default=%default]")
+ parser.add_option(
+ "", "--iq-file-path", dest="iq_file_path", type="string", default='/tmp/iq.dat',
+ help="Set iq_file_path [default=%default]")
+ parser.add_option(
+ "", "--lo-offset", dest="lo_offset", type="eng_float", default=eng_notation.num_to_str(100e3),
+ help="Set lo_offset [default=%default]")
+ parser.add_option(
+ "", "--ppm", dest="ppm", type="intx", default=0,
+ help="Set ppm [default=%default]")
+ parser.add_option(
+ "", "--rf-gain", dest="rf_gain", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_rx_rf_gain),
+ help="Set rf_gain [default=%default]")
+ parser.add_option(
+ "", "--rigctl-port", dest="rigctl_port", type="intx", default=4532,
+ help="Set rigctl_port [default=%default]")
+ parser.add_option(
+ "", "--rx-freq", dest="rx_freq", type="eng_float", default=eng_notation.num_to_str(100e6),
+ help="Set rx_freq [default=%default]")
+ parser.add_option(
+ "", "--rx-sdr-device", dest="rx_sdr_device", type="string", default='usrpb200',
+ help="Set rx_sdr_device [default=%default]")
+ parser.add_option(
+ "", "--samp-rate-rx", dest="samp_rate_rx", type="eng_float", default=eng_notation.num_to_str(satnogs.not_set_samp_rate_rx),
+ help="Set samp_rate_rx [default=%default]")
+ parser.add_option(
+ "", "--udp-IP", dest="udp_IP", type="string", default='127.0.0.1',
+ help="Set udp_IP [default=%default]")
+ parser.add_option(
+ "", "--udp-port", dest="udp_port", type="intx", default=16887,
+ help="Set udp_port [default=%default]")
+ parser.add_option(
+ "", "--waterfall-file-path", dest="waterfall_file_path", type="string", default='/tmp/waterfall.dat',
+ help="Set waterfall_file_path [default=%default]")
+ return parser
+
+
+def main(top_block_cls=satnogs_msk_ax25, options=None):
+ if options is None:
+ options, _ = argument_parser().parse_args()
+
+ tb = top_block_cls(antenna=options.antenna, baudrate=options.baudrate, bb_gain=options.bb_gain, dev_args=options.dev_args, doppler_correction_per_sec=options.doppler_correction_per_sec, enable_iq_dump=options.enable_iq_dump, file_path=options.file_path, if_gain=options.if_gain, iq_file_path=options.iq_file_path, lo_offset=options.lo_offset, ppm=options.ppm, rf_gain=options.rf_gain, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device, samp_rate_rx=options.samp_rate_rx, udp_IP=options.udp_IP, udp_port=options.udp_port, waterfall_file_path=options.waterfall_file_path)
+ tb.start()
+ tb.wait()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/python/hw_settings.py b/python/hw_settings.py
index d86d024..4bd59bb 100644
--- a/python/hw_settings.py
+++ b/python/hw_settings.py
@@ -59,9 +59,23 @@ hw_rx_settings = {'usrpb200' : {'rf_gain' : 50.0, 'if_gain' : 0.0,
not_set_rx_rf_gain = -1.0
not_set_rx_if_gain = -1.0
not_set_rx_bb_gain = -1.0
+not_set_samp_rate_rx = -1.0
not_set_antenna = ''
not_set_dev_args = ''
+def handle_samp_rate_rx(device, samp_rate):
+ """
+ Handles the RX sampling rate.
+ :param device: the device name
+ :type device: string
+ :param gain: the user defined gain value
+ :type gain: float
+ """
+ if(samp_rate == not_set_samp_rate_rx):
+ return hw_rx_settings[device]['samp_rate']
+ else:
+ return samp_rate
+
def handle_rx_dev_args(device, dev_args):
"""
Handles the RX device arguments.
@@ -132,4 +146,4 @@ def handle_rx_antenna(device, antenna):
return hw_rx_settings[device]['antenna']
else:
return antenna
-
\ No newline at end of file
+