blob: 532e00e707ed2d94b7463eecd399e5b36f3d63a5 [file] [log] [blame]
// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
var consoleManager = null;
function start() {
window.consoleManager = new ConsoleManager();
}
window.addEventListener('load', start);
function ConsoleManager() {
// Handles communication with the debugger.
this.debuggerClient = new DebuggerClient();
// Number of animation frame samples since the last update.
this.animationFrameSamples = 0;
// A list of all the possible interactive consoles.
// Each item contains the mode and the reference to the actual console.
this.consoleRegistry = null;
this.initializeConsoles();
document.addEventListener('keydown', this.handleKeydown.bind(this));
document.addEventListener('keyup', this.handleKeyup.bind(this));
document.addEventListener('keypress', this.handleKeypress.bind(this));
document.addEventListener('wheel', this.handleWheel.bind(this));
document.addEventListener('input', this.handleInput.bind(this));
if (typeof window.onScreenKeyboard != 'undefined'
&& window.onScreenKeyboard) {
window.onScreenKeyboard.onInput = this.handleInput.bind(this);
}
window.requestAnimationFrame(this.animate.bind(this));
}
ConsoleManager.prototype.initializeConsoles = function() {
this.consoleRegistry = [
{
console: new DebugConsole(this.debuggerClient),
mode: 'debug',
bodyClass: 'debugConsole hud',
},
{
console: new MediaConsole(this.debuggerClient),
mode: 'media',
bodyClass: 'mediaConsole',
},
];
this.hudConsole = this.consoleRegistry[0].console;
this.consoleRegistry.forEach( entry => {
let ensureConsolesAreValid = function(method) {
if(typeof entry.console[method] != "function") {
console.warn(`Console "${entry.mode}" ${method}() is not implemented. \
Providing default empty implementation.`);
// Provide a default not-implemented warning message.
let consoleName = entry.mode;
let notImplementedMessage = function() {
console.log(
`Console "${consoleName}" ${method}() is not implemented.`);
};
entry.console[method] = notImplementedMessage;
}
};
ensureConsolesAreValid("update");
ensureConsolesAreValid("setVisible");
ensureConsolesAreValid("onKeydown");
ensureConsolesAreValid("onKeyup");
ensureConsolesAreValid("onKeypress");
ensureConsolesAreValid("onInput");
ensureConsolesAreValid("onWheel");
});
}
ConsoleManager.prototype.update = function() {
let mode = window.debugHub.getDebugConsoleMode();
if (mode !== 'off') {
this.debuggerClient.attach();
}
let activeConsole = this.getActiveConsole();
let bodyClass = '';
if (mode == 'hud') {
bodyClass = 'hud';
// The HUD is owned by the debug console, but since it has its own mode
// dedicated to it, it needs to be specifically updated when it is visible.
// TODO: Factor out hudConsole into its own console.
this.hudConsole.updateHud();
} else if (mode != 'off' && mode != 'hud') {
bodyClass = activeConsole.bodyClass;
}
document.body.className = bodyClass;
this.consoleRegistry.forEach((entry) => {
entry.console.setVisible(entry == activeConsole);
});
if (mode !== 'off') {
if (activeConsole) { activeConsole.console.update(); }
}
}
// Animation callback: updates state and animated nodes.
ConsoleManager.prototype.animate = function(time) {
const subsample = 8;
this.animationFrameSamples = (this.animationFrameSamples + 1) % subsample;
if (this.animationFrameSamples == 0) {
this.update();
}
window.requestAnimationFrame(this.animate.bind(this));
}
ConsoleManager.prototype.getActiveConsole = function() {
let mode = window.debugHub.getDebugConsoleMode();
return this.consoleRegistry.find( entry => entry.mode === mode );
}
ConsoleManager.prototype.handleKeydown = function(event) {
// Map of 'Unidentified' additional Cobalt keyCodes to equivalent keys.
const unidentifiedCobaltKeyMap = {
// kSbKeyGamepad1
0x8000: 'Enter',
// kSbKeyGamepad2
0x8001: 'Esc',
// kSbKeyGamepad3
0x8002: 'Home',
// kSbKeyGamepad5
0x8008: 'Enter',
// kSbKeyGamepad6
0x8009: 'Enter',
// kSbKeyGamepadDPadUp
0x800C: 'ArrowUp',
// kSbKeyGamepadDPadDown
0x800D: 'ArrowDown',
// kSbKeyGamepadDPadLeft
0x800E: 'ArrowLeft',
// kSbKeyGamepadDPadRight
0x800F: 'ArrowRight',
// kSbKeyGamepadLeftStickUp
0x8011: 'ArrowUp',
// kSbKeyGamepadLeftStickDown
0x8012: 'ArrowDown',
// kSbKeyGamepadLeftStickLeft
0x8013: 'ArrowLeft',
// kSbKeyGamepadLeftStickRight
0x8014: 'ArrowRight',
// kSbKeyGamepadRightStickUp
0x8015: 'ArrowUp',
// kSbKeyGamepadRightStickDown
0x8016: 'ArrowDown',
// kSbKeyGamepadRightStickLeft
0x8017: 'ArrowLeft',
// kSbKeyGamepadRightStickRight
0x8018: 'ArrowRight'
};
let key = event.key;
if (key == 'Unidentified') {
key = unidentifiedCobaltKeyMap[event.keyCode] || 'Unidentified';
}
let active = this.getActiveConsole();
if (active) { active.console.onKeydown(event); }
}
ConsoleManager.prototype.handleKeyup = function(event) {
let active = this.getActiveConsole();
if (active) { active.console.onKeyup(event); }
}
ConsoleManager.prototype.handleKeypress = function(event) {
let active = this.getActiveConsole();
if (active) { active.console.onKeypress(event); }
}
ConsoleManager.prototype.handleInput = function(event) {
let active = this.getActiveConsole();
if (active) { active.console.onInput(event); }
}
ConsoleManager.prototype.handleWheel = function(event) {
let active = this.getActiveConsole();
if (active) { active.console.onWheel(event); }
}