diff --git a/server/index.js b/server/index.js index da31ff5..50431ea 100644 --- a/server/index.js +++ b/server/index.js @@ -96,6 +96,7 @@ require('./plugins'); let currentUsers = 0; let serialport; +let timeoutAntenna; app.use(bodyParser.urlencoded({ extended: true })); const sessionMiddleware = session({ @@ -164,7 +165,7 @@ if (serverConfig.xdrd.wirelessConnection === false) { setTimeout(() => { serialport.write('Q0\n'); serialport.write('M0\n'); - serialport.write('Z0\n'); + serialport.write(`Z${serverConfig.antennaStartup}\n`); // Antenna on startup if (serverConfig.defaultFreq && serverConfig.enableDefaultFreq === true) { serialport.write('T' + Math.round(serverConfig.defaultFreq * 1000) + '\n'); @@ -181,7 +182,20 @@ if (serverConfig.xdrd.wirelessConnection === false) { serialport.write('F-1\n'); serialport.write('W0\n'); serverConfig.webserver.rdsMode ? serialport.write('D1\n') : serialport.write('D0\n'); - serialport.write('G00\n'); + // cEQ and iMS combinations + if (serverConfig.ceqStartup === "0" && serverConfig.imsStartup === "0") { + serialport.write("G00\n"); // Both Disabled + } else if (serverConfig.ceqStartup === "1" && serverConfig.imsStartup === "0") { + serialport.write(`G10\n`); + } else if (serverConfig.ceqStartup === "0" && serverConfig.imsStartup === "1") { + serialport.write(`G01\n`); + } else if (serverConfig.ceqStartup === "1" && serverConfig.imsStartup === "1") { + serialport.write("G11\n"); // Both Enabled + } + // Handle stereo mode + if (serverConfig.stereoStartup === "1") { + serialport.write("B1\n"); // Mono + } serverConfig.audio.startupVolume ? serialport.write('Y' + (serverConfig.audio.startupVolume * 100).toFixed(0) + '\n') : serialport.write('Y100\n'); @@ -390,6 +404,8 @@ wss.on('connection', (ws, request) => { currentUsers++; } + if (timeoutAntenna) clearTimeout(timeoutAntenna); + helpers.handleConnect(clientIp, currentUsers, ws, (result) => { if (result === "User banned") { ws.close(1008, 'Banned IP'); @@ -487,8 +503,46 @@ wss.on('connection', (ws, request) => { if (currentUsers === 0) { storage.connectedUsers = []; - output.write('W0\n'); - output.write('B0\n'); + + if (serverConfig.bwAutoNoUsers === "1") { + output.write("W0\n"); // Auto BW 'Enabled' + } + + // cEQ and iMS combinations + if (serverConfig.ceqNoUsers === "1" && serverConfig.imsNoUsers === "1") { + output.write("G00\n"); // Both Disabled + } else if (serverConfig.ceqNoUsers === "1" && serverConfig.imsNoUsers === "0") { + output.write(`G0${dataHandler.dataToSend.ims}\n`); + } else if (serverConfig.ceqNoUsers === "0" && serverConfig.imsNoUsers === "1") { + output.write(`G${dataHandler.dataToSend.eq}0\n`); + } else if (serverConfig.ceqNoUsers === "2" && serverConfig.imsNoUsers === "0") { + output.write(`G1${dataHandler.dataToSend.ims}\n`); + } else if (serverConfig.ceqNoUsers === "0" && serverConfig.imsNoUsers === "2") { + output.write(`G${dataHandler.dataToSend.eq}1\n`); + } else if (serverConfig.ceqNoUsers === "2" && serverConfig.imsNoUsers === "2") { + output.write("G11\n"); // Both Enabled + } + + // Handle stereo mode + if (serverConfig.stereoNoUsers === "1") { + output.write("B0\n"); + } else if (serverConfig.stereoNoUsers === "2") { + output.write("B1\n"); + } + + // Handle Antenna selection + if (timeoutAntenna) clearTimeout(timeoutAntenna); + timeoutAntenna = setTimeout(() => { + if (serverConfig.antennaNoUsers === "1") { + output.write("Z0\n"); + } else if (serverConfig.antennaNoUsers === "2") { + output.write("Z1\n"); + } else if (serverConfig.antennaNoUsers === "3") { + output.write("Z2\n"); + } else if (serverConfig.antennaNoUsers === "4") { + output.write("Z3\n"); + } + }, serverConfig.antennaNoUsersDelay ? 15000 : 0); } if (tunerLockTracker.has(ws)) { diff --git a/server/server_config.js b/server/server_config.js index d47d7f4..5f03398 100644 --- a/server/server_config.js +++ b/server/server_config.js @@ -106,7 +106,18 @@ let serverConfig = { autoShutdown: false, enableDefaultFreq: false, defaultFreq: "87.5", - bwSwitch: false + bwSwitch: false, + bwAutoStartup: "0", + bwAutoNoUsers: "0", + ceqStartup: "0", + ceqNoUsers: "0", + imsStartup: "0", + imsNoUsers: "0", + stereoStartup: "0", + stereoNoUsers: "0", + antennaStartup: "0", + antennaNoUsers: "0", + antennaNoUsersDelay: false }; // Function to add missing fields without overwriting existing values diff --git a/web/setup.ejs b/web/setup.ejs index c1b2e80..3e65604 100644 --- a/web/setup.ejs +++ b/web/setup.ejs @@ -39,6 +39,9 @@
  • User management
  • +
  • + Startup +
  • Extras
  • @@ -218,18 +221,18 @@

    Experimental

    -

    If you use an USB audio card on Linux, enabling this option might fix your audio issues.

    +

    If you use a USB audio card on Linux, enabling this option might fix your audio issues.

    <%- include('_components', {component: 'checkbox', cssClass: '', label: 'ALSA Software mode', id: 'audio-softwareMode'}) %>
    -
    +

    FFmpeg

    Legacy option for Linux / macOS that could resolve audio issues, but will consume additional CPU and RAM usage.

    <%- include('_components', {component: 'checkbox', cssClass: '', label: 'Additional FFmpeg', id: 'audio-ffmpeg'}) %>
    -
    -

    Sample rate Offset

    +
    +

    Sample rate offset

    Using a negative value could eliminate audio buffering issues during long periods of listening.
    However, a value that’s too low might increase the buffer over time.

    @@ -331,7 +334,7 @@ <%- include('_components', {component: 'text', cssClass: 'w-100', placeholder: '0', label: 'RDS Timeout', id: 'webserver-rdsTimeout'}) %>
    -
    +

    Transmitter Search Algorithm

    Different modes may help with more accurate transmitter identification depending on your region.

    <%- include('_components', { component: 'dropdown', id: 'server-tx-id-algo', inputId: 'webserver-txIdAlgorithm', label: 'Transmitter ID Algorithm', cssClass: '', placeholder: 'Algorithm 1', @@ -560,6 +563,126 @@
    +
    +

    Startup settings

    +
    +
    +

    On startup

    +

    Settings take effect on server launch

    +
    + <% if (device === 'tef') { %> + <%- include('_components', { component: 'dropdown', id: 'ceqStartup-dropdown', inputId: 'ceqStartup', label: 'cEQ', cssClass: '', placeholder: 'Disabled', + options: [ + { value: '0', label: 'Disabled' }, + { value: '1', label: 'Enabled' }, + ] + }) %>
    + <%- include('_components', { component: 'dropdown', id: 'imsStartup-dropdown', inputId: 'imsStartup', label: 'iMS', cssClass: '', placeholder: 'Disabled', + options: [ + { value: '0', label: 'Disabled' }, + { value: '1', label: 'Enabled' }, + ] + }) %>
    + <% } else if (device === 'xdr') { %> + <%- include('_components', { component: 'dropdown', id: 'rfStartup-dropdown', inputId: 'ceqStartup', label: 'RF+', cssClass: '', placeholder: 'Disabled', + options: [ + { value: '0', label: 'Disabled' }, + { value: '1', label: 'Enabled' }, + ] + }) %>
    + <%- include('_components', { component: 'dropdown', id: 'ifStartup-dropdown', inputId: 'imsStartup', label: 'IF+', cssClass: '', placeholder: 'Disabled', + options: [ + { value: '0', label: 'Disabled' }, + { value: '1', label: 'Enabled' }, + ] + }) %>
    + <% } %> + <%- include('_components', { component: 'dropdown', id: 'stereoStartup-dropdown', inputId: 'stereoStartup', label: 'Stereo Mode', cssClass: '', placeholder: 'Stereo (Default)', + options: [ + { value: '0', label: 'Stereo (Default)' }, + { value: '1', label: 'Mono' }, + ] + }) %>
    +
    +
    + <%- include('_components', { component: 'dropdown', id: 'antennaStartup-dropdown', inputId: 'antennaStartup', label: 'Antenna', cssClass: '', placeholder: 'Antenna 0 (Default)', + options: [ + { value: '0', label: 'Antenna 0 (Default)' }, + { value: '1', label: 'Antenna 1' }, + { value: '2', label: 'Antenna 2' }, + { value: '3', label: 'Antenna 3' }, + ] + }) %>
    +
    +
    +
    +
    +
    +

    On no active users

    +

    Settings take effect immediately after saving

    +
    + <%- include('_components', { component: 'dropdown', id: 'bwAutoNoUsers-dropdown', inputId: 'bwAutoNoUsers', label: 'Auto BW', cssClass: '', placeholder: 'Unchanged', + options: [ + { value: '0', label: 'Unchanged' }, + { value: '1', label: 'Enabled' }, + ] + }) %>
    + <% if (device === 'tef') { %> + <%- include('_components', { component: 'dropdown', id: 'ceqNoUsers-dropdown', inputId: 'ceqNoUsers', label: 'cEQ', cssClass: '', placeholder: 'Unchanged', + options: [ + { value: '0', label: 'Unchanged' }, + { value: '1', label: 'Disabled' }, + { value: '2', label: 'Enabled' }, + ] + }) %>
    + <%- include('_components', { component: 'dropdown', id: 'imsNoUsers-dropdown', inputId: 'imsNoUsers', label: 'iMS', cssClass: '', placeholder: 'Unchanged', + options: [ + { value: '0', label: 'Unchanged' }, + { value: '1', label: 'Disabled' }, + { value: '2', label: 'Enabled' }, + ] + }) %>
    + <% } else if (device === 'xdr') { %> + <%- include('_components', { component: 'dropdown', id: 'rfNoUsers-dropdown', inputId: 'ceqNoUsers', label: 'RF+', cssClass: '', placeholder: 'Unchanged', + options: [ + { value: '0', label: 'Unchanged' }, + { value: '1', label: 'Disabled' }, + { value: '2', label: 'Enabled' }, + ] + }) %>
    + <%- include('_components', { component: 'dropdown', id: 'ifNoUsers-dropdown', inputId: 'imsNoUsers', label: 'IF+', cssClass: '', placeholder: 'Unchanged', + options: [ + { value: '0', label: 'Unchanged' }, + { value: '1', label: 'Disabled' }, + { value: '2', label: 'Enabled' }, + ] + }) %>
    + <% } %> + <%- include('_components', { component: 'dropdown', id: 'stereoNoUsers-dropdown', inputId: 'stereoNoUsers', label: 'Stereo Mode', cssClass: '', placeholder: 'Unchanged', + options: [ + { value: '0', label: 'Unchanged' }, + { value: '1', label: 'Stereo' }, + { value: '2', label: 'Mono' }, + ] + }) %>
    +
    +
    + <%- include('_components', {component: 'checkbox', cssClass: '', label: 'Delayed Antenna Change', id: 'antennaNoUsersDelay'}) %>
    + <%- include('_components', { component: 'dropdown', id: 'antennaNoUsers-dropdown', inputId: 'antennaNoUsers', label: 'Antenna', cssClass: '', placeholder: 'Unchanged', + options: [ + { value: '0', label: 'Unchanged' }, + { value: '1', label: 'Antenna 0' }, + { value: '2', label: 'Antenna 1' }, + { value: '3', label: 'Antenna 2' }, + { value: '4', label: 'Antenna 3' }, + ] + }) %> +
    +
    +
    +
    +
    +

    Extras