diff --git a/build.py b/build.py index a868ce5..7356323 100644 --- a/build.py +++ b/build.py @@ -26,6 +26,7 @@ currdir = os.getcwd() DEPENDENCIES = [ 'wii', 'util', + 'console', 'remote', ] diff --git a/js/src/console.js b/js/src/console.js new file mode 100644 index 0000000..f9e2153 --- /dev/null +++ b/js/src/console.js @@ -0,0 +1,20 @@ +/** + * console.js + * + * A lightweight wrapper for the now-common "console" object in browsers. + * Really just maps calls over to the wii-js internal Wii.util.debug() call, + * but exists so that if you use this in production code for whatever reason + * it could still be used to debug on the Wii. + * + * Note that for this to work, you must be listening in debug mode! + * + * @Author: Ryan McGrath + * @Requires: wii.js, util.js + */ + +if(typeof window.console === 'undefined') { + window.console = { + log: Wii.util.debug, + debug: Wii.util.debug + }; +} diff --git a/js/src/util.js b/js/src/util.js index 4c867a0..9e72241 100644 --- a/js/src/util.js +++ b/js/src/util.js @@ -31,21 +31,25 @@ Wii.util = { * try { ... } catch(e) { Wii.util.debug(e); } */ debug: function(err) { + if(!Wii.debug) return; + if(Wii.util.msgNode === null) { Wii.util.msgNode = document.createElement('div'); Wii.util.msgNode.style.cssText = [ - 'min-width: 776px;', + 'min-width: 780px;', 'padding: 10px;', 'font-size: 28px;', 'line-height: 32px;', 'font-family: monospace;', 'position: absolute;', - 'top: 20px;', + 'top: 15px;', + 'left: 0;', 'color: #f9f9f9;', 'background-color: #010101;', - 'border: 2px solid #42a2cc;', - 'opacity: .8', + 'border-bottom: 2px solid #42a2cc;', + 'opacity: .7;', + 'font-weight: bold;' ].join(''); Wii.util.msgNode.addEventListener('click', Wii.util.hideDebugger, false); diff --git a/js/wii.js b/js/wii.js index 56df455..71be9a4 100644 --- a/js/wii.js +++ b/js/wii.js @@ -381,21 +381,25 @@ Wii.util = { * try { ... } catch(e) { Wii.util.debug(e); } */ debug: function(err) { + if(!Wii.debug) return; + if(Wii.util.msgNode === null) { Wii.util.msgNode = document.createElement('div'); Wii.util.msgNode.style.cssText = [ - 'min-width: 776px;', + 'min-width: 780px;', 'padding: 10px;', 'font-size: 28px;', 'line-height: 32px;', 'font-family: monospace;', 'position: absolute;', - 'top: 20px;', + 'top: 15px;', + 'left: 0;', 'color: #f9f9f9;', 'background-color: #010101;', - 'border: 2px solid #42a2cc;', - 'opacity: .8', + 'border-bottom: 2px solid #42a2cc;', + 'opacity: .7;', + 'font-weight: bold;' ].join(''); Wii.util.msgNode.addEventListener('click', Wii.util.hideDebugger, false); @@ -436,6 +440,26 @@ Wii.util = { }; } }; +/** + * console.js + * + * A lightweight wrapper for the now-common "console" object in browsers. + * Really just maps calls over to the wii-js internal Wii.util.debug() call, + * but exists so that if you use this in production code for whatever reason + * it could still be used to debug on the Wii. + * + * Note that for this to work, you must be listening in debug mode! + * + * @Author: Ryan McGrath + * @Requires: wii.js, util.js + */ + +if(typeof window.console === 'undefined') { + window.console = { + log: Wii.util.debug, + debug: Wii.util.debug + }; +} /** * remote.js * diff --git a/js/wii.min.js b/js/wii.min.js index 3d987f2..37d6e9a 100644 --- a/js/wii.min.js +++ b/js/wii.min.js @@ -1 +1 @@ -(function(a){if(!a){return false}var b={extraRemotes:[],currentBrowsingRemote:null,setListeners:false,debug:false,primaryWiimoteEvts:["mouseup","mousedown","keyup","keydown","keypress"]};b.installListeners=function(){for(var d=0,c=b.primaryWiimoteEvts.length;d0){b.util.debug(arguments[0])}else{b.util.originalErrFunction.apply(this,arguments)}}}return true};b.listen=function(h){if(typeof h!=="undefined"){if(typeof h.debug!=="undefined"&&h.debug){b.debug=true}}if(!b.setListeners){b.setListeners=b.installListeners()}var e=b.extraRemotes.length;while(e--){var g=b.extraRemotes[e],f=g.isEnabled();if(f){if(f.isBrowsing){b.currentBrowsingRemote=g}else{g.x=f.dpdScreenX;g.y=f.dpdScreenY;for(var c in g.evtsInterestedIn){var d=b.DISPATCHER[c](g,f);if(d){g.evtsInterestedIn[c](g,f)}}}}}return setTimeout(b.listen,100)};b.parsePrimaryWiimote=function(g){g.preventDefault();var f=b.currentBrowsingRemote,d=f.isEnabled(),c=b.PRIMARY_CONTROLLER_DISPATCHER[f.opts.horizontal?"horizontal":"vertical"][g.keyCode];f.x=d.dpdScreenX;f.y=d.dpdScreenY;if(typeof c!=="undefined"&&typeof f.evtsInterestedIn[c]==="function"){f.evtsInterestedIn[c](f,d)}if(typeof f.evtsInterestedIn.roll_change==="function"){if(b.DISPATCHER.roll_change(f,d)){f.evtsInterestedIn.roll_change(f,d)}}if(typeof f.evtsInterestedIn.distance_change==="function"){if(b.DISPATCHER.distance_change(f,d)){f.evtsInterestedIn.distance_change(f,d)}}return false};b.PRIMARY_CONTROLLER_DISPATCHER={vertical:{0:"pressed_a",13:"pressed_a",170:"pressed_minus",171:"pressed_b",172:"pressed_1",173:"pressed_2",174:"pressed_plus",175:"pressed_up",176:"pressed_down",177:"pressed_right",178:"pressed_left"},horizontal:{0:"pressed_a",13:"pressed_a",170:"pressed_minus",171:"pressed_b",172:"pressed_1",173:"pressed_2",174:"pressed_plus",175:"pressed_left",176:"pressed_right",177:"pressed_up",178:"pressed_down"}};b.DISPATCHER={pressed_up:function(d,c){if(d.opts.horizontal){return c.hold&2}return c.hold&8},pressed_right:function(d,c){if(d.opts.horizontal){return c.hold&4}return c.hold&2},pressed_down:function(d,c){if(d.opts.horizontal){return c.hold&1}return c.hold&4},pressed_left:function(d,c){if(d.opts.horizontal){return c.hold&8}return c.hold&1},pressed_plus:function(d,c){return c.hold&16},pressed_minus:function(d,c){return c.hold&4096},pressed_2:function(d,c){return c.hold&256},pressed_1:function(d,c){return c.hold&512},pressed_b:function(d,c){return c.hold&1024},pressed_a:function(d,c){return c.hold&2048},roll_change:function(e,d){var c=Math.atan2(d.dpdRollY,d.dpdRollX);if(c!==e.roll){e.roll=c;return true}return false},distance_change:function(d,c){if(c.dpdDistance!==d.last_known_distance_from_screen){d.last_known_distance_from_screen=c.dpdDistance;return true}return false},pressed_z:function(d,c){return c.hold&8192},pressed_c:function(d,c){return c.hold&16384}};b.util={originalErrFunction:null,msgNode:null,debug:function(c){if(b.util.msgNode===null){b.util.msgNode=document.createElement("div");b.util.msgNode.style.cssText=["min-width: 776px;","padding: 10px;","font-size: 28px;","line-height: 32px;","font-family: monospace;","position: absolute;","top: 20px;","color: #f9f9f9;","background-color: #010101;","border: 2px solid #42a2cc;","opacity: .8",].join("");b.util.msgNode.addEventListener("click",b.util.hideDebugger,false);document.body.appendChild(b.util.msgNode)}if(typeof c==="string"){b.util.msgNode.innerHTML=c}else{var f="";for(var d in c){f+=''+d+"="+c[d]+"
"}b.util.msgNode.innerHTML=f}b.util.msgNode.style.display="block"},hideDebugger:function(){this.style.display="none"},bind:function(c,d){return function(){return d.apply(c,arguments)}}};b.Remote=function(e,d){this.remote_id=e;this.opts=d;this.x=undefined;this.y=undefined;this.roll=undefined;this.last_known_distance_from_screen=undefined;var c=this.isEnabled();if(c){if(!c.isBrowsing){b.extraRemotes.push(this)}else{b.currentBrowsingRemote=this}}};b.Remote.prototype={opts:{horizontal:false},evtsInterestedIn:undefined,isEnabled:function(){var c=opera.wiiremote.update(this.remote_id-1);return(c.isEnabled&&c.isDataValid?c:false)},when:function(d,c){if(typeof b.DISPATCHER[d]!=="undefined"){if(this.evtsInterestedIn===undefined){this.evtsInterestedIn={}}this.evtsInterestedIn[d]=b.util.bind(this,c);return this}return undefined}};window.Wii=b})(window.opera&&opera.wiiremote); \ No newline at end of file +(function(a){if(!a){return false}var b={extraRemotes:[],currentBrowsingRemote:null,setListeners:false,debug:false,primaryWiimoteEvts:["mouseup","mousedown","keyup","keydown","keypress"]};b.installListeners=function(){for(var d=0,c=b.primaryWiimoteEvts.length;d0){b.util.debug(arguments[0])}else{b.util.originalErrFunction.apply(this,arguments)}}}return true};b.listen=function(h){if(typeof h!=="undefined"){if(typeof h.debug!=="undefined"&&h.debug){b.debug=true}}if(!b.setListeners){b.setListeners=b.installListeners()}var e=b.extraRemotes.length;while(e--){var g=b.extraRemotes[e],f=g.isEnabled();if(f){if(f.isBrowsing){b.currentBrowsingRemote=g}else{g.x=f.dpdScreenX;g.y=f.dpdScreenY;for(var c in g.evtsInterestedIn){var d=b.DISPATCHER[c](g,f);if(d){g.evtsInterestedIn[c](g,f)}}}}}return setTimeout(b.listen,100)};b.parsePrimaryWiimote=function(g){g.preventDefault();var f=b.currentBrowsingRemote,d=f.isEnabled(),c=b.PRIMARY_CONTROLLER_DISPATCHER[f.opts.horizontal?"horizontal":"vertical"][g.keyCode];f.x=d.dpdScreenX;f.y=d.dpdScreenY;if(typeof c!=="undefined"&&typeof f.evtsInterestedIn[c]==="function"){f.evtsInterestedIn[c](f,d)}if(typeof f.evtsInterestedIn.roll_change==="function"){if(b.DISPATCHER.roll_change(f,d)){f.evtsInterestedIn.roll_change(f,d)}}if(typeof f.evtsInterestedIn.distance_change==="function"){if(b.DISPATCHER.distance_change(f,d)){f.evtsInterestedIn.distance_change(f,d)}}return false};b.PRIMARY_CONTROLLER_DISPATCHER={vertical:{0:"pressed_a",13:"pressed_a",170:"pressed_minus",171:"pressed_b",172:"pressed_1",173:"pressed_2",174:"pressed_plus",175:"pressed_up",176:"pressed_down",177:"pressed_right",178:"pressed_left"},horizontal:{0:"pressed_a",13:"pressed_a",170:"pressed_minus",171:"pressed_b",172:"pressed_1",173:"pressed_2",174:"pressed_plus",175:"pressed_left",176:"pressed_right",177:"pressed_up",178:"pressed_down"}};b.DISPATCHER={pressed_up:function(d,c){if(d.opts.horizontal){return c.hold&2}return c.hold&8},pressed_right:function(d,c){if(d.opts.horizontal){return c.hold&4}return c.hold&2},pressed_down:function(d,c){if(d.opts.horizontal){return c.hold&1}return c.hold&4},pressed_left:function(d,c){if(d.opts.horizontal){return c.hold&8}return c.hold&1},pressed_plus:function(d,c){return c.hold&16},pressed_minus:function(d,c){return c.hold&4096},pressed_2:function(d,c){return c.hold&256},pressed_1:function(d,c){return c.hold&512},pressed_b:function(d,c){return c.hold&1024},pressed_a:function(d,c){return c.hold&2048},roll_change:function(e,d){var c=Math.atan2(d.dpdRollY,d.dpdRollX);if(c!==e.roll){e.roll=c;return true}return false},distance_change:function(d,c){if(c.dpdDistance!==d.last_known_distance_from_screen){d.last_known_distance_from_screen=c.dpdDistance;return true}return false},pressed_z:function(d,c){return c.hold&8192},pressed_c:function(d,c){return c.hold&16384}};b.util={originalErrFunction:null,msgNode:null,debug:function(c){if(!b.debug){return}if(b.util.msgNode===null){b.util.msgNode=document.createElement("div");b.util.msgNode.style.cssText=["min-width: 780px;","padding: 10px;","font-size: 28px;","line-height: 32px;","font-family: monospace;","position: absolute;","top: 15px;","left: 0;","color: #f9f9f9;","background-color: #010101;","border-bottom: 2px solid #42a2cc;","opacity: .7;","font-weight: bold;"].join("");b.util.msgNode.addEventListener("click",b.util.hideDebugger,false);document.body.appendChild(b.util.msgNode)}if(typeof c==="string"){b.util.msgNode.innerHTML=c}else{var f="";for(var d in c){f+=''+d+"="+c[d]+"
"}b.util.msgNode.innerHTML=f}b.util.msgNode.style.display="block"},hideDebugger:function(){this.style.display="none"},bind:function(c,d){return function(){return d.apply(c,arguments)}}};if(typeof window.console==="undefined"){window.console={log:b.util.debug,debug:b.util.debug}}b.Remote=function(e,d){this.remote_id=e;this.opts=d;this.x=undefined;this.y=undefined;this.roll=undefined;this.last_known_distance_from_screen=undefined;var c=this.isEnabled();if(c){if(!c.isBrowsing){b.extraRemotes.push(this)}else{b.currentBrowsingRemote=this}}};b.Remote.prototype={opts:{horizontal:false},evtsInterestedIn:undefined,isEnabled:function(){var c=opera.wiiremote.update(this.remote_id-1);return(c.isEnabled&&c.isDataValid?c:false)},when:function(d,c){if(typeof b.DISPATCHER[d]!=="undefined"){if(this.evtsInterestedIn===undefined){this.evtsInterestedIn={}}this.evtsInterestedIn[d]=b.util.bind(this,c);return this}return undefined}};window.Wii=b})(window.opera&&opera.wiiremote); \ No newline at end of file diff --git a/readme.md b/readme.md index dabb6db..dc0bbcc 100644 --- a/readme.md +++ b/readme.md @@ -17,6 +17,10 @@ To play with a live example, load up the demo (_index.html_) on your own server, **wii-js Demo: [http://venodesigns.net/wii/](http://venodesigns.net/wii/)** +Working with the Wii's browser can be odd - it has moderately good support for CSS, so you're never really +as bad off as you'd be with a version of Internet Explorer - that said, if you're looking for a good read +on what's supported, check out **[this article on Opera Wii supported technologies](http://www.opera.com/docs/specs/opera9/?platform=wii)**. + Questions, comments, criticism and praise can be directed to me at the following outlets: - You can email me at **ryan [at] venodesigns (dot) net**. @@ -102,7 +106,7 @@ isn't able to see the TV/sensor bar, so be sure to check this! of the current webpage + toolbar height, if enabled. Tinker with this one for your purposes. -Extra Tips and Tricks +Extra Tips and Tricks (Debugging) ------------------------------------------------------------------------------------------------------------------ One semi-useful trick to point out about this library is that each of your callback functions get passed two arguments by default - a reference to the Wiimote you're working with, and the raw Wiimote status object that the @@ -118,19 +122,30 @@ wiimote.when('pressed_a', function(wii_remote, wii_remote_status) { }); ``` -Debugging Javascript on the Wii is also nothing short of incredibly annoying, so I've included a convenience function -for running through error messages. My typical debugging strategy with any Wii-related code would always start with -the following: +Debugging Javascript on the Wii is also nothing short of incredibly annoying, so I've made some efforts to patch this +up and make life a bit earier. My typical debugging strategy with any Wii-related code would always start with +the following. The first thing to do is set the Wii listener to run in debug mode, like so: + +``` javascript +Wii.listen({debug: true}); +``` + +With this set, you can log errors with any of the following functions. `error` can be a string or a complex object. + +- **console.log(error);** - Tried and true, now supported. +- **console.debug(error);** - Same as console.log here, but syntax is supported. +- **throw new Error(error);** - Throw them, they'll be logged. +- **Wii.util.debug(error);** - The core function that handles logging internally. + +If the typical Wii debugging flow isn't enough for you, go aggressive with this - just be aware that you can crash +the Wii's browser if you're using try/catch all over the place, as it's not cheap in Javascript. ``` javascript try { - // Whatever function I execute + // Whatever function to execute } catch(e) { Wii.util.debug(e); } ``` -The rate at which this function will improve is commensurate with how much more time and effort I can afford to put -into this project. Feel free to fork/patch/enhance if you need more. ;) - Why the button limitations? ------------------------------------------------------------------------------------------------------------------