From 500c657099f790f67aad7825d866f258b9b2e6ea Mon Sep 17 00:00:00 2001 From: dj2ls Date: Thu, 7 Apr 2022 11:19:29 +0200 Subject: [PATCH] extended status message now we are able viewing a unique transmission status within chat messages. One step closer to a better way of handling status --- gui/package.json | 2 +- gui/preload-chat.js | 88 ++++++++++++++++++++++++++++++++++----------- gui/sock.js | 2 ++ tnc/data_handler.py | 17 +++++---- tnc/static.py | 2 +- 5 files changed, 82 insertions(+), 29 deletions(-) diff --git a/gui/package.json b/gui/package.json index 173ac382..aabee438 100644 --- a/gui/package.json +++ b/gui/package.json @@ -1,6 +1,6 @@ { "name": "FreeDATA", - "version": "0.3.2-alpha.3", + "version": "0.3.3-alpha.1", "description": "FreeDATA ", "main": "main.js", "scripts": { diff --git a/gui/preload-chat.js b/gui/preload-chat.js index e9db6281..187f76b2 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -52,7 +52,7 @@ var db = new PouchDB(chatDB); var dxcallsigns = new Set(); db.createIndex({ index: { - fields: ['timestamp', 'uuid', 'dxcallsign', 'dxgrid', 'msg', 'checksum', 'type', 'command', 'status', '_attachments'] + fields: ['timestamp', 'uuid', 'dxcallsign', 'dxgrid', 'msg', 'checksum', 'type', 'command', 'status', 'percent', 'bytesperminute', '_attachments'] } }).then(function(result) { // handle result @@ -289,6 +289,8 @@ ipcRenderer.on('action-update-transmission-status', (event, arg) => { checksum: doc.checksum, type: "transmit", status: arg.status, + percent: arg.percent, + bytesperminute: arg.bytesperminute, uuid: doc.uuid, _attachments: doc._attachments }); @@ -474,7 +476,7 @@ update_chat = function(obj) { var filetype = filename.split('.')[1] var filesize = obj._attachments[filename]["length"] + " Bytes"; var fileheader = ` -
+

${filename} @@ -533,9 +535,13 @@ update_chat = function(obj) { document.getElementById('chat-' + dxcallsign + '-list').addEventListener('click', function() { //document.getElementById('chatModuleDxCall').value = dxcallsign; selected_callsign = dxcallsign; + // scroll to bottom var element = document.getElementById("message-container"); + console.log(element.scrollHeight) element.scrollTo(0, element.scrollHeight); + + }); // if callsign entry already exists - update @@ -553,17 +559,7 @@ update_chat = function(obj) { } // APPEND MESSAGES TO CALLSIGN - if (obj.status == 'transmit') { - var status = ''; - } else if (obj.status == 'transmitting') { - var status = ''; - } else if (obj.status == 'failed') { - var status = ''; - } else if (obj.status == 'success') { - var status = ''; - } else { - var status = ''; - } + if (!(document.getElementById('msg-' + obj._id))) { if (obj.type == 'ping') { var new_message = ` @@ -599,6 +595,7 @@ update_chat = function(obj) {

${fileheader} +

${message_html}

@@ -614,20 +611,28 @@ update_chat = function(obj) { if (obj.type == 'transmit') { + + console.log('msg-' + obj._id + '-status') var new_message = `

${fileheader} +

${message_html}

- ${timestamp} - - ${status} + ${timestamp} - + ${obj.bytesperminute} Bytes/min + ${get_icon_for_state(obj.status)}

+ +
+
+
@@ -639,11 +644,32 @@ update_chat = function(obj) { document.getElementById(id).insertAdjacentHTML("beforeend", new_message); var element = document.getElementById("message-container"); - element.scrollTo(0, element.scrollHeight); - + console.log(element.scrollHeight) + + } else if (document.getElementById('msg-' + obj._id)) { - id = "msg-" + obj._id; console.log("element already exists......") + console.log(obj) + console.log(document.getElementById('msg-' + obj._id + '-progress').getAttribute("aria-valuenow")) + + + document.getElementById('msg-' + obj._id + '-status').innerHTML = get_icon_for_state(obj.status); + document.getElementById('msg-' + obj._id + '-progress').setAttribute("aria-valuenow", obj.percent); + document.getElementById('msg-' + obj._id + '-progress').setAttribute("style", "width:" + obj.percent + "%;"); + + if (obj.percent >= 100){ + document.getElementById('msg-' + obj._id + '-progress').classList.remove("progress-bar-striped"); + document.getElementById('msg-' + obj._id + '-progress').classList.remove("progress-bar-animated"); + } else { + document.getElementById('msg-' + obj._id + '-progress').classList.add("progress-bar-striped"); + document.getElementById('msg-' + obj._id + '-progress').classList.add("progress-bar-animated"); + } + + + document.getElementById('msg-' + obj._id + '-bytesperminute').innerHTML = obj.bytesperminute + ' Bytes/min'; + + + //document.getElementById(id).className = message_class; @@ -665,13 +691,16 @@ update_chat = function(obj) { }); } // CREATE RESEND MSG EVENT LISTENER + // check if element exists and if we already created NOT created an event listener if (document.getElementById('retransmit-msg-' + obj._id) && !document.getElementById('retransmit-msg-' + obj._id).hasAttribute('listenerOnClick')) { + // set Attribute to determine if we already created an EventListener for this element + document.getElementById('retransmit-msg-' + obj._id).setAttribute('listenerOnClick', 'true'); + document.getElementById('retransmit-msg-' + obj._id).addEventListener("click", () => { - // set Attribute to determine if we already created an EventListener for this element - document.getElementById('retransmit-msg-' + obj._id).setAttribute('listenerOnClick', 'true'); - + + db.get(obj._id, { attachments: true @@ -790,3 +819,20 @@ function saveFileToFolder(id) { console.log(err); }); } + + +// function for setting an ICON to the correspinding state +function get_icon_for_state(state) { + if (state == 'transmit') { + var status_icon = ''; + } else if (state == 'transmitting') { + var status_icon = ''; + } else if (state == 'failed') { + var status_icon = ''; + } else if (state == 'success') { + var status_icon = ''; + } else { + var status_icon = ''; + } + return status_icon; +}; diff --git a/gui/sock.js b/gui/sock.js index db1f0a34..a03e5b00 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -227,6 +227,8 @@ client.on('data', function(socketdata) { let state = { status: data['status'], uuid: data['uuid'], + percent: data['percent'], + bytesperminute: data['bytesperminute'], }; ipcRenderer.send('request-update-transmission-status', state); diff --git a/tnc/data_handler.py b/tnc/data_handler.py index 04c07238..83814d82 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -668,7 +668,7 @@ class DATA(): frame_total_size = len(data_out).to_bytes(4, byteorder='big') static.INFO.append("ARQ;TRANSMITTING") - jsondata = {"arq":"transmission", "status" :"transmitting", "uuid" : self.transmission_uuid} + jsondata = {"arq":"transmission", "status" :"transmitting", "uuid" : self.transmission_uuid, "percent" : static.ARQ_TRANSMISSION_PERCENT, "bytesperminute" : static.ARQ_BYTES_PER_MINUTE} json_data_out = json.dumps(jsondata) sock.SOCKET_QUEUE.put(json_data_out) @@ -831,15 +831,20 @@ class DATA(): # update buffer position bufferposition = bufferposition_end - # # update stats + # update stats self.calculate_transfer_rate_tx(tx_start_of_transmission, bufferposition_end, len(data_out)) + + jsondata = {"arq":"transmission", "status" :"transmitting", "uuid" : self.transmission_uuid, "percent" : static.ARQ_TRANSMISSION_PERCENT, "bytesperminute" : static.ARQ_BYTES_PER_MINUTE} + json_data_out = json.dumps(jsondata) + sock.SOCKET_QUEUE.put(json_data_out) + #GOING TO NEXT ITERATION if self.data_frame_ack_received: static.INFO.append("ARQ;TRANSMITTING;SUCCESS") - jsondata = {"arq":"transmission", "status" :"success", "uuid" : self.transmission_uuid} + jsondata = {"arq":"transmission", "status" :"success", "uuid" : self.transmission_uuid, "percent" : static.ARQ_TRANSMISSION_PERCENT, "bytesperminute" : static.ARQ_BYTES_PER_MINUTE} json_data_out = json.dumps(jsondata) sock.SOCKET_QUEUE.put(json_data_out) @@ -849,7 +854,7 @@ class DATA(): else: static.INFO.append("ARQ;TRANSMITTING;FAILED") - jsondata = {"arq":"transmission", "status" :"failed", "uuid" : self.transmission_uuid} + jsondata = {"arq":"transmission", "status" :"failed", "uuid" : self.transmission_uuid, "percent" : static.ARQ_TRANSMISSION_PERCENT, "bytesperminute" : static.ARQ_BYTES_PER_MINUTE} json_data_out = json.dumps(jsondata) sock.SOCKET_QUEUE.put(json_data_out) @@ -945,7 +950,7 @@ class DATA(): """ helpers.add_to_heard_stations(static.DXCALLSIGN,static.DXGRID, 'DATA-CHANNEL', static.SNR, static.FREQ_OFFSET, static.HAMLIB_FREQUENCY) static.INFO.append("ARQ;TRANSMITTING;FAILED") - jsondata = {"arq":"transmission", "status" : "failed", "uuid" : self.transmission_uuid} + jsondata = {"arq":"transmission", "status" : "failed", "uuid" : self.transmission_uuid, "percent" : static.ARQ_TRANSMISSION_PERCENT, "bytesperminute" : static.ARQ_BYTES_PER_MINUTE} json_data_out = json.dumps(jsondata) sock.SOCKET_QUEUE.put(json_data_out) self.arq_session_last_received = int(time.time()) # we need to update our timeout timestamp @@ -1281,7 +1286,7 @@ class DATA(): if not static.ARQ_STATE and attempt == self.data_channel_max_retries: static.INFO.append("DATACHANNEL;FAILED") print(self.transmission_uuid) - jsondata = {"arq":"transmission", "status" :"failed", "uuid" : self.transmission_uuid} + jsondata = {"arq":"transmission", "status" :"failed", "uuid" : self.transmission_uuid, "percent" : static.ARQ_TRANSMISSION_PERCENT, "bytesperminute" : static.ARQ_BYTES_PER_MINUTE} json_data_out = json.dumps(jsondata) sock.SOCKET_QUEUE.put(json_data_out) diff --git a/tnc/static.py b/tnc/static.py index 754d282e..dfef3bff 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.2-alpha' +VERSION = '0.3.3-alpha' # DAEMON DAEMONPORT = 3001