// // // const LOCO_F_REVERSE = 0x0001; const LOCO_F_CARGO = 0x0010; const LOCO_F_CANREVERSE = 0x0020; const LOCO_F_SHORTTRAIN = 0x0040; const LOCO_F_AUTO = 0x0100; const LOCO_F_RANDOM = 0x0200; const LOCO_F_AUTOSTOP = 0x0400; var locomotives = []; // // update or add a new element // function locomotive_Update(data) { for (var i = 0; i < locomotives.length; i++) { if (data.name == locomotives[i].name) { debug ("Update Locomotive:" + locomotives[i].name + " with Locomotive:" + data.name); locomotives[i].name = data.name; locomotives[i].ifname = data.ifname; locomotives[i].addr = data.addr; locomotives[i].stepcode = data.stepcode; if (data.speed) locomotives[i].speed = data.speed; locomotives[i].vmin = data.vmin; locomotives[i].vslow = data.vslow; locomotives[i].vmid = data.vmid; locomotives[i].vfast = data.vfast; locomotives[i].vmax = data.vmax; locomotives[i].flags = data.flags; if (data.blockassign) locomotives[i].blockassign = data.blockassign; if (data.blockprev) locomotives[i].blockprev = data.blockprev; if (data.blocknext) locomotives[i].blocknext = data.blocknext; if (data.blockdest) locomotives[i].blockdest = data.blockdest; if (data.auto_way) locomotives[i].auto_way = data.auto_way; locodetail_setData(locomotives[i]); lococtrl_setData(data); return; } } // not found add element debug ("Add Locomotive:" + data.name); locomotives.push ({ name: data.name, ifname: data.ifname, addr: data.addr, stepcode: data.stepcode, vmin: data.vmin, vslow: data.vslow, speed: data.speed, vmid: data.vmid, vfast: data.vfast, vmax: data.vmax, flags: data.flags, blockassign: data.blockassign, blockdest: data.blockdest, blocknext: data.blocknext, blockprev: data.blockprev, auto_way: data.auto_way }); }; // // delete element from the list // in arrays we can not delete just an element, so we create a new one // and replace this one. // function locomotive_Delete(name) { var l = new Array(); for (var i = 0; i < locomotives.length; i++) { if (name != locomotives[i].name) { l.push (locomotives[i]); } } // clear list and replace list with new data. locomotives.lenght = 0; locomotives = l; }; // // send new element to server // function locomotive_server_Add(elm) { var request = { command: "addlocomotive", locomotive: elm }; serverinout (request, serverinout_defaultCallback); }; // // send delete element to server // function locomotive_server_Del(elm) { var request = { command: "dellocomotive", locomotive: elm }; serverinout (request, serverinout_defaultCallback); }; // // send locomotive assignment to server (is blockname is empty clear assignment) // function locomotive_server_Assign(locname, blockname, reverse) { var request = { command: "locomotiveassign", locomotive: locname, block: blockname, reverse: reverse }; serverinout (request, serverinout_defaultCallback); }; // // set locomotive destination to server (is blockname is empty clear assignment) // function locomotive_server_Dest(locname, blockname, reverse) { var request = { command: "locomotivedestination", locomotive: locname, block: blockname, reverse: reverse }; serverinout (request, serverinout_defaultCallback); }; // // send delete element to server // function locomotive_server_Set(elm) { var request = { command: "setlocomotive", locomotive: elm }; serverinout (request, serverinout_defaultCallback); }; function locodetail_show(loconame) { var win = document.getElementById("locodetail"); debug ("locodetail_show"); if (!win) { debug ("loco_showdetail create window"); win = gWindowCreate("locodetail", "Locomotive", 450, 500, "
\ Name: \
\ \ \


\
\ Interface: \ Adress: \ Flags: \

