diff --git a/apps/flowgraphs/cw_decoder.grc b/apps/flowgraphs/cw_decoder.grc index da8593e..a3dbf71 100644 --- a/apps/flowgraphs/cw_decoder.grc +++ b/apps/flowgraphs/cw_decoder.grc @@ -38,7 +38,7 @@ generate_options - no_gui + qt_gui hier_block_src_path @@ -93,7 +93,7 @@ _coordinate - (1704, 260) + (821, 857) _rotation @@ -101,11 +101,11 @@ id - filter_rate + lpf_decimation value - 100000 + 5 @@ -132,7 +132,7 @@ value - 100 + 250 @@ -148,7 +148,7 @@ TX sampling rate _coordinate - (1704, 956) + (382, 865) _rotation @@ -222,7 +222,7 @@ TX sampling rate _coordinate - (1704, 164) + (1723, 219) _rotation @@ -237,11 +237,38 @@ TX sampling rate firdes.low_pass(1, samp_rate_rx, 125000, 25000, firdes.WIN_HAMMING, 6.76) + + variable + + comment + + + + _enabled + True + + + _coordinate + (694, 857) + + + _rotation + 0 + + + id + xlating_decimation + + + value + 5 + + analog_agc2_xx attack_rate - 0.01 + 0.1 alias @@ -257,15 +284,15 @@ TX sampling rate decay_rate - 0.001 + 0.8 _enabled - True + 1 _coordinate - (989, 279) + (981, 263) _rotation @@ -273,7 +300,7 @@ TX sampling rate gain - 1.0 + 0.0 id @@ -281,7 +308,7 @@ TX sampling rate max_gain - 65536 + 1e3 maxoutbuf @@ -293,13 +320,60 @@ TX sampling rate reference - 1.0 + 0.6 type complex + + audio_sink + + alias + + + + comment + + + + affinity + + + + device_name + + + + _enabled + 0 + + + _coordinate + (1603, 123) + + + _rotation + 0 + + + id + audio_sink_0 + + + num_inputs + 1 + + + ok_to_block + True + + + samp_rate + 48000 + + blocks_complex_to_mag_squared @@ -316,7 +390,7 @@ TX sampling rate _enabled - True + 1 _coordinate @@ -343,6 +417,49 @@ TX sampling rate 1 + + blocks_complex_to_real + + alias + + + + comment + + + + affinity + + + + _enabled + 0 + + + _coordinate + (1220, 127) + + + _rotation + 0 + + + id + blocks_complex_to_real_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + vlen + 1 + + blocks_delay @@ -363,7 +480,7 @@ TX sampling rate _enabled - True + 1 _coordinate @@ -414,7 +531,7 @@ TX sampling rate _enabled - True + 1 _coordinate @@ -469,7 +586,7 @@ TX sampling rate _enabled - True + 1 _coordinate @@ -496,6 +613,50 @@ TX sampling rate 1 + + parameter + + alias + 700 + + + comment + Offset in Hz from the carrier frequency in order the +CW beacon to be audable. + + + _enabled + True + + + _coordinate + (925, 857) + + + _rotation + 0 + + + id + cw_offset + + + label + + + + short_id + + + + type + eng_float + + + value + 700 + + parameter @@ -602,7 +763,7 @@ TX sampling rate _enabled - True + 1 _coordinate @@ -645,7 +806,7 @@ TX sampling rate center_freq - lo_offset + lo_offset - cw_offset comment @@ -657,7 +818,7 @@ TX sampling rate decim - int(samp_rate_rx/filter_rate) + xlating_decimation _enabled @@ -665,7 +826,7 @@ TX sampling rate _coordinate - (526, 287) + (518, 271) _rotation @@ -696,6 +857,37 @@ TX sampling rate ccc + + import + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (255, 35) + + + _rotation + 0 + + + id + import_0 + + + import + import satnogs + + parameter @@ -713,7 +905,7 @@ we shift the LO a little further _coordinate - (1704, 608) + (494, 857) _rotation @@ -764,7 +956,7 @@ we shift the LO a little further decim - 5 + lpf_decimation _enabled @@ -776,7 +968,7 @@ we shift the LO a little further _coordinate - (773, 263) + (765, 247) _rotation @@ -804,7 +996,7 @@ we shift the LO a little further samp_rate - int(samp_rate_rx/filter_rate) + samp_rate_rx/xlating_decimation width @@ -2265,6 +2457,727 @@ we shift the LO a little further 0 + + qtgui_freq_sink_x + + autoscale + False + + + average + 1.0 + + + axislabels + True + + + bw + samp_rate_rx/xlating_decimation + + + alias + + + + fc + 0 + + + comment + + + + ctrlpanel + False + + + affinity + + + + _enabled + True + + + fftsize + 1024 + + + _coordinate + (702, 470) + + + gui_hint + + + + _rotation + 0 + + + grid + False + + + id + qtgui_freq_sink_x_0 + + + legend + True + + + alpha1 + 1.0 + + + color1 + "blue" + + + label1 + + + + width1 + 1 + + + alpha10 + 1.0 + + + color10 + "dark blue" + + + label10 + + + + width10 + 1 + + + alpha2 + 1.0 + + + color2 + "red" + + + label2 + + + + width2 + 1 + + + alpha3 + 1.0 + + + color3 + "green" + + + label3 + + + + width3 + 1 + + + alpha4 + 1.0 + + + color4 + "black" + + + label4 + + + + width4 + 1 + + + alpha5 + 1.0 + + + color5 + "cyan" + + + label5 + + + + width5 + 1 + + + alpha6 + 1.0 + + + color6 + "magenta" + + + label6 + + + + width6 + 1 + + + alpha7 + 1.0 + + + color7 + "yellow" + + + label7 + + + + width7 + 1 + + + alpha8 + 1.0 + + + color8 + "dark red" + + + label8 + + + + width8 + 1 + + + alpha9 + 1.0 + + + color9 + "dark green" + + + label9 + + + + width9 + 1 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + name + "" + + + nconnections + 1 + + + showports + True + + + freqhalf + True + + + tr_chan + 0 + + + tr_level + 0.0 + + + tr_mode + qtgui.TRIG_MODE_FREE + + + tr_tag + "" + + + type + complex + + + update_time + 0.10 + + + wintype + firdes.WIN_BLACKMAN_hARRIS + + + label + Relative Gain + + + ymax + 10 + + + ymin + -140 + + + units + dB + + + + qtgui_time_sink_x + + autoscale + False + + + axislabels + True + + + alias + + + + comment + + + + ctrlpanel + False + + + affinity + + + + entags + True + + + _enabled + True + + + _coordinate + (1739, 610) + + + gui_hint + + + + _rotation + 0 + + + grid + False + + + id + qtgui_time_sink_x_0 + + + legend + True + + + alpha1 + 1.0 + + + color1 + "blue" + + + label1 + + + + marker1 + -1 + + + style1 + 1 + + + width1 + 1 + + + alpha10 + 1.0 + + + color10 + "blue" + + + label10 + + + + marker10 + -1 + + + style10 + 1 + + + width10 + 1 + + + alpha2 + 1.0 + + + color2 + "red" + + + label2 + + + + marker2 + -1 + + + style2 + 1 + + + width2 + 1 + + + alpha3 + 1.0 + + + color3 + "green" + + + label3 + + + + marker3 + -1 + + + style3 + 1 + + + width3 + 1 + + + alpha4 + 1.0 + + + color4 + "black" + + + label4 + + + + marker4 + -1 + + + style4 + 1 + + + width4 + 1 + + + alpha5 + 1.0 + + + color5 + "cyan" + + + label5 + + + + marker5 + -1 + + + style5 + 1 + + + width5 + 1 + + + alpha6 + 1.0 + + + color6 + "magenta" + + + label6 + + + + marker6 + -1 + + + style6 + 1 + + + width6 + 1 + + + alpha7 + 1.0 + + + color7 + "yellow" + + + label7 + + + + marker7 + -1 + + + style7 + 1 + + + width7 + 1 + + + alpha8 + 1.0 + + + color8 + "dark red" + + + label8 + + + + marker8 + -1 + + + style8 + 1 + + + width8 + 1 + + + alpha9 + 1.0 + + + color9 + "dark green" + + + label9 + + + + marker9 + -1 + + + style9 + 1 + + + width9 + 1 + + + name + "" + + + nconnections + 1 + + + size + 1024 + + + srate + int((samp_rate_rx/xlating_decimation)/lpf_decimation) + + + tr_chan + 0 + + + tr_delay + 0 + + + tr_level + 0.0 + + + tr_mode + qtgui.TRIG_MODE_FREE + + + tr_slope + qtgui.TRIG_SLOPE_POS + + + tr_tag + "" + + + type + float + + + update_time + 0.10 + + + ylabel + Amplitude + + + yunit + "" + + + ymax + 1 + + + ymin + -1 + + + + rational_resampler_xxx + + alias + + + + comment + + + + affinity + + + + decim + int((samp_rate_rx/xlating_decimation)/lpf_decimation) + + + _enabled + 0 + + + fbw + 0 + + + _coordinate + (1420, 103) + + + _rotation + 0 + + + id + rational_resampler_xxx_0 + + + interp + 48000 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + taps + + + + type + fff + + parameter @@ -2410,11 +3323,11 @@ we shift the LO a little further _enabled - True + 1 _coordinate - (295, 279) + (279, 263) _rotation @@ -2445,7 +3358,7 @@ we shift the LO a little further satnogs_cw_to_symbol threshold - 2e6 + 300000 auto_config @@ -2493,7 +3406,7 @@ we shift the LO a little further sampling_rate - int(samp_rate_rx/filter_rate) / 5 + int((samp_rate_rx/xlating_decimation)/lpf_decimation) wpm @@ -2520,7 +3433,7 @@ we shift the LO a little further _coordinate - (1045, 522) + (1172, 522) _rotation @@ -2567,7 +3480,7 @@ we shift the LO a little further _coordinate - (750, 506) + (941, 506) _rotation @@ -2579,7 +3492,7 @@ we shift the LO a little further outstream - False + True timestamp @@ -2732,9 +3645,15 @@ we shift the LO a little further value - 22 + 20 + + analog_agc2_xx_0 + blocks_complex_to_real_0 + 0 + 0 + analog_agc2_xx_0 blocks_delay_0 @@ -2753,12 +3672,24 @@ we shift the LO a little further 0 0 + + blocks_complex_to_real_0 + rational_resampler_xxx_0 + 0 + 0 + blocks_delay_0 blocks_multiply_conjugate_cc_0 0 1 + + blocks_moving_average_xx_0 + qtgui_time_sink_x_0 + 0 + 0 + blocks_moving_average_xx_0 satnogs_cw_to_symbol_0 @@ -2789,12 +3720,24 @@ we shift the LO a little further 0 0 + + low_pass_filter_0 + qtgui_freq_sink_x_0 + 0 + 0 + osmosdr_source_0 satnogs_coarse_doppler_correction_cc_0 0 0 + + rational_resampler_xxx_0 + audio_sink_0 + 0 + 0 + satnogs_coarse_doppler_correction_cc_0 freq_xlating_fir_filter_xxx_0 diff --git a/apps/flowgraphs/satnogs_cw_decoder.py b/apps/flowgraphs/satnogs_cw_decoder.py index c9bd299..703fc04 100755 --- a/apps/flowgraphs/satnogs_cw_decoder.py +++ b/apps/flowgraphs/satnogs_cw_decoder.py @@ -5,30 +5,67 @@ # Title: CW Decoder # Author: Manolis Surligas (surligas@gmail.com) # Description: A CW (Morse) Decoder -# Generated: Sat Apr 8 22:15:03 2017 +# Generated: Tue Apr 25 21:28:22 2017 ################################################## +if __name__ == '__main__': + import ctypes + import sys + if sys.platform.startswith('linux'): + try: + x11 = ctypes.cdll.LoadLibrary('libX11.so') + x11.XInitThreads() + except: + print "Warning: failed to XInitThreads()" + +from PyQt4 import Qt from gnuradio import analog from gnuradio import blocks from gnuradio import eng_notation from gnuradio import filter from gnuradio import gr +from gnuradio import qtgui from gnuradio.eng_option import eng_option from gnuradio.filter import firdes from optparse import OptionParser import osmosdr import satnogs +import sip +import sys import time +from gnuradio import qtgui -class satnogs_cw_decoder(gr.top_block): +class satnogs_cw_decoder(gr.top_block, Qt.QWidget): - def __init__(self, doppler_correction_per_sec=1000, file_path='test.txt', lo_offset=100e3, ppm=0, rigctl_port=4532, rx_freq=100e6, rx_sdr_device='usrpb200', waterfall_file_path='/tmp/waterfall.dat', wpm=22): + def __init__(self, cw_offset=700, doppler_correction_per_sec=1000, file_path='test.txt', lo_offset=100e3, ppm=0, rigctl_port=4532, rx_freq=100e6, rx_sdr_device='usrpb200', waterfall_file_path='/tmp/waterfall.dat', wpm=20): gr.top_block.__init__(self, "CW Decoder") + Qt.QWidget.__init__(self) + self.setWindowTitle("CW Decoder") + qtgui.util.check_set_qss() + try: + self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) + except: + pass + self.top_scroll_layout = Qt.QVBoxLayout() + self.setLayout(self.top_scroll_layout) + self.top_scroll = Qt.QScrollArea() + self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) + self.top_scroll_layout.addWidget(self.top_scroll) + self.top_scroll.setWidgetResizable(True) + self.top_widget = Qt.QWidget() + self.top_scroll.setWidget(self.top_widget) + self.top_layout = Qt.QVBoxLayout(self.top_widget) + self.top_grid_layout = Qt.QGridLayout() + self.top_layout.addLayout(self.top_grid_layout) + + self.settings = Qt.QSettings("GNU Radio", "satnogs_cw_decoder") + self.restoreGeometry(self.settings.value("geometry").toByteArray()) ################################################## # Parameters ################################################## + self.cw_offset = cw_offset self.doppler_correction_per_sec = doppler_correction_per_sec self.file_path = file_path self.lo_offset = lo_offset @@ -43,21 +80,112 @@ class satnogs_cw_decoder(gr.top_block): # Variables ################################################## self.samp_rate_rx = samp_rate_rx = satnogs.hw_rx_settings[rx_sdr_device]['samp_rate'] + self.xlating_decimation = xlating_decimation = 5 self.xlate_filter_taps = xlate_filter_taps = firdes.low_pass(1, samp_rate_rx, 125000, 25000, firdes.WIN_HAMMING, 6.76) self.taps = taps = firdes.low_pass(12.0, samp_rate_rx, 100e3, 60000, firdes.WIN_HAMMING, 6.76) - self.ndelay = ndelay = 100 - self.filter_rate = filter_rate = 100000 + self.ndelay = ndelay = 250 + self.lpf_decimation = lpf_decimation = 5 ################################################## # Blocks ################################################## self.satnogs_tcp_rigctl_msg_source_0 = satnogs.tcp_rigctl_msg_source("127.0.0.1", rigctl_port, False, 1000, 1500) - self.satnogs_multi_format_msg_sink_0 = satnogs.multi_format_msg_sink(0, True, False, 'test.txt') + self.satnogs_multi_format_msg_sink_0 = satnogs.multi_format_msg_sink(0, True, True, 'test.txt') self.satnogs_morse_decoder_0 = satnogs.morse_decoder(ord('#')) - self.satnogs_cw_to_symbol_0 = satnogs.cw_to_symbol(int(samp_rate_rx/filter_rate) / 5, 2e6, 0.9, wpm, False) + self.satnogs_cw_to_symbol_0 = satnogs.cw_to_symbol(int((samp_rate_rx/xlating_decimation)/lpf_decimation), 300000, 0.9, wpm, False) self.satnogs_coarse_doppler_correction_cc_0 = satnogs.coarse_doppler_correction_cc(rx_freq, samp_rate_rx) + self.qtgui_time_sink_x_0 = qtgui.time_sink_f( + 1024, #size + int((samp_rate_rx/xlating_decimation)/lpf_decimation), #samp_rate + "", #name + 1 #number of inputs + ) + self.qtgui_time_sink_x_0.set_update_time(0.10) + self.qtgui_time_sink_x_0.set_y_axis(-1, 1) + + self.qtgui_time_sink_x_0.set_y_label('Amplitude', "") + + self.qtgui_time_sink_x_0.enable_tags(-1, True) + self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") + self.qtgui_time_sink_x_0.enable_autoscale(False) + self.qtgui_time_sink_x_0.enable_grid(False) + self.qtgui_time_sink_x_0.enable_axis_labels(True) + self.qtgui_time_sink_x_0.enable_control_panel(False) + + if not True: + self.qtgui_time_sink_x_0.disable_legend() + + labels = ['', '', '', '', '', + '', '', '', '', ''] + widths = [1, 1, 1, 1, 1, + 1, 1, 1, 1, 1] + colors = ["blue", "red", "green", "black", "cyan", + "magenta", "yellow", "dark red", "dark green", "blue"] + styles = [1, 1, 1, 1, 1, + 1, 1, 1, 1, 1] + markers = [-1, -1, -1, -1, -1, + -1, -1, -1, -1, -1] + alphas = [1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 1.0, 1.0] + + for i in xrange(1): + if len(labels[i]) == 0: + self.qtgui_time_sink_x_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_time_sink_x_0.set_line_label(i, labels[i]) + self.qtgui_time_sink_x_0.set_line_width(i, widths[i]) + self.qtgui_time_sink_x_0.set_line_color(i, colors[i]) + self.qtgui_time_sink_x_0.set_line_style(i, styles[i]) + self.qtgui_time_sink_x_0.set_line_marker(i, markers[i]) + self.qtgui_time_sink_x_0.set_line_alpha(i, alphas[i]) + + self._qtgui_time_sink_x_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0.pyqwidget(), Qt.QWidget) + self.top_layout.addWidget(self._qtgui_time_sink_x_0_win) + self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c( + 1024, #size + firdes.WIN_BLACKMAN_hARRIS, #wintype + 0, #fc + samp_rate_rx/xlating_decimation, #bw + "", #name + 1 #number of inputs + ) + self.qtgui_freq_sink_x_0.set_update_time(0.10) + self.qtgui_freq_sink_x_0.set_y_axis(-140, 10) + self.qtgui_freq_sink_x_0.set_y_label('Relative Gain', 'dB') + self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "") + self.qtgui_freq_sink_x_0.enable_autoscale(False) + self.qtgui_freq_sink_x_0.enable_grid(False) + self.qtgui_freq_sink_x_0.set_fft_average(1.0) + self.qtgui_freq_sink_x_0.enable_axis_labels(True) + self.qtgui_freq_sink_x_0.enable_control_panel(False) + + if not True: + self.qtgui_freq_sink_x_0.disable_legend() + + if "complex" == "float" or "complex" == "msg_float": + self.qtgui_freq_sink_x_0.set_plot_pos_half(not True) + + labels = ['', '', '', '', '', + '', '', '', '', ''] + widths = [1, 1, 1, 1, 1, + 1, 1, 1, 1, 1] + colors = ["blue", "red", "green", "black", "cyan", + "magenta", "yellow", "dark red", "dark green", "dark blue"] + alphas = [1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 1.0, 1.0] + for i in xrange(1): + if len(labels[i]) == 0: + self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i)) + else: + self.qtgui_freq_sink_x_0.set_line_label(i, labels[i]) + self.qtgui_freq_sink_x_0.set_line_width(i, widths[i]) + self.qtgui_freq_sink_x_0.set_line_color(i, colors[i]) + self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i]) + + self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget) + self.top_layout.addWidget(self._qtgui_freq_sink_x_0_win) self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + satnogs.hw_rx_settings[rx_sdr_device]['dev_arg'] ) self.osmosdr_source_0.set_sample_rate(samp_rate_rx) self.osmosdr_source_0.set_center_freq(rx_freq - lo_offset, 0) @@ -71,17 +199,17 @@ class satnogs_cw_decoder(gr.top_block): self.osmosdr_source_0.set_antenna(satnogs.hw_rx_settings[rx_sdr_device]['antenna'], 0) self.osmosdr_source_0.set_bandwidth(samp_rate_rx, 0) - self.low_pass_filter_0 = filter.fir_filter_ccf(5, firdes.low_pass( - 1, int(samp_rate_rx/filter_rate), 2e3, 500, firdes.WIN_HAMMING, 6.76)) - self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(int(samp_rate_rx/filter_rate), (xlate_filter_taps), lo_offset, samp_rate_rx) + self.low_pass_filter_0 = filter.fir_filter_ccf(lpf_decimation, firdes.low_pass( + 1, samp_rate_rx/xlating_decimation, 2e3, 500, firdes.WIN_HAMMING, 6.76)) + self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(xlating_decimation, (xlate_filter_taps), lo_offset - cw_offset, samp_rate_rx) self.fir_filter_xxx_0 = filter.fir_filter_ccc(1, ([1,] * ndelay)) self.fir_filter_xxx_0.declare_sample_delay(0) self.blocks_multiply_conjugate_cc_0 = blocks.multiply_conjugate_cc(1) self.blocks_moving_average_xx_0 = blocks.moving_average_ff(ndelay, 1, 4000) self.blocks_delay_0 = blocks.delay(gr.sizeof_gr_complex*1, ndelay) self.blocks_complex_to_mag_squared_0 = blocks.complex_to_mag_squared(1) - self.analog_agc2_xx_0 = analog.agc2_cc(0.01, 0.001, 1.0, 1.0) - self.analog_agc2_xx_0.set_max_gain(65536) + self.analog_agc2_xx_0 = analog.agc2_cc(0.1, 0.8, 0.6, 0.0) + self.analog_agc2_xx_0.set_max_gain(1e3) ################################################## # Connections @@ -93,14 +221,28 @@ class satnogs_cw_decoder(gr.top_block): self.connect((self.analog_agc2_xx_0, 0), (self.blocks_multiply_conjugate_cc_0, 0)) self.connect((self.blocks_complex_to_mag_squared_0, 0), (self.blocks_moving_average_xx_0, 0)) self.connect((self.blocks_delay_0, 0), (self.blocks_multiply_conjugate_cc_0, 1)) + self.connect((self.blocks_moving_average_xx_0, 0), (self.qtgui_time_sink_x_0, 0)) self.connect((self.blocks_moving_average_xx_0, 0), (self.satnogs_cw_to_symbol_0, 0)) self.connect((self.blocks_multiply_conjugate_cc_0, 0), (self.fir_filter_xxx_0, 0)) self.connect((self.fir_filter_xxx_0, 0), (self.blocks_complex_to_mag_squared_0, 0)) self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.analog_agc2_xx_0, 0)) + self.connect((self.low_pass_filter_0, 0), (self.qtgui_freq_sink_x_0, 0)) self.connect((self.osmosdr_source_0, 0), (self.satnogs_coarse_doppler_correction_cc_0, 0)) self.connect((self.satnogs_coarse_doppler_correction_cc_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0)) + def closeEvent(self, event): + self.settings = Qt.QSettings("GNU Radio", "satnogs_cw_decoder") + self.settings.setValue("geometry", self.saveGeometry()) + event.accept() + + def get_cw_offset(self): + return self.cw_offset + + def set_cw_offset(self, cw_offset): + self.cw_offset = cw_offset + self.freq_xlating_fir_filter_xxx_0.set_center_freq(self.lo_offset - self.cw_offset) + def get_doppler_correction_per_sec(self): return self.doppler_correction_per_sec @@ -119,7 +261,7 @@ class satnogs_cw_decoder(gr.top_block): 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) - self.freq_xlating_fir_filter_xxx_0.set_center_freq(self.lo_offset) + self.freq_xlating_fir_filter_xxx_0.set_center_freq(self.lo_offset - self.cw_offset) def get_ppm(self): return self.ppm @@ -171,9 +313,20 @@ class satnogs_cw_decoder(gr.top_block): def set_samp_rate_rx(self, samp_rate_rx): self.samp_rate_rx = samp_rate_rx self.set_xlate_filter_taps(firdes.low_pass(1, self.samp_rate_rx, 125000, 25000, firdes.WIN_HAMMING, 6.76)) + self.qtgui_time_sink_x_0.set_samp_rate(int((self.samp_rate_rx/self.xlating_decimation)/self.lpf_decimation)) + self.qtgui_freq_sink_x_0.set_frequency_range(0, self.samp_rate_rx/self.xlating_decimation) self.osmosdr_source_0.set_sample_rate(self.samp_rate_rx) self.osmosdr_source_0.set_bandwidth(self.samp_rate_rx, 0) - self.low_pass_filter_0.set_taps(firdes.low_pass(1, int(self.samp_rate_rx/self.filter_rate), 2e3, 500, firdes.WIN_HAMMING, 6.76)) + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate_rx/self.xlating_decimation, 2e3, 500, firdes.WIN_HAMMING, 6.76)) + + def get_xlating_decimation(self): + return self.xlating_decimation + + def set_xlating_decimation(self, xlating_decimation): + self.xlating_decimation = xlating_decimation + self.qtgui_time_sink_x_0.set_samp_rate(int((self.samp_rate_rx/self.xlating_decimation)/self.lpf_decimation)) + self.qtgui_freq_sink_x_0.set_frequency_range(0, self.samp_rate_rx/self.xlating_decimation) + self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate_rx/self.xlating_decimation, 2e3, 500, firdes.WIN_HAMMING, 6.76)) def get_xlate_filter_taps(self): return self.xlate_filter_taps @@ -197,17 +350,20 @@ class satnogs_cw_decoder(gr.top_block): self.blocks_moving_average_xx_0.set_length_and_scale(self.ndelay, 1) self.blocks_delay_0.set_dly(self.ndelay) - def get_filter_rate(self): - return self.filter_rate + def get_lpf_decimation(self): + return self.lpf_decimation - def set_filter_rate(self, filter_rate): - self.filter_rate = filter_rate - self.low_pass_filter_0.set_taps(firdes.low_pass(1, int(self.samp_rate_rx/self.filter_rate), 2e3, 500, firdes.WIN_HAMMING, 6.76)) + def set_lpf_decimation(self, lpf_decimation): + self.lpf_decimation = lpf_decimation + self.qtgui_time_sink_x_0.set_samp_rate(int((self.samp_rate_rx/self.xlating_decimation)/self.lpf_decimation)) def argument_parser(): description = 'A CW (Morse) Decoder' parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description) + parser.add_option( + "", "--cw-offset", dest="cw_offset", type="eng_float", default=eng_notation.num_to_str(700), + help="Set cw_offset [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]") @@ -233,7 +389,7 @@ def argument_parser(): "", "--waterfall-file-path", dest="waterfall_file_path", type="string", default='/tmp/waterfall.dat', help="Set waterfall_file_path [default=%default]") parser.add_option( - "", "--wpm", dest="wpm", type="intx", default=22, + "", "--wpm", dest="wpm", type="intx", default=20, help="Set wpm [default=%default]") return parser @@ -242,9 +398,21 @@ def main(top_block_cls=satnogs_cw_decoder, options=None): if options is None: options, _ = argument_parser().parse_args() - tb = top_block_cls(doppler_correction_per_sec=options.doppler_correction_per_sec, file_path=options.file_path, lo_offset=options.lo_offset, ppm=options.ppm, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device, waterfall_file_path=options.waterfall_file_path, wpm=options.wpm) + from distutils.version import StrictVersion + if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"): + style = gr.prefs().get_string('qtgui', 'style', 'raster') + Qt.QApplication.setGraphicsSystem(style) + qapp = Qt.QApplication(sys.argv) + + tb = top_block_cls(cw_offset=options.cw_offset, doppler_correction_per_sec=options.doppler_correction_per_sec, file_path=options.file_path, lo_offset=options.lo_offset, ppm=options.ppm, rigctl_port=options.rigctl_port, rx_freq=options.rx_freq, rx_sdr_device=options.rx_sdr_device, waterfall_file_path=options.waterfall_file_path, wpm=options.wpm) tb.start() - tb.wait() + tb.show() + + def quitting(): + tb.stop() + tb.wait() + qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting) + qapp.exec_() if __name__ == '__main__':