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 733a25c..97f2796 100644 Binary files a/librdsparser.dll and b/librdsparser.dll differ diff --git a/librdsparser.so b/librdsparser.so index 4808786..b7b15d0 100644 Binary files a/librdsparser.so and b/librdsparser.so differ 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', } };