Add RTL-SDR mode switcher, DVB-T to Kodi pipeline, FM radio
Mode switcher (rtl_mode_switch.sh) handles exclusive dongle access between DVB-T, FM, SDR scanner, ADS-B, spectrum, and HackRF modes. DVB-T pipeline: RTL-SDR -> GNU Radio demod -> MPEG-TS -> HTTP -> Kodi. Kodi setup script generates M3U playlist for PVR IPTV Simple Client. Includes dvbt_rx.py and sdr_tv.py from dvbt-rx project. WebUI updated with mode switcher, channel selector, and Kodi controls.
This commit is contained in:
@@ -241,6 +241,100 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- RTL Mode Switcher -->
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="dot" id="rtlDot"></span> RTL-SDR Mode</div>
|
||||
<div class="row">
|
||||
<div>
|
||||
<div class="row-label">Active Mode</div>
|
||||
<div class="row-desc">Only one mode can use the dongle at a time</div>
|
||||
</div>
|
||||
<select class="sel" id="rtlMode" onchange="switchRtlMode(this.value)">
|
||||
<option value="off">Off</option>
|
||||
<option value="dvbt">DVB-T (Live TV)</option>
|
||||
<option value="fm">FM Radio</option>
|
||||
<option value="sdr">SDR Scanner (rtl_tcp)</option>
|
||||
<option value="adsb">ADS-B Tracking</option>
|
||||
<option value="spectrum">Spectrum Scan</option>
|
||||
<option value="hackrf">HackRF TX/RX</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div><div class="row-label">Process Status</div></div>
|
||||
<div class="row-value" id="rtlStatus">—</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- DVB-T / Kodi -->
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="dot" id="kodiDot"></span> DVB-T Live TV / Kodi</div>
|
||||
<div class="row">
|
||||
<div>
|
||||
<div class="row-label">DVB-T Frequency</div>
|
||||
<div class="row-desc">Channel center frequency (Hz)</div>
|
||||
</div>
|
||||
<select class="sel" id="dvbtFreq" onchange="setConf('dvbt_freq', this.value)">
|
||||
<option value="474000000">474 MHz (Ch 21)</option>
|
||||
<option value="482000000">482 MHz (Ch 22)</option>
|
||||
<option value="490000000">490 MHz (Ch 23)</option>
|
||||
<option value="498000000">498 MHz (Ch 24)</option>
|
||||
<option value="506000000">506 MHz (Ch 25)</option>
|
||||
<option value="514000000">514 MHz (Ch 26)</option>
|
||||
<option value="522000000">522 MHz (Ch 27)</option>
|
||||
<option value="530000000">530 MHz (Ch 28)</option>
|
||||
<option value="538000000">538 MHz (Ch 29)</option>
|
||||
<option value="546000000">546 MHz (Ch 30)</option>
|
||||
<option value="554000000">554 MHz (Ch 31)</option>
|
||||
<option value="562000000">562 MHz (Ch 32)</option>
|
||||
<option value="570000000">570 MHz (Ch 33)</option>
|
||||
<option value="578000000">578 MHz (Ch 34)</option>
|
||||
<option value="586000000">586 MHz (Ch 35)</option>
|
||||
<option value="594000000">594 MHz (Ch 36)</option>
|
||||
<option value="602000000">602 MHz (Ch 37)</option>
|
||||
<option value="610000000">610 MHz (Ch 38)</option>
|
||||
<option value="618000000">618 MHz (Ch 39)</option>
|
||||
<option value="626000000">626 MHz (Ch 40)</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div>
|
||||
<div class="row-label">Kodi Stream</div>
|
||||
<div class="row-desc">Add to Kodi PVR IPTV Simple Client</div>
|
||||
</div>
|
||||
<div class="row-value" id="kodiUrl">http://127.0.0.1:8554</div>
|
||||
</div>
|
||||
<div class="btn-row">
|
||||
<button class="btn" onclick="exec('sh /data/adb/modules/driver-manager/scripts/kodi_dvbt_setup.sh setup'); log('Kodi DVB-T setup started')">Setup Kodi</button>
|
||||
<button class="btn" onclick="exec('sh /data/adb/modules/driver-manager/scripts/kodi_dvbt_setup.sh scan'); log('Channel scan started')">Scan Channels</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- FM Radio -->
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="dot" id="fmDot"></span> FM Radio</div>
|
||||
<div class="row">
|
||||
<div>
|
||||
<div class="row-label">Frequency (MHz)</div>
|
||||
<div class="row-desc">FM broadcast frequency</div>
|
||||
</div>
|
||||
<select class="sel" id="fmFreq" onchange="setConf('fm_freq', this.value)">
|
||||
<option value="88100000">88.1</option>
|
||||
<option value="89900000">89.9</option>
|
||||
<option value="91500000">91.5</option>
|
||||
<option value="93100000">93.1</option>
|
||||
<option value="95500000">95.5</option>
|
||||
<option value="97100000">97.1</option>
|
||||
<option value="98500000">98.5</option>
|
||||
<option value="100000000">100.0</option>
|
||||
<option value="101500000">101.5</option>
|
||||
<option value="103100000">103.1</option>
|
||||
<option value="104700000">104.7</option>
|
||||
<option value="106300000">106.3</option>
|
||||
<option value="107900000">107.9</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Game Controllers -->
|
||||
<div class="card">
|
||||
<div class="card-title"><span class="dot" id="padDot"></span> Game Controllers</div>
|
||||
@@ -301,6 +395,42 @@
|
||||
catch (e) { return ''; }
|
||||
}
|
||||
|
||||
async function switchRtlMode(mode) {
|
||||
log('Switching RTL mode to: ' + mode);
|
||||
await exec('sh ' + MODDIR + '/scripts/rtl_mode_switch.sh ' + mode);
|
||||
log('RTL mode switched to: ' + mode);
|
||||
await loadRtlStatus();
|
||||
}
|
||||
|
||||
async function setConf(file, value) {
|
||||
await exec('echo "' + value + '" > ' + MODDIR + '/config/' + file);
|
||||
log('Set ' + file + ' = ' + value);
|
||||
}
|
||||
|
||||
async function loadRtlStatus() {
|
||||
const mode = (await exec('cat ' + MODDIR + '/config/rtl_mode 2>/dev/null')).stdout.trim();
|
||||
if (mode) document.getElementById('rtlMode').value = mode;
|
||||
|
||||
const status = (await exec('sh ' + MODDIR + '/scripts/rtl_mode_switch.sh status 2>/dev/null')).stdout.trim();
|
||||
document.getElementById('rtlStatus').textContent = status || 'off';
|
||||
|
||||
const dot = document.getElementById('rtlDot');
|
||||
dot.className = 'dot' + (mode && mode !== 'off' ? '' : ' off');
|
||||
|
||||
const kodiDot = document.getElementById('kodiDot');
|
||||
kodiDot.className = 'dot' + (mode === 'dvbt' ? '' : ' off');
|
||||
|
||||
const fmDot = document.getElementById('fmDot');
|
||||
fmDot.className = 'dot' + (mode === 'fm' ? '' : ' off');
|
||||
|
||||
// Load saved frequencies
|
||||
const dvbtFreq = (await exec('cat ' + MODDIR + '/config/dvbt_freq 2>/dev/null')).stdout.trim();
|
||||
if (dvbtFreq) document.getElementById('dvbtFreq').value = dvbtFreq;
|
||||
|
||||
const fmFreq = (await exec('cat ' + MODDIR + '/config/fm_freq 2>/dev/null')).stdout.trim();
|
||||
if (fmFreq) document.getElementById('fmFreq').value = fmFreq;
|
||||
}
|
||||
|
||||
async function setMode(file, value) {
|
||||
log('Setting ' + file + ' = ' + value);
|
||||
await exec('echo "' + value + '" > ' + MODDIR + '/config/' + file);
|
||||
@@ -388,6 +518,7 @@
|
||||
await loadWifiInfo();
|
||||
await loadSdrInfo();
|
||||
await loadControllerInfo();
|
||||
await loadRtlStatus();
|
||||
log('Done');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user