mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
first attempt with hamlib
- created a separate function "ptt_and_wait" which is waiting a little bit - this improved the transmission quality drastically *party*
This commit is contained in:
parent
7c89f1d7c7
commit
67a8938e2e
3 changed files with 86 additions and 38 deletions
9
main.py
9
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('--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('--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('--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)
|
# parser.add_argument('--mode', dest="freedv_data_mode", default=12, help="Set the mode.", type=int)
|
||||||
|
|
||||||
ARGS = PARSER.parse_args()
|
ARGS = PARSER.parse_args()
|
||||||
|
@ -32,6 +36,11 @@ if __name__ == '__main__':
|
||||||
static.AUDIO_OUTPUT_DEVICE = ARGS.audio_output_device
|
static.AUDIO_OUTPUT_DEVICE = ARGS.audio_output_device
|
||||||
static.PORT = ARGS.socket_port
|
static.PORT = ARGS.socket_port
|
||||||
|
|
||||||
|
|
||||||
|
static.HAMLIB_DEVICE_ID = ARGS.hamlib_device_id
|
||||||
|
static.HAMLIB_DEVICE_PORT = ARGS.hamlib_device_port
|
||||||
|
|
||||||
|
|
||||||
# --------------------------------------------START CMD SERVER
|
# --------------------------------------------START CMD SERVER
|
||||||
import sock # we need to wait until we got all parameters from argparse first
|
import sock # we need to wait until we got all parameters from argparse first
|
||||||
|
|
||||||
|
|
100
modem.py
100
modem.py
|
@ -79,17 +79,39 @@ class RF():
|
||||||
Hamlib.rig_set_debug(Hamlib.RIG_DEBUG_NONE)
|
Hamlib.rig_set_debug(Hamlib.RIG_DEBUG_NONE)
|
||||||
|
|
||||||
# Init RIG_MODEL_DUMMY
|
# Init RIG_MODEL_DUMMY
|
||||||
self.my_rig = Hamlib.Rig(Hamlib.RIG_MODEL_DUMMY)
|
self.my_rig = Hamlib.Rig(static.HAMLIB_DEVICE_ID)
|
||||||
self.my_rig.set_conf("rig_pathname", "/dev/Rig")
|
self.my_rig.set_conf("rig_pathname", static.HAMLIB_DEVICE_PORT)
|
||||||
|
|
||||||
self.my_rig.set_conf("retry", "5")
|
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':
|
if static.HAMLIB_PTT_TYPE == 'RIG_PTT_RIG':
|
||||||
self.hamlib_ptt_type = Hamlib.RIG_PTT_RIG
|
self.hamlib_ptt_type = Hamlib.RIG_PTT_RIG
|
||||||
elif static.HAMLIB_PTT_TYPE == 'RIG_PTT_SERIAL_DTR':
|
elif static.HAMLIB_PTT_TYPE == 'RIG_PTT_SERIAL_DTR':
|
||||||
self.hamlib_ptt_type = Hamlib.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.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':
|
elif static.HAMLIB_PTT_TYPE == 'RIG_PTT_PARALLEL':
|
||||||
self.hamlib_ptt_type = Hamlib.RIG_PTT_PARALLEL
|
self.hamlib_ptt_type = Hamlib.RIG_PTT_PARALLEL
|
||||||
elif static.HAMLIB_PTT_TYPE == 'RIG_PTT_RIG_MICDATA':
|
elif static.HAMLIB_PTT_TYPE == 'RIG_PTT_RIG_MICDATA':
|
||||||
|
@ -99,13 +121,35 @@ class RF():
|
||||||
else: # static.HAMLIB_PTT_TYPE == 'RIG_PTT_NONE':
|
else: # static.HAMLIB_PTT_TYPE == 'RIG_PTT_NONE':
|
||||||
self.hamlib_ptt_type = Hamlib.RIG_PTT_NONE
|
self.hamlib_ptt_type = Hamlib.RIG_PTT_NONE
|
||||||
|
|
||||||
|
#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)
|
self.my_rig.set_ptt(self.hamlib_ptt_type, 0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# --------------------------------------------------------------------------------------------------------
|
|
||||||
def play_audio(self):
|
def play_audio(self):
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
@ -126,11 +170,6 @@ class RF():
|
||||||
|
|
||||||
def transmit_signalling(self, data_out):
|
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)
|
self.c_lib.freedv_open.restype = ctypes.POINTER(ctypes.c_ubyte)
|
||||||
freedv = self.c_lib.freedv_open(static.FREEDV_SIGNALLING_MODE)
|
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)
|
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_rawdatatx(freedv, mod_out, data) # modulate DATA and safe it into mod_out pointer
|
||||||
self.c_lib.freedv_rawdatapostambletx(freedv, mod_out_postamble)
|
self.c_lib.freedv_rawdatapostambletx(freedv, mod_out_postamble)
|
||||||
|
|
||||||
|
self.streambuffer = bytearray()
|
||||||
txbuffer = bytearray()
|
self.streambuffer += bytes(mod_out_preamble)
|
||||||
txbuffer += bytes(mod_out_preamble)
|
self.streambuffer += bytes(mod_out)
|
||||||
txbuffer += bytes(mod_out)
|
self.streambuffer += bytes(mod_out_postamble)
|
||||||
txbuffer += bytes(mod_out_postamble)
|
|
||||||
|
|
||||||
# -------------- transmit audio
|
# -------------- transmit audio
|
||||||
logging.debug("SENDING SIGNALLING FRAME " + str(data_out))
|
#logging.debug("SENDING SIGNALLING FRAME " + str(data_out))
|
||||||
|
|
||||||
self.streambuffer = bytes()
|
state_before_transmit = static.CHANNEL_STATE
|
||||||
self.streambuffer += bytes(txbuffer)
|
static.CHANNEL_STATE = 'SENDING_SIGNALLING'
|
||||||
# double signalling frame transmission
|
|
||||||
self.streambuffer += bytes(txbuffer)
|
|
||||||
|
|
||||||
|
self.ptt_and_wait(True)
|
||||||
self.audio_writing_to_stream = True
|
self.audio_writing_to_stream = True
|
||||||
|
|
||||||
# wait until audio has been processed
|
# wait until audio has been processed
|
||||||
while self.audio_writing_to_stream == True:
|
while self.audio_writing_to_stream:
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
static.CHANNEL_STATE = 'SENDING_SIGNALLING'
|
static.CHANNEL_STATE = 'SENDING_SIGNALLING'
|
||||||
#print("sending signalling...")
|
|
||||||
|
|
||||||
self.my_rig.set_ptt(self.hamlib_ptt_type, 0)
|
self.ptt_and_wait(False)
|
||||||
static.PTT_STATE = False
|
|
||||||
static.CHANNEL_STATE = state_before_transmit
|
static.CHANNEL_STATE = state_before_transmit
|
||||||
|
|
||||||
self.c_lib.freedv_close(freedv)
|
self.c_lib.freedv_close(freedv)
|
||||||
# time.sleep(0.5)
|
|
||||||
# --------------------------------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------------------------------
|
||||||
# GET ARQ BURST FRAME VOM BUFFER AND MODULATE IT
|
# 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)
|
self.my_rig.set_ptt(self.hamlib_ptt_type, 1)
|
||||||
static.PTT_STATE = True
|
|
||||||
state_before_transmit = static.CHANNEL_STATE
|
state_before_transmit = static.CHANNEL_STATE
|
||||||
static.CHANNEL_STATE = 'SENDING_DATA'
|
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_rawdatatx(freedv, mod_out, data) # modulate DATA and safe it into mod_out pointer
|
||||||
self.c_lib.freedv_rawdatapostambletx(freedv, mod_out_postamble)
|
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)
|
||||||
#txbuffer += bytes(mod_out_postamble)
|
txbuffer += bytes(mod_out_postamble)
|
||||||
|
|
||||||
elif static.ARQ_RPT_RECEIVED == True:
|
elif static.ARQ_RPT_RECEIVED == True:
|
||||||
|
|
||||||
|
@ -323,6 +358,9 @@ class RF():
|
||||||
# self.stream_tx.write(bytes(txbuffer))
|
# self.stream_tx.write(bytes(txbuffer))
|
||||||
self.streambuffer = bytes()
|
self.streambuffer = bytes()
|
||||||
self.streambuffer = bytes(txbuffer)
|
self.streambuffer = bytes(txbuffer)
|
||||||
|
|
||||||
|
|
||||||
|
self.ptt_and_wait(True)
|
||||||
self.audio_writing_to_stream = True
|
self.audio_writing_to_stream = True
|
||||||
|
|
||||||
# wait until audio has been processed
|
# wait until audio has been processed
|
||||||
|
@ -332,8 +370,8 @@ class RF():
|
||||||
#print("sending data...")
|
#print("sending data...")
|
||||||
|
|
||||||
static.CHANNEL_STATE = 'RECEIVING_SIGNALLING'
|
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)
|
self.c_lib.freedv_close(freedv)
|
||||||
# --------------------------------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------------------------------
|
||||||
|
|
11
static.py
11
static.py
|
@ -45,10 +45,11 @@ PORT = 3000
|
||||||
# RIG_PTT_CM108
|
# RIG_PTT_CM108
|
||||||
# PTT control through CM108 GPIO pin
|
# PTT control through CM108 GPIO pin
|
||||||
|
|
||||||
HAMLIB_PTT_TYPE = 'RIG_PTT_NONE'
|
HAMLIB_PTT_TYPE = 'RTS'
|
||||||
PTT_STATE = False
|
PTT_STATE = False
|
||||||
|
|
||||||
|
HAMLIB_DEVICE_ID = 311
|
||||||
|
HAMLIB_DEVICE_PORT = '/dev/ttyUSB0'
|
||||||
# -------------------------
|
# -------------------------
|
||||||
# FreeDV Defaults
|
# FreeDV Defaults
|
||||||
FREEDV_RECEIVE = True
|
FREEDV_RECEIVE = True
|
||||||
|
@ -70,10 +71,10 @@ AUDIO_OUTPUT_DEVICE = 1
|
||||||
#TX_SAMPLE_STATE = None
|
#TX_SAMPLE_STATE = None
|
||||||
#RX_SAMPLE_STATE = None
|
#RX_SAMPLE_STATE = None
|
||||||
|
|
||||||
#AUDIO_SAMPLE_RATE_RX = 44100
|
AUDIO_SAMPLE_RATE_RX = 48000
|
||||||
#AUDIO_SAMPLE_RATE_TX = 44100
|
AUDIO_SAMPLE_RATE_TX = 48000
|
||||||
MODEM_SAMPLE_RATE = 8000 # 8000
|
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_CHANNELS = 1
|
||||||
AUDIO_RMS = 0
|
AUDIO_RMS = 0
|
||||||
# ---------------------------------
|
# ---------------------------------
|
||||||
|
|
Loading…
Reference in a new issue