diff --git a/gui/preload-main.js b/gui/preload-main.js
index ab64178c..1bc782bb 100644
--- a/gui/preload-main.js
+++ b/gui/preload-main.js
@@ -1589,7 +1589,30 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => {
var arq_bytes_per_minute_compressed = Math.round(arg.arq_bytes_per_minute * arg.arq_compression_factor);
}
document.getElementById("bytes_per_min_compressed").innerHTML = arq_bytes_per_minute_compressed;
-
+
+ // SET TIME LEFT UNTIL FINIHED
+ if (typeof(arg.arq_seconds_until_finish) == 'undefined') {
+ var time_left = 0;
+ } else {
+ var arq_seconds_until_finish = arg.arq_seconds_until_finish
+ var hours = Math.floor(arq_seconds_until_finish / 3600);
+ var minutes = Math.floor((arq_seconds_until_finish % 3600) / 60 );
+ var seconds = arq_seconds_until_finish % 60;
+
+ if(hours < 0) {
+ hours = 0;
+ }
+ if(minutes < 0) {
+ minutes = 0;
+ }
+ if(seconds < 0) {
+ seconds = 0;
+ }
+ var time_left = "time left: ~ "+ minutes + "min" + " " + seconds + "s";
+ }
+ document.getElementById("transmission_timeleft").innerHTML = time_left;
+
+
// SET SPEED LEVEL
@@ -1608,6 +1631,7 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => {
if(arg.speed_level >= 4) {
document.getElementById("speed_level").className = "bi bi-reception-4";
}
+
diff --git a/gui/sock.js b/gui/sock.js
index 78018b93..0a928653 100644
--- a/gui/sock.js
+++ b/gui/sock.js
@@ -221,6 +221,7 @@ client.on('data', function(socketdata) {
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'],
arq_bytes_per_minute: data['arq_bytes_per_minute'],
+ arq_seconds_until_finish: data['arq_seconds_until_finish'],
arq_compression_factor: data['arq_compression_factor'],
total_bytes: data['total_bytes'],
arq_transmission_percent: data['arq_transmission_percent'],
diff --git a/gui/src/index.html b/gui/src/index.html
index c60467ae..533993b4 100644
--- a/gui/src/index.html
+++ b/gui/src/index.html
@@ -1100,6 +1100,7 @@
diff --git a/tnc/data_handler.py b/tnc/data_handler.py
index 831b5db1..373a825b 100644
--- a/tnc/data_handler.py
+++ b/tnc/data_handler.py
@@ -685,6 +685,11 @@ class DATA:
# static.RX_FRAME_BUFFER --> existing data
# temp_burst_buffer --> new data
# search_area --> area where we want to search
+
+
+ #data_mode = self.mode_list[self.speed_level]
+ #payload_per_frame = modem.get_bytes_per_frame(data_mode) - 2
+ #search_area = payload_per_frame - 3 # (3 bytes arq frame header)
search_area = 510 - 3 # (3 bytes arq frame header)
search_position = len(static.RX_FRAME_BUFFER) - search_area
@@ -739,7 +744,7 @@ class DATA:
self.set_listening_modes(False, True, self.mode_list[self.speed_level])
# Create and send ACK frame
- self.log.info("[TNC] ARQ | RX | SENDING ACK")
+ self.log.info("[TNC] ARQ | RX | SENDING ACK", finished=static.ARQ_SECONDS_UNTIL_FINISH, bytesperminute=static.ARQ_BYTES_PER_MINUTE)
self.send_burst_ack_frame(snr)
# Reset n retries per burst counter
@@ -760,6 +765,7 @@ class DATA:
bytesperminute=static.ARQ_BYTES_PER_MINUTE,
mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'),
+ finished=static.ARQ_SECONDS_UNTIL_FINISH,
)
elif rx_n_frame_of_burst == rx_n_frames_per_burst - 1:
@@ -840,8 +846,10 @@ class DATA:
# transmittion duration
duration = time.time() - self.rx_start_of_transmission
- self.log.info("[TNC] ARQ | RX | DATA FRAME SUCCESSFULLY RECEIVED", nacks=self.frame_nack_counter,bytesperminute=static.ARQ_BYTES_PER_MINUTE, total_bytes=static.TOTAL_BYTES, duration=duration
-)
+ self.calculate_transfer_rate_rx(
+ self.rx_start_of_transmission, len(static.RX_FRAME_BUFFER)
+ )
+ self.log.info("[TNC] ARQ | RX | DATA FRAME SUCCESSFULLY RECEIVED", nacks=self.frame_nack_counter,bytesperminute=static.ARQ_BYTES_PER_MINUTE, total_bytes=static.TOTAL_BYTES, duration=duration)
# Decompress the data frame
data_frame_decompressed = lzma.decompress(data_frame)
@@ -973,11 +981,12 @@ class DATA:
overflows=static.BUFFER_OVERFLOW_COUNTER,
nacks=self.frame_nack_counter,
duration=duration,
- bytesperminute=static.ARQ_BYTES_PER_MINUTE
+ bytesperminute=static.ARQ_BYTES_PER_MINUTE,
+ data=data_frame,
)
- self.log.info("[TNC] ARQ | RX | Sending NACK")
+ self.log.info("[TNC] ARQ | RX | Sending NACK", finished=static.ARQ_SECONDS_UNTIL_FINISH, bytesperminute=static.ARQ_BYTES_PER_MINUTE)
self.send_burst_nack_frame(snr)
# Update arq_session timestamp
@@ -1018,6 +1027,7 @@ class DATA:
uuid=self.transmission_uuid,
percent=static.ARQ_TRANSMISSION_PERCENT,
bytesperminute=static.ARQ_BYTES_PER_MINUTE,
+ finished=static.ARQ_SECONDS_UNTIL_FINISH,
mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'),
)
@@ -1212,6 +1222,7 @@ class DATA:
uuid=self.transmission_uuid,
percent=static.ARQ_TRANSMISSION_PERCENT,
bytesperminute=static.ARQ_BYTES_PER_MINUTE,
+ finished=static.ARQ_SECONDS_UNTIL_FINISH,
irs_snr=self.burst_ack_snr,
mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'),
@@ -1237,6 +1248,7 @@ class DATA:
uuid=self.transmission_uuid,
percent=static.ARQ_TRANSMISSION_PERCENT,
bytesperminute=static.ARQ_BYTES_PER_MINUTE,
+ finished=static.ARQ_SECONDS_UNTIL_FINISH,
mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'),
)
@@ -1469,7 +1481,7 @@ class DATA:
)
# wait while timeout not reached and our busy state is busy
- channel_busy_timeout = time.time() + 30
+ channel_busy_timeout = time.time() + 15
while static.CHANNEL_BUSY and time.time() < channel_busy_timeout:
threading.Event().wait(0.01)
@@ -1963,7 +1975,7 @@ class DATA:
)
# wait while timeout not reached and our busy state is busy
- channel_busy_timeout = time.time() + 30
+ channel_busy_timeout = time.time() + 15
while static.CHANNEL_BUSY and time.time() < channel_busy_timeout:
threading.Event().wait(0.01)
@@ -2772,10 +2784,12 @@ class DATA:
static.ARQ_BYTES_PER_MINUTE = int(
receivedbytes / (transmissiontime / 60)
)
+ static.ARQ_SECONDS_UNTIL_FINISH = int(((static.TOTAL_BYTES - receivedbytes) / (static.ARQ_BYTES_PER_MINUTE * static.ARQ_COMPRESSION_FACTOR)) * 60) -20 # offset because of frame ack/nack
else:
static.ARQ_BITS_PER_SECOND = 0
static.ARQ_BYTES_PER_MINUTE = 0
+ static.ARQ_SECONDS_UNTIL_FINISH = 0
except Exception as err:
self.log.error(f"[TNC] calculate_transfer_rate_rx: Exception: {err}")
static.ARQ_TRANSMISSION_PERCENT = 0.0
@@ -2799,6 +2813,7 @@ class DATA:
static.ARQ_BITS_PER_SECOND = 0
static.ARQ_TRANSMISSION_PERCENT = 0
static.TOTAL_BYTES = 0
+ static.ARQ_SECONDS_UNTIL_FINISH = 0
def calculate_transfer_rate_tx(
self, tx_start_of_transmission: float, sentbytes: int, tx_buffer_length: int
@@ -2825,10 +2840,11 @@ class DATA:
if sentbytes > 0:
static.ARQ_BITS_PER_SECOND = int((sentbytes * 8) / transmissiontime)
static.ARQ_BYTES_PER_MINUTE = int(sentbytes / (transmissiontime / 60))
-
+ static.ARQ_SECONDS_UNTIL_FINISH = int(((tx_buffer_length - sentbytes) / (static.ARQ_BYTES_PER_MINUTE* static.ARQ_COMPRESSION_FACTOR)) * 60 )
else:
static.ARQ_BITS_PER_SECOND = 0
static.ARQ_BYTES_PER_MINUTE = 0
+ static.ARQ_SECONDS_UNTIL_FINISH = 0
except Exception as err:
self.log.error(f"[TNC] calculate_transfer_rate_tx: Exception: {err}")
diff --git a/tnc/sock.py b/tnc/sock.py
index 4cc0099b..69dad8fd 100644
--- a/tnc/sock.py
+++ b/tnc/sock.py
@@ -625,6 +625,7 @@ def send_tnc_state():
"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_seconds_until_finish": str(static.ARQ_SECONDS_UNTIL_FINISH),
"arq_compression_factor": str(static.ARQ_COMPRESSION_FACTOR),
"arq_transmission_percent": str(static.ARQ_TRANSMISSION_PERCENT),
"total_bytes": str(static.TOTAL_BYTES),
diff --git a/tnc/static.py b/tnc/static.py
index c94dd163..e1105937 100644
--- a/tnc/static.py
+++ b/tnc/static.py
@@ -101,6 +101,7 @@ ARQ_BITS_PER_SECOND_BURST: int = 0
ARQ_BITS_PER_SECOND: int = 0
ARQ_COMPRESSION_FACTOR: int = 0
ARQ_TRANSMISSION_PERCENT: int = 0
+ARQ_SECONDS_UNTIL_FINISH: int = 0
ARQ_SPEED_LEVEL: int = 0
TOTAL_BYTES: int = 0
# set save to folder state for allowing downloading files to local file system