introduced info toasts #80

first attempt with info toasts which seems to work fine. Next step will be adding more detailed information to them like a progress bar and specific closing
This commit is contained in:
DJ2LS 2021-10-07 21:04:23 +02:00
parent 2d18767fe6
commit 82f307cf1f
7 changed files with 1142 additions and 863 deletions

View file

@ -267,7 +267,7 @@ window.addEventListener('DOMContentLoaded', () => {
// START TRANSMISSION // START TRANSMISSION
document.getElementById("startTransmission").addEventListener("click", () => { document.getElementById("startTransmission").addEventListener("click", () => {
document.getElementById("mySidebar").style.width = "0px";
var fileList = document.getElementById("dataModalFile").files; var fileList = document.getElementById("dataModalFile").files;
var reader = new FileReader(); var reader = new FileReader();
@ -636,6 +636,119 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => {
tbl.appendChild(row); tbl.appendChild(row);
} }
// DISPLAY INFO TOASTS
if (typeof(arg.info) == 'undefined') {
var infoLength = 0
} else {
var infoLength = arg.info.length
}
for (i = 0; i < infoLength; i++) {
// SENDING CQ TOAST
if (arg.info[i] == "CQ;SENDING"){
var toastCQsending = document.getElementById('toastCQsending')
var toast = bootstrap.Toast.getOrCreateInstance(toastCQsending) // Returns a Bootstrap toast instance
toast.show()
}
// RECEIVING CQ TOAST
if (arg.info[i] == "CQ;RECEIVING"){
var toastCQreceiving = document.getElementById('toastCQreceiving')
var toast = bootstrap.Toast.getOrCreateInstance(toastCQreceiving) // Returns a Bootstrap toast instance
toast.show()
}
// SENDING PING TOAST
if (arg.info[i] == "PING;SENDING"){
var toastPINGsending = document.getElementById('toastPINGsending')
var toast = bootstrap.Toast.getOrCreateInstance(toastPINGsending) // Returns a Bootstrap toast instance
toast.show()
}
// RECEIVING PING TOAST
if (arg.info[i] == "PING;RECEIVING"){
var toastPINGreceiving = document.getElementById('toastPINGreceiving')
var toast = bootstrap.Toast.getOrCreateInstance(toastPINGreceiving) // Returns a Bootstrap toast instance
toast.show()
}
// RECEIVING PING ACK TOAST
if (arg.info[i] == "PING;RECEIVEDACK"){
var toastPINGreceivedACK = document.getElementById('toastPINGreceivedACK')
var toast = bootstrap.Toast.getOrCreateInstance(toastPINGreceivedACK) // Returns a Bootstrap toast instance
toast.show()
}
// DATACHANNEL OPENING TOAST
if (arg.info[i] == "DATACHANNEL;OPENING"){
var toastDATACHANNELopening = document.getElementById('toastDATACHANNELopening')
var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELopening) // Returns a Bootstrap toast instance
toast.show()
}
// DATACHANNEL OPEN TOAST
if (arg.info[i] == "DATACHANNEL;OPEN"){
var toastDATACHANNELopen = document.getElementById('toastDATACHANNELopen')
var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELopen) // Returns a Bootstrap toast instance
toast.show()
}
// DATACHANNEL RECEIVEDOPENER TOAST
if (arg.info[i] == "DATACHANNEL;RECEIVEDOPENER"){
var toastDATACHANNELreceivedopener = document.getElementById('toastDATACHANNELreceivedopener')
var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELreceivedopener) // Returns a Bootstrap toast instance
toast.show()
}
// DATACHANNEL FAILED TOAST
if (arg.info[i] == "DATACHANNEL;FAILED"){
var toastDATACHANNELfailed = document.getElementById('toastDATACHANNELfailed')
var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELfailed) // Returns a Bootstrap toast instance
toast.show()
}
// ARQ RECEIVING TOAST
if (arg.info[i] == "ARQ;RECEIVING"){
var toastARQreceiving = document.getElementById('toastARQreceiving')
var toast = bootstrap.Toast.getOrCreateInstance(toastARQreceiving) // Returns a Bootstrap toast instance
toast.show()
}
// ARQ RECEIVING SUCCESS TOAST
if (arg.info[i] == "ARQ;RECEIVING;SUCCESS"){
var toastARQreceivingsuccess = document.getElementById('toastARQreceivingsuccess')
var toast = bootstrap.Toast.getOrCreateInstance(toastARQreceivingsuccess) // Returns a Bootstrap toast instance
toast.show()
}
// ARQ RECEIVING FAILED TOAST
if (arg.info[i] == "ARQ;RECEIVING;FAILED"){
var toastARQreceivingfailed = document.getElementById('toastARQreceivingfailed')
var toast = bootstrap.Toast.getOrCreateInstance(toastARQreceivingfailed) // Returns a Bootstrap toast instance
toast.show()
}
// ARQ TRANSMITTING TOAST
if (arg.info[i] == "ARQ;TRANSMITTING"){
var toastARQtransmitting = document.getElementById('toastARQtransmitting')
var toast = bootstrap.Toast.getOrCreateInstance(toastARQtransmitting) // Returns a Bootstrap toast instance
toast.show()
}
// ARQ TRANSMITTING SUCCESS TOAST
if (arg.info[i] == "ARQ;TRANSMITTING;SUCCESS"){
var toastARQtransmittingsuccess = document.getElementById('toastARQtransmittingsuccess')
var toast = bootstrap.Toast.getOrCreateInstance(toastARQtransmittingsuccess) // Returns a Bootstrap toast instance
toast.show()
}
// ARQ TRANSMITTING FAILED TOAST
if (arg.info[i] == "ARQ;TRANSMITTING;FAILED"){
var toastARQtransmittingfailed = document.getElementById('toastARQtransmittingfailed')
var toast = bootstrap.Toast.getOrCreateInstance(toastARQtransmittingfailed) // Returns a Bootstrap toast instance
toast.show()
}
}
}); });
ipcRenderer.on('action-update-daemon-state', (event, arg) => { ipcRenderer.on('action-update-daemon-state', (event, arg) => {
@ -651,7 +764,7 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => {
document.getElementById("progressbar_cpu_value").innerHTML = arg.cpu_usage + "%" document.getElementById("progressbar_cpu_value").innerHTML = arg.cpu_usage + "%"
// UPDATE AUDIO INPUT // UPDATE AUDIO INPUT
if (arg.tnc_running_state == "stopped") {
if (document.getElementById("audio_input_selectbox").length != arg.input_devices.length) { if (document.getElementById("audio_input_selectbox").length != arg.input_devices.length) {
document.getElementById("audio_input_selectbox").innerHTML = "" document.getElementById("audio_input_selectbox").innerHTML = ""
for (i = 0; i < arg.input_devices.length; i++) { for (i = 0; i < arg.input_devices.length; i++) {
@ -662,8 +775,9 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => {
document.getElementById("audio_input_selectbox").add(option); document.getElementById("audio_input_selectbox").add(option);
} }
} }
}
// UPDATE AUDIO OUTPUT // UPDATE AUDIO OUTPUT
if (arg.tnc_running_state == "stopped") {
if (document.getElementById("audio_output_selectbox").length != arg.output_devices.length) { if (document.getElementById("audio_output_selectbox").length != arg.output_devices.length) {
document.getElementById("audio_output_selectbox").innerHTML = "" document.getElementById("audio_output_selectbox").innerHTML = ""
for (i = 0; i < arg.output_devices.length; i++) { for (i = 0; i < arg.output_devices.length; i++) {
@ -673,9 +787,10 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => {
document.getElementById("audio_output_selectbox").add(option); document.getElementById("audio_output_selectbox").add(option);
} }
} }
}
// UPDATE SERIAL DEVICES // UPDATE SERIAL DEVICES
if (arg.tnc_running_state == "stopped") {
if (document.getElementById("hamlib_deviceport").length != arg.serial_devices.length) { if (document.getElementById("hamlib_deviceport").length != arg.serial_devices.length) {
document.getElementById("hamlib_deviceport").innerHTML = "" document.getElementById("hamlib_deviceport").innerHTML = ""
for (i = 0; i < arg.serial_devices.length; i++) { for (i = 0; i < arg.serial_devices.length; i++) {
@ -685,7 +800,8 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => {
document.getElementById("hamlib_deviceport").add(option); document.getElementById("hamlib_deviceport").add(option);
} }
} }
}
if (arg.tnc_running_state == "stopped") {
if (document.getElementById("hamlib_ptt_port").length != arg.serial_devices.length) { if (document.getElementById("hamlib_ptt_port").length != arg.serial_devices.length) {
document.getElementById("hamlib_ptt_port").innerHTML = "" document.getElementById("hamlib_ptt_port").innerHTML = ""
for (i = 0; i < arg.serial_devices.length; i++) { for (i = 0; i < arg.serial_devices.length; i++) {
@ -695,6 +811,7 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => {
document.getElementById("hamlib_ptt_port").add(option); document.getElementById("hamlib_ptt_port").add(option);
} }
} }
}
// TNC RUNNING STATE // TNC RUNNING STATE

View file

@ -136,6 +136,7 @@ client.on('data', function(data) {
rms_level: (data['AUDIO_RMS'] / 1000) * 100, rms_level: (data['AUDIO_RMS'] / 1000) * 100,
fft: data['FFT'], fft: data['FFT'],
scatter: data['SCATTER'], scatter: data['SCATTER'],
info: data['INFO'],
rx_buffer_length: data['RX_BUFFER_LENGTH'], rx_buffer_length: data['RX_BUFFER_LENGTH'],
tx_n_max_retries: data['TX_N_MAX_RETRIES'], 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_frames_per_burst: data['ARQ_TX_N_FRAMES_PER_BURST'],

View file

@ -86,8 +86,148 @@
</nav> </nav>
<div id="blurdiv" style="-webkit-Filter: blur(10px)"> <div id="blurdiv" style="-webkit-Filter: blur(10px)">
<!--beginn of blur div --> <!--beginn of blur div -->
<!---------------------------------------------------------------------- MAIN AREA ------------------------------------------------------------> <!-------------------------------- MAIN AREA ---------------->
<!----------------------------------------------------------------------------------------------------------------------------------------------------> <!-------------------------------- INFO TOASTS ---------------->
<div aria-live="polite" aria-atomic="true" class="position-relative" style="z-index: 500">
<div class="toast-container position-absolute top-0 end-0 p-3">
<!-- SENDING CQ -->
<div class="toast align-items-center text-white bg-primary border-0" id="toastCQsending" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
Sending CQ CQ CQ
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- RECEIVING CQ -->
<div class="toast align-items-center text-white bg-primary border-0" id="toastCQreceiving" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
Receiving CQ CQ CQ
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- SENDING PING -->
<div class="toast align-items-center text-white bg-primary border-0" id="toastPINGsending" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
Sending Ping
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- RECEIVED PING -->
<div class="toast align-items-center text-white bg-primary border-0" id="toastPINGreceiving" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
RECEIVED PING REQUEST
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- RECEIVED PING ACK -->
<div class="toast align-items-center text-white bg-success border-0" id="toastPINGreceivedACK" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
RECEIVED PING ACKNOWLEDGE
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- DATACHANNEL OPENING -->
<div class="toast align-items-center text-white bg-secondary border-0" id="toastDATACHANNELopening" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
OPENING DATACHANNEL
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- DATACHANNEL OPEN -->
<div class="toast align-items-center text-white bg-success border-0" id="toastDATACHANNELopen" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
DATACHANNEL OPENED!
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- DATACHANNEL RECEIVED OPENER -->
<div class="toast align-items-center text-white bg-secondary border-0" id="toastDATACHANNELreceivedopener" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
INCOMMING FILE TRANSMISSION
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- DATACHANNEL FAILED -->
<div class="toast align-items-center text-white bg-danger border-0" id="toastDATACHANNELfailed" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
OPENING DATACHANNEL FAILED
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- ARQ RECEIVING -->
<div class="toast align-items-center text-white bg-secondary border-0" id="toastARQreceiving" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
Receiving file...
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- ARQ RECEIVING SUCCESS -->
<div class="toast align-items-center text-white bg-success border-0" id="toastARQreceivingsuccess" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
FILE SUCCESSFULL RECEIVED!
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- ARQ RECEIVING FAILED -->
<div class="toast align-items-center text-white bg-danger border-0" id="toastARQreceivingfailed" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
FILE NOT SUCCESSFULL RECEIVED!
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- ARQ TRANSMITTING -->
<div class="toast align-items-center text-white bg-secondary border-0" id="toastARQtransmitting" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
TRANSMITTING FILE...
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- ARQ TRANSMITTING FAILED -->
<div class="toast align-items-center text-white bg-danger border-0" id="toastARQtransmittingfailed" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
TRANSMITTING FILE FAILED!
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<!-- ARQ TRANSMITTING SUCCESS-->
<div class="toast align-items-center text-white bg-success border-0" id="toastARQtransmittingsuccess" role="alert" aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body">
FILE SUCCESSFULLY TRANSMITTED!
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
</div>
</div>
<!------------------------------------------------------------------------------------------>
<div class="container mt-5 p-0"> <div class="container mt-5 p-0">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
@ -105,7 +245,6 @@
<div class="input-group input-group-sm mb-1"> <div class="input-group input-group-sm mb-1">
<span class="input-group-text" id="basic-addon1">TX</span> <span class="input-group-text" id="basic-addon1">TX</span>
<select class="form-select form-select-sm" id="audio_output_selectbox" aria-label=".form-select-sm"> <select class="form-select form-select-sm" id="audio_output_selectbox" aria-label=".form-select-sm">
</select> </select>
</div> </div>
<div class="progress mb-1" style="height: 20px;" > <div class="progress mb-1" style="height: 20px;" >
@ -829,7 +968,6 @@
<!-- chart.js --> <!-- chart.js -->
<script src="../node_modules/chart.js/dist/chart.min.js"></script> <script src="../node_modules/chart.js/dist/chart.min.js"></script>
<script src="../node_modules/chartjs-plugin-annotation/dist/chartjs-plugin-annotation.min.js"></script> <script src="../node_modules/chartjs-plugin-annotation/dist/chartjs-plugin-annotation.min.js"></script>
<!--<script src="../ui.js"></script>--> <!--<script src="../ui.js"></script>-->
<!-- WATERFALL --> <!-- WATERFALL -->
<script src="waterfall/colormap.js"></script> <script src="waterfall/colormap.js"></script>

View file

@ -26,7 +26,7 @@
height: 100%; /* 100% Full-height */ height: 100%; /* 100% Full-height */
width: 0; /* 0 width - change this with JavaScript */ width: 0; /* 0 width - change this with JavaScript */
position: fixed; /* Stay in place */ position: fixed; /* Stay in place */
z-index: 1000; /* Stay on top */ z-index: 100; /* Stay on top */
top: 0; top: 0;
/*left: 1220px;*/ /*left: 1220px;*/
right: 0; right: 0;

View file

@ -86,6 +86,7 @@ def arq_data_received(data_in, bytes_per_frame):
arq_percent_burst = int((RX_N_FRAME_OF_BURST / RX_N_FRAMES_PER_BURST) * 100) arq_percent_burst = int((RX_N_FRAME_OF_BURST / RX_N_FRAMES_PER_BURST) * 100)
#arq_percent_frame = int(((RX_N_FRAME_OF_DATA_FRAME) / RX_N_FRAMES_PER_DATA_FRAME) * 100) #arq_percent_frame = int(((RX_N_FRAME_OF_DATA_FRAME) / RX_N_FRAMES_PER_DATA_FRAME) * 100)
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) 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)
static.INFO.append("ARQ;RECEIVING")
logging.log(24, "ARQ | RX | " + str(DATA_CHANNEL_MODE) + " | F:[" + str(RX_N_FRAME_OF_BURST) + "/" + str(RX_N_FRAMES_PER_BURST) + "] [" + str(arq_percent_burst).zfill(3) + "%] T:[" + str(RX_N_FRAME_OF_DATA_FRAME) + "/" + str(RX_N_FRAMES_PER_DATA_FRAME) + "] [" + str(int(static.ARQ_TRANSMISSION_PERCENT)).zfill(3) + "%] [SNR:" + str(static.SNR) + "]") logging.log(24, "ARQ | RX | " + str(DATA_CHANNEL_MODE) + " | F:[" + str(RX_N_FRAME_OF_BURST) + "/" + str(RX_N_FRAMES_PER_BURST) + "] [" + str(arq_percent_burst).zfill(3) + "%] T:[" + str(RX_N_FRAME_OF_DATA_FRAME) + "/" + str(RX_N_FRAMES_PER_DATA_FRAME) + "] [" + str(int(static.ARQ_TRANSMISSION_PERCENT)).zfill(3) + "%] [SNR:" + str(static.SNR) + "]")
@ -233,6 +234,7 @@ def arq_data_received(data_in, bytes_per_frame):
# IF THE FRAME PAYLOAD CRC IS EQUAL TO THE FRAME CRC WHICH IS KNOWN FROM THE HEADER --> SUCCESS # IF THE FRAME PAYLOAD CRC IS EQUAL TO THE FRAME CRC WHICH IS KNOWN FROM THE HEADER --> SUCCESS
if frame_payload_crc == data_frame_crc: if frame_payload_crc == data_frame_crc:
static.INFO.append("ARQ;RECEIVING;SUCCESS")
logging.log(25, "ARQ | RX | DATA FRAME SUCESSFULLY RECEIVED! :-) ") 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) 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 # append received frame to RX_BUFFER
@ -272,6 +274,7 @@ def arq_data_received(data_in, bytes_per_frame):
print("ARQ_FRAME_EOF_RECEIVED " + str(RX_FRAME_EOF_RECEIVED)) print("ARQ_FRAME_EOF_RECEIVED " + str(RX_FRAME_EOF_RECEIVED))
print(static.RX_FRAME_BUFFER) print(static.RX_FRAME_BUFFER)
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) 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)
static.INFO.append("ARQ;RECEIVING;FAILED")
logging.error("ARQ | RX | DATA FRAME NOT SUCESSFULLY RECEIVED!") logging.error("ARQ | RX | DATA FRAME NOT SUCESSFULLY RECEIVED!")
@ -341,7 +344,7 @@ def arq_transmit(data_out, mode, n_frames_per_burst):
# --------------------------------------------- LETS CREATE A BUFFER BY SPLITTING THE FILES INTO PEACES # --------------------------------------------- LETS CREATE A BUFFER BY SPLITTING THE FILES INTO PEACES
TX_BUFFER = [data_out[i:i + TX_PAYLOAD_PER_ARQ_FRAME] for i in range(0, len(data_out), TX_PAYLOAD_PER_ARQ_FRAME)] TX_BUFFER = [data_out[i:i + TX_PAYLOAD_PER_ARQ_FRAME] for i in range(0, len(data_out), TX_PAYLOAD_PER_ARQ_FRAME)]
TX_BUFFER_SIZE = len(TX_BUFFER) TX_BUFFER_SIZE = len(TX_BUFFER)
static.INFO.append("ARQ;TRANSMITTING")
logging.info("ARQ | TX | M:" + str(DATA_CHANNEL_MODE) + " | DATA FRAME --- BYTES: " + str(len(data_out)) + " ARQ FRAMES: " + str(TX_BUFFER_SIZE)) logging.info("ARQ | TX | M:" + str(DATA_CHANNEL_MODE) + " | DATA FRAME --- BYTES: " + str(len(data_out)) + " ARQ FRAMES: " + str(TX_BUFFER_SIZE))
# ----------------------- THIS IS THE MAIN LOOP----------------------------------------------------------------- # ----------------------- THIS IS THE MAIN LOOP-----------------------------------------------------------------
@ -527,12 +530,14 @@ def arq_transmit(data_out, mode, n_frames_per_burst):
# ----------- if no ACK received and out of retries.....stop frame sending # ----------- if no ACK received and out of retries.....stop frame sending
if not BURST_ACK_RECEIVED and not DATA_FRAME_ACK_RECEIVED: if not BURST_ACK_RECEIVED and not DATA_FRAME_ACK_RECEIVED:
logging.error("ARQ | TX | NO ACK RECEIVED | DATA SHOULD BE RESEND!") logging.error("ARQ | TX | NO ACK RECEIVED | DATA SHOULD BE RESEND!")
static.INFO.append("ARQ;TRANSMITTING;FAILED")
break break
# -------------------------BREAK TX BUFFER LOOP IF ALL PACKETS HAVE BEEN SENT AND WE GOT A FRAME ACK # -------------------------BREAK TX BUFFER LOOP IF ALL PACKETS HAVE BEEN SENT AND WE GOT A FRAME ACK
elif TX_N_SENT_FRAMES == TX_BUFFER_SIZE and DATA_FRAME_ACK_RECEIVED: elif TX_N_SENT_FRAMES == TX_BUFFER_SIZE and DATA_FRAME_ACK_RECEIVED:
print(TX_N_SENT_FRAMES) print(TX_N_SENT_FRAMES)
calculate_transfer_rate_tx(TX_N_SENT_FRAMES, TX_PAYLOAD_PER_ARQ_FRAME, TX_START_OF_TRANSMISSION, TX_BUFFER_SIZE) calculate_transfer_rate_tx(TX_N_SENT_FRAMES, TX_PAYLOAD_PER_ARQ_FRAME, TX_START_OF_TRANSMISSION, TX_BUFFER_SIZE)
static.INFO.append("ARQ;TRANSMITTING;SUCCESS")
logging.log(25, "ARQ | RX | FRAME ACK! - DATA TRANSMITTED! [" + str(static.ARQ_BITS_PER_SECOND) + " bit/s | " + str(static.ARQ_BYTES_PER_MINUTE) + " B/min]") logging.log(25, "ARQ | RX | FRAME ACK! - DATA TRANSMITTED! [" + str(static.ARQ_BITS_PER_SECOND) + " bit/s | " + str(static.ARQ_BYTES_PER_MINUTE) + " B/min]")
break break
@ -635,7 +640,7 @@ async def arq_open_data_channel(mode):
global DATA_CHANNEL_READY_FOR_DATA global DATA_CHANNEL_READY_FOR_DATA
global DATA_CHANNEL_LAST_RECEIVED global DATA_CHANNEL_LAST_RECEIVED
DATA_CHANNEL_MAX_RETRIES = 3 # N attempts for connecting to another station DATA_CHANNEL_MAX_RETRIES = 5 # N attempts for connecting to another station
DATA_CHANNEL_MODE = int(mode) DATA_CHANNEL_MODE = int(mode)
DATA_CHANNEL_LAST_RECEIVED = int(time.time()) DATA_CHANNEL_LAST_RECEIVED = int(time.time())
@ -650,6 +655,8 @@ async def arq_open_data_channel(mode):
while not DATA_CHANNEL_READY_FOR_DATA: while not DATA_CHANNEL_READY_FOR_DATA:
time.sleep(0.01) time.sleep(0.01)
for attempt in range(1,DATA_CHANNEL_MAX_RETRIES+1): for attempt in range(1,DATA_CHANNEL_MAX_RETRIES+1):
static.INFO.append("DATACHANNEL;OPENING")
logging.info("DATA [" + str(static.MYCALLSIGN, 'utf-8') + "]>> <<[" + str(static.DXCALLSIGN, 'utf-8') + "] A:[" + str(attempt) + "/" + str(DATA_CHANNEL_MAX_RETRIES) + "]") logging.info("DATA [" + str(static.MYCALLSIGN, 'utf-8') + "]>> <<[" + str(static.DXCALLSIGN, 'utf-8') + "] A:[" + str(attempt) + "/" + str(DATA_CHANNEL_MAX_RETRIES) + "]")
while not modem.transmit_signalling(connection_frame, 1): while not modem.transmit_signalling(connection_frame, 1):
time.sleep(0.01) time.sleep(0.01)
@ -665,6 +672,7 @@ async def arq_open_data_channel(mode):
print("attempt:" + str(attempt) + "/" + str(DATA_CHANNEL_MAX_RETRIES)) print("attempt:" + str(attempt) + "/" + str(DATA_CHANNEL_MAX_RETRIES))
if not DATA_CHANNEL_READY_FOR_DATA and attempt == DATA_CHANNEL_MAX_RETRIES: if not DATA_CHANNEL_READY_FOR_DATA and attempt == DATA_CHANNEL_MAX_RETRIES:
static.INFO.append("DATACHANNEL;FAILED")
logging.info("DATA [" + str(static.MYCALLSIGN, 'utf-8') + "]>>X<<[" + str(static.DXCALLSIGN, 'utf-8') + "]") logging.info("DATA [" + str(static.MYCALLSIGN, 'utf-8') + "]>>X<<[" + str(static.DXCALLSIGN, 'utf-8') + "]")
static.TNC_STATE = 'IDLE' static.TNC_STATE = 'IDLE'
static.ARQ_STATE = 'IDLE' static.ARQ_STATE = 'IDLE'
@ -676,6 +684,7 @@ def arq_received_data_channel_opener(data_in):
#global DATA_CHANNEL_MODE #global DATA_CHANNEL_MODE
global DATA_CHANNEL_LAST_RECEIVED global DATA_CHANNEL_LAST_RECEIVED
static.INFO.append("DATACHANNEL;RECEIVEDOPENER")
static.DXCALLSIGN_CRC8 = bytes(data_in[2:3]).rstrip(b'\x00') static.DXCALLSIGN_CRC8 = bytes(data_in[2:3]).rstrip(b'\x00')
static.DXCALLSIGN = bytes(data_in[3:9]).rstrip(b'\x00') static.DXCALLSIGN = bytes(data_in[3:9]).rstrip(b'\x00')
helpers.add_to_heard_stations(static.DXCALLSIGN,static.DXGRID, 'DATA-CHANNEL', static.SNR) helpers.add_to_heard_stations(static.DXCALLSIGN,static.DXGRID, 'DATA-CHANNEL', static.SNR)
@ -710,6 +719,7 @@ def arq_received_channel_is_open(data_in):
global DATA_CHANNEL_READY_FOR_DATA global DATA_CHANNEL_READY_FOR_DATA
global DATA_CHANNEL_MODE global DATA_CHANNEL_MODE
static.INFO.append("DATACHANNEL;OPEN")
static.DXCALLSIGN_CRC8 = bytes(data_in[2:3]).rstrip(b'\x00') static.DXCALLSIGN_CRC8 = bytes(data_in[2:3]).rstrip(b'\x00')
static.DXCALLSIGN = bytes(data_in[3:9]).rstrip(b'\x00') static.DXCALLSIGN = bytes(data_in[3:9]).rstrip(b'\x00')
helpers.add_to_heard_stations(static.DXCALLSIGN,static.DXGRID, 'DATA-CHANNEL', static.SNR) helpers.add_to_heard_stations(static.DXCALLSIGN,static.DXGRID, 'DATA-CHANNEL', static.SNR)
@ -745,6 +755,9 @@ def arq_received_channel_is_open(data_in):
def transmit_ping(callsign): def transmit_ping(callsign):
static.DXCALLSIGN = bytes(callsign, 'utf-8').rstrip(b'\x00') static.DXCALLSIGN = bytes(callsign, 'utf-8').rstrip(b'\x00')
static.DXCALLSIGN_CRC8 = helpers.get_crc_8(static.DXCALLSIGN) static.DXCALLSIGN_CRC8 = helpers.get_crc_8(static.DXCALLSIGN)
static.INFO.append("PING;SENDING")
logging.info("PING [" + str(static.MYCALLSIGN, 'utf-8') + "] >>> [" + str(static.DXCALLSIGN, 'utf-8') + "] [SNR:" + str(static.SNR) + "]") logging.info("PING [" + str(static.MYCALLSIGN, 'utf-8') + "] >>> [" + str(static.DXCALLSIGN, 'utf-8') + "] [SNR:" + str(static.SNR) + "]")
ping_frame = bytearray(14) ping_frame = bytearray(14)
@ -763,6 +776,8 @@ def received_ping(data_in):
static.DXCALLSIGN_CRC8 = bytes(data_in[2:3]).rstrip(b'\x00') static.DXCALLSIGN_CRC8 = bytes(data_in[2:3]).rstrip(b'\x00')
static.DXCALLSIGN = bytes(data_in[3:9]).rstrip(b'\x00') static.DXCALLSIGN = bytes(data_in[3:9]).rstrip(b'\x00')
helpers.add_to_heard_stations(static.DXCALLSIGN,static.DXGRID, 'PING', static.SNR) helpers.add_to_heard_stations(static.DXCALLSIGN,static.DXGRID, 'PING', static.SNR)
static.INFO.append("PING;RECEIVING")
logging.info("PING [" + str(static.MYCALLSIGN, 'utf-8') + "] <<< [" + str(static.DXCALLSIGN, 'utf-8') + "] [SNR:" + str(static.SNR) + "]") logging.info("PING [" + str(static.MYCALLSIGN, 'utf-8') + "] <<< [" + str(static.DXCALLSIGN, 'utf-8') + "] [SNR:" + str(static.SNR) + "]")
ping_frame = bytearray(14) ping_frame = bytearray(14)
@ -783,6 +798,7 @@ def received_ping_ack(data_in):
helpers.add_to_heard_stations(static.DXCALLSIGN,static.DXGRID, 'PING-ACK', static.SNR) helpers.add_to_heard_stations(static.DXCALLSIGN,static.DXGRID, 'PING-ACK', static.SNR)
static.INFO.append("PING;RECEIVEDACK")
logging.info("PING [" + str(static.MYCALLSIGN, 'utf-8') + "] >|< [" + str(static.DXCALLSIGN, 'utf-8') + "]["+ str(static.DXGRID, 'utf-8') +"] [SNR:" + str(static.SNR) + "]") logging.info("PING [" + str(static.MYCALLSIGN, 'utf-8') + "] >|< [" + str(static.DXCALLSIGN, 'utf-8') + "]["+ str(static.DXGRID, 'utf-8') +"] [SNR:" + str(static.SNR) + "]")
static.TNC_STATE = 'IDLE' static.TNC_STATE = 'IDLE'
@ -792,6 +808,7 @@ def received_ping_ack(data_in):
def transmit_cq(): def transmit_cq():
logging.info("CQ CQ CQ") logging.info("CQ CQ CQ")
static.INFO.append("CQ;SENDING")
cq_frame = bytearray(14) cq_frame = bytearray(14)
cq_frame[:1] = bytes([200]) cq_frame[:1] = bytes([200])
@ -809,7 +826,7 @@ def received_cq(data_in):
# here we add the received station to the heard stations buffer # here we add the received station to the heard stations buffer
dxcallsign = bytes(data_in[2:8]).rstrip(b'\x00') dxcallsign = bytes(data_in[2:8]).rstrip(b'\x00')
dxgrid = bytes(data_in[8:14]).rstrip(b'\x00') dxgrid = bytes(data_in[8:14]).rstrip(b'\x00')
static.INFO.append("CQ;RECEIVING")
logging.info("CQ RCVD [" + str(dxcallsign, 'utf-8') + "]["+ str(dxgrid, 'utf-8') +"] [SNR" + str(static.SNR) + "]") logging.info("CQ RCVD [" + str(dxcallsign, 'utf-8') + "]["+ str(dxgrid, 'utf-8') +"] [SNR" + str(static.SNR) + "]")
helpers.add_to_heard_stations(dxcallsign,dxgrid, 'CQ CQ CQ', static.SNR) helpers.add_to_heard_stations(dxcallsign,dxgrid, 'CQ CQ CQ', static.SNR)

View file

@ -198,7 +198,7 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
"ARQ_BYTES_PER_MINUTE_BURST": str(static.ARQ_BYTES_PER_MINUTE_BURST), "ARQ_BYTES_PER_MINUTE_BURST": str(static.ARQ_BYTES_PER_MINUTE_BURST),
"ARQ_TRANSMISSION_PERCENT": str(static.ARQ_TRANSMISSION_PERCENT), "ARQ_TRANSMISSION_PERCENT": str(static.ARQ_TRANSMISSION_PERCENT),
"TOTAL_BYTES": str(static.TOTAL_BYTES), "TOTAL_BYTES": str(static.TOTAL_BYTES),
"INFO" : static.INFO,
"STATIONS": [], "STATIONS": [],
"EOF": "EOF", "EOF": "EOF",
} }
@ -206,6 +206,9 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
# we want to transmit scatter data only once to reduce network traffic # we want to transmit scatter data only once to reduce network traffic
static.SCATTER = [] static.SCATTER = []
# we want to display INFO messages only once
static.INFO = []
for i in range(0, len(static.HEARD_STATIONS)): 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]}) 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]})

View file

@ -83,3 +83,6 @@ RX_FRAME_BUFFER = []
# ------- HEARD STATIOS BUFFER # ------- HEARD STATIOS BUFFER
HEARD_STATIONS = [] HEARD_STATIONS = []
# ------- INFO MESSAGE BUFFER
INFO = []