Enhance debugging utilities for developers

This commit is contained in:
Ryan McGrath 2011-07-11 08:29:39 -04:00
parent 372cd854b1
commit 319bdaf885
4 changed files with 215 additions and 53 deletions

133
js/wii.js
View file

@ -46,31 +46,86 @@ var Wii = {
* through on each loop/iteration and poll for a new status on it.
*/
extraRemotes: [],
/**
* A "global" reference to the (current) primary Wiimote. This can change if the
* primary Wiimote runs out of battery, and the library shoul transparently account
* for this.
*/
currentBrowsingRemote: null,
setKeyListeners: false,
debuggerDiv: null
/**
* Internal flag for whether or not we've actually set some document event listeners.
* A little messy, sure, but not the biggest guffaw in the world.
*/
setListeners: false,
/**
* A global debug flag. If this is enabled/set to true, any errors raised will be thrown
* up on the screen for the Wii. Should be set when the initial .listen() request is fired.
*
* e.g, Wii.listen({debug: true});
*/
debug: false,
/**
* The primary Wiimote depends on typical DOM-esque events to communicate what actions it's
* doing, and the other three use a whole bitmask-esque scenario. This is a "global" Array of
* the events we're interested in for the primary Wiimote.
*
* We catch multiple begin/endpoints for these full event "scopes" for
* future use, as it seems like it'll probably be the most performant way
* to do rapid-quick checks for the primary Wii-mote as to multiple-button
* press scenarios (among some other things).
*/
primaryWiimoteEvts: ['mouseup', 'mousedown', 'keyup', 'keydown', 'keypress'],
};
/**
* Wii.installListeners()
*
* Install some basic low-level event listeners to monitor how
* the primary wii_remote is interacting with the browser; it's treated
* differently than the other wii_remotes, more as a "browsing" tool than
* a controller. Doesn't mean we can't try and mend the gap...
*/
Wii.installKeyListeners = function() {
document.addEventListener('mouseup', Wii.parsePrimaryWiimote, false);
document.addEventListener('keydown', Wii.parsePrimaryWiimote, false);
document.addEventListener('mousedown', Wii.parsePrimaryWiimote, false);
document.addEventListener('keyup', Wii.parsePrimaryWiimote, false);
Wii.installListeners = function() {
for(var i = 0, j = Wii.primaryWiimoteEvts.length; i < j; i++) {
document.addEventListener(Wii.primaryWiimoteEvts[i], Wii.parsePrimaryWiimote, false);
}
/**
* Some keys, like the directional ones, get... multiple events?
* In this case, just shut. down. everything.
*
* ...and let the programmer deal with it.
* Since the Wii is already a fairly low-spec system, it's definitely worth
* cleaning up after ourselves if we can get around to it. This should (hopefully)
* take care of most of what we need to worry about.
*/
document.addEventListener('keypress', Wii.parsePrimaryWiimote, false);
window.onbeforeunload = function() {
for(var i = 0, j = Wii.primaryWiimoteEvts.length; i < j; i++) {
document.removeEventListener(Wii.primaryWiimoteEvts[i], Wii.parsePrimaryWiimote, false);
}
};
/**
* If this is all listening in debug mode, we wanna try and catch everything that could
* possibly go wrong in the stack. try/catch is very expensive for the entire program, and can
* crash the Wii pretty easily if you push it too much.
*
* What we'll do instead is just patch the seemingly un-documented window.Error function to suit our
* debugging needs, and only try/catch while in debug mode in critical places (e.g, the constant polling
* section would be... yeah, not a fun idea).
*
* With this, "throw new Error(error)" will actually hit over to what we want, and anything else (outside code)
* using it will get the on-screen Wii debug which is actually useful. That's why we bother doing this, instead
* of just calling Wii.util.debug() everywhere. ;)
*/
if(Wii.debug) {
Wii.util.originalErrFunction = window.Error;
window.Error = function() {
if(arguments.length > 0) Wii.util.debug(arguments[0]);
else Wii.util.originalErrFunction.apply(this, arguments);
}
}
return true;
};
@ -80,8 +135,12 @@ Wii.installKeyListeners = function() {
* The main game loop. This must stay very performant; try to keep things as absolutely
* low-level as possible here.
*/
Wii.listen = function() {
if(!Wii.setKeyListeners) Wii.setKeyListeners = Wii.installKeyListeners();
Wii.listen = function(optional_opts) {
if(typeof optional_opts !== 'undefined') {
if(typeof optional_opts.debug !== 'undefined' && optional_opts.debug) Wii.debug = true;
}
if(!Wii.setListeners) Wii.setListeners = Wii.installListeners();
var i = Wii.extraRemotes.length;
@ -298,6 +357,19 @@ Wii.DISPATCHER = {
*/
Wii.util = {
/**
* A placeholder for the original Error function, since we pretty much overwrite it to actually
* be useful to us. See "Wii.installListeners()" for more information on this.
*/
originalErrFunction: null,
/**
* Upon first call to Wii.util.debug(), this becomes a div that we keep
* a reference to. It's primarily used for logging information to the screen
* on the Wii itself.
*/
msgNode: null,
/**
* Wii.util.debug(err);
*
@ -307,37 +379,46 @@ Wii.util = {
* try { ... } catch(e) { Wii.util.debug(e); }
*/
debug: function(err) {
if(Wii.debuggerDiv === null) {
Wii.debuggerDiv = document.createElement('div');
if(Wii.util.msgNode === null) {
Wii.util.msgNode = document.createElement('div');
Wii.debuggerDiv.style.cssText = [
'width: 90%;',
'height: 90%;',
Wii.util.msgNode.style.cssText = [
'min-width: 756px;',
'padding: 10px;',
'font-size: 26px;',
'font-size: 28px;',
'line-height: 32px;',
'font-family: monospace;',
'overflow: scroll',
'position: absolute;',
'top: 10px;',
'left: 10px;',
'color: #f9f9f9;',
'background-color: #010101;'
'background-color: rgba(44, 44, 44, .7);',
'border: 2px solid #42a2cc;'
].join('');
document.body.appendChild(Wii.debuggerDiv);
Wii.util.msgNode.addEventListener('click', Wii.util.hideDebugger, false);
document.body.appendChild(Wii.util.msgNode);
}
if(typeof err === 'string') {
Wii.debuggerDiv.innerHTML = err;
} else {
var msg = '';
for(var e in err) { msg += e + '=' + err[e] + '<br>'; }
for(var e in err) { msg += '<span style="color: #42a2cc; font-weight: bold;">' + e + '</span>=' + err[e] + '<br>'; }
Wii.debuggerDiv.innerHTML = msg;
}
Wii.debuggerDiv.style.display = 'block';
},
/**
* Wii.util.hideDebugger()
*
* Keep this around so we've got an easy reference to use for proper unloading
* of event handlers once someone leaves this page.
*/
hideDebugger: function() { this.style.display = 'none'; },
/**
* Wiimote.util.bind(bindReference, fn)
*