mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
socket refactoring
This commit is contained in:
parent
8d7df97a92
commit
0199ed67cf
574
tnc/sock.py
574
tnc/sock.py
|
@ -127,9 +127,9 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler):
|
||||||
# iterate thorugh data list
|
# iterate thorugh data list
|
||||||
for commands in data:
|
for commands in data:
|
||||||
if self.server.server_address[1] == static.PORT:
|
if self.server.server_address[1] == static.PORT:
|
||||||
process_tnc_commands(commands)
|
self.process_tnc_commands(commands)
|
||||||
else:
|
else:
|
||||||
process_daemon_commands(commands)
|
self.process_daemon_commands(commands)
|
||||||
|
|
||||||
# wait some time between processing multiple commands
|
# wait some time between processing multiple commands
|
||||||
# this is only a first test to avoid doubled transmission
|
# this is only a first test to avoid doubled transmission
|
||||||
|
@ -190,8 +190,8 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler):
|
||||||
client=self.request,
|
client=self.request,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# ------------------------ TNC COMMANDS
|
||||||
def process_tnc_commands(data):
|
def process_tnc_commands(self, data):
|
||||||
"""
|
"""
|
||||||
process tnc commands
|
process tnc commands
|
||||||
|
|
||||||
|
@ -209,8 +209,72 @@ def process_tnc_commands(data):
|
||||||
received_json = json.loads(data)
|
received_json = json.loads(data)
|
||||||
log.debug("[SCK] CMD", command=received_json)
|
log.debug("[SCK] CMD", command=received_json)
|
||||||
|
|
||||||
# ENABLE TNC LISTENING STATE -----------------------------------------------------
|
# ENABLE TNC LISTENING STATE
|
||||||
if received_json["type"] == "set" and received_json["command"] == "listen":
|
if received_json["type"] == "set" and received_json["command"] == "listen":
|
||||||
|
self.tnc_set_listen(received_json)
|
||||||
|
|
||||||
|
# START STOP AUDIO RECORDING
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "record_audio":
|
||||||
|
self.tnc_set_record_audio(received_json)
|
||||||
|
|
||||||
|
# SET ENABLE/DISABLE RESPOND TO CALL
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "respond_to_call":
|
||||||
|
self.tnc_set_respond_to_call(received_json)
|
||||||
|
|
||||||
|
# SET ENABLE RESPOND TO CQ
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "respond_to_cq":
|
||||||
|
self.tnc_set_record_audio(received_json)
|
||||||
|
# SET TX AUDIO LEVEL
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "tx_audio_level":
|
||||||
|
self.tnc_set_tx_audio_level(received_json)
|
||||||
|
# TRANSMIT TEST FRAME
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "send_test_frame":
|
||||||
|
self.tnc_set_send_test_frame(received_json)
|
||||||
|
|
||||||
|
# CQ CQ CQ
|
||||||
|
if received_json["command"] == "cqcqcq":
|
||||||
|
self.tnc_cqcqcq(received_json)
|
||||||
|
# START_BEACON
|
||||||
|
if received_json["command"] == "start_beacon":
|
||||||
|
self.tnc_start_beacon(received_json)
|
||||||
|
|
||||||
|
# STOP_BEACON
|
||||||
|
if received_json["command"] == "stop_beacon":
|
||||||
|
self.tnc_stop_beacon(received_json)
|
||||||
|
|
||||||
|
# PING
|
||||||
|
if received_json["type"] == "ping" and received_json["command"] == "ping":
|
||||||
|
self.tnc_ping_ping(received_json)
|
||||||
|
# CONNECT
|
||||||
|
if received_json["type"] == "arq" and received_json["command"] == "connect":
|
||||||
|
self.tnc_arq_connect(received_json)
|
||||||
|
# DISCONNECT
|
||||||
|
if received_json["type"] == "arq" and received_json["command"] == "disconnect":
|
||||||
|
self.tnc_arq_disconnect(received_json)
|
||||||
|
# TRANSMIT RAW DATA
|
||||||
|
if received_json["type"] == "arq" and received_json["command"] == "send_raw":
|
||||||
|
self.tnc_arq_send_raw(received_json)
|
||||||
|
# STOP TRANSMISSION
|
||||||
|
if received_json["type"] == "arq" and received_json["command"] == "stop_transmission":
|
||||||
|
self.tnc_arq_stop_transmission(received_json)
|
||||||
|
# GET RX BUFFER
|
||||||
|
if received_json["type"] == "get" and received_json["command"] == "rx_buffer":
|
||||||
|
self.tnc_get_rx_buffer(received_json)
|
||||||
|
|
||||||
|
# DELETE RX BUFFER
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "del_rx_buffer":
|
||||||
|
self.tnc_set_del_rx_buffer(received_json)
|
||||||
|
# SET FREQUENCY
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "frequency":
|
||||||
|
self.tnc_set_frequency(received_json)
|
||||||
|
|
||||||
|
# SET MODE
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "mode":
|
||||||
|
self.tnc_set_mode(received_json)
|
||||||
|
|
||||||
|
except Exception as err:
|
||||||
|
log.error("[SCK] JSON decoding error", e=err)
|
||||||
|
def tnc_set_listen(self, received_json):
|
||||||
try:
|
try:
|
||||||
static.LISTEN = received_json["state"] in ['true', 'True', True, "ON", "on"]
|
static.LISTEN = received_json["state"] in ['true', 'True', True, "ON", "on"]
|
||||||
command_response("listen", True)
|
command_response("listen", True)
|
||||||
|
@ -227,9 +291,7 @@ def process_tnc_commands(data):
|
||||||
log.warning(
|
log.warning(
|
||||||
"[SCK] CQ command execution error", e=err, command=received_json
|
"[SCK] CQ command execution error", e=err, command=received_json
|
||||||
)
|
)
|
||||||
|
def tnc_set_record_audio(self, received_json):
|
||||||
# START STOP AUDIO RECORDING -----------------------------------------------------
|
|
||||||
if received_json["type"] == "set" and received_json["command"] == "record_audio":
|
|
||||||
try:
|
try:
|
||||||
if not static.AUDIO_RECORD:
|
if not static.AUDIO_RECORD:
|
||||||
static.AUDIO_RECORD_FILE = wave.open(f"{int(time.time())}_audio_recording.wav", 'w')
|
static.AUDIO_RECORD_FILE = wave.open(f"{int(time.time())}_audio_recording.wav", 'w')
|
||||||
|
@ -249,9 +311,7 @@ def process_tnc_commands(data):
|
||||||
"[SCK] CQ command execution error", e=err, command=received_json
|
"[SCK] CQ command execution error", e=err, command=received_json
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def tnc_set_respond_to_call(self, received_json):
|
||||||
# SET ENABLE/DISABLE RESPOND TO CALL -----------------------------------------------------
|
|
||||||
if received_json["type"] == "set" and received_json["command"] == "respond_to_call":
|
|
||||||
try:
|
try:
|
||||||
static.RESPOND_TO_CALL = received_json["state"] in ['true', 'True', True]
|
static.RESPOND_TO_CALL = received_json["state"] in ['true', 'True', True]
|
||||||
command_response("respond_to_call", True)
|
command_response("respond_to_call", True)
|
||||||
|
@ -262,8 +322,7 @@ def process_tnc_commands(data):
|
||||||
"[SCK] CQ command execution error", e=err, command=received_json
|
"[SCK] CQ command execution error", e=err, command=received_json
|
||||||
)
|
)
|
||||||
|
|
||||||
# SET ENABLE RESPOND TO CQ -----------------------------------------------------
|
def tnc_set_respond_to_cq(self, received_json):
|
||||||
if received_json["type"] == "set" and received_json["command"] == "respond_to_cq":
|
|
||||||
try:
|
try:
|
||||||
static.RESPOND_TO_CQ = received_json["state"] in ['true', 'True', True]
|
static.RESPOND_TO_CQ = received_json["state"] in ['true', 'True', True]
|
||||||
command_response("respond_to_cq", True)
|
command_response("respond_to_cq", True)
|
||||||
|
@ -274,11 +333,7 @@ def process_tnc_commands(data):
|
||||||
"[SCK] CQ command execution error", e=err, command=received_json
|
"[SCK] CQ command execution error", e=err, command=received_json
|
||||||
)
|
)
|
||||||
|
|
||||||
# SET TX AUDIO LEVEL -----------------------------------------------------
|
def tnc_set_tx_audio_level(self, received_json):
|
||||||
if (
|
|
||||||
received_json["type"] == "set"
|
|
||||||
and received_json["command"] == "tx_audio_level"
|
|
||||||
):
|
|
||||||
try:
|
try:
|
||||||
static.TX_AUDIO_LEVEL = int(received_json["value"])
|
static.TX_AUDIO_LEVEL = int(received_json["value"])
|
||||||
command_response("tx_audio_level", True)
|
command_response("tx_audio_level", True)
|
||||||
|
@ -291,11 +346,7 @@ def process_tnc_commands(data):
|
||||||
command=received_json,
|
command=received_json,
|
||||||
)
|
)
|
||||||
|
|
||||||
# TRANSMIT TEST FRAME ----------------------------------------------------
|
def tnc_set_send_test_frame(self, received_json):
|
||||||
if (
|
|
||||||
received_json["type"] == "set"
|
|
||||||
and received_json["command"] == "send_test_frame"
|
|
||||||
):
|
|
||||||
try:
|
try:
|
||||||
DATA_QUEUE_TRANSMIT.put(["SEND_TEST_FRAME"])
|
DATA_QUEUE_TRANSMIT.put(["SEND_TEST_FRAME"])
|
||||||
command_response("send_test_frame", True)
|
command_response("send_test_frame", True)
|
||||||
|
@ -306,9 +357,7 @@ def process_tnc_commands(data):
|
||||||
e=err,
|
e=err,
|
||||||
command=received_json,
|
command=received_json,
|
||||||
)
|
)
|
||||||
|
def tnc_cqcqcq(self, received_json):
|
||||||
# CQ CQ CQ -----------------------------------------------------
|
|
||||||
if received_json["command"] == "cqcqcq":
|
|
||||||
try:
|
try:
|
||||||
DATA_QUEUE_TRANSMIT.put(["CQ"])
|
DATA_QUEUE_TRANSMIT.put(["CQ"])
|
||||||
command_response("cqcqcq", True)
|
command_response("cqcqcq", True)
|
||||||
|
@ -319,8 +368,7 @@ def process_tnc_commands(data):
|
||||||
"[SCK] CQ command execution error", e=err, command=received_json
|
"[SCK] CQ command execution error", e=err, command=received_json
|
||||||
)
|
)
|
||||||
|
|
||||||
# START_BEACON -----------------------------------------------------
|
def tnc_start_beacon(self, received_json):
|
||||||
if received_json["command"] == "start_beacon":
|
|
||||||
try:
|
try:
|
||||||
static.BEACON_STATE = True
|
static.BEACON_STATE = True
|
||||||
interval = int(received_json["parameter"])
|
interval = int(received_json["parameter"])
|
||||||
|
@ -333,9 +381,7 @@ def process_tnc_commands(data):
|
||||||
e=err,
|
e=err,
|
||||||
command=received_json,
|
command=received_json,
|
||||||
)
|
)
|
||||||
|
def tnc_stop_beacon(self, received_json):
|
||||||
# STOP_BEACON -----------------------------------------------------
|
|
||||||
if received_json["command"] == "stop_beacon":
|
|
||||||
try:
|
try:
|
||||||
log.warning("[SCK] Stopping beacon!")
|
log.warning("[SCK] Stopping beacon!")
|
||||||
static.BEACON_STATE = False
|
static.BEACON_STATE = False
|
||||||
|
@ -348,9 +394,7 @@ def process_tnc_commands(data):
|
||||||
e=err,
|
e=err,
|
||||||
command=received_json,
|
command=received_json,
|
||||||
)
|
)
|
||||||
|
def tnc_ping_ping(self, received_json):
|
||||||
# PING ----------------------------------------------------------
|
|
||||||
if received_json["type"] == "ping" and received_json["command"] == "ping":
|
|
||||||
# send ping frame and wait for ACK
|
# send ping frame and wait for ACK
|
||||||
try:
|
try:
|
||||||
dxcallsign = received_json["dxcallsign"]
|
dxcallsign = received_json["dxcallsign"]
|
||||||
|
@ -383,8 +427,7 @@ def process_tnc_commands(data):
|
||||||
"[SCK] PING command execution error", e=err, command=received_json
|
"[SCK] PING command execution error", e=err, command=received_json
|
||||||
)
|
)
|
||||||
|
|
||||||
# CONNECT ----------------------------------------------------------
|
def tnc_arq_connect(self, received_json):
|
||||||
if received_json["type"] == "arq" and received_json["command"] == "connect":
|
|
||||||
|
|
||||||
# pause our beacon first
|
# pause our beacon first
|
||||||
static.BEACON_PAUSE = True
|
static.BEACON_PAUSE = True
|
||||||
|
@ -442,8 +485,7 @@ def process_tnc_commands(data):
|
||||||
# allow beacon transmission again
|
# allow beacon transmission again
|
||||||
static.BEACON_PAUSE = False
|
static.BEACON_PAUSE = False
|
||||||
|
|
||||||
# DISCONNECT ----------------------------------------------------------
|
def tnc_arq_disconnect(self, received_json):
|
||||||
if received_json["type"] == "arq" and received_json["command"] == "disconnect":
|
|
||||||
try:
|
try:
|
||||||
if static.ARQ_SESSION_STATE not in ["disconnecting", "disconnected", "failed"]:
|
if static.ARQ_SESSION_STATE not in ["disconnecting", "disconnected", "failed"]:
|
||||||
DATA_QUEUE_TRANSMIT.put(["DISCONNECT"])
|
DATA_QUEUE_TRANSMIT.put(["DISCONNECT"])
|
||||||
|
@ -466,8 +508,7 @@ def process_tnc_commands(data):
|
||||||
command=received_json,
|
command=received_json,
|
||||||
)
|
)
|
||||||
|
|
||||||
# TRANSMIT RAW DATA -------------------------------------------
|
def tnc_arq_send_raw(self, received_json):
|
||||||
if received_json["type"] == "arq" and received_json["command"] == "send_raw":
|
|
||||||
static.BEACON_PAUSE = True
|
static.BEACON_PAUSE = True
|
||||||
|
|
||||||
# wait some random time
|
# wait some random time
|
||||||
|
@ -541,11 +582,7 @@ def process_tnc_commands(data):
|
||||||
command=received_json,
|
command=received_json,
|
||||||
)
|
)
|
||||||
|
|
||||||
# STOP TRANSMISSION ----------------------------------------------------------
|
def tnc_arq_stop_transmission(self, received_json):
|
||||||
if (
|
|
||||||
received_json["type"] == "arq"
|
|
||||||
and received_json["command"] == "stop_transmission"
|
|
||||||
):
|
|
||||||
try:
|
try:
|
||||||
if static.TNC_STATE == "BUSY" or static.ARQ_STATE:
|
if static.TNC_STATE == "BUSY" or static.ARQ_STATE:
|
||||||
DATA_QUEUE_TRANSMIT.put(["STOP"])
|
DATA_QUEUE_TRANSMIT.put(["STOP"])
|
||||||
|
@ -559,7 +596,7 @@ def process_tnc_commands(data):
|
||||||
"[SCK] STOP command execution error", e=err, command=received_json
|
"[SCK] STOP command execution error", e=err, command=received_json
|
||||||
)
|
)
|
||||||
|
|
||||||
if received_json["type"] == "get" and received_json["command"] == "rx_buffer":
|
def tnc_get_rx_buffer(self, received_json):
|
||||||
try:
|
try:
|
||||||
if not RX_BUFFER.empty():
|
if not RX_BUFFER.empty():
|
||||||
output = {
|
output = {
|
||||||
|
@ -591,10 +628,7 @@ def process_tnc_commands(data):
|
||||||
command=received_json,
|
command=received_json,
|
||||||
)
|
)
|
||||||
|
|
||||||
if (
|
def tnc_set_del_rx_buffer(self, received_json):
|
||||||
received_json["type"] == "set"
|
|
||||||
and received_json["command"] == "del_rx_buffer"
|
|
||||||
):
|
|
||||||
try:
|
try:
|
||||||
RX_BUFFER.queue.clear()
|
RX_BUFFER.queue.clear()
|
||||||
command_response("del_rx_buffer", True)
|
command_response("del_rx_buffer", True)
|
||||||
|
@ -606,21 +640,7 @@ def process_tnc_commands(data):
|
||||||
command=received_json,
|
command=received_json,
|
||||||
)
|
)
|
||||||
|
|
||||||
# SET FREQUENCY -----------------------------------------------------
|
def tnc_set_mode(self, received_json):
|
||||||
if received_json["command"] == "frequency" and received_json["type"] == "set":
|
|
||||||
try:
|
|
||||||
RIGCTLD_COMMAND_QUEUE.put(["set_frequency", received_json["frequency"]])
|
|
||||||
command_response("set_frequency", True)
|
|
||||||
except Exception as err:
|
|
||||||
command_response("set_frequency", False)
|
|
||||||
log.warning(
|
|
||||||
"[SCK] Set frequency command execution error",
|
|
||||||
e=err,
|
|
||||||
command=received_json,
|
|
||||||
)
|
|
||||||
|
|
||||||
# SET MODE -----------------------------------------------------
|
|
||||||
if received_json["command"] == "mode" and received_json["type"] == "set":
|
|
||||||
try:
|
try:
|
||||||
RIGCTLD_COMMAND_QUEUE.put(["set_mode", received_json["mode"]])
|
RIGCTLD_COMMAND_QUEUE.put(["set_mode", received_json["mode"]])
|
||||||
command_response("set_mode", True)
|
command_response("set_mode", True)
|
||||||
|
@ -632,10 +652,234 @@ def process_tnc_commands(data):
|
||||||
command=received_json,
|
command=received_json,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def tnc_set_frequency(self, received_json):
|
||||||
|
try:
|
||||||
|
RIGCTLD_COMMAND_QUEUE.put(["set_frequency", received_json["frequency"]])
|
||||||
|
command_response("set_frequency", True)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
log.error("[SCK] JSON decoding error", e=err)
|
command_response("set_frequency", False)
|
||||||
|
log.warning(
|
||||||
|
"[SCK] Set frequency command execution error",
|
||||||
|
e=err,
|
||||||
|
command=received_json,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------ DAEMON COMMANDS
|
||||||
|
def process_daemon_commands(self, data):
|
||||||
|
"""
|
||||||
|
process daemon commands
|
||||||
|
|
||||||
|
Args:
|
||||||
|
data:
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
"""
|
||||||
|
log = structlog.get_logger("process_daemon_commands")
|
||||||
|
|
||||||
|
# convert data to json object
|
||||||
|
received_json = json.loads(data)
|
||||||
|
log.debug("[SCK] CMD", command=received_json)
|
||||||
|
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "mycallsign":
|
||||||
|
self.daemon_set_mycallsign(received_json)
|
||||||
|
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "mygrid":
|
||||||
|
self.daemon_set_mygrid(received_json)
|
||||||
|
|
||||||
|
if (
|
||||||
|
received_json["type"] == "set"
|
||||||
|
and received_json["command"] == "start_tnc"
|
||||||
|
and not static.TNCSTARTED
|
||||||
|
):
|
||||||
|
self.daemon_start_tnc(received_json)
|
||||||
|
|
||||||
|
if received_json["type"] == "get" and received_json["command"] == "test_hamlib":
|
||||||
|
self.daemon_test_hamlib(received_json)
|
||||||
|
|
||||||
|
if received_json["type"] == "set" and received_json["command"] == "stop_tnc":
|
||||||
|
self.daemon_stop_tnc(received_json)
|
||||||
|
|
||||||
|
def daemon_set_mycallsign(self, received_json):
|
||||||
|
try:
|
||||||
|
callsign = received_json["parameter"]
|
||||||
|
|
||||||
|
if bytes(callsign, "utf-8") == b"":
|
||||||
|
self.request.sendall(b"INVALID CALLSIGN")
|
||||||
|
log.warning(
|
||||||
|
"[SCK] SET MYCALL FAILED",
|
||||||
|
call=static.MYCALLSIGN,
|
||||||
|
crc=static.MYCALLSIGN_CRC.hex(),
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
static.MYCALLSIGN = bytes(callsign, "utf-8")
|
||||||
|
static.MYCALLSIGN_CRC = helpers.get_crc_24(static.MYCALLSIGN)
|
||||||
|
|
||||||
|
command_response("mycallsign", True)
|
||||||
|
log.info(
|
||||||
|
"[SCK] SET MYCALL",
|
||||||
|
call=static.MYCALLSIGN,
|
||||||
|
crc=static.MYCALLSIGN_CRC.hex(),
|
||||||
|
)
|
||||||
|
except Exception as err:
|
||||||
|
command_response("mycallsign", False)
|
||||||
|
log.warning("[SCK] command execution error", e=err, command=received_json)
|
||||||
|
|
||||||
|
def daemon_set_mygrid(self, received_json):
|
||||||
|
try:
|
||||||
|
mygrid = received_json["parameter"]
|
||||||
|
|
||||||
|
if bytes(mygrid, "utf-8") == b"":
|
||||||
|
self.request.sendall(b"INVALID GRID")
|
||||||
|
command_response("mygrid", False)
|
||||||
|
else:
|
||||||
|
static.MYGRID = bytes(mygrid, "utf-8")
|
||||||
|
log.info("[SCK] SET MYGRID", grid=static.MYGRID)
|
||||||
|
command_response("mygrid", True)
|
||||||
|
except Exception as err:
|
||||||
|
command_response("mygrid", False)
|
||||||
|
log.warning("[SCK] command execution error", e=err, command=received_json)
|
||||||
|
|
||||||
|
def daemon_start_tnc(self, received_json):
|
||||||
|
try:
|
||||||
|
startparam = received_json["parameter"][0]
|
||||||
|
|
||||||
|
mycall = str(helpers.return_key_from_object("AA0AA", startparam, "mycall"))
|
||||||
|
mygrid = str(helpers.return_key_from_object("JN12ab", startparam, "mygrid"))
|
||||||
|
rx_audio = str(helpers.return_key_from_object("0", startparam, "rx_audio"))
|
||||||
|
tx_audio = str(helpers.return_key_from_object("0", startparam, "tx_audio"))
|
||||||
|
radiocontrol = str(helpers.return_key_from_object("disabled", startparam, "radiocontrol"))
|
||||||
|
rigctld_ip = str(helpers.return_key_from_object("127.0.0.1", startparam, "rigctld_ip"))
|
||||||
|
rigctld_port = str(helpers.return_key_from_object("4532", startparam, "rigctld_port"))
|
||||||
|
enable_scatter = str(helpers.return_key_from_object("True", startparam, "enable_scatter"))
|
||||||
|
enable_fft = str(helpers.return_key_from_object("True", startparam, "enable_fft"))
|
||||||
|
enable_fsk = str(helpers.return_key_from_object("False", startparam, "enable_fsk"))
|
||||||
|
low_bandwidth_mode = str(helpers.return_key_from_object("False", startparam, "low_bandwidth_mode"))
|
||||||
|
tuning_range_fmin = str(helpers.return_key_from_object("-50", startparam, "tuning_range_fmin"))
|
||||||
|
tuning_range_fmax = str(helpers.return_key_from_object("50", startparam, "tuning_range_fmax"))
|
||||||
|
tx_audio_level = str(helpers.return_key_from_object("100", startparam, "tx_audio_level"))
|
||||||
|
respond_to_cq = str(helpers.return_key_from_object("False", startparam, "respond_to_cq"))
|
||||||
|
rx_buffer_size = str(helpers.return_key_from_object("16", startparam, "rx_buffer_size"))
|
||||||
|
enable_explorer = str(helpers.return_key_from_object("False", startparam, "enable_explorer"))
|
||||||
|
enable_auto_tune = str(helpers.return_key_from_object("False", startparam, "enable_auto_tune"))
|
||||||
|
enable_stats = str(helpers.return_key_from_object("False", startparam, "enable_stats"))
|
||||||
|
try:
|
||||||
|
# convert ssid list to python list
|
||||||
|
ssid_list = str(helpers.return_key_from_object("0, 1, 2, 3, 4, 5, 6, 7, 8, 9", startparam, "ssid_list"))
|
||||||
|
ssid_list = ssid_list.replace(" ", "")
|
||||||
|
ssid_list = ssid_list.split(",")
|
||||||
|
# convert str to int
|
||||||
|
ssid_list = list(map(int, ssid_list))
|
||||||
|
except KeyError:
|
||||||
|
ssid_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||||
|
|
||||||
|
# print some debugging parameters
|
||||||
|
for item in startparam:
|
||||||
|
log.debug(
|
||||||
|
f"[SCK] TNC Startup Config : {item}",
|
||||||
|
value=startparam[item],
|
||||||
|
)
|
||||||
|
|
||||||
|
DAEMON_QUEUE.put(
|
||||||
|
[
|
||||||
|
"STARTTNC",
|
||||||
|
mycall,
|
||||||
|
mygrid,
|
||||||
|
rx_audio,
|
||||||
|
tx_audio,
|
||||||
|
radiocontrol,
|
||||||
|
rigctld_ip,
|
||||||
|
rigctld_port,
|
||||||
|
enable_scatter,
|
||||||
|
enable_fft,
|
||||||
|
low_bandwidth_mode,
|
||||||
|
tuning_range_fmin,
|
||||||
|
tuning_range_fmax,
|
||||||
|
enable_fsk,
|
||||||
|
tx_audio_level,
|
||||||
|
respond_to_cq,
|
||||||
|
rx_buffer_size,
|
||||||
|
enable_explorer,
|
||||||
|
ssid_list,
|
||||||
|
enable_auto_tune,
|
||||||
|
enable_stats
|
||||||
|
]
|
||||||
|
)
|
||||||
|
command_response("start_tnc", True)
|
||||||
|
|
||||||
|
except Exception as err:
|
||||||
|
command_response("start_tnc", False)
|
||||||
|
log.warning("[SCK] command execution error", e=err, command=received_json)
|
||||||
|
|
||||||
|
def daemon_stop_tnc(self, received_json):
|
||||||
|
try:
|
||||||
|
static.TNCPROCESS.kill()
|
||||||
|
# unregister process from atexit to avoid process zombies
|
||||||
|
atexit.unregister(static.TNCPROCESS.kill)
|
||||||
|
|
||||||
|
log.warning("[SCK] Stopping TNC")
|
||||||
|
static.TNCSTARTED = False
|
||||||
|
command_response("stop_tnc", True)
|
||||||
|
except Exception as err:
|
||||||
|
command_response("stop_tnc", False)
|
||||||
|
log.warning("[SCK] command execution error", e=err, command=received_json)
|
||||||
|
|
||||||
|
def daemon_test_hamlib(self, received_json):
|
||||||
|
try:
|
||||||
|
radiocontrol = str(received_json["parameter"][0]["radiocontrol"])
|
||||||
|
rigctld_ip = str(received_json["parameter"][0]["rigctld_ip"])
|
||||||
|
rigctld_port = str(received_json["parameter"][0]["rigctld_port"])
|
||||||
|
|
||||||
|
DAEMON_QUEUE.put(
|
||||||
|
[
|
||||||
|
"TEST_HAMLIB",
|
||||||
|
radiocontrol,
|
||||||
|
rigctld_ip,
|
||||||
|
rigctld_port,
|
||||||
|
]
|
||||||
|
)
|
||||||
|
command_response("test_hamlib", True)
|
||||||
|
except Exception as err:
|
||||||
|
command_response("test_hamlib", False)
|
||||||
|
log.warning("[SCK] command execution error", e=err, command=received_json)
|
||||||
|
|
||||||
|
|
||||||
|
def send_daemon_state():
|
||||||
|
"""
|
||||||
|
send the daemon state to network
|
||||||
|
"""
|
||||||
|
log = structlog.get_logger("send_daemon_state")
|
||||||
|
|
||||||
|
try:
|
||||||
|
python_version = f"{str(sys.version_info[0])}.{str(sys.version_info[1])}"
|
||||||
|
|
||||||
|
output = {
|
||||||
|
"command": "daemon_state",
|
||||||
|
"daemon_state": [],
|
||||||
|
"python_version": str(python_version),
|
||||||
|
"input_devices": static.AUDIO_INPUT_DEVICES,
|
||||||
|
"output_devices": static.AUDIO_OUTPUT_DEVICES,
|
||||||
|
"serial_devices": static.SERIAL_DEVICES,
|
||||||
|
#'cpu': str(psutil.cpu_percent()),
|
||||||
|
#'ram': str(psutil.virtual_memory().percent),
|
||||||
|
"version": "0.1",
|
||||||
|
}
|
||||||
|
|
||||||
|
if static.TNCSTARTED:
|
||||||
|
output["daemon_state"].append({"status": "running"})
|
||||||
|
else:
|
||||||
|
output["daemon_state"].append({"status": "stopped"})
|
||||||
|
|
||||||
|
return json.dumps(output)
|
||||||
|
except Exception as err:
|
||||||
|
log.warning("[SCK] error", e=err)
|
||||||
|
return None
|
||||||
|
|
||||||
def send_tnc_state():
|
def send_tnc_state():
|
||||||
"""
|
"""
|
||||||
send the tnc state to network
|
send the tnc state to network
|
||||||
|
@ -699,204 +943,6 @@ def send_tnc_state():
|
||||||
return json.dumps(output)
|
return json.dumps(output)
|
||||||
|
|
||||||
|
|
||||||
# This appears to have been taken out of a class, but is never called because
|
|
||||||
# the `self.request.sendall` call is a syntax error as `self` is undefined and
|
|
||||||
# we don't see errors in use.
|
|
||||||
def process_daemon_commands(data):
|
|
||||||
"""
|
|
||||||
process daemon commands
|
|
||||||
|
|
||||||
Args:
|
|
||||||
data:
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
"""
|
|
||||||
log = structlog.get_logger("process_daemon_commands")
|
|
||||||
|
|
||||||
# convert data to json object
|
|
||||||
received_json = json.loads(data)
|
|
||||||
log.debug("[SCK] CMD", command=received_json)
|
|
||||||
if received_json["type"] == "set" and received_json["command"] == "mycallsign":
|
|
||||||
try:
|
|
||||||
callsign = received_json["parameter"]
|
|
||||||
|
|
||||||
if bytes(callsign, "utf-8") == b"":
|
|
||||||
self.request.sendall(b"INVALID CALLSIGN")
|
|
||||||
log.warning(
|
|
||||||
"[SCK] SET MYCALL FAILED",
|
|
||||||
call=static.MYCALLSIGN,
|
|
||||||
crc=static.MYCALLSIGN_CRC.hex(),
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
static.MYCALLSIGN = bytes(callsign, "utf-8")
|
|
||||||
static.MYCALLSIGN_CRC = helpers.get_crc_24(static.MYCALLSIGN)
|
|
||||||
|
|
||||||
command_response("mycallsign", True)
|
|
||||||
log.info(
|
|
||||||
"[SCK] SET MYCALL",
|
|
||||||
call=static.MYCALLSIGN,
|
|
||||||
crc=static.MYCALLSIGN_CRC.hex(),
|
|
||||||
)
|
|
||||||
except Exception as err:
|
|
||||||
command_response("mycallsign", False)
|
|
||||||
log.warning("[SCK] command execution error", e=err, command=received_json)
|
|
||||||
|
|
||||||
if received_json["type"] == "set" and received_json["command"] == "mygrid":
|
|
||||||
try:
|
|
||||||
mygrid = received_json["parameter"]
|
|
||||||
|
|
||||||
if bytes(mygrid, "utf-8") == b"":
|
|
||||||
self.request.sendall(b"INVALID GRID")
|
|
||||||
command_response("mygrid", False)
|
|
||||||
else:
|
|
||||||
static.MYGRID = bytes(mygrid, "utf-8")
|
|
||||||
log.info("[SCK] SET MYGRID", grid=static.MYGRID)
|
|
||||||
command_response("mygrid", True)
|
|
||||||
except Exception as err:
|
|
||||||
command_response("mygrid", False)
|
|
||||||
log.warning("[SCK] command execution error", e=err, command=received_json)
|
|
||||||
|
|
||||||
if (
|
|
||||||
received_json["type"] == "set"
|
|
||||||
and received_json["command"] == "start_tnc"
|
|
||||||
and not static.TNCSTARTED
|
|
||||||
):
|
|
||||||
try:
|
|
||||||
startparam = received_json["parameter"][0]
|
|
||||||
|
|
||||||
mycall = str(helpers.return_key_from_object("AA0AA", startparam,"mycall"))
|
|
||||||
mygrid = str(helpers.return_key_from_object("JN12ab", startparam,"mygrid"))
|
|
||||||
rx_audio = str(helpers.return_key_from_object("0", startparam,"rx_audio"))
|
|
||||||
tx_audio = str(helpers.return_key_from_object("0", startparam,"tx_audio"))
|
|
||||||
radiocontrol = str(helpers.return_key_from_object("disabled", startparam,"radiocontrol"))
|
|
||||||
rigctld_ip = str(helpers.return_key_from_object("127.0.0.1", startparam,"rigctld_ip"))
|
|
||||||
rigctld_port = str(helpers.return_key_from_object("4532", startparam,"rigctld_port"))
|
|
||||||
enable_scatter = str(helpers.return_key_from_object("True", startparam,"enable_scatter"))
|
|
||||||
enable_fft = str(helpers.return_key_from_object("True", startparam,"enable_fft"))
|
|
||||||
enable_fsk = str(helpers.return_key_from_object("False", startparam,"enable_fsk"))
|
|
||||||
low_bandwidth_mode = str(helpers.return_key_from_object("False", startparam,"low_bandwidth_mode"))
|
|
||||||
tuning_range_fmin = str(helpers.return_key_from_object("-50", startparam,"tuning_range_fmin"))
|
|
||||||
tuning_range_fmax = str(helpers.return_key_from_object("50", startparam,"tuning_range_fmax"))
|
|
||||||
tx_audio_level = str(helpers.return_key_from_object("100", startparam,"tx_audio_level"))
|
|
||||||
respond_to_cq = str(helpers.return_key_from_object("False", startparam,"respond_to_cq"))
|
|
||||||
rx_buffer_size = str(helpers.return_key_from_object("16", startparam,"rx_buffer_size"))
|
|
||||||
enable_explorer = str(helpers.return_key_from_object("False", startparam,"enable_explorer"))
|
|
||||||
enable_auto_tune = str(helpers.return_key_from_object("False", startparam,"enable_auto_tune"))
|
|
||||||
enable_stats = str(helpers.return_key_from_object("False", startparam,"enable_stats"))
|
|
||||||
try:
|
|
||||||
# convert ssid list to python list
|
|
||||||
ssid_list = str(helpers.return_key_from_object("0, 1, 2, 3, 4, 5, 6, 7, 8, 9", startparam, "ssid_list"))
|
|
||||||
ssid_list = ssid_list.replace(" ", "")
|
|
||||||
ssid_list = ssid_list.split(",")
|
|
||||||
# convert str to int
|
|
||||||
ssid_list = list(map(int, ssid_list))
|
|
||||||
except KeyError:
|
|
||||||
ssid_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
||||||
|
|
||||||
# print some debugging parameters
|
|
||||||
for item in startparam:
|
|
||||||
log.debug(
|
|
||||||
f"[SCK] TNC Startup Config : {item}",
|
|
||||||
value=startparam[item],
|
|
||||||
)
|
|
||||||
|
|
||||||
DAEMON_QUEUE.put(
|
|
||||||
[
|
|
||||||
"STARTTNC",
|
|
||||||
mycall,
|
|
||||||
mygrid,
|
|
||||||
rx_audio,
|
|
||||||
tx_audio,
|
|
||||||
radiocontrol,
|
|
||||||
rigctld_ip,
|
|
||||||
rigctld_port,
|
|
||||||
enable_scatter,
|
|
||||||
enable_fft,
|
|
||||||
low_bandwidth_mode,
|
|
||||||
tuning_range_fmin,
|
|
||||||
tuning_range_fmax,
|
|
||||||
enable_fsk,
|
|
||||||
tx_audio_level,
|
|
||||||
respond_to_cq,
|
|
||||||
rx_buffer_size,
|
|
||||||
enable_explorer,
|
|
||||||
ssid_list,
|
|
||||||
enable_auto_tune,
|
|
||||||
enable_stats
|
|
||||||
]
|
|
||||||
)
|
|
||||||
command_response("start_tnc", True)
|
|
||||||
|
|
||||||
except Exception as err:
|
|
||||||
command_response("start_tnc", False)
|
|
||||||
log.warning("[SCK] command execution error", e=err, command=received_json)
|
|
||||||
|
|
||||||
if received_json["type"] == "get" and received_json["command"] == "test_hamlib":
|
|
||||||
try:
|
|
||||||
radiocontrol = str(received_json["parameter"][0]["radiocontrol"])
|
|
||||||
rigctld_ip = str(received_json["parameter"][0]["rigctld_ip"])
|
|
||||||
rigctld_port = str(received_json["parameter"][0]["rigctld_port"])
|
|
||||||
|
|
||||||
DAEMON_QUEUE.put(
|
|
||||||
[
|
|
||||||
"TEST_HAMLIB",
|
|
||||||
radiocontrol,
|
|
||||||
rigctld_ip,
|
|
||||||
rigctld_port,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
command_response("test_hamlib", True)
|
|
||||||
except Exception as err:
|
|
||||||
command_response("test_hamlib", False)
|
|
||||||
log.warning("[SCK] command execution error", e=err, command=received_json)
|
|
||||||
|
|
||||||
if received_json["type"] == "set" and received_json["command"] == "stop_tnc":
|
|
||||||
try:
|
|
||||||
static.TNCPROCESS.kill()
|
|
||||||
# unregister process from atexit to avoid process zombies
|
|
||||||
atexit.unregister(static.TNCPROCESS.kill)
|
|
||||||
|
|
||||||
log.warning("[SCK] Stopping TNC")
|
|
||||||
static.TNCSTARTED = False
|
|
||||||
command_response("stop_tnc", True)
|
|
||||||
except Exception as err:
|
|
||||||
command_response("stop_tnc", False)
|
|
||||||
log.warning("[SCK] command execution error", e=err, command=received_json)
|
|
||||||
|
|
||||||
|
|
||||||
def send_daemon_state():
|
|
||||||
"""
|
|
||||||
send the daemon state to network
|
|
||||||
"""
|
|
||||||
log = structlog.get_logger("send_daemon_state")
|
|
||||||
|
|
||||||
try:
|
|
||||||
python_version = f"{str(sys.version_info[0])}.{str(sys.version_info[1])}"
|
|
||||||
|
|
||||||
output = {
|
|
||||||
"command": "daemon_state",
|
|
||||||
"daemon_state": [],
|
|
||||||
"python_version": str(python_version),
|
|
||||||
"input_devices": static.AUDIO_INPUT_DEVICES,
|
|
||||||
"output_devices": static.AUDIO_OUTPUT_DEVICES,
|
|
||||||
"serial_devices": static.SERIAL_DEVICES,
|
|
||||||
#'cpu': str(psutil.cpu_percent()),
|
|
||||||
#'ram': str(psutil.virtual_memory().percent),
|
|
||||||
"version": "0.1",
|
|
||||||
}
|
|
||||||
|
|
||||||
if static.TNCSTARTED:
|
|
||||||
output["daemon_state"].append({"status": "running"})
|
|
||||||
else:
|
|
||||||
output["daemon_state"].append({"status": "stopped"})
|
|
||||||
|
|
||||||
return json.dumps(output)
|
|
||||||
except Exception as err:
|
|
||||||
log.warning("[SCK] error", e=err)
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def command_response(command, status):
|
def command_response(command, status):
|
||||||
s_status = "OK" if status else "Failed"
|
s_status = "OK" if status else "Failed"
|
||||||
jsondata = {"command_response": command, "status": s_status}
|
jsondata = {"command_response": command, "status": s_status}
|
||||||
|
|
Loading…
Reference in a new issue