958 lines
32 KiB
HTML
Executable File
958 lines
32 KiB
HTML
Executable File
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title id="webtitle"></title>
|
|
<link href="css/styles.css" rel="stylesheet" media="screen">
|
|
<script src="js/auth.js"></script>
|
|
<script src="js/jquery.js"></script>
|
|
<script src="js/dashboard.js"></script>
|
|
<script>
|
|
var time_sec_cnt=0;
|
|
var g_remot_local_ctrl = 3; //0 remote 1 local
|
|
var g_old_power = 0;
|
|
var g_old_power_p0 = 0;
|
|
var g_old_power_p1 = 0;
|
|
var g_old_power_p2 = 0;
|
|
var g_old_freq_channel = -1;
|
|
var g_rx_freq=0;
|
|
var wait_freq_flg = 0;
|
|
var g_rx_freq_countdown_active = false; // Flag to prevent rx_freq update during countdown
|
|
var arry_sign = [1, -1];
|
|
var arry_p = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95];
|
|
var lastTime = new Date().getTime();
|
|
var currentTime = new Date().getTime();
|
|
var timeOut = 20 * 60 * 1000; // 20 min timeout
|
|
|
|
$(function(){
|
|
// Listen to multiple types of user activity to prevent timeout
|
|
$(document).on('mousemove keydown click scroll touchstart', function(){
|
|
lastTime = new Date().getTime();
|
|
});
|
|
});
|
|
|
|
function testTime(){
|
|
currentTime = new Date().getTime();
|
|
if(currentTime - lastTime > timeOut){
|
|
window.location.href="login.cgi?logout=1"
|
|
}
|
|
|
|
time_sec_cnt=time_sec_cnt+1;
|
|
if(time_sec_cnt%3==0){
|
|
get_remote_local_ctrl();
|
|
if(g_remot_local_ctrl==1) { // local
|
|
SetFormDefaults();
|
|
}
|
|
refreshDashboard();
|
|
}
|
|
}
|
|
|
|
// Timer check
|
|
window.setInterval(testTime, 1000);
|
|
|
|
function get_remote_local_ctrl() {
|
|
var queryData = "sys_cfg=&";
|
|
$.get("atsc_status_cfg.cgi?"+queryData, function(data, status) {
|
|
// Handle case where data is a JSON object (e.g., session expired)
|
|
if (typeof data === 'object' && data !== null) {
|
|
if (data.error === 'session_expired' && data.redirect) {
|
|
window.location.href = data.redirect;
|
|
return;
|
|
}
|
|
console.error('Received JSON error response:', data);
|
|
return;
|
|
}
|
|
|
|
var table = data.split("|");
|
|
g_remot_local_ctrl = Number(table[0].split("#")[5]);
|
|
document.title = table[0].split("#")[11];
|
|
});
|
|
}
|
|
|
|
function cmd_confirm() {
|
|
return confirm("Please choose to confirm or cancel!");
|
|
}
|
|
|
|
function SetFormDefaults() {
|
|
// 1. DISABLE BUTTONS START (only in Remote mode)
|
|
if(g_remot_local_ctrl == 1) {
|
|
// Local mode: just fetch data, don't change button
|
|
var queryData = "sys_rf=&web_title=&";
|
|
} else {
|
|
// Remote mode: show LOADING indicator
|
|
$('#rf_form input[type="button"]').attr("disabled", true).val("LOADING...");
|
|
var queryData = "sys_rf=&web_title=&";
|
|
}
|
|
|
|
$.get("atsc_status_cfg.cgi?"+queryData, function(data, status) {
|
|
// Handle case where data is a JSON object (e.g., session expired)
|
|
if (typeof data === 'object' && data !== null) {
|
|
if (data.error === 'session_expired' && data.redirect) {
|
|
window.location.href = data.redirect;
|
|
return;
|
|
}
|
|
console.error('Received JSON error response:', data);
|
|
return;
|
|
}
|
|
|
|
var table = data.split("|");
|
|
var rfpara= table[0].split("#");
|
|
var title = table[1].split("#");
|
|
var cf = document.getElementById("rf_form");
|
|
|
|
g_old_power_p0 = Number(rfpara[1]);
|
|
g_old_power_p1 = Number(rfpara[2]);
|
|
g_old_power_p2 = Number(rfpara[3]);
|
|
|
|
cf.pw0.value = Number(rfpara[1]);
|
|
cf.pw1.value = Number(rfpara[2]);
|
|
cf.pw2.value = Number(rfpara[3]);
|
|
cf.rfy.value = Number(rfpara[4]);
|
|
cf.agc.value = Number(rfpara[5]);
|
|
|
|
var tmp = Number(rfpara[6]);
|
|
cf.tx.value = Number(rfpara[7]);
|
|
cf.freq6m.value = Number(rfpara[8]);
|
|
|
|
// Only update rx_freq if not in countdown mode (to prevent jumping back to old value)
|
|
if (!g_rx_freq_countdown_active) {
|
|
cf.rx_freq.value = Number(rfpara[9]);
|
|
g_rx_freq = Number(rfpara[9]);
|
|
}
|
|
|
|
// 2. RE-ENABLE BUTTONS END (only in Remote mode)
|
|
if(g_remot_local_ctrl == 1) {
|
|
// Local mode: keep button disabled
|
|
$('#rf_form input[type="button"]').attr("disabled", true).val("Local Mode");
|
|
} else {
|
|
// Remote mode: enable button
|
|
$('#rf_form input[type="button"]').attr("disabled", false).val("Set");
|
|
}
|
|
|
|
document.getElementById('webtitle').textContent = title[1];
|
|
document.getElementById('webtitle_header').textContent = title[1];
|
|
if (typeof rfFormSnapshotUpdate === 'function') rfFormSnapshotUpdate();
|
|
}).fail(function() {
|
|
// Optional: Error handling
|
|
if(g_remot_local_ctrl == 0) {
|
|
$('#rf_form input[type="button"]').val("Load Failed");
|
|
}
|
|
});
|
|
}
|
|
|
|
function refresh_show(){
|
|
get_remote_local_ctrl();
|
|
SetFormDefaults();
|
|
refreshDashboard();
|
|
m10_load();
|
|
}
|
|
|
|
// PR07: 10 MHz reference output enable (FPGA reg_map_dpd seg5 0x1f bit0).
|
|
// Independent of the RF form and of Local/Remote mode: it is a hardware
|
|
// reference-clock output, applied live and reset to OFF on every power-up.
|
|
function m10_load(){
|
|
$.get("atsc_status_cfg.cgi?sys_m10=&", function(data, status){
|
|
if(typeof data === 'object' && data !== null){
|
|
if(data.error === 'session_expired' && data.redirect){ window.location.href = data.redirect; }
|
|
return;
|
|
}
|
|
var v = Number(data.split("|")[0].split("#")[1]); // "#<0|1>|"
|
|
var sel = document.getElementById("m10_en");
|
|
if(sel && !isNaN(v)) sel.value = v;
|
|
});
|
|
}
|
|
function m10_set(){
|
|
var sel = document.getElementById("m10_en");
|
|
if(!sel) return false;
|
|
$.post("atsc_status_cfg.cgi", "sys_m10="+sel.value, function(data, status){
|
|
m10_load();
|
|
});
|
|
return false;
|
|
}
|
|
|
|
function set_rxfreq_button_enable(is_enable){
|
|
if(is_enable == 0){
|
|
$('#rx_freq').attr("disabled", true);
|
|
$('#id_rxfreq_button').attr("disabled", true);
|
|
}else{
|
|
$('#rx_freq').attr("disabled", false);
|
|
$('#id_rxfreq_button').attr("disabled", false);
|
|
}
|
|
}
|
|
|
|
function exc_sysRfSet() {
|
|
var postData = "sys_rf=";
|
|
var cf = document.forms[0];
|
|
|
|
var new_power = (arry_sign[Number(cf.pw0.value)]) * (Number(cf.pw1.value)*100+(arry_p[Number(cf.pw2.value)]));
|
|
g_old_power = arry_sign[g_old_power_p0]*(g_old_power_p1*100+arry_p[g_old_power_p2]);
|
|
|
|
if((new_power - g_old_power) > 100){
|
|
alert("Please do not increase power for more than 1dB each time, change will be discarded!");
|
|
SetFormDefaults();
|
|
return;
|
|
}
|
|
|
|
postData += "#"+cf.pw0.value;
|
|
postData += "#"+cf.pw1.value;
|
|
postData += "#"+cf.pw2.value;
|
|
postData += "#"+cf.rfy.value;
|
|
postData += "#"+cf.agc.value;
|
|
postData += "#"+0;
|
|
postData += "#"+cf.tx.value;
|
|
postData += "#"+cf.freq6m.value;
|
|
postData += "#"+cf.rx_freq.value;
|
|
|
|
cur_rx_freq = Number($("#rx_freq").val());
|
|
|
|
if(cmd_confirm()){
|
|
if(g_rx_freq != cur_rx_freq){
|
|
g_rx_freq_countdown_active = true; // Start countdown, prevent rx_freq update
|
|
$("#set_rxfreq_note").text(" wait 10 s");
|
|
set_rxfreq_button_enable(0);
|
|
var note_sec = 10;
|
|
var set_tnote_intv = setInterval(function() {
|
|
if(note_sec == 0) {
|
|
clearInterval(set_tnote_intv);
|
|
$("#set_rxfreq_note").text(" ");
|
|
set_rxfreq_button_enable(1);
|
|
g_rx_freq_countdown_active = false; // End countdown, allow rx_freq update
|
|
SetFormDefaults();
|
|
return;
|
|
}else{
|
|
note_sec = note_sec-1;
|
|
$("#set_rxfreq_note").text(" wait "+note_sec+" s ");
|
|
set_rxfreq_button_enable(0);
|
|
}
|
|
}, 2000);
|
|
}
|
|
setAllRfRowButtonsSaved();
|
|
$.post("atsc_status_cfg.cgi", postData, function(data, status){
|
|
if(status=="success"){
|
|
SetFormDefaults();
|
|
}else{
|
|
alert("post val err");
|
|
}
|
|
});
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Modal Logic - Open and close account modal
|
|
function openAccountModal() {
|
|
// Fetch current username from server
|
|
$.get("login.cgi?action=get_user", function(data) {
|
|
var trimmedData = (data || "").trim();
|
|
if (trimmedData && trimmedData !== "UNAUTHORIZED") {
|
|
document.getElementById('current_user').value = trimmedData;
|
|
}
|
|
document.getElementById('accountModal').style.display = 'block';
|
|
setTimeout(function() { document.getElementById('current_pwd').focus(); }, 100);
|
|
}).fail(function() {
|
|
document.getElementById('accountModal').style.display = 'block';
|
|
setTimeout(function() { document.getElementById('current_pwd').focus(); }, 100);
|
|
});
|
|
}
|
|
|
|
function closeAccountModal() {
|
|
document.getElementById('accountModal').style.display = 'none';
|
|
// Clear sensitive fields
|
|
document.getElementById('current_pwd').value = '';
|
|
document.getElementById('new_pwd').value = '';
|
|
document.getElementById('confirm_pwd').value = '';
|
|
}
|
|
|
|
// Validates that a string contains only printable characters (excluding space)
|
|
function isValidPrintableString(str) {
|
|
// Regular expression to check for printable characters (ASCII 33-126), excluding space
|
|
// Space is ASCII 32, and we want to exclude it
|
|
var printableCharRegex = /^[!-~]+$/; // ! is ASCII 33, ~ is ASCII 126
|
|
return printableCharRegex.test(str);
|
|
}
|
|
|
|
// Validate Account Form - All required fields must be filled
|
|
function validateAccountForm() {
|
|
var currentUser = document.getElementById('current_user').value;
|
|
var currentPwd = document.getElementById('current_pwd').value;
|
|
var newUsername = document.getElementById('new_user').value;
|
|
var newPwd = document.getElementById('new_pwd').value;
|
|
var confirmPwd = document.getElementById('confirm_pwd').value;
|
|
|
|
// Current password is required (cannot be empty)
|
|
if (!currentPwd || currentPwd.trim() === "") {
|
|
alert("Current password is required");
|
|
return false;
|
|
}
|
|
|
|
// Validate current password contains only printable characters
|
|
if (!isValidPrintableString(currentPwd)) {
|
|
alert("Current password contains invalid characters. Only printable characters (excluding space) are allowed.");
|
|
return false;
|
|
}
|
|
|
|
// New password is required (cannot be empty)
|
|
if (!newPwd || newPwd.trim() === "") {
|
|
alert("New password is required");
|
|
return false;
|
|
}
|
|
|
|
// Validate new password contains only printable characters
|
|
if (!isValidPrintableString(newPwd)) {
|
|
alert("New password contains invalid characters. Only printable characters (excluding space) are allowed.");
|
|
return false;
|
|
}
|
|
|
|
// Validate new password length (max 16 chars)
|
|
if (newPwd.length > 16) {
|
|
alert("New password must be no more than 16 characters");
|
|
return false;
|
|
}
|
|
|
|
// Validate new password length
|
|
if (newPwd.length < 6) {
|
|
alert("New password must be at least 6 characters");
|
|
return false;
|
|
}
|
|
|
|
// Confirm password must match new password
|
|
if (newPwd !== confirmPwd) {
|
|
alert("New passwords do not match");
|
|
return false;
|
|
}
|
|
|
|
// Validate confirm password contains only printable characters
|
|
if (!isValidPrintableString(confirmPwd)) {
|
|
alert("Confirm password contains invalid characters. Only printable characters (excluding space) are allowed.");
|
|
return false;
|
|
}
|
|
|
|
// Validate confirm password length (max 16 chars)
|
|
if (confirmPwd.length > 16) {
|
|
alert("Confirm password must be no more than 16 characters");
|
|
return false;
|
|
}
|
|
|
|
// Validate new username if provided
|
|
if (newUsername && newUsername.trim() !== "") {
|
|
// Validate new username contains only printable characters
|
|
if (!isValidPrintableString(newUsername)) {
|
|
alert("New username contains invalid characters. Only printable characters (excluding space) are allowed.");
|
|
return false;
|
|
}
|
|
|
|
// Validate new username length (max 16 chars)
|
|
if (newUsername.length > 16) {
|
|
alert("New username must be no more than 16 characters");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true; // Allows the form to submit
|
|
}
|
|
|
|
// Form submission handler using fetch API
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
var accountForm = document.getElementById('accountForm');
|
|
if (accountForm) {
|
|
accountForm.addEventListener('submit', function(e) {
|
|
e.preventDefault();
|
|
|
|
if (!validateAccountForm()) return;
|
|
|
|
var formData = new URLSearchParams({
|
|
Username: document.getElementById('current_user').value,
|
|
OldPassword: document.getElementById('current_pwd').value,
|
|
NewUsername: document.getElementById('new_user').value,
|
|
NewPassword: document.getElementById('new_pwd').value,
|
|
ConfirmPassword: document.getElementById('confirm_pwd').value
|
|
});
|
|
|
|
fetch('login.cgi?action=change_account', {
|
|
method: 'POST',
|
|
body: formData
|
|
})
|
|
.then(r => r.json())
|
|
.then(data => {
|
|
if (data.success) {
|
|
alert("Update successful! Please login again.");
|
|
closeAccountModal();
|
|
// Redirect to login page after 1.5 seconds
|
|
setTimeout(function() {
|
|
window.location.href = 'login.cgi?logout=1';
|
|
}, 1500);
|
|
} else {
|
|
alert(data.error || "Update failed");
|
|
}
|
|
})
|
|
.catch(function(err) {
|
|
alert("Network error: " + err);
|
|
});
|
|
});
|
|
}
|
|
});
|
|
|
|
// ----- SET (unsaved) reminder: per-row, vanilla JS -----
|
|
var rfFormSnapshotPerRow = [];
|
|
function getRowValues(tr) {
|
|
var out = [], els = tr.querySelectorAll('select, input:not([type="button"])'), i, el, v;
|
|
for (i = 0; i < els.length; i++) {
|
|
el = els[i];
|
|
v = el.tagName === 'SELECT' ? (el.options[el.selectedIndex] ? el.options[el.selectedIndex].value : '') : el.value;
|
|
out.push({ name: el.name, value: String(v) });
|
|
}
|
|
return out;
|
|
}
|
|
function getFormSnapshotPerRow(formId) {
|
|
var f = document.getElementById(formId);
|
|
if (!f) return [];
|
|
var rows = f.querySelectorAll('table tr'), out = [], i;
|
|
for (i = 0; i < rows.length; i++) {
|
|
if (rows[i].querySelector('input[type="button"]')) out.push(getRowValues(rows[i]));
|
|
}
|
|
return out;
|
|
}
|
|
function isRowDirty(rowValues, rowSnapshot) {
|
|
if (rowValues.length !== rowSnapshot.length) return true;
|
|
for (var i = 0; i < rowValues.length; i++) {
|
|
if (rowValues[i].name !== rowSnapshot[i].name || rowValues[i].value !== rowSnapshot[i].value) return true;
|
|
}
|
|
return false;
|
|
}
|
|
function setRowButtonState(tr, unsaved) {
|
|
var btn = tr.querySelector('input[type="button"]');
|
|
if (!btn || btn.disabled) return;
|
|
btn.value = unsaved ? 'Set (unsaved)' : 'Set';
|
|
if (unsaved) btn.classList.add('is-unsaved'); else btn.classList.remove('is-unsaved');
|
|
}
|
|
function updateAllRowButtonStates(formId) {
|
|
var f = document.getElementById(formId);
|
|
if (!f || !rfFormSnapshotPerRow.length) return;
|
|
var rows = f.querySelectorAll('table tr');
|
|
var rowIdx = 0;
|
|
for (var i = 0; i < rows.length; i++) {
|
|
if (!rows[i].querySelector('input[type="button"]')) continue;
|
|
setRowButtonState(rows[i], rowIdx < rfFormSnapshotPerRow.length && isRowDirty(getRowValues(rows[i]), rfFormSnapshotPerRow[rowIdx]));
|
|
rowIdx++;
|
|
}
|
|
}
|
|
function setAllRfRowButtonsSaved() {
|
|
var f = document.getElementById('rf_form');
|
|
if (!f) return;
|
|
var rows = f.querySelectorAll('table tr');
|
|
for (var i = 0; i < rows.length; i++) setRowButtonState(rows[i], false);
|
|
}
|
|
function rfFormSnapshotUpdate() {
|
|
rfFormSnapshotPerRow = getFormSnapshotPerRow('rf_form');
|
|
setAllRfRowButtonsSaved();
|
|
}
|
|
function attachRfFormUnsavedListener() {
|
|
var f = document.getElementById('rf_form');
|
|
if (!f) return;
|
|
f.addEventListener('change', function() {
|
|
updateAllRowButtonStates('rf_form');
|
|
});
|
|
}
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', attachRfFormUnsavedListener);
|
|
} else {
|
|
attachRfFormUnsavedListener();
|
|
}
|
|
</script>
|
|
</head>
|
|
|
|
<body onload="refresh_show()">
|
|
<div class="app-layout">
|
|
<aside class="app-sidebar">
|
|
<ul class="items">
|
|
<li><a href="status_info.html" title="Status">Status</a></li>
|
|
<li><a href="sys_set.html" title="Settings">Settings</a></li>
|
|
<li class="active"><a href="sys_rf.html" title="RF Control">RF Control</a></li>
|
|
<li><a href="sys_psip.html" title="TSID&PSIP">TSID&PSIP</a></li>
|
|
<li><a href="sys_ts.html" title="TSoIP">TSoIP</a></li>
|
|
<li><a href="sys_spectrum.html" title="Spectrum">Spectrum</a></li>
|
|
<li><a href="log_output.html" title="Log">Log</a></li>
|
|
</ul>
|
|
<div class="sidebar-footer">
|
|
<h4>Anywave Broadcast Inc.</h4>
|
|
<p>Copyright 2026<br><br><span class="redbox-label">Technical Support</span><br>+1 847 415 2258<br><a href="mailto:support@anywaveus.com">support@anywaveus.com</a></p>
|
|
</div>
|
|
</aside>
|
|
<div class="sidebar-overlay" onclick="toggleSidebar()"></div>
|
|
|
|
<header class="app-header">
|
|
<button class="menu-toggle" onclick="toggleSidebar()" aria-label="Toggle menu">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
<line x1="3" y1="12" x2="21" y2="12"></line>
|
|
<line x1="3" y1="6" x2="21" y2="6"></line>
|
|
<line x1="3" y1="18" x2="21" y2="18"></line>
|
|
</svg>
|
|
</button>
|
|
<h1><a href="https://anywavecom.net/" class="logo-bg" title="Anywave Broadcast Inc."></a></h1>
|
|
<h2 id="webtitle_header"><span></span></h2>
|
|
<h3>
|
|
<div class="dropdown">
|
|
<button class="dropbtn-modern">Admin ▾</button>
|
|
<div class="dropdown-content">
|
|
<a href="#" onclick="openAccountModal(); return false;">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
<circle cx="12" cy="12" r="3"></circle>
|
|
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06-.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06-.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06-.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
|
|
</svg>
|
|
Account Settings
|
|
</a>
|
|
<a href="login.cgi?logout=1">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path>
|
|
<polyline points="16 17 21 12 16 7"></polyline>
|
|
<line x1="21" y1="12" x2="9" y2="12"></line>
|
|
</svg>
|
|
Logout
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</h3>
|
|
</header>
|
|
|
|
<!-- Fixed Dashboard Summary - Top of page, under header -->
|
|
<div class="dashboard-fixed">
|
|
<div class="summary-dashboard">
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-neutral" id="dot_freq" aria-hidden="true"></span>
|
|
<span class="summary-label">Frequency</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-neutral" id="sum_freq">--</span>
|
|
<span class="summary-unit">MHz</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-ok" id="dot_snr" aria-hidden="true"></span>
|
|
<span class="summary-label">SNR</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-ok" id="sum_snr">--</span>
|
|
<span class="summary-unit">dB</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-ok" id="dot_uimd" aria-hidden="true"></span>
|
|
<span class="summary-label">UIMD</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-ok" id="sum_uimd">--</span>
|
|
<span class="summary-unit">dBc</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-ok" id="dot_limd" aria-hidden="true"></span>
|
|
<span class="summary-label">LIMD</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-ok" id="sum_limd">--</span>
|
|
<span class="summary-unit">dBc</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-off" id="dot_rf" aria-hidden="true"></span>
|
|
<span class="summary-label">RF Switch</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-muted" id="sum_rf">--</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-ok" id="dot_outpow" aria-hidden="true"></span>
|
|
<span class="summary-label">Output Power</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-ok" id="sum_outpow">--</span>
|
|
<span class="summary-unit">dBm</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-neutral" id="dot_input" aria-hidden="true"></span>
|
|
<span class="summary-label">Input Source</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-neutral" id="sum_input">--</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-neutral" id="dot_input_status" aria-hidden="true"></span>
|
|
<span class="summary-label">Input Status</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-neutral" id="sum_input_status">--</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-neutral" id="dot_bitrate" aria-hidden="true"></span>
|
|
<span class="summary-label">Bitrate</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-neutral" id="sum_bitrate">--</span>
|
|
<span class="summary-unit">Mbps</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-ok" id="dot_temp" aria-hidden="true"></span>
|
|
<span class="summary-label">Temperature</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-ok" id="sum_temp">--</span>
|
|
<span class="summary-unit">°F</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-off" id="dot_agc" aria-hidden="true"></span>
|
|
<span class="summary-label">AGC</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-muted" id="sum_agc">--</span>
|
|
</div>
|
|
</div>
|
|
<div class="summary-card">
|
|
<div class="summary-label-row">
|
|
<span class="status-dot status-neutral" id="dot_control" aria-hidden="true"></span>
|
|
<span class="summary-label">Control</span>
|
|
</div>
|
|
<div class="summary-value-wrapper">
|
|
<span class="summary-value value-neutral" id="sum_control">--</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<main class="app-main">
|
|
<h2>RF Control</h2>
|
|
<div class="box">
|
|
<form name="rf_control_form" id="rf_form">
|
|
<table>
|
|
<tr>
|
|
<td>Output Power</td>
|
|
<td><fieldset>
|
|
<select style="width:40px" name="pw0" id="pw0">
|
|
<option value="0">+
|
|
<option value="1">-
|
|
</select>
|
|
<select style="width:40px" name="pw1" id="pw1">
|
|
<option value="0">0 <option value="1">1 <option value="2">2 <option value="3">3 <option value="4">4 <option value="5">5
|
|
<option value="6">6 <option value="7">7 <option value="8">8 <option value="9">9 <option value="10">10 <option value="11">11
|
|
<option value="12">12 <option value="13">13 <option value="14">14 <option value="15">15 <option value="16">16 <option value="17">17
|
|
<option value="18">18 <option value="19">19 <option value="20">20 <option value="21">21 <option value="22">22 <option value="23">23
|
|
<option value="24">24 <option value="25">25
|
|
</select>.
|
|
<select style="width:40px" name="pw2" id="pw2">
|
|
<option value="0">00
|
|
<option value="1">05
|
|
<option value="2">10
|
|
<option value="3">15
|
|
<option value="4">20
|
|
<option value="5">25
|
|
<option value="6">30
|
|
<option value="7">35
|
|
<option value="8">40
|
|
<option value="9">45
|
|
<option value="10">50
|
|
<option value="11">55
|
|
<option value="12">60
|
|
<option value="13">65
|
|
<option value="14">70
|
|
<option value="15">75
|
|
<option value="16">80
|
|
<option value="17">85
|
|
<option value="18">90
|
|
<option value="19">95
|
|
</select>dBm (-25.00 ~ +5.00dBm)
|
|
</fieldset></td>
|
|
<td>
|
|
<input type="button" class="btn-modern" alt="Set" value="Set" disabled onclick="return exc_sysRfSet();">
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>RF</td>
|
|
<td>
|
|
<select name="rfy" id="rfy">
|
|
<option value="0">Off
|
|
<option value="1">On
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<input type="button" class="btn-modern" alt="Set" value="Set" disabled onclick="return exc_sysRfSet();">
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>AGC</td>
|
|
<td>
|
|
<select name="agc" id="agc">
|
|
<option value="0">Off
|
|
<option value="1">On
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<input type="button" class="btn-modern" alt="Set" value="Set" disabled onclick="return exc_sysRfSet();">
|
|
</td>
|
|
</tr>
|
|
|
|
<tr id="tx_form" style="display: none" >
|
|
<td >TX</td>
|
|
<td>
|
|
<select name="tx" id="tx">
|
|
<option value="0">Off
|
|
<option value="1">On
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<input type="button" class="btn-modern" alt="Set" value="Set" disabled onclick="return exc_sysRfSet();">
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>RX Frequency</td>
|
|
<td>
|
|
<select name="rx_freq" id="rx_freq">
|
|
<option value="0">57
|
|
<option value="1">63
|
|
<option value="2">69
|
|
<option value="3">79
|
|
<option value="4">85
|
|
<option value="5">177
|
|
<option value="6">183
|
|
<option value="7">189
|
|
<option value="8">195
|
|
<option value="9">201
|
|
<option value="10">207
|
|
<option value="11">213
|
|
<option value="12">473
|
|
<option value="13">479
|
|
<option value="14">485
|
|
<option value="15">491
|
|
<option value="16">497
|
|
<option value="17">503
|
|
<option value="18">509
|
|
<option value="19">515
|
|
<option value="20">521
|
|
<option value="21">527
|
|
<option value="22">533
|
|
<option value="23">539
|
|
<option value="24">545
|
|
<option value="25">551
|
|
<option value="26">557
|
|
<option value="27">563
|
|
<option value="28">569
|
|
<option value="29">575
|
|
<option value="30">581
|
|
<option value="31">587
|
|
<option value="32">593
|
|
<option value="33">599
|
|
<option value="34">605
|
|
<option value="35">611
|
|
<option value="36">617
|
|
<option value="37">623
|
|
<option value="38">629
|
|
<option value="39">635
|
|
<option value="40">641
|
|
<option value="41">647
|
|
<option value="42">653
|
|
<option value="43">659
|
|
<option value="44">665
|
|
<option value="45">671
|
|
<option value="46">677
|
|
<option value="47">683
|
|
<option value="48">689
|
|
<option value="49">695
|
|
<option value="50">701
|
|
<option value="51">707
|
|
<option value="52">713
|
|
<option value="53">719
|
|
<option value="54">725
|
|
<option value="55">731
|
|
<option value="56">737
|
|
<option value="57">743
|
|
<option value="58">749
|
|
<option value="59">755
|
|
<option value="60">761
|
|
<option value="61">767
|
|
<option value="62">773
|
|
<option value="63">779
|
|
<option value="64">785
|
|
<option value="65">791
|
|
<option value="66">797
|
|
<option value="67">803
|
|
</select> MHz
|
|
</td>
|
|
<td>
|
|
<input type="button" class="btn-modern" id="id_rxfreq_button" alt="Set" value="Set" disabled onclick="return exc_sysRfSet();">
|
|
<span id="set_rxfreq_note"></span>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td id="freq6m_h">TX Frequency</td>
|
|
<td id="freq6m_i">
|
|
<select name="freq6m" id="freq6m">
|
|
<option value="0">57
|
|
<option value="1">63
|
|
<option value="2">69
|
|
<option value="3">79
|
|
<option value="4">85
|
|
<option value="5">177
|
|
<option value="6">183
|
|
<option value="7">189
|
|
<option value="8">195
|
|
<option value="9">201
|
|
<option value="10">207
|
|
<option value="11">213
|
|
<option value="12">473
|
|
<option value="13">479
|
|
<option value="14">485
|
|
<option value="15">491
|
|
<option value="16">497
|
|
<option value="17">503
|
|
<option value="18">509
|
|
<option value="19">515
|
|
<option value="20">521
|
|
<option value="21">527
|
|
<option value="22">533
|
|
<option value="23">539
|
|
<option value="24">545
|
|
<option value="25">551
|
|
<option value="26">557
|
|
<option value="27">563
|
|
<option value="28">569
|
|
<option value="29">575
|
|
<option value="30">581
|
|
<option value="31">587
|
|
<option value="32">593
|
|
<option value="33">599
|
|
<option value="34">605
|
|
<option value="35">611
|
|
<option value="36">617
|
|
<option value="37">623
|
|
<option value="38">629
|
|
<option value="39">635
|
|
<option value="40">641
|
|
<option value="41">647
|
|
<option value="42">653
|
|
<option value="43">659
|
|
<option value="44">665
|
|
<option value="45">671
|
|
<option value="46">677
|
|
<option value="47">683
|
|
<option value="48">689
|
|
<option value="49">695
|
|
<option value="50">701
|
|
<option value="51">707
|
|
<option value="52">713
|
|
<option value="53">719
|
|
<option value="54">725
|
|
<option value="55">731
|
|
<option value="56">737
|
|
<option value="57">743
|
|
<option value="58">749
|
|
<option value="59">755
|
|
<option value="60">761
|
|
<option value="61">767
|
|
<option value="62">773
|
|
<option value="63">779
|
|
<option value="64">785
|
|
<option value="65">791
|
|
<option value="66">797
|
|
<option value="67">803
|
|
</select> MHz
|
|
</td>
|
|
<td>
|
|
<input type="button" class="btn-modern" alt="Set" value="Set" disabled onclick="return exc_sysRfSet();">
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</form>
|
|
|
|
<h2>Reference Output</h2>
|
|
<table>
|
|
<tr>
|
|
<td>10 MHz Output</td>
|
|
<td>
|
|
<select name="m10_en" id="m10_en">
|
|
<option value="0">Off
|
|
<option value="1">On
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<input type="button" class="btn-modern" value="Set" onclick="return m10_set();">
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<div style="padding: 4px 10px; color: #64748b; font-size: 12px;">
|
|
Enables the AB5 10 MHz reference clock output. Default Off; resets to Off on every power-up.
|
|
</div>
|
|
|
|
<div style="padding: 10px; color: #b91c1c; font-weight: 500;">
|
|
Warning: Exciter RF Output Power will be reset to -25dBm when the channel(TX Frequency) is changed.
|
|
</div>
|
|
</div>
|
|
</main>
|
|
</div>
|
|
|
|
<div id="accountModal" class="modal">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h3>ACCOUNT SETTINGS</h3>
|
|
<span class="close" onclick="closeAccountModal()">×</span>
|
|
</div>
|
|
<div class="modal-body">
|
|
<form id="accountForm" method="post" action="login.cgi?action=change_account" onsubmit="return validateAccountForm()">
|
|
<table class="modal-table">
|
|
<tr>
|
|
<td>Current Username</td>
|
|
<td><input type="text" id="current_user" name="current_user" readonly></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Current Password</td>
|
|
<td><input type="password" id="current_pwd" name="current_pwd" required></td>
|
|
</tr>
|
|
<tr>
|
|
<td>New Username</td>
|
|
<td><input type="text" id="new_user" name="new_user"></td>
|
|
</tr>
|
|
<tr>
|
|
<td>New Password</td>
|
|
<td><input type="password" id="new_pwd" name="new_pwd"></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Confirm Password</td>
|
|
<td><input type="password" id="confirm_pwd" name="confirm_pwd"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="modal-footer">
|
|
<input type="button" class="btn-modern" style="background-color: #64748b;" value="Cancel" onclick="closeAccountModal()">
|
|
<input type="submit" class="btn-modern" value="Save Changes">
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function toggleSidebar(){
|
|
document.querySelector('.app-sidebar').classList.toggle('sidebar-open');
|
|
document.querySelector('.sidebar-overlay').classList.toggle('active');
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|