export class ManualInput {
/**
* A ManualInput is an input device that will transmit any state you manually set from a Javascript API. It's a strictly better {@link NullInput}, that works on any environment while still giving you a way to trigger some events when you need to.
*
* @constructor
* @implements {Input}
*
* @param {object} [options] - The device options.
* @param {object} [options.codeMap] - The initial code map.
*/
constructor({ codeMap = null } = {}) {
/**
* This value contains the current code map used to translate codes.
*
* @member
* @readonly
* @type {object}
*/
this.codeMap = null;
this.devices = {};
this.pending = {};
this.setCodeMap(codeMap);
}
/**
* Set the code map that will be used to translate input codes from one to another.
*
* @param {object} codeMap - The new input map.
*/
setCodeMap(codeMap) {
if (codeMap === this.codeMap)
return;
this.codeMap = codeMap;
}
/**
* Set an input slot as being pressed.
*
* @param {number} port - The input slot controller port.
* @param {number} code - The input slot code.
*/
down(port, code) {
if (this.codeMap)
code = this.codeMap[code];
this.pending[port] = this.pending[port] || {};
this.pending[port][code] = true;
}
/**
* Set an input slot as being released.
*
* @param {number} port - The input slot controller port.
* @param {number} code - The input slot code.
*/
up(port, code) {
if (this.codeMap)
code = this.codeMap[code];
this.pending[port] = this.pending[port] || {};
this.pending[port][code] = false;
}
pollInputs() {
let pending = this.pending;
this.pending = {};
for (let port of Reflect.ownKeys(pending)) {
for (let code of Reflect.ownKeys(pending[port])) {
this.devices[port] = this.devices[port] || {};
this.devices[port][code] = pending[port][code];
}
}
}
getState(port, code) {
return Boolean(this.devices[port] && this.devices[port][code]);
}
}