mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
Add files via upload
This commit is contained in:
parent
c5e4972d00
commit
4b405841a6
6 changed files with 940 additions and 0 deletions
201
gui/daemon.js
Normal file
201
gui/daemon.js
Normal file
|
@ -0,0 +1,201 @@
|
|||
var net = require('net');
|
||||
|
||||
var daemon = new net.Socket();
|
||||
var msg = ''; // Current message, per connection.
|
||||
|
||||
|
||||
|
||||
const { ipcRenderer } = require('electron');
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
setTimeout(connectDAEMON, 500)
|
||||
|
||||
function connectDAEMON(){
|
||||
|
||||
console.log('connecting to DAEMON...')
|
||||
|
||||
//clear message buffer after reconnecting or inital connection
|
||||
msg = '';
|
||||
|
||||
//daemon_host = document.getElementById("daemon_adress").value
|
||||
//daemon_port = document.getElementById("daemon_port").value
|
||||
daemon_host = '192.168.178.163'
|
||||
daemon_port = 3001
|
||||
|
||||
daemon.connect(daemon_port, daemon_host)
|
||||
//client.setTimeout(5000);
|
||||
}
|
||||
|
||||
daemon.on('connect', function(data) {
|
||||
console.log('DAEMON connection established')
|
||||
})
|
||||
|
||||
daemon.on('error', function(data) {
|
||||
console.log('DAEMON connection error');
|
||||
setTimeout(connectDAEMON, 2000)
|
||||
});
|
||||
|
||||
/*
|
||||
client.on('close', function(data) {
|
||||
console.log(' TNC connection closed');
|
||||
setTimeout(connectTNC, 2000)
|
||||
});
|
||||
*/
|
||||
|
||||
daemon.on('end', function(data) {
|
||||
console.log('DAEMON connection ended');
|
||||
setTimeout(connectDAEMON, 2000)
|
||||
});
|
||||
|
||||
|
||||
//exports.writeCommand = function(command){
|
||||
writeDaemonCommand = function(command){
|
||||
|
||||
|
||||
// we use the writingCommand function to update our TCPIP state because we are calling this function a lot
|
||||
// if socket openend, we are able to run commands
|
||||
if(daemon.readyState == 'open'){
|
||||
//uiMain.setDAEMONconnection('open')
|
||||
|
||||
daemon.write(command + '\n');
|
||||
}
|
||||
|
||||
if(daemon.readyState == 'closed'){
|
||||
//uiMain.setDAEMONconnection('closed')
|
||||
}
|
||||
|
||||
if(daemon.readyState == 'opening'){
|
||||
//uiMain.setDAEMONconnection('opening')
|
||||
}
|
||||
|
||||
|
||||
let Data = {
|
||||
daemon_connection: daemon.readyState,
|
||||
};
|
||||
ipcRenderer.send('request-update-daemon-connection', Data);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// "https://stackoverflow.com/questions/9070700/nodejs-net-createserver-large-amount-of-data-coming-in"
|
||||
|
||||
|
||||
daemon.on('data', function(data) {
|
||||
|
||||
data = data.toString('utf8'); /* convert data to string */
|
||||
msg += data.toString('utf8'); /*append data to buffer so we can stick long data together */
|
||||
|
||||
|
||||
|
||||
/* check if we reached an EOF, if true, clear buffer and parse JSON data */
|
||||
if (data.endsWith('}')) {
|
||||
/*console.log(msg)*/
|
||||
try {
|
||||
/*console.log(msg)*/
|
||||
data = JSON.parse(msg)
|
||||
} catch (e) {
|
||||
console.log(e); /* "SyntaxError */
|
||||
}
|
||||
msg = '';
|
||||
/*console.log("EOF detected!")*/
|
||||
|
||||
if(data['COMMAND'] == 'DAEMON_STATE'){
|
||||
|
||||
|
||||
|
||||
let Data = {
|
||||
input_devices: data['INPUT_DEVICES'],
|
||||
output_devices: data['OUTPUT_DEVICES'],
|
||||
tnc_running_state: data['DAEMON_STATE'][0]['STATUS']
|
||||
|
||||
};
|
||||
ipcRenderer.send('request-update-daemon-state', Data);
|
||||
|
||||
|
||||
//input_devices = data['INPUT_DEVICES']
|
||||
//uiMain.updateAudioInput(input_devices)
|
||||
|
||||
//output_devices = data['OUTPUT_DEVICES']
|
||||
//uiMain.updateAudioOutput(output_devices)
|
||||
|
||||
//daemon_state = data['DAEMON_STATE'][0]['STATUS']
|
||||
//uiMain.updateTncRunningState(daemon_state)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
////// check if EOF ...
|
||||
}
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
function hexToBytes(hex) {
|
||||
for (var bytes = [], c = 0; c < hex.length; c += 2)
|
||||
bytes.push(parseInt(hex.substr(c, 2), 16));
|
||||
return bytes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
exports.getDaemonState = function(){
|
||||
command = '{"type" : "GET", "command": "DAEMON_STATE"}'
|
||||
writeDaemonCommand(command)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// START TNC
|
||||
// ` `== multi line string
|
||||
|
||||
|
||||
exports.startTNC = function(rx_audio, tx_audio, deviceid, deviceport, ptt){
|
||||
var json_command = JSON.stringify({
|
||||
type: 'SET',
|
||||
command: 'STARTTNC',
|
||||
parameter: [{
|
||||
rx_audio: rx_audio,
|
||||
tx_audio: tx_audio,
|
||||
deviceid: deviceid,
|
||||
deviceport: deviceport,
|
||||
ptt: ptt
|
||||
}]
|
||||
})
|
||||
|
||||
|
||||
|
||||
//console.log(json_command)
|
||||
writeDaemonCommand(json_command)
|
||||
|
||||
|
||||
}
|
||||
|
||||
// STOP TNC
|
||||
exports.stopTNC = function(){
|
||||
command = '{"type" : "SET", "command": "STOPTNC" , "parameter": "---" }'
|
||||
writeDaemonCommand(command)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
261
gui/hamlib-list.html
Normal file
261
gui/hamlib-list.html
Normal file
|
@ -0,0 +1,261 @@
|
|||
<option value="1">Hamlib Dummy</option>
|
||||
<option value="2">Hamlib NET rigctl </option>
|
||||
<option value="4">FLRig FLRig </option>
|
||||
<option value="5">TRXManager TRXManager 5.7.630+</option>
|
||||
<option value="6"> Hamlib Dummy No VFO </option>
|
||||
<option value="1001"> Yaesu FT-847 </option>
|
||||
<option value="1003"> Yaesu FT-1000D </option>
|
||||
<option value="1004"> Yaesu MARK-V FT-1000MP </option>
|
||||
<option value="1005"> Yaesu FT-747GX </option>
|
||||
<option value="1006"> Yaesu FT-757GX </option>
|
||||
<option value="1007"> Yaesu FT-757GXII</option>
|
||||
<option value="1009"> Yaesu FT-767GX </option>
|
||||
<option value="1010"> Yaesu FT-736R </option>
|
||||
<option value="1011"> Yaesu FT-840 </option>
|
||||
<option value="1013"> Yaesu FT-900 </option>
|
||||
<option value="1014"> Yaesu FT-920 </option>
|
||||
<option value="1015"> Yaesu FT-890 </option>
|
||||
<option value="1016"> Yaesu FT-990 </option>
|
||||
<option value="1017"> Yaesu FRG-100 </option>
|
||||
<option value="1018"> Yaesu FRG-9600 </option>
|
||||
<option value="1019"> Yaesu FRG-8800 </option>
|
||||
<option value="1020"> Yaesu FT-817 </option>
|
||||
<option value="1021"> Yaesu FT-100 </option>
|
||||
<option value="1022"> Yaesu FT-857 </option>
|
||||
<option value="1023"> Yaesu FT-897 </option>
|
||||
<option value="1024"> Yaesu FT-1000MP </option>
|
||||
<option value="1025"> Yaesu MARK-V Field FT-1000MP </option>
|
||||
<option value="1026"> Yaesu VR-5000 </option>
|
||||
<option value="1027"> Yaesu FT-450 </option>
|
||||
<option value="1028"> Yaesu FT-950 </option>
|
||||
<option value="1029"> Yaesu FT-2000 </option>
|
||||
<option value="1030"> Yaesu FTDX-9000 </option>
|
||||
<option value="1031"> Yaesu FT-980 </option>
|
||||
<option value="1032"> Yaesu FTDX-5000 </option>
|
||||
<option value="1033"> Vertex Standard VX-1700 </option>
|
||||
<option value="1034"> Yaesu FTDX-1200 </option>
|
||||
<option value="1035"> Yaesu FT-991 </option>
|
||||
<option value="1036"> Yaesu FT-891 </option>
|
||||
<option value="1037"> Yaesu FTDX-3000 </option>
|
||||
<option value="1038"> Yaesu FT-847UNI </option>
|
||||
<option value="1039"> Yaesu FT-600 </option>
|
||||
<option value="1040"> Yaesu FTDX-101D </option>
|
||||
<option value="1041"> Yaesu FT-818 </option>
|
||||
<option value="1042"> Yaesu FTDX-10 </option>
|
||||
<option value="1043"> Yaesu FT-897D </option>
|
||||
<option value="1044"> Yaesu FTDX-101MP </option>
|
||||
<option value="2001"> Kenwood TS-50S </option>
|
||||
<option value="2002"> Kenwood TS-440S </option>
|
||||
<option value="2003"> Kenwood TS-450S </option>
|
||||
<option value="2004"> Kenwood TS-570D </option>
|
||||
<option value="2005"> Kenwood TS-690S </option>
|
||||
<option value="2006"> Kenwood TS-711 </option>
|
||||
<option value="2007"> Kenwood TS-790 </option>
|
||||
<option value="2008"> Kenwood TS-811 </option>
|
||||
<option value="2009"> Kenwood TS-850 </option>
|
||||
<option value="2010"> Kenwood TS-870S </option>
|
||||
<option value="2011"> Kenwood TS-940S </option>
|
||||
<option value="2012"> Kenwood TS-950S </option>
|
||||
<option value="2013"> Kenwood TS-950SDX </option>
|
||||
<option value="2014"> Kenwood TS-2000 </option>
|
||||
<option value="2015"> Kenwood R-5000 </option>
|
||||
<option value="2016"> Kenwood TS-570S </option>
|
||||
<option value="2017"> Kenwood TH-D7A </option>
|
||||
<option value="2019"> Kenwood TH-F6A </option>
|
||||
<option value="2020"> Kenwood TH-F7E </option>
|
||||
<option value="2021"> Elecraft K2 </option>
|
||||
<option value="2022"> Kenwood TS-930 </option>
|
||||
<option value="2023"> Kenwood TH-G71 </option>
|
||||
<option value="2024"> Kenwood TS-680S </option>
|
||||
<option value="2025"> Kenwood TS-140S </option>
|
||||
<option value="2026"> Kenwood TM-D700 </option>
|
||||
<option value="2027"> Kenwood TM-V7 </option>
|
||||
<option value="2028"> Kenwood TS-480 </option>
|
||||
<option value="2029"> Elecraft K3 </option>
|
||||
<option value="2030"> Kenwood TRC-80 </option>
|
||||
<option value="2031"> Kenwood TS-590S </option>
|
||||
<option value="2032"> SigFox Transfox </option>
|
||||
<option value="2033"> Kenwood TH-D72A </option>
|
||||
<option value="2034"> Kenwood TM-D710(G) </option>
|
||||
<option value="2036"> FlexRadio 6xxx </option>
|
||||
<option value="2037"> Kenwood TS-590SG </option>
|
||||
<option value="2038"> Elecraft XG3 </option>
|
||||
<option value="2039"> Kenwood TS-990s </option>
|
||||
<option value="2040"> OpenHPSDR PiHPSDR </option>
|
||||
<option value="2041"> Kenwood TS-890S </option>
|
||||
<option value="2042"> Kenwood TH-D74 </option>
|
||||
<option value="2043"> Elecraft K3S </option>
|
||||
<option value="2044"> Elecraft KX2 </option>
|
||||
<option value="2045"> Elecraft KX3 </option>
|
||||
<option value="2046"> Hilberling PT-8000A </option>
|
||||
<option value="2047"> Elecraft K4 </option>
|
||||
<option value="2048"> FlexRadio/ANAN PowerSDR/Thetis </option>
|
||||
<option value="2049"> Malachite DSP </option>
|
||||
<option value="3002"> Icom IC-1275 </option>
|
||||
<option value="3003"> Icom IC-271 </option>
|
||||
<option value="3004"> Icom IC-275 </option>
|
||||
<option value="3006"> Icom IC-471 </option>
|
||||
<option value="3007"> Icom IC-475 </option>
|
||||
<option value="3009"> Icom IC-706 </option>
|
||||
<option value="3010"> Icom IC-706MkII </option>
|
||||
<option value="3011"> Icom IC-706MkIIG </option>
|
||||
<option value="3012"> Icom IC-707 </option>
|
||||
<option value="3013"> Icom IC-718 </option>
|
||||
<option value="3014"> Icom IC-725 </option>
|
||||
<option value="3015"> Icom IC-726 </option>
|
||||
<option value="3016"> Icom IC-728 </option>
|
||||
<option value="3017"> Icom IC-729 </option>
|
||||
<option value="3019"> Icom IC-735 </option>
|
||||
<option value="3020"> Icom IC-736 </option>
|
||||
<option value="3021"> Icom IC-737 </option>
|
||||
<option value="3022"> Icom IC-738 </option>
|
||||
<option value="3023"> Icom IC-746 </option>
|
||||
<option value="3024"> Icom IC-751 </option>
|
||||
<option value="3026"> Icom IC-756 </option>
|
||||
<option value="3027"> Icom IC-756PRO </option>
|
||||
<option value="3028"> Icom IC-761 </option>
|
||||
<option value="3029"> Icom IC-765 </option>
|
||||
<option value="3030"> Icom IC-775 </option>
|
||||
<option value="3031"> Icom IC-781 </option>
|
||||
<option value="3032"> Icom IC-820H </option>
|
||||
<option value="3034"> Icom IC-821H </option>
|
||||
<option value="3035"> Icom IC-970 </option>
|
||||
<option value="3036"> Icom IC-R10 </option>
|
||||
<option value="3037"> Icom IC-R71 </option>
|
||||
<option value="3038"> Icom IC-R72 </option>
|
||||
<option value="3039"> Icom IC-R75 </option>
|
||||
<option value="3040"> Icom IC-R7000 </option>
|
||||
<option value="3041"> Icom IC-R7100 </option>
|
||||
<option value="3042"> Icom ICR-8500 </option>
|
||||
<option value="3043"> Icom IC-R9000 </option>
|
||||
<option value="3044"> Icom IC-910 </option>
|
||||
<option value="3045"> Icom IC-78 </option>
|
||||
<option value="3046"> Icom IC-746PRO </option>
|
||||
<option value="3047"> Icom IC-756PROII </option>
|
||||
<option value="3051">Ten-Tec Omni VI Plus </option>
|
||||
<option value="3052"> Optoelectronics OptoScan535 </option>
|
||||
<option value="3053"> Optoelectronics OptoScan456 </option>
|
||||
<option value="3054"> Icom IC ID-1 </option>
|
||||
<option value="3055"> Icom IC-703 </option>
|
||||
<option value="3056"> Icom IC-7800 </option>
|
||||
<option value="3057"> Icom IC-756PROIII </option>
|
||||
<option value="3058"> Icom IC-R20 </option>
|
||||
<option value="3060"> Icom IC-7000 </option>
|
||||
<option value="3061"> Icom IC-7200 </option>
|
||||
<option value="3062"> Icom IC-7700 </option>
|
||||
<option value="3063"> Icom IC-7600 </option>
|
||||
<option value="3064"> Ten-Tec Delta II </option>
|
||||
<option value="3065"> Icom IC-92D </option>
|
||||
<option value="3066"> Icom IC-R9500 </option>
|
||||
<option value="3067"> Icom IC-7410 </option>
|
||||
<option value="3068"> Icom IC-9100 </option>
|
||||
<option value="3069"> Icom IC-RX7 </option>
|
||||
<option value="3070"> Icom IC-7100 </option>
|
||||
<option value="3071"> Icom ID-5100 </option>
|
||||
<option value="3072"> Icom IC-2730 </option>
|
||||
<option value="3073"> Icom IC-7300 </option>
|
||||
<option value="3074"> Microtelecom Perseus </option>
|
||||
<option value="3075"> Icom IC-785x </option>
|
||||
<option value="3076"> Xeigu X108G </option>
|
||||
<option value="3077"> Icom IC-R6 </option>
|
||||
<option value="3078"> Icom IC-7610 </option>
|
||||
<option value="3079"> Icom IC-R8600 </option>
|
||||
<option value="3080"> Icom IC-R30 </option>
|
||||
<option value="3081"> Icom IC-9700 </option>
|
||||
<option value="3082"> Icom ID-4100 </option>
|
||||
<option value="3083"> Icom ID-31 </option>
|
||||
<option value="3084"> Icom ID-51 </option>
|
||||
<option value="3085"> Icom IC-705 </option>
|
||||
<option value="4001"> Icom IC-PCR1000 </option>
|
||||
<option value="4002"> Icom IC-PCR100 </option>
|
||||
<option value="4003"> Icom IC-PCR1500 </option>
|
||||
<option value="4004"> Icom IC-PCR2500 </option>
|
||||
<option value="5001"> AOR AR8200 </option>
|
||||
<option value="5002"> AOR AR8000 </option>
|
||||
<option value="5003"> AOR AR7030 </option>
|
||||
<option value="5004"> AOR AR5000 </option>
|
||||
<option value="5005"> AOR AR3030 </option>
|
||||
<option value="5006"> AOR AR3000A </option>
|
||||
<option value="5008"> AOR AR2700 </option>
|
||||
<option value="5013"> AOR AR8600 </option>
|
||||
<option value="5014"> AOR AR5000A </option>
|
||||
<option value="5015"> AOR AR7030 Plus </option>
|
||||
<option value="5016"> AOR SR2200 </option>
|
||||
<option value="6005"> JRC NRD-525 </option>
|
||||
<option value="6006"> JRC NRD-535D </option>
|
||||
<option value="6007"> JRC NRD-545 DSP </option>
|
||||
<option value="8001"> Uniden BC780xlt </option>
|
||||
<option value="8002"> Uniden BC245xlt </option>
|
||||
<option value="8003"> Uniden BC895xlt </option>
|
||||
<option value="8004"> Radio Shack PRO-2052 </option>
|
||||
<option value="8006"> Uniden BC250D </option>
|
||||
<option value="8010"> Uniden BCD-396T </option>
|
||||
<option value="8011"> Uniden BCD-996T </option>
|
||||
<option value="8012"> Uniden BC898T </option>
|
||||
<option value="9002"> Drake R-8A </option>
|
||||
<option value="9003"> Drake R-8B </option>
|
||||
<option value="10004"> Lowe HF-235 </option>
|
||||
<option value="11003">Racal RA6790/GM </option>
|
||||
<option value="11005"> Racal RA3702 </option>
|
||||
<option value="12004"> Watkins-Johnson WJ-8888 </option>
|
||||
<option value="14002"> Skanti TRP8000 </option>
|
||||
<option value="14004"> Skanti TRP 8255 S R </option>
|
||||
<option value="15001"> Winradio WR-1000 </option>
|
||||
<option value="15002"> Winradio WR-1500 </option>
|
||||
<option value="15003"> Winradio WR-1550 </option>
|
||||
<option value="15004"> Winradio WR-3100 </option>
|
||||
<option value="15005"> Winradio WR-3150 </option>
|
||||
<option value="15006">Winradio WR-3500 </option>
|
||||
<option value="15007"> Winradio WR-3700 </option>
|
||||
<option value="15009"> Winradio WR-G313 </option>
|
||||
<option value="16001"> Ten-Tec TT-550 </option>
|
||||
<option value="16002"> Ten-Tec TT-538 Jupiter </option>
|
||||
<option value="16003"> Ten-Tec RX-320 </option>
|
||||
<option value="16004"> Ten-Tec RX-340 </option>
|
||||
<option value="16005"> Ten-Tec RX-350 </option>
|
||||
<option value="16007"> Ten-Tec TT-516 Argonaut V </option>
|
||||
<option value="16008"> Ten-Tec TT-565 Orion </option>
|
||||
<option value="16009"> Ten-Tec TT-585 Paragon </option>
|
||||
<option value="16011"> Ten-Tec TT-588 Omni VII </option>
|
||||
<option value="16012"> Ten-Tec RX-331 </option>
|
||||
<option value="16013"> Ten-Tec TT-599 Eagle </option>
|
||||
<option value="17001"> Alinco DX-77 </option>
|
||||
<option value="17002"> Alinco DX-SR8 </option>
|
||||
<option value="18001"> Kachina 505DSP </option>
|
||||
<option value="22001"> TAPR DSP-10 </option>
|
||||
<option value="23001"> Flex-radio SDR-1000 </option>
|
||||
<option value="23003"> DTTS Microwave Society DttSP IPC </option>
|
||||
<option value="23004"> DTTS Microwave Society DttSP UDP </option>
|
||||
<option value="24001"> RFT EKD-500 </option>
|
||||
<option value="25001"> Elektor Elektor 3/04 </option>
|
||||
<option value="25002"> SAT-Schneider DRT1 </option>
|
||||
<option value="25003"> Coding Technologies Digital World Traveller</option>
|
||||
<option value="25006"> AmQRP DDS-60 </option>
|
||||
<option value="25007"> Elektor Elektor SDR-USB </option>
|
||||
<option value="25008"> mRS miniVNA </option>
|
||||
<option value="25009"> SoftRock Si570 AVR-USB </option>
|
||||
<option value="25011"> KTH-SDR kit Si570 PIC-USB </option>
|
||||
<option value="25012"> FiFi FiFi-SDR </option>
|
||||
<option value="25013"> AMSAT-UK FUNcube Dongle </option>
|
||||
<option value="25014"> N2ADR HiQSDR </option>
|
||||
<option value="25015"> Funkamateur FA-SDR </option>
|
||||
<option value="25016"> AE9RB Si570 Peaberry V1 </option>
|
||||
<option value="25017"> AE9RB Si570 Peaberry V2 </option>
|
||||
<option value="25018"> AMSAT-UK FUNcube Dongle Pro+ </option>
|
||||
<option value="25019"> HobbyPCB RS-HFIQ </option>
|
||||
<option value="26001"> Video4Linux SW/FM radio </option>
|
||||
<option value="26002"> Video4Linux2 SW/FM radio </option>
|
||||
<option value="27001"> Rohde&Schwarz ESMC </option>
|
||||
<option value="27002"> Rohde&Schwarz EB200 </option>
|
||||
<option value="27003"> Rohde&Schwarz XK2100 </option>
|
||||
<option value="28001"> Philips/Simoco PRM8060 </option>
|
||||
<option value="29001"> ADAT www.adat.ch ADT-200A </option>
|
||||
<option value="30001"> Icom IC-M700PRO </option>
|
||||
<option value="30002"> Icom IC-M802 </option>
|
||||
<option value="30003"> Icom IC-M710 </option>
|
||||
<option value="30004"> Icom IC-M803 </option>
|
||||
<option value="31001"> Dorji DRA818V </option>
|
||||
<option value="31002"> Dorji DRA818U </option>
|
||||
<option value="32001"> Barrett 2050 </option>
|
||||
<option value="32002"> Barrett 950 </option>
|
||||
<option value="33001"> ELAD FDM-DUO </option>
|
30
gui/package.json
Normal file
30
gui/package.json
Normal file
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"name": "freedv-jate-gui",
|
||||
"version": "0.0.1",
|
||||
"description": "GUI for FreeDV JATE ",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
"start": "electron .",
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/DJ2LS/FreeDV-JATE-GUI.git"
|
||||
},
|
||||
"keywords": [
|
||||
"TNC",
|
||||
"GUI",
|
||||
"FreeDV",
|
||||
"codec2"
|
||||
],
|
||||
"author": "DJ2LS",
|
||||
"license": "LGPL-2.1",
|
||||
"bugs": {
|
||||
"url": "https://github.com/DJ2LS/FreeDV-JATE-GUI/issues"
|
||||
},
|
||||
"homepage": "https://github.com/DJ2LS/FreeDV-JATE-GUI#readme",
|
||||
"dependencies": {
|
||||
"@electron/remote": "^1.2.0",
|
||||
"bootstrap": "^5.0.1"
|
||||
}
|
||||
}
|
37
gui/preload-data.js
Normal file
37
gui/preload-data.js
Normal file
|
@ -0,0 +1,37 @@
|
|||
|
||||
const { ipcRenderer } = require('electron');
|
||||
|
||||
|
||||
|
||||
window.addEventListener('DOMContentLoaded', () => {
|
||||
const replaceText = (selector, text) => {
|
||||
const element = document.getElementById(selector)
|
||||
if (element) element.innerText = text
|
||||
}
|
||||
|
||||
|
||||
|
||||
document.getElementById("startTransmission").addEventListener("click", () => {
|
||||
alert("HALLO ")
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
ipcRenderer.on('action-update-tnc-state', (event, arg) => {
|
||||
|
||||
|
||||
|
||||
if(arg.ptt_state == 'True'){
|
||||
document.getElementById("ptt_state").className = "btn btn-danger";
|
||||
} else if(arg.ptt_state == 'False'){
|
||||
document.getElementById("ptt_state").className = "btn btn-success";
|
||||
} else {
|
||||
document.getElementById("ptt_state").className = "btn btn-secondary"
|
||||
}
|
||||
});
|
218
gui/preload-main.js
Normal file
218
gui/preload-main.js
Normal file
|
@ -0,0 +1,218 @@
|
|||
const sock = require('./sock.js')
|
||||
const daemon = require('./daemon.js')
|
||||
const { ipcRenderer } = require('electron');
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
window.addEventListener('DOMContentLoaded', () => {
|
||||
|
||||
setInterval(sock.getTncState, 1000)
|
||||
setInterval(daemon.getDaemonState, 250)
|
||||
//setInterval(uiMain.updateFFT, 250)
|
||||
|
||||
|
||||
|
||||
// Create spectrum object on canvas with ID "waterfall"
|
||||
global.spectrum = new Spectrum(
|
||||
"waterfall", {
|
||||
spectrumPercent: 20
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// saveMyCall button clicked
|
||||
document.getElementById("saveMyCall").addEventListener("click", () => {
|
||||
callsign = document.getElementById("myCall").value
|
||||
sock.saveMyCall(callsign)
|
||||
//uiMain.getTncState()
|
||||
})
|
||||
|
||||
// saveMyGrid button clicked
|
||||
document.getElementById("saveMyGrid").addEventListener("click", () => {
|
||||
grid = document.getElementById("myGrid").value
|
||||
sock.saveMyGrid(grid)
|
||||
//uiMain.getTncState()
|
||||
})
|
||||
|
||||
|
||||
// startTNC button clicked
|
||||
document.getElementById("startTNC").addEventListener("click", () => {
|
||||
var rx_audio = document.getElementById("audio_input_selectbox").value
|
||||
var tx_audio = document.getElementById("audio_output_selectbox").value
|
||||
var deviceid = document.getElementById("hamlib_deviceid").value
|
||||
var deviceport = document.getElementById("hamlib_deviceport").value
|
||||
var ptt = document.getElementById("hamlib_ptt").value
|
||||
|
||||
daemon.startTNC(rx_audio, tx_audio, deviceid, deviceport, ptt)
|
||||
})
|
||||
|
||||
// stopTNC button clicked
|
||||
document.getElementById("stopTNC").addEventListener("click", () => {
|
||||
daemon.stopTNC()
|
||||
})
|
||||
|
||||
// openDataModule button clicked
|
||||
document.getElementById("openDataModule").addEventListener("click", () => {
|
||||
//data.show()
|
||||
let Data = {
|
||||
message: "Hello World !"
|
||||
};
|
||||
ipcRenderer.send('show-data-window', Data);
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ipcRenderer.on('action-update-tnc-state', (event, arg) => {
|
||||
|
||||
// PTT STATE
|
||||
if(arg.ptt_state == 'True'){
|
||||
document.getElementById("ptt_state").className = "btn btn-danger";
|
||||
} else if(arg.ptt_state == 'False'){
|
||||
document.getElementById("ptt_state").className = "btn btn-success";
|
||||
} else {
|
||||
document.getElementById("ptt_state").className = "btn btn-secondary"
|
||||
}
|
||||
|
||||
// BUSY STATE
|
||||
if(arg.busy_state == 'BUSY'){
|
||||
document.getElementById("busy_state").className = "btn btn-danger";
|
||||
} else if(arg.busy_state == 'IDLE'){
|
||||
document.getElementById("busy_state").className = "btn btn-success";
|
||||
} else {
|
||||
document.getElementById("busy_state").className = "btn btn-secondary"
|
||||
}
|
||||
|
||||
// ARQ STATE
|
||||
if(arg.arq_state == 'DATA'){
|
||||
document.getElementById("arq_state").className = "btn btn-warning";
|
||||
} else if(arg.arq_state == 'IDLE'){
|
||||
document.getElementById("arq_state").className = "btn btn-secondary";
|
||||
} else {
|
||||
document.getElementById("arq_state").className = "btn btn-secondary"
|
||||
}
|
||||
|
||||
// RMS
|
||||
document.getElementById("rms_level").setAttribute("aria-valuenow", arg.rms_level)
|
||||
document.getElementById("rms_level").setAttribute("style", "width:" + arg.rms_level + "%;")
|
||||
|
||||
// CHANNEL STATE
|
||||
if(arg.channel_state == 'RECEIVING_SIGNALLING'){
|
||||
document.getElementById("signalling_state").className = "btn btn-success";
|
||||
document.getElementById("data_state").className = "btn btn-secondary";
|
||||
|
||||
} else if(arg.channel_state == 'SENDING_SIGNALLING'){
|
||||
document.getElementById("signalling_state").className = "btn btn-danger";
|
||||
document.getElementById("data_state").className = "btn btn-secondary";
|
||||
|
||||
} else if(arg.channel_state == 'RECEIVING_DATA'){
|
||||
document.getElementById("signalling_state").className = "btn btn-secondary";
|
||||
document.getElementById("data_state").className = "btn btn-success";
|
||||
|
||||
} else if(arg.channel_state == 'SENDING_DATA'){
|
||||
document.getElementById("signalling_state").className = "btn btn-secondary";
|
||||
document.getElementById("data_state").className = "btn btn-danger";
|
||||
} else {
|
||||
document.getElementById("signalling_state").className = "btn btn-secondary"
|
||||
document.getElementById("busy_state").className = "btn btn-secondary"
|
||||
|
||||
}
|
||||
|
||||
// SET FREQUENCY
|
||||
document.getElementById("frequency").value = arg.frequency
|
||||
|
||||
// SET MODE
|
||||
document.getElementById("mode").value = arg.mode
|
||||
|
||||
// SET BANDWITH
|
||||
document.getElementById("bandwith").value = arg.bandwith
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
ipcRenderer.on('action-update-daemon-state', (event, arg) => {
|
||||
// UPDATE AUDIO INPUT
|
||||
|
||||
if(document.getElementById("audio_input_selectbox").length != arg.input_devices.length){
|
||||
document.getElementById("audio_input_selectbox").innerHTML = ""
|
||||
for (i = 0; i < arg.input_devices.length; i++) {
|
||||
var option = document.createElement("option");
|
||||
option.text = arg.input_devices[i]['NAME'];
|
||||
option.value = arg.input_devices[i]['ID'];
|
||||
|
||||
document.getElementById("audio_input_selectbox").add(option);
|
||||
}
|
||||
}
|
||||
// UPDATE AUDIO OUTPUT
|
||||
|
||||
if(document.getElementById("audio_output_selectbox").length != arg.output_devices.length){
|
||||
document.getElementById("audio_output_selectbox").innerHTML = ""
|
||||
for (i = 0; i < arg.output_devices.length; i++) {
|
||||
var option = document.createElement("option");
|
||||
option.text = arg.output_devices[i]['NAME'];
|
||||
option.value = arg.output_devices[i]['ID'];
|
||||
document.getElementById("audio_output_selectbox").add(option);
|
||||
}
|
||||
}
|
||||
|
||||
// TNC RUNNING STATE
|
||||
document.getElementById("tnc_running_state").innerHTML = arg.tnc_running_state;
|
||||
if(arg.tnc_running_state == "running"){
|
||||
document.getElementById('hamlib_deviceid').disabled = true
|
||||
document.getElementById('hamlib_deviceport').disabled = true
|
||||
document.getElementById('hamlib_ptt').disabled = true
|
||||
document.getElementById('audio_input_selectbox').disabled = true
|
||||
document.getElementById('audio_output_selectbox').disabled = true
|
||||
document.getElementById('stopTNC').disabled = false
|
||||
document.getElementById('startTNC').disabled = true
|
||||
document.getElementById('myCall').disabled = false
|
||||
document.getElementById('saveMyCall').disabled = false
|
||||
document.getElementById('myGrid').disabled = false
|
||||
document.getElementById('saveMyGrid').disabled = false
|
||||
|
||||
} else {
|
||||
document.getElementById('hamlib_deviceid').disabled = false
|
||||
document.getElementById('hamlib_deviceport').disabled = false
|
||||
document.getElementById('hamlib_ptt').disabled = false
|
||||
document.getElementById('audio_input_selectbox').disabled = false
|
||||
document.getElementById('audio_output_selectbox').disabled = false
|
||||
document.getElementById('stopTNC').disabled = true
|
||||
document.getElementById('startTNC').disabled = false
|
||||
document.getElementById('myCall').disabled = true
|
||||
document.getElementById('saveMyCall').disabled = true
|
||||
document.getElementById('myGrid').disabled = true
|
||||
document.getElementById('saveMyGrid').disabled = true
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
ipcRenderer.on('action-update-daemon-connection', (event, arg) => {
|
||||
|
||||
|
||||
if(arg.daemon_connection == 'open'){
|
||||
document.getElementById("daemon_connection_state").className = "btn btn-success";
|
||||
}
|
||||
if(arg.daemon_connection == 'opening'){
|
||||
document.getElementById("daemon_connection_state").className = "btn btn-warning";
|
||||
}
|
||||
if(arg.daemon_connection == 'closed'){
|
||||
document.getElementById("daemon_connection_state").className = "btn btn-danger";
|
||||
}
|
||||
|
||||
});
|
193
gui/sock.js
Normal file
193
gui/sock.js
Normal file
|
@ -0,0 +1,193 @@
|
|||
var net = require('net');
|
||||
|
||||
const { ipcRenderer } = require('electron');
|
||||
|
||||
var client = new net.Socket();
|
||||
var msg = ''; // Current message, per connection.
|
||||
|
||||
|
||||
|
||||
setTimeout(connectTNC, 500)
|
||||
|
||||
function connectTNC(){
|
||||
|
||||
console.log('connecting to TNC...')
|
||||
|
||||
//clear message buffer after reconnecting or inital connection
|
||||
msg = '';
|
||||
|
||||
tnc_host = document.getElementById("tnc_adress").value
|
||||
tnc_port = document.getElementById("tnc_port").value
|
||||
client.connect(tnc_port, tnc_host)
|
||||
//client.setTimeout(5000);
|
||||
}
|
||||
|
||||
client.on('connect', function(data) {
|
||||
console.log('TNC connection established')
|
||||
})
|
||||
|
||||
client.on('error', function(data) {
|
||||
console.log('TNC connection error');
|
||||
|
||||
|
||||
let Data = {
|
||||
busy_state: "-",
|
||||
arq_state: "-",
|
||||
channel_state: "-",
|
||||
frequency : "-",
|
||||
mode: "-",
|
||||
bandwith: "-",
|
||||
rms_level : 0
|
||||
|
||||
};
|
||||
ipcRenderer.send('request-update-tnc-state', Data);
|
||||
|
||||
setTimeout(connectTNC, 2000)
|
||||
});
|
||||
|
||||
/*
|
||||
client.on('close', function(data) {
|
||||
console.log(' TNC connection closed');
|
||||
setTimeout(connectTNC, 2000)
|
||||
});
|
||||
*/
|
||||
|
||||
client.on('end', function(data) {
|
||||
console.log('TNC connection ended');
|
||||
setTimeout(connectTNC, 2000)
|
||||
});
|
||||
|
||||
|
||||
//exports.writeTncCommand = function(command){
|
||||
writeTncCommand = function(command){
|
||||
|
||||
console.log(command)
|
||||
// we use the writingCommand function to update our TCPIP state because we are calling this function a lot
|
||||
// if socket openend, we are able to run commands
|
||||
if(client.readyState == 'open'){
|
||||
//uiMain.setTNCconnection('open')
|
||||
client.write(command + '\n');
|
||||
}
|
||||
|
||||
if(client.readyState == 'closed'){
|
||||
//uiMain.setTNCconnection('closed')
|
||||
}
|
||||
|
||||
if(client.readyState == 'opening'){
|
||||
//uiMain.setTNCconnection('opening')
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
client.on('data', function(data) {
|
||||
|
||||
/*
|
||||
stackoverflow.com questions 9070700 nodejs-net-createserver-large-amount-of-data-coming-in
|
||||
*/
|
||||
|
||||
data = data.toString('utf8'); // convert data to string
|
||||
msg += data.toString('utf8'); // append data to buffer so we can stick long data together
|
||||
|
||||
/*
|
||||
if (msg.charCodeAt(msg.length - 1) == 0) {
|
||||
client.emit('message', msg.substring(0, msg.length - 1));
|
||||
msg = '';
|
||||
console.log("END OF FILE")
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
if (msg.startsWith('{"COMMAND":')) {
|
||||
msg = '';
|
||||
msg += data.toString('utf8');
|
||||
console.log("BOF detected!")
|
||||
}
|
||||
*/
|
||||
|
||||
// check if we reached an EOF, if true, clear buffer and parse JSON data
|
||||
if (data.endsWith('}')) {
|
||||
//console.log(msg)
|
||||
try {
|
||||
//console.log(msg)
|
||||
data = JSON.parse(msg)
|
||||
} catch (e) {
|
||||
console.log(e); /* "SyntaxError*/
|
||||
}
|
||||
msg = '';
|
||||
/* console.log("EOF detected!") */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if(data['COMMAND'] == 'TNC_STATE'){
|
||||
|
||||
|
||||
|
||||
|
||||
// FFT
|
||||
//fft_raw = data['FFT']
|
||||
//var fft = Buffer.from(fft_raw, "hex")
|
||||
//var fft = hexToBytes(fft_raw)
|
||||
//var fft = Array.from(fft_raw)
|
||||
//console.log(typeof(fft))
|
||||
|
||||
|
||||
|
||||
let Data = {
|
||||
ptt_state: data['PTT_STATE'],
|
||||
busy_state: data['TNC_STATE'],
|
||||
arq_state: data['ARQ_STATE'],
|
||||
channel_state: data['CHANNEL_STATE'],
|
||||
frequency : data['FREQUENCY'],
|
||||
mode: data['MODE'],
|
||||
bandwith: data['BANDWITH'],
|
||||
rms_level : (data['AUDIO_RMS']/1000)*100
|
||||
|
||||
};
|
||||
ipcRenderer.send('request-update-tnc-state', Data);
|
||||
|
||||
|
||||
var fft = Array.from({length: 2048}, () => Math.floor(Math.random() * 10));
|
||||
//console.log(fft)
|
||||
//uiMain.updateFFT(fft)
|
||||
|
||||
|
||||
}
|
||||
|
||||
// check if EOF ...
|
||||
}
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
function hexToBytes(hex) {
|
||||
for (var bytes = [], c = 0; c < hex.length; c += 2)
|
||||
bytes.push(parseInt(hex.substr(c, 2), 16));
|
||||
return bytes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//Save callsign
|
||||
exports.saveMyCall = function(callsign){
|
||||
command = '{"type" : "SET", "command": "MYCALLSIGN" , "parameter": "'+ callsign +'" }'
|
||||
writeTncCommand(command)
|
||||
}
|
||||
|
||||
exports.saveMyGrid = function(grid){
|
||||
command = '{"type" : "SET", "command": "MYGRID" , "parameter": "'+ grid +'" }'
|
||||
writeTncCommand(command)
|
||||
}
|
||||
|
||||
exports.getTncState = function(){
|
||||
command = '{"type" : "GET", "command": "TNC_STATE"}';
|
||||
writeTncCommand(command)
|
||||
}
|
Loading…
Reference in a new issue