| /* |
| Simple DirectMedia Layer |
| Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org> |
| |
| This software is provided 'as-is', without any express or implied |
| warranty. In no event will the authors be held liable for any damages |
| arising from the use of this software. |
| |
| Permission is granted to anyone to use this software for any purpose, |
| including commercial applications, and to alter it and redistribute it |
| freely, subject to the following restrictions: |
| |
| 1. The origin of this software must not be misrepresented; you must not |
| claim that you wrote the original software. If you use this software |
| in a product, an acknowledgment in the product documentation would be |
| appreciated but is not required. |
| 2. Altered source versions must be plainly marked as such, and must not be |
| misrepresented as being the original software. |
| 3. This notice may not be removed or altered from any source distribution. |
| */ |
| |
| #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; |
| } |
| /* |
| 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 { |
| 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; |
| } |
| |
| @end |