diff --git a/main.py b/main.py index c5d195df..19944fc2 100644 --- a/main.py +++ b/main.py @@ -23,6 +23,10 @@ if __name__ == '__main__': PARSER.add_argument('--rx', dest="audio_input_device", default=0, help="listening sound card", type=int) PARSER.add_argument('--tx', dest="audio_output_device", default=0, help="transmitting sound card", type=int) PARSER.add_argument('--port', dest="socket_port", default=3000, help="Socket port", type=int) + PARSER.add_argument('--deviceport', dest="hamlib_device_port", default="/dev/ttyUSB", help="Socket port", type=str) + PARSER.add_argument('--deviceid', dest="hamlib_device_id", default=311, help="Socket port", type=int) + + # parser.add_argument('--mode', dest="freedv_data_mode", default=12, help="Set the mode.", type=int) ARGS = PARSER.parse_args() @@ -32,6 +36,11 @@ if __name__ == '__main__': static.AUDIO_OUTPUT_DEVICE = ARGS.audio_output_device static.PORT = ARGS.socket_port + + static.HAMLIB_DEVICE_ID = ARGS.hamlib_device_id + static.HAMLIB_DEVICE_PORT = ARGS.hamlib_device_port + + # --------------------------------------------START CMD SERVER import sock # we need to wait until we got all parameters from argparse first diff --git a/modem.py b/modem.py index d434b327..9132ec9e 100644 --- a/modem.py +++ b/modem.py @@ -79,17 +79,39 @@ class RF(): Hamlib.rig_set_debug(Hamlib.RIG_DEBUG_NONE) # Init RIG_MODEL_DUMMY - self.my_rig = Hamlib.Rig(Hamlib.RIG_MODEL_DUMMY) - self.my_rig.set_conf("rig_pathname", "/dev/Rig") + self.my_rig = Hamlib.Rig(static.HAMLIB_DEVICE_ID) + self.my_rig.set_conf("rig_pathname", static.HAMLIB_DEVICE_PORT) + self.my_rig.set_conf("retry", "5") - self.my_rig.open() + self.my_rig.set_conf("serial_speed", "19200") + + #self.my_rig.set_conf("dtr_state", "OFF") + #my_rig.set_conf("rts_state", "OFF") + #self.my_rig.set_conf("ptt_type", "RTS") + #my_rig.set_conf("ptt_type", "RIG_PTT_SERIAL_RTS") + + self.my_rig.set_conf("serial_handshake", "None") + self.my_rig.set_conf("stop_bits", "1") + self.my_rig.set_conf("data_bits", "8") + + + #my_rig.set_ptt(Hamlib.RIG_PTT_RIG,0) + #my_rig.set_ptt(Hamlib.RIG_PTT_SERIAL_DTR,0) + #my_rig.set_ptt(Hamlib.RIG_PTT_SERIAL_RTS,1) + + + if static.HAMLIB_PTT_TYPE == 'RIG_PTT_RIG': self.hamlib_ptt_type = Hamlib.RIG_PTT_RIG elif static.HAMLIB_PTT_TYPE == 'RIG_PTT_SERIAL_DTR': self.hamlib_ptt_type = Hamlib.RIG_PTT_SERIAL_DTR - elif static.HAMLIB_PTT_TYPE == 'RIG_PTT_SERIAL_RTS': + elif static.HAMLIB_PTT_TYPE == 'RTS': self.hamlib_ptt_type = Hamlib.RIG_PTT_SERIAL_RTS + self.my_rig.set_conf("dtr_state", "OFF") + self.my_rig.set_conf("ptt_type", "RTS") + + elif static.HAMLIB_PTT_TYPE == 'RIG_PTT_PARALLEL': self.hamlib_ptt_type = Hamlib.RIG_PTT_PARALLEL elif static.HAMLIB_PTT_TYPE == 'RIG_PTT_RIG_MICDATA': @@ -99,13 +121,35 @@ class RF(): else: # static.HAMLIB_PTT_TYPE == 'RIG_PTT_NONE': self.hamlib_ptt_type = Hamlib.RIG_PTT_NONE - self.my_rig.set_ptt(self.hamlib_ptt_type, 0) - + #self.my_rig.set_ptt(self.hamlib_ptt_type, 0) + self.my_rig.open() # -------------------------------------------------------------------------------------------------------- + def ptt_and_wait(self, state): + + if state: + static.PTT_STATE = True + self.my_rig.set_ptt(self.hamlib_ptt_type, 1) + + ptt_togle_timeout = time.time() + 0.2 + while time.time() < ptt_togle_timeout: + pass + + else: + + ptt_togle_timeout = time.time() + 0.3 + while time.time() < ptt_togle_timeout: + pass + + static.PTT_STATE = False + self.my_rig.set_ptt(self.hamlib_ptt_type, 0) + + + + def play_audio(self): while True: @@ -125,12 +169,7 @@ class RF(): # -------------------------------------------------------------------------------------------------------- def transmit_signalling(self, data_out): - - state_before_transmit = static.CHANNEL_STATE - static.CHANNEL_STATE = 'SENDING_SIGNALLING' - static.PTT_STATE = True - self.my_rig.set_ptt(self.hamlib_ptt_type, 1) - + self.c_lib.freedv_open.restype = ctypes.POINTER(ctypes.c_ubyte) freedv = self.c_lib.freedv_open(static.FREEDV_SIGNALLING_MODE) bytes_per_frame = int(self.c_lib.freedv_get_bits_per_modem_frame(freedv) / 8) @@ -161,34 +200,30 @@ class RF(): self.c_lib.freedv_rawdatatx(freedv, mod_out, data) # modulate DATA and safe it into mod_out pointer self.c_lib.freedv_rawdatapostambletx(freedv, mod_out_postamble) - - txbuffer = bytearray() - txbuffer += bytes(mod_out_preamble) - txbuffer += bytes(mod_out) - txbuffer += bytes(mod_out_postamble) - + self.streambuffer = bytearray() + self.streambuffer += bytes(mod_out_preamble) + self.streambuffer += bytes(mod_out) + self.streambuffer += bytes(mod_out_postamble) + # -------------- transmit audio - logging.debug("SENDING SIGNALLING FRAME " + str(data_out)) + #logging.debug("SENDING SIGNALLING FRAME " + str(data_out)) - self.streambuffer = bytes() - self.streambuffer += bytes(txbuffer) - # double signalling frame transmission - self.streambuffer += bytes(txbuffer) + state_before_transmit = static.CHANNEL_STATE + static.CHANNEL_STATE = 'SENDING_SIGNALLING' + self.ptt_and_wait(True) self.audio_writing_to_stream = True # wait until audio has been processed - while self.audio_writing_to_stream == True: + while self.audio_writing_to_stream: time.sleep(0.01) static.CHANNEL_STATE = 'SENDING_SIGNALLING' - #print("sending signalling...") - self.my_rig.set_ptt(self.hamlib_ptt_type, 0) - static.PTT_STATE = False + self.ptt_and_wait(False) static.CHANNEL_STATE = state_before_transmit self.c_lib.freedv_close(freedv) - # time.sleep(0.5) + # -------------------------------------------------------------------------------------------------------- # GET ARQ BURST FRAME VOM BUFFER AND MODULATE IT @@ -201,7 +236,7 @@ class RF(): self.my_rig.set_ptt(self.hamlib_ptt_type, 1) - static.PTT_STATE = True + state_before_transmit = static.CHANNEL_STATE static.CHANNEL_STATE = 'SENDING_DATA' @@ -266,9 +301,9 @@ class RF(): self.c_lib.freedv_rawdatatx(freedv, mod_out, data) # modulate DATA and safe it into mod_out pointer self.c_lib.freedv_rawdatapostambletx(freedv, mod_out_postamble) - #txbuffer += bytes(mod_out_preamble) + txbuffer += bytes(mod_out_preamble) txbuffer += bytes(mod_out) - #txbuffer += bytes(mod_out_postamble) + txbuffer += bytes(mod_out_postamble) elif static.ARQ_RPT_RECEIVED == True: @@ -323,6 +358,9 @@ class RF(): # self.stream_tx.write(bytes(txbuffer)) self.streambuffer = bytes() self.streambuffer = bytes(txbuffer) + + + self.ptt_and_wait(True) self.audio_writing_to_stream = True # wait until audio has been processed @@ -332,8 +370,8 @@ class RF(): #print("sending data...") static.CHANNEL_STATE = 'RECEIVING_SIGNALLING' - static.PTT_STATE = False - self.my_rig.set_ptt(self.hamlib_ptt_type, 0) + + self.ptt_and_wait(False) self.c_lib.freedv_close(freedv) # -------------------------------------------------------------------------------------------------------- diff --git a/static.py b/static.py index d67c0025..a5c9ff82 100644 --- a/static.py +++ b/static.py @@ -45,10 +45,11 @@ PORT = 3000 # RIG_PTT_CM108 # PTT control through CM108 GPIO pin -HAMLIB_PTT_TYPE = 'RIG_PTT_NONE' +HAMLIB_PTT_TYPE = 'RTS' PTT_STATE = False - +HAMLIB_DEVICE_ID = 311 +HAMLIB_DEVICE_PORT = '/dev/ttyUSB0' # ------------------------- # FreeDV Defaults FREEDV_RECEIVE = True @@ -70,10 +71,10 @@ AUDIO_OUTPUT_DEVICE = 1 #TX_SAMPLE_STATE = None #RX_SAMPLE_STATE = None -#AUDIO_SAMPLE_RATE_RX = 44100 -#AUDIO_SAMPLE_RATE_TX = 44100 +AUDIO_SAMPLE_RATE_RX = 48000 +AUDIO_SAMPLE_RATE_TX = 48000 MODEM_SAMPLE_RATE = 8000 # 8000 -AUDIO_FRAMES_PER_BUFFER = 2048 # 256 # 512 # 1024 #2048 --> nicht 880 # 128 gut, 256, 1024 +AUDIO_FRAMES_PER_BUFFER = 8192 # 256 # 512 # 1024 #2048 --> nicht 880 # 128 gut, 256, 1024 16384 AUDIO_CHANNELS = 1 AUDIO_RMS = 0 # ---------------------------------