Есть ли способ перезапустить top_block через функцию run ()? - PullRequest
0 голосов
/ 22 мая 2019

Я настроил код Python для передачи файла WAV через NBFM, и он отлично работает для отправки файла один раз ИЛИ если я установлю автоповтор, он продолжит отправлять сообщение. Однако я хотел бы вызвать функцию top_block.run (), подождать, а затем вызывать ее снова и каждый раз, когда он будет запускать потоковый граф (top_block).

В настоящее время у меня есть

    self.samp_rate = samp_rate = 44000

    ##################################################
    # Blocks
    ##################################################
    self.rational_resampler_xxx_0 = filter.rational_resampler_ccc(
            interpolation=2400000,
            decimation=88200,
            taps=None,
            fractional_bw=None,
    )

    self.osmosdr_sink_0 = osmosdr.sink( args="numchan=" + str(1) + " " + "" )
    self.osmosdr_sink_0.set_sample_rate(2400000)
    self.osmosdr_sink_0.set_center_freq(463025000, 0)
    self.osmosdr_sink_0.set_freq_corr(6, 0)
    self.osmosdr_sink_0.set_gain(0, 0)
    self.osmosdr_sink_0.set_if_gain(30, 0)
    self.osmosdr_sink_0.set_bb_gain(20, 0)
    self.osmosdr_sink_0.set_antenna("", 0)
    self.osmosdr_sink_0.set_bandwidth(10000, 0)

    self.blocks_wavfile_source_0 = blocks.wavfile_source("/home/ahmad/Test123.wav", True)
    self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff((2, ))
    self.analog_nbfm_tx_0 = analog.nbfm_tx(
        audio_rate=44100,
        quad_rate=88200,
        tau=75e-6,
        max_dev=5e3,
            )

    ##################################################
    # Connections
    ##################################################
    self.connect((self.analog_nbfm_tx_0, 0), (self.rational_resampler_xxx_0, 0))    
    self.connect((self.blocks_multiply_const_vxx_0, 0), (self.analog_nbfm_tx_0, 0))    
    self.connect((self.blocks_wavfile_source_0, 0), (self.blocks_multiply_const_vxx_0, 0))    
    self.connect((self.rational_resampler_xxx_0, 0), (self.osmosdr_sink_0, 0))    

tb = top_block_cls()
i = 0
while i < 5:
    tb.run()
    i = i + 1

Как только вышеприведенный код передает только один раз, а в остальное время пропускает команду run cmd, я думаю, у блоков есть логическое значение, которое указывает, что работа была выполнена? И это нужно сбросить. Спасибо за ваше время!

1 Ответ

0 голосов
/ 23 мая 2019

Вы можете повторно использовать верхний блок, но вам нужно подумать о состоянии блоков в нем.В частности, скорее всего, ваш исходный блок файла по-прежнему находится в конце файла.

Выберите решение:

  • Скажите исходному блоку файла начать или открыть зановотот же файл.(Это недоступно для блока wavfile_source, поэтому вам придется использовать другое решение.)
  • Замените его на вновь созданный блок исходного файла.(Этот подход имеет преимущество в обобщении для всех типов исходного блока.)

    Чтобы заменить блок, когда потоковый граф не работает, используйте self.disconnect(...) (те же параметры, что и self.connect(...)), чтобы удалить из него соединение, а затем self.connect(...) новый блок.

  • Создайте новый top_block_cls вместо повторного использования предыдущего.(Это гарантирует, что ни одно состояние из предыдущего цикла не будет выполнено вообще, но, конечно, это может занять больше времени.)

...