Merge pull request #352 from DJ2LS/qm-guilow

GUI Optimization
This commit is contained in:
DJ2LS 2023-02-06 12:49:12 +01:00 committed by GitHub
commit e7c3bf8f0c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 924 additions and 531 deletions

View file

@ -221,7 +221,7 @@ exports.getDaemonState = function() {
// START TNC // START TNC
// ` `== multi line string // ` `== multi line string
exports.startTNC = function(mycall, mygrid, rx_audio, tx_audio, radiocontrol, devicename, deviceport, pttprotocol, pttport, serialspeed, data_bits, stop_bits, handshake, rigctld_ip, rigctld_port, enable_fft, enable_scatter, low_bandwidth_mode, tuning_range_fmin, tuning_range_fmax, enable_fsk, tx_audio_level, respond_to_cq, rx_buffer_size, enable_explorer) { exports.startTNC = function(mycall, mygrid, rx_audio, tx_audio, radiocontrol, devicename, deviceport, pttprotocol, pttport, serialspeed, data_bits, stop_bits, handshake, rigctld_ip, rigctld_port, enable_fft, enable_scatter, low_bandwidth_mode, tuning_range_fmin, tuning_range_fmax, enable_fsk, tx_audio_level, respond_to_cq, rx_buffer_size, enable_explorer, explorer_stats, auto_tune) {
var json_command = JSON.stringify({ var json_command = JSON.stringify({
type: 'set', type: 'set',
command: 'start_tnc', command: 'start_tnc',
@ -250,7 +250,9 @@ exports.startTNC = function(mycall, mygrid, rx_audio, tx_audio, radiocontrol, de
tx_audio_level : tx_audio_level, tx_audio_level : tx_audio_level,
respond_to_cq : respond_to_cq, respond_to_cq : respond_to_cq,
rx_buffer_size : rx_buffer_size, rx_buffer_size : rx_buffer_size,
enable_explorer : enable_explorer enable_explorer : enable_explorer,
enable_stats: explorer_stats,
enable_auto_tune: auto_tune
}] }]
}) })

View file

