First decent version of the module
This commit is contained in:
+13
-24
@@ -4,45 +4,34 @@ function log(m,t){const e=document.getElementById('console');if(!e)return;const
|
||||
function run(a){try{ksu.exec(CMD+' '+a);log(a+' OK','ok')}catch(e){log(a+' error: '+e.message,'err')}updateDash()}
|
||||
function updateDash(){try{
|
||||
const r=typeof ksu!=='undefined'?ksu.exec(CMD+' status'):null;
|
||||
if(!r||typeof r!=='string'){document.getElementById('status-dash').innerHTML='<div class="stat" style="grid-column:1/3;color:#f85149">No data</div>';return}
|
||||
if(!r||typeof r!=='string'){document.getElementById('status-dash').innerHTML='<div style="grid-column:1/3;color:#f85149;text-align:center;padding:12px">No data</div>';return}
|
||||
const s=JSON.parse(r);
|
||||
const d=document.getElementById('status-dash');if(!d)return;
|
||||
const sc=s.status==='active'?'green':(s.status==='partial'?'yellow':'red');
|
||||
const st=s.status==='active'?'ACTIVE':(s.status==='partial'?'PARTIAL':'STOPPED');
|
||||
let v=[];
|
||||
if(s.camera2_level) v=[['camera2','green',s.camera2_level],['Checks',s.checks&&s.checks.includes('provider_ok')?'green':'red',s.checks||'?']];
|
||||
d.innerHTML=[['Status',sc,st],['Provider',s.provider_pid>0?'green':'red',s.provider_pid>0?'PID '+s.provider_pid:'Stopped'],['Feeder',s.feeder_pid>0?'green':'red',s.feeder_pid>0?'PID '+s.feeder_pid:'Stopped'],['Service',s.service_registered==1?'green':'red',s.service_registered==1?'Registered':'Missing'],['v4l2',s.v4l2_loaded==1?'green':'red',s.v4l2_loaded==1?'Loaded':'Missing'],['Device','yellow',s.video0||'N/A'],...v].map(i=>`<div class="stat"><span class="l">${i[0]}</span><span class="v ${i[1]}">${i[2]}</span></div>`).join('');
|
||||
document.getElementById('subtitle').textContent=s.status==='active'?'Feeding video to /dev/video0':'Physical cameras NOT replaced';
|
||||
const colorMap={active:'green',partial:'yellow',stopped:'red',idle:'red'};
|
||||
const sc=colorMap[s.status]||'yellow';
|
||||
const st=s.status.toUpperCase();
|
||||
d.innerHTML=[['Status',sc,st],['Provider',s.provider_pid>0?'green':'red',s.provider_pid>0?'PID '+s.provider_pid:'Stopped'],['Feeder',s.feeder_pid>0?'green':'red',s.feeder_pid>0?'PID '+s.feeder_pid:'Stopped'],['Service',s.service_registered==1?'green':'red',s.service_registered==1?'Registered':'Missing'],['v4l2',s.v4l2_loaded==1?'green':'red',s.v4l2_loaded==1?'Loaded':'Missing'],['Device','yellow',s.video0||'N/A']].map(i=>`<div class="stat"><span class="l">${i[0]}</span><span class="v ${i[1]}">${i[2]}</span></div>`).join('');
|
||||
document.getElementById('subtitle').textContent=s.status==='active'?'Physical cameras replaced':s.status==='partial'?'Starting up...':'Not running';
|
||||
// Toggle buttons based on state
|
||||
document.getElementById('btn-start').style.display=s.provider_pid>0?'none':'block';
|
||||
document.getElementById('btn-stop').style.display=s.provider_pid>0?'block':'none';
|
||||
document.getElementById('btn-restart').style.display=s.provider_pid>0?'block':'none';
|
||||
document.getElementById('btn-feed').style.display=s.feeder_pid>0?'none':'block';
|
||||
document.getElementById('btn-unfeed').style.display=s.feeder_pid>0?'block':'none';
|
||||
if(s.status!==_ps||s.provider_pid!==_pp||s.feeder_pid!==_pf){_ps=s.status;_pp=s.provider_pid;_pf=s.feeder_pid;log('Status: '+st+' pid='+s.provider_pid+' feeder='+s.feeder_pid,'ok')}
|
||||
}catch(e){log('Dash error: '+e.message,'err')}}
|
||||
function loadDeviceInfo(){try{
|
||||
const r=ksu.exec(CMD+' device_info');
|
||||
document.getElementById('device-info').innerHTML=r?'<pre style="background:#0d1117;border:1px solid #30363d;border-radius:4px;padding:8px;font-size:10px;overflow-x:auto;white-space:pre-wrap">'+r.replace(/</g,'<').replace(/>/g,'>')+'</pre>':'<p class="muted">No data</p>';
|
||||
log('Device info loaded','ok');
|
||||
}catch(e){log('DevInfo error: '+e.message,'err')}}
|
||||
document.getElementById('btn-start')?.addEventListener('click',()=>run('start'));
|
||||
document.getElementById('btn-stop')?.addEventListener('click',()=>run('stop'));
|
||||
document.getElementById('btn-restart')?.addEventListener('click',()=>run('restart'));
|
||||
document.getElementById('btn-feed')?.addEventListener('click',()=>run('start_feeder'));
|
||||
document.getElementById('btn-unfeed')?.addEventListener('click',()=>run('stop_feeder'));
|
||||
document.getElementById('btn-refresh')?.addEventListener('click',updateDash);
|
||||
document.getElementById('btn-save')?.addEventListener('click',()=>{
|
||||
const src=document.querySelector('.src-btn.active')?.dataset.src||'mp4';
|
||||
const json=JSON.stringify({source_type:src,rtsp_url:document.getElementById('rtsp-url').value,mp4_path:document.getElementById('mp4-path').value,res_w:parseInt(document.getElementById('res-w').value)||1920,res_h:parseInt(document.getElementById('res-h').value)||1080,fps:parseInt(document.getElementById('fps').value)||30,rotation:parseInt(document.getElementById('rotation').value)||0});
|
||||
ksu.exec("echo '"+json+"' > /data/local/tmp/virtualcam_config.json");
|
||||
log('Config saved','ok');
|
||||
});
|
||||
document.getElementById('btn-refresh')?.addEventListener('click',updateDash);
|
||||
document.getElementById('btn-deviceinfo')?.addEventListener('click',loadDeviceInfo);
|
||||
document.querySelectorAll('.src-btn').forEach(b=>b.addEventListener('click',()=>{
|
||||
document.querySelectorAll('.src-btn').forEach(x=>x.classList.remove('active'));
|
||||
b.classList.add('active');
|
||||
document.getElementById('rtsp-config').classList.toggle('hidden',b.dataset.src!=='rtsp');
|
||||
document.getElementById('mp4-config').classList.toggle('hidden',b.dataset.src!=='mp4');
|
||||
}));
|
||||
updateDash();
|
||||
setInterval(updateDash,5000);
|
||||
document.getElementById('btn-refresh')?.addEventListener('click',updateDash);
|
||||
document.getElementById('btn-deviceinfo')?.addEventListener('click',loadDeviceInfo);
|
||||
document.querySelectorAll('.src-btn').forEach(b=>b.addEventListener('click',()=>{
|
||||
document.querySelectorAll('.src-btn').forEach(x=>x.classList.remove('active'));
|
||||
b.classList.add('active');
|
||||
|
||||
Reference in New Issue
Block a user