const CMD='/data/adb/modules/virtualcam/control.sh'; let lc=0, _ps='', _pp=0, _pf=0; function log(m,t){const e=document.getElementById('console');if(!e)return;const d=new Date();e.innerHTML+=`
'+r.replace(//g,'>')+'':'
No data
'; 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-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'); 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);