From 940e5920a248d7cdac54aa1782486a7f9655c29a Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 11:58:43 +0000 Subject: [PATCH 01/34] Prettified Code! --- gui/src/chat-module.html | 77 +++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 32 deletions(-) diff --git a/gui/src/chat-module.html b/gui/src/chat-module.html index ff0735db..1f78ee6d 100644 --- a/gui/src/chat-module.html +++ b/gui/src/chat-module.html @@ -92,36 +92,43 @@
- - - -
+ +
+
+ +
- -
- -
-
- -
- - BROADCAST @ALL - --- - --- -
- -
-
- - - - + BROADCAST @ALL + --- + --- +
+ +
@@ -301,16 +308,22 @@ style="height: calc(100% - 150px)" > @@ -301,17 +285,7 @@ style="height: calc(100% - 150px)" > From dfd556083bca63169241e70a2731843aca12bf7d Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 12:25:19 +0000 Subject: [PATCH 03/34] Prettified Code! --- gui/preload-chat.js | 2 -- gui/src/chat-module.html | 15 ++------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index a28b566c..19bb5875 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -161,8 +161,6 @@ window.addEventListener("DOMContentLoaded", () => { "user_info_comments", ]; - - users .find({ selector: { diff --git a/gui/src/chat-module.html b/gui/src/chat-module.html index e67feb32..dddc0c7d 100644 --- a/gui/src/chat-module.html +++ b/gui/src/chat-module.html @@ -92,21 +92,12 @@
- - - -
- - - - -
+ >
@@ -284,9 +275,7 @@ id="message-container" style="height: calc(100% - 150px)" > - +
From fd21b8b71b9261a4b3de907555fee4523ab6b1a1 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 14:36:19 +0200 Subject: [PATCH 04/34] separate between callsign and broadcast --- gui/preload-chat.js | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 19bb5875..ca40b8c2 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -452,15 +452,32 @@ window.addEventListener("DOMContentLoaded", () => { "bi bi-chevron-compact-up"; document.getElementById("expand_textarea").checked = false; - console.log(file); - console.log(filename); - console.log(filetype); + //console.log(file); + //console.log(filename); + //console.log(filetype); if (filetype == "") { filetype = "plain/text"; } var timestamp = Math.floor(Date.now() / 1000); - var file_checksum = crc32(file).toString(16).toUpperCase(); + + // check if broadcast + if (dxcallsign == 'broadcast') { + + var tnc_command = "broadcast" + + let Data = { + command: tnc_command, + data: chatmessage, + }; + ipcRenderer.send("run-tnc-command", Data); + + + + } else { + var file_checksum = crc32(file).toString(16).toUpperCase(); + var tnc_command = "msg" + var file_checksum = crc32(file).toString(16).toUpperCase(); console.log(file_checksum); var data_with_attachment = timestamp + @@ -482,7 +499,7 @@ window.addEventListener("DOMContentLoaded", () => { } console.log(data_with_attachment); let Data = { - command: "msg", + command: tnc_command, dxcallsign: dxcallsign, mode: 255, frames: 5, @@ -491,6 +508,10 @@ window.addEventListener("DOMContentLoaded", () => { uuid: uuid, }; ipcRenderer.send("run-tnc-command", Data); + } + + + db.post({ _id: uuid, timestamp: timestamp, From e62cac90de539ba08409a309a4c5402762fa2f5d Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 12:36:49 +0000 Subject: [PATCH 05/34] Prettified Code! --- gui/preload-chat.js | 83 +++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 45 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index ca40b8c2..9f90fcf1 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -460,57 +460,50 @@ window.addEventListener("DOMContentLoaded", () => { } var timestamp = Math.floor(Date.now() / 1000); - // check if broadcast - if (dxcallsign == 'broadcast') { - - var tnc_command = "broadcast" + if (dxcallsign == "broadcast") { + var tnc_command = "broadcast"; let Data = { - command: tnc_command, - data: chatmessage, - }; - ipcRenderer.send("run-tnc-command", Data); - - - + command: tnc_command, + data: chatmessage, + }; + ipcRenderer.send("run-tnc-command", Data); } else { - var file_checksum = crc32(file).toString(16).toUpperCase(); - var tnc_command = "msg" - var file_checksum = crc32(file).toString(16).toUpperCase(); - console.log(file_checksum); - var data_with_attachment = - timestamp + - split_char + - chatmessage + - split_char + - filename + - split_char + - filetype + - split_char + - file; + var file_checksum = crc32(file).toString(16).toUpperCase(); + var tnc_command = "msg"; + var file_checksum = crc32(file).toString(16).toUpperCase(); + console.log(file_checksum); + var data_with_attachment = + timestamp + + split_char + + chatmessage + + split_char + + filename + + split_char + + filetype + + split_char + + file; - document.getElementById("selectFilesButton").innerHTML = ``; - var uuid = uuidv4(); - let uuidlast = uuid.lastIndexOf("-"); - uuidlast += 1; - if (uuidlast > 0) { - uuid = uuid.substring(uuidlast); + document.getElementById("selectFilesButton").innerHTML = ``; + var uuid = uuidv4(); + let uuidlast = uuid.lastIndexOf("-"); + uuidlast += 1; + if (uuidlast > 0) { + uuid = uuid.substring(uuidlast); + } + console.log(data_with_attachment); + let Data = { + command: tnc_command, + dxcallsign: dxcallsign, + mode: 255, + frames: 5, + data: data_with_attachment, + checksum: file_checksum, + uuid: uuid, + }; + ipcRenderer.send("run-tnc-command", Data); } - console.log(data_with_attachment); - let Data = { - command: tnc_command, - dxcallsign: dxcallsign, - mode: 255, - frames: 5, - data: data_with_attachment, - checksum: file_checksum, - uuid: uuid, - }; - ipcRenderer.send("run-tnc-command", Data); - } - - db.post({ _id: uuid, From 8596412a04df2c4ad989ab7d1996c670100f97f3 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 18:05:47 +0200 Subject: [PATCH 06/34] first transmit prototype for broadcasts --- gui/preload-chat.js | 85 ++++++++++++++++++++++++--------------------- gui/preload-main.js | 6 ++++ gui/sock.js | 29 ++++++++++++++++ tnc/codec2.py | 1 + tnc/config.ini | 7 ++-- tnc/data_handler.py | 28 +++++++++++---- tnc/sock.py | 3 +- tnc/static.py | 1 + 8 files changed, 111 insertions(+), 49 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 9f90fcf1..a76450f1 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -460,50 +460,57 @@ window.addEventListener("DOMContentLoaded", () => { } var timestamp = Math.floor(Date.now() / 1000); + // check if broadcast - if (dxcallsign == "broadcast") { - var tnc_command = "broadcast"; - + dxcallsign.starts + if (dxcallsign.startsWith('BC-')) { + var tnc_command = "broadcast" let Data = { - command: tnc_command, - data: chatmessage, - }; - ipcRenderer.send("run-tnc-command", Data); + command: tnc_command, + broadcastChannel: dxcallsign, + data: chatmessage, + }; + ipcRenderer.send("run-tnc-command", Data); + + + } else { - var file_checksum = crc32(file).toString(16).toUpperCase(); - var tnc_command = "msg"; - var file_checksum = crc32(file).toString(16).toUpperCase(); - console.log(file_checksum); - var data_with_attachment = - timestamp + - split_char + - chatmessage + - split_char + - filename + - split_char + - filetype + - split_char + - file; + var file_checksum = crc32(file).toString(16).toUpperCase(); + var tnc_command = "msg" + var file_checksum = crc32(file).toString(16).toUpperCase(); + console.log(file_checksum); + var data_with_attachment = + timestamp + + split_char + + chatmessage + + split_char + + filename + + split_char + + filetype + + split_char + + file; - document.getElementById("selectFilesButton").innerHTML = ``; - var uuid = uuidv4(); - let uuidlast = uuid.lastIndexOf("-"); - uuidlast += 1; - if (uuidlast > 0) { - uuid = uuid.substring(uuidlast); - } - console.log(data_with_attachment); - let Data = { - command: tnc_command, - dxcallsign: dxcallsign, - mode: 255, - frames: 5, - data: data_with_attachment, - checksum: file_checksum, - uuid: uuid, - }; - ipcRenderer.send("run-tnc-command", Data); + document.getElementById("selectFilesButton").innerHTML = ``; + var uuid = uuidv4(); + let uuidlast = uuid.lastIndexOf("-"); + uuidlast += 1; + if (uuidlast > 0) { + uuid = uuid.substring(uuidlast); } + console.log(data_with_attachment); + let Data = { + command: tnc_command, + dxcallsign: dxcallsign, + mode: 255, + frames: 5, + data: data_with_attachment, + checksum: file_checksum, + uuid: uuid, + }; + ipcRenderer.send("run-tnc-command", Data); + } + + db.post({ _id: uuid, diff --git a/gui/preload-main.js b/gui/preload-main.js index be7dc993..c62b426b 100644 --- a/gui/preload-main.js +++ b/gui/preload-main.js @@ -2785,6 +2785,12 @@ ipcRenderer.on("run-tnc-command", (event, arg) => { arg.uuid, arg.command ); + } + if (arg.command == "broadcast") { + sock.sendBroadcastChannel( + arg.broadcastChannel, + arg.data + ); } if (arg.command == "stop_transmission") { sock.stopTransmission(); diff --git a/gui/sock.js b/gui/sock.js index a2262971..ed84ac96 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -835,6 +835,35 @@ exports.sendFecIsWriting = function (mycallsign) { writeTncCommand(command); }; +// SEND FEC TO BROADCASTCHANNEL +exports.sendBroadcastChannel = function (channel, data) { + + let checksum = '' + let uuid = '' + let command = '' + data = FD.btoa_FD( + "m" + + split_char + + command + + split_char + + checksum + + split_char + + uuid + + split_char + + data + ); + + + + let payload = data; + command = + '{"type" : "fec", "command" : "transmit", "mode": "datac4", "wakeup": "True", "payload" : "' + + payload + + '"}'; + writeTncCommand(command); +}; + + // RECORD AUDIO exports.record_audio = function () { command = '{"type" : "set", "command" : "record_audio"}'; diff --git a/tnc/codec2.py b/tnc/codec2.py index 424ac8d3..12172be1 100644 --- a/tnc/codec2.py +++ b/tnc/codec2.py @@ -35,6 +35,7 @@ class FREEDV_MODE(Enum): fsk_ldpc_0 = 200 fsk_ldpc_1 = 201 + class FREEDV_MODE_USED_SLOTS(Enum): """ Enumeration for codec2 used slots diff --git a/tnc/config.ini b/tnc/config.ini index a0dba20c..a353bb3b 100644 --- a/tnc/config.ini +++ b/tnc/config.ini @@ -10,14 +10,14 @@ ssid_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [AUDIO] #audio settings -rx = 10 -tx = 10 +rx = 0 +tx = 0 txaudiolevel = 250 auto_tune = False [RADIO] #radio settings -radiocontrol = rigctld +radiocontrol = disabled rigctld_ip = 127.0.0.1 rigctld_port = 4532 @@ -38,3 +38,4 @@ tx_delay = 50 [TCI] ip = 127.0.0.1 port = 50001 + diff --git a/tnc/data_handler.py b/tnc/data_handler.py index ee7d1354..c93c2a03 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -324,15 +324,17 @@ class DATA: # [5] attempts self.open_dc_and_transmit(data[1], data[2], data[3], data[4], data[5]) - elif data[0] == "FEC": - # [1] DATA_OUT bytes - # [2] MODE str datac0/1/3... - self.send_fec_frame(data[1], data[2]) elif data[0] == "FEC_IS_WRITING": # [1] DATA_OUT bytes # [2] MODE str datac0/1/3... self.send_fec_is_writing(data[1]) + + elif data[0] == "FEC": + # [1] WAKEUP bool + # [2] MODE str datac0/1/3... + # [3] PAYLOAD + self.send_fec(data[1], data[2], data[3]) else: self.log.error( "[TNC] worker_transmit: received invalid command:", data=data @@ -3447,8 +3449,21 @@ class DATA: frame_to_tx=[test_frame], c2_mode=FREEDV_MODE.datac13.value ) - def send_fec_frame(self, payload, mode) -> None: + def send_fec(self, mode, wakeup, payload): """Send an empty test frame""" + print(mode) + print(wakeup) + print(payload) + print(codec2.FREEDV_MODE[mode.lower()].value) + if mode: + mode_int = codec2.freedv_get_mode_value_by_name("sig0") + payload_per_frame = modem.get_bytes_per_frame(mode_int) - 2 + fec_wakeup_frame = bytearray(payload_per_frame) + fec_wakeup_frame[:1] = bytes([FR_TYPE.FEC_WAKEUP.value]) + fec_wakeup_frame[1:7] = helpers.callsign_to_bytes(Station.mycallsign) + self.enqueue_frame_for_tx( + frame_to_tx=[fec_wakeup_frame], c2_mode=codec2.FREEDV_MODE[mode].value + ) mode_int = codec2.freedv_get_mode_value_by_name(mode) payload_per_frame = modem.get_bytes_per_frame(mode_int) - 2 @@ -3462,7 +3477,7 @@ class DATA: ) def send_fec_is_writing(self, mycallsign) -> None: - """Send an empty test frame""" + """Send an fec is writing frame""" fec_frame = bytearray(14) fec_frame[:1] = bytes([FR_TYPE.IS_WRITING.value]) @@ -3477,6 +3492,7 @@ class DATA: else: return False + def save_data_to_folder(self, transmission_uuid, timestamp, diff --git a/tnc/sock.py b/tnc/sock.py index b150df89..25f679b5 100644 --- a/tnc/sock.py +++ b/tnc/sock.py @@ -482,12 +482,13 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler): def tnc_fec_transmit(self, received_json): try: mode = received_json["mode"] + wakeup = received_json["wakeup"] base64data = received_json["payload"] if len(base64data) % 4: raise TypeError payload = base64.b64decode(base64data) - DATA_QUEUE_TRANSMIT.put(["FEC", payload, mode]) + DATA_QUEUE_TRANSMIT.put(["FEC", mode, wakeup, payload]) command_response("fec_transmit", True) except Exception as err: command_response("fec_transmit", False) diff --git a/tnc/static.py b/tnc/static.py index 4a6f4a4b..d480decd 100644 --- a/tnc/static.py +++ b/tnc/static.py @@ -174,6 +174,7 @@ class FRAME_TYPE(Enum): ARQ_STOP = 249 BEACON = 250 FEC = 251 + FEC_WAKEUP = 252 IDENT = 254 TEST_FRAME = 255 From 47cef4d4f0b5a628b8d5f399e7c1a448098d7e4a Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 18:12:06 +0200 Subject: [PATCH 07/34] added mycallsign handler --- tnc/data_handler.py | 11 ++++------- tnc/sock.py | 11 ++++++++++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/tnc/data_handler.py b/tnc/data_handler.py index c93c2a03..b4552c19 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -334,7 +334,8 @@ class DATA: # [1] WAKEUP bool # [2] MODE str datac0/1/3... # [3] PAYLOAD - self.send_fec(data[1], data[2], data[3]) + # [4] MYCALLSIGN + self.send_fec(data[1], data[2], data[3], data[4]) else: self.log.error( "[TNC] worker_transmit: received invalid command:", data=data @@ -3449,18 +3450,14 @@ class DATA: frame_to_tx=[test_frame], c2_mode=FREEDV_MODE.datac13.value ) - def send_fec(self, mode, wakeup, payload): + def send_fec(self, mode, wakeup, payload, mycallsign): """Send an empty test frame""" - print(mode) - print(wakeup) - print(payload) - print(codec2.FREEDV_MODE[mode.lower()].value) if mode: mode_int = codec2.freedv_get_mode_value_by_name("sig0") payload_per_frame = modem.get_bytes_per_frame(mode_int) - 2 fec_wakeup_frame = bytearray(payload_per_frame) fec_wakeup_frame[:1] = bytes([FR_TYPE.FEC_WAKEUP.value]) - fec_wakeup_frame[1:7] = helpers.callsign_to_bytes(Station.mycallsign) + fec_wakeup_frame[1:7] = helpers.callsign_to_bytes(mycallsign) self.enqueue_frame_for_tx( frame_to_tx=[fec_wakeup_frame], c2_mode=codec2.FREEDV_MODE[mode].value ) diff --git a/tnc/sock.py b/tnc/sock.py index 25f679b5..fb30e33c 100644 --- a/tnc/sock.py +++ b/tnc/sock.py @@ -488,7 +488,16 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler): raise TypeError payload = base64.b64decode(base64data) - DATA_QUEUE_TRANSMIT.put(["FEC", mode, wakeup, payload]) + try: + mycallsign = received_json["mycallsign"] + mycallsign = helpers.callsign_to_bytes(mycallsign) + mycallsign = helpers.bytes_to_callsign(mycallsign) + + except Exception: + mycallsign = Station.mycallsign + + + DATA_QUEUE_TRANSMIT.put(["FEC", mode, wakeup, payload, mycallsign]) command_response("fec_transmit", True) except Exception as err: command_response("fec_transmit", False) From c7a9a6c1f1159fccc1b638774ce9483678fbafcd Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 19:44:35 +0200 Subject: [PATCH 08/34] saved work state via commit --- tnc/data_handler.py | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/tnc/data_handler.py b/tnc/data_handler.py index b4552c19..c141167a 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -101,6 +101,8 @@ class DATA: self.rx_n_frames_per_burst = 0 self.max_n_frames_per_burst = 1 + self.fec_wakeup_received = False + # Flag to indicate if we received a low bandwidth mode channel opener self.received_LOW_BANDWIDTH_MODE = False @@ -221,6 +223,8 @@ class DATA: FR_TYPE.PING.value: (self.received_ping, "PING"), FR_TYPE.QRV.value: (self.received_qrv, "QRV"), FR_TYPE.IS_WRITING.value: (self.received_is_writing, "IS_WRITING"), + FR_TYPE.FEC.value: (self.received_fec, "FEC"), + FR_TYPE.FEC_WAKEUP.value: (self.received_fec_wakeup, "FEC WAKEUP"), } self.command_dispatcher = { @@ -2970,6 +2974,39 @@ class DATA: HamlibParam.hamlib_frequency, ) + + def received_fec_wakeup(self, data_in: bytes): + dxcallsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) + mode = helpers.bytes_to_callsign(bytes(data_in[7:8])) + bursts = helpers.bytes_to_callsign(bytes(data_in[8:9])) + + self.send_data_to_socket_queue( + freedata="tnc-message", + fec="wakeup", + mode=mode, + bursts=bursts, + dxcallsign=str(dxcallsign, "UTF-8") + ) + + self.log.info( + "[TNC] IS_WRITING RCVD [" + + str(dxcallsign, "UTF-8") + + "] ", + ) + def received_fec(self, data_in: bytes): + self.send_data_to_socket_queue( + freedata="tnc-message", + fec="payload", + data=str(data_in, "UTF-8") + ) + + self.log.info( + "[TNC] FEC DATA RCVD [" + + str(data_in, "UTF-8") + + "] ", + ) + + def received_is_writing(self, data_in: bytes) -> None: """ Called when we receive a IS WRITING frame @@ -3452,12 +3489,15 @@ class DATA: def send_fec(self, mode, wakeup, payload, mycallsign): """Send an empty test frame""" - if mode: + if wakeup: mode_int = codec2.freedv_get_mode_value_by_name("sig0") payload_per_frame = modem.get_bytes_per_frame(mode_int) - 2 fec_wakeup_frame = bytearray(payload_per_frame) fec_wakeup_frame[:1] = bytes([FR_TYPE.FEC_WAKEUP.value]) fec_wakeup_frame[1:7] = helpers.callsign_to_bytes(mycallsign) + fec_wakeup_frame[7:8] = bytes([mode_int]) + fec_wakeup_frame[8:9] = bytes([1]) # n payload bursts + self.enqueue_frame_for_tx( frame_to_tx=[fec_wakeup_frame], c2_mode=codec2.FREEDV_MODE[mode].value ) From 66ab3f4e2185e4364118918c19083211807ccb68 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 17:45:07 +0000 Subject: [PATCH 09/34] Prettified Code! --- gui/preload-chat.js | 86 +++++++++++++++++++++------------------------ gui/preload-main.js | 7 ++-- gui/sock.js | 10 ++---- 3 files changed, 45 insertions(+), 58 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index a76450f1..90312603 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -460,57 +460,51 @@ window.addEventListener("DOMContentLoaded", () => { } var timestamp = Math.floor(Date.now() / 1000); - // check if broadcast - dxcallsign.starts - if (dxcallsign.startsWith('BC-')) { - var tnc_command = "broadcast" + dxcallsign.starts; + if (dxcallsign.startsWith("BC-")) { + var tnc_command = "broadcast"; let Data = { - command: tnc_command, - broadcastChannel: dxcallsign, - data: chatmessage, - }; - ipcRenderer.send("run-tnc-command", Data); - - - + command: tnc_command, + broadcastChannel: dxcallsign, + data: chatmessage, + }; + ipcRenderer.send("run-tnc-command", Data); } else { - var file_checksum = crc32(file).toString(16).toUpperCase(); - var tnc_command = "msg" - var file_checksum = crc32(file).toString(16).toUpperCase(); - console.log(file_checksum); - var data_with_attachment = - timestamp + - split_char + - chatmessage + - split_char + - filename + - split_char + - filetype + - split_char + - file; + var file_checksum = crc32(file).toString(16).toUpperCase(); + var tnc_command = "msg"; + var file_checksum = crc32(file).toString(16).toUpperCase(); + console.log(file_checksum); + var data_with_attachment = + timestamp + + split_char + + chatmessage + + split_char + + filename + + split_char + + filetype + + split_char + + file; - document.getElementById("selectFilesButton").innerHTML = ``; - var uuid = uuidv4(); - let uuidlast = uuid.lastIndexOf("-"); - uuidlast += 1; - if (uuidlast > 0) { - uuid = uuid.substring(uuidlast); + document.getElementById("selectFilesButton").innerHTML = ``; + var uuid = uuidv4(); + let uuidlast = uuid.lastIndexOf("-"); + uuidlast += 1; + if (uuidlast > 0) { + uuid = uuid.substring(uuidlast); + } + console.log(data_with_attachment); + let Data = { + command: tnc_command, + dxcallsign: dxcallsign, + mode: 255, + frames: 5, + data: data_with_attachment, + checksum: file_checksum, + uuid: uuid, + }; + ipcRenderer.send("run-tnc-command", Data); } - console.log(data_with_attachment); - let Data = { - command: tnc_command, - dxcallsign: dxcallsign, - mode: 255, - frames: 5, - data: data_with_attachment, - checksum: file_checksum, - uuid: uuid, - }; - ipcRenderer.send("run-tnc-command", Data); - } - - db.post({ _id: uuid, diff --git a/gui/preload-main.js b/gui/preload-main.js index c62b426b..1c648964 100644 --- a/gui/preload-main.js +++ b/gui/preload-main.js @@ -2786,11 +2786,8 @@ ipcRenderer.on("run-tnc-command", (event, arg) => { arg.command ); } - if (arg.command == "broadcast") { - sock.sendBroadcastChannel( - arg.broadcastChannel, - arg.data - ); + if (arg.command == "broadcast") { + sock.sendBroadcastChannel(arg.broadcastChannel, arg.data); } if (arg.command == "stop_transmission") { sock.stopTransmission(); diff --git a/gui/sock.js b/gui/sock.js index ed84ac96..167af609 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -837,10 +837,9 @@ exports.sendFecIsWriting = function (mycallsign) { // SEND FEC TO BROADCASTCHANNEL exports.sendBroadcastChannel = function (channel, data) { - - let checksum = '' - let uuid = '' - let command = '' + let checksum = ""; + let uuid = ""; + let command = ""; data = FD.btoa_FD( "m" + split_char + @@ -853,8 +852,6 @@ exports.sendBroadcastChannel = function (channel, data) { data ); - - let payload = data; command = '{"type" : "fec", "command" : "transmit", "mode": "datac4", "wakeup": "True", "payload" : "' + @@ -863,7 +860,6 @@ exports.sendBroadcastChannel = function (channel, data) { writeTncCommand(command); }; - // RECORD AUDIO exports.record_audio = function () { command = '{"type" : "set", "command" : "record_audio"}'; From 98061ecc6b2f81a90644a63ed90d374a52d5fe90 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 21:55:17 +0200 Subject: [PATCH 10/34] added decoding part --- gui/preload-chat.js | 2 +- tnc/data_handler.py | 57 +++++++++++++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index a76450f1..d1b4f3be 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -1951,7 +1951,7 @@ async function updateAllChat(clear) { }, sort: [ { - timestamp: "desc", + timestamp: "asc", }, ], }) diff --git a/tnc/data_handler.py b/tnc/data_handler.py index c141167a..03a26e67 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -399,6 +399,8 @@ class DATA: FR_TYPE.PING.value, FR_TYPE.BEACON.value, FR_TYPE.IS_WRITING.value, + FR_TYPE.FEC.value, + FR_TYPE.FEC_WAKEUP.value, ] ): @@ -2977,8 +2979,10 @@ class DATA: def received_fec_wakeup(self, data_in: bytes): dxcallsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) - mode = helpers.bytes_to_callsign(bytes(data_in[7:8])) - bursts = helpers.bytes_to_callsign(bytes(data_in[8:9])) + mode = int.from_bytes(bytes(data_in[7:8]), "big") + bursts = int.from_bytes(bytes(data_in[8:9]), "big") + + self.set_listening_modes(True, False, mode) self.send_data_to_socket_queue( freedata="tnc-message", @@ -2988,15 +2992,29 @@ class DATA: dxcallsign=str(dxcallsign, "UTF-8") ) + timeout = time.time() + (self.longest_duration * bursts) self.log.info( - "[TNC] IS_WRITING RCVD [" + "[TNC] FRAME WAKEUP RCVD [" + str(dxcallsign, "UTF-8") - + "] ", + + "] ", mode=mode, bursts=bursts, timeout=timeout, ) + + while time.time() < timeout: + threading.Event().wait(0.01) + # TODO: We need a dynamic way of modifying this + modem.RECEIVE_DATAC4 = False + + self.log.info( + "[TNC] closing broadcast slot [" + + str(dxcallsign, "UTF-8") + + "] ", mode=mode, bursts=bursts, + ) + + def received_fec(self, data_in: bytes): self.send_data_to_socket_queue( freedata="tnc-message", - fec="payload", + fec="broadcast", data=str(data_in, "UTF-8") ) @@ -3489,23 +3507,28 @@ class DATA: def send_fec(self, mode, wakeup, payload, mycallsign): """Send an empty test frame""" - if wakeup: - mode_int = codec2.freedv_get_mode_value_by_name("sig0") - payload_per_frame = modem.get_bytes_per_frame(mode_int) - 2 - fec_wakeup_frame = bytearray(payload_per_frame) - fec_wakeup_frame[:1] = bytes([FR_TYPE.FEC_WAKEUP.value]) - fec_wakeup_frame[1:7] = helpers.callsign_to_bytes(mycallsign) - fec_wakeup_frame[7:8] = bytes([mode_int]) - fec_wakeup_frame[8:9] = bytes([1]) # n payload bursts - - self.enqueue_frame_for_tx( - frame_to_tx=[fec_wakeup_frame], c2_mode=codec2.FREEDV_MODE[mode].value - ) + print(wakeup) + print(payload) + print(mycallsign) mode_int = codec2.freedv_get_mode_value_by_name(mode) payload_per_frame = modem.get_bytes_per_frame(mode_int) - 2 fec_payload_length = payload_per_frame - 1 + if wakeup: + mode_int_wakeup = codec2.freedv_get_mode_value_by_name("sig0") + payload_per_wakeup_frame = modem.get_bytes_per_frame(mode_int_wakeup) - 2 + fec_wakeup_frame = bytearray(payload_per_wakeup_frame) + fec_wakeup_frame[:1] = bytes([FR_TYPE.FEC_WAKEUP.value]) + fec_wakeup_frame[1:7] = helpers.callsign_to_bytes(mycallsign) + fec_wakeup_frame[7:8] = bytes([mode_int]) + fec_wakeup_frame[8:9] = bytes([1]) # n payload bursts + print(mode_int_wakeup) + + self.enqueue_frame_for_tx( + frame_to_tx=[fec_wakeup_frame], c2_mode=codec2.FREEDV_MODE["sig1"].value + ) + fec_frame = bytearray(payload_per_frame) fec_frame[:1] = bytes([FR_TYPE.FEC.value]) fec_frame[1:payload_per_frame] = bytes(payload[:fec_payload_length]) From 285ad3684d424ddec5726dc67bb697ae5d4be282 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 22:47:17 +0200 Subject: [PATCH 11/34] first attempt with moving data to GUI - callsign broken yet --- gui/preload-chat.js | 21 ++++++++++++++++++++- gui/sock.js | 16 ++++++++++++++++ tnc/data_handler.py | 28 +++++++++++++--------------- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 6da4973e..d3a8dde5 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -727,8 +727,27 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { console.log(item.status); let obj = new Object(); + //handle broadcast + if (item.fec == "broadcast") { + obj.timestamp = Math.floor(Date.now() / 1000); + obj.dxcallsign = item.dxcallsign; + obj.dxgrid = 'null'; + obj.uuid = uuidv4().toString(); + obj.command = "msg"; + obj.checksum = "null"; + obj.msg = "null"; + obj.status = "received"; + obj.snr = item.snr; + obj.type = "broadcast"; + obj.filename = "null"; + obj.filetype = "null"; + obj.file = "null"; + console.log(obj) + add_obj_to_database(obj); + update_chat_obj_by_uuid(obj.uuid); + //handle ping - if (item.ping == "received") { + } else if (item.ping == "received") { obj.timestamp = parseInt(item.timestamp); obj.dxcallsign = item.dxcallsign; obj.dxgrid = item.dxgrid; diff --git a/gui/sock.js b/gui/sock.js index 167af609..1aa03a94 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -242,6 +242,22 @@ client.on("data", function (socketdata) { data: [data], }); break; + + case "broadcast": + // RX'd FEC BROADCAST + var encoded_data = FD.atob_FD(data["data"]); + var splitted_data = encoded_data.split(split_char); + var messageArray = []; + if (splitted_data[0] == "m") { + messageArray.push(data); + console.log(data); + } + + let Messages = { + data: messageArray, + }; + ipcRenderer.send("request-new-msg-received", Messages); + break; } switch (data["cq"]) { diff --git a/tnc/data_handler.py b/tnc/data_handler.py index 03a26e67..e1c3b74f 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -101,7 +101,7 @@ class DATA: self.rx_n_frames_per_burst = 0 self.max_n_frames_per_burst = 1 - self.fec_wakeup_received = False + self.fec_wakeup_callsign = bytes() # Flag to indicate if we received a low bandwidth mode channel opener self.received_LOW_BANDWIDTH_MODE = False @@ -2978,7 +2978,7 @@ class DATA: def received_fec_wakeup(self, data_in: bytes): - dxcallsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) + self.fec_wakeup_callsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) mode = int.from_bytes(bytes(data_in[7:8]), "big") bursts = int.from_bytes(bytes(data_in[8:9]), "big") @@ -2989,40 +2989,38 @@ class DATA: fec="wakeup", mode=mode, bursts=bursts, - dxcallsign=str(dxcallsign, "UTF-8") + dxcallsign=str(self.fec_wakeup_callsign, "UTF-8") ) - timeout = time.time() + (self.longest_duration * bursts) + timeout = time.time() + (self.longest_duration * bursts) + 2 self.log.info( "[TNC] FRAME WAKEUP RCVD [" - + str(dxcallsign, "UTF-8") + + str(self.fec_wakeup_callsign, "UTF-8") + "] ", mode=mode, bursts=bursts, timeout=timeout, ) while time.time() < timeout: threading.Event().wait(0.01) - # TODO: We need a dynamic way of modifying this - modem.RECEIVE_DATAC4 = False self.log.info( "[TNC] closing broadcast slot [" - + str(dxcallsign, "UTF-8") + + str(self.fec_wakeup_callsign, "UTF-8") + "] ", mode=mode, bursts=bursts, ) + # TODO: We need a dynamic way of modifying this + modem.RECEIVE_DATAC4 = False + self.fec_wakeup_callsign = bytes() def received_fec(self, data_in: bytes): self.send_data_to_socket_queue( freedata="tnc-message", fec="broadcast", - data=str(data_in, "UTF-8") + dxcallsign=str(self.fec_wakeup_callsign, "UTF-8"), + data=base64.b64encode(data_in[1:]).decode("UTF-8") ) - self.log.info( - "[TNC] FEC DATA RCVD [" - + str(data_in, "UTF-8") - + "] ", - ) + self.log.info("[TNC] FEC DATA RCVD") def received_is_writing(self, data_in: bytes) -> None: @@ -3528,7 +3526,7 @@ class DATA: self.enqueue_frame_for_tx( frame_to_tx=[fec_wakeup_frame], c2_mode=codec2.FREEDV_MODE["sig1"].value ) - + time.sleep(1) fec_frame = bytearray(payload_per_frame) fec_frame[:1] = bytes([FR_TYPE.FEC.value]) fec_frame[1:payload_per_frame] = bytes(payload[:fec_payload_length]) From 24527e221ccf9ecf61e0deca384b012caa777cd1 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 May 2023 20:47:46 +0000 Subject: [PATCH 12/34] Prettified Code! --- gui/preload-chat.js | 6 +++--- gui/sock.js | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index d3a8dde5..ce0cf1b2 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -731,7 +731,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { if (item.fec == "broadcast") { obj.timestamp = Math.floor(Date.now() / 1000); obj.dxcallsign = item.dxcallsign; - obj.dxgrid = 'null'; + obj.dxgrid = "null"; obj.uuid = uuidv4().toString(); obj.command = "msg"; obj.checksum = "null"; @@ -742,11 +742,11 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filename = "null"; obj.filetype = "null"; obj.file = "null"; - console.log(obj) + console.log(obj); add_obj_to_database(obj); update_chat_obj_by_uuid(obj.uuid); - //handle ping + //handle ping } else if (item.ping == "received") { obj.timestamp = parseInt(item.timestamp); obj.dxcallsign = item.dxcallsign; diff --git a/gui/sock.js b/gui/sock.js index 1aa03a94..07416e94 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -243,21 +243,21 @@ client.on("data", function (socketdata) { }); break; - case "broadcast": + case "broadcast": // RX'd FEC BROADCAST - var encoded_data = FD.atob_FD(data["data"]); - var splitted_data = encoded_data.split(split_char); - var messageArray = []; - if (splitted_data[0] == "m") { - messageArray.push(data); - console.log(data); - } + var encoded_data = FD.atob_FD(data["data"]); + var splitted_data = encoded_data.split(split_char); + var messageArray = []; + if (splitted_data[0] == "m") { + messageArray.push(data); + console.log(data); + } - let Messages = { - data: messageArray, - }; - ipcRenderer.send("request-new-msg-received", Messages); - break; + let Messages = { + data: messageArray, + }; + ipcRenderer.send("request-new-msg-received", Messages); + break; } switch (data["cq"]) { From 71cde7c002f97a92ccad072377556eeb200b36b8 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 May 2023 08:55:49 +0200 Subject: [PATCH 13/34] disabled broken ctests --- CMakeLists.txt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08e9be42..e41c8610 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,7 @@ add_test(NAME tnc_irs_iss python3 test_tnc.py") set_tests_properties(tnc_irs_iss PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0") -# disabled this test as its actually broken since we entroduced session IDs +# disabled this test as its actually broken since we introduced session IDs #add_test(NAME chat_text # COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src; # export PYTHONPATH=../tnc; @@ -65,12 +65,13 @@ add_test(NAME datac13_frames python3 test_datac13.py") set_tests_properties(datac13_frames PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0") -add_test(NAME datac13_frames_negative - COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src; - export PYTHONPATH=../tnc; - cd ${CMAKE_CURRENT_SOURCE_DIR}/test; - python3 test_datac13_negative.py") - set_tests_properties(datac13_frames_negative PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0") +# disabled this test as its actually broken since we introduced dataclasses +#add_test(NAME datac13_frames_negative +# COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src; +# export PYTHONPATH=../tnc; +# cd ${CMAKE_CURRENT_SOURCE_DIR}/test; +# python3 test_datac13_negative.py") +# set_tests_properties(datac13_frames_negative PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0") add_test(NAME helper_routines COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src; From b39406aa4591b2d1d5ce051a35a98ad6a7f7c090 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 May 2023 08:56:01 +0200 Subject: [PATCH 14/34] moved broadcast to own module --- tnc/broadcast.py | 101 ++++++++++++++++++++++++++++++++++++++++++++ tnc/data_handler.py | 53 ++--------------------- 2 files changed, 105 insertions(+), 49 deletions(-) create mode 100644 tnc/broadcast.py diff --git a/tnc/broadcast.py b/tnc/broadcast.py new file mode 100644 index 00000000..6866075a --- /dev/null +++ b/tnc/broadcast.py @@ -0,0 +1,101 @@ +import structlog +import threading +import helpers +import time +import modem +import base64 +from static import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, TNC +import sock +import ujson as json + + +class broadcastHandler: + """Terminal Node Controller for FreeDATA""" + + log = structlog.get_logger("BROADCAST") + + def __init__(self) -> None: + self.fec_wakeup_callsign = bytes() + self.longest_duration = 6 + + def received_fec_wakeup(self, data_in: bytes): + self.fec_wakeup_callsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) + mode = int.from_bytes(bytes(data_in[7:8]), "big") + bursts = int.from_bytes(bytes(data_in[8:9]), "big") + + modem.RECEIVE_DATAC4 = True + + self.send_data_to_socket_queue( + freedata="tnc-message", + fec="wakeup", + mode=mode, + bursts=bursts, + dxcallsign=str(self.fec_wakeup_callsign, "UTF-8") + ) + + timeout = time.time() + (self.longest_duration * bursts) + 2 + self.log.info( + "[TNC] FRAME WAKEUP RCVD [" + + str(self.fec_wakeup_callsign, "UTF-8") + + "] ", mode=mode, bursts=bursts, timeout=timeout, + ) + + while time.time() < timeout: + threading.Event().wait(0.01) + + self.log.info( + "[TNC] closing broadcast slot [" + + str(self.fec_wakeup_callsign, "UTF-8") + + "] ", mode=mode, bursts=bursts, + ) + # TODO: We need a dynamic way of modifying this + modem.RECEIVE_DATAC4 = False + self.fec_wakeup_callsign = bytes() + + + def received_fec(self, data_in: bytes): + self.send_data_to_socket_queue( + freedata="tnc-message", + fec="broadcast", + dxcallsign=str(self.fec_wakeup_callsign, "UTF-8"), + data=base64.b64encode(data_in[1:]).decode("UTF-8") + ) + + self.log.info("[TNC] FEC DATA RCVD") + + def send_data_to_socket_queue(self, **jsondata): + """ + Send information to the UI via JSON and the sock.SOCKET_QUEUE. + + Args: + Dictionary containing the data to be sent, in the format: + key=value, for each item. E.g.: + self.send_data_to_socket_queue( + freedata="tnc-message", + arq="received", + status="success", + uuid=self.transmission_uuid, + timestamp=timestamp, + mycallsign=str(self.mycallsign, "UTF-8"), + dxcallsign=str(Station.dxcallsign, "UTF-8"), + dxgrid=str(Station.dxgrid, "UTF-8"), + data=base64_data, + ) + """ + + # add mycallsign and dxcallsign to network message if they not exist + # and make sure we are not overwrite them if they exist + try: + if "mycallsign" not in jsondata: + jsondata["mycallsign"] = str(self.mycallsign, "UTF-8") + if "dxcallsign" not in jsondata: + jsondata["dxcallsign"] = str(Station.dxcallsign, "UTF-8") + except Exception as e: + self.log.debug("[TNC] error adding callsigns to network message", e=e) + + # run json dumps + json_data_out = json.dumps(jsondata) + + self.log.debug("[TNC] send_data_to_socket_queue:", jsondata=json_data_out) + # finally push data to our network queue + sock.SOCKET_QUEUE.put(json_data_out) \ No newline at end of file diff --git a/tnc/data_handler.py b/tnc/data_handler.py index e1c3b74f..dc91631d 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -28,7 +28,7 @@ import ujson as json from codec2 import FREEDV_MODE, FREEDV_MODE_USED_SLOTS from queues import DATA_QUEUE_RECEIVED, DATA_QUEUE_TRANSMIT, RX_BUFFER from static import FRAME_TYPE as FR_TYPE - +import broadcast TESTMODE = False @@ -101,7 +101,7 @@ class DATA: self.rx_n_frames_per_burst = 0 self.max_n_frames_per_burst = 1 - self.fec_wakeup_callsign = bytes() + self.broadcast = broadcast.broadcastHandler() # Flag to indicate if we received a low bandwidth mode channel opener self.received_LOW_BANDWIDTH_MODE = False @@ -223,8 +223,8 @@ class DATA: FR_TYPE.PING.value: (self.received_ping, "PING"), FR_TYPE.QRV.value: (self.received_qrv, "QRV"), FR_TYPE.IS_WRITING.value: (self.received_is_writing, "IS_WRITING"), - FR_TYPE.FEC.value: (self.received_fec, "FEC"), - FR_TYPE.FEC_WAKEUP.value: (self.received_fec_wakeup, "FEC WAKEUP"), + FR_TYPE.FEC.value: (self.broadcast.received_fec, "FEC"), + FR_TYPE.FEC_WAKEUP.value: (self.broadcast.received_fec_wakeup, "FEC WAKEUP"), } self.command_dispatcher = { @@ -2977,51 +2977,6 @@ class DATA: ) - def received_fec_wakeup(self, data_in: bytes): - self.fec_wakeup_callsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) - mode = int.from_bytes(bytes(data_in[7:8]), "big") - bursts = int.from_bytes(bytes(data_in[8:9]), "big") - - self.set_listening_modes(True, False, mode) - - self.send_data_to_socket_queue( - freedata="tnc-message", - fec="wakeup", - mode=mode, - bursts=bursts, - dxcallsign=str(self.fec_wakeup_callsign, "UTF-8") - ) - - timeout = time.time() + (self.longest_duration * bursts) + 2 - self.log.info( - "[TNC] FRAME WAKEUP RCVD [" - + str(self.fec_wakeup_callsign, "UTF-8") - + "] ", mode=mode, bursts=bursts, timeout=timeout, - ) - - while time.time() < timeout: - threading.Event().wait(0.01) - - self.log.info( - "[TNC] closing broadcast slot [" - + str(self.fec_wakeup_callsign, "UTF-8") - + "] ", mode=mode, bursts=bursts, - ) - # TODO: We need a dynamic way of modifying this - modem.RECEIVE_DATAC4 = False - self.fec_wakeup_callsign = bytes() - - - def received_fec(self, data_in: bytes): - self.send_data_to_socket_queue( - freedata="tnc-message", - fec="broadcast", - dxcallsign=str(self.fec_wakeup_callsign, "UTF-8"), - data=base64.b64encode(data_in[1:]).decode("UTF-8") - ) - - self.log.info("[TNC] FEC DATA RCVD") - def received_is_writing(self, data_in: bytes) -> None: """ From 58fd3f080b23a751260436b293e8ab01316ea042 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 May 2023 09:13:05 +0200 Subject: [PATCH 15/34] adjusted threaded broadcast watchdog --- tnc/broadcast.py | 51 ++++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/tnc/broadcast.py b/tnc/broadcast.py index 6866075a..7281d70c 100644 --- a/tnc/broadcast.py +++ b/tnc/broadcast.py @@ -17,43 +17,40 @@ class broadcastHandler: def __init__(self) -> None: self.fec_wakeup_callsign = bytes() self.longest_duration = 6 + self.broadcast_timeout_reached = False + self.broadcast_payload_bursts = 1 + self.broadcast_watchdog = threading.Thread( + target=self.watchdog, name="watchdog thread", daemon=True + ) + + def received_fec_wakeup(self, data_in: bytes): self.fec_wakeup_callsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) - mode = int.from_bytes(bytes(data_in[7:8]), "big") + self.wakeup_mode = int.from_bytes(bytes(data_in[7:8]), "big") bursts = int.from_bytes(bytes(data_in[8:9]), "big") + self.broadcast_watchdog.start() + modem.RECEIVE_DATAC4 = True self.send_data_to_socket_queue( freedata="tnc-message", fec="wakeup", - mode=mode, + mode=self.wakeup_mode, bursts=bursts, dxcallsign=str(self.fec_wakeup_callsign, "UTF-8") ) - timeout = time.time() + (self.longest_duration * bursts) + 2 self.log.info( "[TNC] FRAME WAKEUP RCVD [" + str(self.fec_wakeup_callsign, "UTF-8") - + "] ", mode=mode, bursts=bursts, timeout=timeout, + + "] ", mode=self.wakeup_mode, bursts=bursts, ) - while time.time() < timeout: - threading.Event().wait(0.01) - - self.log.info( - "[TNC] closing broadcast slot [" - + str(self.fec_wakeup_callsign, "UTF-8") - + "] ", mode=mode, bursts=bursts, - ) - # TODO: We need a dynamic way of modifying this - modem.RECEIVE_DATAC4 = False - self.fec_wakeup_callsign = bytes() - - def received_fec(self, data_in: bytes): + print(self.fec_wakeup_callsign) + self.send_data_to_socket_queue( freedata="tnc-message", fec="broadcast", @@ -87,7 +84,7 @@ class broadcastHandler: # and make sure we are not overwrite them if they exist try: if "mycallsign" not in jsondata: - jsondata["mycallsign"] = str(self.mycallsign, "UTF-8") + jsondata["mycallsign"] = str(Station.mycallsign, "UTF-8") if "dxcallsign" not in jsondata: jsondata["dxcallsign"] = str(Station.dxcallsign, "UTF-8") except Exception as e: @@ -98,4 +95,20 @@ class broadcastHandler: self.log.debug("[TNC] send_data_to_socket_queue:", jsondata=json_data_out) # finally push data to our network queue - sock.SOCKET_QUEUE.put(json_data_out) \ No newline at end of file + sock.SOCKET_QUEUE.put(json_data_out) + + def watchdog(self): + timeout = time.time() + (self.longest_duration * self.broadcast_payload_bursts) + 2 + while time.time() < timeout: + threading.Event().wait(0.01) + + self.broadcast_timeout_reached = True + + self.log.info( + "[TNC] closing broadcast slot [" + + str(self.fec_wakeup_callsign, "UTF-8") + + "] ", mode=self.wakeup_mode, bursts=self.broadcast_payload_bursts, + ) + # TODO: We need a dynamic way of modifying this + modem.RECEIVE_DATAC4 = False + self.fec_wakeup_callsign = bytes() \ No newline at end of file From b2a2f426f52e061b475ee397b6afd4f291661c92 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 May 2023 10:04:41 +0200 Subject: [PATCH 16/34] forward data to chat - still broken --- gui/preload-chat.js | 43 +++++++++++++++++++++++++++++++++++++++++-- gui/sock.js | 2 +- tnc/broadcast.py | 36 ++++++++++++++++++++---------------- 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index ce0cf1b2..d34fdb88 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -463,6 +463,11 @@ window.addEventListener("DOMContentLoaded", () => { // check if broadcast dxcallsign.starts; if (dxcallsign.startsWith("BC-")) { + let broadcastChannelId = dxcallsign.split("BC-")[1]; + broadcastChannelIdCRC = crc32(broadcastChannelId).toString(16).toUpperCase(); + + + dxcallsignWithID = "BC-" + broadcastChannelIdCRC; var tnc_command = "broadcast"; let Data = { command: tnc_command, @@ -729,13 +734,25 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { //handle broadcast if (item.fec == "broadcast") { + + console.log("BROADCAST RECEIVED") + console.log(item) + var transmitting_station = item.dxcallsign; + var encoded_data = FD.atob_FD(item.data); + var splitted_data = encoded_data.split(split_char); + console.log(splitted_data); + + + // add callsign to message: + var message = transmitting_station + ":" + splitted_data[4]; + console.log(message) obj.timestamp = Math.floor(Date.now() / 1000); - obj.dxcallsign = item.dxcallsign; + obj.dxcallsign = splitted_data[1]; obj.dxgrid = "null"; obj.uuid = uuidv4().toString(); obj.command = "msg"; obj.checksum = "null"; - obj.msg = "null"; + obj.msg = message; obj.status = "received"; obj.snr = item.snr; obj.type = "broadcast"; @@ -1246,6 +1263,28 @@ update_chat = function (obj) { `; } + + if (obj.type == "broadcast") { + var new_message = ` +
+ +
+ +
+ +
+

${message_html}

+

+ ${timestamp} + +

+
+
+
+ ${controlarea_receive} +
+ `; + } if (obj.type == "transmit") { //console.log('msg-' + obj._id + '-status') diff --git a/gui/sock.js b/gui/sock.js index 07416e94..28fc0bd6 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -859,7 +859,7 @@ exports.sendBroadcastChannel = function (channel, data) { data = FD.btoa_FD( "m" + split_char + - command + + channel + split_char + checksum + split_char + diff --git a/tnc/broadcast.py b/tnc/broadcast.py index 7281d70c..0d6a5b41 100644 --- a/tnc/broadcast.py +++ b/tnc/broadcast.py @@ -17,20 +17,19 @@ class broadcastHandler: def __init__(self) -> None: self.fec_wakeup_callsign = bytes() self.longest_duration = 6 + self.wakeup_received = False self.broadcast_timeout_reached = False self.broadcast_payload_bursts = 1 self.broadcast_watchdog = threading.Thread( target=self.watchdog, name="watchdog thread", daemon=True ) - - + self.broadcast_watchdog.start() def received_fec_wakeup(self, data_in: bytes): self.fec_wakeup_callsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) self.wakeup_mode = int.from_bytes(bytes(data_in[7:8]), "big") bursts = int.from_bytes(bytes(data_in[8:9]), "big") - - self.broadcast_watchdog.start() + self.wakeup_received = True modem.RECEIVE_DATAC4 = True @@ -98,17 +97,22 @@ class broadcastHandler: sock.SOCKET_QUEUE.put(json_data_out) def watchdog(self): - timeout = time.time() + (self.longest_duration * self.broadcast_payload_bursts) + 2 - while time.time() < timeout: - threading.Event().wait(0.01) + while 1: + if self.wakeup_received: + timeout = time.time() + (self.longest_duration * self.broadcast_payload_bursts) + 2 + while time.time() < timeout: + threading.Event().wait(0.01) - self.broadcast_timeout_reached = True + self.broadcast_timeout_reached = True - self.log.info( - "[TNC] closing broadcast slot [" - + str(self.fec_wakeup_callsign, "UTF-8") - + "] ", mode=self.wakeup_mode, bursts=self.broadcast_payload_bursts, - ) - # TODO: We need a dynamic way of modifying this - modem.RECEIVE_DATAC4 = False - self.fec_wakeup_callsign = bytes() \ No newline at end of file + self.log.info( + "[TNC] closing broadcast slot [" + + str(self.fec_wakeup_callsign, "UTF-8") + + "] ", mode=self.wakeup_mode, bursts=self.broadcast_payload_bursts, + ) + # TODO: We need a dynamic way of modifying this + modem.RECEIVE_DATAC4 = False + self.fec_wakeup_callsign = bytes() + self.wakeup_received = False + else: + threading.Event().wait(0.01) From 0137bf01e7d5e17d96e5f74413092a56e9707db6 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 May 2023 08:05:22 +0000 Subject: [PATCH 17/34] Prettified Code! --- gui/preload-chat.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index d34fdb88..a1d1ed8b 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -463,9 +463,10 @@ window.addEventListener("DOMContentLoaded", () => { // check if broadcast dxcallsign.starts; if (dxcallsign.startsWith("BC-")) { - let broadcastChannelId = dxcallsign.split("BC-")[1]; - broadcastChannelIdCRC = crc32(broadcastChannelId).toString(16).toUpperCase(); - + let broadcastChannelId = dxcallsign.split("BC-")[1]; + broadcastChannelIdCRC = crc32(broadcastChannelId) + .toString(16) + .toUpperCase(); dxcallsignWithID = "BC-" + broadcastChannelIdCRC; var tnc_command = "broadcast"; @@ -734,18 +735,16 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { //handle broadcast if (item.fec == "broadcast") { - - console.log("BROADCAST RECEIVED") - console.log(item) + console.log("BROADCAST RECEIVED"); + console.log(item); var transmitting_station = item.dxcallsign; var encoded_data = FD.atob_FD(item.data); var splitted_data = encoded_data.split(split_char); console.log(splitted_data); - // add callsign to message: var message = transmitting_station + ":" + splitted_data[4]; - console.log(message) + console.log(message); obj.timestamp = Math.floor(Date.now() / 1000); obj.dxcallsign = splitted_data[1]; obj.dxgrid = "null"; @@ -1264,8 +1263,8 @@ update_chat = function (obj) { `; } - if (obj.type == "broadcast") { - var new_message = ` + if (obj.type == "broadcast") { + var new_message = `
@@ -1284,7 +1283,7 @@ update_chat = function (obj) { ${controlarea_receive}
`; - } + } if (obj.type == "transmit") { //console.log('msg-' + obj._id + '-status') From a4a4625c3498eb56897f06c13236fe2466702559 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 May 2023 10:13:11 +0200 Subject: [PATCH 18/34] version update --- gui/preload-chat.js | 25 ++++++++++++++----------- tnc/static.py | 2 +- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index a1d1ed8b..546f2c5e 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -463,10 +463,9 @@ window.addEventListener("DOMContentLoaded", () => { // check if broadcast dxcallsign.starts; if (dxcallsign.startsWith("BC-")) { - let broadcastChannelId = dxcallsign.split("BC-")[1]; - broadcastChannelIdCRC = crc32(broadcastChannelId) - .toString(16) - .toUpperCase(); + let broadcastChannelId = dxcallsign.split("BC-")[1]; + broadcastChannelIdCRC = crc32(broadcastChannelId).toString(16).toUpperCase(); + dxcallsignWithID = "BC-" + broadcastChannelIdCRC; var tnc_command = "broadcast"; @@ -735,16 +734,18 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { //handle broadcast if (item.fec == "broadcast") { - console.log("BROADCAST RECEIVED"); - console.log(item); + + console.log("BROADCAST RECEIVED") + console.log(item) var transmitting_station = item.dxcallsign; var encoded_data = FD.atob_FD(item.data); var splitted_data = encoded_data.split(split_char); console.log(splitted_data); + // add callsign to message: var message = transmitting_station + ":" + splitted_data[4]; - console.log(message); + console.log(message) obj.timestamp = Math.floor(Date.now() / 1000); obj.dxcallsign = splitted_data[1]; obj.dxgrid = "null"; @@ -1263,8 +1264,8 @@ update_chat = function (obj) { `; } - if (obj.type == "broadcast") { - var new_message = ` + if (obj.type == "broadcast") { + var new_message = `
@@ -1280,10 +1281,12 @@ update_chat = function (obj) {
- ${controlarea_receive} +
+ +
`; - } + } if (obj.type == "transmit") { //console.log('msg-' + obj._id + '-status') diff --git a/tnc/static.py b/tnc/static.py index d480decd..99744389 100644 --- a/tnc/static.py +++ b/tnc/static.py @@ -127,7 +127,7 @@ class TCIParam: @dataclass class TNC: - version = "0.9.1-alpha.3" + version = "0.9.2-alpha.1" host: str = "0.0.0.0" port: int = 3000 SOCKET_TIMEOUT: int = 1 # seconds From b50fcf414fe9c0448f91a448b59d455845057bde Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 May 2023 08:13:33 +0000 Subject: [PATCH 19/34] Prettified Code! --- gui/preload-chat.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 546f2c5e..d8721922 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -463,9 +463,10 @@ window.addEventListener("DOMContentLoaded", () => { // check if broadcast dxcallsign.starts; if (dxcallsign.startsWith("BC-")) { - let broadcastChannelId = dxcallsign.split("BC-")[1]; - broadcastChannelIdCRC = crc32(broadcastChannelId).toString(16).toUpperCase(); - + let broadcastChannelId = dxcallsign.split("BC-")[1]; + broadcastChannelIdCRC = crc32(broadcastChannelId) + .toString(16) + .toUpperCase(); dxcallsignWithID = "BC-" + broadcastChannelIdCRC; var tnc_command = "broadcast"; @@ -734,18 +735,16 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { //handle broadcast if (item.fec == "broadcast") { - - console.log("BROADCAST RECEIVED") - console.log(item) + console.log("BROADCAST RECEIVED"); + console.log(item); var transmitting_station = item.dxcallsign; var encoded_data = FD.atob_FD(item.data); var splitted_data = encoded_data.split(split_char); console.log(splitted_data); - // add callsign to message: var message = transmitting_station + ":" + splitted_data[4]; - console.log(message) + console.log(message); obj.timestamp = Math.floor(Date.now() / 1000); obj.dxcallsign = splitted_data[1]; obj.dxgrid = "null"; @@ -1264,8 +1263,8 @@ update_chat = function (obj) { `; } - if (obj.type == "broadcast") { - var new_message = ` + if (obj.type == "broadcast") { + var new_message = `
@@ -1286,7 +1285,7 @@ update_chat = function (obj) {
`; - } + } if (obj.type == "transmit") { //console.log('msg-' + obj._id + '-status') From cac7334ef5bdb5b80d7ba153c63a615bb8fa97f2 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 May 2023 18:56:21 +0200 Subject: [PATCH 20/34] adjusted chat control for broadcast --- gui/preload-chat.js | 114 +++++++++++++++++++++++++++++--------------- gui/preload-main.js | 2 +- gui/sock.js | 3 +- 3 files changed, 78 insertions(+), 41 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index d8721922..4ea6c632 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -460,27 +460,34 @@ window.addEventListener("DOMContentLoaded", () => { } var timestamp = Math.floor(Date.now() / 1000); - // check if broadcast - dxcallsign.starts; - if (dxcallsign.startsWith("BC-")) { - let broadcastChannelId = dxcallsign.split("BC-")[1]; - broadcastChannelIdCRC = crc32(broadcastChannelId) - .toString(16) - .toUpperCase(); + var uuid = uuidv4(); + let uuidlast = uuid.lastIndexOf("-"); + uuidlast += 1; + if (uuidlast > 0) { + uuid = uuid.substring(uuidlast); + } - dxcallsignWithID = "BC-" + broadcastChannelIdCRC; + + // check if broadcast + if (dxcallsign.startsWith("BC-")) { + //let broadcastChannelId = dxcallsign.split("BC-")[1]; + //broadcastChannelIdCRC = crc32(broadcastChannelId) + // .toString(16) + // .toUpperCase(); + //dxcallsignWithID = "BC-" + broadcastChannelIdCRC; var tnc_command = "broadcast"; + var message_type = "broadcast_transmit" let Data = { command: tnc_command, broadcastChannel: dxcallsign, data: chatmessage, + uuid: uuid }; ipcRenderer.send("run-tnc-command", Data); } else { + var message_type = "transmit" var file_checksum = crc32(file).toString(16).toUpperCase(); var tnc_command = "msg"; - var file_checksum = crc32(file).toString(16).toUpperCase(); - console.log(file_checksum); var data_with_attachment = timestamp + split_char + @@ -493,12 +500,7 @@ window.addEventListener("DOMContentLoaded", () => { file; document.getElementById("selectFilesButton").innerHTML = ``; - var uuid = uuidv4(); - let uuidlast = uuid.lastIndexOf("-"); - uuidlast += 1; - if (uuidlast > 0) { - uuid = uuid.substring(uuidlast); - } + console.log(data_with_attachment); let Data = { command: tnc_command, @@ -519,7 +521,7 @@ window.addEventListener("DOMContentLoaded", () => { dxgrid: "null", msg: chatmessage, checksum: file_checksum, - type: "transmit", + type: message_type, status: "transmit", attempt: 1, uuid: uuid, @@ -730,7 +732,6 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { var new_msg = arg.data; new_msg.forEach(function (item) { - console.log(item.status); let obj = new Object(); //handle broadcast @@ -748,13 +749,13 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.timestamp = Math.floor(Date.now() / 1000); obj.dxcallsign = splitted_data[1]; obj.dxgrid = "null"; - obj.uuid = uuidv4().toString(); + obj.uuid = splitted_data[3]; obj.command = "msg"; obj.checksum = "null"; obj.msg = message; obj.status = "received"; obj.snr = item.snr; - obj.type = "broadcast"; + obj.type = "broadcast_received"; obj.filename = "null"; obj.filetype = "null"; obj.file = "null"; @@ -1263,30 +1264,63 @@ update_chat = function (obj) { `; } - if (obj.type == "broadcast") { + if (obj.type == "broadcast_received") { var new_message = ` -
+
-
- -
+
+ +
-
-

${message_html}

-

- ${timestamp} +

+

${message_html}

+

+ ${timestamp} -

-
-
+

+
-
- -
-
- `; +
+
+ `; } + if (obj.type == "broadcast_transmit") { + var new_message = ` +
+
+ + +
+
+
+
+

${message_html}

+

+ ${timestamp} - + ${get_icon_for_state( + obj.status + )} +

+ + + ${attempt}/${max_retry_attempts} + retries + + +
+
+
+ `; + } + if (obj.type == "transmit") { + console.log(obj) //console.log('msg-' + obj._id + '-status') if (obj.status == "failed") { @@ -2011,7 +2045,7 @@ async function updateAllChat(clear) { .then(async function (result) { // handle result async //document.getElementById("blurOverlay").classList.add("bg-primary"); - + console.log(result) if (typeof result !== "undefined") { for (const item of result.docs) { //await otherwise history will not be in chronological order @@ -2051,6 +2085,7 @@ function getSetUserSharedFolder(selected_callsign) { if ( selected_callsign == "" || selected_callsign == null || + !selected_callsign.startsWith("BC-") || typeof selected_callsign == "undefined" ) { console.log("return triggered"); @@ -2180,6 +2215,7 @@ function getSetUserInformation(selected_callsign) { if ( selected_callsign == "" || selected_callsign == null || + !selected_callsign.startsWith("BC-") || typeof selected_callsign == "undefined" ) { console.log("return triggered"); @@ -2221,6 +2257,8 @@ function getSetUserInformation(selected_callsign) { defaultUserIcon; } + + // Callsign list elements document.getElementById( "chat-" + selected_callsign + "-list-dxgrid" diff --git a/gui/preload-main.js b/gui/preload-main.js index 1c648964..e8523332 100644 --- a/gui/preload-main.js +++ b/gui/preload-main.js @@ -2787,7 +2787,7 @@ ipcRenderer.on("run-tnc-command", (event, arg) => { ); } if (arg.command == "broadcast") { - sock.sendBroadcastChannel(arg.broadcastChannel, arg.data); + sock.sendBroadcastChannel(arg.broadcastChannel, arg.data, arg.uuid); } if (arg.command == "stop_transmission") { sock.stopTransmission(); diff --git a/gui/sock.js b/gui/sock.js index 28fc0bd6..ab1bb877 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -852,9 +852,8 @@ exports.sendFecIsWriting = function (mycallsign) { }; // SEND FEC TO BROADCASTCHANNEL -exports.sendBroadcastChannel = function (channel, data) { +exports.sendBroadcastChannel = function (channel, data, uuid) { let checksum = ""; - let uuid = ""; let command = ""; data = FD.btoa_FD( "m" + From d2074ee5ea1f9e82e45222c422bc03fcaed53779 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 May 2023 19:07:57 +0200 Subject: [PATCH 21/34] disable some features if broadcast selected --- gui/preload-chat.js | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 4ea6c632..fab02ad7 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -1123,7 +1123,7 @@ update_chat = function (obj) { getSetUserInformation(dxcallsign); getSetUserSharedFolder(dxcallsign); - var new_callsign = ` +var new_callsign = `
@@ -1142,6 +1142,7 @@ update_chat = function (obj) { `; + document .getElementById("list-tab") .insertAdjacentHTML("beforeend", new_callsign); @@ -2085,12 +2086,23 @@ function getSetUserSharedFolder(selected_callsign) { if ( selected_callsign == "" || selected_callsign == null || - !selected_callsign.startsWith("BC-") || + typeof selected_callsign == "undefined" ) { console.log("return triggered"); return; } + + // disable button if broadcast + if(selected_callsign.startsWith("BC-")){ + document.getElementById("sharedFolderDXButton").disabled = true; + + }else{ + document.getElementById("sharedFolderDXButton").disabled = false; + } + + + returnObjFromCallsign(users, selected_callsign) .then(function (data) { console.log(data); @@ -2215,12 +2227,27 @@ function getSetUserInformation(selected_callsign) { if ( selected_callsign == "" || selected_callsign == null || - !selected_callsign.startsWith("BC-") || typeof selected_callsign == "undefined" ) { console.log("return triggered"); return; } + + + + // disable button if broadcast + if(selected_callsign.startsWith("BC-")){ + document.getElementById("userModalDXButton").disabled = true; + document.getElementById("ping").disabled = true; + + }else{ + document.getElementById("userModalDXButton").disabled = false; + document.getElementById("ping").disabled = false; + + } + + + document.getElementById("dx_user_info_callsign").innerHTML = selected_callsign; From 2ca11421bda6ce4fbd39fc3b3cdab2a64495cb89 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 May 2023 17:10:56 +0000 Subject: [PATCH 22/34] Prettified Code! --- gui/preload-chat.js | 70 +++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index fab02ad7..71d58f1e 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -460,13 +460,12 @@ window.addEventListener("DOMContentLoaded", () => { } var timestamp = Math.floor(Date.now() / 1000); - var uuid = uuidv4(); - let uuidlast = uuid.lastIndexOf("-"); - uuidlast += 1; - if (uuidlast > 0) { - uuid = uuid.substring(uuidlast); - } - + var uuid = uuidv4(); + let uuidlast = uuid.lastIndexOf("-"); + uuidlast += 1; + if (uuidlast > 0) { + uuid = uuid.substring(uuidlast); + } // check if broadcast if (dxcallsign.startsWith("BC-")) { @@ -476,16 +475,16 @@ window.addEventListener("DOMContentLoaded", () => { // .toUpperCase(); //dxcallsignWithID = "BC-" + broadcastChannelIdCRC; var tnc_command = "broadcast"; - var message_type = "broadcast_transmit" + var message_type = "broadcast_transmit"; let Data = { command: tnc_command, broadcastChannel: dxcallsign, data: chatmessage, - uuid: uuid + uuid: uuid, }; ipcRenderer.send("run-tnc-command", Data); } else { - var message_type = "transmit" + var message_type = "transmit"; var file_checksum = crc32(file).toString(16).toUpperCase(); var tnc_command = "msg"; var data_with_attachment = @@ -1123,7 +1122,7 @@ update_chat = function (obj) { getSetUserInformation(dxcallsign); getSetUserSharedFolder(dxcallsign); -var new_callsign = ` + var new_callsign = `
@@ -1142,7 +1141,6 @@ var new_callsign = ` `; - document .getElementById("list-tab") .insertAdjacentHTML("beforeend", new_callsign); @@ -1289,8 +1287,12 @@ var new_callsign = ` var new_message = `
- - + +
@@ -1321,7 +1323,7 @@ var new_callsign = ` } if (obj.type == "transmit") { - console.log(obj) + console.log(obj); //console.log('msg-' + obj._id + '-status') if (obj.status == "failed") { @@ -2046,7 +2048,7 @@ async function updateAllChat(clear) { .then(async function (result) { // handle result async //document.getElementById("blurOverlay").classList.add("bg-primary"); - console.log(result) + console.log(result); if (typeof result !== "undefined") { for (const item of result.docs) { //await otherwise history will not be in chronological order @@ -2086,23 +2088,19 @@ function getSetUserSharedFolder(selected_callsign) { if ( selected_callsign == "" || selected_callsign == null || - typeof selected_callsign == "undefined" ) { console.log("return triggered"); return; } - // disable button if broadcast - if(selected_callsign.startsWith("BC-")){ - document.getElementById("sharedFolderDXButton").disabled = true; - - }else{ - document.getElementById("sharedFolderDXButton").disabled = false; + // disable button if broadcast + if (selected_callsign.startsWith("BC-")) { + document.getElementById("sharedFolderDXButton").disabled = true; + } else { + document.getElementById("sharedFolderDXButton").disabled = false; } - - returnObjFromCallsign(users, selected_callsign) .then(function (data) { console.log(data); @@ -2233,21 +2231,15 @@ function getSetUserInformation(selected_callsign) { return; } - - - // disable button if broadcast - if(selected_callsign.startsWith("BC-")){ - document.getElementById("userModalDXButton").disabled = true; - document.getElementById("ping").disabled = true; - - }else{ - document.getElementById("userModalDXButton").disabled = false; - document.getElementById("ping").disabled = false; - + // disable button if broadcast + if (selected_callsign.startsWith("BC-")) { + document.getElementById("userModalDXButton").disabled = true; + document.getElementById("ping").disabled = true; + } else { + document.getElementById("userModalDXButton").disabled = false; + document.getElementById("ping").disabled = false; } - - document.getElementById("dx_user_info_callsign").innerHTML = selected_callsign; @@ -2284,8 +2276,6 @@ function getSetUserInformation(selected_callsign) { defaultUserIcon; } - - // Callsign list elements document.getElementById( "chat-" + selected_callsign + "-list-dxgrid" From 83fc3f5ce202c21e6ffea1c906cc4191e2d82aaf Mon Sep 17 00:00:00 2001 From: Mashintime Date: Mon, 15 May 2023 17:03:51 -0400 Subject: [PATCH 23/34] Show sort icon when sorting heard station table --- gui/preload-main.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/gui/preload-main.js b/gui/preload-main.js index e8523332..a67846ce 100644 --- a/gui/preload-main.js +++ b/gui/preload-main.js @@ -1606,29 +1606,42 @@ window.addEventListener("DOMContentLoaded", () => { if (hslLastSort == 0 && hslLastSortDir == "asc") hslLastSortDir = "desc"; else hslLastSortDir = "asc"; sorthslTable(0); + resetSortIcon(); }); document.getElementById("thFreq").addEventListener("click", () => { if (hslLastSort == 1 && hslLastSortDir == "asc") hslLastSortDir = "desc"; else hslLastSortDir = "asc"; sorthslTable(1); + resetSortIcon(); }); document.getElementById("thDxcall").addEventListener("click", () => { if (hslLastSort == 3 && hslLastSortDir == "asc") hslLastSortDir = "desc"; else hslLastSortDir = "asc"; sorthslTable(3); + resetSortIcon(); }); document.getElementById("thDxgrid").addEventListener("click", () => { if (hslLastSort == 4 && hslLastSortDir == "asc") hslLastSortDir = "desc"; else hslLastSortDir = "asc"; sorthslTable(4); + resetSortIcon(); }); document.getElementById("thDist").addEventListener("click", () => { if (hslLastSort == 5 && hslLastSortDir == "asc") hslLastSortDir = "desc"; else hslLastSortDir = "asc"; sorthslTable(5); + resetSortIcon(); }); }); +function resetSortIcon(){ + document.getElementById("hslSort").remove(); + let headers = document.querySelectorAll("#tblHeardStationList > thead > tr > th"); + if (hslLastSortDir=="desc") text = "" + headers[hslLastSort].innerText; + else text = "" + headers[hslLastSort].innerText; + headers[hslLastSort].innerHTML=text; +} + function connectedStation(data) { if (typeof data.dxcallsign == "undefined") { return; @@ -3547,7 +3560,7 @@ function changeGuiDesign(design) { } var hslLastSort = 0; -var hslLastSortDir = "asc"; +var hslLastSortDir = "desc"; //https://www.w3schools.com/howto/howto_js_sort_table.asp function sorthslTable(n) { From c1079085cdb9fb922828a2fae08dfba7b4fa4d9f Mon Sep 17 00:00:00 2001 From: Mashintime Date: Mon, 15 May 2023 17:12:52 -0400 Subject: [PATCH 24/34] Allow sorting of additional fields in heard station list --- gui/preload-main.js | 12 ++++++++++++ gui/src/index.html | 6 +++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/gui/preload-main.js b/gui/preload-main.js index a67846ce..cc2f23c0 100644 --- a/gui/preload-main.js +++ b/gui/preload-main.js @@ -1632,6 +1632,18 @@ window.addEventListener("DOMContentLoaded", () => { sorthslTable(5); resetSortIcon(); }); + document.getElementById("thType").addEventListener("click", () => { + if (hslLastSort == 6 && hslLastSortDir == "asc") hslLastSortDir = "desc"; + else hslLastSortDir = "asc"; + sorthslTable(6); + resetSortIcon(); + }); + document.getElementById("thSnr").addEventListener("click", () => { + if (hslLastSort == 7 && hslLastSortDir == "asc") hslLastSortDir = "desc"; + else hslLastSortDir = "asc"; + sorthslTable(7); + resetSortIcon(); + }); }); function resetSortIcon(){ diff --git a/gui/src/index.html b/gui/src/index.html index 8e42e8d3..479588d8 100644 --- a/gui/src/index.html +++ b/gui/src/index.html @@ -1152,14 +1152,14 @@ - + - - + + From 0c9e84ddf2d1551893e664bd2b7858e354a2561d Mon Sep 17 00:00:00 2001 From: Mashintime Date: Mon, 15 May 2023 21:13:50 +0000 Subject: [PATCH 25/34] Prettified Code! --- gui/preload-main.js | 18 +++++++++++++----- gui/src/index.html | 4 +++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/gui/preload-main.js b/gui/preload-main.js index cc2f23c0..30cf16ab 100644 --- a/gui/preload-main.js +++ b/gui/preload-main.js @@ -1646,12 +1646,20 @@ window.addEventListener("DOMContentLoaded", () => { }); }); -function resetSortIcon(){ +function resetSortIcon() { document.getElementById("hslSort").remove(); - let headers = document.querySelectorAll("#tblHeardStationList > thead > tr > th"); - if (hslLastSortDir=="desc") text = "" + headers[hslLastSort].innerText; - else text = "" + headers[hslLastSort].innerText; - headers[hslLastSort].innerHTML=text; + let headers = document.querySelectorAll( + "#tblHeardStationList > thead > tr > th" + ); + if (hslLastSortDir == "desc") + text = + '' + + headers[hslLastSort].innerText; + else + text = + '' + + headers[hslLastSort].innerText; + headers[hslLastSort].innerHTML = text; } function connectedStation(data) { diff --git a/gui/src/index.html b/gui/src/index.html index 479588d8..18b9adfb 100644 --- a/gui/src/index.html +++ b/gui/src/index.html @@ -1152,7 +1152,9 @@
TimeTime Frequency   DXCall DXGrid DistanceTypeSNR (rx/dx)TypeSNR (rx/dx)
- + From f79cdf8f65b012f87cf1ea568b544cb21a662112 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Tue, 16 May 2023 11:35:20 +0200 Subject: [PATCH 26/34] fixed saving to database --- gui/preload-chat.js | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 71d58f1e..f72e9eb1 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -136,6 +136,9 @@ var chatFilter = [ { type: "received" }, { type: "transmit" }, { type: "ping-ack" }, + { type: "broadcast_received" }, + { type: "broadcast_transmit" }, + //{ type: "request" }, //{ type: "response" }, ]; @@ -762,6 +765,20 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { add_obj_to_database(obj); update_chat_obj_by_uuid(obj.uuid); + db + .find({ + selector: { + dxcallsign: obj.dxcallsign, + }, + }) + .then(function (result) { + // handle result + console.log(result); + }); + + + + //handle ping } else if (item.ping == "received") { obj.timestamp = parseInt(item.timestamp); @@ -1397,12 +1414,7 @@ update_chat = function (obj) { console.log("element already exists......"); console.log(obj); - console.log( - document - .getElementById("msg-" + obj._id + "-progress") - .getAttribute("aria-valuenow") - ); - + if (!obj.status == "broadcast_transmit" || !obj.status == "broadcast_received") { document.getElementById("msg-" + obj._id + "-status").innerHTML = get_icon_for_state(obj.status); @@ -1418,7 +1430,7 @@ update_chat = function (obj) { document.getElementById("msg-" + obj._id + "-attempts").innerHTML = obj.attempt + "/" + max_retry_attempts; - + } if (obj.status == "transmitted") { //document.getElementById('msg-' + obj._id + '-progress').classList.remove("progress-bar-striped"); document @@ -1435,7 +1447,7 @@ update_chat = function (obj) { document.getElementById( "msg-" + obj._id + "-progress-information" ).innerHTML = "TRANSMITTED - " + obj.bytesperminute + " Bpm"; - } else { + } else if (!obj.status == "broadcast_transmit" || !obj.status == "broadcast_received") { document .getElementById("msg-" + obj._id + "-progress") .classList.add("progress-bar-striped"); @@ -1743,9 +1755,18 @@ add_obj_to_database = function (obj) { .catch(function (err) { console.log("already exists"); console.log(err); + console.log(obj) + db.upsert(obj.uuid, function (doc) { + doc = obj + return doc; + }).then(function (response) { + console.log("upsert"); + console.log(response); + }).catch(function (err) {; +console.log(err) }); +}); }; - /* users database functions */ addUserToDatabaseIfNotExists = function (obj) { /* @@ -2046,6 +2067,7 @@ async function updateAllChat(clear) { ], }) .then(async function (result) { + console.log(result) // handle result async //document.getElementById("blurOverlay").classList.add("bg-primary"); console.log(result); From 8a48f1d04a8e3a13d12530abc9cef564c19c61ff Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Tue, 16 May 2023 09:35:50 +0000 Subject: [PATCH 27/34] Prettified Code! --- gui/preload-chat.js | 79 +++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index f72e9eb1..df2a1a8e 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -765,19 +765,14 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { add_obj_to_database(obj); update_chat_obj_by_uuid(obj.uuid); - db - .find({ - selector: { - dxcallsign: obj.dxcallsign, - }, - }) - .then(function (result) { - // handle result - console.log(result); - }); - - - + db.find({ + selector: { + dxcallsign: obj.dxcallsign, + }, + }).then(function (result) { + // handle result + console.log(result); + }); //handle ping } else if (item.ping == "received") { @@ -1414,22 +1409,25 @@ update_chat = function (obj) { console.log("element already exists......"); console.log(obj); - if (!obj.status == "broadcast_transmit" || !obj.status == "broadcast_received") { - document.getElementById("msg-" + obj._id + "-status").innerHTML = - get_icon_for_state(obj.status); + if ( + !obj.status == "broadcast_transmit" || + !obj.status == "broadcast_received" + ) { + 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 + "%;"); - document.getElementById( - "msg-" + obj._id + "-progress-information" - ).innerHTML = obj.percent + "% - " + obj.bytesperminute + " Bpm"; + document + .getElementById("msg-" + obj._id + "-progress") + .setAttribute("aria-valuenow", obj.percent); + document + .getElementById("msg-" + obj._id + "-progress") + .setAttribute("style", "width:" + obj.percent + "%;"); + document.getElementById( + "msg-" + obj._id + "-progress-information" + ).innerHTML = obj.percent + "% - " + obj.bytesperminute + " Bpm"; - document.getElementById("msg-" + obj._id + "-attempts").innerHTML = - obj.attempt + "/" + max_retry_attempts; + document.getElementById("msg-" + obj._id + "-attempts").innerHTML = + obj.attempt + "/" + max_retry_attempts; } if (obj.status == "transmitted") { //document.getElementById('msg-' + obj._id + '-progress').classList.remove("progress-bar-striped"); @@ -1447,7 +1445,10 @@ update_chat = function (obj) { document.getElementById( "msg-" + obj._id + "-progress-information" ).innerHTML = "TRANSMITTED - " + obj.bytesperminute + " Bpm"; - } else if (!obj.status == "broadcast_transmit" || !obj.status == "broadcast_received") { + } else if ( + !obj.status == "broadcast_transmit" || + !obj.status == "broadcast_received" + ) { document .getElementById("msg-" + obj._id + "-progress") .classList.add("progress-bar-striped"); @@ -1755,17 +1756,19 @@ add_obj_to_database = function (obj) { .catch(function (err) { console.log("already exists"); console.log(err); - console.log(obj) + console.log(obj); db.upsert(obj.uuid, function (doc) { - doc = obj - return doc; - }).then(function (response) { - console.log("upsert"); - console.log(response); - }).catch(function (err) {; -console.log(err) + doc = obj; + return doc; + }) + .then(function (response) { + console.log("upsert"); + console.log(response); + }) + .catch(function (err) { + console.log(err); + }); }); -}); }; /* users database functions */ addUserToDatabaseIfNotExists = function (obj) { @@ -2067,7 +2070,7 @@ async function updateAllChat(clear) { ], }) .then(async function (result) { - console.log(result) + console.log(result); // handle result async //document.getElementById("blurOverlay").classList.add("bg-primary"); console.log(result); From 52f2a460ddd82a4a72a96379a14411a5ae3b5e0f Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Tue, 16 May 2023 18:21:57 +0200 Subject: [PATCH 28/34] added group images --- gui/preload-chat.js | 50 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index df2a1a8e..17c6fb1e 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -48,6 +48,7 @@ var selected_callsign = ""; var lastIsWritingBroadcast = new Date().getTime(); var defaultUserIcon = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktcGVyc29uLWJvdW5kaW5nLWJveCIgdmlld0JveD0iMCAwIDE2IDE2Ij4KICA8cGF0aCBkPSJNMS41IDFhLjUuNSAwIDAgMC0uNS41djNhLjUuNSAwIDAgMS0xIDB2LTNBMS41IDEuNSAwIDAgMSAxLjUgMGgzYS41LjUgMCAwIDEgMCAxaC0zek0xMSAuNWEuNS41IDAgMCAxIC41LS41aDNBMS41IDEuNSAwIDAgMSAxNiAxLjV2M2EuNS41IDAgMCAxLTEgMHYtM2EuNS41IDAgMCAwLS41LS41aC0zYS41LjUgMCAwIDEtLjUtLjV6TS41IDExYS41LjUgMCAwIDEgLjUuNXYzYS41LjUgMCAwIDAgLjUuNWgzYS41LjUgMCAwIDEgMCAxaC0zQTEuNSAxLjUgMCAwIDEgMCAxNC41di0zYS41LjUgMCAwIDEgLjUtLjV6bTE1IDBhLjUuNSAwIDAgMSAuNS41djNhMS41IDEuNSAwIDAgMS0xLjUgMS41aC0zYS41LjUgMCAwIDEgMC0xaDNhLjUuNSAwIDAgMCAuNS0uNXYtM2EuNS41IDAgMCAxIC41LS41eiIvPgogIDxwYXRoIGQ9Ik0zIDE0cy0xIDAtMS0xIDEtNCA2LTQgNiAzIDYgNC0xIDEtMSAxSDN6bTgtOWEzIDMgMCAxIDEtNiAwIDMgMyAwIDAgMSA2IDB6Ii8+Cjwvc3ZnPg=="; + var defaultGroupIcon = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktcGVvcGxlLWZpbGwiIHZpZXdCb3g9IjAgMCAxNiAxNiI+CiAgPHBhdGggZD0iTTcgMTRzLTEgMC0xLTEgMS00IDUtNCA1IDMgNSA0LTEgMS0xIDFIN1ptNC02YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNlptLTUuNzg0IDZBMi4yMzggMi4yMzggMCAwIDEgNSAxM2MwLTEuMzU1LjY4LTIuNzUgMS45MzYtMy43MkE2LjMyNSA2LjMyNSAwIDAgMCA1IDljLTQgMC01IDMtNSA0czEgMSAxIDFoNC4yMTZaTTQuNSA4YTIuNSAyLjUgMCAxIDAgMC01IDIuNSAyLjUgMCAwIDAgMCA1WiIvPgo8L3N2Zz4=" // ----------------------------------- // Initially fill sharedFolderFileList @@ -746,12 +747,13 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { console.log(splitted_data); // add callsign to message: - var message = transmitting_station + ":" + splitted_data[4]; + var message = splitted_data[4]; console.log(message); obj.timestamp = Math.floor(Date.now() / 1000); obj.dxcallsign = splitted_data[1]; obj.dxgrid = "null"; obj.uuid = splitted_data[3]; + obj.broadcast_sender = transmitting_station; obj.command = "msg"; obj.checksum = "null"; obj.msg = message; @@ -1131,16 +1133,24 @@ update_chat = function (obj) { selected_callsign = dxcallsign; } + if (dxcallsign.startsWith("BC-")){ + var user_image = ''; + + + } else { + var user_image = ''; + getSetUserInformation(dxcallsign); getSetUserSharedFolder(dxcallsign); + } var new_callsign = `
- - + ${user_image} +
${dxcallsign} @@ -1289,6 +1299,16 @@ update_chat = function (obj) { ${timestamp}

+ + + + ${obj.broadcast_sender} + dxcallsign +
@@ -2282,6 +2302,11 @@ function getSetUserInformation(selected_callsign) { // split data string by "base64" for separating image type from base64 string atob(data.user_info_image.split(";base64,")[1]); + + if (selected_callsign.startsWith("BC-")){ + data.user_info_image = defaultGroupIcon + } + document.getElementById("dx_user_info_image").src = data.user_info_image; document.getElementById("user-image-" + selected_callsign).src = @@ -2289,9 +2314,16 @@ function getSetUserInformation(selected_callsign) { } catch (e) { console.log(e); console.log("corrupted image data"); + + if (selected_callsign.startsWith("BC-")){ + var userIcon = defaultGroupIcon; + } else { + var userIcon = defaultUserIcon; + } + document.getElementById("user-image-" + selected_callsign).src = - defaultUserIcon; - document.getElementById("dx_user_info_image").src = defaultUserIcon; + userIcon; + document.getElementById("dx_user_info_image").src = userIcon; } } else { // throw error and use placeholder data @@ -2347,9 +2379,15 @@ function getSetUserInformation(selected_callsign) { console.log("writing user info to modal failed"); console.log(err); + if (selected_callsign.startsWith("BC-")){ + var userIcon = defaultGroupIcon; + } else { + var userIcon = defaultUserIcon; + } + // Callsign list elements document.getElementById("user-image-" + selected_callsign).src = - defaultUserIcon; + userIcon; document.getElementById("user-image-" + selected_callsign).className = "p-1 rounded-circle w-100"; document.getElementById("user-image-" + selected_callsign).style = From 5daf7732db4949286d15fca8a0dc8ce9bf60d57f Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Tue, 16 May 2023 17:08:31 +0000 Subject: [PATCH 29/34] Prettified Code! --- gui/preload-chat.js | 57 ++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 17c6fb1e..6aa73867 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -48,7 +48,8 @@ var selected_callsign = ""; var lastIsWritingBroadcast = new Date().getTime(); var defaultUserIcon = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktcGVyc29uLWJvdW5kaW5nLWJveCIgdmlld0JveD0iMCAwIDE2IDE2Ij4KICA8cGF0aCBkPSJNMS41IDFhLjUuNSAwIDAgMC0uNS41djNhLjUuNSAwIDAgMS0xIDB2LTNBMS41IDEuNSAwIDAgMSAxLjUgMGgzYS41LjUgMCAwIDEgMCAxaC0zek0xMSAuNWEuNS41IDAgMCAxIC41LS41aDNBMS41IDEuNSAwIDAgMSAxNiAxLjV2M2EuNS41IDAgMCAxLTEgMHYtM2EuNS41IDAgMCAwLS41LS41aC0zYS41LjUgMCAwIDEtLjUtLjV6TS41IDExYS41LjUgMCAwIDEgLjUuNXYzYS41LjUgMCAwIDAgLjUuNWgzYS41LjUgMCAwIDEgMCAxaC0zQTEuNSAxLjUgMCAwIDEgMCAxNC41di0zYS41LjUgMCAwIDEgLjUtLjV6bTE1IDBhLjUuNSAwIDAgMSAuNS41djNhMS41IDEuNSAwIDAgMS0xLjUgMS41aC0zYS41LjUgMCAwIDEgMC0xaDNhLjUuNSAwIDAgMCAuNS0uNXYtM2EuNS41IDAgMCAxIC41LS41eiIvPgogIDxwYXRoIGQ9Ik0zIDE0cy0xIDAtMS0xIDEtNCA2LTQgNiAzIDYgNC0xIDEtMSAxSDN6bTgtOWEzIDMgMCAxIDEtNiAwIDMgMyAwIDAgMSA2IDB6Ii8+Cjwvc3ZnPg=="; - var defaultGroupIcon = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktcGVvcGxlLWZpbGwiIHZpZXdCb3g9IjAgMCAxNiAxNiI+CiAgPHBhdGggZD0iTTcgMTRzLTEgMC0xLTEgMS00IDUtNCA1IDMgNSA0LTEgMS0xIDFIN1ptNC02YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNlptLTUuNzg0IDZBMi4yMzggMi4yMzggMCAwIDEgNSAxM2MwLTEuMzU1LjY4LTIuNzUgMS45MzYtMy43MkE2LjMyNSA2LjMyNSAwIDAgMCA1IDljLTQgMC01IDMtNSA0czEgMSAxIDFoNC4yMTZaTTQuNSA4YTIuNSAyLjUgMCAxIDAgMC01IDIuNSAyLjUgMCAwIDAgMCA1WiIvPgo8L3N2Zz4=" +var defaultGroupIcon = + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktcGVvcGxlLWZpbGwiIHZpZXdCb3g9IjAgMCAxNiAxNiI+CiAgPHBhdGggZD0iTTcgMTRzLTEgMC0xLTEgMS00IDUtNCA1IDMgNSA0LTEgMS0xIDFIN1ptNC02YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNlptLTUuNzg0IDZBMi4yMzggMi4yMzggMCAwIDEgNSAxM2MwLTEuMzU1LjY4LTIuNzUgMS45MzYtMy43MkE2LjMyNSA2LjMyNSAwIDAgMCA1IDljLTQgMC01IDMtNSA0czEgMSAxIDFoNC4yMTZaTTQuNSA4YTIuNSAyLjUgMCAxIDAgMC01IDIuNSAyLjUgMCAwIDAgMCA1WiIvPgo8L3N2Zz4="; // ----------------------------------- // Initially fill sharedFolderFileList @@ -1133,15 +1134,19 @@ update_chat = function (obj) { selected_callsign = dxcallsign; } - if (dxcallsign.startsWith("BC-")){ - var user_image = ''; - - + if (dxcallsign.startsWith("BC-")) { + var user_image = + ''; } else { - var user_image = ''; + var user_image = + ''; - getSetUserInformation(dxcallsign); - getSetUserSharedFolder(dxcallsign); + getSetUserInformation(dxcallsign); + getSetUserSharedFolder(dxcallsign); } var new_callsign = ` @@ -1300,13 +1305,9 @@ update_chat = function (obj) {

- + - ${obj.broadcast_sender} + ${obj.broadcast_sender} dxcallsign @@ -2302,10 +2303,9 @@ function getSetUserInformation(selected_callsign) { // split data string by "base64" for separating image type from base64 string atob(data.user_info_image.split(";base64,")[1]); - - if (selected_callsign.startsWith("BC-")){ - data.user_info_image = defaultGroupIcon - } + if (selected_callsign.startsWith("BC-")) { + data.user_info_image = defaultGroupIcon; + } document.getElementById("dx_user_info_image").src = data.user_info_image; @@ -2315,11 +2315,11 @@ function getSetUserInformation(selected_callsign) { console.log(e); console.log("corrupted image data"); - if (selected_callsign.startsWith("BC-")){ - var userIcon = defaultGroupIcon; - } else { - var userIcon = defaultUserIcon; - } + if (selected_callsign.startsWith("BC-")) { + var userIcon = defaultGroupIcon; + } else { + var userIcon = defaultUserIcon; + } document.getElementById("user-image-" + selected_callsign).src = userIcon; @@ -2379,15 +2379,14 @@ function getSetUserInformation(selected_callsign) { console.log("writing user info to modal failed"); console.log(err); - if (selected_callsign.startsWith("BC-")){ + if (selected_callsign.startsWith("BC-")) { var userIcon = defaultGroupIcon; - } else { - var userIcon = defaultUserIcon; - } + } else { + var userIcon = defaultUserIcon; + } // Callsign list elements - document.getElementById("user-image-" + selected_callsign).src = - userIcon; + document.getElementById("user-image-" + selected_callsign).src = userIcon; document.getElementById("user-image-" + selected_callsign).className = "p-1 rounded-circle w-100"; document.getElementById("user-image-" + selected_callsign).style = From 210336a1dd3b318169e5be40cbd2e311084467aa Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Wed, 17 May 2023 10:37:10 +0200 Subject: [PATCH 30/34] adjusted broadcast control area --- gui/preload-chat.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 6aa73867..30d3d352 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -1293,11 +1293,9 @@ update_chat = function (obj) { if (obj.type == "broadcast_received") { var new_message = `
-
-

${message_html}

@@ -1313,6 +1311,9 @@ update_chat = function (obj) {

+
+ +
`; } From a73ce2f706b0de624de183b3676d8445196617bf Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Wed, 17 May 2023 11:05:24 +0200 Subject: [PATCH 31/34] added maxlength for broadcast --- gui/preload-chat.js | 12 ++++++++++++ gui/sock.js | 12 ++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 30d3d352..b87370bc 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -481,6 +481,10 @@ window.addEventListener("DOMContentLoaded", () => { //dxcallsignWithID = "BC-" + broadcastChannelIdCRC; var tnc_command = "broadcast"; var message_type = "broadcast_transmit"; + + // slice uuid for reducing overhead + uuid = uuid.slice(-4); + let Data = { command: tnc_command, broadcastChannel: dxcallsign, @@ -2318,8 +2322,13 @@ function getSetUserInformation(selected_callsign) { if (selected_callsign.startsWith("BC-")) { var userIcon = defaultGroupIcon; + document.getElementById("chatModuleMessage").setAttribute("maxlength", 16); + } else { var userIcon = defaultUserIcon; + document.getElementById("chatModuleMessage").setAttribute("maxlength", 524288); + + } document.getElementById("user-image-" + selected_callsign).src = @@ -2381,9 +2390,12 @@ function getSetUserInformation(selected_callsign) { console.log(err); if (selected_callsign.startsWith("BC-")) { + document.getElementById("chatModuleMessage").setAttribute("maxlength", 16); var userIcon = defaultGroupIcon; } else { var userIcon = defaultUserIcon; + document.getElementById("chatModuleMessage").setAttribute("maxlength", 524288); + } // Callsign list elements diff --git a/gui/sock.js b/gui/sock.js index ab1bb877..80784667 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -852,21 +852,21 @@ exports.sendFecIsWriting = function (mycallsign) { }; // SEND FEC TO BROADCASTCHANNEL -exports.sendBroadcastChannel = function (channel, data, uuid) { +exports.sendBroadcastChannel = function (channel, data_out, uuid) { let checksum = ""; let command = ""; - data = FD.btoa_FD( + let data = FD.btoa_FD( "m" + split_char + channel + - split_char + - checksum + + //split_char + + //checksum + split_char + uuid + split_char + - data + data_out ); - + console.log(data.length) let payload = data; command = '{"type" : "fec", "command" : "transmit", "mode": "datac4", "wakeup": "True", "payload" : "' + From 74dc698d0a25b069b8bd026a4dbcda998d71389d Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Wed, 17 May 2023 09:06:07 +0000 Subject: [PATCH 32/34] Prettified Code! --- gui/preload-chat.js | 24 ++++++++++++++---------- gui/sock.js | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index b87370bc..b91f6b49 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -482,8 +482,8 @@ window.addEventListener("DOMContentLoaded", () => { var tnc_command = "broadcast"; var message_type = "broadcast_transmit"; - // slice uuid for reducing overhead - uuid = uuid.slice(-4); + // slice uuid for reducing overhead + uuid = uuid.slice(-4); let Data = { command: tnc_command, @@ -2322,13 +2322,14 @@ function getSetUserInformation(selected_callsign) { if (selected_callsign.startsWith("BC-")) { var userIcon = defaultGroupIcon; - document.getElementById("chatModuleMessage").setAttribute("maxlength", 16); - + document + .getElementById("chatModuleMessage") + .setAttribute("maxlength", 16); } else { var userIcon = defaultUserIcon; - document.getElementById("chatModuleMessage").setAttribute("maxlength", 524288); - - + document + .getElementById("chatModuleMessage") + .setAttribute("maxlength", 524288); } document.getElementById("user-image-" + selected_callsign).src = @@ -2390,12 +2391,15 @@ function getSetUserInformation(selected_callsign) { console.log(err); if (selected_callsign.startsWith("BC-")) { - document.getElementById("chatModuleMessage").setAttribute("maxlength", 16); + document + .getElementById("chatModuleMessage") + .setAttribute("maxlength", 16); var userIcon = defaultGroupIcon; } else { var userIcon = defaultUserIcon; - document.getElementById("chatModuleMessage").setAttribute("maxlength", 524288); - + document + .getElementById("chatModuleMessage") + .setAttribute("maxlength", 524288); } // Callsign list elements diff --git a/gui/sock.js b/gui/sock.js index 80784667..ec3893c9 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -866,7 +866,7 @@ exports.sendBroadcastChannel = function (channel, data_out, uuid) { split_char + data_out ); - console.log(data.length) + console.log(data.length); let payload = data; command = '{"type" : "fec", "command" : "transmit", "mode": "datac4", "wakeup": "True", "payload" : "' + From 08ed91bd7ead5e0713b4c08c2d8ff563bc96a112 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Wed, 17 May 2023 11:30:22 +0200 Subject: [PATCH 33/34] fixed broadcast sender callsign --- gui/preload-chat.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index b87370bc..5d44eb28 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -750,14 +750,14 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { var encoded_data = FD.atob_FD(item.data); var splitted_data = encoded_data.split(split_char); console.log(splitted_data); - + console.log(transmitting_station) // add callsign to message: - var message = splitted_data[4]; + var message = splitted_data[3]; console.log(message); obj.timestamp = Math.floor(Date.now() / 1000); obj.dxcallsign = splitted_data[1]; obj.dxgrid = "null"; - obj.uuid = splitted_data[3]; + obj.uuid = splitted_data[2]; obj.broadcast_sender = transmitting_station; obj.command = "msg"; obj.checksum = "null"; @@ -1027,7 +1027,7 @@ update_chat = function (obj) { } else { var max_retry_attempts = parseInt(config.max_retry_attempts); } - +console.log(obj.msg) // define shortmessage if (obj.msg == "null" || obj.msg == "NULL") { var shortmsg = obj.type; @@ -1295,6 +1295,7 @@ update_chat = function (obj) { } if (obj.type == "broadcast_received") { + console.log(obj) var new_message = `
@@ -1758,6 +1759,7 @@ add_obj_to_database = function (obj) { db.put({ _id: obj.uuid, timestamp: parseInt(obj.timestamp), + broadcast_sender: obj.broadcast_sender, uuid: obj.uuid, dxcallsign: obj.dxcallsign, dxgrid: obj.dxgrid, From 7bb9ac74253b29c2b20a2f9710ab6813803974b1 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Wed, 17 May 2023 09:31:56 +0000 Subject: [PATCH 34/34] Prettified Code! --- gui/preload-chat.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 0b34840c..313311f9 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -750,7 +750,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { var encoded_data = FD.atob_FD(item.data); var splitted_data = encoded_data.split(split_char); console.log(splitted_data); - console.log(transmitting_station) + console.log(transmitting_station); // add callsign to message: var message = splitted_data[3]; console.log(message); @@ -1027,7 +1027,7 @@ update_chat = function (obj) { } else { var max_retry_attempts = parseInt(config.max_retry_attempts); } -console.log(obj.msg) + console.log(obj.msg); // define shortmessage if (obj.msg == "null" || obj.msg == "NULL") { var shortmsg = obj.type; @@ -1295,7 +1295,7 @@ console.log(obj.msg) } if (obj.type == "broadcast_received") { - console.log(obj) + console.log(obj); var new_message = `
Time + Time + Frequency   DXCall