From 59469dbeb8728ab297c6794aa9bdcee57349a63b Mon Sep 17 00:00:00 2001 From: NoobishSVK Date: Sun, 21 Jan 2024 18:57:43 +0100 Subject: [PATCH] flags --- datahandler.js | 129 ++++++++++++-------- example.js | 286 +++++++++++++++++++++++++++------------------ index.js | 4 +- librdsparser.dll | Bin 71624 -> 83224 bytes librdsparser.so | Bin 26976 -> 42328 bytes userconfig.js | 6 +- web/css/styles.css | 31 +++-- web/index.html | 9 +- web/main.js | 2 + web/themes.js | 4 + 10 files changed, 296 insertions(+), 175 deletions(-) diff --git a/datahandler.js b/datahandler.js index a5c84fa..084024e 100644 --- a/datahandler.js +++ b/datahandler.js @@ -11,37 +11,52 @@ koffi.proto('void callback_tp(void *rds, void *user_data)'); koffi.proto('void callback_ta(void *rds, void *user_data)'); koffi.proto('void callback_ms(void *rds, void *user_data)'); koffi.proto('void callback_ecc(void *rds, void *user_data)'); +koffi.proto('void callback_country(void *rds, void *user_data)'); koffi.proto('void callback_af(void *rds, uint32_t af, void *user_data)'); koffi.proto('void callback_ps(void *rds, void *user_data)'); koffi.proto('void callback_rt(void *rds, int flag, void *user_data)'); koffi.proto('void callback_ptyn(void *rds, void *user_data)'); +koffi.proto('void callback_ct(void *rds, void *ct, void *user_data)'); const rdsparser = { - new: lib.func('void* rdsparser_new()'), - clear: lib.func('void rdsparser_clear(void *rds)'), - free: lib.func('void rdsparser_free(void *rds)'), - parse_string: lib.func('bool rdsparser_parse_string(void *rds, const char *input)'), - get_pi: lib.func('int32_t rdsparser_get_pi(void *rds)'), - get_pty: lib.func('int8_t rdsparser_get_pty(void *rds)'), - get_tp: lib.func('int8_t rdsparser_get_tp(void *rds)'), - get_ta: lib.func('int8_t rdsparser_get_ta(void *rds)'), - get_ms: lib.func('int8_t rdsparser_get_ms(void *rds)'), - get_ecc: lib.func('int8_t rdsparser_get_ecc(void *rds)'), - get_ps: lib.func('void* rdsparser_get_ps(void *rds)'), - get_rt: lib.func('void* rdsparser_get_rt(void *rds, int flag)'), - get_ptyn: lib.func('void* rdsparser_get_ptyn(void *rds)'), - register_pi: lib.func('void rdsparser_register_pi(void *rds, callback_pi *cb)'), - register_pty: lib.func('void rdsparser_register_pty(void *rds, callback_pty *cb)'), - register_tp: lib.func('void rdsparser_register_tp(void *rds, callback_tp *cb)'), - register_ta: lib.func('void rdsparser_register_ta(void *rds, callback_ta *cb)'), - register_ms: lib.func('void rdsparser_register_ms(void *rds, callback_ms *cb)'), - register_ecc: lib.func('void rdsparser_register_ecc(void *rds, callback_ecc *cb)'), - register_af: lib.func('void rdsparser_register_af(void *rds, callback_af *cb)'), - register_ps: lib.func('void rdsparser_register_ps(void *rds, callback_ps *cb)'), - register_rt: lib.func('void rdsparser_register_rt(void *rds, callback_rt *cb)'), - register_ptyn: lib.func('void rdsparser_register_ptyn(void *rds, callback_ptyn *cb)'), - string_get_content: lib.func(unicode_type + '* rdsparser_string_get_content(void *string)'), - string_get_length: lib.func('uint8_t rdsparser_string_get_length(void *string)') + new: lib.func('void* rdsparser_new()'), + free: lib.func('void rdsparser_free(void *rds)'), + clear: lib.func('void rdsparser_clear(void *rds)'), + parse_string: lib.func('bool rdsparser_parse_string(void *rds, const char *input)'), + get_pi: lib.func('int32_t rdsparser_get_pi(void *rds)'), + get_pty: lib.func('int8_t rdsparser_get_pty(void *rds)'), + get_tp: lib.func('int8_t rdsparser_get_tp(void *rds)'), + get_ta: lib.func('int8_t rdsparser_get_ta(void *rds)'), + get_ms: lib.func('int8_t rdsparser_get_ms(void *rds)'), + get_ecc: lib.func('int16_t rdsparser_get_ecc(void *rds)'), + get_country: lib.func('int rdsparser_get_country(void *rds)'), + get_ps: lib.func('void* rdsparser_get_ps(void *rds)'), + get_rt: lib.func('void* rdsparser_get_rt(void *rds, int flag)'), + get_ptyn: lib.func('void* rdsparser_get_ptyn(void *rds)'), + register_pi: lib.func('void rdsparser_register_pi(void *rds, callback_pi *cb)'), + register_pty: lib.func('void rdsparser_register_pty(void *rds, callback_pty *cb)'), + register_tp: lib.func('void rdsparser_register_tp(void *rds, callback_tp *cb)'), + register_ta: lib.func('void rdsparser_register_ta(void *rds, callback_ta *cb)'), + register_ms: lib.func('void rdsparser_register_ms(void *rds, callback_ms *cb)'), + register_ecc: lib.func('void rdsparser_register_ecc(void *rds, callback_ecc *cb)'), + register_country: lib.func('void rdsparser_register_country(void *rds, callback_country *cb)'), + register_af: lib.func('void rdsparser_register_af(void *rds, callback_af *cb)'), + register_ps: lib.func('void rdsparser_register_ps(void *rds, callback_ps *cb)'), + register_rt: lib.func('void rdsparser_register_rt(void *rds, callback_rt *cb)'), + register_ptyn: lib.func('void rdsparser_register_ptyn(void *rds, callback_ptyn *cb)'), + register_ct: lib.func('void rdsparser_register_ct(void *rds, callback_ct *cb)'), + string_get_content: lib.func(unicode_type + '* rdsparser_string_get_content(void *string)'), + string_get_length: lib.func('uint8_t rdsparser_string_get_length(void *string)'), + ct_get_year: lib.func('uint16_t rdsparser_ct_get_year(void *ct)'), + ct_get_month: lib.func('uint8_t rdsparser_ct_get_month(void *ct)'), + ct_get_day: lib.func('uint8_t rdsparser_ct_get_day(void *ct)'), + ct_get_hour: lib.func('uint8_t rdsparser_ct_get_hour(void *ct)'), + ct_get_minute: lib.func('uint8_t rdsparser_ct_get_minute(void *ct)'), + ct_get_offset: lib.func('int8_t rdsparser_ct_get_offset(void *ct)'), + pty_lookup_short: lib.func('const char* rdsparser_pty_lookup_short(int8_t pty, bool rbds)'), + pty_lookup_long: lib.func('const char* rdsparser_pty_lookup_long(int8_t pty, bool rbds)'), + country_lookup_name: lib.func('const char* rdsparser_country_lookup_name(int country)'), + country_lookup_iso: lib.func('const char* rdsparser_country_lookup_iso(int country)') } const decode_unicode = function(string) @@ -56,41 +71,48 @@ const callbacks = { pi: koffi.register(rds => ( value = rdsparser.get_pi(rds) //console.log('PI: ' + value.toString(16).toUpperCase()) - ), 'callback_pi *'), + ), 'callback_pi*'), pty: koffi.register(rds => ( value = rdsparser.get_pty(rds), dataToSend.pty = value - ), 'callback_pty *'), + ), 'callback_pty*'), tp: koffi.register(rds => ( value = rdsparser.get_tp(rds), dataToSend.tp = value - ), 'callback_tp *'), + ), 'callback_tp*'), ta: koffi.register(rds => ( value = rdsparser.get_ta(rds) //console.log('TA: ' + value) - ), 'callback_ta *'), + ), 'callback_ta*'), ms: koffi.register(rds => ( value = rdsparser.get_ms(rds) //console.log('MS: ' + value) - ), 'callback_ms *'), + ), 'callback_ms*'), af: koffi.register((rds, value) => ( dataToSend.af.push(value) - ), 'callback_af *'), + ), 'callback_af*'), ecc: koffi.register(rds => ( value = rdsparser.get_ecc(rds) - //console.log('ECC: ' + value.toString(16).toUpperCase()) - ), 'callback_ecc *'), + ), 'callback_ecc*'), + + country: koffi.register(rds => ( + value = rdsparser.get_country(rds), + display = rdsparser.country_lookup_name(value), + iso = rdsparser.country_lookup_iso(value), + dataToSend.country_name = display, + dataToSend.country_iso = iso + ), 'callback_country*'), ps: koffi.register(rds => ( value = decode_unicode(rdsparser.get_ps(rds)), dataToSend.ps = value - ), 'callback_ps *'), + ), 'callback_ps*'), rt: koffi.register((rds, flag) => { const value = decode_unicode(rdsparser.get_rt(rds, flag)); @@ -102,14 +124,26 @@ const callbacks = { if (flag === 1) { dataToSend.rt1 = value; } - }, 'callback_rt *'), + }, 'callback_rt*'), ptyn: koffi.register((rds, flag) => ( value = decode_unicode(rdsparser.get_ptyn(rds)) /*console.log('PTYN: ' + value)*/ -), 'callback_ptyn *') -}; + ), 'callback_ptyn*'), + ct: koffi.register((rds, ct) => ( + year = rdsparser.ct_get_year(ct), + month = String(rdsparser.ct_get_month(ct)).padStart(2, '0'), + day = String(rdsparser.ct_get_day(ct)).padStart(2, '0'), + hour = String(rdsparser.ct_get_hour(ct)).padStart(2, '0'), + minute = String(rdsparser.ct_get_minute(ct)).padStart(2, '0'), + offset = rdsparser.ct_get_offset(ct), + tz_sign = (offset >= 0 ? '+' : '-'), + tz_hour = String(Math.abs(Math.floor(offset / 60))).padStart(2, '0'), + tz_minute = String(Math.abs(offset % 60)).padStart(2, '0') + //console.log('CT: ' + year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ' (' + tz_sign + tz_hour + ':' + tz_minute + ')') + ), 'callback_ct*') +}; let rds = rdsparser.new() rdsparser.register_pi(rds, callbacks.pi); @@ -118,10 +152,12 @@ rdsparser.register_tp(rds, callbacks.tp); rdsparser.register_ta(rds, callbacks.ta); rdsparser.register_ms(rds, callbacks.ms); rdsparser.register_ecc(rds, callbacks.ecc); +rdsparser.register_country(rds, callbacks.country); rdsparser.register_af(rds, callbacks.af); rdsparser.register_ps(rds, callbacks.ps); rdsparser.register_rt(rds, callbacks.rt); rdsparser.register_ptyn(rds, callbacks.ptyn); +rdsparser.register_ct(rds, callbacks.ct); const updateInterval = 75; const clientUpdateIntervals = new Map(); // Store update intervals for each client @@ -132,14 +168,15 @@ var dataToSend = { freq: 87.500.toFixed(3), signal: 0, st: false, - rds: '', ps: '', tp: false, pty: 0, af: [], rt0: '', rt1: '', - users: '' + country_name: '', + country_iso: 'UN', + users: '', }; const initialData = { @@ -147,13 +184,14 @@ const initialData = { freq: 87.500.toFixed(3), signal: 0, st: false, - rds: '', ps: '', tp: false, pty: 0, af: [], rt0: '', rt1: '', + country_name: '', + country_iso: 'UN', users: '' }; @@ -217,19 +255,13 @@ function handleData(ws, receivedData) { break; case receivedLine.startsWith('R'): - modifiedData = receivedLine.slice(1, -1).toUpperCase(); - // Ensure modifiedData is exactly 18 characters long - if (modifiedData.length < 18) { - modifiedData = modifiedData.padEnd(18, '0'); // Add zeroes at the end - } else if (modifiedData.length > 18) { - modifiedData = modifiedData.slice(0, 18); // Truncate to 18 characters - } + modifiedData = receivedLine.slice(1); - dataToSend.rds = modifiedData; if (rdsBuffer.length > 1000) { rdsBuffer.shift(); } rdsBuffer.push(modifiedData); + //console.log("\"" + modifiedData + "\","); if (rdsBuffer.length > 1) { handleBuffer(); @@ -247,7 +279,6 @@ function handleData(ws, receivedData) { } function showOnlineUsers(currentUsers) { - console.log(currentUsers); dataToSend.users = currentUsers; initialData.users = currentUsers; } diff --git a/example.js b/example.js index 8336ffe..b6d92f6 100644 --- a/example.js +++ b/example.js @@ -5,27 +5,32 @@ const win32 = (os.platform() == "win32") const unicode_type = (win32 ? 'int16_t' : 'int32_t') const lib = koffi.load(path.join(__dirname, "librdsparser." + (win32 ? "dll" : "so"))); + koffi.proto('void callback_pi(void *rds, void *user_data)'); koffi.proto('void callback_pty(void *rds, void *user_data)'); koffi.proto('void callback_tp(void *rds, void *user_data)'); koffi.proto('void callback_ta(void *rds, void *user_data)'); koffi.proto('void callback_ms(void *rds, void *user_data)'); koffi.proto('void callback_ecc(void *rds, void *user_data)'); +koffi.proto('void callback_country(void *rds, void *user_data)'); koffi.proto('void callback_af(void *rds, uint32_t af, void *user_data)'); koffi.proto('void callback_ps(void *rds, void *user_data)'); koffi.proto('void callback_rt(void *rds, int flag, void *user_data)'); koffi.proto('void callback_ptyn(void *rds, void *user_data)'); +koffi.proto('void callback_ct(void *rds, void *ct, void *user_data)'); const rdsparser = { new: lib.func('void* rdsparser_new()'), free: lib.func('void rdsparser_free(void *rds)'), + clear: lib.func('void rdsparser_clear(void *rds)'), parse_string: lib.func('bool rdsparser_parse_string(void *rds, const char *input)'), get_pi: lib.func('int32_t rdsparser_get_pi(void *rds)'), get_pty: lib.func('int8_t rdsparser_get_pty(void *rds)'), get_tp: lib.func('int8_t rdsparser_get_tp(void *rds)'), get_ta: lib.func('int8_t rdsparser_get_ta(void *rds)'), get_ms: lib.func('int8_t rdsparser_get_ms(void *rds)'), - get_ecc: lib.func('int8_t rdsparser_get_ecc(void *rds)'), + get_ecc: lib.func('int16_t rdsparser_get_ecc(void *rds)'), + get_country: lib.func('int rdsparser_get_country(void *rds)'), get_ps: lib.func('void* rdsparser_get_ps(void *rds)'), get_rt: lib.func('void* rdsparser_get_rt(void *rds, int flag)'), get_ptyn: lib.func('void* rdsparser_get_ptyn(void *rds)'), @@ -35,72 +40,103 @@ const rdsparser = { register_ta: lib.func('void rdsparser_register_ta(void *rds, callback_ta *cb)'), register_ms: lib.func('void rdsparser_register_ms(void *rds, callback_ms *cb)'), register_ecc: lib.func('void rdsparser_register_ecc(void *rds, callback_ecc *cb)'), + register_country: lib.func('void rdsparser_register_country(void *rds, callback_country *cb)'), register_af: lib.func('void rdsparser_register_af(void *rds, callback_af *cb)'), register_ps: lib.func('void rdsparser_register_ps(void *rds, callback_ps *cb)'), register_rt: lib.func('void rdsparser_register_rt(void *rds, callback_rt *cb)'), register_ptyn: lib.func('void rdsparser_register_ptyn(void *rds, callback_ptyn *cb)'), + register_ct: lib.func('void rdsparser_register_ct(void *rds, callback_ct *cb)'), string_get_content: lib.func(unicode_type + '* rdsparser_string_get_content(void *string)'), - string_get_length: lib.func('uint8_t rdsparser_string_get_length(void *string)') + string_get_length: lib.func('uint8_t rdsparser_string_get_length(void *string)'), + ct_get_year: lib.func('uint16_t rdsparser_ct_get_year(void *ct)'), + ct_get_month: lib.func('uint8_t rdsparser_ct_get_month(void *ct)'), + ct_get_day: lib.func('uint8_t rdsparser_ct_get_day(void *ct)'), + ct_get_hour: lib.func('uint8_t rdsparser_ct_get_hour(void *ct)'), + ct_get_minute: lib.func('uint8_t rdsparser_ct_get_minute(void *ct)'), + ct_get_offset: lib.func('int8_t rdsparser_ct_get_offset(void *ct)'), + pty_lookup_short: lib.func('const char* rdsparser_pty_lookup_short(int8_t pty, bool rbds)'), + pty_lookup_long: lib.func('const char* rdsparser_pty_lookup_long(int8_t pty, bool rbds)'), + country_lookup_name: lib.func('const char* rdsparser_country_lookup_name(int country)'), + country_lookup_iso: lib.func('const char* rdsparser_country_lookup_iso(int country)') } -const decode_unicode = function(string) -{ +const decode_unicode = function(string) { let content = rdsparser.string_get_content(string); let length = rdsparser.string_get_length(string); let array = koffi.decode(content, koffi.array(unicode_type, length)); return Buffer.from(array, 'utf-8').toString(); }; -const callbacks = -{ +const callbacks = { pi: koffi.register(rds => ( value = rdsparser.get_pi(rds), console.log('PI: ' + value.toString(16).toUpperCase()) - ), 'callback_pi *'), + ), 'callback_pi*'), pty: koffi.register(rds => ( value = rdsparser.get_pty(rds), - console.log('PTY: ' + value) - ), 'callback_pty *'), + display = rdsparser.pty_lookup_long(value, false), + console.log('PTY: ' + display + ' (' + value + ')') + ), 'callback_pty*'), tp: koffi.register(rds => ( value = rdsparser.get_tp(rds), console.log('TP: ' + value) - ), 'callback_tp *'), + ), 'callback_tp*'), ta: koffi.register(rds => ( value = rdsparser.get_ta(rds), console.log('TA: ' + value) - ), 'callback_ta *'), + ), 'callback_ta*'), ms: koffi.register(rds => ( value = rdsparser.get_ms(rds), console.log('MS: ' + value) - ), 'callback_ms *'), + ), 'callback_ms*'), af: koffi.register((rds, value) => ( console.log('AF: ' + value) - ), 'callback_af *'), + ), 'callback_af*'), ecc: koffi.register(rds => ( value = rdsparser.get_ecc(rds), console.log('ECC: ' + value.toString(16).toUpperCase()) - ), 'callback_ecc *'), + ), 'callback_ecc*'), + + country: koffi.register(rds => ( + value = rdsparser.get_country(rds), + display = rdsparser.country_lookup_name(value), + iso = rdsparser.country_lookup_iso(value), + console.log('Country: ' + display + ' (' + iso + ')') + ), 'callback_country*'), ps: koffi.register(rds => ( value = decode_unicode(rdsparser.get_ps(rds)), console.log('PS: ' + value) - ), 'callback_ps *'), + ), 'callback_ps*'), rt: koffi.register((rds, flag) => ( value = decode_unicode(rdsparser.get_rt(rds, flag)), console.log('RT' + flag + ': ' + value) - ), 'callback_rt *'), + ), 'callback_rt*'), ptyn: koffi.register((rds, flag) => ( value = decode_unicode(rdsparser.get_ptyn(rds)), console.log('PTYN: ' + value) - ), 'callback_ptyn *') + ), 'callback_ptyn*'), + + ct: koffi.register((rds, ct) => ( + year = rdsparser.ct_get_year(ct), + month = String(rdsparser.ct_get_month(ct)).padStart(2, '0'), + day = String(rdsparser.ct_get_day(ct)).padStart(2, '0'), + hour = String(rdsparser.ct_get_hour(ct)).padStart(2, '0'), + minute = String(rdsparser.ct_get_minute(ct)).padStart(2, '0'), + offset = rdsparser.ct_get_offset(ct), + tz_sign = (offset >= 0 ? '+' : '-'), + tz_hour = String(Math.abs(Math.floor(offset / 60))).padStart(2, '0'), + tz_minute = String(Math.abs(offset % 60)).padStart(2, '0'), + console.log('CT: ' + year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ' (' + tz_sign + tz_hour + ':' + tz_minute + ')') + ), 'callback_ct*') } let rds = rdsparser.new() @@ -110,106 +146,134 @@ rdsparser.register_tp(rds, callbacks.tp) rdsparser.register_ta(rds, callbacks.ta) rdsparser.register_ms(rds, callbacks.ms) rdsparser.register_ecc(rds, callbacks.ecc) +rdsparser.register_country(rds, callbacks.country) rdsparser.register_af(rds, callbacks.af) rdsparser.register_ps(rds, callbacks.ps) rdsparser.register_rt(rds, callbacks.rt) rdsparser.register_ptyn(rds, callbacks.ptyn) +rdsparser.register_ct(rds, callbacks.ct) let data = [ - "34DB054A76CD445000", - "34DB25504A757A2000", - "34DB054FE4A42A2000", - "34DB355800004BD700", - "34DB054CA829202A00", - "34DBC5400000000000", - "34DB054976CD4B5200", - "34DB25517A61206300", - "34DB054AE4A4445000", - "34DB25526877696C00", - "34DB054FA8292A2000", - "34DB2553653A204200", - "34DB054C76CD202A00", - "34DB255475646B6100", - "34DB0549E4A44B5200", - "34DB25552053756600", - "34DB054AA829445000", - "34DB25566C65726100", - "34DB054F76CD2A2000", - "34DB2557202D204300", - "34DB054CE4A4202A00", - "34DB25587A61732000", - "34DB0549A8294B5200", - "34DB25594F5F4F7700", - "34DB054A76CD445000", - "34DB255A69750D0D00", - "34DB054FE4A42A2000", - "34DB25405465726100", - "34DB054CA829202A00", - "34DB355800004BD700", - "34DB054976CD4B5200", - "34DBC558301821AF00", - "34DB054AE4A4445000", - "34DB25417A20677200", - "34DB054FA8292A2000", - "34DB2542616D793A00", - "34DB054C76CD202A00", - "34DB254320476F6C00", - "34DB0549E4A44B5200", - "34DB25446563205500", - "34DB054AA829445000", - "34DB25456F726B6900", - "34DB054F76CD2A2000", - "34DB25466573747200", - "34DB054CE4A4202A00", - "34DB254761202D2000", - "34DB0549A8294B5200", - "34DB25484E69652000", - "34DB054A76CD445000", - "34DB25494761732000", - "34DB054FE4A42A2000", - "34DB254A4475636800", - "34DB054CA829202A00", - "34DB254B61200D0D00", - "34DB054976CD4B5200", - "34DB25405465726100", - "34DB054AE4A4445000", - "34DB355800004BD700", - "34DB054FA8292A2000", - "34DBC548301821AF00", - "34DB054C76CD202A00", - "34DB25417A20677200", - "34DB0549E4A44B5200", - "34DB2542616D793A00", - "34DB054AA829445000", - "34DB254320476F6C00", - "34DB054F76CD2A2000", - "34DB25446563205500", - "34DB054CE4A4202A00", - "34DB25456F726B6900", - "34DB0549A8294B5200", - "34DB25466573747200", - "34DB054A76CD445000", - "34DB254761202D2000", - "34DB054FE4A42A2000", - "34DB25484E69652000", - "34DB054CA829202A00", - "34DB25494761732000", - "34DB054976CD4B5200", - "34DB254A4475636800", - "34DB054AE4A4445000", - "34DB254B61200D0D00", - "34DB054FA8292A2000", - "34DB25405465726100", - "34DB054C76CD202A00", - "34DB355800004BD700", - "34DB0549E4A44B5200", - "34DBC548301821AF00", - "34DB054AA829445000", - "34DB25417A20677200", - "34DB054F76CD2A2000", - "34DB2542616D793A00", - "34DBA5505241444900", - "34DBA5514F20372000" + "323305487F1C202001", + "3233054AE5113A3110", + "3233054F7F1C392000", + "32330548767B507400", + "3233054A7F1C792000", + "3233054F767B202010", + "32330548E31150741C", + "323305497F1C616B00", + "3233054A767B792000", + "323305487F1C507405", + "32330549767B616B04", + "3233054AE511792000", + "3233054F7F1C102003", + "323365550000000300", + "32330548E511507400", + "323305497F1C616B01", + "3233054A767B792000", + "3233054FE511202000", + "32330549767B616B00", + "3233054AE511792000", + "3233054F7F1C202014", + "32330548767B507400", + "32330549E511616B00", + "32330548767B507400", + "32330549E511616B00", + "3233054A7F1C792000", + "32333557767B202015", + "32333544E511507431", + "3233054A767B792000", + "3233054FE511202004", + "323305487F1C507404", + "3233434F767B616B10", + "3233054AE511792000", + "3233054F7F1C202000", + "32330548E511426F00", + "323305497F1C6A6100", + "3233054A767B207300", + "3233054FE511696500", + "32330549767B6A6104", + "3233054AE511207300", + "3233054F7F1C696501", + "32330549E5116A6110", + "32334541D754C50010", + "3233054A7F1C207301", + "32330548767B426F00", + "32330549E5116A6104", + "3233054F767B696500", + "32330548E511426F01", + "323305497F1C6A6104", + "3233054A767B207300", + "32330549767B6A6104", + "3233054AE50920730C", + "3233054F7F1C696500", + "32330548767B426F04", + "32330548E511426F10", + "3233054A767B207301", + "3233054FE511696510", + "32330549767B6A6100", + "3233054AE511207300", + "3233054F7F1C696504", + "32330549E5116A6100", + "3233054A7F1C207310", + "3233054F767B696500", + "32330548E511426F00", + "323305497F1C6A6100", + "323365550000000310", + "32330549E511647A04", + "3233054A7F1C696514", + "323325502A2A545206", + "32330548E5116C7510", + "323305497F1C647A00", + "3233054A767B696500", + "3233054FE511202005", + "323305487F1C6C7500", + "32330549767B647A10", + "3233054AE511696500", + "323325522A2A205000", + "32330549767B647A00", + "3233054AE511696510", + "3233054F7F1C202000", + "32330548767B6C7500", + "32330549E511647A00", + "3233054A7F1C696500", + "3233054F767B202001", + "323325546965205205", + "323305497F1C647A00", + "32330548767B6C7511", + "32330549E511647513", + "3233054A7F1C696501", + "3233054F767B202000", + "32330548E5116C7500", + "323305497F1C647A00", + "323325562050726F00", + "3233054FE511202010", + "323305487F1C6C7501", + "32330549767B647A00", + "32330548E511205000", + "323305497F1C6F6C00", + "3233054FE511696510", + "323305487F1C205001", + "323325582054727A00", + "32330549767B6F6C01", + "3233054F7F1C696510", + "32330548767B205000", + "323325596563692001", + "323305487F1C205000", + "32330549767B6F6C00", + "3233054AE511736B00", + "3233255A2020202000", + "3233054F7F1C696504", + "32330549E5116F6C00", + "3233054A7F1C736B05", + "3233255B2020202000", + "3233054F767B696501", + "32330548E511205001", + "323305497F1C6F6C04", + "3233054A767B736B10", + "3233255C2020202000", + "323365550000000300", + "323305497F1C6F6C01" ] for (let group of data) diff --git a/index.js b/index.js index 1c7d575..6a86e3b 100644 --- a/index.js +++ b/index.js @@ -34,7 +34,7 @@ wss.on('connection', (ws, request) => { const clientIp = request.connection.remoteAddress; currentUsers++; dataHandler.showOnlineUsers(currentUsers); - console.log(infoMsg, `WebSocket client connected\nIP: ${clientIp}\nUsers online: ${currentUsers}`); + console.log(infoMsg, `WebSocket client \x1b[32mconnected\x1b[0m (${clientIp}) \x1b[90m[${currentUsers}]`); ws.on('message', (message) => { if(config.verboseMode === true) { @@ -47,7 +47,7 @@ wss.on('connection', (ws, request) => { ws.on('close', (code, reason) => { currentUsers--; dataHandler.showOnlineUsers(currentUsers); - console.log(infoMsg, `WebSocket client disconnected\nIP: ${clientIp}\nCode: ${code} ${reason}\nUsers online: ${currentUsers}`); + console.log(infoMsg, `WebSocket client \x1b[31mdisconnected\x1b[0m (${clientIp}) \x1b[90m[${currentUsers}]`); }); ws.on('error', console.error); diff --git a/librdsparser.dll b/librdsparser.dll index 733a25c7cb61037ad55560c17c2af87ced223605..97f2796c2f7631f48ed285fc7470212c1efe02b0 100644 GIT binary patch delta 26566 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 Sm(hB9mM&xN_HI4KUNHbLR4row diff --git a/librdsparser.so b/librdsparser.so index 48087869e1c4905f2fcbf6d85e9636d441355d97..b7b15d045f717eb270a8ad4f1ca047c8d96f2168 100644 GIT binary patch literal 42328 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 B|AGJj literal 26976 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 diff --git a/userconfig.js b/userconfig.js index 0fde9e0..7291417 100644 --- a/userconfig.js +++ b/userconfig.js @@ -3,10 +3,10 @@ const webServerPort = 8080; // web server port const xdrdServerHost = '192.168.1.15'; // xdrd server iP const xdrdServerPort = 7373; // xdrd server port -const xdrdPassword = 'changeme'; // xdrd password (optional) +const xdrdPassword = 'changememe'; // xdrd password (optional) -const qthLatitude = '0.0'; // your latitude, useful for maps.fmdx.pl integration -const qthLongitude = '0.0'; // your longitude, useful for maps.fmdx.pl integration +const qthLatitude = '50.357935'; // your latitude, useful for maps.fmdx.pl integration +const qthLongitude = '15.924395'; // your longitude, useful for maps.fmdx.pl integration const verboseMode = false; // if true, console will display extra messages diff --git a/web/css/styles.css b/web/css/styles.css index 3ab02f0..932a931 100644 --- a/web/css/styles.css +++ b/web/css/styles.css @@ -1,5 +1,4 @@ @import url('https://fonts.googleapis.com/css2?family=Titillium+Web:ital,wght@0,200;0,300;0,400;0,600;0,700;0,900;1,200;1,300;1,400;1,600;1,700&display=swap'); -@import url('https://fonts.googleapis.com/css2?family=Monomaniac+One&display=swap'); :root { --color-main: #111; @@ -88,10 +87,20 @@ h2 { margin-bottom: 0; } +h3 { + font-size: 22px; +} + .flex-container { display: flex; } +.flex-center { + display: flex; + justify-content: center; + align-items: center; +} + .no-bg { background: transparent !important; } @@ -170,9 +179,8 @@ h2 { } .text-big { - font-size: 72px; + font-size: 60px; font-weight: 300; - /*font-family: "Monomaniac One", sans-serif;*/ } .text-medium { @@ -247,7 +255,7 @@ input[type="text"]:hover { display: flex; } .modal-content { - max-width: 90%; + min-width: 90% !important; margin: auto; } .panel-10, .panel-33, .panel-90 { @@ -261,11 +269,18 @@ input[type="text"]:hover { } .panel-33 h2 { padding: 20px; + padding-top: 5px; + } + .text-medium-big { + font-size: 32px; } .text-big { - font-size: 54px; + font-size: 40px; display: block; - margin-top: -50px; + margin-top: -25px; + } + .text-big#data-ps { + margin: 0; } .panel-100 { width: 90%; @@ -478,8 +493,8 @@ input[type="range"]::-moz-range-thumb { .modal-content { box-sizing: border-box; position: absolute; - top: 50%; - left: 50%; + top: 50vh; + left: 50vw; transform: translate(-50%, -50%); background-color: var(--color-main); padding: 30px; diff --git a/web/index.html b/web/index.html index 1b033b7..f54d358 100644 --- a/web/index.html +++ b/web/index.html @@ -3,6 +3,7 @@ FM-DX Webserver [Noobish's Server] + @@ -15,7 +16,7 @@
-
+
@@ -23,9 +24,12 @@

-

+

TP +
+ +

@@ -114,6 +118,7 @@ +
diff --git a/web/main.js b/web/main.js index d04aa19..1878028 100644 --- a/web/main.js +++ b/web/main.js @@ -193,6 +193,8 @@ function updatePanels(parsedData) { document.querySelector('#data-rt0').innerHTML = parsedData.rt0; document.querySelector('#data-rt1').innerHTML = parsedData.rt1; + document.querySelector('#data-flag').innerHTML = ''; + const signalValue = signalToggle.checked ? (parsedData.signal - 11.75) : parsedData.signal; const integerPart = Math.floor(signalValue); const decimalPart = (signalValue - integerPart).toFixed(1).slice(1); // Adjusted this line diff --git a/web/themes.js b/web/themes.js index 988d9db..5b2e8f8 100644 --- a/web/themes.js +++ b/web/themes.js @@ -22,6 +22,10 @@ const themes = { theme6: { '--color-main': '#21091d', '--color-main-bright': '#ed51d3', + }, + theme7: { + '--color-main': '#111', + '--color-main-bright': '#aaa', } };