<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Last Ray of Hope &#187; Apple</title>
	<atom:link href="http://www.lastrayofhope.com/tag/apple/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lastrayofhope.com</link>
	<description>Home of Kaluriel Hargrove</description>
	<lastBuildDate>Thu, 02 Feb 2012 00:21:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Website Updates</title>
		<link>http://www.lastrayofhope.com/2011/07/26/website-updates/</link>
		<comments>http://www.lastrayofhope.com/2011/07/26/website-updates/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 02:13:28 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Accelerate]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Vector]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3827</guid>
		<description><![CDATA[I made some updates to a couple of entries I did a while ago. Fixed an error in my syntax where I calculated the reciprocal, but then divided by the reciprocal instead of multiplying. I also changed the entries to show equivalent functions instead of my bad descriptions of what the parameters do. iOS4 Vector and Matrix [...]]]></description>
			<content:encoded><![CDATA[<p>I made some updates to a couple of entries I did a while ago. Fixed an error in my syntax where I calculated the reciprocal, but then divided by the reciprocal instead of multiplying.</p>
<p>I also changed the entries to show equivalent functions instead of my bad descriptions of what the parameters do.</p>
<p><a title="iOS4 Vector and Matrix Math" href="http://www.lastrayofhope.com/2011/03/31/ios4-vector-and-matrix-math/">iOS4 Vector and Matrix Math</a></p>
<p><a title="iOS4 Vector and Matrix Math: Part 2" href="http://www.lastrayofhope.com/2011/04/10/ios4-vector-and-matrix-math-part-2/">iOS4 Vector and Matrix Math: Part 2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/07/26/website-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS OpenGL ES Extension Support</title>
		<link>http://www.lastrayofhope.com/2011/07/24/ios-opengl-es-extension-support/</link>
		<comments>http://www.lastrayofhope.com/2011/07/24/ios-opengl-es-extension-support/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 04:26:21 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[OpenGLES]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3779</guid>
		<description><![CDATA[This weekend I was adding improved extension support to the Athena engine for iOS. There is a page on the Apple site that tells what device has what extensions but it hasn't been updated since iOS 4.2. So I ran through each version of GLES on a 1st Generate iPod Touch (MBX), an iPhone 4 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2011/07/Screen-shot-2011-07-24-at-05.17.56.png"><img class="alignleft size-thumbnail wp-image-3780" style="border-width: 1px; border-color: black; border-style: solid;" title="Supported iOS OpenGL ES Extensions" src="http://www.lastrayofhope.com/wp-content/uploads/2011/07/Screen-shot-2011-07-24-at-05.17.56-150x150.png" alt="Supported iOS OpenGL ES Extensions" width="150" height="150" /></a>This weekend I was adding improved extension support to the Athena engine for iOS. There is a page on the Apple site that tells what device has what extensions but it hasn't been updated since iOS 4.2.</p>
<p>So I ran through each version of GLES on a 1st Generate iPod Touch (MBX), an iPhone 4 (SGX) and an iPad 2 (A5), printing the returned string from glGetString( GL_EXTENSIONS ) for each device.</p>
<p>There are a some new extensions in iOS5, some of which are iPad2 specific. But you can see from the image, each newer device supports all the previous extensions.</p>
<p>I haven't had chance to run it on an iPad1 yet, so it will be interesting to see if there is any difference. I've only wrote a rough idea of what version of what SDK is required to use them.</p>
<p><strong>Anything with '***' does not need the extension to work and has an implementation for that version of OpenGL ES.</strong></p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-collapsed"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: none;"><pre class="c" style="font-family:monospace;">GL_OES_depth_texture
GL_OES_blend_equation_separate
GL_OES_blend_func_separate
GL_OES_blend_subtract
GL_OES_compressed_paletted_texture
GL_OES_depth24
GL_OES_draw_texture
GL_OES_element_index_uint
GL_OES_fbo_render_mipmap
GL_OES_framebuffer_object
GL_OES_mapbuffer
GL_OES_matrix_palette
GL_OES_packed_depth_stencil
GL_OES_point_size_array
GL_OES_point_sprite
GL_OES_read_format
GL_OES_rgb8_rgba8
GL_OES_stencil_wrap
GL_OES_stencil8
GL_OES_texture_mirrored_repeat
GL_OES_vertex_array_object
GL_OES_standard_derivatives
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
&nbsp;
GL_EXT_blend_minmax
GL_EXT_color_buffer_half_float
GL_EXT_debug_label
GL_EXT_debug_marker
GL_EXT_discard_framebuffer
GL_EXT_occlusion_query_boolean
GL_EXT_read_format_bgra
GL_EXT_separate_shader_objects
GL_EXT_shader_texture_lod
GL_EXT_shadow_samplers
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_lod_bias
GL_EXT_texture_rg				
&nbsp;
GL_APPLE_framebuffer_multisample
GL_APPLE_rgb_422
GL_APPLE_texture_2D_limited_npot
GL_APPLE_texture_format_BGRA8888
GL_APPLE_texture_max_level	
&nbsp;
GL_IMG_read_format
GL_IMG_texture_compression_pvrtc</pre></div></div>
<p>For more information on each extension, most of them can be <a href="http://www.khronos.org/registry/gles/" target="_blank">viewed here</a>. Some of the newer ones in the EXT namespace are viewable on the what's new page of the beta for iOS5, though the page calls them by the APPLE namespace still.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/07/24/ios-opengl-es-extension-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPad 2</title>
		<link>http://www.lastrayofhope.com/2011/06/30/ipad-2/</link>
		<comments>http://www.lastrayofhope.com/2011/06/30/ipad-2/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 00:03:04 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPad]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3635</guid>
		<description><![CDATA[I recently got an iPad 2, and the first thing I did after connecting it to iTunes was to upgrade it to iOS5. After I did, iTunes gave me the error "This device is not registered as part of the iPhone Developer Program". This is easily fixed, all I needed to do was log into [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2011/06/ipad-2_.jpg"><img class="alignleft size-thumbnail wp-image-3636" style="border: 1px solid black;" title="iPad2" src="http://www.lastrayofhope.com/wp-content/uploads/2011/06/ipad-2_-150x150.jpg" alt="iPad2" width="150" height="150" /></a>I recently got an iPad 2, and the first thing I did after connecting it to iTunes was to upgrade it to iOS5. After I did, iTunes gave me the error "This device is not registered as part of the iPhone Developer Program".</p>
<p>This is easily fixed, all I needed to do was log into the developer portal and add the device UDID, however the screen telling me this was preventing me from getting the UDID.</p>
<p>Eventually I managed to retrieve it from the Organiser in XCode. Glad I didn't brick it in less than 8 hours, I can now play around with airplay once I've flashed my AppleTV.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/06/30/ipad-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS Vector and Matrix Math: Part 2</title>
		<link>http://www.lastrayofhope.com/2011/04/10/ios4-vector-and-matrix-math-part-2/</link>
		<comments>http://www.lastrayofhope.com/2011/04/10/ios4-vector-and-matrix-math-part-2/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 13:10:27 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Accelerate]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Vector]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3268</guid>
		<description><![CDATA[Continuing on from my previous post iOS Vector and Matrix Math. I have managed to use matrix multiplication to transform a vector. Vector Transform Transforms a vector by a matrix]]></description>
			<content:encoded><![CDATA[<p>Continuing on from my previous post <a title="iOS4 Vector and Matrix Math" href="http://www.lastrayofhope.com/2011/03/31/ios4-vector-and-matrix-math/">iOS Vector and Matrix Math</a>. I have managed to use matrix multiplication to transform a vector.</p>
<p><strong>Vector Transform</strong></p>
<p>Transforms a vector by a matrix</p>
<div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw4">float</span> matrix<span class="br0">&#91;</span>16<span class="br0">&#93;</span> <span class="sy1">=</span>
<span class="br0">&#123;</span>
	1.0f, 2.0f, 3.0f, 4.0f,
	7.0f, 6.0f, 9.0f, 10.0f,
	11.0f, 12.0f, 13.0f, 14.0f,
	15.0f, 16.0f, 17.0f, 18.0f
<span class="br0">&#125;</span><span class="sy4">;</span>
<span class="kw4">float</span> vectorIn<span class="br0">&#91;</span>4<span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#123;</span> 1.0f, 1.0f, 0.0f, 1.0f <span class="br0">&#125;</span><span class="sy4">;</span>
<span class="kw4">float</span> vectorOut<span class="br0">&#91;</span>4<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp;
vDSP_mmul<span class="br0">&#40;</span> <span class="sy3">&amp;</span>vectorIn<span class="br0">&#91;</span>0<span class="br0">&#93;</span>, 1, <span class="sy3">&amp;</span>matrix<span class="br0">&#91;</span>0<span class="br0">&#93;</span>, 1, <span class="sy3">&amp;</span>vectorOut<span class="br0">&#91;</span>0<span class="br0">&#93;</span>, 1, 1, 4, 4 <span class="br0">&#41;</span><span class="sy4">;</span></pre></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/04/10/ios4-vector-and-matrix-math-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS Vector and Matrix Math</title>
		<link>http://www.lastrayofhope.com/2011/03/31/ios4-vector-and-matrix-math/</link>
		<comments>http://www.lastrayofhope.com/2011/03/31/ios4-vector-and-matrix-math/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 01:32:22 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Accelerate]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Vector]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=3188</guid>
		<description><![CDATA[Continued on post iOS Vector and Matrix Math: Part 2. For the past week or two I've been trying to reproduce the water effect of PixelJunk Shooter on the iPhone, however I seem to have reached a bottleneck with the collision detection used for repulsion when compressing. I tried changing from Length to Length Squared, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2011/03/LegoHazmat.jpg"><img class="alignleft size-thumbnail wp-image-3199" title="Lego Hazmat" src="http://www.lastrayofhope.com/wp-content/uploads/2011/03/LegoHazmat-150x150.jpg" alt="LEGO Hazmat" width="150" height="150" /></a>Continued on post <a title="iOS4 Vector and Matrix Math: Part 2" href="http://www.lastrayofhope.com/2011/04/10/ios4-vector-and-matrix-math-part-2/">iOS Vector and Matrix Math: Part 2</a>.</p>
<p>For the past week or two I've been trying to reproduce the water effect of PixelJunk Shooter on the iPhone, however I seem to have reached a bottleneck with the collision detection used for repulsion when compressing.</p>
<p>I tried changing from Length to Length Squared, to Manhattan Distance, but it still grinded my framerate to 1FPS.</p>
<p>I decided to see if the Accelerate Framework in the iOS SDK had the vector math added to it yet, and to my surprise it had. It may have been added a while ago and I missed it. So I began to replace my math functions with the vector ones.</p>
<p>The strides are for the single precision functions are the number of floats. So for a stride of 8 bytes, you need to use 2.</p>
<div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_3"></a><a id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3"  onClick="javascript:wpsh_toggleBlock(3)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_3" onClick="javascript:wpsh_code(3)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_print(3)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw4">float</span> vec<span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp;
vDSP_vclr<span class="br0">&#40;</span> <span class="sy3">&amp;</span>vec<span class="br0">&#91;</span>0<span class="br0">&#93;</span>, 1, 2 <span class="br0">&#41;</span><span class="sy4">;</span></pre></div></div>
<p>This function sets the contents of a vector to zero. The equivalent function would be this</p>
<div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdt_4" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_4"></a><a id="wpshat_4" class="wp-synhighlighter-title" href="#codesyntax_4"  onClick="javascript:wpsh_toggleBlock(4)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_4" onClick="javascript:wpsh_code(4)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_4" onClick="javascript:wpsh_print(4)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="kw4">void</span> vDSP_vclr<span class="br0">&#40;</span> <span class="kw4">float</span> <span class="sy2">*</span> inVec, <span class="kw4">const</span> <span class="kw4">int</span> inStride, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">int</span> inCount <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">unsigned</span> <span class="kw4">int</span> idx <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> idx <span class="sy1">&lt;</span> inCount<span class="sy4">;</span> <span class="sy2">++</span>idx <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="sy2">*</span>inVec <span class="sy1">=</span> <span class="nu17">0.0f</span><span class="sy4">;</span>
		inVec <span class="sy2">+</span><span class="sy1">=</span> inStride<span class="sy4">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>I haven't used the double precision version of the vector library yet so I don't know if the stride is the count of doubles, or of floats.</p>
<p>I have managed to go from 17 FPS for 650 particles to 30 FPS (I originally had it at 300 particles at 30FPS but it turned out I was profiling in debug). A definite improvement from using the Accelerate library functions for 2d vector math. One of my main issues for getting 1FPS originally was I was island producer was hit testing each particle with itself so it always had the maximum number of particles on each island.</p>
<p>The next couple of pages on this post cover some of the functions (vector and matrix) and their equivalent C++ function.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2011/03/31/ios4-vector-and-matrix-math/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Catalyst</title>
		<link>http://www.lastrayofhope.com/2009/08/09/catalyst/</link>
		<comments>http://www.lastrayofhope.com/2009/08/09/catalyst/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 09:50:57 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Catalyst]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Nintendo DS]]></category>
		<category><![CDATA[Objective-c]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=2740</guid>
		<description><![CDATA[Whilst working on animation support for Athena for Courage, I began working on a game for the iPhone called Catalyst last weekend. I was thinking about a game I had played about a month or two before called Polygonal Fury, and realised it would port nicely onto the iPhone. So I started a OpenGL ES [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2009/08/catalyst-01.png"><img class="alignleft size-medium wp-image-2736" title="Catalyst Title Screen" src="http://www.lastrayofhope.com/wp-content/uploads/2009/08/catalyst-01-300x157.png" alt="Catalyst Title Screen" width="180" height="94" /></a></p>
<p>Whilst working on animation support for Athena for Courage, I began working on a game for the iPhone called Catalyst last weekend.</p>
<p>I was thinking about a game I had played about a month or two before called <a href="http://www.kongregate.com/games/DogInLake/polygonal-fury" target="_blank">Polygonal Fury</a>, and realised it would port nicely onto the iPhone.</p>
<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2009/08/catalyst-02.png"><img class="alignright size-medium wp-image-2737" title="Catalyst - A circle explodes" src="http://www.lastrayofhope.com/wp-content/uploads/2009/08/catalyst-02-300x157.png" alt="Catalyst - A circle explodes" width="180" height="94" /></a>So I started a OpenGL ES project (and discovered the new version of the iPhone supports shaders), and started with just making some circles bounce around.</p>
<p>Since the collision of a circle is easy, they seems the easiest to setup for interaction with touching the screen.</p>
<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2009/08/catalyst-03.png"><img class="alignleft size-medium wp-image-2738" title="Catalyst - A chain reaction" src="http://www.lastrayofhope.com/wp-content/uploads/2009/08/catalyst-03-300x158.png" alt="Catalyst - A chain reaction" width="180" height="95" /></a>Initially I just made them "die" if tapped, but later I added the ability of shapes to spawn reactions.</p>
<p>All sprites within the game are triangle fans, but I will probably change them to quads with a texture due to the break that occasionally appears in the geometry, and alpha glow around the edge.</p>
<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2009/08/catalyst-04.png"><img class="alignright size-medium wp-image-2739" title="Catalyst - Still three &quot;clicks&quot; left" src="http://www.lastrayofhope.com/wp-content/uploads/2009/08/catalyst-04-300x158.png" alt="Catalyst - Still three &quot;clicks&quot; left" width="180" height="95" /></a>It is not much, but it is a start, I plan to add some more particle types, and maybe a few different upgrades than the ones giving in the Flash version.</p>
<p>The background needs changing, I was thinking of something going on in the background like in another Flash game I played, <a href="http://www.kongregate.com/games/2DArray/spewer" target="_blank">Spewer</a>, with maybe cut scenes like the Nintendo DS game Contact had.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2009/08/09/catalyst/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Athena: Wiimote and Mac OS X</title>
		<link>http://www.lastrayofhope.com/2009/07/01/athena-wiimote-and-mac-os-x/</link>
		<comments>http://www.lastrayofhope.com/2009/07/01/athena-wiimote-and-mac-os-x/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 00:33:23 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Bluetooth]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[HID]]></category>
		<category><![CDATA[MacBook]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Nintendo]]></category>
		<category><![CDATA[Wii]]></category>
		<category><![CDATA[Wiimote]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=2531</guid>
		<description><![CDATA[Since solving the problem of the rumbling on the XBox 360 pad, I've grown bored of it, and decided to branch out trying to get more controllers working in my engine. So a few days ago I started with the Wiimote, I had planned to try to the PS3 controller but I didn't have one, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2009/07/wedisk_wiimote_usb_drive1.jpg"><img class="alignleft size-medium wp-image-2532" title="Wiimote USB Drives" src="http://www.lastrayofhope.com/wp-content/uploads/2009/07/wedisk_wiimote_usb_drive1-300x221.jpg" alt="Wiimote USB Drives" width="180" height="133" /></a>Since solving the problem of the rumbling on the XBox 360 pad, I've grown bored of it, and decided to branch out trying to get more controllers working in my engine.</p>
<p>So a few days ago I started with the Wiimote, I had planned to try to the PS3 controller but I didn't have one, so borrowing one of my housemates Wiimotes I set to work.</p>
<p>There is quite a lot of documentation on the Wiimote at the moment, whether it is the correct way to do things is questionable, since there are cases like "1? - it is set to 1 by the Wii" and "set this to 0x55 at memory address X and set to 0x00 at memory address Y to enable it".</p>
<p>I started with website called <a href="http://wiki.wiimoteproject.com/" target="_blank">The Wiimote Project</a>, but as their documentation grew scarce I found a better site (which it seemed to copy it all from anyways) called <a href="http://wiibrew.org/" target="_blank">WiiBrew</a>. The WiiBrew wiki is quite comprehensive and within a few minutes I already had the LEDs flashing.</p>
<p>I won't go into a lot of detail, I'll just show the basics that I've got to grips with from the documentation on WiiBrew - LEDs + Motor, Buttons, and Battery.</p>
<h4><strong>Connecting the Wiimote</strong></h4>
<p>Connecting the Wiimote to a Mac is far simpler than it is for XBox 360, for a start its a Bluetooth device that operates using the normal protocols and it doesn't require a key to activate. To connect, first turn on Bluetooth on your Mac, and then select "<strong>Set up Bluetooth Device...</strong>".</p>
<p>Follow on the onscreen instructions, and when it gets to the point where it is searching for nearby Bluetooth devices, press <span style="text-decoration: underline;">1 + 2 to soft synchronize</span> if the Wiimote isn't bound to another device, or <span style="text-decoration: underline;">the sync button to hard synchronize</span> (unbinds the Wiimote from anything it remembers).</p>
<p>When it appears, select it and click the "<strong>Passkey Options...</strong>" button. Select the "<strong>Do not use a passkey with this device</strong>" option and then <strong>OK</strong>. Continue on and the device will be setup and connected. You can't actually tell since the LEDs are still blinking, but if you have done it correctly, the Bluetooth icon should be different, or the menu will have a disconnect option for the device just setup.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2009/07/01/athena-wiimote-and-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Athena: XBox 360 Pad and Mac OS X (cont further)</title>
		<link>http://www.lastrayofhope.com/2009/06/27/athena-xbox-360-pad-and-mac-os-x-cont-further/</link>
		<comments>http://www.lastrayofhope.com/2009/06/27/athena-xbox-360-pad-and-mac-os-x-cont-further/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 21:00:14 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Bluetooth]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[HID]]></category>
		<category><![CDATA[MacBook]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Nintendo]]></category>
		<category><![CDATA[Tattiebogle]]></category>
		<category><![CDATA[Wii]]></category>
		<category><![CDATA[Wiimote]]></category>
		<category><![CDATA[XBox]]></category>
		<category><![CDATA[XInput]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=2510</guid>
		<description><![CDATA[The past couple of week's I've really gotten into writing code that communicates with gaming devices (the Mac is limited in this part of itself). One annoyance I had was with getting rumbling working on the XBox 360 pad, eventually after essentially pinging all messages, I found and worked out the format for the rumble [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2009/06/steampunk.jpg"><img class="alignleft size-medium wp-image-2511" title="Steampunk Lincoln" src="http://www.lastrayofhope.com/wp-content/uploads/2009/06/steampunk-240x300.jpg" alt="Steampunk Lincoln" width="144" height="180" /></a>The past couple of week's I've really gotten into writing code that communicates with gaming devices (the Mac is limited in this part of itself).</p>
<p>One annoyance I had was with getting rumbling working on the XBox 360 pad, eventually after essentially pinging all messages, I found and worked out the format for the rumble message, which was annoyingly nothing like the others listed.</p>
<p>Well after that I got kinda bored with the 360 and decided to turn towards another console controller, the Wiimote. And I thought I'd write my own driver.</p>
<p>Long story short, when I was having trouble getting my driver working, I looked at the code for the driver for <a href="http://tattiebogle.net/" target="_blank">Tattiebogle's</a> XBox 360 pad driver, only to find out that it has redefined the rumble message to it's own format, namely the 4 byte one, only to forward on the settings to the 360 pad.</p>
<p>Well I'm glad I figured out why the message was different, kinda annoying that wasn't in his FAQ. Hopefully others will find this post and go "ohhhhhhhh" like I did when seeing the code.</p>
<p>As for the Wiimote, writing a driver for a Bluetooth device I've decided doesn't make sense, the device is already designed to communicate with another bluetooth device, so I made a class instead, using a Bluetooth API and documentation I found on <a href="http://www.wiibrew.org/" target="_blank">WiiBrew</a>.</p>
<p>I'll hopefully post my Xcode project for testing the 360 pad in a few days. And I'll probably write up my Wiimote stuff once I get it working the way I want. I'm really tempted to buy lots of cheap USB and Bluetooth devices on eBay now just to see if I can write drivers for them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2009/06/27/athena-xbox-360-pad-and-mac-os-x-cont-further/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Athena: XBox 360 Pad and Mac OS X (cont)</title>
		<link>http://www.lastrayofhope.com/2009/06/26/athena-xbox-360-pad-and-mac-os-x-cont/</link>
		<comments>http://www.lastrayofhope.com/2009/06/26/athena-xbox-360-pad-and-mac-os-x-cont/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 00:21:40 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[HID]]></category>
		<category><![CDATA[MacBook]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Tattiebogle]]></category>
		<category><![CDATA[XBox]]></category>
		<category><![CDATA[XInput]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=2485</guid>
		<description><![CDATA[In my previous entry, Athena: XBox 360 Pad and Mac OS X, I began work on getting the XBox 360 pad working in my game engine. I also said that I'd post how to change the LEDs and get rumble working when I figured it out. I had no trouble with getting the LEDs flashing, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2009/06/XBox360_Actuator.png"><img class="alignleft size-medium wp-image-2488" title="XBox360 Actuator Responds" src="http://www.lastrayofhope.com/wp-content/uploads/2009/06/XBox360_Actuator-300x187.png" alt="XBox360 Actuator Responds" width="180" height="112" /></a>In my previous entry, <a href="http://www.lastrayofhope.com/2009/06/12/athena-xbox-360-pad-and-mac-os-x/">Athena: XBox 360 Pad and Mac OS X</a>, I began work on getting the XBox 360 pad working in my game engine. I also said that I'd post how to change the LEDs and get rumble working when I figured it out.</p>
<p>I had no trouble with getting the LEDs flashing, but for some reason the rumble actuators just would not respond to my message with success.</p>
<p>I had searched at all other documentation on the pad on the internet, but although I found two variations of rumbling, neither worked.</p>
<p>It has taken my a week or two, but then I got the inspiration to just fire all possible messages to the pad, nullified apart from the header, and see responds with success. So I wrote some code to send 255 different type ids, with 255 different lengths.</p>
<div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdt_5" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_5"></a><a id="wpshat_5" class="wp-synhighlighter-title" href="#codesyntax_5"  onClick="javascript:wpsh_toggleBlock(5)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_5" onClick="javascript:wpsh_code(5)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_5" onClick="javascript:wpsh_print(5)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> HIDInput<span class="sy4">::</span><span class="me2">TestDevice</span><span class="br0">&#40;</span> IOHIDDeviceRef inDeviceRef <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw4">unsigned</span> <span class="kw4">char</span> reportData<span class="br0">&#91;</span>255<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Nullify Report</span>
	<span class="kw3">memset</span><span class="br0">&#40;</span> reportData, 0, <span class="kw3">sizeof</span><span class="br0">&#40;</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> <span class="br0">&#41;</span> <span class="sy2">*</span> 255 <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Loop through most possible messages</span>
	<span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> reportType <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> reportType <span class="sy1">&lt;</span> <span class="nu0">255</span><span class="sy4">;</span> <span class="sy2">++</span>reportType <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> reportLength <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> reportLength <span class="sy1">&lt;</span> <span class="nu0">255</span><span class="sy4">;</span> <span class="sy2">++</span>reportLength <span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
			<span class="co1">// Setup Header</span>
			reportData<span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy1">=</span> reportType<span class="sy4">;</span>
			reportData<span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="sy1">=</span> reportLength<span class="sy4">;</span>
&nbsp;
			<span class="co1">// Send Report to Pad</span>
			<span class="kw1">if</span><span class="br0">&#40;</span> DeviceSendReport<span class="br0">&#40;</span> inDeviceRef, reportType, reportData, reportLength <span class="br0">&#41;</span> <span class="br0">&#41;</span>
			<span class="br0">&#123;</span>
				<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;Success - Type(%u), Length(%u)<span class="es1">\n</span>&quot;</span>, reportType, reportLength <span class="br0">&#41;</span><span class="sy4">;</span>
			<span class="br0">&#125;</span>
			<span class="kw1">else</span>
			<span class="br0">&#123;</span>
				<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;Failed - Type(%u), Length(%u)<span class="es1">\n</span>&quot;</span>, reportType, reportLength <span class="br0">&#41;</span><span class="sy4">;</span>
			<span class="br0">&#125;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;Finished<span class="es1">\n</span>&quot;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>I'll explain show the function body for <strong>DeviceSendReport</strong> in a minute. After running this, only two reports returned with success, one was the LED report, and the other was of Type 0 with length 4.</p>
<p>Since the header take two bytes, I guessed the last two must be Actuator A and Actuator B. And after setting one of them to 0xff, I successfully managed to get one of the actuators rumbling, and then the other actuator with the other byte.</p>
<p>Now for the code for sending reports to the pad.</p>
<div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdt_6" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_6"></a><a id="wpshat_6" class="wp-synhighlighter-title" href="#codesyntax_6"  onClick="javascript:wpsh_toggleBlock(6)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_6" onClick="javascript:wpsh_code(6)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_6" onClick="javascript:wpsh_print(6)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">bool</span> HIDInput<span class="sy4">::</span><span class="me2">DeviceSendReport</span><span class="br0">&#40;</span> IOHIDDeviceRef inDeviceRef, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> inType, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> <span class="sy2">*</span> inReportData, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> inReportSize <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw1">return</span> IOHIDDeviceSetReport<span class="br0">&#40;</span> inDeviceRef, kIOHIDReportTypeOutput, inType, inReportData, inReportSize <span class="br0">&#41;</span> <span class="sy1">==</span> kIOReturnSuccess<span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>As you can see it takes a parameter called <strong>inDeviceRef</strong>, this is the value that was passed to <strong>DeviceMatchingCallback</strong> in the previous entry. And now here is the code to get the LED flashing, there are a few status values for it, so I've created an enum with some comments explaining what each do.</p>
<div id="wpshdo_7" class="wp-synhighlighter-outer"><div id="wpshdt_7" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_7"></a><a id="wpshat_7" class="wp-synhighlighter-title" href="#codesyntax_7"  onClick="javascript:wpsh_toggleBlock(7)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_7" onClick="javascript:wpsh_code(7)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_7" onClick="javascript:wpsh_print(7)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_7" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw2">enum</span> LEDStatus
<span class="br0">&#123;</span>
	kLED_AllOff <span class="sy1">=</span> <span class="nu12">0x00</span>, <span class="co1">// All LEDs are turned off</span>
	kLED_AllBlink <span class="sy1">=</span> <span class="nu12">0x01</span>, <span class="co1">// All LEDs repeatedly blink on and off</span>
	kLED_P1_FlashOn <span class="sy1">=</span> <span class="nu12">0x02</span>, <span class="co1">// Player 1 LED flashes then stays on</span>
	kLED_P2_FlashOn <span class="sy1">=</span> <span class="nu12">0x03</span>, <span class="co1">// Player 2 LED flashes then stays on</span>
	kLED_P3_FlashOn <span class="sy1">=</span> <span class="nu12">0x04</span>, <span class="co1">// Player 3 LED flashes then stays on</span>
	kLED_P4_FlashOn <span class="sy1">=</span> <span class="nu12">0x05</span>, <span class="co1">// Player 4 LED flashes then stays on</span>
	kLED_P1_On <span class="sy1">=</span> <span class="nu12">0x06</span>, <span class="co1">// Player 1 LED turns on</span>
	kLED_P2_On <span class="sy1">=</span> <span class="nu12">0x07</span>, <span class="co1">// Player 2 LED turns on</span>
	kLED_P3_On <span class="sy1">=</span> <span class="nu12">0x08</span>, <span class="co1">// Player 3 LED turns on</span>
	kLED_P4_On <span class="sy1">=</span> <span class="nu12">0x09</span>, <span class="co1">// Player 4 LED turns on</span>
	kLED_Rotating <span class="sy1">=</span> <span class="nu12">0x0a</span>, <span class="co1">// LEDs flash on in sequence</span>
	kLED_CurrentBlink <span class="sy1">=</span> <span class="nu12">0x0b</span>, <span class="co1">// Currently active LED blinks</span>
	kLED_SlowBlink <span class="sy1">=</span> <span class="nu12">0x0c</span>, <span class="co1">// All LEDs blink slowly</span>
	kLED_Alternating <span class="sy1">=</span> <span class="nu12">0x0d</span>, <span class="co1">// Player 1 &amp; 4 alternate blink with Player 2 &amp; 3</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> HIDInput<span class="sy4">::</span><span class="me2">FlashLED</span><span class="br0">&#40;</span> IOHIDDeviceRef inDeviceRef, <span class="kw4">const</span> LEDStatus inStatus <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">//</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportType <span class="sy1">=</span> <span class="nu12">0x01</span><span class="sy4">;</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportSize <span class="sy1">=</span> <span class="nu12">0x03</span><span class="sy4">;</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportData<span class="br0">&#91;</span>kReportSize<span class="br0">&#93;</span> <span class="sy1">=</span>
	<span class="br0">&#123;</span>
		kReportType, kReportSize, <span class="kw2">static_cast</span><span class="sy1">&lt;</span>Core<span class="sy4">::</span><span class="me2">byte</span><span class="sy1">&gt;</span><span class="br0">&#40;</span> inStatus <span class="br0">&#41;</span>
	<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	DeviceSendReport<span class="br0">&#40;</span> inDeviceRef, kReportType, kReportData, kReportSize <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>As you can see, it is fairly simple to send a message, all you have to remember is that the first two bytes contain a header (one byte for type, and one type for the size of the report including the header size). And finally for rumbling the motors.</p>
<div id="wpshdo_8" class="wp-synhighlighter-outer"><div id="wpshdt_8" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_8"></a><a id="wpshat_8" class="wp-synhighlighter-title" href="#codesyntax_8"  onClick="javascript:wpsh_toggleBlock(8)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_8" onClick="javascript:wpsh_code(8)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_8" onClick="javascript:wpsh_print(8)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_8" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> HIDInput<span class="sy4">::</span><span class="me2">SetRumble</span><span class="br0">&#40;</span> IOHIDDeviceRef inDeviceRef, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> inBigSpeed, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> inLittleSpeed <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">//</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportType <span class="sy1">=</span> <span class="nu12">0x00</span><span class="sy4">;</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportSize <span class="sy1">=</span> <span class="nu12">0x04</span><span class="sy4">;</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportData<span class="br0">&#91;</span>kReportSize<span class="br0">&#93;</span> <span class="sy1">=</span>
	<span class="br0">&#123;</span>
		kReportType, kReportSize, inBigSpeed, inLittleSpeed
	<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	DeviceSendReport<span class="br0">&#40;</span> inDeviceRef, kReportType, kReportData, kReportSize <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>I had some minor problems with the rumble not changing after the first call to SetRumble originally, however it turned out that I had just accidently set the report data variable to be static, so the initialisation was only setup with the first values passed.</p>
<h4>Other Rumble Reports</h4>
<p>As I mentioned before, I've found other message formats for rumbling the motors, I don't know if its a version thing, or something, but here are the other two I've found if you have trouble with mine.</p>
<p><strong>Version 1 (</strong><a href="http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/UsbInfo" target="_blank">Tattiebogle</a><strong>)<br />
</strong></p>
<div id="wpshdo_9" class="wp-synhighlighter-outer"><div id="wpshdt_9" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_9"></a><a id="wpshat_9" class="wp-synhighlighter-title" href="#codesyntax_9"  onClick="javascript:wpsh_toggleBlock(9)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_9" onClick="javascript:wpsh_code(9)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_9" onClick="javascript:wpsh_print(9)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_9" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> HIDInput<span class="sy4">::</span><span class="me2">SetRumble</span><span class="br0">&#40;</span> IOHIDDeviceRef inDeviceRef, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> inBigSpeed, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> inLittleSpeed <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">//</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportType <span class="sy1">=</span> <span class="nu12">0x00</span><span class="sy4">;</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportSize <span class="sy1">=</span> <span class="nu12">0x08</span><span class="sy4">;</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportData<span class="br0">&#91;</span>kReportSize<span class="br0">&#93;</span> <span class="sy1">=</span>
	<span class="br0">&#123;</span>
		kReportType, kReportSize, 0x00, inBigSpeed, inLittleSpeed, 0x00, 0x00, 0x00
	<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	DeviceSendReport<span class="br0">&#40;</span> inDeviceRef, kReportType, kReportData, kReportSize <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p><strong>Version 2 (</strong><a href="http://euc.jp/periphs/xbox-controller.ja.html" target="_blank">http://euc.jp/periphs/xbox-controller.ja.html</a><strong>)<br />
</strong></p>
<div id="wpshdo_10" class="wp-synhighlighter-outer"><div id="wpshdt_10" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_10"></a><a id="wpshat_10" class="wp-synhighlighter-title" href="#codesyntax_10"  onClick="javascript:wpsh_toggleBlock(10)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_10" onClick="javascript:wpsh_code(10)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_10" onClick="javascript:wpsh_print(10)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_10" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> HIDInput<span class="sy4">::</span><span class="me2">SetRumble</span><span class="br0">&#40;</span> IOHIDDeviceRef inDeviceRef, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> inBigSpeed, <span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> inLittleSpeed <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">//</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportType <span class="sy1">=</span> <span class="nu12">0x00</span><span class="sy4">;</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportSize <span class="sy1">=</span> <span class="nu12">0x06</span><span class="sy4">;</span>
	<span class="kw4">const</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> kReportData<span class="br0">&#91;</span>kReportSize<span class="br0">&#93;</span> <span class="sy1">=</span>
	<span class="br0">&#123;</span>
		kReportType, kReportSize, 0x00, inBigSpeed, 0x00, inLittleSpeed
	<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	DeviceSendReport<span class="br0">&#40;</span> inDeviceRef, kReportType, kReportData, kReportSize <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2009/06/26/athena-xbox-360-pad-and-mac-os-x-cont/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Athena: XBox 360 Pad and Mac OS X</title>
		<link>http://www.lastrayofhope.com/2009/06/12/athena-xbox-360-pad-and-mac-os-x/</link>
		<comments>http://www.lastrayofhope.com/2009/06/12/athena-xbox-360-pad-and-mac-os-x/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 23:27:42 +0000</pubDate>
		<dc:creator>Kaluriel</dc:creator>
				<category><![CDATA[Athena]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[HID]]></category>
		<category><![CDATA[MacBook]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Tattiebogle]]></category>
		<category><![CDATA[XBox]]></category>
		<category><![CDATA[XInput]]></category>

		<guid isPermaLink="false">http://www.lastrayofhope.com/?p=2461</guid>
		<description><![CDATA[Tonight I began the process of writing some using the HID APIs to be able to use an XBox 360 controller on my MacBook Pro for the Athena engine. As usual, my Courage game played host to testing this new method of control. First of all, the XBox 360 pad uses a 0xff device class [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lastrayofhope.com/wp-content/uploads/2009/06/XBox_Pad_with_MacOSX.png"><img class="alignleft size-medium wp-image-2464" title="XBox_Pad_with_MacOSX" src="http://www.lastrayofhope.com/wp-content/uploads/2009/06/XBox_Pad_with_MacOSX-300x187.png" alt="XBox_Pad_with_MacOSX" width="180" height="112" /></a>Tonight I began the process of writing some using the HID APIs to be able to use an XBox 360 controller on my MacBook Pro for the Athena engine.</p>
<p>As usual, my Courage game played host to testing this new method of control.</p>
<p>First of all, the XBox 360 pad uses a 0xff device class (Vendor specific), so normal HID drivers (they use a device class of 0x03) will not attach to it, so I needed to download a driver for MacOSX that could handle this. Also I didn't have a Microsoft Wireless Gaming Receiver so I bought a wired pad instead.</p>
<p>I tried the <a href="http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/OsxDriver" target="_blank">Tattiebogle</a> driver, and at first it worked, but after I logged into <a href="http://www.vmware.com/products/fusion/" target="_blank">VMWare Fusion</a> and used by pad in Vista it stopped working on MacOSX. Or it could have been that I got the Wacom Bamboo pad installed recently.</p>
<p>So after a bit of searching I found another driver, which although didn't work, sparked Tattiebogle's to life. This one is known as <a href="http://sourceforge.net/project/showfiles.php?group_id=193069" target="_blank">XBox HID Driver for Mac OS X</a>.</p>
<p>Once it was all up and running, getting code to listen for the 360 pad was a breeze, and Apple has a nice section on your website for it <a href="http://developer.apple.com/technotes/tn2007/tn2187.html" target="_blank">Technical Note TN2187: New HID Manager APIs for Mac OS X version 10</a>. I'll summarise the basics needed to connect to the pad.</p>
<p>None of this code cleans up properly, like I said I only just started with the HID manager, so I'll probably post an example App at some point that does clean up properly when shutting down.</p>
<h3>Setting up HID Manager</h3>
<p>The following code is quite straight forward, it just sets up two callbacks, one for when a device matches what we are looking for, and one for when a device is removed.</p>
<p><strong><span style="text-decoration: underline;">The IOKit.framework is required</span>.</strong></p>
<p>I also have two global variables, one for the HID manager, and another the device we going to be reading (this code can only do one device since we only have one buffer variable).</p>
<div id="wpshdo_11" class="wp-synhighlighter-outer"><div id="wpshdt_11" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_11"></a><a id="wpshat_11" class="wp-synhighlighter-title" href="#codesyntax_11"  onClick="javascript:wpsh_toggleBlock(11)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_11" onClick="javascript:wpsh_code(11)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_11" onClick="javascript:wpsh_print(11)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_11" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="co2">#include &lt;IOKit/hid/IOHIDLib.h&gt;</span>
<span class="co2">#include &lt;IOKit/hid/IOHIDUsageTables.h&gt;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw2">namespace</span> HIDInput
<span class="br0">&#123;</span>
	<span class="co1">//</span>
	<span class="kw4">void</span> DeviceMatchingCallback<span class="br0">&#40;</span> <span class="kw4">void</span> <span class="sy2">*</span> inContext, IOReturn inResult, <span class="kw4">void</span> <span class="sy2">*</span> inSender, IOHIDDeviceRef inIOHIDDeviceRef <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw4">void</span> DeviceRemovalCallback<span class="br0">&#40;</span> <span class="kw4">void</span> <span class="sy2">*</span> inContext, IOReturn inResult, <span class="kw4">void</span> <span class="sy2">*</span> inSender, IOHIDDeviceRef inIOHIDDeviceRef <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw4">void</span> DeviceIOHIDReportCallback<span class="br0">&#40;</span> <span class="kw4">void</span> <span class="sy2">*</span> inContext, IOReturn inResult, <span class="kw4">void</span> <span class="sy2">*</span> inSender, IOHIDReportType inType, uint32_t inReportID, uint8_t <span class="sy2">*</span> inReport, CFIndex inReportLength <span class="br0">&#41;</span><span class="sy4">;</span>
	Boolean Device_GetLongProperty<span class="br0">&#40;</span> IOHIDDeviceRef inDeviceRef, CFStringRef inKey, <span class="kw4">long</span> <span class="sy2">*</span> outValue <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw4">long</span> Device_GetVendorID<span class="br0">&#40;</span> IOHIDDeviceRef inIOHIDDeviceRef <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw4">long</span> Device_GetProductID<span class="br0">&#40;</span> IOHIDDeviceRef inIOHIDDeviceRef <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	IOHIDManagerRef l_IOHIDManagerRef<span class="sy4">;</span>
	uint8_t <span class="sy2">*</span> l_pReportBuf <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">int</span> main<span class="br0">&#40;</span> <span class="kw4">int</span> argc, <span class="kw4">char</span> <span class="sy2">*</span> argv<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">// Create a HID manager with a default allocator</span>
	l_IOHIDManagerRef <span class="sy1">=</span> IOHIDManagerCreate<span class="br0">&#40;</span> kCFAllocatorDefault, kIOHIDOptionsTypeNone <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">assert</span><span class="br0">&#40;</span> IOHIDManagerRef <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Look for all device and open the manager</span>
	IOHIDManagerSetDeviceMatching<span class="br0">&#40;</span> l_IOHIDManagerRef, <span class="kw2">NULL</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	IOHIDManagerOpen<span class="br0">&#40;</span> l_IOHIDManagerRef, kIOHIDOptionsTypeNone <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Register Callbacks to be run with application loop</span>
	IOHIDManagerRegisterDeviceMatchingCallback<span class="br0">&#40;</span> l_IOHIDManagerRef, HIDInput<span class="sy4">::</span><span class="me2">DeviceMatchingCallback</span>, <span class="kw2">NULL</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	IOHIDManagerRegisterDeviceRemovalCallback<span class="br0">&#40;</span> l_IOHIDManagerRef, HIDInput<span class="sy4">::</span><span class="me2">DeviceRemovalCallback</span>, <span class="kw2">NULL</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	IOHIDManagerScheduleWithRunLoop<span class="br0">&#40;</span> l_IOHIDManagerRef, CFRunLoopGetCurrent<span class="br0">&#40;</span><span class="br0">&#41;</span>, kCFRunLoopDefaultMode <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw1">while</span><span class="br0">&#40;</span> <span class="kw2">true</span> <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="co1">// loop application</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>The call to <strong>IOHIDManagerSetDeviceMatching()</strong> can have a dictionary passed to it to look only for devices matching certain criteria, but for simplicity, I'll just be checking all devices in this example, so I passed NULL as a second argument.</p>
<h3>Checking for XBox360 Pad</h3>
<p>With the code setup for calling back when a device is found that matches (or all devices in our case), we now need to check the device vendor id and product id to be sure they are what we are looking for.</p>
<div id="wpshdo_12" class="wp-synhighlighter-outer"><div id="wpshdt_12" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_12"></a><a id="wpshat_12" class="wp-synhighlighter-title" href="#codesyntax_12"  onClick="javascript:wpsh_toggleBlock(12)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_12" onClick="javascript:wpsh_code(12)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_12" onClick="javascript:wpsh_print(12)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_12" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
Boolean HIDInput<span class="sy4">::</span><span class="me2">Device_GetLongProperty</span><span class="br0">&#40;</span> IOHIDDeviceRef inDeviceRef, CFStringRef inKey, <span class="kw4">long</span> <span class="sy2">*</span> outValue <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	CFTypeRef tCFTypeRef <span class="sy1">=</span> IOHIDDeviceGetProperty<span class="br0">&#40;</span> inDeviceRef, inKey <span class="br0">&#41;</span><span class="sy4">;</span>
	Boolean result <span class="sy1">=</span> FALSE<span class="sy4">;</span>
&nbsp;
	<span class="kw1">if</span><span class="br0">&#40;</span> tCFTypeRef <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="co1">// If this is a number get its value</span>
		<span class="kw1">if</span><span class="br0">&#40;</span> CFNumberGetTypeID<span class="br0">&#40;</span> <span class="br0">&#41;</span> <span class="sy1">==</span> CFGetTypeID<span class="br0">&#40;</span> tCFTypeRef <span class="br0">&#41;</span> <span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
			result <span class="sy1">=</span> CFNumberGetValue<span class="br0">&#40;</span> <span class="br0">&#40;</span> CFNumberRef <span class="br0">&#41;</span> tCFTypeRef, kCFNumberSInt32Type, outValue <span class="br0">&#41;</span><span class="sy4">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">return</span> result<span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">long</span> HIDInput<span class="sy4">::</span><span class="me2">Device_GetVendorID</span><span class="br0">&#40;</span> IOHIDDeviceRef inIOHIDDeviceRef <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw4">long</span> result <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
	Device_GetLongProperty<span class="br0">&#40;</span> inIOHIDDeviceRef, CFSTR<span class="br0">&#40;</span> kIOHIDVendorIDKey <span class="br0">&#41;</span>, <span class="sy3">&amp;</span>result <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw1">return</span> result<span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">long</span> HIDInput<span class="sy4">::</span><span class="me2">Device_GetProductID</span><span class="br0">&#40;</span> IOHIDDeviceRef inIOHIDDeviceRef <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw4">long</span> result <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
	Device_GetLongProperty<span class="br0">&#40;</span> inIOHIDDeviceRef, CFSTR<span class="br0">&#40;</span> kIOHIDProductIDKey <span class="br0">&#41;</span>, <span class="sy3">&amp;</span>result <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw1">return</span> result<span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> HIDInput<span class="sy4">::</span><span class="me2">DeviceMatchingCallback</span><span class="br0">&#40;</span> <span class="kw4">void</span> <span class="sy2">*</span> inContext, IOReturn inResult, <span class="kw4">void</span> <span class="sy2">*</span> inSender, IOHIDDeviceRef inIOHIDDeviceRef <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw1">if</span><span class="br0">&#40;</span> <span class="sy3">!</span>inIOHIDDeviceRef <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="kw1">return</span><span class="sy4">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw4">const</span> <span class="kw4">long</span> kVendor_Microsoft <span class="sy1">=</span> <span class="nu12">0x045e</span><span class="sy4">;</span>
	<span class="kw4">const</span> <span class="kw4">long</span> kProduct_XBox360Pad <span class="sy1">=</span> <span class="nu12">0x028e</span><span class="sy4">;</span>
&nbsp;
	<span class="kw4">const</span> <span class="kw4">long</span> kVendorID <span class="sy1">=</span> Device_GetVendorID<span class="br0">&#40;</span> inIOHIDDeviceRef <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw4">const</span> <span class="kw4">long</span> kProductID <span class="sy1">=</span> Device_GetProductID<span class="br0">&#40;</span> inIOHIDDeviceRef <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="kw1">if</span><span class="br0">&#40;</span> kVendorID <span class="sy1">==</span> kVendor_Microsoft <span class="sy3">&amp;&amp;</span> kProductID <span class="sy1">==</span> kProduct_XBox360Pad <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="co1">// Assert if we're trying to create a second XBox 360 pad device</span>
		<span class="kw3">assert</span><span class="br0">&#40;</span> l_pReportBuf <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
		<span class="co1">// Get the size of the report for the device and allocate a buffer. The</span>
		<span class="co1">// report size property should be right, however the packet header</span>
		<span class="co1">// seems to want 20 bytes, so I'm allocating 20 bytes to be safe.</span>
		CFIndex reportSize <span class="sy1">=</span> <span class="nu0">20</span><span class="sy4">;</span>
		<span class="co1">//IOHIDDevice_GetLongProperty( inIOHIDDeviceRef, CFSTR( kIOHIDMaxInputReportSizeKey ), &amp;reportSize );</span>
		l_pReportBuf <span class="sy1">=</span> <span class="kw2">static_cast</span><span class="sy1">&lt;</span>uint8_t <span class="sy2">*</span><span class="sy1">&gt;</span><span class="br0">&#40;</span> <span class="kw3">malloc</span><span class="br0">&#40;</span> reportSize <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
		<span class="co1">// Register a report callback for this device</span>
		IOHIDDeviceRegisterInputReportCallback<span class="br0">&#40;</span> inIOHIDDeviceRef, l_pReportBuf, reportSize, DeviceIOHIDReportCallback, 0 <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
		<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;XBox Pad Connected.<span class="es1">\n</span>&quot;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> HIDInput<span class="sy4">::</span><span class="me2">DeviceRemovalCallback</span><span class="br0">&#40;</span> <span class="kw4">void</span> <span class="sy2">*</span> inContext, IOReturn inResult, <span class="kw4">void</span> <span class="sy2">*</span> inSender, IOHIDDeviceRef inIOHIDDeviceRef <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">// Deallocate report buffer</span>
	<span class="kw3">free</span><span class="br0">&#40;</span> l_pReportBuf <span class="br0">&#41;</span><span class="sy4">;</span>
	l_pReportBuf <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;XBox Pad Disconnected.<span class="es1">\n</span>&quot;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>We have two constants in the device matching callback, one that is the vendor id for Microsoft, and the other which is the product id for the XBox 360 pad.</p>
<p>Since this code only supports the one pad, I've added an assert which will be triggered if a second pad is attempted to be matched that is a 360 pad (it checks to see if the report buffer has already been allocated).</p>
<p>Once a device has been removed, I free the memory for the report buffer. I think I'm suppose to unregister the input report callback by passing null as the callback, but I'm not 100% sure yet.</p>
<p>All the other helper functions were found on the Apple website technical note.</p>
<h3>Reading Pad Status</h3>
<p>XBox 360 pad updates come through on a report type of 0x00 and are 14 bytes long (though I have read on other sites of people getting reports of 20 bytes, this just seems to be padding).</p>
<p>I have skipped the checking of the report type in this code, but it should probably be checked, as well as the report length.</p>
<div id="wpshdo_13" class="wp-synhighlighter-outer"><div id="wpshdt_13" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_13"></a><a id="wpshat_13" class="wp-synhighlighter-title" href="#codesyntax_13"  onClick="javascript:wpsh_toggleBlock(13)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_13" onClick="javascript:wpsh_code(13)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_13" onClick="javascript:wpsh_print(13)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_13" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> HIDInput<span class="sy4">::</span><span class="me2">DeviceIOHIDReportCallback</span><span class="br0">&#40;</span> <span class="kw4">void</span> <span class="sy2">*</span> inContext, IOReturn inResult, <span class="kw4">void</span> <span class="sy2">*</span> inSender, IOHIDReportType inType, uint32_t inReportID, uint8_t <span class="sy2">*</span> inReport, CFIndex inReportLength <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="co1">// Output hex for each byte in the report (always 2 characters long, making up the rest with 0)</span>
	<span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> inReportLength<span class="sy4">;</span> <span class="sy2">++</span>i <span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;%02x&quot;</span>, inReport<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="co1">//</span>
	<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>That sourcecode allows you to read just the actual reports being sent from the pad, however if you want to be able to use it as a 360 pad. You'll get a message something like this...</p>
<blockquote><p>0014000000002efcc70792ff9a06</p></blockquote>
<p>The 0014 at the beginning is a packet header, first byte being the command, second being the size of the packet. The other sections are split up as follows...</p>
<blockquote><p>0014<strong>aaaa</strong><em>bb</em><strong>cc</strong><em>dddd</em><strong>eeee</strong><em>ffff</em><strong>gggg</strong></p>
<p>a is an unsigned short of button flags</p>
<p>b is an unsigned char representing the left trigger (LT)</p>
<p>c is an unsigned char representing the right trigger (RT)</p>
<p>d is a signed short representing the Left Axis X</p>
<p>e is a signed short representing the Left Axis Y</p>
<p>f is a signed short representing the Right Axis X</p>
<p>g is a signed short representing the Right Axis Y</p></blockquote>
<p>This can be put into a function like so...</p>
<div id="wpshdo_14" class="wp-synhighlighter-outer"><div id="wpshdt_14" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_14"></a><a id="wpshat_14" class="wp-synhighlighter-title" href="#codesyntax_14"  onClick="javascript:wpsh_toggleBlock(14)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_14" onClick="javascript:wpsh_code(14)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_14" onClick="javascript:wpsh_print(14)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_14" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw4">void</span> HIDInput<span class="sy4">::</span><span class="me2">DeviceIOHIDReportCallback</span><span class="br0">&#40;</span> <span class="kw4">void</span> <span class="sy2">*</span> inContext, IOReturn inResult, <span class="kw4">void</span> <span class="sy2">*</span> inSender, IOHIDReportType inType, uint32_t inReportID, uint8_t <span class="sy2">*</span> inReport, CFIndex inReportLength <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw4">unsigned</span> <span class="kw4">char</span> leftTrigger, rightTrigger<span class="sy4">;</span>
	<span class="kw4">short</span> rightAxisX, rightAxisY<span class="sy4">;</span>
	<span class="kw4">short</span> leftAxisX, leftAxisY<span class="sy4">;</span>
	<span class="kw4">unsigned</span> <span class="kw4">short</span> buttonFlags<span class="sy4">;</span>
&nbsp;
	<span class="co1">// Copy bytes to their respective variables (incase they are not aligned correctly)</span>
	<span class="kw3">memcpy</span><span class="br0">&#40;</span> <span class="sy3">&amp;</span>buttonFlags, <span class="sy3">&amp;</span>inReport<span class="br0">&#91;</span>2<span class="br0">&#93;</span>, <span class="kw3">sizeof</span><span class="br0">&#40;</span> <span class="kw4">unsigned</span> <span class="kw4">short</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">memcpy</span><span class="br0">&#40;</span> <span class="sy3">&amp;</span>leftTrigger, <span class="sy3">&amp;</span>inReport<span class="br0">&#91;</span>4<span class="br0">&#93;</span>, <span class="kw3">sizeof</span><span class="br0">&#40;</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">memcpy</span><span class="br0">&#40;</span> <span class="sy3">&amp;</span>rightTrigger, <span class="sy3">&amp;</span>inReport<span class="br0">&#91;</span>5<span class="br0">&#93;</span>, <span class="kw3">sizeof</span><span class="br0">&#40;</span> <span class="kw4">unsigned</span> <span class="kw4">char</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">memcpy</span><span class="br0">&#40;</span> <span class="sy3">&amp;</span>leftAxisX, <span class="sy3">&amp;</span>inReport<span class="br0">&#91;</span>6<span class="br0">&#93;</span>, <span class="kw3">sizeof</span><span class="br0">&#40;</span> <span class="kw4">short</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">memcpy</span><span class="br0">&#40;</span> <span class="sy3">&amp;</span>leftAxisY, <span class="sy3">&amp;</span>inReport<span class="br0">&#91;</span>8<span class="br0">&#93;</span>, <span class="kw3">sizeof</span><span class="br0">&#40;</span> <span class="kw4">short</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">memcpy</span><span class="br0">&#40;</span> <span class="sy3">&amp;</span>rightAxisX, <span class="sy3">&amp;</span>inReport<span class="br0">&#91;</span>10<span class="br0">&#93;</span>, <span class="kw3">sizeof</span><span class="br0">&#40;</span> <span class="kw4">short</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">memcpy</span><span class="br0">&#40;</span> <span class="sy3">&amp;</span>rightAxisY, <span class="sy3">&amp;</span>inReport<span class="br0">&#91;</span>12<span class="br0">&#93;</span>, <span class="kw3">sizeof</span><span class="br0">&#40;</span> <span class="kw4">short</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
	<span class="co1">// Output pad stats</span>
	<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;Buttons %u<span class="es1">\n</span>&quot;</span>, buttonFlags <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;LTrigger: %u<span class="es1">\n</span>&quot;</span>, leftTrigger <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;RTrigger: %u<span class="es1">\n</span>&quot;</span>, rightTrigger <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;LAxis: %d, %d<span class="es1">\n</span>&quot;</span>, leftAxisX, leftAxisY <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">printf</span><span class="br0">&#40;</span> <span class="st0">&quot;RAxis: %d, %d<span class="es1">\n</span>&quot;</span>, rightAxisX, rightAxisY <span class="br0">&#41;</span><span class="sy4">;</span>
	<span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>I don't know what the 2048 button flag is, it is possibly the synchronization button that is on the wireless controller. So here is a list of all the other button flags and their bit number.</p>
<div id="wpshdo_15" class="wp-synhighlighter-outer"><div id="wpshdt_15" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_15"></a><a id="wpshat_15" class="wp-synhighlighter-title" href="#codesyntax_15"  onClick="javascript:wpsh_toggleBlock(15)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_15" onClick="javascript:wpsh_code(15)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_15" onClick="javascript:wpsh_print(15)" title="Print code"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.lastrayofhope.com/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_15" class="wp-synhighlighter-inner" style="display: block;"><pre class="cpp" style="font-family:monospace;"><span class="co1">//</span>
<span class="co1">//</span>
<span class="kw2">enum</span> XBox360_ButtonFlags
<span class="br0">&#123;</span>
	XBOX360PAD_DPAD_UP <span class="sy1">=</span> 1,
	XBOX360PAD_DPAD_DOWN <span class="sy1">=</span> 2,
	XBOX360PAD_DPAD_LEFT <span class="sy1">=</span> 4,
	XBOX360PAD_DPAD_RIGHT <span class="sy1">=</span> 8,
	XBOX360PAD_START <span class="sy1">=</span> 16,
	XBOX360PAD_BACK <span class="sy1">=</span> 32,
	XBOX360PAD_LAXIS <span class="sy1">=</span> 64,
	XBOX360PAD_RAXIS <span class="sy1">=</span> 128,
	XBOX360PAD_LB <span class="sy1">=</span> 256,
	XBOX360PAD_RB <span class="sy1">=</span> 512,
	XBOX360PAD_XBOX <span class="sy1">=</span> 1024,
	XBOX360PAD_A <span class="sy1">=</span> 4096,
	XBOX360PAD_B <span class="sy1">=</span> 8192,
	XBOX360PAD_X <span class="sy1">=</span> 16384,
	XBOX360PAD_Y <span class="sy1">=</span> 32768,
<span class="br0">&#125;</span><span class="sy4">;</span></pre></div></div>
<p>&nbsp;</p>
<p>There is still a lot more to cover, so I'll probably make a follow up entry tomorrow or the day after for sending messages to the pad to make it vibrate, and how to clean up after you're finished properly. As well as post an example application.</p>
<p>I also found a few new variables to add to my list of debugging preprocessor. I'll explain on the next page since this one is getting rather long.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lastrayofhope.com/2009/06/12/athena-xbox-360-pad-and-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

