mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
repeat frame ack and fixed repeat transmission from gui
This commit is contained in:
parent
11de567ef5
commit
a2552be843
7 changed files with 63 additions and 34 deletions
BIN
dj2ls.png
BIN
dj2ls.png
Binary file not shown.
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "FreeDATA",
|
"name": "FreeDATA",
|
||||||
"version": "0.3.2-alpha.2",
|
"version": "0.3.2-alpha.3",
|
||||||
"description": "FreeDATA ",
|
"description": "FreeDATA ",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -28,6 +28,7 @@
|
||||||
},
|
},
|
||||||
"homepage": "https://freedata.app",
|
"homepage": "https://freedata.app",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"blob-util": "^2.0.2",
|
||||||
"bootstrap": "^5.1.3",
|
"bootstrap": "^5.1.3",
|
||||||
"bootstrap-icons": "^1.8.1",
|
"bootstrap-icons": "^1.8.1",
|
||||||
"bootswatch": "^5.1.3",
|
"bootswatch": "^5.1.3",
|
||||||
|
|
|
@ -6,6 +6,7 @@ const {
|
||||||
v4: uuidv4
|
v4: uuidv4
|
||||||
} = require('uuid');
|
} = require('uuid');
|
||||||
const utf8 = require('utf8');
|
const utf8 = require('utf8');
|
||||||
|
const blobUtil = require('blob-util')
|
||||||
// https://stackoverflow.com/a/26227660
|
// https://stackoverflow.com/a/26227660
|
||||||
var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config")
|
var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config")
|
||||||
var configFolder = path.join(appDataFolder, "FreeDATA");
|
var configFolder = path.join(appDataFolder, "FreeDATA");
|
||||||
|
@ -249,6 +250,13 @@ db.post({
|
||||||
element.scrollTo(0, element.scrollHeight);
|
element.scrollTo(0, element.scrollHeight);
|
||||||
// clear input
|
// clear input
|
||||||
document.getElementById('chatModuleMessage').value = ''
|
document.getElementById('chatModuleMessage').value = ''
|
||||||
|
|
||||||
|
// after adding file data to our attachment varible, delete it from global
|
||||||
|
filetype = '';
|
||||||
|
file = '';
|
||||||
|
filename = '';
|
||||||
|
|
||||||
|
|
||||||
})
|
})
|
||||||
// cleanup after transmission
|
// cleanup after transmission
|
||||||
filetype = '';
|
filetype = '';
|
||||||
|
@ -476,8 +484,8 @@ update_chat = function(obj) {
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
} else {
|
} else {
|
||||||
var filename = ''
|
var filename = '';
|
||||||
var fileheader = ''
|
var fileheader = '';
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
console.log("error with database parsing...")
|
console.log("error with database parsing...")
|
||||||
|
@ -582,7 +590,7 @@ update_chat = function(obj) {
|
||||||
|
|
||||||
|
|
||||||
// CHECK FOR NEW LINE AND REPLACE WITH <br>
|
// CHECK FOR NEW LINE AND REPLACE WITH <br>
|
||||||
var message_html = obj.msg.replace('\n', "<br>");
|
var message_html = obj.msg.replaceAll(/\n/g, "<br>");
|
||||||
|
|
||||||
|
|
||||||
if (obj.type == 'received') {
|
if (obj.type == 'received') {
|
||||||
|
@ -635,6 +643,9 @@ update_chat = function(obj) {
|
||||||
|
|
||||||
} else if (document.getElementById('msg-' + obj._id)) {
|
} else if (document.getElementById('msg-' + obj._id)) {
|
||||||
id = "msg-" + obj._id;
|
id = "msg-" + obj._id;
|
||||||
|
console.log("element already exists......")
|
||||||
|
|
||||||
|
|
||||||
//document.getElementById(id).className = message_class;
|
//document.getElementById(id).className = message_class;
|
||||||
}
|
}
|
||||||
// CREATE SAVE TO FOLDER EVENT LISTENER
|
// CREATE SAVE TO FOLDER EVENT LISTENER
|
||||||
|
@ -667,12 +678,30 @@ update_chat = function(obj) {
|
||||||
}).then(function(doc) {
|
}).then(function(doc) {
|
||||||
// handle doc
|
// handle doc
|
||||||
console.log(doc)
|
console.log(doc)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var filename = Object.keys(obj._attachments)[0]
|
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"])
|
//var file = atob(obj._attachments[filename]["data"])
|
||||||
db.getAttachment(obj._id, filename).then(function(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;
|
var data_with_attachment = doc.msg + split_char + filename + split_char + filetype + split_char + file;
|
||||||
let Data = {
|
let Data = {
|
||||||
command: "send_message",
|
command: "send_message",
|
||||||
|
@ -685,6 +714,7 @@ update_chat = function(obj) {
|
||||||
};
|
};
|
||||||
console.log(Data)
|
console.log(Data)
|
||||||
ipcRenderer.send('run-tnc-command', Data);
|
ipcRenderer.send('run-tnc-command', Data);
|
||||||
|
|
||||||
});
|
});
|
||||||
}).catch(function(err) {
|
}).catch(function(err) {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
|
|
|
@ -23,3 +23,4 @@ body {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
test/rx48.raw
Normal file
BIN
test/rx48.raw
Normal file
Binary file not shown.
|
@ -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())
|
structlog.get_logger("structlog").info("[TNC] ARQ | RX | SENDING DATA FRAME ACK", snr=static.SNR, crc=data_frame_crc.hex())
|
||||||
txbuffer = [ack_frame]
|
txbuffer = [ack_frame]
|
||||||
static.TRANSMITTING = True
|
static.TRANSMITTING = True
|
||||||
modem.MODEM_TRANSMIT_QUEUE.put([14,1,0,txbuffer])
|
modem.MODEM_TRANSMIT_QUEUE.put([14,3,100,txbuffer])
|
||||||
# wait while transmitting
|
# wait while transmitting
|
||||||
while static.TRANSMITTING:
|
while static.TRANSMITTING:
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
|
@ -1634,9 +1634,9 @@ class DATA():
|
||||||
static.TRANSMITTING = True
|
static.TRANSMITTING = True
|
||||||
structlog.get_logger("structlog").info("ENABLE FSK", state=static.ENABLE_FSK)
|
structlog.get_logger("structlog").info("ENABLE FSK", state=static.ENABLE_FSK)
|
||||||
if 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:
|
else:
|
||||||
modem.MODEM_TRANSMIT_QUEUE.put([14,2,500,txbuffer])
|
modem.MODEM_TRANSMIT_QUEUE.put([14,3,500,txbuffer])
|
||||||
# wait while transmitting
|
# wait while transmitting
|
||||||
while static.TRANSMITTING:
|
while static.TRANSMITTING:
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
|
|
37
tnc/modem.py
37
tnc/modem.py
|
@ -337,7 +337,6 @@ class RF():
|
||||||
freedv = cast(codec2.api.freedv_open(self.MODE), c_void_p)
|
freedv = cast(codec2.api.freedv_open(self.MODE), c_void_p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# get number of bytes per frame for mode
|
# get number of bytes per frame for mode
|
||||||
bytes_per_frame = int(codec2.api.freedv_get_bits_per_modem_frame(freedv)/8)
|
bytes_per_frame = int(codec2.api.freedv_get_bits_per_modem_frame(freedv)/8)
|
||||||
payload_bytes_per_frame = bytes_per_frame -2
|
payload_bytes_per_frame = bytes_per_frame -2
|
||||||
|
@ -361,8 +360,7 @@ class RF():
|
||||||
|
|
||||||
structlog.get_logger("structlog").debug("TRANSMIT", mode=self.MODE, payload=payload_bytes_per_frame)
|
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
|
# 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:
|
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
|
# write preamble to txbuffer
|
||||||
|
@ -370,7 +368,6 @@ class RF():
|
||||||
txbuffer += bytes(mod_out_preamble)
|
txbuffer += bytes(mod_out_preamble)
|
||||||
# create modulaton for n frames in list
|
# create modulaton for n frames in list
|
||||||
for n in range(0,len(frames)):
|
for n in range(0,len(frames)):
|
||||||
|
|
||||||
# create buffer for data
|
# create buffer for data
|
||||||
buffer = bytearray(payload_bytes_per_frame) # use this if CRC16 checksum is required ( DATA1-3)
|
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
|
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)
|
mod_out_silence = create_string_buffer(samples_delay*2)
|
||||||
txbuffer += bytes(mod_out_silence)
|
txbuffer += bytes(mod_out_silence)
|
||||||
|
|
||||||
# resample up to 48k (resampler works on np.int16)
|
# resample up to 48k (resampler works on np.int16)
|
||||||
x = np.frombuffer(txbuffer, dtype=np.int16)
|
x = np.frombuffer(txbuffer, dtype=np.int16)
|
||||||
x = set_audio_volume(x, static.TX_AUDIO_LEVEL)
|
x = set_audio_volume(x, static.TX_AUDIO_LEVEL)
|
||||||
txbuffer_48k = self.resampler.resample8_to_48(x)
|
txbuffer_48k = self.resampler.resample8_to_48(x)
|
||||||
|
|
||||||
# explicitly lock our usage of mod_out_queue if needed
|
# explicitly lock our usage of mod_out_queue if needed
|
||||||
# deaktivated for testing purposes
|
# deaktivated for testing purposes
|
||||||
self.mod_out_locked = False
|
self.mod_out_locked = False
|
||||||
|
|
||||||
|
|
||||||
chunk_length = self.AUDIO_FRAMES_PER_BUFFER_TX #4800
|
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)]
|
chunk = [txbuffer_48k[i:i+chunk_length] for i in range(0, len(txbuffer_48k), chunk_length)]
|
||||||
for c in chunk:
|
for c in chunk:
|
||||||
|
|
||||||
if len(c) < chunk_length:
|
if len(c) < chunk_length:
|
||||||
delta = chunk_length - len(c)
|
delta = chunk_length - len(c)
|
||||||
delta_zeros = np.zeros(delta, dtype=np.int16)
|
delta_zeros = np.zeros(delta, dtype=np.int16)
|
||||||
c = np.append(c, delta_zeros)
|
c = np.append(c, delta_zeros)
|
||||||
|
|
||||||
#structlog.get_logger("structlog").debug("[TNC] mod out shorter than audio buffer", delta=delta)
|
#structlog.get_logger("structlog").debug("[TNC] mod out shorter than audio buffer", delta=delta)
|
||||||
self.modoutqueue.append(c)
|
self.modoutqueue.append(c)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue