Mercurial > sdl-ios-xcode
diff src/power/uikit/SDL_syspower.m @ 4444:42e1092225f9
Implemented SDL power APIs for iPhoneOS.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Fri, 30 Apr 2010 00:39:31 -0400 |
parents | |
children | b530ef003506 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/power/uikit/SDL_syspower.m Fri Apr 30 00:39:31 2010 -0400 @@ -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: */