Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Implemented SDL power APIs for iPhoneOS.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Apr 30, 2010
1 parent 90e466f commit 34faead
Show file tree
Hide file tree
Showing 6 changed files with 237 additions and 2 deletions.
24 changes: 24 additions & 0 deletions Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj
Expand Up @@ -65,6 +65,8 @@
04EC8B521025D12900431D42 /* SDL_config_iphoneos.h in Headers */ = {isa = PBXBuildFile; fileRef = 04EC8B501025D12900431D42 /* SDL_config_iphoneos.h */; };
04F2AF541104ABC300D6DDF7 /* SDL_assert.h in Headers */ = {isa = PBXBuildFile; fileRef = 04F2AF531104ABC300D6DDF7 /* SDL_assert.h */; };
04F2AF561104ABD200D6DDF7 /* SDL_assert.c in Sources */ = {isa = PBXBuildFile; fileRef = 04F2AF551104ABD200D6DDF7 /* SDL_assert.c */; };
56ED04E1118A8EE200A56AA6 /* SDL_power.c in Sources */ = {isa = PBXBuildFile; fileRef = 56ED04E0118A8EE200A56AA6 /* SDL_power.c */; };
56ED04E3118A8EFD00A56AA6 /* SDL_syspower.m in Sources */ = {isa = PBXBuildFile; fileRef = 56ED04E2118A8EFD00A56AA6 /* SDL_syspower.m */; };
FD24846D0E5655AE0021E198 /* SDL_uikitkeyboard.h in Headers */ = {isa = PBXBuildFile; fileRef = FD24846B0E5655AE0021E198 /* SDL_uikitkeyboard.h */; };
FD3F495C0DEA5B2100C5B771 /* begin_code.h in Headers */ = {isa = PBXBuildFile; fileRef = FD99B8CC0DD52EB400FB1D6B /* begin_code.h */; settings = {ATTRIBUTES = (Public, ); }; };
FD3F495D0DEA5B2100C5B771 /* close_code.h in Headers */ = {isa = PBXBuildFile; fileRef = FD99B8CD0DD52EB400FB1D6B /* close_code.h */; settings = {ATTRIBUTES = (Public, ); }; };
Expand Down Expand Up @@ -247,6 +249,8 @@
1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
1D3623EB0D0F72F000981E51 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
56ED04E0118A8EE200A56AA6 /* SDL_power.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SDL_power.c; path = ../../src/power/SDL_power.c; sourceTree = SOURCE_ROOT; };
56ED04E2118A8EFD00A56AA6 /* SDL_syspower.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDL_syspower.m; path = ../../src/power/uikit/SDL_syspower.m; sourceTree = SOURCE_ROOT; };
FD0BBFEF0E3933DD00D833B1 /* SDL_uikitview.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_uikitview.h; sourceTree = "<group>"; };
FD24846B0E5655AE0021E198 /* SDL_uikitkeyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDL_uikitkeyboard.h; sourceTree = "<group>"; };
FD3F4A700DEA620800C5B771 /* SDL_getenv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDL_getenv.c; sourceTree = "<group>"; };
Expand Down Expand Up @@ -488,6 +492,23 @@
name = Frameworks;
sourceTree = "<group>";
};
56ED04DE118A8E9A00A56AA6 /* power */ = {
isa = PBXGroup;
children = (
56ED04E0118A8EE200A56AA6 /* SDL_power.c */,
56ED04DF118A8EB700A56AA6 /* uikit */,
);
name = power;
sourceTree = "<group>";
};
56ED04DF118A8EB700A56AA6 /* uikit */ = {
isa = PBXGroup;
children = (
56ED04E2118A8EFD00A56AA6 /* SDL_syspower.m */,
);
name = uikit;
sourceTree = "<group>";
};
FD3F4A6F0DEA620800C5B771 /* stdlib */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -642,6 +663,7 @@
047677B60EA769DF008ABAF1 /* haptic */,
FD5F9D080E0E08B3008E885B /* joystick */,
FD8BD8150E27E25900B52CD5 /* loadso */,
56ED04DE118A8E9A00A56AA6 /* power */,
FD3F4A6F0DEA620800C5B771 /* stdlib */,
FD99B9E00DD52EDC00FB1D6B /* thread */,
FD99BA1E0DD52EDC00FB1D6B /* timer */,
Expand Down Expand Up @@ -1103,6 +1125,8 @@
043DD77110FD8A0000DED673 /* SDL_blendfillrect.c in Sources */,
043DD77210FD8A0000DED673 /* SDL_drawrect.c in Sources */,
04F2AF561104ABD200D6DDF7 /* SDL_assert.c in Sources */,
56ED04E1118A8EE200A56AA6 /* SDL_power.c in Sources */,
56ED04E3118A8EFD00A56AA6 /* SDL_syspower.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
102 changes: 102 additions & 0 deletions Xcode-iPhoneOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj
Expand Up @@ -7,6 +7,16 @@
objects = {

/* Begin PBXBuildFile section */
56ED04FE118A8FE400A56AA6 /* icon.bmp in Resources */ = {isa = PBXBuildFile; fileRef = FDA8AAD90E2D33B000EA573E /* icon.bmp */; };
56ED0502118A8FE400A56AA6 /* libSDLiPhoneOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FD1B48B80E3131CA007AB34E /* libSDLiPhoneOS.a */; };
56ED0503118A8FE400A56AA6 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8A8980E2D111A00EA573E /* AudioToolbox.framework */; };
56ED0504118A8FE400A56AA6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8A8990E2D111A00EA573E /* QuartzCore.framework */; };
56ED0505118A8FE400A56AA6 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8A89A0E2D111A00EA573E /* OpenGLES.framework */; };
56ED0506118A8FE400A56AA6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8A89B0E2D111A00EA573E /* CoreGraphics.framework */; };
56ED0507118A8FE400A56AA6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8A89C0E2D111A00EA573E /* UIKit.framework */; };
56ED0508118A8FE400A56AA6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8A89D0E2D111A00EA573E /* Foundation.framework */; };
56ED0509118A8FE400A56AA6 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8A89E0E2D111A00EA573E /* CoreAudio.framework */; };
56ED0511118A904200A56AA6 /* testpower.c in Sources */ = {isa = PBXBuildFile; fileRef = 56ED0510118A904200A56AA6 /* testpower.c */; };
FDA8A79B0E2D0F8B00EA573E /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = FDA8A7840E2D0F1F00EA573E /* common.c */; };
FDA8A79C0E2D0F9300EA573E /* testwm2.c in Sources */ = {isa = PBXBuildFile; fileRef = FDA8A75F0E2D0F1600EA573E /* testwm2.c */; };
FDA8A89F0E2D111A00EA573E /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8A8980E2D111A00EA573E /* AudioToolbox.framework */; };
Expand Down Expand Up @@ -288,6 +298,10 @@

