From 5bfd7457479b0eabca7ab39cf08578348ec72da1 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 17 Oct 2021 16:59:15 +0200 Subject: [PATCH] data_handler ready for chat messages data handler is now ready for chat messages. I updated the data frame with an additional information -datatype- so we can determine if we received a file or a message. Each datatype will be saved into an own buffer. The gui has been updated as well, so we can forward data directly to a future chat module... --- gui/main.js | 7 +++++++ gui/sock.js | 29 ++++++++++++++++++++++++++--- tnc/data_handler.py | 24 +++++++++++++++++------- tnc/sock.py | 24 +++++++++++++++++++++--- 4 files changed, 71 insertions(+), 13 deletions(-) diff --git a/gui/main.js b/gui/main.js index 63667616..46133734 100644 --- a/gui/main.js +++ b/gui/main.js @@ -208,3 +208,10 @@ ipcMain.on('run-tnc-command', (event, arg) => { ipcMain.on('request-update-rx-buffer', (event, arg) => { win.webContents.send('action-update-rx-buffer', arg); }); + +ipcMain.on('request-update-rx-,sg-buffer', (event, arg) => { + //win.webContents.send('action-update-rx-buffer', arg); + console.log("NEW MESSAGE ARRIVED!") + console.log("WE WILL HANDLE THIS AS SOON AS WE HAVE A CHAT MODULE...") + console.log(arg) +}); diff --git a/gui/sock.js b/gui/sock.js index f5d44d71..22422ed0 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -13,9 +13,11 @@ const config = require(configPath); var client = new net.Socket(); var msg = ''; // Current message, per connection. -// globals for getting new data only if available +// globals for getting new data only if available so we are saving bandwith var rxBufferLengthTnc = 0 var rxBufferLengthGui = 0 +var rxMsgBufferLengthTnc = 0 +var rxMsgBufferLengthGui = 0 // network connection Timeout setTimeout(connectTNC, 3000) @@ -122,8 +124,10 @@ client.on('data', function(data) { if (data['COMMAND'] == 'TNC_STATE') { //console.log(data) + // set length of RX Buffer to global variable rxBufferLengthTnc = data['RX_BUFFER_LENGTH'] - + rxMsgBufferLengthTnc = data['RX_MSG_BUFFER_LENGTH'] + let Data = { toe: Date.now() - data['TIMESTAMP'], // time of execution ptt_state: data['PTT_STATE'], @@ -138,6 +142,7 @@ client.on('data', function(data) { scatter: data['SCATTER'], info: data['INFO'], rx_buffer_length: data['RX_BUFFER_LENGTH'], + rx_msg_buffer_length: data['RX_MSG_BUFFER_LENGTH'], tx_n_max_retries: data['TX_N_MAX_RETRIES'], arq_tx_n_frames_per_burst: data['ARQ_TX_N_FRAMES_PER_BURST'], arq_tx_n_bursts: data['ARQ_TX_N_BURSTS'], @@ -158,7 +163,6 @@ client.on('data', function(data) { if (data['COMMAND'] == 'RX_BUFFER') { rxBufferLengthGui = data['DATA-ARRAY'].length - //console.log(rxBufferLengthGui) let Data = { data: data['DATA-ARRAY'], }; @@ -166,6 +170,15 @@ client.on('data', function(data) { ipcRenderer.send('request-update-rx-buffer', Data); } + if (data['COMMAND'] == 'RX_MSG_BUFFER') { + + rxMsgBufferLengthGui = data['DATA-ARRAY'].length + let Data = { + data: data['DATA-ARRAY'], + }; + //console.log(Data) + ipcRenderer.send('request-update-rx-msg-buffer', Data); + } // check if EOF ... } @@ -247,3 +260,13 @@ exports.getRxBuffer = function() { writeTncCommand(command) } } + +// Get RX MSG BUffer +exports.getRxBuffer = function() { + command = '{"type" : "GET", "command" : "RX_MSG_BUFFER", "timestamp" : ' + Date.now() + '}' + + // call command only if new data arrived + if (rxMsgBufferLengthGui != rxMsgBufferLengthTnc) { + writeTncCommand(command) + } +} diff --git a/tnc/data_handler.py b/tnc/data_handler.py index df3f9e09..eadcb636 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -13,6 +13,7 @@ import time from random import randrange import asyncio import sys +import ujson as json import static import modem @@ -237,9 +238,22 @@ def arq_data_received(data_in, bytes_per_frame): static.INFO.append("ARQ;RECEIVING;SUCCESS") logging.log(25, "ARQ | RX | DATA FRAME SUCESSFULLY RECEIVED! :-) ") calculate_transfer_rate_rx(RX_N_FRAMES_PER_DATA_FRAME, RX_N_FRAME_OF_DATA_FRAME, RX_START_OF_TRANSMISSION, RX_PAYLOAD_PER_ARQ_FRAME) - # append received frame to RX_BUFFER - static.RX_BUFFER.append([static.DXCALLSIGN,static.DXGRID,int(time.time()), complete_data_frame.decode("utf-8")]) + + # decode to utf-8 string + complete_data_frame = complete_data_frame.decode("utf-8") + + # decode json objects from data frame to inspect if we received a file or message + rawdata = json.loads(complete_data_frame) + # if datatype is a file, we append to RX_BUFFER, which contains files only + if rawdata["datatype"] == "file": + logging.info("RECEIVED FILE --> MOVING DATA TO RX BUFFER") + static.RX_BUFFER.append([static.DXCALLSIGN,static.DXGRID,int(time.time()), complete_data_frame]) + + # if datatype is a file, we append to RX_MSG_BUFFER, which contains messages only + if rawdata["datatype"] == "message": + static.RX_MSG_BUFFER.append([static.DXCALLSIGN,static.DXGRID,int(time.time()), complete_data_frame]) + logging.info("RECEIVED MESSAGE --> MOVING DATA TO MESSAGE BUFFER") # BUILDING ACK FRAME FOR DATA FRAME ----------------------------------------------- ack_frame = bytearray(14) ack_frame[:1] = bytes([61]) @@ -791,11 +805,7 @@ def received_ping(data_in, frequency_offset): ping_frame[2:3] = static.MYCALLSIGN_CRC8 ping_frame[3:9] = static.MYGRID ping_frame[9:11] = frequency_offset.to_bytes(2, byteorder='big', signed=True) - - #print(len(frequency_offset.to_bytes(2, byteorder='big', signed=True))) - #print(ping_frame) - #print(ping_frame[9:11]) - #print(int.from_bytes(bytes(ping_frame[9:11]), "big", signed=True)) + # wait while sending.... while not modem.transmit_signalling(ping_frame, 1): time.sleep(0.01) diff --git a/tnc/sock.py b/tnc/sock.py index c01e3041..7156580d 100644 --- a/tnc/sock.py +++ b/tnc/sock.py @@ -127,7 +127,7 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): static.DXCALLSIGN_CRC8 = helpers.get_crc_8( static.DXCALLSIGN) - rawdata = {"filename": filename, "filetype": filetype,"data": data, "checksum": checksum} + rawdata = {"datatype": "file", "filename": filename, "filetype": filetype,"data": data, "checksum": checksum} dataframe = json.dumps(rawdata) data_out = bytes(dataframe, 'utf-8') @@ -194,6 +194,7 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): "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_TRANSMISSION_PERCENT": str(static.ARQ_TRANSMISSION_PERCENT), @@ -209,6 +210,7 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): # we want to display INFO messages only once static.INFO = [] + # 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]}) @@ -232,14 +234,30 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): for i in range(0, len(static.RX_BUFFER)): 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]}) jsondata = json.dumps(output) self.request.sendall(bytes(jsondata, encoding)) + 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)): + + 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]}) + + jsondata = json.dumps(output) + self.request.sendall(bytes(jsondata, encoding)) + if received_json["type"] == 'SET' and received_json["command"] == 'DEL_RX_BUFFER': - static.RX_BUFFER = [] + static.RX_BUFFER = [] + + if received_json["type"] == 'SET' and received_json["command"] == 'DEL_RX_MSG_BUFFER': + static.RX_MSG_BUFFER = [] # exception, if JSON cant be decoded # except Exception as e: