@ -47,32 +47,155 @@ function find_parent(ele, tagname) {
function f _command ( ele , command ) {
var myrow = find _parent ( ele , "TR" ) ;
var mytbl = find _parent ( ele , "TABLE" ) ;
amend _d ( myrow , mytbl , command ) ;
}
function edit _freq ( freq , to _ui ) {
var MHZ = 1000000.0 ;
if ( to _ui ) {
var f = ( freq / MHZ ) + "" ;
if ( f . indexOf ( "." ) == - 1 )
f += ".0" ;
return f ;
} else {
var f = parseFloat ( freq ) ;
if ( freq . indexOf ( "." ) )
f *= MHZ ;
return Math . round ( f ) ;
}
}
function edit _d ( d , to _ui ) {
var new _d = { } ;
var hexints = { "nac" : 1 } ;
var ints = { "if_rate" : 1 , "ppm" : 1 , "rate" : 1 , "offset" : 1 , "nac" : 1 , "logfile-workers" : 1 , "decim-amt" : 1 , "seek" : 1 , "hamlib-model" : 1 } ;
var bools = { "active" : 1 , "trunked" : 1 , "rate" : 1 , "offset" : 1 , "phase2_tdma" : 1 , "phase2-tdma" : 1 , "wireshark" : 1 , "udp-player" : 1 , "audio-if" : 1 , "tone-detect" : 1 , "vocoder" : 1 , "audio" : 1 , "pause" : 1 } ;
var floats = { "costas-alpha" : 1 , "gain-mu" : 1 , "calibration" : 1 , "fine-tune" : 1 , "gain" : 1 , "excess-bw" : 1 , "offset" : 1 }
var lists = { "blacklist" : 1 , "whitelist" : 1 , "cclist" : 1 } ;
var freqs = { "frequency" : 1 , "cclist" : 1 } ;
for ( var k in d ) {
if ( ! to _ui ) {
if ( d [ k ] == "None" )
new _d [ k ] = null ;
else
new _d [ k ] = d [ k ] ;
if ( k == "plot" && ! d [ k ] . length )
new _d [ k ] = null ;
if ( k in ints ) {
new _d [ k ] = parseInt ( new _d [ k ] ) ;
} else if ( k in floats ) {
new _d [ k ] = parseFloat ( new _d [ k ] ) ;
} else if ( k in lists ) {
var l = new _d [ k ] . split ( "," ) ;
if ( k in freqs ) {
var new _l = [ ] ;
for ( var i in l )
new _l . push ( edit _freq ( l [ i ] , to _ui ) ) ;
new _d [ k ] = new _l ;
} else {
new _d [ k ] = l ;
}
} else if ( k in freqs ) {
new _d [ k ] = edit _freq ( new _d [ k ] , to _ui ) ;
}
} else {
if ( k in hexints ) {
new _d [ k ] = "0x" + d [ k ] . toString ( 16 ) ;
} else if ( k in ints ) {
if ( d [ k ] == null )
new _d [ k ] = "" ;
else
new _d [ k ] = d [ k ] . toString ( 10 ) ;
} else if ( k in lists ) {
if ( k in freqs ) {
var new _l = [ ] ;
for ( var i in d [ k ] ) {
new _l . push ( edit _freq ( d [ k ] [ i ] , to _ui ) ) ;
}
new _d [ k ] = new _l . join ( "," ) ;
} else {
new _d [ k ] = d [ k ] . join ( "," ) ;
}
} else if ( k in freqs ) {
new _d [ k ] = edit _freq ( d [ k ] , to _ui ) ;
} else {
new _d [ k ] = d [ k ] ;
}
}
}
return new _d ;
}
function edit _l ( cfg , to _ui ) {
var new _d = { "devices" : [ ] , "channels" : [ ] } ;
for ( var device in cfg [ 'devices' ] )
new _d [ "devices" ] . push ( edit _d ( cfg [ 'devices' ] [ device ] , to _ui ) ) ;
for ( var channel in cfg [ 'channels' ] )
new _d [ "channels" ] . push ( edit _d ( cfg [ 'channels' ] [ channel ] , to _ui ) ) ;
new _d [ "backend-rx" ] = edit _d ( cfg [ 'backend-rx' ] , to _ui ) ;
return new _d ;
}
function amend _d ( myrow , mytbl , command ) {
var trunk _row = null ;
if ( mytbl . id == "chtable" )
trunk _row = find _next ( myrow , "TR" ) ;
if ( command == "delete" ) {
var ok = confirm ( "Confirm delete" ) ;
if ( ok )
if ( ok ) {
myrow . parentNode . removeChild ( myrow ) ;
if ( mytbl . id == "chtable" )
trunk _row . parentNode . removeChild ( trunk _row ) ;
}
} else if ( command == "clone" ) {
var newrow = myrow . cloneNode ( true ) ;
if ( myrow . nextSibling )
myrow . parentNode . insertBefore ( newrow , myrow . nextSibling ) ;
else
myrow . parentNode . appendChild ( newrow ) ;
newrow . id = find _free _id ( "id_" ) ;
if ( mytbl . id == "chtable" ) {
var newrow2 = trunk _row . cloneNode ( true ) ;
newrow2 . id = "tr_" + newrow . id . substring ( 3 ) ;
if ( trunk _row . nextSibling ) {
myrow . parentNode . insertBefore ( newrow2 , trunk _row . nextSibling ) ;
myrow . parentNode . insertBefore ( newrow , trunk _row . nextSibling ) ;
} else {
myrow . parentNode . appendChild ( newrow ) ;
myrow . parentNode . appendChild ( newrow2 ) ;
}
} else {
if ( myrow . nextSibling )
myrow . parentNode . insertBefore ( newrow , myrow . nextSibling ) ;
else
myrow . parentNode . appendChild ( newrow ) ;
}
} else if ( command == "new" ) {
var mytbl = find _parent ( ele , "TABLE" ) ;
var newrow = null ;
if ( mytbl . id == "chtable" )
var parent = null ;
if ( mytbl . id == "chtable" ) {
newrow = document . getElementById ( "chrow" ) . cloneNode ( true ) ;
else if ( mytbl . id == "devtable" )
parent = document . getElementById ( "chrow" ) . parentNode ;
} else if ( mytbl . id == "devtable" ) {
newrow = document . getElementById ( "devrow" ) . cloneNode ( true ) ;
else
return ;
mytbl . appendChild ( newrow ) ;
parent = document . getElementById ( "devrow" ) . parentNode ;
} else {
return null ;
}
newrow . style [ 'display' ] = '' ;
newrow . id = find _free _id ( "id_" ) ;
parent . appendChild ( newrow ) ;
if ( mytbl . id == "chtable" ) {
var newrow2 = document . getElementById ( "trrow" ) . cloneNode ( true ) ;
newrow2 . id = "tr_" + newrow . id . substring ( 3 ) ;
parent . appendChild ( newrow2 ) ;
}
return newrow . id ;
}
}
function nav _update ( command ) {
var names = [ "b1" , "b2" , "b3" ] ;
var bmap = { "status" : "b1" , "plot" : "b2" , "about" : "b3" } ;
var names = [ "b1" , "b2" , "b3" , "b4" , "b5" ] ;
var bmap = { "status" : "b1" , "plot" : "b2" , "settings" : "b3" , "rx" : "b4" , " about" : "b5 " } ;
var id = bmap [ command ] ;
for ( var id1 in names ) {
b = document . getElementById ( names [ id1 ] ) ;
@ -85,7 +208,7 @@ function nav_update(command) {
}
function f _select ( command ) {
var div _list = [ "status" , "plot" , "about" ] ;
var div _list = [ "status" , "plot" , "settings" , "rx" , " about" ] ;
for ( var i = 0 ; i < div _list . length ; i ++ ) {
var ele = document . getElementById ( "div_" + div _list [ i ] ) ;
if ( command == div _list [ i ] )
@ -99,6 +222,8 @@ function f_select(command) {
else
ctl . style [ 'display' ] = "none" ;
nav _update ( command ) ;
if ( command == "settings" )
f _list ( ) ;
}
function is _digit ( s ) {
@ -152,14 +277,14 @@ function adjacent_data(d) {
var html = "<div class=\"adjacent\">" ;
html += "<table border=1 borderwidth=0 cellpadding=0 cellspacing=0 width=100%>" ;
html += "<tr><th colspan=99 style=\"align: center\">Adjacent Sites</th></tr>" ;
html += "<tr><th>Frequency</th><th>RFSS</th><th>Site</th><th>Uplink</th></tr>" ;
html += "<tr><th>Frequency</th><th>Sys ID</th><th> RFSS</th><th>Site</th><th>Uplink</th></tr>" ;
var ct = 0 ;
for ( var freq in d ) {
var color = "#d0d0d0" ;
if ( ( ct & 1 ) == 0 )
color = "#c0c0c0" ;
ct += 1 ;
html += "<tr style=\"background-color: " + color + ";\"><td>" + freq / 1000000.0 + "</td><td>" + d [ freq ] [ "rfid"] + "</td><td>" + d [ freq ] [ "stid" ] + "</td><td>" + ( d [ freq ] [ "uplink" ] / 1000000.0 ) + "</td></tr>" ;
html += "<tr style=\"background-color: " + color + ";\"><td>" + freq / 1000000.0 + "</td><td>" + d [ freq ] [ 'sysid' ] . toString ( 16 ) + "</td><td>" + d [ freq ] [ "rfid"] + "</td><td>" + d [ freq ] [ "stid" ] + "</td><td>" + ( d [ freq ] [ "uplink" ] / 1000000.0 ) + "</td></tr>" ;
}
html += "</table></div></div><br><br>" ;
@ -174,6 +299,8 @@ function trunk_update(d) {
var do _hex = { "syid" : 0 , "sysid" : 0 , "wacn" : 0 } ;
var do _float = { "rxchan" : 0 , "txchan" : 0 } ;
var html = "" ;
var msg = JSON . stringify ( d ) ;
document . getElementById ( "answer_area" ) . innerHTML = msg ; msg ;
for ( var nac in d ) {
if ( ! is _digit ( nac . charAt ( 0 ) ) )
continue ;
@ -228,6 +355,58 @@ function trunk_update(d) {
div _s1 . innerHTML = html ;
}
function config _list ( d ) {
var html = "" ;
html += "<select id=\"config_select\" name=\"cfg-list\" size=5>" ;
for ( var file in d [ "data" ] ) {
html += "<option value=\"" + d [ "data" ] [ file ] + "\">" + d [ "data" ] [ file ] + "</option>" ;
}
html += "<option value=\"New Configuration\">New Configuration</option>" ;
html += "</select>" ;
document . getElementById ( "cfg_list_area" ) . innerHTML = html ;
}
function config _data ( d ) {
var cfg = edit _l ( d [ 'data' ] , true ) ;
open _editor ( ) ;
var chtable = document . getElementById ( "chtable" ) ;
var devtable = document . getElementById ( "devtable" ) ;
var chrow = document . getElementById ( "chrow" ) ;
var devrow = document . getElementById ( "devrow" ) ;
for ( var device in cfg [ 'devices' ] )
rollup _row ( "dev" , document . getElementById ( amend _d ( devrow , devtable , "new" ) ) , cfg [ 'devices' ] [ device ] ) ;
for ( var channel in cfg [ 'channels' ] )
rollup _row ( "ch" , document . getElementById ( amend _d ( chrow , chtable , "new" ) ) , cfg [ 'channels' ] [ channel ] ) ;
rollup _rx _rows ( cfg [ 'backend-rx' ] ) ;
}
function open _editor ( ) {
document . getElementById ( "edit_settings" ) . style [ "display" ] = "" ;
var rows = document . querySelectorAll ( ".dynrow" ) ;
var ct = 0 ;
for ( var r in rows ) {
var row = rows [ r ] ;
ct += 1 ;
if ( row . id && ( row . id . substring ( 0 , 3 ) == "id_" || row . id . substring ( 0 , 3 ) == "tr_" ) ) {
row . parentNode . removeChild ( row ) ;
}
}
var oldtbl = document . getElementById ( "rt_1" ) ;
if ( oldtbl )
oldtbl . parentNode . removeChild ( oldtbl ) ;
var tbl = document . getElementById ( "rxopt-table" ) ;
var newtbl = tbl . cloneNode ( true ) ;
newtbl . id = "rt_1" ;
newtbl . style [ "display" ] = "" ;
var rxrow = newtbl . querySelector ( ".rxrow" ) ;
var advrow = newtbl . querySelector ( ".advrow" ) ;
rxrow . id = "rx_1" ;
advrow . id = "rx_2" ;
if ( tbl . nextSibling )
tbl . parentNode . insertBefore ( newtbl , tbl . nextSibling ) ;
else
tbl . parentNode . appendChild ( newtbl ) ;
}
function http _req _cb ( ) {
req _cb _count += 1 ;
@ -242,7 +421,7 @@ function http_req_cb() {
}
r200 _count += 1 ;
var dl = JSON . parse ( http _req . responseText ) ;
var dispatch = { 'trunk_update' : trunk _update , 'change_freq' : change _freq , 'rx_update' : rx _update }
var dispatch = { 'trunk_update' : trunk _update , 'change_freq' : change _freq , 'rx_update' : rx _update , 'config_data' : config _data , 'config_list' : config _list }
for ( var i = 0 ; i < dl . length ; i ++ ) {
var d = dl [ i ] ;
if ( ! ( "json_type" in d ) )
@ -267,12 +446,17 @@ function do_update() {
}
function send _command ( command , data ) {
var d = { "command" : command , "data" : data } ;
send ( d ) ;
}
function send ( d ) {
request _count += 1 ;
if ( send _queue . length >= SEND _QLIMIT ) {
send _qfull += 1 ;
send _queue . unshift ( ) ;
}
send _queue . push ( { "command" : command , "data" : data } ) ;
send _queue . push ( d ) ;
send _process ( ) ;
}
@ -312,3 +496,193 @@ function f_debug() {
var div _debug = document . getElementById ( "div_debug" ) ;
div _debug . innerHTML = html ;
}
function find _next ( e , tag ) {
var n = e . nextSibling ;
for ( var i = 0 ; i < 25 ; i ++ ) {
if ( n == null )
return null ;
if ( n . nodeName == tag )
return n ;
n = n . nextSibling ;
}
return null ;
}
function find _free _id ( pfx ) {
for ( var seq = 1 ; seq < 5000 ; seq ++ ) {
var test _id = pfx + seq ;
var ele = document . getElementById ( test _id ) ;
if ( ! ele )
return test _id ;
}
return null ;
}
function f _trunked ( e ) {
var row = find _parent ( e , "TR" ) ;
var trrow = document . getElementById ( "tr_" + row . id . substring ( 3 ) ) ;
trrow [ 'style' ] [ "display" ] = ( e . checked ) ? "" : "none" ;
}
function read _write _sel ( sel _node , def ) {
var result = [ ] ;
var elist = sel _node . querySelectorAll ( "option" ) ;
for ( var e in elist ) {
var ele = elist [ e ] ;
if ( def ) {
var options = def [ sel _node . name ] . split ( "," ) ;
var opts = { } ;
for ( var o in options )
opts [ options [ o ] ] = 1 ;
if ( ele . value in opts )
ele . selected = true ;
else
ele . selected = false ;
} else {
if ( ele . selected )
result . push ( ele . value ) ;
}
}
if ( ! def )
return result . join ( ) ;
}
function read _write ( elist , def ) {
var result = { } ;
var s = "len: " + elist . length + "; " ;
for ( var e in elist ) {
s += elist [ e ] . tagName + "; " ;
}
for ( var e in elist ) {
var ele = elist [ e ] ;
if ( ele . nodeName == 'INPUT' ) {
if ( ele . type == 'text' )
if ( def ) {
ele . value = def [ ele . name ] ;
s += ele . name + "=" + ele . value + "; " ;
} else
result [ ele . name ] = ele . value ;
else if ( ele . type == 'checkbox' )
if ( def ) {
ele . checked = def [ ele . name ] ;
s += "checkbox " + ele . name + "; " ;
}
else
result [ ele . name ] = ele . checked ;
} else if ( ele . nodeName == 'SELECT' ) {
if ( def ) {
read _write _sel ( ele , def ) ;
s += "select " + ele . name + "; " ;
}
else
result [ ele . name ] = read _write _sel ( ele , def ) ;
}
}
if ( ! def )
return result ;
}
function rollup _row ( which , row , def ) {
var elements = Array . from ( row . querySelectorAll ( "input,select" ) ) ;
if ( which == "ch" ) {
var trrow = document . getElementById ( "tr_" + row . id . substring ( 3 ) ) ;
elements = elements . concat ( Array . from ( trrow . querySelectorAll ( "input,select" ) ) ) ;
}
else if ( which == "rx" ) {
var advrow = document . getElementById ( "rx_2" ) ;
elements = elements . concat ( Array . from ( advrow . querySelectorAll ( "input,select" ) ) ) ;
}
if ( def && which == "ch" )
trrow . style [ "display" ] = ( def [ "trunked" ] ) ? "" : "none" ;
var result = read _write ( elements , def ) ;
if ( ! def )
return result ;
}
function rollup ( which , def ) {
var result = [ ] ;
var mytbl = document . getElementById ( which + "table" ) ;
var elements = mytbl . querySelectorAll ( ".dynrow" ) ;
for ( var e in elements ) {
var row = elements [ e ] ;
if ( row . id != null && row . id . substring ( 0 , 3 ) == "id_" )
result . push ( rollup _row ( which , row ) ) ;
}
if ( ! def )
return result ;
}
function rollup _rx _rows ( def ) {
return rollup _row ( "rx" , document . getElementById ( "rx_1" ) , def ) ;
}
function f _save ( ) {
var name = document . getElementById ( "config_name" ) ;
if ( ! name . value ) {
alert ( "Name is required" ) ;
name . focus ( ) ;
return ;
}
if ( name . value == "New Configuration" ) {
alert ( "'" + name . value + "' is a reserved name, please retry" ) ;
name . value = "" ;
name . focus ( ) ;
return ;
}
var cfg = { "devices" : rollup ( "dev" , null ) , "channels" : rollup ( "ch" , null ) , "backend-rx" : rollup _rx _rows ( null ) } ;
cfg = edit _l ( cfg , false ) ;
var request = { "name" : name . value , "value" : cfg } ;
send _command ( "config-save" , request ) ;
f _list ( ) ;
}
function f _list ( ) {
var inp = document . getElementById ( "include_tsv" ) ;
send _command ( "config-list" , ( inp . checked ) ? "tsv" : "" ) ;
}
function f _start ( ) {
var sel = document . getElementById ( "config_select" ) ;
if ( ! sel ) return ;
var val = read _write _sel ( sel , null ) ;
if ( ( ! val ) || val == "New Configuration" ) {
alert ( "You must select a valid configuration to start" ) ;
return ;
}
if ( val . indexOf ( "[TSV]" ) >= 0 ) {
alert ( "TSV files not supported. First, invoke \"Edit\"; inspect the resulting configuration; then click \"Save\"." ) ;
return ;
}
send _command ( "rx-start" , val ) ;
}
function f _load ( ) {
var sel = document . getElementById ( "config_select" ) ;
if ( ! sel ) return ;
var val = read _write _sel ( sel , null ) ;
if ( ! val ) {
alert ( "You must select a configuration to edit" ) ;
return ;
}
if ( val == "New Configuration" ) {
open _editor ( ) ;
} else {
send _command ( 'config-load' , val ) ;
var ele = document . getElementById ( "config_name" ) ;
ele . value = val ;
}
}
function show _advanced ( o ) {
var tbl = find _parent ( o , "TABLE" ) ;
var row = tbl . querySelector ( ".advrow" ) ;
if ( o . value == "Show" ) {
o . value = "Hide" ;
row . style [ "display" ] = "" ;
} else {
o . value = "Show" ;
row . style [ "display" ] = "none" ;
}
}