2 * Copyright (c) 1998-2005 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
20 * @APPLE_LICENSE_HEADER_END@
23 #include <IOKit/pwr_mgt/IOPMPowerSource.h>
24 #include <IOKit/pwr_mgt/IOPM.h>
25 #include <IOKit/IOMessage.h>
26 #include <IOKit/IOLib.h>
28 #define super IOService
30 OSDefineMetaClassAndStructors(IOPMPowerSource
, IOService
)
32 // *****************************************************************************
35 // Static initializer for IOPMPowerSource. Returns a new instance of the class
36 // which the caller must attach to the power plane.
37 // *****************************************************************************
39 IOPMPowerSource
*IOPMPowerSource::powerSource(void)
41 IOPMPowerSource
*ps
= new IOPMPowerSource
;
50 // *****************************************************************************
53 // *****************************************************************************
54 bool IOPMPowerSource::init (void)
62 properties
= OSDictionary::withCapacity(10);
63 if(!properties
) return false;
64 properties
->setCapacityIncrement(1);
66 externalConnectedKey
= OSSymbol::withCString(kIOPMPSExternalConnectedKey
);
67 externalChargeCapableKey
= OSSymbol::withCString(kIOPMPSExternalChargeCapableKey
);
68 batteryInstalledKey
= OSSymbol::withCString(kIOPMPSBatteryInstalledKey
);
69 chargingKey
= OSSymbol::withCString(kIOPMPSIsChargingKey
);
70 warnLevelKey
= OSSymbol::withCString(kIOPMPSAtWarnLevelKey
);
71 criticalLevelKey
= OSSymbol::withCString(kIOPMPSAtCriticalLevelKey
);
72 currentCapacityKey
= OSSymbol::withCString(kIOPMPSCurrentCapacityKey
);
73 maxCapacityKey
= OSSymbol::withCString(kIOPMPSMaxCapacityKey
);
74 timeRemainingKey
= OSSymbol::withCString(kIOPMPSTimeRemainingKey
);
75 amperageKey
= OSSymbol::withCString(kIOPMPSAmperageKey
);
76 voltageKey
= OSSymbol::withCString(kIOPMPSVoltageKey
);
77 cycleCountKey
= OSSymbol::withCString(kIOPMPSCycleCountKey
);
78 adapterInfoKey
= OSSymbol::withCString(kIOPMPSAdapterInfoKey
);
79 locationKey
= OSSymbol::withCString(kIOPMPSLocationKey
);
80 errorConditionKey
= OSSymbol::withCString(kIOPMPSErrorConditionKey
);
81 manufacturerKey
= OSSymbol::withCString(kIOPMPSManufacturerKey
);
82 modelKey
= OSSymbol::withCString(kIOPMPSModelKey
);
83 serialKey
= OSSymbol::withCString(kIOPMPSSerialKey
);
84 batteryInfoKey
= OSSymbol::withCString(kIOPMPSLegacyBatteryInfoKey
);
89 // *****************************************************************************
92 // *****************************************************************************
93 void IOPMPowerSource::free(void)
95 if(properties
) properties
->release();
96 if(externalConnectedKey
) externalConnectedKey
->release();
97 if(externalChargeCapableKey
) externalChargeCapableKey
->release();
98 if(batteryInstalledKey
) batteryInstalledKey
->release();
99 if(chargingKey
) chargingKey
->release();
100 if(warnLevelKey
) warnLevelKey
->release();
101 if(criticalLevelKey
) criticalLevelKey
->release();
102 if(currentCapacityKey
) currentCapacityKey
->release();
103 if(maxCapacityKey
) maxCapacityKey
->release();
104 if(timeRemainingKey
) timeRemainingKey
->release();
105 if(amperageKey
) amperageKey
->release();
106 if(voltageKey
) voltageKey
->release();
107 if(cycleCountKey
) cycleCountKey
->release();
108 if(adapterInfoKey
) adapterInfoKey
->release();
109 if(errorConditionKey
) errorConditionKey
->release();
110 if(manufacturerKey
) manufacturerKey
->release();
111 if(modelKey
) modelKey
->release();
112 if(serialKey
) serialKey
->release();
113 if(locationKey
) locationKey
->release();
114 if(batteryInfoKey
) batteryInfoKey
->release();
117 // *****************************************************************************
120 // Update power source state in IORegistry and message interested clients
121 // notifying them of our change.
122 // *****************************************************************************
123 void IOPMPowerSource::updateStatus (void)
125 OSCollectionIterator
*iterator
;
126 OSObject
*iteratorKey
;
129 iterator
= OSCollectionIterator::withCollection(properties
);
130 if(!iterator
) return;
132 while ((iteratorKey
= iterator
->getNextObject())) {
135 key
= OSDynamicCast(OSSymbol
, iteratorKey
);
137 obj
= properties
->getObject(key
);
139 setProperty(key
, obj
);
143 // And up goes the flare
144 messageClients(kIOPMMessageBatteryStatusHasChanged
);
148 /*******************************************************************************
150 * PROTECTED Accessors. All the setters! Yay!
152 ******************************************************************************/
154 void IOPMPowerSource::setExternalConnected(bool b
) {
155 properties
->setObject(
156 externalConnectedKey
,
157 b
? kOSBooleanTrue
:kOSBooleanFalse
);
160 void IOPMPowerSource::setExternalChargeCapable(bool b
) {
161 properties
->setObject(
162 externalChargeCapableKey
,
163 b
? kOSBooleanTrue
:kOSBooleanFalse
);
166 void IOPMPowerSource::setBatteryInstalled(bool b
) {
167 properties
->setObject(
169 b
? kOSBooleanTrue
:kOSBooleanFalse
);
172 void IOPMPowerSource::setIsCharging(bool b
) {
173 properties
->setObject(
175 b
? kOSBooleanTrue
:kOSBooleanFalse
);
178 void IOPMPowerSource::setAtWarnLevel(bool b
) {
179 properties
->setObject(
181 b
? kOSBooleanTrue
:kOSBooleanFalse
);
184 void IOPMPowerSource::setAtCriticalLevel(bool b
) {
185 properties
->setObject(
187 b
? kOSBooleanTrue
:kOSBooleanFalse
);
191 void IOPMPowerSource::setCurrentCapacity(unsigned int val
) {
192 OSNumber
*n
= OSNumber::withNumber(val
, 32);
193 properties
->setObject(
199 void IOPMPowerSource::setMaxCapacity(unsigned int val
) {
200 OSNumber
*n
= OSNumber::withNumber(val
, 32);
201 properties
->setObject(
207 void IOPMPowerSource::setTimeRemaining(int val
) {
208 OSNumber
*n
= OSNumber::withNumber(val
, 32);
209 properties
->setObject(
215 void IOPMPowerSource::setAmperage(int val
) {
216 OSNumber
*n
= OSNumber::withNumber(val
, 32);
217 properties
->setObject(
223 void IOPMPowerSource::setVoltage(unsigned int val
) {
224 OSNumber
*n
= OSNumber::withNumber(val
, 32);
225 properties
->setObject(
231 void IOPMPowerSource::setCycleCount(unsigned int val
) {
232 OSNumber
*n
= OSNumber::withNumber(val
, 32);
233 properties
->setObject(
239 void IOPMPowerSource::setAdapterInfo(int val
) {
240 OSNumber
*n
= OSNumber::withNumber(val
, 32);
241 properties
->setObject(
247 void IOPMPowerSource::setLocation(int val
) {
248 OSNumber
*n
= OSNumber::withNumber(val
, 32);
249 properties
->setObject(
255 void IOPMPowerSource::setErrorCondition(OSSymbol
*s
) {
256 properties
->setObject(errorConditionKey
, s
);
259 void IOPMPowerSource::setManufacturer(OSSymbol
*s
) {
260 properties
->setObject(manufacturerKey
, s
);
263 void IOPMPowerSource::setModel(OSSymbol
*s
) {
264 properties
->setObject(modelKey
, s
);
267 void IOPMPowerSource::setSerial(OSSymbol
*s
) {
268 properties
->setObject(serialKey
, s
);
271 void IOPMPowerSource::setLegacyIOBatteryInfo(OSDictionary
*d
) {
272 properties
->setObject(batteryInfoKey
, d
);
278 /*******************************************************************************
280 * PUBLIC Accessors. All the getters! Boo!
282 ******************************************************************************/
284 bool IOPMPowerSource::externalConnected(void) {
285 return (kOSBooleanTrue
== properties
->getObject(externalConnectedKey
));
288 bool IOPMPowerSource::externalChargeCapable(void) {
289 return (kOSBooleanTrue
== properties
->getObject(externalChargeCapableKey
));
292 bool IOPMPowerSource::batteryInstalled(void) {
293 return (kOSBooleanTrue
== properties
->getObject(batteryInstalledKey
));
296 bool IOPMPowerSource::isCharging(void) {
297 return (kOSBooleanTrue
== properties
->getObject(chargingKey
));
300 bool IOPMPowerSource::atWarnLevel(void) {
301 return (kOSBooleanTrue
== properties
->getObject(warnLevelKey
));
304 bool IOPMPowerSource::atCriticalLevel(void) {
305 return (kOSBooleanTrue
== properties
->getObject(criticalLevelKey
));
308 unsigned int IOPMPowerSource::currentCapacity(void) {
310 n
= OSDynamicCast(OSNumber
, properties
->getObject(currentCapacityKey
));
312 else return (unsigned int)n
->unsigned32BitValue();
315 unsigned int IOPMPowerSource::maxCapacity(void) {
317 n
= OSDynamicCast(OSNumber
, properties
->getObject(maxCapacityKey
));
319 else return (unsigned int)n
->unsigned32BitValue();
322 unsigned int IOPMPowerSource::capacityPercentRemaining(void)
324 unsigned int _currentCapacity
= currentCapacity();
325 unsigned int _maxCapacity
= maxCapacity();
326 if(0 == _maxCapacity
) {
329 return ((100*_currentCapacity
) / _maxCapacity
);
333 int IOPMPowerSource::timeRemaining(void) {
335 n
= OSDynamicCast(OSNumber
, properties
->getObject(timeRemainingKey
));
337 else return (int)n
->unsigned32BitValue();
340 int IOPMPowerSource::amperage(void) {
342 n
= OSDynamicCast(OSNumber
, properties
->getObject(amperageKey
));
344 else return (int)n
->unsigned32BitValue();
347 unsigned int IOPMPowerSource::voltage(void) {
349 n
= OSDynamicCast(OSNumber
, properties
->getObject(voltageKey
));
351 else return (unsigned int)n
->unsigned32BitValue();
354 unsigned int IOPMPowerSource::cycleCount(void) {
356 n
= OSDynamicCast(OSNumber
, properties
->getObject(cycleCountKey
));
358 else return (unsigned int)n
->unsigned32BitValue();
361 int IOPMPowerSource::adapterInfo(void) {
363 n
= OSDynamicCast(OSNumber
, properties
->getObject(adapterInfoKey
));
365 else return (int)n
->unsigned32BitValue();
368 int IOPMPowerSource::location(void) {
370 n
= OSDynamicCast(OSNumber
, properties
->getObject(locationKey
));
372 else return (unsigned int)n
->unsigned32BitValue();
375 OSSymbol
*IOPMPowerSource::errorCondition(void) {
376 return OSDynamicCast(OSSymbol
, properties
->getObject(errorConditionKey
));
379 OSSymbol
*IOPMPowerSource::manufacturer(void) {
380 return OSDynamicCast(OSSymbol
, properties
->getObject(manufacturerKey
));
383 OSSymbol
*IOPMPowerSource::model(void) {
384 return OSDynamicCast(OSSymbol
, properties
->getObject(modelKey
));
387 OSSymbol
*IOPMPowerSource::serial(void) {
388 return OSDynamicCast(OSSymbol
, properties
->getObject(serialKey
));
391 OSDictionary
*IOPMPowerSource::legacyIOBatteryInfo(void) {
392 return OSDynamicCast(OSDictionary
, properties
->getObject(batteryInfoKey
));