mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
fixed dataclass handling and process states
This commit is contained in:
parent
7304246f69
commit
5f48dff549
16 changed files with 70 additions and 153 deletions
|
@ -4,7 +4,7 @@ import helpers
|
||||||
import time
|
import time
|
||||||
import modem
|
import modem
|
||||||
import base64
|
import base64
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
||||||
import sock
|
import sock
|
||||||
import ujson as json
|
import ujson as json
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ import crcengine
|
||||||
import log_handler
|
import log_handler
|
||||||
import serial.tools.list_ports
|
import serial.tools.list_ports
|
||||||
import sock
|
import sock
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
||||||
|
|
||||||
import structlog
|
import structlog
|
||||||
import ujson as json
|
import ujson as json
|
||||||
|
@ -368,8 +368,13 @@ class DAEMON:
|
||||||
|
|
||||||
command += options
|
command += options
|
||||||
|
|
||||||
print(command)
|
|
||||||
proc = subprocess.Popen(command)
|
# append debugging paramter
|
||||||
|
options.append(("-vvv"))
|
||||||
|
|
||||||
|
self.log.info("[DMN] starting rigctld: ", param=command)
|
||||||
|
proc = subprocess.Popen(command, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
atexit.register(proc.kill)
|
atexit.register(proc.kill)
|
||||||
|
|
||||||
Daemon.rigctldstarted = True
|
Daemon.rigctldstarted = True
|
||||||
|
@ -378,7 +383,7 @@ class DAEMON:
|
||||||
|
|
||||||
|
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
self.log.info("[DMN] starting rigctld: ", e=err)
|
self.log.warning("[DMN] err starting rigctld: ", e=err)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -515,6 +520,7 @@ class DAEMON:
|
||||||
Daemon.tncstarted = False
|
Daemon.tncstarted = False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
mainlog = structlog.get_logger(__file__)
|
mainlog = structlog.get_logger(__file__)
|
||||||
# we need to run this on Windows for multiprocessing support
|
# we need to run this on Windows for multiprocessing support
|
||||||
|
|
|
@ -24,7 +24,7 @@ import helpers
|
||||||
import modem
|
import modem
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import sock
|
import sock
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
||||||
import structlog
|
import structlog
|
||||||
import stats
|
import stats
|
||||||
import ujson as json
|
import ujson as json
|
||||||
|
|
|
@ -13,7 +13,7 @@ import time
|
||||||
import ujson as json
|
import ujson as json
|
||||||
import structlog
|
import structlog
|
||||||
import static
|
import static
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
||||||
|
|
||||||
|
|
||||||
log = structlog.get_logger("explorer")
|
log = structlog.get_logger("explorer")
|
||||||
|
|
19
tnc/global_instances.py
Normal file
19
tnc/global_instances.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# global_instances.py
|
||||||
|
|
||||||
|
from static import Daemon, ARQ, AudioParam, Beacon, Channel, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC, MeshParam
|
||||||
|
|
||||||
|
# Initialize instances with appropriate default values
|
||||||
|
|
||||||
|
# Create single instances of each dataclass
|
||||||
|
Daemon = Daemon(tncprocess=None, rigctldprocess=None)
|
||||||
|
ARQ = ARQ()
|
||||||
|
AudioParam = AudioParam()
|
||||||
|
Beacon = Beacon()
|
||||||
|
Channel = Channel()
|
||||||
|
HamlibParam = HamlibParam()
|
||||||
|
ModemParam = ModemParam()
|
||||||
|
Station = Station()
|
||||||
|
Statistics = Statistics()
|
||||||
|
TCIParam = TCIParam()
|
||||||
|
TNC = TNC()
|
||||||
|
MeshParam = MeshParam()
|
|
@ -8,7 +8,7 @@ import time
|
||||||
from datetime import datetime,timezone
|
from datetime import datetime,timezone
|
||||||
import crcengine
|
import crcengine
|
||||||
import static
|
import static
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC, MeshParam
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC, MeshParam
|
||||||
import structlog
|
import structlog
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import threading
|
import threading
|
||||||
|
|
|
@ -29,7 +29,7 @@ import helpers
|
||||||
import log_handler
|
import log_handler
|
||||||
import modem
|
import modem
|
||||||
import static
|
import static
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC, MeshParam
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC, MeshParam
|
||||||
import structlog
|
import structlog
|
||||||
import explorer
|
import explorer
|
||||||
import json
|
import json
|
||||||
|
|
|
@ -36,7 +36,9 @@ SNR: negative --> * 2
|
||||||
# pylint: disable=invalid-name, line-too-long, c-extension-no-member
|
# pylint: disable=invalid-name, line-too-long, c-extension-no-member
|
||||||
# pylint: disable=import-outside-toplevel, attribute-defined-outside-init
|
# pylint: disable=import-outside-toplevel, attribute-defined-outside-init
|
||||||
|
|
||||||
from static import TNC, MeshParam, FRAME_TYPE, Station, ModemParam, ARQ
|
from static import FRAME_TYPE
|
||||||
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
||||||
|
|
||||||
from codec2 import FREEDV_MODE
|
from codec2 import FREEDV_MODE
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import time
|
import time
|
||||||
|
|
|
@ -23,7 +23,7 @@ import numpy as np
|
||||||
import sock
|
import sock
|
||||||
import sounddevice as sd
|
import sounddevice as sd
|
||||||
import static
|
import static
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC
|
||||||
from static import FRAME_TYPE
|
from static import FRAME_TYPE
|
||||||
import structlog
|
import structlog
|
||||||
import ujson as json
|
import ujson as json
|
||||||
|
|
|
@ -3,7 +3,7 @@ Hold queues used by more than one module to eliminate cyclic imports.
|
||||||
"""
|
"""
|
||||||
import queue
|
import queue
|
||||||
import static
|
import static
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, TCIParam, TNC
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, TCIParam, TNC
|
||||||
|
|
||||||
DATA_QUEUE_TRANSMIT = queue.Queue()
|
DATA_QUEUE_TRANSMIT = queue.Queue()
|
||||||
DATA_QUEUE_RECEIVED = queue.Queue()
|
DATA_QUEUE_RECEIVED = queue.Queue()
|
||||||
|
|
|
@ -10,7 +10,7 @@ import time
|
||||||
import structlog
|
import structlog
|
||||||
import threading
|
import threading
|
||||||
import static
|
import static
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, TCIParam
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, TCIParam
|
||||||
|
|
||||||
|
|
||||||
class radio:
|
class radio:
|
||||||
|
|
|
@ -7,7 +7,6 @@ simple TNC self tests
|
||||||
# pylint: disable=import-outside-toplevel, attribute-defined-outside-init
|
# pylint: disable=import-outside-toplevel, attribute-defined-outside-init
|
||||||
import sys
|
import sys
|
||||||
import structlog
|
import structlog
|
||||||
from static import ARQ, Audio, Beacon, Channel, Daemon, Hamlib, Modem, Station, TCI, TNC
|
|
||||||
|
|
||||||
log = structlog.get_logger("selftest")
|
log = structlog.get_logger("selftest")
|
||||||
|
|
||||||
|
|
28
tnc/sock.py
28
tnc/sock.py
|
@ -27,7 +27,7 @@ import time
|
||||||
import wave
|
import wave
|
||||||
import helpers
|
import helpers
|
||||||
import static
|
import static
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC, MeshParam
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC, MeshParam
|
||||||
import structlog
|
import structlog
|
||||||
from random import randrange
|
from random import randrange
|
||||||
import ujson as json
|
import ujson as json
|
||||||
|
@ -1248,6 +1248,32 @@ def send_daemon_state():
|
||||||
"""
|
"""
|
||||||
log = structlog.get_logger("send_daemon_state")
|
log = structlog.get_logger("send_daemon_state")
|
||||||
|
|
||||||
|
# we need to do some process checking for providing the correct state
|
||||||
|
# at least we are checking the returncode of rigctld
|
||||||
|
# None state means, the process is still running
|
||||||
|
try:
|
||||||
|
retcode_rigctld = Daemon.rigctldprocess.poll()
|
||||||
|
if retcode_rigctld in [None, "None"]:
|
||||||
|
output, errs = Daemon.rigctldprocess.communicate()
|
||||||
|
print(f"rigctld out: {output}")
|
||||||
|
print(f"rigctld err: {errs}")
|
||||||
|
else:
|
||||||
|
# print(f"rigctld closed with code: {retcode_rigctld}")
|
||||||
|
Daemon.rigctldstarted = False
|
||||||
|
|
||||||
|
|
||||||
|
retcode_tnc = Daemon.tncprocess.poll()
|
||||||
|
if retcode_tnc in [None, "None"]:
|
||||||
|
output, errs = Daemon.tncprocess.communicate()
|
||||||
|
print(f"tnc out: {output}")
|
||||||
|
print(f"tnc err: {errs}")
|
||||||
|
else:
|
||||||
|
# print(f"tnc closed with code: {retcode_tnc}")
|
||||||
|
Daemon.tncstarted = False
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
python_version = f"{str(sys.version_info[0])}.{str(sys.version_info[1])}"
|
python_version = f"{str(sys.version_info[0])}.{str(sys.version_info[1])}"
|
||||||
|
|
||||||
|
|
134
tnc/static.py
134
tnc/static.py
|
@ -188,137 +188,3 @@ class FRAME_TYPE(Enum):
|
||||||
FEC_WAKEUP = 252
|
FEC_WAKEUP = 252
|
||||||
IDENT = 254
|
IDENT = 254
|
||||||
TEST_FRAME = 255
|
TEST_FRAME = 255
|
||||||
|
|
||||||
# ---------------------------------------------------------------
|
|
||||||
# DON'T USE THESE SETTINGS ANYMORE
|
|
||||||
# ---------------------------------------------------------------
|
|
||||||
# Fixme: REMOVE THESE OLD SETTINGS!
|
|
||||||
# REASON: For some reason ctests are failing when using dataclasses.
|
|
||||||
# We need to figure out whats happening and why the tests are failing.
|
|
||||||
|
|
||||||
|
|
||||||
CHANNEL_BUSY_SLOT = [False] * 5
|
|
||||||
|
|
||||||
|
|
||||||
ENABLE_EXPLORER = False
|
|
||||||
ENABLE_STATS = False
|
|
||||||
|
|
||||||
|
|
||||||
# DAEMON
|
|
||||||
DAEMONPORT: int = 3001
|
|
||||||
TNCSTARTED: bool = False
|
|
||||||
TNCPROCESS: subprocess.Popen
|
|
||||||
|
|
||||||
# Operator Defaults
|
|
||||||
MYCALLSIGN: bytes = b"AA0AA"
|
|
||||||
MYCALLSIGN_CRC: bytes = b"A"
|
|
||||||
|
|
||||||
DXCALLSIGN: bytes = b"ZZ9YY"
|
|
||||||
DXCALLSIGN_CRC: bytes = b"A"
|
|
||||||
|
|
||||||
MYGRID: bytes = b""
|
|
||||||
DXGRID: bytes = b""
|
|
||||||
|
|
||||||
SSID_LIST: list = [] # ssid list we are responding to
|
|
||||||
|
|
||||||
LOW_BANDWIDTH_MODE: bool = False
|
|
||||||
# ---------------------------------
|
|
||||||
|
|
||||||
# Server Defaults
|
|
||||||
HOST: str = "0.0.0.0"
|
|
||||||
PORT: int = 3000
|
|
||||||
SOCKET_TIMEOUT: int = 1 # seconds
|
|
||||||
# ---------------------------------
|
|
||||||
SERIAL_DEVICES: list = []
|
|
||||||
# ---------------------------------
|
|
||||||
LISTEN: bool = True
|
|
||||||
PTT_STATE: bool = False
|
|
||||||
TRANSMITTING: bool = False
|
|
||||||
|
|
||||||
HAMLIB_RADIOCONTROL: str = "disabled"
|
|
||||||
HAMLIB_RIGCTLD_IP: str = "127.0.0.1"
|
|
||||||
HAMLIB_RIGCTLD_PORT: str = "4532"
|
|
||||||
|
|
||||||
HAMLIB_STATUS: str = "unknown/disconnected"
|
|
||||||
HAMLIB_FREQUENCY: int = 0
|
|
||||||
HAMLIB_MODE: str = ""
|
|
||||||
HAMLIB_BANDWIDTH: int = 0
|
|
||||||
HAMLIB_RF: int = 0
|
|
||||||
HAMLIB_ALC: int = 0
|
|
||||||
HAMLIB_STRENGTH: int = 0
|
|
||||||
# -------------------------
|
|
||||||
# FreeDV Defaults
|
|
||||||
|
|
||||||
SNR: float = 0
|
|
||||||
FREQ_OFFSET: float = 0
|
|
||||||
SCATTER: list = []
|
|
||||||
ENABLE_SCATTER: bool = False
|
|
||||||
ENABLE_FSK: bool = False
|
|
||||||
RESPOND_TO_CQ: bool = False
|
|
||||||
RESPOND_TO_CALL: bool = True # respond to cq, ping, connection request, file request if not in session
|
|
||||||
TX_DELAY: int = 0 # delay in ms before sending modulation for triggering VOX for example or slow PTT radios
|
|
||||||
# ---------------------------------
|
|
||||||
|
|
||||||
# Audio Defaults
|
|
||||||
TX_AUDIO_LEVEL: int = 50
|
|
||||||
AUDIO_INPUT_DEVICES: list = []
|
|
||||||
AUDIO_OUTPUT_DEVICES: list = []
|
|
||||||
AUDIO_INPUT_DEVICE: int = -2
|
|
||||||
AUDIO_OUTPUT_DEVICE: int = -2
|
|
||||||
AUDIO_RECORD: bool = False
|
|
||||||
AUDIO_RECORD_FILE = ''
|
|
||||||
BUFFER_OVERFLOW_COUNTER: list = [0, 0, 0, 0, 0]
|
|
||||||
AUDIO_AUTO_TUNE: bool = False
|
|
||||||
# Audio TCI Support
|
|
||||||
AUDIO_ENABLE_TCI: bool = False
|
|
||||||
TCI_IP: str = '127.0.0.1'
|
|
||||||
TCI_PORT: int = '9000'
|
|
||||||
|
|
||||||
AUDIO_DBFS: int = 0
|
|
||||||
FFT: list = [0]
|
|
||||||
ENABLE_FFT: bool = True
|
|
||||||
CHANNEL_BUSY: bool = False
|
|
||||||
|
|
||||||
# ARQ PROTOCOL VERSION
|
|
||||||
# v.5 - signalling frame uses datac0
|
|
||||||
# v.6 - signalling frame uses datac13
|
|
||||||
# CHECKED # ARQ_PROTOCOL_VERSION: int = 6
|
|
||||||
|
|
||||||
# ARQ statistics
|
|
||||||
# CHECKED # SPEED_LIST: list = []
|
|
||||||
# CHECKED # ARQ_BYTES_PER_MINUTE_BURST: int = 0
|
|
||||||
# CHECKED # ARQ_BYTES_PER_MINUTE: int = 0
|
|
||||||
# CHECKED # ARQ_BITS_PER_SECOND_BURST: int = 0
|
|
||||||
# CHECKED # ARQ_BITS_PER_SECOND: int = 0
|
|
||||||
# CHECKED # ARQ_COMPRESSION_FACTOR: int = 0
|
|
||||||
# CHECKED # ARQ_TRANSMISSION_PERCENT: int = 0
|
|
||||||
# CHECKED # ARQ_SECONDS_UNTIL_FINISH: int = 0
|
|
||||||
# CHECKED # ARQ_SPEED_LEVEL: int = 0
|
|
||||||
# CHECKED # TOTAL_BYTES: int = 0
|
|
||||||
# set save to folder state for allowing downloading files to local file system
|
|
||||||
# CHECKED # ARQ_SAVE_TO_FOLDER: bool = False
|
|
||||||
|
|
||||||
# CHANNEL_STATE = 'RECEIVING_SIGNALLING'
|
|
||||||
TNC_STATE: str = "IDLE"
|
|
||||||
# CHECKED # ARQ_STATE: bool = False
|
|
||||||
# CHECKED # ARQ_SESSION: bool = False
|
|
||||||
# disconnected, connecting, connected, disconnecting, failed
|
|
||||||
# CHECKED # ARQ_SESSION_STATE: str = "disconnected"
|
|
||||||
|
|
||||||
# BEACON STATE
|
|
||||||
BEACON_STATE: bool = False
|
|
||||||
BEACON_PAUSE: bool = False
|
|
||||||
|
|
||||||
# ------- RX BUFFER
|
|
||||||
# CHECKED # RX_MSG_BUFFER: list = []
|
|
||||||
# CHECKED # RX_BURST_BUFFER: list = []
|
|
||||||
# CHECKED # RX_FRAME_BUFFER: bytes = b""
|
|
||||||
# CHECKED # RX_BUFFER_SIZE: int = 16
|
|
||||||
|
|
||||||
# ------- HEARD STATIONS BUFFER
|
|
||||||
HEARD_STATIONS: list = []
|
|
||||||
|
|
||||||
# ------- CODEC2 SETTINGS
|
|
||||||
TUNING_RANGE_FMIN: float = -50.0
|
|
||||||
TUNING_RANGE_FMAX: float = 50.0
|
|
||||||
IS_CODEC2_TRAFFIC: bool = False # true if we have codec2 signalling mode traffic on channel
|
|
||||||
|
|
|
@ -12,8 +12,7 @@ import threading
|
||||||
import time
|
import time
|
||||||
import ujson as json
|
import ujson as json
|
||||||
import structlog
|
import structlog
|
||||||
import static
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, TCIParam, TNC
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, TCIParam, TNC
|
|
||||||
|
|
||||||
log = structlog.get_logger("stats")
|
log = structlog.get_logger("stats")
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ import websocket
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import time
|
import time
|
||||||
from queues import AUDIO_TRANSMIT_QUEUE, AUDIO_RECEIVED_QUEUE
|
from queues import AUDIO_TRANSMIT_QUEUE, AUDIO_RECEIVED_QUEUE
|
||||||
from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, TCIParam, TNC
|
from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, TCIParam, TNC
|
||||||
|
|
||||||
class TCICtrl:
|
class TCICtrl:
|
||||||
def __init__(self, hostname='127.0.0.1', port=50001):
|
def __init__(self, hostname='127.0.0.1', port=50001):
|
||||||
|
|
Loading…
Reference in a new issue