first attempt requesting buffer data from tnc

This commit is contained in:
DJ2LS 2023-10-11 20:26:44 +02:00
parent 4761140ba9
commit 7a381bf46d
7 changed files with 244 additions and 120 deletions

View file

@ -469,7 +469,7 @@ export function Spectrum(id, options) {
// Colors
this.colorindex = 0;
this.colormap = colormaps[2];
this.colormap = colormaps[1];
// Create main canvas and adjust dimensions to match actual
this.canvas = document.getElementById(id);

View file

@ -16,6 +16,10 @@ const state = useStateStore(pinia);
import { useChatStore } from "../store/chatStore.js";
const chat = useChatStore(pinia);
import {getRxBuffer} from '../js/sock.js'
import {
Chart as ChartJS,
CategoryScale,
@ -133,6 +137,15 @@ function newChat(obj) {
callsign = callsign.toUpperCase();
chat.callsign_list.add(callsign);
}
function syncWithTNC(){
getRxBuffer()
}
</script>
<template>
@ -160,7 +173,7 @@ function newChat(obj) {
</button>
</div>
</div>
<div class="col-7 ms-2 p-0">
<div class="col-5 ms-2 p-0">
<!-- right side of chat nav bar-->
@ -181,18 +194,22 @@ function newChat(obj) {
/>
</div>
</div>
</div>
<div class="col-2 ms-2 p-0">
<div class="input-group mb-0 p-0 ">
<button type="button" class="btn btn-secondary" @click="syncWithTNC()">
Sync with TNC
</button>
</div>
</div>
</div>
</div>
</div>
</nav>

View file

@ -140,6 +140,11 @@ export function newBroadcast(broadcastChannel, chatmessage) {
newChatObj.status = "transmitting";
newChatObj.attempt = 1;
newChatObj.uuid = uuid;
newChatObj.duration = 0;
newChatObj.nacks = 0;
newChatObj.speed_list = "null";
newChatObj._attachments = {
[filename]: {
content_type: filetype,
@ -219,6 +224,9 @@ export function newMessage(
newChatObj.status = "transmitting";
newChatObj.attempt = 1;
newChatObj.uuid = uuid;
newChatObj.duration = 0;
newChatObj.nacks = 0;
newChatObj.speed_list = "null";
newChatObj._attachments = {
[filename]: {
content_type: filetype,
@ -563,23 +571,62 @@ export function newMessageReceived(message, protocol) {
/*
PROTOCOL
{
"freedata": "tnc-message",
"arq": "transmission",
"status": "received",
"uuid": "58d64f7d-be8c-4578-879b-3b6cb3b60ddf",
"percent": 100,
"bytesperminute": 536,
"compression": 0.5714285714285714,
"timestamp": 1695203863,
"finished": 0,
"mycallsign": "DJ2LS-0",
"dxcallsign": "DJ2LS-0",
"dxgrid": "------",
"data": "bTA7MTttc2cwOzE7MDsxOzA3ZTIwOzE7MTY5NTIwMzgzMzA7MTt0ZXN0MDsxOzA7MTtwbGFpbi90ZXh0MDsxOw==",
"irs": "True",
"hmac_signed": "False"
}
{
"freedata": "tnc-message",
"arq": "transmission",
"status": "received",
"uuid": "5a3caa57-7feb-4436-853d-e341b085350f",
"percent": 100,
"bytesperminute": 206,
"compression": 0.5833333333333334,
"timestamp": 1697048385,
"finished": 0,
"mycallsign": "DJ2LS-0",
"dxcallsign": "DJ2LS-0",
"dxgrid": "------",
"data": "bTA7MTttc2cwOzE7MDsxOzBlNGE3YjQ2MDsxOzE2OTcwNDgzMTkwOzE7dGVzdDMwOzE7MDsxO3RleHQwOzE7",
"irs": "False",
"hmac_signed": "False",
"duration": 44.385897636413574,
"nacks": 1,
"speed_list": [
{
"snr": 0,
"bpm": 106,
"timestamp": 1697048362
},
{
"snr": -6,
"bpm": 104,
"timestamp": 1697048370
},
{
"snr": -6,
"bpm": 81,
"timestamp": 1697048370
},
{
"snr": -5.7,
"bpm": 161,
"timestamp": 1697048378
},
{
"snr": -5.7,
"bpm": 133,
"timestamp": 1697048379
},
{
"snr": -5.4,
"bpm": 206,
"timestamp": 1697048385
},
{
"snr": -5.8,
"bpm": 179,
"timestamp": 1697048391
}
]
}
MESSAGE; decoded from "data"
[
@ -616,6 +663,11 @@ export function newMessageReceived(message, protocol) {
newChatObj.status = protocol["status"];
newChatObj.attempt = 1;
newChatObj.uuid = message[3];
newChatObj.duration = protocol["duration"];
newChatObj.nacks = protocol["nacks"];
newChatObj.speed_list = protocol["speed_list"];
newChatObj._attachments = {
[message[6]]: {
content_type: message[7],

View file

@ -167,7 +167,7 @@ client.on("data", function (socketdata) {
continue;
}
}
console.log(data)
if (data["command"] == "tnc_state") {
//console.log(data)
// set length of RX Buffer to global variable
@ -253,7 +253,7 @@ client.on("data", function (socketdata) {
arq_rx_frame_n_bursts: data["arq_rx_frame_n_bursts"],
arq_rx_n_current_arq_frame: data["arq_rx_n_current_arq_frame"],
arq_n_arq_frames_per_data_frame:
data["arq_n_arq_frames_per_data_frame"],
data["arq_n_arq_frames_per_data_frame"],
arq_bytes_per_minute: data["arq_bytes_per_minute"],
arq_compression_factor: data["arq_compression_factor"],
routing_table: data["routing_table"],
@ -486,36 +486,6 @@ client.on("data", function (socketdata) {
}
}
// ----------- catch tnc info messages END -----------
// if we manually checking for the rx buffer we are getting an array of multiple data
if (data["command"] == "rx_buffer") {
console.log(data);
// iterate through buffer list and sort it to file or message array
dataArray = [];
messageArray = [];
for (var i = 0; i < data["data-array"].length; i++) {
try {
// we need to encode here to do a deep check for checking if file or message
//var encoded_data = atob(data['data-array'][i]['data'])
var encoded_data = atob_FD(data["data-array"][i]["data"]);
var splitted_data = encoded_data.split(split_char);
if (splitted_data[0] == "m") {
messageArray.push(data["data-array"][i]);
}
} catch (e) {
console.log(e);
}
}
let Messages = {
data: messageArray,
};
////ipcRenderer.send('request-update-rx-msg-buffer', Messages);
//ipcRenderer.send("request-new-msg-received", Messages);
}
}
//finally delete message buffer
@ -766,10 +736,8 @@ export function stopTransmission() {
export function getRxBuffer() {
var command = '{"type" : "get", "command" : "rx_buffer"}';
// call command only if new data arrived
if (rxBufferLengthGui != rxBufferLengthTnc) {
writeTncCommand(command);
}
}
// START BEACON

View file

@ -1,6 +1,15 @@
import {Spectrum} from "../assets/waterfall/spectrum.js"
import { setActivePinia } from "pinia";
import pinia from "../store/index";
setActivePinia(pinia);
import { useSettingsStore } from "../store/settingsStore.js";
const settings = useSettingsStore(pinia);
var spectrum = new Object
export function initWaterfall(){
@ -9,7 +18,8 @@ export function initWaterfall(){
wf_rows: 192, //Assuming 1 row = 1 pixe1, 192 is the height of the spectrum container
});
//spectrum.setColorMap(config.wftheme);
console.log(settings.wftheme)
spectrum.setColorMap(settings.wftheme);
}

View file

@ -717,7 +717,7 @@ class DATA:
helpers.add_to_heard_stations(
Station.dxcallsign,
Station.dxgrid,
"DATA-CHANNEL",
"DATA",
snr,
ModemParam.frequency_offset,
HamlibParam.hamlib_frequency,
@ -1090,6 +1090,19 @@ class DATA:
maxsize=RX_BUFFER.maxsize
)
try:
# RX_BUFFER[0] = transmission uuid
# RX_BUFFER[1] = timestamp
# RX_BUFFER[2] = dxcallsign
# RX_BUFFER[3] = dxgrid
# RX_BUFFER[4] = data
# RX_BUFFER[5] = hmac signed
# RX_BUFFER[6] = compression factor
# RX_BUFFER[7] = bytes per minute
# RX_BUFFER[8] = duration
# RX_BUFFER[9] = self.frame_nack_counter
# RX_BUFFER[10] = speed list stats
RX_BUFFER.put(
[
self.transmission_uuid,
@ -1097,6 +1110,12 @@ class DATA:
Station.dxcallsign,
Station.dxgrid,
base64_data,
signed,
ARQ.arq_compression_factor,
ARQ.bytes_per_minute,
duration,
self.frame_nack_counter,
ARQ.speed_list
]
)
except Exception as e:
@ -1151,7 +1170,10 @@ class DATA:
dxgrid=str(Station.dxgrid, "UTF-8"),
data=base64_data,
irs=helpers.bool_to_string(self.is_IRS),
hmac_signed=signed
hmac_signed=signed,
duration=duration,
nacks=self.frame_nack_counter,
speed_list=ARQ.speed_list
)
if TNC.enable_stats:
@ -1476,7 +1498,9 @@ class DATA:
finished=ARQ.arq_seconds_until_finish,
mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'),
irs=helpers.bool_to_string(self.is_IRS)
irs=helpers.bool_to_string(self.is_IRS),
nacks=self.frame_nack_counter,
speed_list=ARQ.speed_list
)
self.log.info(
@ -1505,7 +1529,9 @@ class DATA:
compression=ARQ.arq_compression_factor,
mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'),
irs=helpers.bool_to_string(self.is_IRS)
irs=helpers.bool_to_string(self.is_IRS),
nacks=self.frame_nack_counter,
speed_list=ARQ.speed_list
)
self.log.info(
@ -1532,7 +1558,7 @@ class DATA:
helpers.add_to_heard_stations(
self.dxcallsign,
Station.dxgrid,
"DATA-CHANNEL",
"DATA",
ModemParam.snr,
ModemParam.frequency_offset,
HamlibParam.hamlib_frequency,
@ -1587,7 +1613,7 @@ class DATA:
helpers.add_to_heard_stations(
Station.dxcallsign,
Station.dxgrid,
"DATA-CHANNEL",
"DATA",
ModemParam.snr,
ModemParam.frequency_offset,
HamlibParam.hamlib_frequency,
@ -1616,14 +1642,16 @@ class DATA:
bytesperminute=ARQ.bytes_per_minute,
mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'),
irs=helpers.bool_to_string(self.is_IRS)
irs=helpers.bool_to_string(self.is_IRS),
nacks=self.frame_nack_counter,
speed_list=ARQ.speed_list
)
Station.dxgrid = b'------'
helpers.add_to_heard_stations(
Station.dxcallsign,
Station.dxgrid,
"DATA-CHANNEL",
"DATA",
ModemParam.snr,
ModemParam.frequency_offset,
HamlibParam.hamlib_frequency,
@ -1638,7 +1666,9 @@ class DATA:
compression=ARQ.arq_compression_factor,
mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'),
irs=helpers.bool_to_string(self.is_IRS)
irs=helpers.bool_to_string(self.is_IRS),
nacks=self.frame_nack_counter,
speed_list=ARQ.speed_list
)
# Update data_channel timestamp
self.arq_session_last_received = int(time.time())
@ -1660,7 +1690,7 @@ class DATA:
helpers.add_to_heard_stations(
Station.dxcallsign,
Station.dxgrid,
"DATA-CHANNEL",
"DATA",
ModemParam.snr,
ModemParam.frequency_offset,
HamlibParam.hamlib_frequency,
@ -1913,7 +1943,7 @@ class DATA:
helpers.add_to_heard_stations(
Station.dxcallsign,
Station.dxgrid,
"DATA-CHANNEL",
"DATA",
ModemParam.snr,
ModemParam.frequency_offset,
HamlibParam.hamlib_frequency,
@ -1987,7 +2017,7 @@ class DATA:
helpers.add_to_heard_stations(
Station.dxcallsign,
Station.dxgrid,
"DATA-CHANNEL",
"DATA",
ModemParam.snr,
ModemParam.frequency_offset,
HamlibParam.hamlib_frequency,
@ -2255,7 +2285,9 @@ class DATA:
compression=ARQ.arq_compression_factor,
mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'),
irs=helpers.bool_to_string(self.is_IRS)
irs=helpers.bool_to_string(self.is_IRS),
nacks=self.frame_nack_counter,
speed_list=ARQ.speed_list
)
self.log.warning(
@ -2404,7 +2436,7 @@ class DATA:
helpers.add_to_heard_stations(
Station.dxcallsign,
Station.dxgrid,
"DATA-CHANNEL",
"DATA",
ModemParam.snr,
ModemParam.frequency_offset,
HamlibParam.hamlib_frequency,
@ -2515,7 +2547,7 @@ class DATA:
helpers.add_to_heard_stations(
Station.dxcallsign,
Station.dxgrid,
"DATA-CHANNEL",
"DATA",
ModemParam.snr,
ModemParam.frequency_offset,
HamlibParam.hamlib_frequency,

View file

@ -816,33 +816,32 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler):
def tnc_get_mesh_routing_table(self, received_json):
try:
if not RX_BUFFER.empty():
output = {
"command": "routing_table",
"routes": [],
}
output = {
"command": "routing_table",
"routes": [],
}
for _, route in enumerate(MeshParam.routing_table):
if MeshParam.routing_table[_][0].hex() == helpers.get_crc_24(b"direct").hex():
router = "direct"
else:
router = MeshParam.routing_table[_][0].hex()
output["routes"].append(
{
"dxcall": MeshParam.routing_table[_][0].hex(),
"router": router,
"hops": MeshParam.routing_table[_][2],
"snr": MeshParam.routing_table[_][3],
"score": MeshParam.routing_table[_][4],
"timestamp": MeshParam.routing_table[_][5],
}
)
for _, route in enumerate(MeshParam.routing_table):
if MeshParam.routing_table[_][0].hex() == helpers.get_crc_24(b"direct").hex():
router = "direct"
else:
router = MeshParam.routing_table[_][0].hex()
output["routes"].append(
{
"dxcall": MeshParam.routing_table[_][0].hex(),
"router": router,
"hops": MeshParam.routing_table[_][2],
"snr": MeshParam.routing_table[_][3],
"score": MeshParam.routing_table[_][4],
"timestamp": MeshParam.routing_table[_][5],
}
)
jsondata = json.dumps(output)
# self.request.sendall(bytes(jsondata, encoding))
SOCKET_QUEUE.put(jsondata)
command_response("routing_table", True)
jsondata = json.dumps(output)
# self.request.sendall(bytes(jsondata, encoding))
SOCKET_QUEUE.put(jsondata)
command_response("routing_table", True)
except Exception as err:
command_response("routing_table", False)
@ -855,26 +854,72 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler):
def tnc_get_rx_buffer(self, received_json):
try:
if not RX_BUFFER.empty():
output = {
"command": "rx_buffer",
"data-array": [],
}
# TODO: REMOVE DEPRECATED MESSAGES
#output = {
# "command": "rx_buffer",
# "data-array": [],
#}#
#for _buffer_length in range(RX_BUFFER.qsize()):
# base64_data = RX_BUFFER.queue[_buffer_length][4]
# output["data-array"].append(
# {
# "uuid": RX_BUFFER.queue[_buffer_length][0],
# "timestamp": RX_BUFFER.queue[_buffer_length][1],
# "dxcallsign": str(RX_BUFFER.queue[_buffer_length][2], "utf-8"),
# "dxgrid": str(RX_BUFFER.queue[_buffer_length][3], "utf-8"),
# "data": base64_data,
# }
# )
#jsondata = json.dumps(output)
## self.request.sendall(bytes(jsondata, encoding))
#SOCKET_QUEUE.put(jsondata)
#command_response("rx_buffer", True)
# REQUEST REQUEST RX BUFFER AGAIN
# NEW BEHAVIOUR IS, PUSHING DATA TO NETWORK LIKE WE RECEIVED IT
# RX_BUFFER[0] = transmission uuid
# RX_BUFFER[1] = timestamp
# RX_BUFFER[2] = dxcallsign
# RX_BUFFER[3] = dxgrid
# RX_BUFFER[4] = data
# RX_BUFFER[5] = hmac signed
# RX_BUFFER[6] = compression factor
# RX_BUFFER[7] = bytes per minute
# RX_BUFFER[8] = duration
# RX_BUFFER[9] = self.frame_nack_counter
# RX_BUFFER[10] = speed list stats
for _buffer_length in range(RX_BUFFER.qsize()):
base64_data = RX_BUFFER.queue[_buffer_length][4]
output["data-array"].append(
{
"uuid": RX_BUFFER.queue[_buffer_length][0],
"timestamp": RX_BUFFER.queue[_buffer_length][1],
"dxcallsign": str(RX_BUFFER.queue[_buffer_length][2], "utf-8"),
"dxgrid": str(RX_BUFFER.queue[_buffer_length][3], "utf-8"),
"data": base64_data,
}
)
jsondata = json.dumps(output)
# self.request.sendall(bytes(jsondata, encoding))
SOCKET_QUEUE.put(jsondata)
command_response("rx_buffer", True)
output = {
"freedata" : "tnc-message",
"arq" : "transmission",
"status" : "received",
"uuid" : RX_BUFFER.queue[_buffer_length][0],
"percent" : 100,
"bytesperminute" : RX_BUFFER.queue[_buffer_length][7],
"compression" : RX_BUFFER.queue[_buffer_length][6],
"timestamp" : RX_BUFFER.queue[_buffer_length][1],
"finished" : 0,
"mycallsign" : str(Station.mycallsign, "UTF-8"),
"dxcallsign" : str(RX_BUFFER.queue[_buffer_length][2], "utf-8"),
"dxgrid" : str(RX_BUFFER.queue[_buffer_length][3], "utf-8"),
"data" : RX_BUFFER.queue[_buffer_length][4],
"irs" : RX_BUFFER.queue[_buffer_length][5],
"hmac_signed" : "False",
"duration" : RX_BUFFER.queue[_buffer_length][8],
"nacks" : RX_BUFFER.queue[_buffer_length][9],
"speed_list" : RX_BUFFER.queue[_buffer_length][10]
}
jsondata = json.dumps(output)
SOCKET_QUEUE.put(jsondata)
print(jsondata)
command_response("rx_buffer", True)
except Exception as err:
command_response("rx_buffer", False)