FM-DX WebServer by Noobish, kkonradpl & the OpenRadio community.
+
+ <% if (device == 'tef') { %>
Device: TEF668x
<% } %>
+ <% if (device == 'xdr') { %>
Device: Sony XDR
<% } %>
+ <% if (device == 'sdr') { %>
Device: SDR
<% } %>
[Receiver Map]
diff --git a/web/js/confighandler.js b/web/js/confighandler.js
index a913bdf..53fa957 100644
--- a/web/js/confighandler.js
+++ b/web/js/confighandler.js
@@ -9,7 +9,19 @@ function submitData() {
var themeSelectedValue = $("#selected-theme").val();
var themeDataValue = $(".option:contains('" + themeSelectedValue + "')").attr('data-value') || 'theme1';
const defaultTheme = themeDataValue;
+
+ const bgImage = $("#bg-image").val() || '';
+ const ant1enabled = $('#ant1-enabled').is(":checked") || false;
+ const ant2enabled = $('#ant2-enabled').is(":checked") || false;
+ const ant3enabled = $('#ant3-enabled').is(":checked") || false;
+ const ant4enabled = $('#ant4-enabled').is(":checked") || false;
+
+ const ant1name = $("#ant1-name").val() || 'Ant A';
+ const ant2name = $("#ant2-name").val() || 'Ant B';
+ const ant3name = $("#ant3-name").val() || 'Ant C';
+ const ant4name = $("#ant4-name").val() || 'Ant D';
+
let presets = [];
presets.push($('#preset1').val() || '87.5');
presets.push($('#preset2').val() || '87.5');
@@ -46,6 +58,7 @@ function submitData() {
}).data('value') || "tef");
const softwareMode = $('#audio-software-mode').is(":checked") || false;
+ const startupVolume = $('#startup-volume').val() || '100';
const tunerName = $('#webserver-name').val() || 'FM Tuner';
const tunerDesc = $('#webserver-desc').val() || 'Default FM tuner description';
@@ -61,7 +74,7 @@ function submitData() {
const publicTuner = $("#tuner-public").is(":checked");
const lockToAdmin = $("#tuner-lock").is(":checked");
const autoShutdown = $("#shutdown-tuner").is(":checked") || false;
- const antennaSwitch = $("#antenna-switch").is(":checked") || false;
+ const antennasEnabled = $("#antenna-switch").is(":checked") || false;
const data = {
webserver: {
@@ -73,7 +86,27 @@ function submitData() {
chatEnabled,
defaultTheme,
presets,
- banlist
+ banlist,
+ bgImage
+ },
+ antennas: {
+ enabled: antennasEnabled,
+ ant1: {
+ enabled: ant1enabled,
+ name: ant1name
+ },
+ ant2: {
+ enabled: ant2enabled,
+ name: ant2name
+ },
+ ant3: {
+ enabled: ant3enabled,
+ name: ant3name
+ },
+ ant4: {
+ enabled: ant4enabled,
+ name: ant4name
+ },
},
xdrd: {
comPort,
@@ -87,6 +120,7 @@ function submitData() {
audioChannels,
audioBitrate,
softwareMode,
+ startupVolume,
},
identification: {
tunerName,
@@ -105,7 +139,6 @@ function submitData() {
publicTuner,
lockToAdmin,
autoShutdown,
- antennaSwitch,
enableDefaultFreq,
defaultFreq,
};
@@ -130,7 +163,6 @@ function submitData() {
}
function fetchData() {
- // Make a GET request to retrieve the data.json file
fetch("./getData")
.then(response => {
if (!response.ok) {
@@ -154,6 +186,10 @@ function submitData() {
if (selectedTheme.length > 0) {
$("#selected-theme").val(selectedTheme.text());
}
+
+ if (data.webserver.bgImage && data.webserver.bgImage.length > 0) {
+ $("#bg-image").val(data.webserver.bgImage);
+ }
if(Array.isArray(data.webserver.presets)) {
$('#preset1').val(data.webserver.presets[0] || "");
@@ -204,7 +240,18 @@ function submitData() {
$("#audio-quality").val(selectedQuality.text());
}
+ var antennaNames = ['ant1', 'ant2', 'ant3', 'ant4'];
+
+ // Iterate over each antenna name
+ antennaNames.forEach(function(antenna) {
+ // Set values based on the antenna name
+ $('#' + antenna + '-name').val(data.antennas?.[antenna]?.name || '');
+ $('#' + antenna + '-enabled').prop("checked", data.antennas?.[antenna]?.enabled || false);
+ });
+
$('#audio-software-mode').prop("checked", data.audio.softwareMode || false);
+ $('#startup-volume').val(data.audio.startupVolume || 100);
+ $('#volume-percentage-value').text(data.audio.startupVolume !== undefined ? (data.audio.startupVolume * 100).toFixed(0) + '%' : '100%');
$('#webserver-name').val(data.identification.tunerName);
$('#webserver-desc').val(data.identification.tunerDesc);
@@ -220,7 +267,7 @@ function submitData() {
$("#tuner-public").prop("checked", data.publicTuner);
$("#tuner-lock").prop("checked", data.lockToAdmin);
$("#shutdown-tuner").prop("checked", data.autoShutdown);
- $("#antenna-switch").prop("checked", data.antennaSwitch);
+ $("#antenna-switch").prop("checked", data.antennas?.enabled);
// Check if latitude and longitude are present in the data
if (data.identification.lat && data.identification.lon) {
diff --git a/web/js/dropdown.js b/web/js/dropdown.js
index 77a1779..8a98524 100644
--- a/web/js/dropdown.js
+++ b/web/js/dropdown.js
@@ -19,11 +19,18 @@ const toggleDropdown = (event) => {
const selectOption = (event) => {
const $currentDropdown = currentDropdown;
- if($currentDropdown.attr('id') == 'data-ant') {
- socket.send("Z" + $(event.currentTarget).attr('data-value'));
- tuneTo(getCurrentFreq()); //Reset RDS when change antenna input
- } else {
- $currentDropdown.find('input').val($(event.currentTarget).text());
+ switch($currentDropdown.attr('id')) {
+ case 'data-ant':
+ socket.send("Z" + $(event.currentTarget).attr('data-value'));
+ tuneTo(getCurrentFreq()); //Reset RDS when change antenna input
+ break;
+ case 'data-bw':
+ socket.send("W" + $(event.currentTarget).attr('data-value'));
+ $currentDropdown.find('input').val($(event.currentTarget).text());
+ break;
+ default:
+ $currentDropdown.find('input').val($(event.currentTarget).text());
+ break;
}
// Use setTimeout to delay class removal
diff --git a/web/js/init.js b/web/js/init.js
index a78e234..888a7d0 100644
--- a/web/js/init.js
+++ b/web/js/init.js
@@ -14,6 +14,7 @@ function getInitialSettings() {
localStorage.setItem('preset2', data.presets[1]);
localStorage.setItem('preset3', data.presets[2]);
localStorage.setItem('preset4', data.presets[3]);
+ localStorage.setItem('bgImage', data.bgImage);
},
error: function (error) {
console.error('Error:', error);
diff --git a/web/js/main.js b/web/js/main.js
index 507a108..6e666e5 100644
--- a/web/js/main.js
+++ b/web/js/main.js
@@ -41,7 +41,6 @@ $(document).ready(function () {
$panel.css('left', -panelWidth);
}
});
-
canvas.width = canvas.parentElement.clientWidth;
canvas.height = canvas.parentElement.clientHeight;
@@ -611,6 +610,7 @@ function updateDataElements(parsedData) {
const $dataRt0 = $('#data-rt0');
const $dataRt1 = $('#data-rt1');
const $dataAntInput = $('#data-ant input');
+ const $dataBwInput = $('#data-bw input');
const $dataStationContainer = $('#data-station-container');
const $dataTp = $('.data-tp');
const $dataTa = $('.data-ta');
@@ -641,6 +641,7 @@ function updateDataElements(parsedData) {
$('.data-flag-big').html(``);
$dataAntInput.val($('#data-ant li[data-value="' + parsedData.ant + '"]').text());
+ $dataBwInput.val($('#data-bw li[data-value="' + parsedData.bw + '"]').text());
if (parsedData.txInfo.station.length > 1) {
$('#data-station-name').text(parsedData.txInfo.station.replace(/%/g, '%25'));
diff --git a/web/js/settings.js b/web/js/settings.js
index 7c21a54..279b319 100644
--- a/web/js/settings.js
+++ b/web/js/settings.js
@@ -1,9 +1,9 @@
-var currentDate = new Date('March 21, 2024 22:00:00');
+var currentDate = new Date('March 24, 2024 19:00: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.1.6 [' + formattedDate + ']';
+var currentVersion = 'v1.1.7 [' + formattedDate + ']';
/**
@@ -52,6 +52,7 @@ var currentVersion = 'v1.1.6 [' + formattedDate + ']';
setTheme(selectedTheme);
themeSelector.find('input').val($(event.target).text()); // Set the text of the clicked option to the input
localStorage.setItem('theme', selectedTheme);
+ setBg();
});
// Signal Selector
@@ -156,6 +157,8 @@ var currentVersion = 'v1.1.6 [' + formattedDate + ']';
});
$('.version-string').text(currentVersion);
+
+ setBg();
});
@@ -177,3 +180,10 @@ var currentVersion = 'v1.1.6 [' + formattedDate + ']';
}
}
+ function setBg() {
+ if(localStorage.getItem('bgImage').length > 1 && localStorage.getItem('theme') != 'theme8') {
+ $('body').css('background', 'url(' + localStorage.getItem('bgImage') + ') var(--color-main)');
+ } else {
+ $('body').css('background', 'var(--color-main)');
+ }
+ }
\ No newline at end of file
diff --git a/web/js/setup.js b/web/js/setup.js
index d5cc920..7306fe4 100644
--- a/web/js/setup.js
+++ b/web/js/setup.js
@@ -9,6 +9,13 @@ $(document).ready(function() {
MapCreate();
fetchData();
+ $('#startup-volume').on('change', function() {
+ console.log('changed');
+ var value = $(this).val(); // Get the value of the range input
+ var percentage = value * 100; // Convert to percentage
+ $('#volume-percentage-value').text(percentage.toFixed(0) + '%'); // Display the percentage value
+});
+
map.on('click', function(ev) {
$('#lat').val((ev.latlng.lat).toFixed(6));
$('#lng').val((ev.latlng.lng).toFixed(6));
diff --git a/web/setup.ejs b/web/setup.ejs
index eb661f4..a875be4 100644
--- a/web/setup.ejs
+++ b/web/setup.ejs
@@ -248,38 +248,78 @@
Webserver settings
+
+
+
Background image
+
+
+
+
+
+
+
Themes
+
+
+
+
+
+
Default
+
Cappuccino
+
Nature
+
Ocean
+
Terminal
+
Nightlife
+
Blurple
+
Construction
+
AMOLED
+
+
+
+
+
Antenna options
-
-
-
-
Chat options
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
Themes
-
-
-
-
-
-
Default
-
Cappuccino
-
Nature
-
Ocean
-
Terminal
-
Nightlife
-
Blurple
-
Construction
-
AMOLED
-
@@ -337,13 +377,23 @@
-
Banlist
-
If you have users that don't behave in your chat, you can choose to ban them by their IP address.
- You can see their IP address by hovering over their nickname. One IP per row.
-
-
-
-
+
+
Chat options
+
+
+
+
+
+
+
+
Banlist
+
If you have users that don't behave in your chat, you can choose to ban them by their IP address.
+ You can see their IP address by hovering over their nickname. One IP per row.