From 51121132d59f90c2632b7ea37ae546f78455daf8 Mon Sep 17 00:00:00 2001 From: NoobishSVK Date: Thu, 12 Sep 2024 21:30:12 +0200 Subject: [PATCH] bugfixes & plugins WS & UI fixes --- package.json | 2 +- server/datahandler.js | 9 +++++-- server/index.js | 48 ++++++++++++++++++------------------ server/tx_search.js | 55 +++++++++++++++++++++++++++++++----------- web/css/buttons.css | 4 +++ web/favicon.png | Bin 6567 -> 6048 bytes web/index.ejs | 9 ++++--- web/js/init.js | 4 +-- web/js/main.js | 3 ++- web/js/setup.js | 31 +----------------------- web/setup.ejs | 9 ++++--- web/wizard.ejs | 32 +++++++++++++----------- 12 files changed, 111 insertions(+), 95 deletions(-) diff --git a/package.json b/package.json index 23b6555..06f3245 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fm-dx-webserver", - "version": "1.2.8", + "version": "1.2.8.1", "description": "FM DX Webserver", "main": "index.js", "scripts": { diff --git a/server/datahandler.js b/server/datahandler.js index 6bfbf91..a9c0855 100644 --- a/server/datahandler.js +++ b/server/datahandler.js @@ -234,7 +234,9 @@ var dataToSend = { itu: '', dist: '', azi: '', - id: '' + id: '', + reg: '', + pi: '', }, country_name: '', country_iso: 'UN', @@ -294,6 +296,7 @@ function handleData(wss, receivedData, rdsWss) { initialData.freq = (parsedValue / 1000).toFixed(3); dataToSend.freq = (parsedValue / 1000).toFixed(3); dataToSend.pi = '?'; + dataToSend.txInfo.reg = false; rdsWss.clients.forEach((client) => { client.send("G:\r\nRESET-------\r\n\r\n"); @@ -401,7 +404,9 @@ function handleData(wss, receivedData, rdsWss) { itu: currentTx.itu, dist: currentTx.distance, azi: currentTx.azimuth, - id: currentTx.id + id: currentTx.id, + pi: currentTx.pi, + reg: currentTx.reg } } diff --git a/server/index.js b/server/index.js index 936126a..9438ed4 100644 --- a/server/index.js +++ b/server/index.js @@ -1,6 +1,3 @@ -// index.js - Mod by Highpoint -// Version for loading server-side plugins - // Library imports const express = require('express'); const endpoints = require('./endpoints'); @@ -15,7 +12,7 @@ const WebSocket = require('ws'); const wss = new WebSocket.Server({ noServer: true }); const chatWss = new WebSocket.Server({ noServer: true }); const rdsWss = new WebSocket.Server({ noServer: true }); -const ExtraWss = new WebSocket.Server({ noServer: true }); +const pluginsWss = new WebSocket.Server({ noServer: true }); const fs = require('fs'); const path = require('path'); const net = require('net'); @@ -537,14 +534,14 @@ rdsWss.on('connection', (ws, request) => { }); //additional web socket for using plugins -ExtraWss.on('connection', (ws, request) => { +pluginsWss.on('connection', (ws, request) => { ws.on('message', message => { const messageData = JSON.parse(message); const modifiedMessage = JSON.stringify(messageData); //Broadcast the message to all other clients - ExtraWss.clients.forEach(client => { + pluginsWss.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(modifiedMessage); // Send the message to all clients } @@ -582,10 +579,10 @@ httpServer.on('upgrade', (request, socket, head) => { rdsWss.emit('connection', ws, request); }); }); - } else if (request.url === '/extra') { + } else if (request.url === '/data_plugins') { sessionMiddleware(request, {}, () => { - ExtraWss.handleUpgrade(request, socket, head, (ws) => { - ExtraWss.emit('connection', ws, request); + pluginsWss.handleUpgrade(request, socket, head, (ws) => { + pluginsWss.emit('connection', ws, request); }); }); } else { @@ -599,25 +596,28 @@ app.use(express.static(path.join(__dirname, '../web'))); // Serve the entire web checkIPv6Support((isIPv6Supported) => { const ipv4Address = serverConfig.webserver.webserverIp === '0.0.0.0' ? 'localhost' : serverConfig.webserver.webserverIp; const ipv6Address = '::'; // This will bind to all available IPv6 interfaces - - if (isIPv6Supported) { - // Start server on both IPv4 and IPv6 addresses - httpServer.listen(serverConfig.webserver.webserverPort, ipv4Address, () => { - logInfo(`Web server has started on address \x1b[34mhttp://${ipv4Address}:${serverConfig.webserver.webserverPort}\x1b[0m.`); - }); + const port = serverConfig.webserver.webserverPort; - httpServer.listen(serverConfig.webserver.webserverPort, ipv6Address, () => { - logInfo(`Web server has started on address \x1b[34mhttp://[${ipv6Address}]:${serverConfig.webserver.webserverPort}\x1b[0m.`); - }); - } else { - // Start server only on IPv4 address - httpServer.listen(serverConfig.webserver.webserverPort, ipv4Address, () => { - if (configExists()) { - logInfo(`Web server has started on address \x1b[34mhttp://${ipv4Address}:${serverConfig.webserver.webserverPort}\x1b[0m.`); + const logServerStart = (address, isIPv6) => { + const formattedAddress = isIPv6 ? `[${address}]` : address; + logInfo(`Web server has started on address \x1b[34mhttp://${formattedAddress}:${port}\x1b[0m.`); + }; + + const startServer = (address, isIPv6) => { + httpServer.listen(port, address, () => { + if (!isIPv6 && !configExists()) { + logInfo(`Open your browser and proceed to \x1b[34mhttp://${address}:${port}\x1b[0m to continue with setup.`); } else { - logInfo(`Open your browser and proceed to \x1b[34mhttp://${ipv4Address}:${serverConfig.webserver.webserverPort}\x1b[0m to continue with setup.`); + logServerStart(address, isIPv6); } }); + }; + + if (isIPv6Supported) { + startServer(ipv4Address, false); // Start on IPv4 + startServer(ipv6Address, true); // Start on IPv6 + } else { + startServer(ipv4Address, false); // Start only on IPv4 } }); diff --git a/server/tx_search.js b/server/tx_search.js index c03f872..c39c1aa 100644 --- a/server/tx_search.js +++ b/server/tx_search.js @@ -50,42 +50,69 @@ function processData(data, piCode, rdsPs) { let txAzimuth; let maxDistance; let esMode = checkEs(); + let detectedByPireg = false; // To track if the station was found by pireg + // Helper function to calculate score and update matching station/city + function evaluateStation(station, city, distance) { + let weightDistance = distance.distanceKm; + if (esMode && distance.distanceKm > 500) { + weightDistance = Math.abs(distance.distanceKm - 1500); + } + let erp = station.erp && station.erp > 0 ? station.erp : 1; + const score = (10 * Math.log10(erp * 1000)) / weightDistance; // Calculate score + if (score > maxScore) { + maxScore = score; + txAzimuth = distance.azimuth; + matchingStation = station; + matchingCity = city; + maxDistance = distance.distanceKm; + } + } + + // First attempt: Try to match station using the piCode for (const cityId in data.locations) { const city = data.locations[cityId]; if (city.stations) { for (const station of city.stations) { if (station.pi === piCode.toUpperCase() && !station.extra && station.ps && station.ps.toLowerCase().includes(rdsPs.replace(/ /g, '_').replace(/^_*(.*?)_*$/, '$1').toLowerCase())) { const distance = haversine(serverConfig.identification.lat, serverConfig.identification.lon, city.lat, city.lon); - let weightDistance = distance.distanceKm - if (esMode && (distance.distanceKm > 500)) { - weightDistance = Math.abs(distance.distanceKm-1500); - } - let erp = (station.erp && station.erp > 0) ? station.erp : 1; - const score = (10*Math.log10(erp*1000)) / weightDistance; // Calculate score - if (score > maxScore) { - maxScore = score; - txAzimuth = distance.azimuth; - matchingStation = station; - matchingCity = city; - maxDistance = distance.distanceKm; + evaluateStation(station, city, distance); + detectedByPireg = false; // Detected by pi, not pireg + } + } + } + } + + // If no matching station is found, fallback to pireg + if (!matchingStation) { + for (const cityId in data.locations) { + const city = data.locations[cityId]; + if (city.stations) { + for (const station of city.stations) { + if (station.pireg && station.pireg.toUpperCase() === piCode.toUpperCase() && !station.extra && station.ps && station.ps.toLowerCase().includes(rdsPs.replace(/ /g, '_').replace(/^_*(.*?)_*$/, '$1').toLowerCase())) { + const distance = haversine(serverConfig.identification.lat, serverConfig.identification.lon, city.lat, city.lon); + evaluateStation(station, city, distance); + detectedByPireg = true; // Detected by pireg } } } } } + // Return the results if a station was found, otherwise return undefined if (matchingStation) { return { station: matchingStation.station.replace("R.", "Radio "), pol: matchingStation.pol.toUpperCase(), - erp: (matchingStation.erp && matchingStation.erp > 0) ? matchingStation.erp : '?', + erp: matchingStation.erp && matchingStation.erp > 0 ? matchingStation.erp : '?', city: matchingCity.name, itu: matchingCity.itu, distance: maxDistance.toFixed(0), azimuth: txAzimuth.toFixed(0), id: matchingStation.id, - foundStation: true + pi: matchingStation.pi, + foundStation: true, + reg: detectedByPireg // Indicates if it was detected by pireg }; } else { return; diff --git a/web/css/buttons.css b/web/css/buttons.css index cf9abfe..bb7dcfc 100644 --- a/web/css/buttons.css +++ b/web/css/buttons.css @@ -82,6 +82,10 @@ input[type="text"], textarea, input[type="password"] { caret-color: var(--color-4); } +input[type="password"]:not(#xdrd-password) { + border-radius: 15px 0 0 15px; +} + #tune-buttons input[type="text"] { width: 50%; height: 48px; diff --git a/web/favicon.png b/web/favicon.png index 5d3c0930cd0148e13cc0c17f820ab57e30ac3b9b..0e104c3f04ba312b251ae52d774ac448895b6c63 100644 GIT binary patch delta 6001 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 YzxYQaJ2pl$FfcH9y85}Sb4q9e0JxA=H2?qr delta 6524 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 C#7R>C diff --git a/web/index.ejs b/web/index.ejs index 82236da..43422b6 100644 --- a/web/index.ejs +++ b/web/index.ejs @@ -93,6 +93,9 @@