/* Begin PBXFileReference section */
1D6058910D05DD3D006BFB54 /* testwm2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = testwm2.app; sourceTree = BUILT_PRODUCTS_DIR; };
56ED04F7118A8FCC00A56AA6 /* testpower-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "testpower-Info.plist"; sourceTree = "<group>"; };
56ED050D118A8FE400A56AA6 /* testpower.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = testpower.app; sourceTree = BUILT_PRODUCTS_DIR; };
56ED050F118A8FE400A56AA6 /* Info copy.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info copy.plist"; sourceTree = "<group>"; };
56ED0510118A904200A56AA6 /* testpower.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testpower.c; path = ../../test/testpower.c; sourceTree = SOURCE_ROOT; };
FD1B48AC0E3131CA007AB34E /* SDLiPhoneOS.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SDLiPhoneOS.xcodeproj; path = ../SDL/SDLiPhoneOS.xcodeproj; sourceTree = SOURCE_ROOT; };
FDA8A7400E2D0F1600EA573E /* testalpha.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testalpha.c; path = ../../test/testalpha.c; sourceTree = SOURCE_ROOT; };
FDA8A7410E2D0F1600EA573E /* testaudioinfo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testaudioinfo.c; path = ../../test/testaudioinfo.c; sourceTree = SOURCE_ROOT; };
Expand Down Expand Up @@ -386,6 +400,21 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
56ED0501118A8FE400A56AA6 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
56ED0502118A8FE400A56AA6 /* libSDLiPhoneOS.a in Frameworks */,
56ED0503118A8FE400A56AA6 /* AudioToolbox.framework in Frameworks */,
56ED0504118A8FE400A56AA6 /* QuartzCore.framework in Frameworks */,
56ED0505118A8FE400A56AA6 /* OpenGLES.framework in Frameworks */,
56ED0506118A8FE400A56AA6 /* CoreGraphics.framework in Frameworks */,
56ED0507118A8FE400A56AA6 /* UIKit.framework in Frameworks */,
56ED0508118A8FE400A56AA6 /* Foundation.framework in Frameworks */,
56ED0509118A8FE400A56AA6 /* CoreAudio.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FDA8A9220E2D1C0B00EA573E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
Expand Down Expand Up @@ -824,18 +853,22 @@
FDD2C6B30E2E92D200B7A85F /* threadwin.app */,
FDD2C6F40E2E959E00B7A85F /* torturethread.app */,
FDC430000F0D866D009C87E1 /* torturethread.app */,
56ED050D118A8FE400A56AA6 /* testpower.app */,
);
name = Products;
sourceTree = "<group>";
};
29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
isa = PBXGroup;
children = (
56ED0510118A904200A56AA6 /* testpower.c */,
FD1B48AC0E3131CA007AB34E /* SDLiPhoneOS.xcodeproj */,
FDA8AAD60E2D339A00EA573E /* Resources */,
FDA8A7C30E2D10FA00EA573E /* Linked Frameworks */,
FDA8A73B0E2D0F0400EA573E /* src */,
19C28FACFE9D520D11CA2CBB /* Products */,
56ED04F7118A8FCC00A56AA6 /* testpower-Info.plist */,
56ED050F118A8FE400A56AA6 /* Info copy.plist */,
);
name = CustomTemplate;
sourceTree = "<group>";
Expand Down Expand Up @@ -941,6 +974,23 @@
productReference = 1D6058910D05DD3D006BFB54 /* testwm2.app */;
productType = "com.apple.product-type.application";
};
56ED04FC118A8FE400A56AA6 /* testpower */ = {
isa = PBXNativeTarget;
buildConfigurationList = 56ED050A118A8FE400A56AA6 /* Build configuration list for PBXNativeTarget "testpower" */;
buildPhases = (
56ED04FD118A8FE400A56AA6 /* Resources */,
56ED04FF118A8FE400A56AA6 /* Sources */,
56ED0501118A8FE400A56AA6 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = testpower;
productName = TestiPhoneOS;
productReference = 56ED050D118A8FE400A56AA6 /* testpower.app */;
productType = "com.apple.product-type.application";
};
FDA8A91D0E2D1C0B00EA573E /* graywin */ = {
isa = PBXNativeTarget;
buildConfigurationList = FDA8A92C0E2D1C0B00EA573E /* Build configuration list for PBXNativeTarget "graywin" */;
Expand Down Expand Up @@ -1437,6 +1487,7 @@
FDD2C46B0E2E77D700B7A85F /* testlock */,
FDD2C4A60E2E79C300B7A85F /* testpalette */,
FDD2C4F90E2E7F4800B7A85F /* testplatform */,
56ED04FC118A8FE400A56AA6 /* testpower */,
FDD2C5170E2E807600B7A85F /* testsem */,
FDD2C53D0E2E80E400B7A85F /* testsprite2 */,
FDD2C5740E2E8C7400B7A85F /* testtimer */,
Expand Down Expand Up @@ -1468,6 +1519,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
56ED04FD118A8FE400A56AA6 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
56ED04FE118A8FE400A56AA6 /* icon.bmp in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FDA8A91E0E2D1C0B00EA573E /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
Expand Down Expand Up @@ -1681,6 +1740,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
56ED04FF118A8FE400A56AA6 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
56ED0511118A904200A56AA6 /* testpower.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FDA8A91F0E2D1C0B00EA573E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
Expand Down Expand Up @@ -1929,6 +1996,32 @@
};
name = Release;
};
56ED050B118A8FE400A56AA6 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "";
INFOPLIST_FILE = "Info copy.plist";
PRODUCT_NAME = testpower;
};
name = Debug;
};
56ED050C118A8FE400A56AA6 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
COPY_PHASE_STRIP = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "";
INFOPLIST_FILE = "Info copy.plist";
PRODUCT_NAME = testpower;
};
name = Release;
};
C01FCF4F08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
Expand Down Expand Up @@ -2674,6 +2767,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
56ED050A118A8FE400A56AA6 /* Build configuration list for PBXNativeTarget "testpower" */ = {
isa = XCConfigurationList;
buildConfigurations = (
56ED050B118A8FE400A56AA6 /* Debug */,
56ED050C118A8FE400A56AA6 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "TestiPhoneOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
Expand Down
2 changes: 1 addition & 1 deletion include/SDL_config_iphoneos.h
Expand Up @@ -142,7 +142,7 @@ typedef unsigned long uintptr_t;
#define SDL_VIDEO_RENDER_OGL_ES 1

/* Enable system power support */
#define SDL_POWER_MACOSX 1
#define SDL_POWER_UIKIT 1

/* enable iPhone keyboard support */
#define SDL_IPHONE_KEYBOARD 0
Expand Down
6 changes: 5 additions & 1 deletion src/power/SDL_power.c
Expand Up @@ -36,6 +36,7 @@ SDL_bool SDL_GetPowerInfo_Windows(SDL_PowerState *, int *, int *);
SDL_bool SDL_GetPowerInfo_MacOSX(SDL_PowerState *, int *, int *);
SDL_bool SDL_GetPowerInfo_BeOS(SDL_PowerState *, int *, int *);
SDL_bool SDL_GetPowerInfo_NintendoDS(SDL_PowerState *, int *, int *);
SDL_bool SDL_GetPowerInfo_UIKit(SDL_PowerState *, int *, int *);

#ifndef SDL_POWER_DISABLED
#ifdef SDL_POWER_HARDWIRED
Expand All @@ -61,7 +62,10 @@ static SDL_GetPowerInfo_Impl implementations[] = {
#ifdef SDL_POWER_WINDOWS /* handles Win32, Win64, PocketPC. */
SDL_GetPowerInfo_Windows,
#endif
#ifdef SDL_POWER_MACOSX /* handles Mac OS X, Darwin, iPhone. */
#ifdef SDL_POWER_UIKIT /* handles iPhone/iPad/etc */
SDL_GetPowerInfo_UIKit,
#endif
#ifdef SDL_POWER_MACOSX /* handles Mac OS X, Darwin. */
SDL_GetPowerInfo_MacOSX,
#endif
#ifdef SDL_POWER_NINTENDODS /* handles Nintendo DS. */
Expand Down
100 changes: 100 additions & 0 deletions src/power/uikit/SDL_syspower.m
@@ -0,0 +1,100 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2010 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
*/
#include "SDL_config.h"

#ifndef SDL_POWER_DISABLED
#ifdef SDL_POWER_UIKIT

#import <UIKit/UIKit.h>

#include "SDL_power.h"
#include "SDL_timer.h"
#include "SDL_assert.h"

// turn off the battery monitor if it's been more than X ms since last check.
static const int BATTERY_MONITORING_TIMEOUT = 3000;
static Uint32 SDL_UIKitLastPowerInfoQuery = 0;

void
SDL_UIKit_UpdateBatteryMonitoring(void)
{
if (SDL_UIKitLastPowerInfoQuery) {
const Uint32 prev = SDL_UIKitLastPowerInfoQuery;
const UInt32 now = SDL_GetTicks();
const UInt32 ticks = now - prev;
// if timer wrapped (now < prev), shut down, too.
if ((now < prev) || (ticks >= BATTERY_MONITORING_TIMEOUT)) {
UIDevice *uidev = [UIDevice currentDevice];
SDL_assert([uidev isBatteryMonitoringEnabled] == YES);
[uidev setBatteryMonitoringEnabled:NO];
SDL_UIKitLastPowerInfoQuery = 0;
}
}
}

SDL_bool
SDL_GetPowerInfo_UIKit(SDL_PowerState * state, int *seconds, int *percent)
{
UIDevice *uidev = [UIDevice currentDevice];

if (!SDL_UIKitLastPowerInfoQuery) {
SDL_assert([uidev isBatteryMonitoringEnabled] == NO);
[uidev setBatteryMonitoringEnabled:YES];
}

// UIKit_GL_SwapWindow() (etc) will check this and disable the battery
// monitoring if the app hasn't queried it in the last X seconds.
// Apparently monitoring the battery burns battery life. :)
// Apple's docs say not to monitor the battery unless you need it.
SDL_UIKitLastPowerInfoQuery = SDL_GetTicks();

*seconds = -1; // no API to estimate this in UIKit.

switch ([uidev batteryState])
{
case UIDeviceBatteryStateCharging:
*state = SDL_POWERSTATE_CHARGING;
break;

case UIDeviceBatteryStateFull:
*state = SDL_POWERSTATE_CHARGED;
break;

case UIDeviceBatteryStateUnplugged:
*state = SDL_POWERSTATE_ON_BATTERY;
break;

case UIDeviceBatteryStateUnknown:
default:
*state = SDL_POWERSTATE_UNKNOWN;
break;
}

const float level = [uidev batteryLevel];
*percent = ( (level < 0.0f) ? -1 : (((int) (level + 0.5f)) * 100) );
return SDL_TRUE; /* always the definitive answer on iPhoneOS. */
}

#endif /* SDL_POWER_UIKIT */
#endif /* SDL_POWER_DISABLED */

/* vi: set ts=4 sw=4 expandtab: */
5 changes: 5 additions & 0 deletions src/video/uikit/SDL_uikitopengles.m
Expand Up @@ -73,9 +73,14 @@ int UIKit_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
return 0;
}

extern void SDL_UIKit_UpdateBatteryMonitoring(void);

void UIKit_GL_SwapWindow(_THIS, SDL_Window * window)
{
#ifdef SDL_POWER_UIKIT
// Check once a frame to see if we should turn off the battery monitor.
SDL_UIKit_UpdateBatteryMonitoring();
#endif

SDL_WindowData *data = (SDL_WindowData *)window->driverdata;

Expand Down

0 comments on commit 34faead

Please sign in to comment.