// // // const LOCO_F_REVERSE = 1; 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; 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; 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, steps: data.steps, vmin: data.vmin, vslow: data.vslow, speed: data.speed, vmid: data.vmid, vfast: data.vfast, vmax: data.vmax, flags: data.flags }); }; // // 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 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", 400, 500, " \
\ Name: \
\ \ \


\
\ Interface: \ Adress: \ Flags: \

\
\
\
Speed \ \ \ \ \ \ \
Stop
Vmin:
Vslow:
Vmid:
Vfast:
Vmax:
\
Code \
\
\
\
\ Speed:
\ \

\
\ \ \ \
\ \ "); 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_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) | 1; } else { flags.value = Number(flags.value) & (0xFFFF-1); } }; 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"); 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) & 1) loco_reverse.checked = true; else loco_reverse.checked = false; } } 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 // // 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, 200, 500, " \
\ Speed:
\
\ \
\
\
\
\ \
\ \ "); 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_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_speed() { var name = getTextBetween(this.id, "lococtrl_", "_RANGE"); var reverse = document.getElementById("lococtrl_"+name+"_REVBTN"); let speed = this.value; if (reverse.innerHTML == "REV") speed = -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"); if (range && reverse) { debug ("lococtrl: speed:" + data.speed + " vmax:" + data.vmax + " flags:" + data.flags); if (data.flags & LOCO_F_REVERSE) reverse.innerHTML = "REV"; else reverse.innerHTML = "FWD"; range.min = 0; if (data.vmax) range.max = data.vmax; if (data.speed) range.value = Math.abs(data.speed); } }; function lococtrl_close() { debug ("LocoCtrl_close:" + this.value); var win = document.getElementById("lococtrl_"+this.value); if (win) document.body.removeChild(win); };