class FMAPRSDemodulator(gr.hier_block2, ExportedState): implements(IDemodulator) def __init__(self, mode, input_rate=0, aprs_information=None, context=None): assert input_rate > 0 gr.hier_block2.__init__( self, str(mode) + ' (FM + Multimon-NG) demodulator', gr.io_signature(1, 1, gr.sizeof_gr_complex * 1), gr.io_signature(1, 1, gr.sizeof_float * 1), ) self.mode = mode self.input_rate = input_rate # FM demod # TODO: Retry telling the NFMDemodulator to have its output rate be pipe_rate instead of using a resampler. Something went wrong when trying that before. self.fm_demod = NFMDemodulator( mode='NFM', input_rate=input_rate, no_audio_filter=True, # don't remove CTCSS tone tau=None) # no deemphasis assert self.fm_demod.get_output_type().get_kind() == 'MONO' fm_audio_rate = self.fm_demod.get_output_type().get_sample_rate() # Subprocess self.mm_demod = APRSDemodulator(aprs_information=aprs_information) mm_audio_rate = self.mm_demod.get_input_type().get_sample_rate() # Output self.connect(self, self.fm_demod, make_resampler(fm_audio_rate, mm_audio_rate), self.mm_demod, self) def state_def(self, callback): super(FMAPRSDemodulator, self).state_def(callback) # TODO make this possible to be decorator style callback(BlockCell(self, 'mm_demod')) def can_set_mode(self, mode): return False def get_half_bandwidth(self): return self.fm_demod.get_half_bandwidth() def get_output_type(self): return self.mm_demod.get_output_type() @exported_value() def get_band_filter_shape(self): return self.fm_demod.get_band_filter_shape()
class FMAPRSDemodulator(gr.hier_block2, ExportedState): implements(IDemodulator) def __init__(self, mode, input_rate=0, aprs_information=None, context=None): assert input_rate > 0 gr.hier_block2.__init__( self, str(mode) + ' (FM + Multimon-NG) demodulator', gr.io_signature(1, 1, gr.sizeof_gr_complex * 1), gr.io_signature(1, 1, gr.sizeof_float * 1), ) self.mode = mode self.input_rate = input_rate # FM demod # TODO: Retry telling the NFMDemodulator to have its output rate be pipe_rate instead of using a resampler. Something went wrong when trying that before. self.fm_demod = NFMDemodulator( mode='NFM', input_rate=input_rate, no_audio_filter=True, # don't remove CTCSS tone tau=None) # no deemphasis assert self.fm_demod.get_output_type().get_kind() == 'MONO' fm_audio_rate = self.fm_demod.get_output_type().get_sample_rate() # Subprocess self.mm_demod = APRSDemodulator( aprs_information=aprs_information) mm_audio_rate = self.mm_demod.get_input_type().get_sample_rate() # Output self.connect( self, self.fm_demod, make_resampler(fm_audio_rate, mm_audio_rate), self.mm_demod, self) def state_def(self, callback): super(FMAPRSDemodulator, self).state_def(callback) # TODO make this possible to be decorator style callback(BlockCell(self, 'mm_demod')) def can_set_mode(self, mode): return False def get_half_bandwidth(self): return self.fm_demod.get_half_bandwidth() def get_output_type(self): return self.mm_demod.get_output_type() @exported_value() def get_band_filter_shape(self): return self.fm_demod.get_band_filter_shape()
class MultimonNGDemodulator(gr.hier_block2, ExportedState): implements(IDemodulator) def __init__(self, mode, input_rate=0, audio_rate=0, context=None): assert input_rate > 0 gr.hier_block2.__init__( self, str(mode) + ' (Multimon-NG) demodulator', gr.io_signature(1, 1, gr.sizeof_gr_complex * 1), # TODO: Add generic support for demodulators with no audio output gr.io_signature(2, 2, gr.sizeof_float * 1), ) self.mode = mode self.input_rate = input_rate # FM demod self.fm_demod = NFMDemodulator( mode='NFM', input_rate=input_rate, audio_rate=pipe_rate, tau=None) # no deemphasis # Subprocess self.process = SubprocessSink( args=['multimon-ng', '-t', 'raw', '-a', 'AFSK1200', '-A', '-v', '10', '-'], #args=['python', '../play16bit.py'], itemsize=gr.sizeof_short) # Output converter = blocks.float_to_short(vlen=1, scale=int_scale) self.connect( self, self.fm_demod, converter, self.process) # Dummy sink for useless stereo output of demod self.connect((self.fm_demod, 1), blocks.null_sink(gr.sizeof_float)) # Audio copy output resampler = make_resampler(pipe_rate, audio_rate) self.connect(converter, blocks.short_to_float(vlen=1, scale=int_scale), resampler) #self.connect(self.fm_demod, resampler) self.connect(resampler, (self, 0)) self.connect(resampler, (self, 1)) def can_set_mode(self, mode): return False def get_half_bandwidth(self): return self.fm_demod.get_half_bandwidth() @exported_value() def get_band_filter_shape(self): return self.fm_demod.get_band_filter_shape()
class FMAPRSDemodulator(gr.hier_block2, ExportedState): implements(IDemodulator) def __init__(self, mode, input_rate=0, context=None): assert input_rate > 0 assert context is not None gr.hier_block2.__init__( self, str(mode) + ' (FM + Multimon-NG) demodulator', gr.io_signature(1, 1, gr.sizeof_gr_complex * 1), gr.io_signature(1, 1, gr.sizeof_float * 1), ) self.mode = mode self.input_rate = input_rate # FM demod # TODO: Retry telling the NFMDemodulator to have its output rate be pipe_rate instead of using a resampler. Something went wrong when trying that before. Same thing is done in dsd.py self.fm_demod = NFMDemodulator( mode='NFM', input_rate=input_rate, no_audio_filter=True, # don't remove CTCSS tone tau=None) # no deemphasis assert self.fm_demod.get_output_type().get_kind() == 'MONO' fm_audio_rate = self.fm_demod.get_output_type().get_sample_rate() # Subprocess self.mm_demod = APRSDemodulator(context=context) mm_audio_rate = self.mm_demod.get_input_type().get_sample_rate() # Output self.connect( self, self.fm_demod, make_resampler(fm_audio_rate, mm_audio_rate), self.mm_demod, self) def can_set_mode(self, mode): return False def get_half_bandwidth(self): return self.fm_demod.get_half_bandwidth() def get_output_type(self): return self.mm_demod.get_output_type() @exported_block() def get_mm_demod(self): return self.mm_demod @exported_value() def get_band_filter_shape(self): return self.fm_demod.get_band_filter_shape()
class DSDDemodulator(gr.hier_block2, ExportedState): implements(IDemodulator) def __init__(self, mode, input_rate=0, context=None): assert input_rate > 0 gr.hier_block2.__init__( self, type(self).__name__, gr.io_signature(1, 1, gr.sizeof_gr_complex), gr.io_signature(1, 1, gr.sizeof_float)) # TODO: Retry telling the NFMDemodulator to have its output rate be pipe_rate instead of using a resampler. Something went wrong when trying that before. Same thing is done in multimon.py self.__fm_demod = NFMDemodulator( mode='NFM', input_rate=input_rate, no_audio_filter=True, # don't remove CTCSS tone tau=None) # no deemphasis assert self.__fm_demod.get_output_type().get_kind() == 'MONO' fm_audio_rate = self.__fm_demod.get_output_type().get_sample_rate() self.__output_type = SignalType(kind='MONO', sample_rate=8000) self.connect( self, self.__fm_demod, make_resampler(fm_audio_rate, _demod_rate), dsd_block_ff(), self) @exported_block() def get_fm_demod(self): return self.__fm_demod def can_set_mode(self, mode): return False def get_output_type(self): return self.__output_type def get_half_bandwidth(self): return self.__fm_demod.get_half_bandwidth() @exported_value() def get_band_filter_shape(self): return self.__fm_demod.get_band_filter_shape()