diff --git a/dj2ls.png b/dj2ls.png deleted file mode 100644 index 9db8f82b..00000000 Binary files a/dj2ls.png and /dev/null differ diff --git a/gui/package.json b/gui/package.json index 3ccf574c..173ac382 100644 --- a/gui/package.json +++ b/gui/package.json @@ -1,6 +1,6 @@ { "name": "FreeDATA", - "version": "0.3.2-alpha.2", + "version": "0.3.2-alpha.3", "description": "FreeDATA ", "main": "main.js", "scripts": { @@ -28,6 +28,7 @@ }, "homepage": "https://freedata.app", "dependencies": { + "blob-util": "^2.0.2", "bootstrap": "^5.1.3", "bootstrap-icons": "^1.8.1", "bootswatch": "^5.1.3", diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 0ecefaea..e9db6281 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -6,6 +6,7 @@ const { v4: uuidv4 } = require('uuid'); const utf8 = require('utf8'); +const blobUtil = require('blob-util') // https://stackoverflow.com/a/26227660 var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config") var configFolder = path.join(appDataFolder, "FreeDATA"); @@ -198,7 +199,7 @@ db.post({ console.log(filename); console.log(filetype); var data_with_attachment = chatmessage + split_char + filename + split_char + filetype + split_char + file; - + document.getElementById('selectFilesButton').innerHTML = ``; var uuid = uuidv4(); @@ -249,6 +250,13 @@ db.post({ element.scrollTo(0, element.scrollHeight); // clear input document.getElementById('chatModuleMessage').value = '' + + // after adding file data to our attachment varible, delete it from global + filetype = ''; + file = ''; + filename = ''; + + }) // cleanup after transmission filetype = ''; @@ -476,8 +484,8 @@ update_chat = function(obj) { `; } else { - var filename = '' - var fileheader = '' + var filename = ''; + var fileheader = ''; } } catch { console.log("error with database parsing...") @@ -582,7 +590,7 @@ update_chat = function(obj) { // CHECK FOR NEW LINE AND REPLACE WITH
- var message_html = obj.msg.replace('\n', "
"); + var message_html = obj.msg.replaceAll(/\n/g, "
"); if (obj.type == 'received') { @@ -635,6 +643,9 @@ update_chat = function(obj) { } else if (document.getElementById('msg-' + obj._id)) { id = "msg-" + obj._id; + console.log("element already exists......") + + //document.getElementById(id).className = message_class; } // CREATE SAVE TO FOLDER EVENT LISTENER @@ -667,12 +678,30 @@ update_chat = function(obj) { }).then(function(doc) { // handle doc console.log(doc) + + + + var filename = Object.keys(obj._attachments)[0] - var filetype = obj._attachments[filename]["content_type"] + var filetype = filename.content_type + + console.log(filename) + console.log(filetype) + var file = obj._attachments[filename].data + console.log(file) + console.log(Object.keys(obj._attachments)[0].data) + //var file = atob(obj._attachments[filename]["data"]) db.getAttachment(obj._id, filename).then(function(data) { - console.log(data) - var file = atob(data) + + var file = blobUtil.arrayBufferToBinaryString(data) + + // converting back to blob for debugging + // length must be equal of file size + var blob = blobUtil.binaryStringToBlob(file); + console.log(blob) + + var data_with_attachment = doc.msg + split_char + filename + split_char + filetype + split_char + file; let Data = { command: "send_message", @@ -684,7 +713,8 @@ update_chat = function(obj) { uuid: doc.uuid }; console.log(Data) - ipcRenderer.send('run-tnc-command', Data); + ipcRenderer.send('run-tnc-command', Data); + }); }).catch(function(err) { console.log(err); diff --git a/gui/src/styles.css b/gui/src/styles.css index 17112d0c..04038c8c 100644 --- a/gui/src/styles.css +++ b/gui/src/styles.css @@ -23,3 +23,4 @@ body { display: none; } + diff --git a/test/rx48.raw b/test/rx48.raw new file mode 100644 index 00000000..95796a59 Binary files /dev/null and b/test/rx48.raw differ diff --git a/tnc/data_handler.py b/tnc/data_handler.py index bdf9e044..04c07238 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -591,7 +591,7 @@ class DATA(): structlog.get_logger("structlog").info("[TNC] ARQ | RX | SENDING DATA FRAME ACK", snr=static.SNR, crc=data_frame_crc.hex()) txbuffer = [ack_frame] static.TRANSMITTING = True - modem.MODEM_TRANSMIT_QUEUE.put([14,1,0,txbuffer]) + modem.MODEM_TRANSMIT_QUEUE.put([14,3,100,txbuffer]) # wait while transmitting while static.TRANSMITTING: time.sleep(0.01) @@ -1634,9 +1634,9 @@ class DATA(): static.TRANSMITTING = True structlog.get_logger("structlog").info("ENABLE FSK", state=static.ENABLE_FSK) if static.ENABLE_FSK: - modem.MODEM_TRANSMIT_QUEUE.put(['FSK_LDPC_0',2,500,txbuffer]) + modem.MODEM_TRANSMIT_QUEUE.put(['FSK_LDPC_0',3,500,txbuffer]) else: - modem.MODEM_TRANSMIT_QUEUE.put([14,2,500,txbuffer]) + modem.MODEM_TRANSMIT_QUEUE.put([14,3,500,txbuffer]) # wait while transmitting while static.TRANSMITTING: time.sleep(0.01) diff --git a/tnc/modem.py b/tnc/modem.py index 107afd93..f3524767 100644 --- a/tnc/modem.py +++ b/tnc/modem.py @@ -336,8 +336,7 @@ class RF(): else: freedv = cast(codec2.api.freedv_open(self.MODE), c_void_p) - - + # get number of bytes per frame for mode bytes_per_frame = int(codec2.api.freedv_get_bits_per_modem_frame(freedv)/8) payload_bytes_per_frame = bytes_per_frame -2 @@ -360,9 +359,8 @@ class RF(): txbuffer = bytes(mod_out_silence) structlog.get_logger("structlog").debug("TRANSMIT", mode=self.MODE, payload=payload_bytes_per_frame) - - for i in range(1,repeats+1): - + + for i in range(0,repeats): # codec2 fsk preamble may be broken - at least it sounds like that so we are disabling it for testing if not self.MODE == 'FSK_LDPC_0' or self.MODE == 200 or self.MODE == 'FSK_LDPC_1' or self.MODE == 201: # write preamble to txbuffer @@ -370,7 +368,6 @@ class RF(): txbuffer += bytes(mod_out_preamble) # create modulaton for n frames in list for n in range(0,len(frames)): - # create buffer for data buffer = bytearray(payload_bytes_per_frame) # use this if CRC16 checksum is required ( DATA1-3) buffer[:len(frames[n])] = frames[n] # set buffersize to length of data which will be send @@ -397,27 +394,27 @@ class RF(): mod_out_silence = create_string_buffer(samples_delay*2) txbuffer += bytes(mod_out_silence) - # resample up to 48k (resampler works on np.int16) - x = np.frombuffer(txbuffer, dtype=np.int16) - x = set_audio_volume(x, static.TX_AUDIO_LEVEL) - txbuffer_48k = self.resampler.resample8_to_48(x) + # resample up to 48k (resampler works on np.int16) + x = np.frombuffer(txbuffer, dtype=np.int16) + x = set_audio_volume(x, static.TX_AUDIO_LEVEL) + txbuffer_48k = self.resampler.resample8_to_48(x) - # explicitly lock our usage of mod_out_queue if needed - # deaktivated for testing purposes - self.mod_out_locked = False + # explicitly lock our usage of mod_out_queue if needed + # deaktivated for testing purposes + self.mod_out_locked = False - chunk_length = self.AUDIO_FRAMES_PER_BUFFER_TX #4800 - chunk = [txbuffer_48k[i:i+chunk_length] for i in range(0, len(txbuffer_48k), chunk_length)] - for c in chunk: + chunk_length = self.AUDIO_FRAMES_PER_BUFFER_TX #4800 + chunk = [txbuffer_48k[i:i+chunk_length] for i in range(0, len(txbuffer_48k), chunk_length)] + for c in chunk: - if len(c) < chunk_length: - delta = chunk_length - len(c) - delta_zeros = np.zeros(delta, dtype=np.int16) - c = np.append(c, delta_zeros) + if len(c) < chunk_length: + delta = chunk_length - len(c) + delta_zeros = np.zeros(delta, dtype=np.int16) + c = np.append(c, delta_zeros) - #structlog.get_logger("structlog").debug("[TNC] mod out shorter than audio buffer", delta=delta) - self.modoutqueue.append(c) + #structlog.get_logger("structlog").debug("[TNC] mod out shorter than audio buffer", delta=delta) + self.modoutqueue.append(c)