@ -96,7 +96,9 @@ const configDefaultSettings = '{\
"rx_buffer_size" : "16", \ "rx_buffer_size" : "16", \
"enable_explorer" : "False", \ "enable_explorer" : "False", \
"wftheme": 2, \ "wftheme": 2, \
"high_graphics" : "True"\ "high_graphics" : "True",\
"explorer_stats" : "False", \
"auto_tune" : "False" \
}'; }';
if (!fs.existsSync(configPath)) { if (!fs.existsSync(configPath)) {
@ -467,6 +469,10 @@ ipcMain.on('request-update-transmission-status', (event, arg) => {
win.webContents.send('action-update-transmission-status',arg); win.webContents.send('action-update-transmission-status',arg);
}); });
ipcMain.on('request-update-reception-status', (event, arg) => {
win.webContents.send('action-update-reception-status',arg);
});
ipcMain.on('request-open-tnc-log', () => { ipcMain.on('request-open-tnc-log', () => {
logViewer.show(); logViewer.show();
}); });
@ -503,7 +509,8 @@ console.log(filepath.filePaths[0])
try { try {
//fs.readFile(filepath.filePaths[0], 'utf8', function (err, data) { //fs.readFile(filepath.filePaths[0], 'utf8', function (err, data) {
fs.readFile(filepath.filePaths[0], 'binary', function (err, data) { //Has to be binary
fs.readFile(filepath.filePaths[0],'binary', function (err, data) {
console.log(data.length) console.log(data.length)
@ -537,15 +544,10 @@ ipcMain.on('save-file-to-folder',(event,data)=>{
console.log(data.file) console.log(data.file)
try { try {
let arraybuffer = Buffer.from(data.file,"base64").toString('utf-8');
let buffer = Buffer.from(data.file);
let arraybuffer = Uint8Array.from(buffer);
console.log(arraybuffer) console.log(arraybuffer)
fs.writeFile(filepath.filePath, data.file, 'binary', function (err, data) { //Has to be binary
//fs.writeFile(filepath.filePath, arraybuffer, function (err, data) { fs.writeFile(filepath.filePath, arraybuffer, 'binary', function (err, data) {
//fs.writeFile(filepath.filePath, arraybuffer, 'binary', function(err) {
//fs.writeFile(filepath.filePath, new Uint8Array(Buffer.from(data.file)), function (err, data) {
//fs.writeFile(filepath.filePath, Buffer.from(data.file), function (err, data) {
}) })
} catch (err) { } catch (err) {
console.log(err); console.log(err);

View file

@ -5,8 +5,6 @@ const {
const { const {
v4: uuidv4 v4: uuidv4
} = require('uuid'); } = require('uuid');
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");
@ -163,11 +161,10 @@ window.addEventListener('DOMContentLoaded', () => {
document.querySelector('emoji-picker').addEventListener("emoji-click", (event) => { document.querySelector('emoji-picker').addEventListener("emoji-click", (event) => {
var msg = document.getElementById('chatModuleMessage'); var msg = document.getElementById('chatModuleMessage');
var picker = document.getElementById("emojipickercontainer"); //Convert to utf-8--so we can just use utf-8 everywhere
msg.setRangeText(event.detail.emoji.unicode) msg.setRangeText(event.detail.emoji.unicode.toString('utf-8'));
console.log(event.detail); //console.log(event.detail);
picker.style.display="none"; //msg.focus();
msg.focus();
}) })
document.getElementById("emojipickerbutton").addEventListener("click", () => { document.getElementById("emojipickerbutton").addEventListener("click", () => {
var element = document.getElementById("emojipickercontainer") var element = document.getElementById("emojipickercontainer")
@ -310,7 +307,8 @@ db.post({
var dxcallsign = selected_callsign.toUpperCase(); var dxcallsign = selected_callsign.toUpperCase();
var textarea = document.getElementById('chatModuleMessage') var textarea = document.getElementById('chatModuleMessage')
var chatmessage = textarea.value; var chatmessage = textarea.value;
//Remove non-printable chars from begining and end of string--should save us a byte here and there
chatmessage = chatmessage.toString().trim();
// reset textarea size // reset textarea size
var message_container_height_offset = 150; var message_container_height_offset = 150;
var message_container_height = `calc(100% - ${message_container_height_offset}px)`; var message_container_height = `calc(100% - ${message_container_height_offset}px)`;
@ -357,7 +355,8 @@ db.post({
_attachments: { _attachments: {
[filename]: { [filename]: {
content_type: filetype, content_type: filetype,
data: btoa(file) //data: btoa(file)
data: btoa_FD(file)
} }
} }
}).then(function(response) { }).then(function(response) {
@ -367,7 +366,6 @@ db.post({
}).catch(function(err) { }).catch(function(err) {
console.log(err); console.log(err);
}); });
update_chat_obj_by_uuid(uuid); update_chat_obj_by_uuid(uuid);
// clear input // clear input
@ -475,7 +473,9 @@ ipcRenderer.on('action-new-msg-received', (event, arg) => {
// handle ARQ transmission // handle ARQ transmission
} else if (item.arq == 'transmission' && item.status == 'received') { } else if (item.arq == 'transmission' && item.status == 'received') {
var encoded_data = atob(item.data); //var encoded_data = atob(item.data);
//var encoded_data = Buffer.from(item.data,'base64').toString('utf-8');
var encoded_data = atob_FD(item.data);
var splitted_data = encoded_data.split(split_char); var splitted_data = encoded_data.split(split_char);
console.log(splitted_data) console.log(splitted_data)
@ -486,14 +486,16 @@ ipcRenderer.on('action-new-msg-received', (event, arg) => {
obj.command = splitted_data[1]; obj.command = splitted_data[1];
obj.checksum = splitted_data[2]; obj.checksum = splitted_data[2];
// convert message to unicode from utf8 because of emojis // convert message to unicode from utf8 because of emojis
obj.uuid = utf8.decode(splitted_data[3]); //No, don't convert; we're already UTF-8!!!!!
obj.msg = utf8.decode(splitted_data[5]); obj.uuid = splitted_data[3];
obj.msg = splitted_data[5];
obj.status = 'null'; obj.status = 'null';
obj.snr = 'null'; obj.snr = 'null';
obj.type = 'received'; obj.type = 'received';
obj.filename = utf8.decode(splitted_data[6]); obj.filename = splitted_data[6];
obj.filetype = utf8.decode(splitted_data[7]); obj.filetype = splitted_data[7];
obj.file = btoa(splitted_data[8]); //obj.file = btoa(splitted_data[8]);
obj.file = btoa_FD(splitted_data[8]);
add_obj_to_database(obj); add_obj_to_database(obj);
update_chat_obj_by_uuid(obj.uuid); update_chat_obj_by_uuid(obj.uuid);
@ -535,7 +537,8 @@ update_chat = function(obj) {
// get filesize of new submitted data // get filesize of new submitted data
// not that nice.... // not that nice....
// we really should avoid converting back from base64 for performance reasons... // we really should avoid converting back from base64 for performance reasons...
var filesize = Math.ceil(atob(obj._attachments[filename]["data"]).length) + "Bytes"; //var filesize = Math.ceil(atob(obj._attachments[filename]["data"]).length) + "Bytes";
var filesize = Math.ceil(atob_FD(obj._attachments[filename]["data"]).length) + " Bytes";
} }
// check if image, then display it // check if image, then display it
@ -853,7 +856,7 @@ update_chat = function(obj) {
var filename = Object.keys(obj._attachments)[0] var filename = Object.keys(obj._attachments)[0]
var filetype = filename.content_type var filetype = filename.content_type
console.log(filename) console.log(filename)
console.log(filetype) console.log(filetype)
var file = obj._attachments[filename].data var file = obj._attachments[filename].data
@ -863,6 +866,24 @@ update_chat = function(obj) {
//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) console.log(data)
//Rewrote this part to use buffers to ensure encoding is corect -- n1qm
var binaryString = atob_FD(data);
console.log(binaryString);
var data_with_attachment = doc.timestamp + split_char + doc.msg + split_char + filename + split_char + filetype + split_char + binaryString;
let Data = {
command: "send_message",
dxcallsign: doc.dxcallsign,
mode: 255,
frames: 1,
data: data_with_attachment,
checksum: doc.checksum,
uuid: doc.uuid
};
console.log(Data)
ipcRenderer.send('run-tnc-command', Data);
});
/*
// convert blob data to binary string // convert blob data to binary string
blobUtil.blobToBinaryString(data).then(function (binaryString) { blobUtil.blobToBinaryString(data).then(function (binaryString) {
console.log(binaryString) console.log(binaryString)
@ -891,6 +912,7 @@ update_chat = function(obj) {
}); });
}); });
*/
}).catch(function(err) { }).catch(function(err) {
console.log(err); console.log(err);
}); });
@ -1038,4 +1060,22 @@ var crc32 = function(str) {
} }
return (crc ^ (-1)) >>> 0; return (crc ^ (-1)) >>> 0;
}; };
/**
* Binary to ASCII replacement
* @param {string} data in normal/usual utf-8 format
* @returns base64 encoded string
*/
function btoa_FD(data)
{
return Buffer.from(data,'utf-8').toString('base64');
}
/**
* ASCII to Binary replacement
* @param {string} data in base64 encoding
* @returns utf-8 normal/usual string
*/
function atob_FD(data)
{
return Buffer.from(data,'base64').toString('utf-8');
}

View file

@ -261,13 +261,27 @@ document.getElementById('openReceivedFilesFolder').addEventListener('click', ()
if(config.enable_explorer == 'True'){ if(config.enable_explorer == 'True'){
document.getElementById("ExplorerSwitch").checked = true; document.getElementById("ExplorerSwitch").checked = true;
document.getElementById("ExplorerStatsSwitch").disabled=false;
if (config.explorer_stats.toLowerCase() == 'true') {
document.getElementById("ExplorerStatsSwitch").checked=true;
} else {
document.getElementById("ExplorerStatsSwitch").checked=false;
}
} else { } else {
document.getElementById("ExplorerSwitch").checked = false; document.getElementById("ExplorerSwitch").checked = false;
document.getElementById("ExplorerStatsSwitch").disabled=true;
document.getElementById("ExplorerStatsSwitch").checked=false;
}
if(config.auto_tune == 'True'){
document.getElementById("autoTuneSwitch").checked = true;
} else {
document.getElementById("autoTuneSwitch").checked = false;
} }
// theme selector // theme selector
if(config.theme != 'default'){ if(config.theme != 'default'){
var theme_path = "../node_modules/bootswatch/dist/"+ config.theme +"/bootstrap.min.css"; var theme_path = "../node_modules/bootswatch/dist/"+ config.theme +"/bootstrap.min.css";
document.getElementById("theme_selector").value = config.theme; document.getElementById("theme_selector").value = config.theme;
document.getElementById("bootstrap_theme").href = escape(theme_path); document.getElementById("bootstrap_theme").href = escape(theme_path);
@ -1086,8 +1100,31 @@ document.getElementById('hamlib_rigctld_stop').addEventListener('click', () => {
document.getElementById("ExplorerSwitch").addEventListener("click", () => { document.getElementById("ExplorerSwitch").addEventListener("click", () => {
if(document.getElementById("ExplorerSwitch").checked == true){ if(document.getElementById("ExplorerSwitch").checked == true){
config.enable_explorer = "True"; config.enable_explorer = "True";
document.getElementById("ExplorerStatsSwitch").disabled=false;
} else { } else {
config.enable_explorer = "False"; config.enable_explorer = "False";
config.explorer_stats = "False";
document.getElementById("ExplorerStatsSwitch").disabled=true;
document.getElementById("ExplorerStatsSwitch").checked=false;
document.getElementById("ExplorerSwitch").checked = false;
}
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
});
// enable explorer stats Switch clicked
document.getElementById("ExplorerStatsSwitch").addEventListener("click", () => {
if(document.getElementById("ExplorerStatsSwitch").checked == true){
config.explorer_stats = "True";
} else {
config.explorer_stats = "False";
}
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
});
// enable explorer stats Switch clicked
document.getElementById("autoTuneSwitch").addEventListener("click", () => {
if(document.getElementById("autoTuneSwitch").checked == true){
config.auto_tune = "True";
} else {
config.auto_tune = "False";
} }
fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
}); });
@ -1253,7 +1290,16 @@ document.getElementById('hamlib_rigctld_stop').addEventListener('click', () => {
} else { } else {
var enable_explorer = "False"; var enable_explorer = "False";
} }
if (document.getElementById("ExplorerStatsSwitch").checked == true){
var explorer_stats = "True";
} else {
var explorer_stats = "False";
}
if (document.getElementById("autoTuneSwitch").checked == true){
var auto_tune = "True";
} else {
var auto_tune = "False";
}
// loop through audio device list and select // loop through audio device list and select
for(i = 0; i < document.getElementById("audio_input_selectbox").length; i++) { for(i = 0; i < document.getElementById("audio_input_selectbox").length; i++) {
device = document.getElementById("audio_input_selectbox")[i]; device = document.getElementById("audio_input_selectbox")[i];
@ -1313,6 +1359,8 @@ document.getElementById('hamlib_rigctld_stop').addEventListener('click', () => {
config.respond_to_cq = respond_to_cq; config.respond_to_cq = respond_to_cq;
config.rx_buffer_size = rx_buffer_size; config.rx_buffer_size = rx_buffer_size;
config.enable_explorer = enable_explorer; config.enable_explorer = enable_explorer;
config.explorer_stats = explorer_stats;
config.auto_tune = auto_tune;
fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
@ -1331,7 +1379,7 @@ document.getElementById('hamlib_rigctld_stop').addEventListener('click', () => {
*/ */
daemon.startTNC(callsign_ssid, mygrid, rx_audio, tx_audio, radiocontrol, deviceid, deviceport, pttprotocol, pttport, serialspeed, data_bits, stop_bits, handshake, rigctld_ip, rigctld_port, enable_fft, enable_scatter, low_bandwidth_mode, tuning_range_fmin, tuning_range_fmax, enable_fsk, tx_audio_level, respond_to_cq, rx_buffer_size, enable_explorer); daemon.startTNC(callsign_ssid, mygrid, rx_audio, tx_audio, radiocontrol, deviceid, deviceport, pttprotocol, pttport, serialspeed, data_bits, stop_bits, handshake, rigctld_ip, rigctld_port, enable_fft, enable_scatter, low_bandwidth_mode, tuning_range_fmin, tuning_range_fmax, enable_fsk, tx_audio_level, respond_to_cq, rx_buffer_size, enable_explorer,explorer_stats,auto_tune);
}) })
@ -1484,33 +1532,52 @@ document.getElementById('hamlib_rigctld_stop').addEventListener('click', () => {
}; };
ipcRenderer.send('request-show-chat-window', Data); ipcRenderer.send('request-show-chat-window', Data);
}) })
}) })
//Listen for events caused by tnc 'tnc-message's function connectedStation(data)
ipcRenderer.on('action-update-transmission-status', (event, arg) => { {
if ((typeof(data.dxcallsign) == 'undefined')) {
return;
}
if (!(typeof(data.arq) == 'undefined') && data.arq.toLowerCase() == 'session') {
var prefix = "w/ ";
} else {
switch (data.irs){
case 'True':
//We are receiving station
var prefix = "de ";
break;
case 'False':
//We are sending station
var prefix = "to ";
break;
default:
//Shouldn't happen
console.trace('No data.irs data in tnc-message');
var prefix = "";
break;
}
}
document.getElementById("txtConnectedWith").textContent=prefix + data.dxcallsign;
}
//Listen for events caused by tnc 'tnc-message' rx
ipcRenderer.on('action-update-reception-status', (event, arg) => {
var data =arg["data"][0]; var data =arg["data"][0];
var txprog = document.getElementById("transmission_progress") var txprog = document.getElementById("transmission_progress")
ipcRenderer.send('request-show-electron-progressbar',data.percent); ipcRenderer.send('request-show-electron-progressbar',data.percent);
txprog.setAttribute("aria-valuenow", data.percent); txprog.setAttribute("aria-valuenow", data.percent);
txprog.setAttribute("style", "width:" + data.percent + "%;"); txprog.setAttribute("style", "width:" + data.percent + "%;");
// SET TIME LEFT UNTIL FINIHED // SET TIME LEFT UNTIL FINIHED
if (typeof(data.finished) == 'undefined') { if (typeof(data.finished) == 'undefined') {
var time_left = 0; var time_left = "time left: estimating";
} else { } else {
var arq_seconds_until_finish = data.finished var arq_seconds_until_finish = data.finished
var hours = Math.floor(arq_seconds_until_finish / 3600); var hours = Math.floor(arq_seconds_until_finish / 3600);
var minutes = Math.floor((arq_seconds_until_finish % 3600) / 60 ); var minutes = Math.floor((arq_seconds_until_finish % 3600) / 60 );
var seconds = arq_seconds_until_finish % 60; var seconds = arq_seconds_until_finish % 60;
if(hours < 0) { if(hours < 0) {
hours = 0; hours = 0;
} }
@ -1520,9 +1587,14 @@ ipcRenderer.on('action-update-transmission-status', (event, arg) => {
if(seconds < 0) { if(seconds < 0) {
seconds = 0; seconds = 0;
} }
var time_left = "time left: ~ "+ minutes + "min" + " " + seconds + "s"; if (hours > 0)
{
time_left = "time left: ~"+ hours.toString().padStart(2,'0') + ":" + minutes.toString().padStart(2,'0') + "." + seconds.toString().padStart(2,'0');
} else {
time_left = "time left: ~"+ minutes.toString().padStart(2,'0') + "." + seconds.toString().padStart(2,'0');
}
} }
document.getElementById("transmission_timeleft").textContent = time_left; var time_left = "<strong>" + time_left +" || Speed/min: ";
// SET BYTES PER MINUTE // SET BYTES PER MINUTE
if (typeof(data.bytesperminute) == 'undefined') { if (typeof(data.bytesperminute) == 'undefined') {
@ -1530,7 +1602,6 @@ ipcRenderer.on('action-update-transmission-status', (event, arg) => {
} else { } else {
var arq_bytes_per_minute = data.bytesperminute; var arq_bytes_per_minute = data.bytesperminute;
} }
document.getElementById("bytes_per_min").textContent = arq_bytes_per_minute;
// SET BYTES PER MINUTE COMPRESSED // SET BYTES PER MINUTE COMPRESSED
var compress = data.compression; var compress = data.compression;
@ -1538,10 +1609,70 @@ ipcRenderer.on('action-update-transmission-status', (event, arg) => {
compress = 1; compress = 1;
} }
var arq_bytes_per_minute_compressed = Math.round(arq_bytes_per_minute * compress); var arq_bytes_per_minute_compressed = Math.round(arq_bytes_per_minute * compress);
document.getElementById("bytes_per_min_compressed").textContent = arq_bytes_per_minute_compressed;
time_left += formatBytes(arq_bytes_per_minute,1) + " (comp: " + formatBytes(arq_bytes_per_minute_compressed,1) + ")</strong>";
document.getElementById("transmission_timeleft").innerHTML = time_left;
connectedStation(data);
}); });
//Listen for events caused by tnc 'tnc-message's tx
ipcRenderer.on('action-update-transmission-status', (event, arg) => {
var data =arg["data"][0];
var txprog = document.getElementById("transmission_progress")
ipcRenderer.send('request-show-electron-progressbar',data.percent);
txprog.setAttribute("aria-valuenow", data.percent);
txprog.setAttribute("style", "width:" + data.percent + "%;");
// SET TIME LEFT UNTIL FINIHED
if (typeof(data.finished) == 'undefined') {
var time_left = "time left: estimating";
} else {
var arq_seconds_until_finish = data.finished
var hours = Math.floor(arq_seconds_until_finish / 3600);
var minutes = Math.floor((arq_seconds_until_finish % 3600) / 60 );
var seconds = arq_seconds_until_finish % 60;
if(hours < 0) {
hours = 0;
}
if(minutes < 0) {
minutes = 0;
}
if(seconds < 0) {
seconds = 0;
}
if (hours > 0)
{
time_left = "time left: ~"+ hours.toString().padStart(2,'0') + ":" + minutes.toString().padStart(2,'0') + "." + seconds.toString().padStart(2,'0');
} else {
time_left = "time left: ~"+ minutes.toString().padStart(2,'0') + "." + seconds.toString().padStart(2,'0');
}
}
var time_left = "<strong>" + time_left +" || Speed/min: ";
// SET BYTES PER MINUTE
if (typeof(data.bytesperminute) == 'undefined') {
var arq_bytes_per_minute = 0;
} else {
var arq_bytes_per_minute = data.bytesperminute;
}
// SET BYTES PER MINUTE COMPRESSED
var compress = data.compression;
if (isNaN(compress)) {
compress = 1;
}
var arq_bytes_per_minute_compressed = Math.round(arq_bytes_per_minute * compress);
time_left += formatBytes(arq_bytes_per_minute,1) + " (comp: " + formatBytes(arq_bytes_per_minute_compressed,1) + ")</strong>";
connectedStation(data);
});
var slowRollTable=4; var slowRollTable=4;
ipcRenderer.on('action-update-tnc-state', (event, arg) => { ipcRenderer.on('action-update-tnc-state', (event, arg) => {
@ -1563,9 +1694,7 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => {
// DATA STATE // DATA STATE
global.rxBufferLengthTnc = arg.rx_buffer_length global.rxBufferLengthTnc = arg.rx_buffer_length
// START OF SCATTER CHART // START OF SCATTER CHART
const scatterConfig = { const scatterConfig = {
plugins: { plugins: {
legend: { legend: {
@ -1574,7 +1703,6 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => {
tooltip: { tooltip: {
enabled: false enabled: false
}, },
annotation: { annotation: {
annotations: { annotations: {
line1: { line1: {
@ -1593,9 +1721,6 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => {
} }
} }
}, },
}, },
animations: false, animations: false,
scales: { scales: {
@ -1610,7 +1735,6 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => {
} }
}, },
y: { y: {
display: true, display: true,
min: -80, min: -80,
max: 80, max: 80,
@ -1654,7 +1778,6 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => {
// END OF SCATTER CHART // END OF SCATTER CHART
// START OF SPEED CHART // START OF SPEED CHART
var speedDataTime = [] var speedDataTime = []
if (typeof(arg.speed_list) == 'undefined') { if (typeof(arg.speed_list) == 'undefined') {
@ -1683,7 +1806,6 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => {
speedDataSnr.push(arg.speed_list[i].snr) speedDataSnr.push(arg.speed_list[i].snr)
} }
var speedChartConfig = { var speedChartConfig = {
type: 'line', type: 'line',
}; };
@ -1710,7 +1832,6 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => {
yAxisID: 'SPEED', yAxisID: 'SPEED',
} }
], ],
}; };
var speedChartOptions = { var speedChartOptions = {
@ -1748,19 +1869,9 @@ var speedChartOptions = {
global.speedChart.update(); global.speedChart.update();
} }
} }
// END OF SPEED CHART // END OF SPEED CHART
// PTT STATE // PTT STATE
/*
if (arg.ptt_state == 'True') {
document.getElementById("ptt_state").className = "btn btn-sm btn-danger";
} else if (arg.ptt_state == 'False') {
document.getElementById("ptt_state").className = "btn btn-sm btn-success";
} else {
document.getElementById("ptt_state").className = "btn btn-sm btn-secondary";
}
*/
switch (arg.ptt_state){ switch (arg.ptt_state){
case 'True': case 'True':
document.getElementById("ptt_state").className = "btn btn-sm btn-danger"; document.getElementById("ptt_state").className = "btn btn-sm btn-danger";
@ -1771,33 +1882,16 @@ var speedChartOptions = {
default: default:
document.getElementById("ptt_state").className = "btn btn-sm btn-secondary"; document.getElementById("ptt_state").className = "btn btn-sm btn-secondary";
break; break;
} }
// AUDIO RECORDING // AUDIO RECORDING
if (arg.audio_recording == 'True') { if (arg.audio_recording == 'True') {
document.getElementById("startStopRecording").className = "btn btn-sm btn-danger";
document.getElementById("startStopRecording").textContent = "Stop Rec" document.getElementById("startStopRecording").textContent = "Stop Rec"
} else if (arg.ptt_state == 'False') {
document.getElementById("startStopRecording").className = "btn btn-sm btn-danger";
document.getElementById("startStopRecording").textContent = "Start Rec"
} else { } else {
document.getElementById("startStopRecording").className = "btn btn-sm btn-danger";
document.getElementById("startStopRecording").textContent = "Start Rec" document.getElementById("startStopRecording").textContent = "Start Rec"
} }
// CHANNEL BUSY STATE // CHANNEL BUSY STATE
/*
if (arg.channel_busy == 'True') {
document.getElementById("channel_busy").className = "btn btn-sm btn-danger";
} else if (arg.channel_busy == 'False') {
document.getElementById("channel_busy").className = "btn btn-sm btn-success";
} else {
document.getElementById("channel_busy").className = "btn btn-sm btn-secondary";
}
*/
switch (arg.channel_busy){ switch (arg.channel_busy){
case 'True': case 'True':
document.getElementById("channel_busy").className = "btn btn-sm btn-danger"; document.getElementById("channel_busy").className = "btn btn-sm btn-danger";
@ -1811,19 +1905,6 @@ var speedChartOptions = {
} }
// BUSY STATE // BUSY STATE
/*
if (arg.busy_state == 'BUSY') {
document.getElementById("busy_state").className = "btn btn-sm btn-danger";
document.getElementById("startTransmission").disabled = true;
//document.getElementById("stopTransmission").disabled = false;
} else if (arg.busy_state == 'IDLE') {
document.getElementById("busy_state").className = "btn btn-sm btn-success";
} else {
document.getElementById("busy_state").className = "btn btn-sm btn-secondary";
document.getElementById("startTransmission").disabled = true;
//document.getElementById("stopTransmission").disabled = false;
}
*/
switch(arg.busy_state){ switch(arg.busy_state){
case 'BUSY': case 'BUSY':
document.getElementById("busy_state").className = "btn btn-sm btn-danger"; document.getElementById("busy_state").className = "btn btn-sm btn-danger";
@ -1839,61 +1920,32 @@ var speedChartOptions = {
} }
// ARQ STATE // ARQ STATE
/*
if (arg.arq_state == 'True') {
document.getElementById("arq_state").className = "btn btn-sm btn-warning";
//document.getElementById("startTransmission").disabled = true;
document.getElementById("startTransmission").disabled = false;
//document.getElementById("stopTransmission").disabled = false;
} else if (arg.arq_state == 'False') {
document.getElementById("arq_state").className = "btn btn-sm btn-secondary";
document.getElementById("startTransmission").disabled = false;
//document.getElementById("stopTransmission").disabled = true;
} else {
document.getElementById("arq_state").className = "btn btn-sm btn-secondary";
//document.getElementById("startTransmission").disabled = true;
document.getElementById("startTransmission").disabled = false;
//document.getElementById("stopTransmission").disabled = false;
}
*/
switch (arg.arq_state){ switch (arg.arq_state){
case 'True': case 'True':
document.getElementById("arq_state").className = "btn btn-sm btn-warning"; document.getElementById("arq_state").className = "btn btn-sm btn-warning";
document.getElementById("startTransmission").disabled = false; document.getElementById("startTransmission").disabled = false;
break; break;
case 'False':
document.getElementById("arq_state").className = "btn btn-sm btn-secondary";
document.getElementById("startTransmission").disabled = false;
break;
default: default:
document.getElementById("arq_state").className = "btn btn-sm btn-secondary"; document.getElementById("arq_state").className = "btn btn-sm btn-secondary";
document.getElementById("startTransmission").disabled = false; document.getElementById("startTransmission").disabled = false;
break; break;
} }
// ARQ SESSION
/*
if (arg.arq_session == 'True') {
document.getElementById("arq_session").className = "btn btn-sm btn-warning";
} else if (arg.arq_session == 'False') { // ARQ SESSION
document.getElementById("arq_session").className = "btn btn-sm btn-secondary"; switch (arg.arq_session){
case 'True':
document.getElementById("arq_session").className = "btn btn-sm btn-warning";
break;
default:
document.getElementById("arq_session").className = "btn btn-sm btn-secondary";
break;
}
} else { if (arg.arq_state == 'True' || arg.arq_session == 'True') {
document.getElementById("arq_session").className = "btn btn-sm btn-secondary"; toggleClass("spnConnectedWith","text-success",true);
} else {
} toggleClass("spnConnectedWith","text-success",false);
*/ }
switch (arg.arq_session){
case 'True':
document.getElementById("arq_session").className = "btn btn-sm btn-warning";
break;
case 'False':
document.getElementById("arq_session").className = "btn btn-sm btn-secondary";
break;
default:
document.getElementById("arq_session").className = "btn btn-sm btn-secondary";
break;
}
// HAMLIB STATUS // HAMLIB STATUS
if (arg.hamlib_status == 'connected') { if (arg.hamlib_status == 'connected') {
@ -1902,45 +1954,28 @@ var speedChartOptions = {
document.getElementById("rigctld_state").className = "btn btn-secondary btn-sm"; document.getElementById("rigctld_state").className = "btn btn-secondary btn-sm";
} }
// BEACON
let bcn = document.getElementById("startBeacon");
// BEACON STATE
/*
if (arg.beacon_state == 'True') {
document.getElementById("startBeacon").className = "btn btn-sm btn-success spinner-grow";
document.getElementById("startBeacon").disabled = true;
document.getElementById("beaconInterval").disabled = true;
document.getElementById("stopBeacon").disabled = false;
} else if (arg.beacon_state == 'False') {
document.getElementById("startBeacon").className = "btn btn-sm btn-success";
document.getElementById("startBeacon").disabled = false;
document.getElementById("beaconInterval").disabled = false;
document.getElementById("stopBeacon").disabled = true;
} else {
document.getElementById("startBeacon").className = "btn btn-sm btn-success";
document.getElementById("startBeacon").disabled = false;
document.getElementById("stopBeacon").disabled = true;
document.getElementById("beaconInterval").disabled = false;
}
*/
switch (arg.beacon_state){ switch (arg.beacon_state){
case 'True': case 'True':
document.getElementById("startBeacon").className = "btn btn-sm btn-success spinner-grow"; bcn.disabled = true;
document.getElementById("startBeacon").disabled = true; if (config.high_graphics.toUpperCase() == "TRUE") {
bcn.className = "btn btn-sm btn-success spinner-grow force-gpu";
document.getElementById("txtBeacon").setAttribute("class","input-group-text p-1");
} else {
bcn.className = "btn btn-sm btn-success";
document.getElementById("txtBeacon").setAttribute("class","input-group-text p-1 text-success text-uppercase");
}
document.getElementById("beaconInterval").disabled = true; document.getElementById("beaconInterval").disabled = true;
document.getElementById("stopBeacon").disabled = false; document.getElementById("stopBeacon").disabled = false;
break; break;
case 'False':
document.getElementById("startBeacon").className = "btn btn-sm btn-success";
document.getElementById("startBeacon").disabled = false;
document.getElementById("beaconInterval").disabled = false;
document.getElementById("stopBeacon").disabled = true;
break;
default: default:
document.getElementById("startBeacon").className = "btn btn-sm btn-success"; document.getElementById("txtBeacon").setAttribute("class","input-group-text p-1");
document.getElementById("startBeacon").disabled = false; bcn.className = "btn btn-sm btn-success";
document.getElementById("stopBeacon").disabled = true;
document.getElementById("beaconInterval").disabled = false; document.getElementById("beaconInterval").disabled = false;
document.getElementById("stopBeacon").disabled = true;
bcn.disabled = false;
break; break;
} }
// dbfs // dbfs
@ -1968,23 +2003,6 @@ var speedChartOptions = {
document.getElementById("bandwidth").textContent = arg.bandwidth; document.getElementById("bandwidth").textContent = arg.bandwidth;
// SET SPEED LEVEL // SET SPEED LEVEL
/*
if(arg.speed_level >= 0) {
document.getElementById("speed_level").className = "bi bi-reception-1";
}
if(arg.speed_level >= 1) {
document.getElementById("speed_level").className = "bi bi-reception-2";
}
if(arg.speed_level >= 2) {
document.getElementById("speed_level").className = "bi bi-reception-3";
}
if(arg.speed_level >= 3) {
document.getElementById("speed_level").className = "bi bi-reception-4";
}
if(arg.speed_level >= 4) {
document.getElementById("speed_level").className = "bi bi-reception-4";
}
*/
switch (arg.speed_level){ switch (arg.speed_level){
case '0': case '0':
document.getElementById("speed_level").className = "bi bi-reception-1"; document.getElementById("speed_level").className = "bi bi-reception-1";
@ -2000,8 +2018,6 @@ var speedChartOptions = {
break; break;
} }
// SET TOTAL BYTES // SET TOTAL BYTES
if (typeof(arg.total_bytes) == 'undefined') { if (typeof(arg.total_bytes) == 'undefined') {
var total_bytes = 0; var total_bytes = 0;
@ -2040,13 +2056,10 @@ var speedChartOptions = {
var myGrid = document.getElementById("myGrid").value; var myGrid = document.getElementById("myGrid").value;
try { try {
var dist = parseInt(distance(myGrid, dxGrid)) + ' km'; var dist = parseInt(distance(myGrid, dxGrid)) + ' km';
//document.getElementById("pingDistance").innerHTML = dist;
document.getElementById("dataModalPingDistance").textContent = dist; document.getElementById("dataModalPingDistance").textContent = dist;
} catch { } catch {
//document.getElementById("pingDistance").innerHTML = '---';
document.getElementById("dataModalPingDistance").textContent = '---'; document.getElementById("dataModalPingDistance").textContent = '---';
} }
//document.getElementById("pingDB").innerHTML = arg.stations[i]['snr'];
document.getElementById("dataModalPingDB").textContent = arg.stations[i]['snr']; document.getElementById("dataModalPingDB").textContent = arg.stations[i]['snr'];
} }
@ -2090,7 +2103,11 @@ var speedChartOptions = {
var gridDistanceText = document.createElement('span'); var gridDistanceText = document.createElement('span');
try { try {
gridDistanceText.innerText = parseInt(distance(document.getElementById("myGrid").value, arg.stations[i]['dxgrid'])) + ' km'; if (arg.stations[i]['dxgrid'].toString() != "------") {
gridDistanceText.innerText = parseInt(distance(document.getElementById("myGrid").value, arg.stations[i]['dxgrid'])) + ' km';
} else {
gridDistanceText.innerText = '---';
}
} catch { } catch {
gridDistanceText.innerText = '---'; gridDistanceText.innerText = '---';
} }
@ -2100,17 +2117,7 @@ var speedChartOptions = {
var dataTypeText = document.createElement('span'); var dataTypeText = document.createElement('span');
dataTypeText.innerText = arg.stations[i]['datatype']; dataTypeText.innerText = arg.stations[i]['datatype'];
dataType.appendChild(dataTypeText); dataType.appendChild(dataTypeText);
/*
if(arg.stations[i]['datatype'] == 'DATA-CHANNEL'){
dataTypeText.innerText = 'DATA-C';
dataType.appendChild(dataTypeText);
}
if(arg.stations[i]['datatype'] == 'SESSION-HB'){
dataTypeText.innerHTML = '<i class="bi bi-heart-pulse-fill"></i>';
dataType.appendChild(dataTypeText);
}
*/
switch (arg.stations[i]['datatype']){ switch (arg.stations[i]['datatype']){
case 'DATA-CHANNEL': case 'DATA-CHANNEL':
dataTypeText.innerText = 'DATA-C'; dataTypeText.innerText = 'DATA-C';
@ -2121,28 +2128,7 @@ var speedChartOptions = {
dataType.appendChild(dataTypeText); dataType.appendChild(dataTypeText);
break; break;
} }
/*
if (dataTypeText.innerText == 'CQ CQ CQ') {
row.classList.add("table-success");
}
if (dataTypeText.innerText == 'DATA-C') {
dataTypeText.innerHTML = '<i class="bi bi-file-earmark-binary-fill"></i>';
row.classList.add("table-warning");
}
if (dataTypeText.innerText == 'BEACON') {
row.classList.add("table-light");
}
if (dataTypeText.innerText == 'PING') {
row.classList.add("table-info");
}
if (dataTypeText.innerText == 'PING-ACK') {
row.classList.add("table-primary");
}
*/
switch (dataTypeText.innerText){ switch (dataTypeText.innerText){
case 'CQ CQ CQ': case 'CQ CQ CQ':
row.classList.add("table-success"); row.classList.add("table-success");
@ -2512,7 +2498,6 @@ ipcRenderer.on('action-update-rx-buffer', (event, arg) => {
console.log(err); console.log(err);
}); });
} }
}); });
ipcRenderer.on('run-tnc-command', (event, arg) => { ipcRenderer.on('run-tnc-command', (event, arg) => {
@ -2954,12 +2939,26 @@ function set_CPU_mode() {
toggleClass("transmission_progress","progress-bar-striped",true); toggleClass("transmission_progress","progress-bar-striped",true);
} }
} }
//Teomporarily disable a button with timeout //Temporarily disable a button with timeout
function pauseButton(btn, timems) { function pauseButton(btn, timems) {
btn.disabled = true; btn.disabled = true;
var curText = btn.innerHTML; var curText = btn.innerHTML;
btn.innerHTML = "<span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\">"; if (config.high_graphics.toUpperCase() == "TRUE") {
btn.innerHTML = "<span class=\"spinner-grow spinner-grow-sm force-gpu\" role=\"status\" aria-hidden=\"true\">";
}
setTimeout(()=>{ setTimeout(()=>{
btn.innerHTML=curText; btn.innerHTML=curText;
btn.disabled = false;}, timems) btn.disabled = false;}, timems)
}
//https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript
function formatBytes(bytes, decimals = 1) {
if (!+bytes) return '0 Bytes'
const k = 1024
const dm = decimals < 0 ? 0 : decimals
const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
const i = Math.floor(Math.log(bytes) / Math.log(k))
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`
} }

View file

@ -236,6 +236,8 @@ client.on('data', function(socketdata) {
}; };
ipcRenderer.send('request-update-tnc-state', Data); ipcRenderer.send('request-update-tnc-state', Data);
//continue to next for loop iteration, nothing else needs to be done here
continue;
} }
@ -346,6 +348,9 @@ client.on('data', function(socketdata) {
} else if (data['status'] == 'waiting') { } else if (data['status'] == 'waiting') {
ipcRenderer.send('request-show-arq-toast-datachannel-waiting', {data: [data]}); ipcRenderer.send('request-show-arq-toast-datachannel-waiting', {data: [data]});
// ARQ RECEIVING
} else if (data['status'] == 'receiving') {
ipcRenderer.send('request-update-reception-status', {data: [data]});
// ARQ TRANSMISSION FAILED // ARQ TRANSMISSION FAILED
} else if (data['status'] == 'failed') { } else if (data['status'] == 'failed') {
@ -367,7 +372,8 @@ client.on('data', function(socketdata) {
socketLog.info(data) socketLog.info(data)
// we need to encode here to do a deep check for checking if file or message // we need to encode here to do a deep check for checking if file or message
var encoded_data = atob(data['data']) //var encoded_data = atob(data['data'])
var encoded_data = atob_FD(data['data']);
var splitted_data = encoded_data.split(split_char) var splitted_data = encoded_data.split(split_char)
if(splitted_data[0] == 'f'){ if(splitted_data[0] == 'f'){
@ -420,7 +426,8 @@ client.on('data', function(socketdata) {
for (i = 0; i < data['data-array'].length; i++) { for (i = 0; i < data['data-array'].length; i++) {
try{ try{
// we need to encode here to do a deep check for checking if file or message // we need to encode here to do a deep check for checking if file or message
var encoded_data = atob(data['data-array'][i]['data']) //var encoded_data = atob(data['data-array'][i]['data'])
var encoded_data = atob_FD(data['data-array'][i]['data']);
var splitted_data = encoded_data.split(split_char) var splitted_data = encoded_data.split(split_char)
@ -516,8 +523,11 @@ exports.sendFile = function(dxcallsign, mode, frames, filename, filetype, data,
data = datatype + split_char + filename + split_char + filetype + split_char + checksum + split_char + data data = datatype + split_char + filename + split_char + filetype + split_char + checksum + split_char + data
socketLog.info(data) socketLog.info(data)
socketLog.info(btoa(data)) //socketLog.info(btoa(data))
data = btoa(data) //Btoa / atob will not work with charsets > 8 bits (i.e. the emojis); should probably move away from using it
//TODO: Will need to update anyother occurences and throughly test
//data = btoa(data)
data = btoa_FD(data);
command = '{"type" : "arq", "command" : "send_raw", "parameter" : [{"dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "data" : "' + data + '"}]}' command = '{"type" : "arq", "command" : "send_raw", "parameter" : [{"dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "data" : "' + data + '"}]}'
writeTncCommand(command) writeTncCommand(command)
@ -541,8 +551,8 @@ exports.sendMessage = function(dxcallsign, mode, frames, data, checksum, uuid, c
console.log("CHECKSUM" + checksum) console.log("CHECKSUM" + checksum)
//socketLog.info(btoa(data)) //socketLog.info(btoa(data))
data = btoa(data) //data = btoa(data)
data = btoa_FD(data);
//command = '{"type" : "arq", "command" : "send_message", "parameter" : [{ "dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "data" : "' + data + '" , "checksum" : "' + checksum + '"}]}' //command = '{"type" : "arq", "command" : "send_message", "parameter" : [{ "dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "data" : "' + data + '" , "checksum" : "' + checksum + '"}]}'
command = '{"type" : "arq", "command" : "send_raw", "uuid" : "'+ uuid +'", "parameter" : [{"dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "data" : "' + data + '", "attempts": "15"}]}' command = '{"type" : "arq", "command" : "send_raw", "uuid" : "'+ uuid +'", "parameter" : [{"dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "data" : "' + data + '", "attempts": "15"}]}'
@ -636,7 +646,23 @@ ipcRenderer.on('action-update-tnc-ip', (event, arg) => {
}); });
/**
* String to base64
* @param {string} data in normal/usual utf-8 format
* @returns base64 encoded string
*/
function btoa_FD(data) {
return Buffer.from(data,'utf-8').toString('base64');
}
/**
* base64 to string
* @param {string} data in base64 encoding
* @returns utf-8 normal/usual string
*/
function atob_FD(data)
{
return Buffer.from(data,'base64').toString('utf-8');
}
// https://stackoverflow.com/a/50579690 // https://stackoverflow.com/a/50579690
// crc32 calculation // crc32 calculation

File diff suppressed because it is too large Load diff