2021-02-16 13:23:57 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
|
|
Created on Fri Dec 25 21:25:14 2020
|
|
|
|
|
|
|
|
@author: DJ2LS
|
2021-08-08 09:08:34 +00:00
|
|
|
|
|
|
|
# GET COMMANDS
|
|
|
|
# "command" : "..."
|
|
|
|
|
|
|
|
# SET COMMANDS
|
|
|
|
# "command" : "..."
|
|
|
|
# "parameter" : " ..."
|
|
|
|
|
|
|
|
# DATA COMMANDS
|
|
|
|
# "command" : "..."
|
|
|
|
# "type" : "..."
|
|
|
|
# "dxcallsign" : "..."
|
|
|
|
# "data" : "..."
|
|
|
|
|
2021-02-16 13:23:57 +00:00
|
|
|
"""
|
|
|
|
|
|
|
|
import socketserver
|
|
|
|
import threading
|
2021-08-23 16:14:00 +00:00
|
|
|
import ujson as json
|
2021-03-17 10:22:06 +00:00
|
|
|
import time
|
2021-02-16 13:23:57 +00:00
|
|
|
import static
|
2021-02-24 13:22:28 +00:00
|
|
|
import data_handler
|
2021-02-16 19:49:02 +00:00
|
|
|
import helpers
|
2021-09-25 13:24:25 +00:00
|
|
|
import sys
|
|
|
|
import os
|
2021-11-18 18:40:22 +00:00
|
|
|
import logging, structlog, log_handler
|
2022-01-20 19:38:56 +00:00
|
|
|
import queue
|
2022-01-22 19:39:37 +00:00
|
|
|
import psutil
|
|
|
|
import audio
|
2021-11-18 18:40:22 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
SOCKET_QUEUE = queue.Queue()
|
2022-01-22 19:39:37 +00:00
|
|
|
DAEMON_QUEUE = queue.Queue()
|
2021-09-23 15:49:45 +00:00
|
|
|
|
2022-01-22 19:39:37 +00:00
|
|
|
CONNECTED_CLIENTS = set()
|
2021-09-25 13:24:25 +00:00
|
|
|
|
|
|
|
|
2022-01-22 19:39:37 +00:00
|
|
|
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler):
|
2022-01-22 19:39:37 +00:00
|
|
|
|
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
def send_to_client(self):
|
|
|
|
while self.connection_alive:
|
|
|
|
# send tnc state as network stream
|
2022-01-22 19:39:37 +00:00
|
|
|
# check server port against daemon port and send corresponding data
|
|
|
|
if self.server.server_address[1] == static.PORT and not static.TNCSTARTED:
|
|
|
|
data = send_tnc_state()
|
|
|
|
SOCKET_QUEUE.put(data)
|
|
|
|
else:
|
|
|
|
data = send_daemon_state()
|
|
|
|
SOCKET_QUEUE.put(data)
|
|
|
|
time.sleep(0.5)
|
|
|
|
|
|
|
|
|
|
|
|
while not SOCKET_QUEUE.empty():
|
|
|
|
data = SOCKET_QUEUE.get()
|
|
|
|
sock_data = bytes(data, 'utf-8')
|
|
|
|
sock_data += b'\n' # append line limiter
|
|
|
|
|
|
|
|
# send data to all clients
|
|
|
|
for client in CONNECTED_CLIENTS:
|
2022-01-24 18:42:59 +00:00
|
|
|
try:
|
|
|
|
client.send(sock_data)
|
|
|
|
except:
|
|
|
|
print("connection lost...")
|
|
|
|
CONNECTED_CLIENTS.remove(self.request)
|
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
# we want to transmit scatter data only once to reduce network traffic
|
|
|
|
static.SCATTER = []
|
|
|
|
# we want to display INFO messages only once
|
2022-01-22 19:39:37 +00:00
|
|
|
static.INFO = []
|
|
|
|
#self.request.sendall(sock_data)
|
2022-01-20 19:38:56 +00:00
|
|
|
time.sleep(0.15)
|
|
|
|
|
|
|
|
def receive_from_client(self):
|
|
|
|
data = bytes()
|
|
|
|
while self.connection_alive:
|
2022-01-22 19:39:37 +00:00
|
|
|
# BrokenPipeError: [Errno 32] Broken pipe
|
2022-01-20 19:38:56 +00:00
|
|
|
chunk = self.request.recv(2)
|
|
|
|
data += chunk
|
2022-01-18 18:38:05 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
if chunk == b'':
|
2022-01-23 06:10:04 +00:00
|
|
|
#print("connection broken. Closing...")
|
2022-01-20 19:38:56 +00:00
|
|
|
self.connection_alive = False
|
|
|
|
|
|
|
|
if data.startswith(b'{"type"') and data.endswith(b'}\n'):
|
|
|
|
data = data[:-1] # remove b'\n'
|
2022-01-24 21:01:01 +00:00
|
|
|
print(data)
|
2022-01-22 19:39:37 +00:00
|
|
|
if self.server.server_address[1] == static.PORT:
|
|
|
|
process_tnc_commands(data)
|
|
|
|
else:
|
|
|
|
process_daemon_commands(data)
|
2022-01-06 21:15:14 +00:00
|
|
|
|
2022-01-22 19:39:37 +00:00
|
|
|
data = bytes()
|
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
|
|
|
|
def handle(self):
|
2022-01-22 19:39:37 +00:00
|
|
|
CONNECTED_CLIENTS.add(self.request)
|
2022-01-06 21:15:14 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
structlog.get_logger("structlog").debug("[TNC] Client connected", ip=self.client_address[0], port=self.client_address[1])
|
|
|
|
self.connection_alive = True
|
2022-01-22 19:39:37 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
self.sendThread = threading.Thread(target=self.send_to_client, args=[]).start()
|
|
|
|
self.receiveThread = threading.Thread(target=self.receive_from_client, args=[]).start()
|
|
|
|
|
|
|
|
# keep connection alive until we close it
|
|
|
|
while self.connection_alive:
|
|
|
|
time.sleep(1)
|
2022-01-06 21:15:14 +00:00
|
|
|
|
2022-01-22 19:39:37 +00:00
|
|
|
|
2021-05-29 14:57:31 +00:00
|
|
|
|
2022-01-22 19:39:37 +00:00
|
|
|
def finish(self):
|
|
|
|
structlog.get_logger("structlog").warning("[TNC] Closing client socket", ip=self.client_address[0], port=self.client_address[1])
|
|
|
|
CONNECTED_CLIENTS.remove(self.request)
|
|
|
|
print(CONNECTED_CLIENTS)
|
2021-05-29 14:57:31 +00:00
|
|
|
|
2022-01-07 10:25:28 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
def process_tnc_commands(data):
|
|
|
|
# we need to do some error handling in case of socket timeout or decoding issue
|
|
|
|
try:
|
2022-01-07 10:25:28 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
# convert data to json object
|
|
|
|
received_json = json.loads(data)
|
|
|
|
# CQ CQ CQ -----------------------------------------------------
|
|
|
|
if received_json["command"] == "CQCQCQ":
|
|
|
|
data_handler.DATA_QUEUE_TRANSMIT.put(['CQ'])
|
2022-01-06 21:15:14 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
# START_BEACON -----------------------------------------------------
|
|
|
|
if received_json["command"] == "START_BEACON":
|
2021-05-29 14:57:31 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
static.BEACON_STATE = True
|
|
|
|
interval = int(received_json["parameter"])
|
|
|
|
data_handler.DATA_QUEUE_TRANSMIT.put(['BEACON', interval, True])
|
2022-01-04 10:55:55 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
|
|
|
|
# STOP_BEACON -----------------------------------------------------
|
|
|
|
if received_json["command"] == "STOP_BEACON":
|
|
|
|
static.BEACON_STATE = False
|
|
|
|
structlog.get_logger("structlog").warning("[TNC] Stopping beacon!")
|
2022-01-24 21:01:01 +00:00
|
|
|
data_handler.DATA_QUEUE_TRANSMIT.put(['BEACON', None, False])
|
2022-01-20 19:38:56 +00:00
|
|
|
|
|
|
|
|
|
|
|
# PING ----------------------------------------------------------
|
|
|
|
if received_json["type"] == 'PING' and received_json["command"] == "PING":
|
|
|
|
# send ping frame and wait for ACK
|
|
|
|
dxcallsign = received_json["dxcallsign"]
|
|
|
|
data_handler.DATA_QUEUE_TRANSMIT.put(['PING', dxcallsign])
|
|
|
|
|
|
|
|
|
|
|
|
# TRANSMIT FILE ----------------------------------------------------------
|
|
|
|
if received_json["type"] == 'ARQ' and received_json["command"] == "sendFile":
|
|
|
|
static.TNC_STATE = 'BUSY'
|
|
|
|
|
|
|
|
# on a new transmission we reset the timer
|
|
|
|
static.ARQ_START_OF_TRANSMISSION = int(time.time())
|
|
|
|
|
|
|
|
dxcallsign = received_json["dxcallsign"]
|
|
|
|
mode = int(received_json["mode"])
|
|
|
|
n_frames = int(received_json["n_frames"])
|
|
|
|
filename = received_json["filename"]
|
|
|
|
filetype = received_json["filetype"]
|
|
|
|
data = received_json["data"]
|
|
|
|
checksum = received_json["checksum"]
|
|
|
|
|
|
|
|
|
|
|
|
static.DXCALLSIGN = bytes(dxcallsign, 'utf-8')
|
2022-01-24 18:42:59 +00:00
|
|
|
static.DXCALLSIGN_CRC = helpers.get_crc_16(static.DXCALLSIGN)
|
2022-01-20 19:38:56 +00:00
|
|
|
|
|
|
|
# dt = datatype
|
|
|
|
# --> f = file
|
|
|
|
# --> m = message
|
|
|
|
# fn = filename
|
|
|
|
# ft = filetype
|
|
|
|
# d = data
|
|
|
|
# crc = checksum
|
|
|
|
rawdata = {"dt": "f", "fn": filename, "ft": filetype,"d": data, "crc": checksum}
|
|
|
|
dataframe = json.dumps(rawdata)
|
|
|
|
data_out = bytes(dataframe, 'utf-8')
|
2022-01-24 22:29:34 +00:00
|
|
|
print("kommen wir hier an?!?")
|
2022-01-20 19:38:56 +00:00
|
|
|
data_handler.DATA_QUEUE_TRANSMIT.put(['ARQ_FILE', data_out, mode, n_frames])
|
2022-01-24 22:29:34 +00:00
|
|
|
print(data_handler.DATA_QUEUE_TRANSMIT.qsize())
|
2022-01-20 19:38:56 +00:00
|
|
|
# TRANSMIT MESSAGE ----------------------------------------------------------
|
|
|
|
if received_json["type"] == 'ARQ' and received_json["command"] == "sendMessage":
|
|
|
|
static.TNC_STATE = 'BUSY'
|
|
|
|
print(received_json)
|
|
|
|
# on a new transmission we reset the timer
|
|
|
|
static.ARQ_START_OF_TRANSMISSION = int(time.time())
|
|
|
|
|
|
|
|
dxcallsign = received_json["dxcallsign"]
|
|
|
|
mode = int(received_json["mode"])
|
|
|
|
n_frames = int(received_json["n_frames"])
|
|
|
|
data = received_json["data"] # d = data
|
|
|
|
checksum = received_json["checksum"] # crc = checksum
|
|
|
|
|
|
|
|
|
|
|
|
static.DXCALLSIGN = bytes(dxcallsign, 'utf-8')
|
2022-01-24 18:42:59 +00:00
|
|
|
static.DXCALLSIGN_CRC = helpers.get_crc_16(static.DXCALLSIGN)
|
2022-01-20 19:38:56 +00:00
|
|
|
|
|
|
|
# dt = datatype
|
|
|
|
# --> f = file
|
|
|
|
# --> m = message
|
|
|
|
# fn = filename
|
|
|
|
# ft = filetype
|
|
|
|
# d = data
|
|
|
|
# crc = checksum
|
|
|
|
rawdata = {"dt": "m","d": data, "crc": checksum}
|
|
|
|
dataframe = json.dumps(rawdata)
|
|
|
|
data_out = bytes(dataframe, 'utf-8')
|
|
|
|
|
|
|
|
data_handler.DATA_QUEUE_TRANSMIT.put(['ARQ_MESSAGE', data_out, mode, n_frames])
|
2021-09-25 13:24:25 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
|
|
|
|
# STOP TRANSMISSION ----------------------------------------------------------
|
|
|
|
if received_json["type"] == 'ARQ' and received_json["command"] == "stopTransmission":
|
|
|
|
data_handler.DATA_QUEUE_TRANSMIT.put(['STOP'])
|
|
|
|
structlog.get_logger("structlog").warning("[TNC] Stopping transmission!")
|
|
|
|
static.TNC_STATE = 'IDLE'
|
|
|
|
static.ARQ_STATE = False
|
|
|
|
|
|
|
|
|
|
|
|
if received_json["type"] == 'GET' and received_json["command"] == 'RX_BUFFER':
|
|
|
|
output = {
|
|
|
|
"COMMAND": "RX_BUFFER",
|
|
|
|
"DATA-ARRAY": [],
|
|
|
|
"EOF": "EOF",
|
|
|
|
}
|
|
|
|
|
|
|
|
for i in range(0, len(static.RX_BUFFER)):
|
2021-09-25 13:24:25 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
rawdata = json.loads(static.RX_BUFFER[i][3])
|
|
|
|
output["DATA-ARRAY"].append({"DXCALLSIGN": str(static.RX_BUFFER[i][0], 'utf-8'), "DXGRID": str(static.RX_BUFFER[i][1], 'utf-8'), "TIMESTAMP": static.RX_BUFFER[i][2], "RXDATA": [rawdata]})
|
2021-09-25 13:24:25 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
jsondata = json.dumps(output)
|
2022-01-22 19:39:37 +00:00
|
|
|
#self.request.sendall(bytes(jsondata, encoding))
|
|
|
|
SOCKET_QUEUE.put(jsondata)
|
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
if received_json["type"] == 'GET' and received_json["command"] == 'RX_MSG_BUFFER':
|
|
|
|
output = {
|
|
|
|
"COMMAND": "RX_MSG_BUFFER",
|
|
|
|
"DATA-ARRAY": [],
|
|
|
|
"EOF": "EOF",
|
|
|
|
}
|
|
|
|
for i in range(0, len(static.RX_MSG_BUFFER)):
|
2021-09-08 16:23:26 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
rawdata = json.loads(static.RX_MSG_BUFFER[i][3])
|
|
|
|
output["DATA-ARRAY"].append({"DXCALLSIGN": str(static.RX_MSG_BUFFER[i][0], 'utf-8'), "DXGRID": str(static.RX_MSG_BUFFER[i][1], 'utf-8'), "TIMESTAMP": static.RX_MSG_BUFFER[i][2], "RXDATA": [rawdata]})
|
2021-09-27 15:33:59 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
jsondata = json.dumps(output)
|
2022-01-22 19:39:37 +00:00
|
|
|
#self.request.sendall(bytes(jsondata, encoding))
|
|
|
|
SOCKET_QUEUE.put(jsondata)
|
2022-01-20 19:38:56 +00:00
|
|
|
|
|
|
|
if received_json["type"] == 'SET' and received_json["command"] == 'DEL_RX_BUFFER':
|
|
|
|
static.RX_BUFFER = []
|
|
|
|
|
|
|
|
if received_json["type"] == 'SET' and received_json["command"] == 'DEL_RX_MSG_BUFFER':
|
|
|
|
static.RX_MSG_BUFFER = []
|
2022-01-22 19:39:37 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
# exception, if JSON cant be decoded
|
|
|
|
except Exception as e:
|
|
|
|
structlog.get_logger("structlog").error("[TNC] Network error", e=e)
|
|
|
|
|
|
|
|
def send_tnc_state():
|
|
|
|
encoding = 'utf-8'
|
|
|
|
|
|
|
|
output = {
|
|
|
|
"COMMAND": "TNC_STATE",
|
|
|
|
"PTT_STATE": str(static.PTT_STATE),
|
|
|
|
"TNC_STATE": str(static.TNC_STATE),
|
|
|
|
"ARQ_STATE": str(static.ARQ_STATE),
|
|
|
|
"AUDIO_RMS": str(static.AUDIO_RMS),
|
|
|
|
"SNR": str(static.SNR),
|
|
|
|
"FREQUENCY": str(static.HAMLIB_FREQUENCY),
|
|
|
|
"MODE": str(static.HAMLIB_MODE),
|
|
|
|
"BANDWITH": str(static.HAMLIB_BANDWITH),
|
|
|
|
"FFT": str(static.FFT),
|
|
|
|
"SCATTER": static.SCATTER,
|
|
|
|
"RX_BUFFER_LENGTH": str(len(static.RX_BUFFER)),
|
|
|
|
"RX_MSG_BUFFER_LENGTH": str(len(static.RX_MSG_BUFFER)),
|
|
|
|
"ARQ_BYTES_PER_MINUTE": str(static.ARQ_BYTES_PER_MINUTE),
|
|
|
|
"ARQ_BYTES_PER_MINUTE_BURST": str(static.ARQ_BYTES_PER_MINUTE_BURST),
|
|
|
|
"ARQ_COMPRESSION_FACTOR": str(static.ARQ_COMPRESSION_FACTOR),
|
|
|
|
"ARQ_TRANSMISSION_PERCENT": str(static.ARQ_TRANSMISSION_PERCENT),
|
|
|
|
"TOTAL_BYTES": str(static.TOTAL_BYTES),
|
|
|
|
"INFO" : static.INFO,
|
|
|
|
"BEACON_STATE" : str(static.BEACON_STATE),
|
|
|
|
"STATIONS": [],
|
|
|
|
"MY_CALLSIGN": str(static.MYCALLSIGN, encoding),
|
|
|
|
"DX_CALLSIGN": str(static.DXCALLSIGN, encoding),
|
|
|
|
"DX_GRID": str(static.DXGRID, encoding),
|
|
|
|
"EOF": "EOF",
|
|
|
|
}
|
|
|
|
|
|
|
|
# add heard stations to heard stations object
|
|
|
|
for i in range(0, len(static.HEARD_STATIONS)):
|
|
|
|
output["STATIONS"].append({"DXCALLSIGN": str(static.HEARD_STATIONS[i][0], 'utf-8'), "DXGRID": str(static.HEARD_STATIONS[i][1], 'utf-8'),"TIMESTAMP": static.HEARD_STATIONS[i][2], "DATATYPE": static.HEARD_STATIONS[i][3], "SNR": static.HEARD_STATIONS[i][4], "OFFSET": static.HEARD_STATIONS[i][5], "FREQUENCY": static.HEARD_STATIONS[i][6]})
|
|
|
|
|
|
|
|
jsondata = json.dumps(output)
|
|
|
|
return jsondata
|
|
|
|
|
|
|
|
|
2022-01-22 19:39:37 +00:00
|
|
|
def process_daemon_commands(data):
|
|
|
|
# convert data to json object
|
|
|
|
received_json = json.loads(data)
|
2022-01-20 19:38:56 +00:00
|
|
|
|
|
|
|
if received_json["type"] == 'SET' and received_json["command"] == 'MYCALLSIGN':
|
|
|
|
callsign = received_json["parameter"]
|
|
|
|
print(received_json)
|
|
|
|
if bytes(callsign, 'utf-8') == b'':
|
|
|
|
self.request.sendall(b'INVALID CALLSIGN')
|
2022-01-24 18:42:59 +00:00
|
|
|
structlog.get_logger("structlog").warning("[DMN] SET MYCALL FAILED", call=static.MYCALLSIGN, crc=static.MYCALLSIGN_CRC)
|
2022-01-20 19:38:56 +00:00
|
|
|
else:
|
|
|
|
static.MYCALLSIGN = bytes(callsign, 'utf-8')
|
2022-01-24 18:42:59 +00:00
|
|
|
static.MYCALLSIGN_CRC = helpers.get_crc_16(static.MYCALLSIGN)
|
2022-01-20 19:38:56 +00:00
|
|
|
|
2022-01-24 18:42:59 +00:00
|
|
|
structlog.get_logger("structlog").info("[DMN] SET MYCALL", call=static.MYCALLSIGN, crc=static.MYCALLSIGN_CRC)
|
2022-01-20 19:38:56 +00:00
|
|
|
|
|
|
|
if received_json["type"] == 'SET' and received_json["command"] == 'MYGRID':
|
|
|
|
mygrid = received_json["parameter"]
|
|
|
|
|
|
|
|
if bytes(mygrid, 'utf-8') == b'':
|
|
|
|
self.request.sendall(b'INVALID GRID')
|
|
|
|
else:
|
|
|
|
static.MYGRID = bytes(mygrid, 'utf-8')
|
|
|
|
structlog.get_logger("structlog").info("[DMN] SET MYGRID", grid=static.MYGRID)
|
|
|
|
|
|
|
|
if received_json["type"] == 'SET' and received_json["command"] == 'STARTTNC' and not static.TNCSTARTED:
|
2022-01-22 19:39:37 +00:00
|
|
|
|
2022-01-20 19:38:56 +00:00
|
|
|
mycall = str(received_json["parameter"][0]["mycall"])
|
|
|
|
mygrid = str(received_json["parameter"][0]["mygrid"])
|
|
|
|
rx_audio = str(received_json["parameter"][0]["rx_audio"])
|
|
|
|
tx_audio = str(received_json["parameter"][0]["tx_audio"])
|
|
|
|
devicename = str(received_json["parameter"][0]["devicename"])
|
|
|
|
deviceport = str(received_json["parameter"][0]["deviceport"])
|
|
|
|
serialspeed = str(received_json["parameter"][0]["serialspeed"])
|
|
|
|
pttprotocol = str(received_json["parameter"][0]["pttprotocol"])
|
|
|
|
pttport = str(received_json["parameter"][0]["pttport"])
|
|
|
|
data_bits = str(received_json["parameter"][0]["data_bits"])
|
|
|
|
stop_bits = str(received_json["parameter"][0]["stop_bits"])
|
|
|
|
handshake = str(received_json["parameter"][0]["handshake"])
|
|
|
|
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"])
|
2022-01-22 19:39:37 +00:00
|
|
|
DAEMON_QUEUE.put(['STARTTNC', \
|
|
|
|
mycall, \
|
|
|
|
mygrid, \
|
|
|
|
rx_audio, \
|
|
|
|
tx_audio, \
|
|
|
|
devicename, \
|
|
|
|
deviceport, \
|
|
|
|
serialspeed, \
|
|
|
|
pttprotocol, \
|
|
|
|
pttport, \
|
|
|
|
data_bits, \
|
|
|
|
stop_bits, \
|
|
|
|
handshake, \
|
|
|
|
radiocontrol, \
|
|
|
|
rigctld_ip, \
|
|
|
|
rigctld_port \
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
|
|
if received_json["type"] == 'GET' and received_json["command"] == 'TEST_HAMLIB':
|
|
|
|
|
|
|
|
|
|
|
|
devicename = str(received_json["parameter"][0]["devicename"])
|
|
|
|
deviceport = str(received_json["parameter"][0]["deviceport"])
|
|
|
|
serialspeed = str(received_json["parameter"][0]["serialspeed"])
|
|
|
|
pttprotocol = str(received_json["parameter"][0]["pttprotocol"])
|
|
|
|
pttport = str(received_json["parameter"][0]["pttport"])
|
|
|
|
data_bits = str(received_json["parameter"][0]["data_bits"])
|
|
|
|
stop_bits = str(received_json["parameter"][0]["stop_bits"])
|
|
|
|
handshake = str(received_json["parameter"][0]["handshake"])
|
|
|
|
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', \
|
|
|
|
devicename, \
|
|
|
|
deviceport, \
|
|
|
|
serialspeed, \
|
|
|
|
pttprotocol, \
|
|
|
|
pttport, \
|
|
|
|
data_bits, \
|
|
|
|
stop_bits, \
|
|
|
|
handshake, \
|
|
|
|
radiocontrol, \
|
|
|
|
rigctld_ip, \
|
|
|
|
rigctld_port \
|
|
|
|
])
|
2022-01-20 19:38:56 +00:00
|
|
|
|
|
|
|
if received_json["type"] == 'SET' and received_json["command"] == 'STOPTNC':
|
|
|
|
static.TNCPROCESS.kill()
|
|
|
|
structlog.get_logger("structlog").warning("[DMN] Stopping TNC")
|
|
|
|
static.TNCSTARTED = False
|
|
|
|
|
|
|
|
|
2022-01-22 19:39:37 +00:00
|
|
|
def send_daemon_state():
|
|
|
|
|
|
|
|
python_version = str(sys.version_info[0]) + "." + str(sys.version_info[1])
|
|
|
|
|
|
|
|
output = {
|
|
|
|
'COMMAND': 'DAEMON_STATE',
|
|
|
|
'DAEMON_STATE': [],
|
|
|
|
'PYTHON_VERSION': str(python_version),
|
|
|
|
'HAMLIB_VERSION': static.HAMLIB_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"})
|
|
|
|
|
|
|
|
jsondata = json.dumps(output)
|
|
|
|
return jsondata
|