Mercurial > sdl-ios-xcode
diff src/joystick/iphoneos/SDLUIAccelerationDelegate.m @ 2439:78bddf0c0fa2 gsoc2008_iphone
Cleaned up code, added comments.
author | Holmes Futrell <hfutrell@umail.ucsb.edu> |
---|---|
date | Fri, 15 Aug 2008 19:16:01 +0000 |
parents | 32b9909db651 |
children |
line wrap: on
line diff
--- a/src/joystick/iphoneos/SDLUIAccelerationDelegate.m Fri Aug 15 18:51:28 2008 +0000 +++ b/src/joystick/iphoneos/SDLUIAccelerationDelegate.m Fri Aug 15 19:16:01 2008 +0000 @@ -1,86 +1,140 @@ -// -// SDLUIAccelerationDelegate.m -// iPodSDL -// -// Created by Holmes Futrell on 6/21/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2006 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org + */ #import "SDLUIAccelerationDelegate.h" +/* needed for SDL_IPHONE_MAX_GFORCE macro */ #import "../../../include/SDL_config_iphoneos.h" static SDLUIAccelerationDelegate *sharedDelegate=nil; @implementation SDLUIAccelerationDelegate +/* + Returns a shared instance of the SDLUIAccelerationDelegate, creating the shared delegate if it doesn't exist yet. +*/ +(SDLUIAccelerationDelegate *)sharedDelegate { if (sharedDelegate == nil) { sharedDelegate = [[SDLUIAccelerationDelegate alloc] init]; } return sharedDelegate; } - +/* + UIAccelerometerDelegate delegate method. Invoked by the UIAccelerometer instance when it has new data for us. + We just take the data and mark that we have new data available so that the joystick system will pump it to the + events system when SDL_SYS_JoystickUpdate is called. +*/ -(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { x = acceleration.x; y = acceleration.y; z = acceleration.z; - hasNewData = YES; - //timestamp = acceleration.timestamp; - + hasNewData = YES; } - +/* + getLastOrientation -- put last obtained accelerometer data into Sint16 array + + Called from the joystick system when it needs the accelerometer data. + Function grabs the last data sent to the accelerometer and converts it + from floating point to Sint16, which is what the joystick system expects. + + To do the conversion, the data is first clamped onto the interval + [-SDL_IPHONE_MAX_G_FORCE, SDL_IPHONE_MAX_G_FORCE], then the data is multiplied + by MAX_SINT16 so that it is mapped to the full range of an Sint16. + + You can customize the clamped range of this function by modifying the + SDL_IPHONE_MAX_GFORCE macro in SDL_config_iphoneos.h. + + Once converted to Sint16, the accelerometer data no longer has coherent units. + You can convert the data back to units of g-force by multiplying it + in your application's code by SDL_IPHONE_MAX_GFORCE / 0x7FFF. + */ -(void)getLastOrientation:(Sint16 *)data { #define MAX_SINT16 0x7FFF + /* clamp the data */ if (x > SDL_IPHONE_MAX_GFORCE) x = SDL_IPHONE_MAX_GFORCE; else if (x < -SDL_IPHONE_MAX_GFORCE) x = -SDL_IPHONE_MAX_GFORCE; - if (y > SDL_IPHONE_MAX_GFORCE) y = SDL_IPHONE_MAX_GFORCE; else if (y < -SDL_IPHONE_MAX_GFORCE) y = -SDL_IPHONE_MAX_GFORCE; - if (z > SDL_IPHONE_MAX_GFORCE) z = SDL_IPHONE_MAX_GFORCE; else if (z < -SDL_IPHONE_MAX_GFORCE) z = -SDL_IPHONE_MAX_GFORCE; + /* pass in data mapped to range of SInt16 */ data[0] = (x / SDL_IPHONE_MAX_GFORCE) * MAX_SINT16; data[1] = (y / SDL_IPHONE_MAX_GFORCE) * MAX_SINT16; data[2] = (z / SDL_IPHONE_MAX_GFORCE) * MAX_SINT16; } +/* + Initialize SDLUIAccelerationDelegate. Since we don't have any data yet, + just set our last received data to zero, and indicate we don't have any; +*/ -(id)init { - self = [super init]; x = y = z = 0.0; + hasNewData = NO; return self; - } -(void)dealloc { sharedDelegate = nil; + [self shutdown]; [super dealloc]; } +/* + Lets our delegate start receiving accelerometer updates. +*/ -(void)startup { [UIAccelerometer sharedAccelerometer].delegate = self; isRunning = YES; } - +/* + Stops our delegate from receiving accelerometer updates. +*/ -(void)shutdown { - [UIAccelerometer sharedAccelerometer].delegate = nil; + if ([UIAccelerometer sharedAccelerometer].delegate == self) { + [UIAccelerometer sharedAccelerometer].delegate = nil; + } isRunning = NO; } - +/* + Our we currently receiving accelerometer updates? +*/ -(BOOL)isRunning { return isRunning; } - +/* + Do we have any data that hasn't been pumped into SDL's event system? +*/ -(BOOL)hasNewData { return hasNewData; } - +/* + When the joystick system grabs the new data, it sets this to NO. +*/ -(void)setHasNewData:(BOOL)value { hasNewData = value; }