def __init__(
        self,
        radioParam={
            "type": "ndr804-ptt",
            "host": "ndr308",
            "port": 8617,
            "obj": None
        },
        index=1,
        enable=True,
        idString="USER",
        rate=0,
        ddcFreq=0,
        tunerIndex=1,
        radioInterface=1,
        dipIndex=-1,
        localInterface="eth6",
        udpPort=11000,
        testFilename="",
        otherDdcArgs={},
    ):
        gr.hier_block2.__init__(
            self,
            "NDR804-PTT Narrowband IQ Source",
            gr.io_signature(0, 0, 0),
            gr.io_signature(1, 1, gr.sizeof_gr_complex * 1),
        )
        self.message_port_register_hier_out("control")
        self.message_port_register_hier_in("control")

        ##################################################
        # Parameters
        ##################################################
        self.ddcFreq = ddcFreq
        self.dipIndex = dipIndex
        self.index = index
        self.localInterface = localInterface
        self.otherDdcArgs = otherDdcArgs
        self.radioInterface = radioInterface
        self.radioParam = radioParam
        self.rate = rate
        self.tunerIndex = tunerIndex
        self.udpPort = udpPort
        self.enable = enable
        self.idString = idString
        self.testFilename = testFilename

        ##################################################
        # Blocks
        ##################################################
        self.vitaIqSource = CyberRadio.vita_iq_source_2(
            3,
            1024 * 4 / 4,
            9 * 4,
            1 * 4,
            False,
            True,
            "0.0.0.0",
            udpPort,
            False,
            False,
            False,
        )
        self.vecToStream = blocks.vector_to_stream(gr.sizeof_gr_complex * 1,
                                                   1024 / 4)
        self.nullSink = blocks.null_sink(gr.sizeof_int * (9 + 1024 / 4 + 1))
        self.ddcControl = generic_ddc_control_block(
            radioParam,
            index,
            self.idString,
            enable,  # enable
            False,  # wideband
            rate,
            0,
            ddcFreq,
            tunerIndex,
            0,
            radioInterface,
            dipIndex,
            localInterface,
            udpPort,
            dict(otherDdcArgs),
            False)

        if self.testFilename != "":
            self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex * 1,
                                                     31250, True)
            self.blocks_interleaved_short_to_complex_0 = blocks.interleaved_short_to_complex(
                False, False)
            self.blocks_file_source_0 = blocks.file_source(
                gr.sizeof_short * 1, self.testFilename, True)
            self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vcc(
                (1.0 / 32767, ))

        ##################################################
        # Connections
        ##################################################
        self.msg_connect((self.ddcControl, 'control'), (self, 'control'))
        self.msg_connect((self, 'control'), (self.ddcControl, 'control'))

        if self.testFilename != "":
            self.connect((self.blocks_multiply_const_vxx_0, 0), (self, 0))
            self.connect((self.blocks_throttle_0, 0),
                         (self.blocks_multiply_const_vxx_0, 0))
            self.connect((self.blocks_interleaved_short_to_complex_0, 0),
                         (self.blocks_throttle_0, 0))
            self.connect((self.blocks_file_source_0, 0),
                         (self.blocks_interleaved_short_to_complex_0, 0))
        else:
            self.connect((self.vecToStream, 0), (self, 0))
            self.connect((self.vitaIqSource, 0), (self.nullSink, 0))
            self.connect((self.vitaIqSource, 1), (self.vecToStream, 0))