X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/8ad349bb6ed4a0be06e34c92be0d98b92e078db4..6d2010ae8f7a6078e10b361c6962983bab233e0f:/iokit/Kernel/IOPMPowerSource.cpp diff --git a/iokit/Kernel/IOPMPowerSource.cpp b/iokit/Kernel/IOPMPowerSource.cpp index 7d06bbd96..614f4caa3 100644 --- a/iokit/Kernel/IOPMPowerSource.cpp +++ b/iokit/Kernel/IOPMPowerSource.cpp @@ -1,174 +1,416 @@ /* - * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 1998-2005 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_OSREFERENCE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the - * License may not be used to create, or enable the creation or - * redistribution of, unlawful or unlicensed copies of an Apple operating - * system, or to circumvent, violate, or enable the circumvention or - * violation of, any terms of an Apple operating system software license - * agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and * limitations under the License. - * - * @APPLE_LICENSE_OSREFERENCE_HEADER_END@ + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ #include +#include +#include +#include -#define super OSObject +#define super IOService -OSDefineMetaClassAndStructors(IOPMPowerSource, OSObject) +OSDefineMetaClassAndStructors(IOPMPowerSource, IOService) -// ********************************************************************************** -// init +// ***************************************************************************** +// powerSource // -// ********************************************************************************** -bool IOPMPowerSource::init (unsigned short whichBatteryIndex) -{ - if (!super::init ()) - return false; +// Static initializer for IOPMPowerSource. Returns a new instance of the class +// which the caller must attach to the power plane. +// ***************************************************************************** - bBatteryIndex = whichBatteryIndex; - nextInList = 0; +IOPMPowerSource *IOPMPowerSource::powerSource(void) +{ + IOPMPowerSource *ps = new IOPMPowerSource; - return true; + if(ps) { + ps->init(); + return ps; + } + return NULL; } -// ********************************************************************************** -// capacityPercentRemaining +// ***************************************************************************** +// init // -// ********************************************************************************** -unsigned long IOPMPowerSource::capacityPercentRemaining (void) +// ***************************************************************************** +bool IOPMPowerSource::init (void) { - unsigned long percentage = 0; + if (!super::init()) { + return false; + } - if (bMaxCapacity > 0) - percentage = (bCurCapacity * 100) / bMaxCapacity; - - // always return a non-zero value unless the real capacity IS zero. - if (percentage == 0 && bCurCapacity > 0) - percentage = 1; + nextInList = NULL; - return percentage; + properties = OSDictionary::withCapacity(10); + if(!properties) return false; + properties->setCapacityIncrement(1); + + externalConnectedKey = OSSymbol::withCString(kIOPMPSExternalConnectedKey); + externalChargeCapableKey = OSSymbol::withCString(kIOPMPSExternalChargeCapableKey); + batteryInstalledKey = OSSymbol::withCString(kIOPMPSBatteryInstalledKey); + chargingKey = OSSymbol::withCString(kIOPMPSIsChargingKey); + warnLevelKey = OSSymbol::withCString(kIOPMPSAtWarnLevelKey); + criticalLevelKey = OSSymbol::withCString(kIOPMPSAtCriticalLevelKey); + currentCapacityKey = OSSymbol::withCString(kIOPMPSCurrentCapacityKey); + maxCapacityKey = OSSymbol::withCString(kIOPMPSMaxCapacityKey); + timeRemainingKey = OSSymbol::withCString(kIOPMPSTimeRemainingKey); + amperageKey = OSSymbol::withCString(kIOPMPSAmperageKey); + voltageKey = OSSymbol::withCString(kIOPMPSVoltageKey); + cycleCountKey = OSSymbol::withCString(kIOPMPSCycleCountKey); + adapterInfoKey = OSSymbol::withCString(kIOPMPSAdapterInfoKey); + locationKey = OSSymbol::withCString(kIOPMPSLocationKey); + errorConditionKey = OSSymbol::withCString(kIOPMPSErrorConditionKey); + manufacturerKey = OSSymbol::withCString(kIOPMPSManufacturerKey); + modelKey = OSSymbol::withCString(kIOPMPSModelKey); + serialKey = OSSymbol::withCString(kIOPMPSSerialKey); + batteryInfoKey = OSSymbol::withCString(kIOPMPSLegacyBatteryInfoKey); + + return true; } -// ********************************************************************************** -// atWarnLevel +// ***************************************************************************** +// free // -// ********************************************************************************** -bool IOPMPowerSource::atWarnLevel (void) +// ***************************************************************************** +void IOPMPowerSource::free(void) { - return bFlags & kBatteryAtWarn; + if(properties) properties->release(); + if(externalConnectedKey) externalConnectedKey->release(); + if(externalChargeCapableKey) externalChargeCapableKey->release(); + if(batteryInstalledKey) batteryInstalledKey->release(); + if(chargingKey) chargingKey->release(); + if(warnLevelKey) warnLevelKey->release(); + if(criticalLevelKey) criticalLevelKey->release(); + if(currentCapacityKey) currentCapacityKey->release(); + if(maxCapacityKey) maxCapacityKey->release(); + if(timeRemainingKey) timeRemainingKey->release(); + if(amperageKey) amperageKey->release(); + if(voltageKey) voltageKey->release(); + if(cycleCountKey) cycleCountKey->release(); + if(adapterInfoKey) adapterInfoKey->release(); + if(errorConditionKey) errorConditionKey->release(); + if(manufacturerKey) manufacturerKey->release(); + if(modelKey) modelKey->release(); + if(serialKey) serialKey->release(); + if(locationKey) locationKey->release(); + if(batteryInfoKey) batteryInfoKey->release(); } -// ********************************************************************************** -// acConnected +// ***************************************************************************** +// updateStatus // -// ********************************************************************************** -bool IOPMPowerSource::acConnected (void) +// Update power source state in IORegistry and message interested clients +// notifying them of our change. +// ***************************************************************************** +void IOPMPowerSource::updateStatus (void) { - return bFlags & kACInstalled; + OSCollectionIterator *iterator; + OSObject *iteratorKey; + OSObject *obj; + + // do nothing if settings haven't changed + if(!settingsChangedSinceUpdate) return; + + iterator = OSCollectionIterator::withCollection(properties); + if(!iterator) return; + + while ((iteratorKey = iterator->getNextObject())) { + OSSymbol *key; + + key = OSDynamicCast(OSSymbol, iteratorKey); + if (!key) continue; + obj = properties->getObject(key); + if(!obj) continue; + setProperty(key, obj); + } + iterator->release(); + + settingsChangedSinceUpdate = false; + + // And up goes the flare + messageClients(kIOPMMessageBatteryStatusHasChanged); } -// ********************************************************************************** -// depleted -// -// ********************************************************************************** -bool IOPMPowerSource::depleted (void) + +/******************************************************************************* + * + * PROTECTED Accessors. All the setters! Yay! + * + ******************************************************************************/ + +void IOPMPowerSource::setPSProperty(const OSSymbol *key, OSObject *val) { - return bFlags & kBatteryDepleted; + OSObject *lastVal; + + if(!key || !val) return; + + // Compare new setting with existing setting; update + // 'settingsChangedSinceUpdate' if the setting has changed. + // If values are OSNumbers, do equality comparison. + // Otherwise, just compare pointers. + + if( (lastVal = properties->getObject(key)) ) { + if(val->isEqualTo(lastVal)) { + // settings didn't change + } else { + // num val is not equal to last val + settingsChangedSinceUpdate = true; + } + } else { + // new setting; no last value + settingsChangedSinceUpdate = true; + } + + // here's the part where we go crazy. + properties->setObject(key, val); } -// ********************************************************************************** -// isInstalled -// -// ********************************************************************************** -bool IOPMPowerSource::isInstalled (void) -{ - return bFlags & kBatteryInstalled; + + +void IOPMPowerSource::setExternalConnected(bool b) { + setPSProperty(externalConnectedKey, + b ? kOSBooleanTrue : kOSBooleanFalse); } -// ********************************************************************************** -// isCharging -// -// ********************************************************************************** -bool IOPMPowerSource::isCharging (void) -{ - return bFlags & kBatteryCharging; +void IOPMPowerSource::setExternalChargeCapable(bool b) { + setPSProperty(externalChargeCapableKey, + b ? kOSBooleanTrue : kOSBooleanFalse); } -// ********************************************************************************** -// timeRemaining -// -// ********************************************************************************** -unsigned long IOPMPowerSource::timeRemaining (void) -{ - return bTimeRemaining; +void IOPMPowerSource::setBatteryInstalled(bool b) { + setPSProperty(batteryInstalledKey, + b ? kOSBooleanTrue : kOSBooleanFalse); } -// ********************************************************************************** -// maxCapacity -// -// ********************************************************************************** -unsigned long IOPMPowerSource::maxCapacity (void) -{ - return bMaxCapacity; +void IOPMPowerSource::setIsCharging(bool b) { + setPSProperty(chargingKey, + b ? kOSBooleanTrue : kOSBooleanFalse); } -// ********************************************************************************** -// curCapacity -// -// ********************************************************************************** -unsigned long IOPMPowerSource::curCapacity (void) -{ - return bCurCapacity; +void IOPMPowerSource::setAtWarnLevel(bool b) { + setPSProperty(warnLevelKey, + b ? kOSBooleanTrue : kOSBooleanFalse); } -// ********************************************************************************** -// currentDrawn -// -// ********************************************************************************** -long IOPMPowerSource::currentDrawn (void) -{ - return bCurrent; +void IOPMPowerSource::setAtCriticalLevel(bool b) { + setPSProperty(criticalLevelKey, + b ? kOSBooleanTrue : kOSBooleanFalse); } -// ********************************************************************************** -// voltage -// -// ********************************************************************************** -unsigned long IOPMPowerSource::voltage (void) -{ - return bVoltage; +void IOPMPowerSource::setCurrentCapacity(unsigned int val) { + OSNumber *n = OSNumber::withNumber(val, 32); + setPSProperty(currentCapacityKey, n); + n->release(); } -// ********************************************************************************** -// updateStatus -// -// ********************************************************************************** +void IOPMPowerSource::setMaxCapacity(unsigned int val) { + OSNumber *n = OSNumber::withNumber(val, 32); + setPSProperty(maxCapacityKey, n); + n->release(); +} -void IOPMPowerSource::updateStatus (void) +void IOPMPowerSource::setTimeRemaining(int val) { + OSNumber *n = OSNumber::withNumber(val, 32); + setPSProperty(timeRemainingKey, n); + n->release(); +} + +void IOPMPowerSource::setAmperage(int val) { + OSNumber *n = OSNumber::withNumber(val, 32); + setPSProperty(amperageKey, n); + n->release(); +} + +void IOPMPowerSource::setVoltage(unsigned int val) { + OSNumber *n = OSNumber::withNumber(val, 32); + setPSProperty(voltageKey, n); + n->release(); +} + +void IOPMPowerSource::setCycleCount(unsigned int val) { + OSNumber *n = OSNumber::withNumber(val, 32); + setPSProperty(cycleCountKey, n); + n->release(); +} + +void IOPMPowerSource::setAdapterInfo(int val) { + OSNumber *n = OSNumber::withNumber(val, 32); + setPSProperty(adapterInfoKey, n); + n->release(); +} + +void IOPMPowerSource::setLocation(int val) { + OSNumber *n = OSNumber::withNumber(val, 32); + setPSProperty(locationKey, n); + n->release(); +} + +void IOPMPowerSource::setErrorCondition(OSSymbol *s) { + setPSProperty(errorConditionKey, s); +} + +void IOPMPowerSource::setManufacturer(OSSymbol *s) { + setPSProperty(manufacturerKey, s); +} + +void IOPMPowerSource::setModel(OSSymbol *s) { + setPSProperty(modelKey, s); +} + +void IOPMPowerSource::setSerial(OSSymbol *s) { + setPSProperty(serialKey, s); +} + +void IOPMPowerSource::setLegacyIOBatteryInfo(OSDictionary *d) { + setPSProperty(batteryInfoKey, d); +} + + + + +/******************************************************************************* + * + * PUBLIC Accessors. All the getters! Boo! + * + ******************************************************************************/ + +OSObject *IOPMPowerSource::getPSProperty(const OSSymbol *symmie) { + if(!symmie) return NULL; + return properties->getObject(symmie); +} + +bool IOPMPowerSource::externalConnected(void) { + return (kOSBooleanTrue == properties->getObject(externalConnectedKey)); +} + +bool IOPMPowerSource::externalChargeCapable(void) { + return (kOSBooleanTrue == properties->getObject(externalChargeCapableKey)); +} + +bool IOPMPowerSource::batteryInstalled(void) { + return (kOSBooleanTrue == properties->getObject(batteryInstalledKey)); +} + +bool IOPMPowerSource::isCharging(void) { + return (kOSBooleanTrue == properties->getObject(chargingKey)); +} + +bool IOPMPowerSource::atWarnLevel(void) { + return (kOSBooleanTrue == properties->getObject(warnLevelKey)); +} + +bool IOPMPowerSource::atCriticalLevel(void) { + return (kOSBooleanTrue == properties->getObject(criticalLevelKey)); +} + +unsigned int IOPMPowerSource::currentCapacity(void) { + OSNumber *n; + n = OSDynamicCast(OSNumber, properties->getObject(currentCapacityKey)); + if(!n) return 0; + else return (unsigned int)n->unsigned32BitValue(); +} + +unsigned int IOPMPowerSource::maxCapacity(void) { + OSNumber *n; + n = OSDynamicCast(OSNumber, properties->getObject(maxCapacityKey)); + if(!n) return 0; + else return (unsigned int)n->unsigned32BitValue(); +} + +unsigned int IOPMPowerSource::capacityPercentRemaining(void) { + unsigned int _currentCapacity = currentCapacity(); + unsigned int _maxCapacity = maxCapacity(); + if(0 == _maxCapacity) { + return 0; + } else { + return ((100*_currentCapacity) / _maxCapacity); + } +} +int IOPMPowerSource::timeRemaining(void) { + OSNumber *n; + n = OSDynamicCast(OSNumber, properties->getObject(timeRemainingKey)); + if(!n) return 0; + else return (int)n->unsigned32BitValue(); } +int IOPMPowerSource::amperage(void) { + OSNumber *n; + n = OSDynamicCast(OSNumber, properties->getObject(amperageKey)); + if(!n) return 0; + else return (int)n->unsigned32BitValue(); +} +unsigned int IOPMPowerSource::voltage(void) { + OSNumber *n; + n = OSDynamicCast(OSNumber, properties->getObject(voltageKey)); + if(!n) return 0; + else return (unsigned int)n->unsigned32BitValue(); +} +unsigned int IOPMPowerSource::cycleCount(void) { + OSNumber *n; + n = OSDynamicCast(OSNumber, properties->getObject(cycleCountKey)); + if(!n) return 0; + else return (unsigned int)n->unsigned32BitValue(); +} + +int IOPMPowerSource::adapterInfo(void) { + OSNumber *n; + n = OSDynamicCast(OSNumber, properties->getObject(adapterInfoKey)); + if(!n) return 0; + else return (int)n->unsigned32BitValue(); +} +int IOPMPowerSource::location(void) { + OSNumber *n; + n = OSDynamicCast(OSNumber, properties->getObject(locationKey)); + if(!n) return 0; + else return (unsigned int)n->unsigned32BitValue(); +} +OSSymbol *IOPMPowerSource::errorCondition(void) { + return OSDynamicCast(OSSymbol, properties->getObject(errorConditionKey)); +} + +OSSymbol *IOPMPowerSource::manufacturer(void) { + return OSDynamicCast(OSSymbol, properties->getObject(manufacturerKey)); +} + +OSSymbol *IOPMPowerSource::model(void) { + return OSDynamicCast(OSSymbol, properties->getObject(modelKey)); +} + +OSSymbol *IOPMPowerSource::serial(void) { + return OSDynamicCast(OSSymbol, properties->getObject(serialKey)); +} + +OSDictionary *IOPMPowerSource::legacyIOBatteryInfo(void) { + return OSDynamicCast(OSDictionary, properties->getObject(batteryInfoKey)); +}