PI CODE

+
+   +
@@ -261,7 +264,7 @@ [] - kW [] km ° + kW [] km
@@ -395,7 +398,7 @@ <% } else { %>
-
@@ -436,7 +439,7 @@

FM-DX Webserver

-

by Noobish, kkonradpl & the OpenRadio community.

+

by FMDX.org

[Receiver Map]

diff --git a/web/js/init.js b/web/js/init.js index 8bc967f..6c3ef96 100644 --- a/web/js/init.js +++ b/web/js/init.js @@ -1,9 +1,9 @@ -var currentDate = new Date('Sep 11, 2024 23:50:00'); +var currentDate = new Date('Sep 12, 2024 21:30:00'); var day = currentDate.getDate(); var month = currentDate.getMonth() + 1; // Months are zero-indexed, so add 1 var year = currentDate.getFullYear(); var formattedDate = day + '/' + month + '/' + year; -var currentVersion = 'v1.2.8 [' + formattedDate + ']'; +var currentVersion = 'v1.2.8.1 [' + formattedDate + ']'; getInitialSettings(); removeUrlParameters(); // Call this function to remove URL parameters diff --git a/web/js/main.js b/web/js/main.js index 27d684b..ae7ee2b 100644 --- a/web/js/main.js +++ b/web/js/main.js @@ -827,7 +827,8 @@ const updateDataElements = throttle(function(parsedData) { updateTextIfChanged($('#data-station-itu'), parsedData.txInfo.itu); updateTextIfChanged($('#data-station-pol'), parsedData.txInfo.pol); updateTextIfChanged($('#data-station-distance'), parsedData.txInfo.dist); - updateTextIfChanged($('#data-station-azimuth'), parsedData.txInfo.azi); + updateHtmlIfChanged($('#data-station-azimuth'), parsedData.txInfo.azi + '°'); + updateHtmlIfChanged($('#data-regular-pi'), parsedData.txInfo.reg === true ? parsedData.txInfo.pi : ' '); $dataStationContainer.css('display', 'block'); } else { $dataStationContainer.removeAttr('style'); diff --git a/web/js/setup.js b/web/js/setup.js index 020454b..0386936 100644 --- a/web/js/setup.js +++ b/web/js/setup.js @@ -64,37 +64,8 @@ $(document).ready(function() { $('#tuner-wireless').hide(); $('#tuner-usb').show(); } -}); - - $('#login-form').submit(function (event) { - event.preventDefault(); - - // Perform an AJAX request to the /login endpoint - $.ajax({ - type: 'POST', - url: './login', - data: $(this).serialize(), - success: function (data) { - // Update the content on the page with the message from the response - $('#login-message').text(data.message); - setTimeout(function () { - location.reload(true); - }, 1750); - }, - error: function (xhr, status, error) { - // Handle error response - if (xhr.status === 403) { - // Update the content on the page with the message from the error response - $('#login-message').text(xhr.responseJSON.message); - } else { - // Handle other types of errors if needed - console.error('Error:', status, error); - } - } - }); - }); +}); - // Assuming you have an anchor tag with id 'logout-link' $('.logout-link').click(function (event) { event.preventDefault(); diff --git a/web/setup.ejs b/web/setup.ejs index e6a7010..59c1d32 100644 --- a/web/setup.ejs +++ b/web/setup.ejs @@ -20,7 +20,6 @@

[ADMIN PANEL]

-
+ diff --git a/web/wizard.ejs b/web/wizard.ejs index 6bc46a0..0b35d71 100644 --- a/web/wizard.ejs +++ b/web/wizard.ejs @@ -39,11 +39,11 @@

Leave the IP at 0.0.0.0 unless you explicitly know you have to change it.
Don't enter your public IP here.

- +
- +
@@ -56,7 +56,7 @@

Tuner type:

Settings a proper device type ensures that the correct interface and settings will load.

- +