#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Wed Dec 23 11:13:57 2020 @author: DJ2LS Here we are saving application wide variables and stats, which have to be accessed everywhere. """ from dataclasses import dataclass, field import subprocess from enum import Enum import threading # CHANNEL_STATE = 'RECEIVING_SIGNALLING' # disconnected, connecting, connected, disconnecting, failed # ------- RX BUFFER @dataclass class ARQ: bytes_per_minute: int = 0 arq_transmission_percent: int = 0 arq_compression_factor: int = 0 arq_speed_level: int = 0 arq_bits_per_second_burst: int = 0 arq_bits_per_second: int = 0 arq_seconds_until_finish: int = 0 arq_seconds_until_timeout: int = 0 rx_buffer_size: int = 16 rx_frame_buffer: bytes = b"" rx_burst_buffer = [] arq_session_state: str = "disconnected" # can be: disconnected, disconnecting, connected, connecting, failed arq_session: bool = False arq_state: bool = False arq_state_event: threading.Event = field(default_factory=threading.Event) # ARQ PROTOCOL VERSION # v.5 - signalling frame uses datac0 # v.6 - signalling frame uses datac13 # v.7 - adjusting ARQ timeouts, not done yet arq_protocol_version: int = 7 total_bytes: int = 0 speed_list = [] # set save to folder state for allowing downloading files to local file system arq_save_to_folder: bool = False bytes_per_minute_burst: int = 0 rx_msg_buffer = [] @dataclass class AudioParam: tx_audio_level: int = 0 rx_audio_level: int = 0 audio_input_devices = [] audio_output_devices = [] audio_input_device: int = -2 audio_output_device: int = -2 audio_record: bool = False audio_record_file = '' buffer_overflow_counter = [0, 0, 0, 0, 0] audio_auto_tune: bool = False audio_dbfs: int = 0 fft = [] enable_fft: bool = True @dataclass class Beacon: beacon_state: bool = False beacon_pause: bool = False @dataclass class Channel: pass @dataclass class Daemon: modemprocess: subprocess.Popen rigctldprocess: subprocess.Popen modemstarted: bool = False rigctldstarted: bool = False port: int = 3001 serial_devices = [] @dataclass class HamlibParam: alc: int = 0 hamlib_frequency: int = 0 hamlib_strength: int = 0 hamlib_radiocontrol: str = "disabled" hamlib_rigctld_ip: str = "127.0.0.1" hamlib_rigctld_port: str = "4532" ptt_state: bool = False hamlib_bandwidth: int = 0 hamlib_status: str = "unknown/disconnected" hamlib_mode: str = "" hamlib_rf: int = 0 @dataclass class MeshParam: routing_table = [] enable_protocol = False @dataclass class ModemParam: tuning_range_fmin: float = -50.0 tuning_range_fmax: float = 50.0 channel_busy: bool = False channel_busy_slot = [False] * 5 snr: float = 0 is_codec2_traffic: bool = False # true if we have codec2 signalling mode traffic on channel frequency_offset: float = 0 tx_delay: int = 0 # delay in ms before sending modulation for triggering VOX for example or slow PTT radios enable_scatter: bool = False scatter = [] channel_busy_delay = 0 @dataclass class Station: mycallsign: bytes = b"AA0AA-0" mycallsign_crc: bytes = b"A" dxcallsign: bytes = b"ZZ9YY-0" dxcallsign_crc: bytes = b"B" mygrid: bytes = b"" dxgrid: bytes = b"" ssid_list = [] # ssid list we are responding to @dataclass class Statistics: pass @dataclass class TCIParam: ip: str = '127.0.0.1' port: int = '9000' @dataclass class Modem: version = "0.11.2-alpha.4" host: str = "0.0.0.0" port: int = 5000 SOCKET_TIMEOUT: int = 1 # seconds modem_state: str = "IDLE" enable_explorer = False enable_stats = False transmitting: bool = False low_bandwidth_mode: bool = False enable_fsk: bool = False respond_to_cq: bool = True respond_to_call: bool = True # respond to cq, ping, connection request, file request if not in session heard_stations = [] listen: bool = True enable_hmac: bool = True transmit_morse_identifier: bool = False # ------------ class FRAME_TYPE(Enum): """Lookup for frame types""" BURST_01 = 10 BURST_02 = 11 BURST_03 = 12 BURST_04 = 13 # ... BURST_51 = 50 BURST_ACK = 60 FR_ACK = 61 FR_REPEAT = 62 FR_NACK = 63 BURST_NACK = 64 MESH_BROADCAST = 100 MESH_SIGNALLING_PING = 101 MESH_SIGNALLING_PING_ACK = 102 CQ = 200 QRV = 201 PING = 210 PING_ACK = 211 IS_WRITING = 215 ARQ_SESSION_OPEN = 221 ARQ_SESSION_HB = 222 ARQ_SESSION_CLOSE = 223 ARQ_DC_OPEN_W = 225 ARQ_DC_OPEN_ACK_W = 226 ARQ_DC_OPEN_N = 227 ARQ_DC_OPEN_ACK_N = 228 ARQ_STOP = 249 BEACON = 250 FEC = 251 FEC_WAKEUP = 252 IDENT = 254 TEST_FRAME = 255