\
\
\
\
\
\
\
\
\
\
\ \
Speed \
\ \ \ \ \ \ \
Stop
Vmin:
Vslow:
Vmid:
Vfast:
Vmax:
Current:
\ \
\
Code \
\
\
\
\ \
Block \ \ \ \ \ \
Assined:
Destination:
Next:
Prev:
Auto:
\ \ \

\
\ \ \ \
\ \ "); gAddEventListener("locodet_btnvstop", 'click', locodetail_cb_btnmove); gAddEventListener("locodet_btnvmin", 'click', locodetail_cb_btnmove); gAddEventListener("locodet_btnvslow", 'click', locodetail_cb_btnmove); gAddEventListener("locodet_btnvmid", 'click', locodetail_cb_btnmove); gAddEventListener("locodet_btnvfast", 'click', locodetail_cb_btnmove); gAddEventListener("locodet_btnvmax", 'click', locodetail_cb_btnmove); gAddEventListener("locodet_reverse", 'click', locodetail_cb_reverse); gAddEventListener("locodet_canreverse", 'click', locodetail_cb_canreverse); gAddEventListener("locodet_short", 'click', locodetail_cb_short); gAddEventListener("locodet_cargo", 'click', locodetail_cb_cargo); gAddEventListener("locodet_RESET", 'click', locodetail_cb_reset); gAddEventListener("locodet_TEST", 'click', locodetail_cb_test); // gAddEventListener("locodet_DCC14", 'click', locodetail_cb_stepcode); // gAddEventListener("locodet_DCC28", 'click', locodetail_cb_stepcode); // gAddEventListener("locodet_DCC128", 'click', locodetail_cb_stepcode); gAddEventListener("locodet_CLOSE", 'click', locodetail_cb_close); gAddEventListener("locodet_DELETE", 'click', locodetail_cb_delete); gAddEventListener("locodet_SAVE", 'click', locodetail_cb_save); gAddEventListener("locodet_NEXT", 'click', locodetail_cb_next); gAddEventListener("locodet_PREV", 'click', locodetail_cb_prev); } // // load default values var res = { name: "", ifname: "", addr: "", flags: 0, steps: "", vmin: "20", vslow: "40", vmid:"60", vfast:"80", vmax:"100" }; locodetail_setData(res); if (loconame) { for (var i = 0; i < locomotives.length; i++) { if (loconame == locomotives[i].name) locodetail_setData(locomotives[i]); } } }; // // reverse selected, setup flags function locodetail_cb_reverse () { var cbreverse = document.getElementById("locodet_reverse"); var flags = document.getElementById("locodet_flags"); if (cbreverse.checked) { flags.value = Number(flags.value) | LOCO_F_REVERSE; } else { flags.value = Number(flags.value) & (0xFFFF-LOCO_F_REVERSE); } }; // // canreverse selected, setup flags function locodetail_cb_canreverse () { var cbreverse = document.getElementById("locodet_canreverse"); var flags = document.getElementById("locodet_flags"); if (cbreverse.checked) { flags.value = Number(flags.value) | LOCO_F_CANREVERSE; } else { flags.value = Number(flags.value) & (0xFFFF-LOCO_F_CANREVERSE); } }; function locodetail_cb_reset (element) { var loco = document.getElementById("locodet_name"); if (loco.value) { var request = { command: "locomotivereset", locomotive: loco.value }; serverinout (request, serverinout_defaultCallback); } }; function locodetail_cb_test (element) { var loco = document.getElementById("locodet_name"); if (loco.value) { var request = { command: "locomotivetest", locomotive: loco.value }; serverinout (request, serverinout_defaultCallback); } }; // // canreverse selected, setup flags function locodetail_cb_short () { var flag = document.getElementById("locodet_short"); var flags = document.getElementById("locodet_flags"); if (flag.checked) { flags.value = Number(flags.value) | LOCO_F_SHORTTRAIN; } else { flags.value = Number(flags.value) & (0xFFFF-LOCO_F_SHORTTRAIN); } }; // // cargo selected, setup flags function locodetail_cb_cargo () { var cbcargo = document.getElementById("locodet_cargo"); var flags = document.getElementById("locodet_flags"); if (cbcargo .checked) { flags.value = Number(flags.value) | LOCO_F_CARGO; } else { flags.value = Number(flags.value) & (0xFFFF-LOCO_F_CARGO); } }; function locodetail_cb_btnmove () { var win = document.getElementById("locodetail"); var loco_name = document.getElementById("locodet_name"); var loco_vmin = document.getElementById("locodet_vmin"); var loco_vslow = document.getElementById("locodet_vslow"); var loco_vmid = document.getElementById("locodet_vmid"); var loco_vfast = document.getElementById("locodet_vfast"); var loco_vmax = document.getElementById("locodet_vmax"); var loco_reverse = document.getElementById("locodet_reverse"); var speed = 0; if (this.value == "vmin") speed = Number(loco_vmin.value); if (this.value == "vslow") speed = Number(loco_vslow.value); if (this.value == "vmid") speed = Number(loco_vmid.value); if (this.value == "vfast") speed = Number(loco_vfast.value); if (this.value == "vmax") speed = Number(loco_vmax.value); if (loco_reverse.checked) { speed = 0 - speed; } locomotive_server_Set ({name: loco_name.value, speed: speed}); debug ("Locomotive: '" + loco_name.value +"' Speed: " + speed); }; function locodetail_cb_close () { var win = document.getElementById("locodetail"); if (win) document.body.removeChild(win); }; // // Callback: Delete Button // function locodetail_cb_delete () { var elm = {}; elm = locodetail_getData(); locomotive_Delete(elm.name); locomotive_server_Del(elm); }; // // Callback: Save Button // function locodetail_cb_save () { var elm = {}; elm = locodetail_getData(); locomotive_Update(elm); locomotive_server_Add(elm); }; // // Callback: Next Button // function locodetail_cb_next () { var cursel = -1; var loconame = document.getElementById("locodet_name"); for (var i = 0; i < locomotives.length; i++) { if (loconame.value == locomotives[i].name) cursel = i; } cursel = cursel + 1; if (cursel >= locomotives.length) cursel = 0; if (cursel < 0) cursel = 0; for (var i = 0; i < locomotives.length; i++) { if (i == cursel) locodetail_setData(locomotives[i]); } debug ("Cursel: " + cursel + " locomotives.lenght:" + locomotives.length); }; // // Callback: Prev Button // function locodetail_cb_prev () { var cursel = -1; var loconame = document.getElementById("locodet_name"); for (var i = 0; i < locomotives.length; i++) { if (loconame.value == locomotives[i].name) cursel = i; } cursel = cursel - 1; if (cursel < 0 || cursel >= locomotives.length) cursel = locomotives.length - 1; for (var i = 0; i < locomotives.length; i++) { if (i == cursel) locodetail_setData(locomotives[i]); } debug ("Cursel: " + cursel + " locomotives.lenght:" + locomotives.length); }; // // fill out all the elements on the dialogbox // function locodetail_setData(elm) { var loco_name = document.getElementById("locodet_name"); var loco_ifname = document.getElementById("locodet_ifname"); var loco_addr = document.getElementById("locodet_addr"); var loco_speed = document.getElementById("locodet_speed"); var loco_flags = document.getElementById("locodet_flags"); var loco_vmin = document.getElementById("locodet_vmin"); var loco_vslow = document.getElementById("locodet_vslow"); var loco_vmid = document.getElementById("locodet_vmid"); var loco_vfast = document.getElementById("locodet_vfast"); var loco_vmax = document.getElementById("locodet_vmax"); var loco_reverse = document.getElementById("locodet_reverse"); var loco_canreverse = document.getElementById("locodet_canreverse"); var loco_short = document.getElementById("locodet_short"); var loco_cargo = document.getElementById("locodet_cargo"); var loco_auto = document.getElementById("locodet_auto"); var loco_random = document.getElementById("locodet_random"); var loco_blockassign = document.getElementById("locodet_blockassign"); var loco_blockdest = document.getElementById("locodet_blockdest"); var loco_blocknext = document.getElementById("locodet_blocknext"); var loco_blockprev = document.getElementById("locodet_blockprev"); var loco_auto_way = document.getElementById("locodet_auto_way"); if (elm) { if (loco_name) loco_name.value = elm.name; if (loco_ifname) loco_ifname.value = elm.ifname; if (loco_flags) loco_flags.value = elm.flags; if (loco_addr) loco_addr.value = elm.addr; if (loco_speed) loco_speed.value = elm.speed; if (loco_vmin) loco_vmin.value = elm.vmin; if (loco_vslow) loco_vslow.value = elm.vslow; if (loco_vmid) loco_vmid.value = elm.vmid; if (loco_vfast) loco_vfast.value = elm.vfast; if (loco_vmax) loco_vmax.value = elm.vmax; if (loco_reverse) { if (Number(elm.flags) & LOCO_F_REVERSE) loco_reverse.checked = true; else loco_reverse.checked = false; } if (loco_canreverse) { if (Number(elm.flags) & LOCO_F_CANREVERSE) loco_canreverse.checked = true; else loco_canreverse.checked = false; } if (loco_short) { if (Number(elm.flags) & LOCO_F_SHORTTRAIN) loco_short.checked = true; else loco_short.checked = false; } if (loco_cargo) { if (Number(elm.flags) & LOCO_F_CARGO) loco_cargo.checked = true; else loco_cargo.checked = false; } if (loco_auto) { if (Number(elm.flags) & LOCO_F_AUTO) loco_auto.checked = true; else loco_auto.checked = false; } if (loco_random) { if (Number(elm.flags) & LOCO_F_RANDOM) loco_random.checked = true; else loco_random.checked = false; } if (loco_blockassign) loco_blockassign.value = elm.blockassign; if (loco_blockdest) loco_blockdest.value = elm.blockdest; if (loco_blocknext) loco_blocknext.value = elm.blocknext; if (loco_blockprev) loco_blockprev.value = elm.blockprev; if (loco_auto_way) loco_auto_way.value = elm.auto_way; } var codes = document.getElementsByName('STEPCODE'); for(var i = 0; i < codes.length; i++) { // debug ("STEPCODE: elm.stepcode: " + elm.stepcode + " i:" + i + " codes[i].value: " + codes[i].value + " codes.id: " + codes[i].id); if(elm.stepcode == codes[i].value) codes[i].checked = true; else codes[i].checked = false; } }; // // return all elements from the dialogbox // function locodetail_getData() { var res = { name: "", ifname: "", addr: "", flags: 0, stepcode:"0", vmin: "20", vslow: "40", vmid:"60", vfast:"80", vmax:"100" }; var codes = document.getElementsByName('STEPCODE'); for(var i = 0; i < codes.length; i++){ if(codes[i].checked){ res.stepcode = codes[i].value; } } var loco_name = document.getElementById("locodet_name"); var loco_ifname = document.getElementById("locodet_ifname"); var loco_flags = document.getElementById("locodet_flags"); var loco_addr = document.getElementById("locodet_addr"); var loco_vmin = document.getElementById("locodet_vmin"); var loco_vslow = document.getElementById("locodet_vslow"); var loco_vmid = document.getElementById("locodet_vmid"); var loco_vfast = document.getElementById("locodet_vfast"); var loco_vmax = document.getElementById("locodet_vmax"); var loco_speed = document.getElementById("locodet_speed"); if (loco_name) res.name = loco_name.value; if (loco_ifname) res.ifname = loco_ifname.value; if (loco_flags) res.flags = loco_flags.value; if (loco_addr) res.addr = loco_addr.value; if (loco_vmin) res.vmin = loco_vmin.value; if (loco_vslow) res.vslow = loco_vslow.value; if (loco_vmid) res.vmid = loco_vmid.value; if (loco_vfast) res.vfast = loco_vfast.value; if (loco_vmax) res.vmax = loco_vmax.value; if (loco_speed) res.speed = loco_speed.speed; return res; }; // *********************************************************************************************** // *********************************************************************************************** // locolist: show a list of locomotives. // // *********************************************************************************************** // *********************************************************************************************** function locolist_show() { var win = document.getElementById("locolist"); debug ("locolist_show"); if (!win) { debug ("locolist_show create window"); win = gWindowCreate("locolist", "Locomotives", 400, 500, " \
\ \
\
\ \
\ \ "); gAddEventListener("locolist_CLOSE", 'click', locolist_cb_close); } var ul = document.getElementById("locolist_elements"); // // clear list ul.innerHTML = ""; // // append all locomotives for (var i = 0; i < locomotives.length; i++) { let li = document.createElement("li"); li.appendChild(document.createTextNode(locomotives[i].name)); li.setAttribute("id", "locol_elm_"+locomotives[i].name); ul.appendChild(li); gAddEventListener("locol_elm_"+locomotives[i].name, 'click', locolist_clicked); } }; function locolist_clicked() { var i; debug ("childnodes: " + this.childNodes[0].textContent); lococtrl_show(this.childNodes[0].textContent); }; function locolist_cb_close () { var win = document.getElementById("locolist"); if (win) document.body.removeChild(win); }; // *********************************************************************************************** // *********************************************************************************************** // locoshow: show controls for a loco loco_NAME // // *********************************************************************************************** // *********************************************************************************************** function lococtrl_show(name) { var win = document.getElementById("lococtrl_"+name); var i; debug ("lococtrl_show:" + name); if (!win) { debug ("locolist_show create window"); win = gWindowCreate("lococtrl_"+name, "Loco:"+name, 600, 600, " \
\
Speed
\ \ \
\ \
\ \ \ \ \ \ \
\
\
Control\ \ \ \ \ \ \ \ \ \ \ \ \ \
\
\
\ \
\ \ "); gAddEventListener("lococtrl_"+name+"_btnvstop", 'click', lococtrl_cb_btnmove); gAddEventListener("lococtrl_"+name+"_btnvmin", 'click', lococtrl_cb_btnmove); gAddEventListener("lococtrl_"+name+"_btnvslow", 'click', lococtrl_cb_btnmove); gAddEventListener("lococtrl_"+name+"_btnvmid", 'click', lococtrl_cb_btnmove); gAddEventListener("lococtrl_"+name+"_btnvfast", 'click', lococtrl_cb_btnmove); gAddEventListener("lococtrl_"+name+"_btnvmax", 'click', lococtrl_cb_btnmove); gAddEventListener("lococtrl_"+name+"_btnreset", 'click', lococtrl_cb_btnreset); gAddEventListener("lococtrl_"+name+"_btnman", 'click', lococtrl_cb_btnman); gAddEventListener("lococtrl_"+name+"_btnstopman", 'click', lococtrl_cb_btnstopman); gAddEventListener("lococtrl_"+name+"_btnauto", 'click', lococtrl_cb_btnauto); gAddEventListener("lococtrl_"+name+"_btnrand", 'click', lococtrl_cb_btnrand); gAddEventListener("lococtrl_"+name+"_RANGE", 'click', lococtrl_speed); gAddEventListener("lococtrl_"+name+"_REVBTN", 'click', lococtrl_reverse); gAddEventListener("lococtrl_"+name+"_CLOSE", 'click', lococtrl_close); } for (var i = 0; i < locomotives.length; i++) { if (name == locomotives[i].name) lococtrl_setData(locomotives[i]); } }; function lococtrl_cb_btnreset() { var name = getTextBetween(this.id, "lococtrl_", "_btnreset"); var request = { command: "locomotivereset", locomotive: name }; serverinout (request, serverinout_defaultCallback); }; function lococtrl_cb_btnman() { var name = getTextBetween(this.id, "lococtrl_", "_btnman"); var request = { command: "locomotivesetman", locomotive: name }; serverinout (request, serverinout_defaultCallback); }; function lococtrl_cb_btnstopman() { var name = getTextBetween(this.id, "lococtrl_", "_btnstopman"); var request = { command: "locomotivesetautoman", locomotive: name }; serverinout (request, serverinout_defaultCallback); }; function lococtrl_cb_btnauto() { var name = getTextBetween(this.id, "lococtrl_", "_btnauto"); var request = { command: "locomotivesetauto", locomotive: name }; serverinout (request, serverinout_defaultCallback); }; function lococtrl_cb_btnrand() { var name = getTextBetween(this.id, "lococtrl_", "_btnauto"); var request = { command: "locomotivesetautorand", locomotive: name }; serverinout (request, serverinout_defaultCallback); }; function lococtrl_reverse() { var name = getTextBetween(this.id, "lococtrl_", "_REVBTN"); var reverse; for (var i = 0; i < locomotives.length; i++) { if (name == locomotives[i].name) { if (locomotives[i].flags & 1) { reverse = 0; this.innerHTML = "FWD"; } else { reverse = 1; this.innerHTML = "REV"; } locomotive_server_Set ({name: name, reverse: reverse}); } } }; function lococtrl_cb_btnmove () { var name = getTextBetween(this.id, "lococtrl_", "_btn" + this.value); var reverse = document.getElementById("lococtrl_"+name+"_REVBTN"); var cursel = -1; var speed = 0; for (var i = 0; i < locomotives.length; i++) { if (name == locomotives[i].name) cursel = i; } if (cursel == -1) return; if (this.value == "vmin") speed = Number(locomotives[cursel].vmin); if (this.value == "vslow") speed = Number(locomotives[cursel].vslow); if (this.value == "vmid") speed = Number(locomotives[cursel].vmid); if (this.value == "vfast") speed = Number(locomotives[cursel].vfast); if (this.value == "vmax") speed = Number(locomotives[cursel].vmax); if (reverse.innerHTML == "REV") speed = 0 - speed; locomotive_server_Set ({name: name, speed: speed}); debug ("Locomotive: '" + name +"' Speed: " + speed); }; function lococtrl_speed() { var name = getTextBetween(this.id, "lococtrl_", "_RANGE"); var reverse = document.getElementById("lococtrl_"+name+"_REVBTN"); let speed = this.value; if (reverse.innerHTML == "REV") speed = 0 - speed; debug ("Speed Loco:'"+name+"' Speed:'"+speed+"'"); for (var i = 0; i < locomotives.length; i++) { if (name == locomotives[i].name) { locomotive_server_Set ({name: name, speed: speed}); } } }; function lococtrl_setData(data) { var range = document.getElementById("lococtrl_"+data.name+"_RANGE"); var reverse = document.getElementById("lococtrl_"+data.name+"_REVBTN"); var cbauto = document.getElementById("lococtrl_"+data.name+"_cbauto"); var cbrand = document.getElementById("lococtrl_"+data.name+"_cbrand"); var cbmanstop = document.getElementById("lococtrl_"+data.name+"_cbstopman"); if (range && reverse) { debug ("lococtrl: " + data.name + " speed:" + data.speed + " vmax:" + data.vmax + " flags:" + data.flags); if (data.flags & LOCO_F_REVERSE) reverse.innerHTML = "REV"; else reverse.innerHTML = "FWD"; cbauto.checked = (data.flags & LOCO_F_AUTO); cbrand.checked = (data.flags & LOCO_F_RANDOM); cbmanstop.checked = (data.flags & LOCO_F_AUTOSTOP); range.min = 0; if (data.vmax) range.max = data.vmax; range.value = Math.abs(Number(data.speed)); } }; function lococtrl_close() { debug ("LocoCtrl_close:" + this.value); var win = document.getElementById("lococtrl_"+this.value); if (win) document.body.removeChild(win); };