1
0
mirror of https://github.com/pkimpel/retro-220.git synced 2026-01-11 23:52:46 +00:00
pkimpel.retro-220/webUI/B220CardatronControl.js

311 lines
12 KiB
JavaScript

/***********************************************************************
* retro-220/webUI B220CardatronControl.js
************************************************************************
* Copyright (c) 2017, Paul Kimpel.
* Licensed under the MIT License, see
* http://www.opensource.org/licenses/mit-license.php
************************************************************************
* Burroughs 220 Cardatron Control object.
************************************************************************
* 2017-05-19 P.Kimpel
* Original version, from retro-205 D205CardatronControl.js.
***********************************************************************/
"use strict";
/**************************************/
function B220CardatronControl(p) {
/* Constructor for the CardatronControl object */
var left = 600; // left window margin
var u; // unit config object
var x; // unit index
this.config = p.config; // System configuration object
this.mnemonic = "CCU";
this.p = p; // B220Processor object
// Do not call this.clear() here -- call from onLoad instead
this.doc = null;
this.window = null;
B220Util.openPopup(window, "../webUI/B220CardatronControl.html", this.mnemonic,
"location=no,scrollbars=no,resizable,width=140,height=140,left=" + left +
",top=" + (screen.availHeight-140),
this, B220CardatronControl.prototype.cardatronOnLoad);
// Set up the I/O devices from the system configuration
this.inputUnit = [
null, // no input unit 0
null, // input unit 1
null, // input unit 2
null, // input unit 3
null, // input unit 4
null, // input unit 5
null, // input unit 6
null]; // input unit 7
this.outputUnit = [
null, // no output unit 0
null, // output unit 1
null, // output unit 2
null, // output unit 3
null, // output unit 4
null, // output unit 5
null, // output unit 6
null]; // output unit 7
for (x=7; x>0; --x) {
u = this.config.getNode("Cardatron.units", x);
switch (u.type.substring(0, 2)) {
case "CR":
this.inputUnit[x] = new B220CardatronInput(u.type, x, this.config);
this.outputUnit[8-x] = null;
break;
case "CP":
case "LP":
this.inputUnit[x] = null;
this.outputUnit[8-x] = new B220CardatronOutput(u.type, x, this.config);
break;
default:
this.inputUnit[x] = null;
this.outputUnit[8-x] = null;
break;
} // switch u.type
} // for x
}
/**************************************/
B220CardatronControl.prototype.$$ = function $$(e) {
return this.doc.getElementById(e);
};
/**************************************/
B220CardatronControl.prototype.clear = function clear() {
/* Initializes the panel state */
this.bufferReadLamp.set(0);
this.bufferWriteLamp.set(0);
this.formatLoadLamp.set(0);
this.outputUnitLamp.set(0);
this.setUnitDesignateLamps(0);
this.setRelayDesignateLamps(0);
};
/**************************************/
B220CardatronControl.prototype.setUnitDesignateLamps = function setUnitDesignateLamps(unit) {
/* Sets the UD lamps on the panel from the low-order three bits of "unit" */
this.unitDesignate1Lamp.set(unit & 0x01);
this.unitDesignate2Lamp.set((unit >>> 1) & 0x01);
this.unitDesignate4Lamp.set((unit >>> 2) & 0x01);
};
/**************************************/
B220CardatronControl.prototype.setRelayDesignateLamps = function setRelayDesignateLamps(mask) {
/* Sets the RD lamps on the panel from the low-order four bits of "mask" */
this.relayDesignate1Lamp.set(mask & 0x01);
this.relayDesignate2Lamp.set((mask >>> 1) & 0x01);
this.relayDesignate4Lamp.set((mask >>> 2) & 0x01);
this.relayDesignate8Lamp.set((mask >>> 3) & 0x01);
};
/**************************************/
B220CardatronControl.prototype.ClearBtn_onClick = function ClearBtn_onClick(ev) {
/* Handle the click event for the CLEAR button, which will clear the
Cardatron Control state */
this.clear();
};
/**************************************/
B220CardatronControl.prototype.beforeUnload = function beforeUnload(ev) {
var msg = "Closing this window will make the panel unusable.\n" +
"Suggest you stay on the page and minimize this window instead";
ev.preventDefault();
ev.returnValue = msg;
return msg;
};
/**************************************/
B220CardatronControl.prototype.cardatronOnLoad = function cardatronOnLoad(ev) {
/* Initializes the Cardatron Control window and user interface */
var body;
var box;
var e;
var x;
this.doc = ev.target;
this.window = this.doc.defaultView;
body = this.$$("PanelSurface");
this.bufferReadLamp = new NeonLampBox(body, null, null, "BufferReadLamp");
this.bufferReadLamp.setCaption("BR", true);
this.bufferWriteLamp = new NeonLampBox(body, null, null, "BufferWriteLamp");
this.bufferWriteLamp.setCaption("BW", true);
this.formatLoadLamp = new NeonLampBox(body, null, null, "FormatLoadLamp");
this.formatLoadLamp.setCaption("FL", true);
this.outputUnitLamp = new NeonLampBox(body, null, null, "OutputUnitLamp");
this.outputUnitLamp.setCaption("OU", true);
this.unitDesignate4Lamp = new NeonLampBox(body, null, null, "UnitDesignate4Lamp");
this.unitDesignate4Lamp.setCaption("UD4", true);
this.unitDesignate2Lamp = new NeonLampBox(body, null, null, "UnitDesignate2Lamp");
this.unitDesignate2Lamp.setCaption("UD2", true);
this.unitDesignate1Lamp = new NeonLampBox(body, null, null, "UnitDesignate1Lamp");
this.unitDesignate1Lamp.setCaption("UD1", true);
this.relayDesignate8Lamp = new NeonLampBox(body, null, null, "RelayDesignate8Lamp");
this.relayDesignate8Lamp.setCaption("RD8", true);
this.relayDesignate4Lamp = new NeonLampBox(body, null, null, "RelayDesignate4Lamp");
this.relayDesignate4Lamp.setCaption("RD4", true);
this.relayDesignate2Lamp = new NeonLampBox(body, null, null, "RelayDesignate2Lamp");
this.relayDesignate2Lamp.setCaption("RD2", true);
this.relayDesignate1Lamp = new NeonLampBox(body, null, null, "RelayDesignate1Lamp");
this.relayDesignate1Lamp.setCaption("RD1", true);
// Events
this.window.addEventListener("beforeunload", B220CardatronControl.prototype.beforeUnload, false);
this.$$("ClearBtn").addEventListener("click",
B220CardatronControl.prototype.ClearBtn_onClick.bind(this), false);
this.clear();
this.window.moveTo(this.window.screenX, screen.availHeight - this.window.outerHeight);
};
/**************************************/
B220CardatronControl.prototype.inputInitiate = function inputInitiate(unitNr, rDigit, wordSender) {
/* Initiates the read from one of the Cardatron input devices.
Returns 0 if device exists and the I/O was initiated; returns -1 if device
not present */
this.bufferReadLamp.set(1);
this.bufferWriteLamp.set(0);
this.formatLoadLamp.set(0);
this.outputUnitLamp.set(0);
this.setRelayDesignateLamps(0);
this.setUnitDesignateLamps(unitNr);
if (!this.inputUnit[unitNr]) {
return -1; // just terminate the I/O
} else {
this.inputUnit[unitNr].inputInitiate(rDigit, wordSender);
return 0;
}
};
/**************************************/
B220CardatronControl.prototype.inputReadyInterrogate = function inputReadyInterrogate(unitNr) {
/* Interrogates the ready status of a Cardatron input device.
Returns -1 if device not present, 0 if device not ready, 1 if device is ready */
this.setUnitDesignateLamps(unitNr);
if (!this.inputUnit[unitNr]) {
return -1;
} else {
return (this.inputUnit[unitNr].inputReadyInterrogate() ? 1 : 0);
}
};
/**************************************/
B220CardatronControl.prototype.inputFormatInitiate = function inputFormatInitiate(
unitNr, rDigit, requestNextWord, signalFinished) {
/* Initiates loading a format band for one of the Cardatron input devices.
Returns 0 if device exists and the I/O was initiated; returns -1 if device
not present */
this.bufferReadLamp.set(0);
this.bufferWriteLamp.set(0);
this.formatLoadLamp.set(1);
this.outputUnitLamp.set(0);
this.setRelayDesignateLamps(0);
this.setUnitDesignateLamps(unitNr);
if (!this.inputUnit[unitNr]) {
return -1; // just terminate the I/O
} else {
this.inputUnit[unitNr].inputFormatInitiate(rDigit, requestNextWord, signalFinished);
return 0;
}
};
/**************************************/
B220CardatronControl.prototype.outputInitiate = function outputInitiate(
unitNr, fDigit, cDigit, requestNextWord, signalFinished) {
/* Initiates writing to one of the Cardatron output devices.
Returns 0 if device exists and the I/O was initiated; returns -1 if device
not present */
this.bufferReadLamp.set(0);
this.bufferWriteLamp.set(1);
this.formatLoadLamp.set(0);
this.outputUnitLamp.set(1);
this.setRelayDesignateLamps(cDigit);
this.setUnitDesignateLamps(unitNr);
if (!this.outputUnit[unitNr]) {
return -1; // just terminate the I/O
} else {
this.outputUnit[unitNr].outputInitiate(fDigit, cDigit, requestNextWord, signalFinished);
return 0;
}
};
/**************************************/
B220CardatronControl.prototype.outputReadyInterrogate = function outputReadyInterrogate(unitNr) {
/* Interrogates the ready status of a Cardatron output device.
Returns -1 if device not present, 0 if device not ready, 1 if device is ready */
this.setUnitDesignateLamps(unitNr);
if (!this.outputUnit[unitNr]) {
return -1; // just terminate the I/O
} else {
return (this.outputUnit[unitNr].outputReadyInterrogate() ? 1 : 0);
}
};
/**************************************/
B220CardatronControl.prototype.outputFormatInitiate = function outputFormatInitiate(
unitNr, fDigit, requestNextWord, signalFinished) {
/* Initiates loading a format band for one of the Cardatron output devices.
Returns 0 if device exists and the I/O was initiated; returns -1 if device
not present */
this.bufferReadLamp.set(0);
this.bufferWriteLamp.set(0);
this.formatLoadLamp.set(1);
this.outputUnitLamp.set(1);
this.setRelayDesignateLamps(0);
this.setUnitDesignateLamps(unitNr);
if (!this.outputUnit[unitNr]) {
return -1; // just terminate the I/O
} else {
this.outputUnit[unitNr].outputFormatInitiate(fDigit, requestNextWord, signalFinished);
return 0;
}
};
/**************************************/
B220CardatronControl.prototype.shutDown = function shutDown() {
/* Shuts down the panel */
var x;
if (this.inputUnit) {
for (x=this.inputUnit.length-1; x>=0; --x) {
if (this.inputUnit[x]) {
this.inputUnit[x].shutDown();
this.inputUnit[x] = null;
}
}
}
if (this.outputUnit) {
for (x=this.outputUnit.length-1; x>=0; --x) {
if (this.outputUnit[x]) {
this.outputUnit[x].shutDown();
this.outputUnit[x] = null;
}
}
}
this.window.removeEventListener("beforeunload", B220CardatronControl.prototype.beforeUnload, false);
this.window.close();
};