From 8f3f046655a4726207b85c67f41fe158cc97e395 Mon Sep 17 00:00:00 2001 From: dj2ls Date: Sat, 2 Apr 2022 18:40:12 +0200 Subject: [PATCH] improved logging and chat --- gui/package.json | 2 +- gui/preload-chat.js | 61 ++++++++++++++++++++++++++++++++++------ gui/src/chat-module.html | 6 ++-- tnc/codec2.py | 8 +++--- tnc/data_handler.py | 7 +++-- tnc/main.py | 2 -- tnc/modem.py | 14 +++++---- tnc/sock.py | 17 +++++------ tnc/static.py | 2 +- 9 files changed, 83 insertions(+), 36 deletions(-) diff --git a/gui/package.json b/gui/package.json index 8724d429..70be361e 100644 --- a/gui/package.json +++ b/gui/package.json @@ -1,6 +1,6 @@ { "name": "FreeDATA", - "version": "0.3.1-alpha.1", + "version": "0.3.2-alpha.1", "description": "FreeDATA ", "main": "main.js", "scripts": { diff --git a/gui/preload-chat.js b/gui/preload-chat.js index b7ec523b..20ce0429 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -26,6 +26,12 @@ const dateFormatShort = new Intl.DateTimeFormat('en-GB', { second: 'numeric', hour12: false, }); + +const dateFormatHours = new Intl.DateTimeFormat('en-GB', { + hour: 'numeric', + minute: 'numeric', + hour12: false, +}); // split character const split_char = '\0;' // global for our selected file we want to transmit @@ -146,10 +152,10 @@ db.post({ timestamp: Math.floor(Date.now() / 1000), dxcallsign: dxcallsign.toUpperCase(), dxgrid: '---', - msg: 'NULL', - checksum: 'NULL', + msg: 'null', + checksum: 'null', type: 'newchat', - status: 'NULL', + status: 'null', uuid: uuid }).then(function(response) { @@ -198,9 +204,9 @@ db.post({ _id: uuid, timestamp: Math.floor(Date.now() / 1000), dxcallsign: dxcallsign, - dxgrid: 'NULL', + dxgrid: 'null', msg: chatmessage, - checksum: 'NULL', + checksum: 'null', type: "transmit", status: 'transmit', uuid: uuid, @@ -425,7 +431,21 @@ update_chat = function(obj) { var dxcallsign = obj.dxcallsign; var timestamp = dateFormat.format(obj.timestamp * 1000); var timestampShort = dateFormatShort.format(obj.timestamp * 1000); + var timestampHours = dateFormatHours.format(obj.timestamp * 1000); + var dxgrid = obj.dxgrid; + + // define shortmessage + if (obj.msg == 'null' || obj.msg == 'NULL'){ + var shortmsg = obj.type; + } else { + var shortmsg = obj.msg; + var maxlength = 45; + var shortmsg = shortmsg.length > maxlength ? shortmsg.substring(0, maxlength - 3) + "..." : shortmsg; + + + + } try { console.log(Object.keys(obj._attachments)[0].length) if (typeof(obj._attachments) !== 'undefined' && Object.keys(obj._attachments)[0].length > 0) { @@ -459,6 +479,12 @@ update_chat = function(obj) { //document.getElementById('chatModuleDxCall').value = dxcallsign; selected_callsign = dxcallsign; } + + + + + + var new_callsign = ` @@ -468,10 +494,13 @@ update_chat = function(obj) {
+
${dxcallsign}
- ${dxgrid} + ${dxgrid} + ${timestampHours} + ${shortmsg} - +
`; @@ -488,6 +517,20 @@ update_chat = function(obj) { var element = document.getElementById("message-container"); element.scrollTo(0, element.scrollHeight); }); + + // if callsign entry already exists - update + } else { + + // gridsquare - update only on receive + if (obj.type !== 'transmit'){ + document.getElementById('chat-' + dxcallsign +'-list-dxgrid').innerHTML = dxgrid; + } + // time + document.getElementById('chat-' + dxcallsign +'-list-time').innerHTML = timestampHours; + // short message + document.getElementById('chat-' + dxcallsign +'-list-shortmsg').innerHTML = shortmsg; + + } // APPEND MESSAGES TO CALLSIGN if (obj.status == 'transmit') { @@ -640,9 +683,9 @@ function getObjByID(id) { { "timestamp": 1648139683, "dxcallsign": "DN2LS-0", - "dxgrid": "NULL", + "dxgrid": "null", "msg": "", - "checksum": "NULL", + "checksum": "null", "type": "transmit", "status": "transmit", "uuid": "5b72a46c-49cf-40d6-8936-a64c95bc3da7", diff --git a/gui/src/chat-module.html b/gui/src/chat-module.html index e8a4a29b..1a075251 100644 --- a/gui/src/chat-module.html +++ b/gui/src/chat-module.html @@ -84,7 +84,7 @@
-
+
@@ -107,9 +107,11 @@
+ + - + diff --git a/tnc/codec2.py b/tnc/codec2.py index 42632137..47b4f2bb 100644 --- a/tnc/codec2.py +++ b/tnc/codec2.py @@ -185,11 +185,11 @@ H_1024_2048_4f rate 0.50 (2048,1024) BPF: 128 working # --------------- 2 FSK H_128_256_5, 16 bytes api.FREEDV_MODE_FSK_LDPC_0_ADV = ADVANCED() api.FREEDV_MODE_FSK_LDPC_0_ADV.interleave_frames = 0 -api.FREEDV_MODE_FSK_LDPC_0_ADV.M = 2 +api.FREEDV_MODE_FSK_LDPC_0_ADV.M = 4 api.FREEDV_MODE_FSK_LDPC_0_ADV.Rs = 100 api.FREEDV_MODE_FSK_LDPC_0_ADV.Fs = 8000 -api.FREEDV_MODE_FSK_LDPC_0_ADV.first_tone = 1500 -api.FREEDV_MODE_FSK_LDPC_0_ADV.tone_spacing = 200 +api.FREEDV_MODE_FSK_LDPC_0_ADV.first_tone = 1150 # 1250 4fsk, 1500 2fsk +api.FREEDV_MODE_FSK_LDPC_0_ADV.tone_spacing = 100 #200 api.FREEDV_MODE_FSK_LDPC_0_ADV.codename = 'H_128_256_5'.encode('utf-8') # code word # --------------- 4 H_256_512_4, 7 bytes @@ -198,7 +198,7 @@ api.FREEDV_MODE_FSK_LDPC_1_ADV.interleave_frames = 0 api.FREEDV_MODE_FSK_LDPC_1_ADV.M = 4 api.FREEDV_MODE_FSK_LDPC_1_ADV.Rs = 100 api.FREEDV_MODE_FSK_LDPC_1_ADV.Fs = 8000 -api.FREEDV_MODE_FSK_LDPC_1_ADV.first_tone = 1250 +api.FREEDV_MODE_FSK_LDPC_1_ADV.first_tone = 1250 # 1250 4fsk, 1500 2fsk api.FREEDV_MODE_FSK_LDPC_1_ADV.tone_spacing = 200 api.FREEDV_MODE_FSK_LDPC_1_ADV.codename = 'H_256_512_4'.encode('utf-8') # code word diff --git a/tnc/data_handler.py b/tnc/data_handler.py index e65ba702..9657f3ac 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -1433,6 +1433,7 @@ class DATA(): txbuffer = [ping_frame] static.TRANSMITTING = True + structlog.get_logger("structlog").info("ENABLE FSK", state=static.ENABLE_FSK) if static.ENABLE_FSK: modem.MODEM_TRANSMIT_QUEUE.put(['FSK_LDPC_0',1,0,txbuffer]) else: @@ -1473,7 +1474,7 @@ class DATA(): txbuffer = [ping_frame] static.TRANSMITTING = True - + structlog.get_logger("structlog").info("ENABLE FSK", state=static.ENABLE_FSK) if static.ENABLE_FSK: modem.MODEM_TRANSMIT_QUEUE.put(['FSK_LDPC_0',1,0,txbuffer]) else: @@ -1566,7 +1567,7 @@ class DATA(): txbuffer = [beacon_frame] static.TRANSMITTING = True - + structlog.get_logger("structlog").info("ENABLE FSK", state=static.ENABLE_FSK) if static.ENABLE_FSK: modem.MODEM_TRANSMIT_QUEUE.put(['FSK_LDPC_0',1,0,txbuffer]) else: @@ -1622,7 +1623,7 @@ class DATA(): txbuffer = [cq_frame] print(txbuffer) static.TRANSMITTING = True - + structlog.get_logger("structlog").info("ENABLE FSK", state=static.ENABLE_FSK) if static.ENABLE_FSK: modem.MODEM_TRANSMIT_QUEUE.put(['FSK_LDPC_0',2,500,txbuffer]) else: diff --git a/tnc/main.py b/tnc/main.py index e0cdd41e..c6acf545 100755 --- a/tnc/main.py +++ b/tnc/main.py @@ -84,7 +84,6 @@ if __name__ == '__main__': mycallsign = helpers.callsign_to_bytes(mycallsign) static.MYCALLSIGN = helpers.bytes_to_callsign(mycallsign) static.MYCALLSIGN_CRC = helpers.get_crc_16(static.MYCALLSIGN) - print(static.MYCALLSIGN) static.SSID_LIST = ARGS.ssid_list @@ -111,7 +110,6 @@ if __name__ == '__main__': static.TUNING_RANGE_FMAX = ARGS.tuning_range_fmax static.TX_AUDIO_LEVEL = ARGS.tx_audio_level - # we need to wait until we got all parameters from argparse first before we can load the other modules import sock diff --git a/tnc/modem.py b/tnc/modem.py index 4021fb5b..88fba30b 100644 --- a/tnc/modem.py +++ b/tnc/modem.py @@ -328,7 +328,6 @@ class RF(): # open codec2 instance self.MODE = mode - print(self.MODE) if self.MODE == 'FSK_LDPC_0' or self.MODE == 200: freedv = cast(codec2.api.freedv_open_advanced(codec2.api.FREEDV_MODE_FSK_LDPC, ctypes.byref(codec2.api.FREEDV_MODE_FSK_LDPC_0_ADV)), c_void_p) elif self.MODE == 'FSK_LDPC_1' or self.MODE == 201: @@ -342,7 +341,6 @@ class RF(): # get number of bytes per frame for mode bytes_per_frame = int(codec2.api.freedv_get_bits_per_modem_frame(freedv)/8) payload_bytes_per_frame = bytes_per_frame -2 - print(bytes_per_frame) # init buffer for data n_tx_modem_samples = codec2.api.freedv_get_n_tx_modem_samples(freedv) mod_out = create_string_buffer(n_tx_modem_samples * 2) @@ -360,12 +358,16 @@ class RF(): data_delay = int(self.MODEM_SAMPLE_RATE*(data_delay_mseconds/1000)) mod_out_silence = create_string_buffer(data_delay*2) txbuffer = bytes(mod_out_silence) + + structlog.get_logger("structlog").debug("TRANSMIT", mode=self.MODE, payload=payload_bytes_per_frame) for i in range(1,repeats+1): - # write preamble to txbuffer - codec2.api.freedv_rawdatapreambletx(freedv, mod_out_preamble) - txbuffer += bytes(mod_out_preamble) - + + # codec2 fsk preamble may be broken - at least it sounds like that so we are disabling it for testing + if not self.MODE == 'FSK_LDPC_0' or self.MODE == 200 or self.MODE == 'FSK_LDPC_1' or self.MODE == 201: + # write preamble to txbuffer + codec2.api.freedv_rawdatapreambletx(freedv, mod_out_preamble) + txbuffer += bytes(mod_out_preamble) # create modulaton for n frames in list for n in range(0,len(frames)): diff --git a/tnc/sock.py b/tnc/sock.py index 44e6542b..bcaa323f 100644 --- a/tnc/sock.py +++ b/tnc/sock.py @@ -116,7 +116,6 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler): chunk = self.request.recv(1024) data += chunk - print(data) if chunk == b'': #print("connection broken. Closing...") self.connection_alive = False @@ -175,7 +174,7 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler): try: CONNECTED_CLIENTS.remove(self.request) except: - print("client connection already removed from client list") + structlog.get_logger("structlog").warning("[SCK] client connection already removed from client list", client=self.request) def process_tnc_commands(data): @@ -193,6 +192,7 @@ def process_tnc_commands(data): # convert data to json object received_json = json.loads(data) + structlog.get_logger("structlog").debug("[SCK] CMD", command=received_json) # SET TX AUDIO LEVEL ----------------------------------------------------- if received_json["type"] == "set" and received_json["command"] == "tx_audio_level": try: @@ -297,10 +297,7 @@ def process_tnc_commands(data): # TRANSMIT RAW DATA ------------------------------------------- if received_json["type"] == 'arq' and received_json["command"] == "send_raw": - - print(received_json) - - + static.BEACON_PAUSE = True try: if not static.ARQ_SESSION: @@ -454,7 +451,7 @@ def process_daemon_commands(data): """ # convert data to json object received_json = json.loads(data) - + structlog.get_logger("structlog").debug("[SCK] CMD", command=received_json) if received_json["type"] == 'set' and received_json["command"] == 'mycallsign': try: callsign = received_json["parameter"] @@ -514,6 +511,10 @@ def process_daemon_commands(data): tuning_range_fmax = str(received_json["parameter"][0]["tuning_range_fmax"]) tx_audio_level = str(received_json["parameter"][0]["tx_audio_level"]) + # print some debugging parameters + for item in received_json["parameter"][0]: + structlog.get_logger("structlog").debug("[DMN] TNC Startup Config : " + item, value=received_json["parameter"][0][item]) + DAEMON_QUEUE.put(['STARTTNC', \ mycall, \ mygrid, \ @@ -620,7 +621,7 @@ def send_daemon_state(): return jsondata except Exception as e: - print(e) + structlog.get_logger("structlog").warning("[SCK] error", e=e) return None def command_response(command, status): diff --git a/tnc/static.py b/tnc/static.py index 7fcd68fd..754d282e 100644 --- a/tnc/static.py +++ b/tnc/static.py @@ -8,7 +8,7 @@ Here we are saving application wide variables and stats, which have to be access Not nice, suggestions are appreciated :-) """ -VERSION = '0.3.0-alpha' +VERSION = '0.3.2-alpha' # DAEMON DAEMONPORT = 3001