]>
Commit | Line | Data |
---|---|---|
1c79356b | 1 | /* |
0c530ab8 | 2 | * Copyright (c) 1998-2005 Apple Computer, Inc. All rights reserved. |
1c79356b | 3 | * |
2d21ac55 | 4 | * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ |
1c79356b | 5 | * |
2d21ac55 A |
6 | * This file contains Original Code and/or Modifications of Original Code |
7 | * as defined in and that are subject to the Apple Public Source License | |
8 | * Version 2.0 (the 'License'). You may not use this file except in | |
9 | * compliance with the License. The rights granted to you under the License | |
10 | * may not be used to create, or enable the creation or redistribution of, | |
11 | * unlawful or unlicensed copies of an Apple operating system, or to | |
12 | * circumvent, violate, or enable the circumvention or violation of, any | |
13 | * terms of an Apple operating system software license agreement. | |
8f6c56a5 | 14 | * |
2d21ac55 A |
15 | * Please obtain a copy of the License at |
16 | * http://www.opensource.apple.com/apsl/ and read it before using this file. | |
17 | * | |
18 | * The Original Code and all software distributed under the License are | |
19 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
8f6c56a5 A |
20 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
21 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
2d21ac55 A |
22 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. |
23 | * Please see the License for the specific language governing rights and | |
24 | * limitations under the License. | |
8f6c56a5 | 25 | * |
2d21ac55 | 26 | * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ |
1c79356b | 27 | */ |
0c530ab8 A |
28 | |
29 | #ifndef _IOPMPowerSource_h_ | |
30 | #define _IOPMPowerSource_h_ | |
31 | ||
1c79356b | 32 | #include <libkern/c++/OSObject.h> |
0c530ab8 | 33 | #include <IOKit/pwr_mgt/IOPM.h> |
1c79356b A |
34 | #include <IOKit/IOTypes.h> |
35 | #include <IOKit/IOReturn.h> | |
0c530ab8 | 36 | #include <IOKit/IOService.h> |
21362eb3 | 37 | |
0c530ab8 A |
38 | enum { |
39 | kSecondsPerHour = 3600, | |
40 | kTenMinutesInSeconds = 600 | |
41 | }; | |
6601e61a | 42 | |
0c530ab8 A |
43 | /* class IOPMPowerSource |
44 | * | |
45 | * See IOKit/pwr_mgt/IOPM.h for power source keys relevant to this class. These | |
46 | * report-type keys are required for calls to IOPMPowerSource::setReportables(), | |
47 | * and they define the IORegistry interface through which data is passed back | |
48 | * up to the rest of the system. | |
49 | * | |
50 | * A subclassing driver that doesn't want to do anything fancy should: | |
51 | * 1. Subclass IOPMPowerSource | |
52 | * 3. Install its own battery change notifications or polling routine that can | |
53 | * converse with actual battery hardware. | |
54 | * 4. When battery state changes, change the relevant member variables | |
55 | * through setCurrentCapacity() style accessors. | |
56 | * 5. Call updateStatus() on itself when all such settings have been updated. | |
57 | * | |
58 | * The subclass driver should also initially populate its settings and call | |
59 | * updateStatus() on launch. | |
60 | * | |
61 | * | |
62 | * Settings | |
63 | * | |
64 | * ExternalConnected | |
65 | * Type: bool | |
66 | * IORegistry Key: kIOPMPSExternalConnectedKey | |
67 | * True if computer is drawing external power | |
68 | * | |
69 | * ExternalChargeCapable | |
70 | * Type: bool | |
71 | * IORegistry Key: kIOPMPSExternalChargeCapableKey | |
72 | * True if external power is capable of charging internal battery | |
73 | * | |
74 | * BatteryInstalled | |
75 | * Type: bool | |
76 | * IORegistry Key: kIOPMPSBatteryInstalledKey | |
77 | * True if a battery is present; false if removed | |
78 | * | |
79 | * IsCharging | |
80 | * Type: bool | |
81 | * IORegistry Key: kIOPMPSIsChargingKey | |
82 | * True if battery is charging itself from external power | |
83 | * | |
84 | * AtWarnLevel | |
85 | * Type: bool | |
86 | * IORegistry Key: kIOPMPSAtWarnLevelKey | |
87 | * True if draining battery capacity and past warn level | |
88 | * | |
89 | * AtCriticalLevel | |
90 | * Type: bool | |
91 | * IORegistry Key: kIOPMPSAtCriticalLevelKey | |
92 | * True if draining battery capacity and past critical level | |
93 | * | |
94 | * CurrentCapacity | |
95 | * MaxCapacity | |
96 | * Type: unsigned int | |
97 | * IORegistry Key: kIOPMPSCurrentCapacityKey, kIOPMPSMaxCapacityKey | |
98 | * Capacity measured in mAh | |
99 | * | |
100 | * TimeRemaining | |
101 | * Type: int | |
102 | * IORegistry Key: kIOPMPSTimeRemainingKey | |
103 | * Time remaining measured in minutes | |
104 | * | |
105 | * Amperage | |
106 | * Type: int | |
107 | * IORegistry Key: kIOPMPSAmperageKey | |
108 | * Current is measured in mA | |
109 | * | |
110 | * Voltage | |
111 | * Type: unsigned int | |
112 | * IORegistry Key: kIOPMPSVoltageKey | |
113 | * Voltage measured in mV | |
114 | * | |
115 | * CycleCount | |
116 | * Type: unsigned int | |
117 | * IORegistry Key: kIOPMPSCycleCountKey | |
118 | * Number of charge/discharge cycles | |
119 | * | |
120 | * AdapterInfo | |
121 | * Type: int | |
122 | * IORegistry Key: kIOPMPSAdapterInfoKey | |
123 | * Power adapter information | |
124 | * | |
125 | * Location | |
126 | * Type: int | |
127 | * IORegistry Key: kIOPMPSLocationKey | |
128 | * Clue about battery's location in machine - Left vs. Right | |
129 | * | |
130 | * ErrorCondition | |
131 | * Type: OSSymbol | |
132 | * IORegistry Key: kIOPMPSErrorConditionKey | |
133 | * String describing error state of battery | |
134 | * | |
135 | * Manufacturer | |
136 | * Type: OSSymbol | |
137 | * IORegistry Key: kIOPMPSManufacturerKey | |
138 | * String describing battery manufacturer | |
139 | * | |
2d21ac55 A |
140 | * Manufactured Date |
141 | * Type: unsigned 16-bit bitfield | |
142 | * IORegistry Key: kIOPMPSManufactureDateKey | |
143 | * Date is published in a bitfield per the Smart Battery Data spec rev 1.1 | |
144 | * in section 5.1.26 | |
145 | * Bits 0...4 => day (value 1-31; 5 bits) | |
146 | * Bits 5...8 => month (value 1-12; 4 bits) | |
147 | * Bits 9...15 => years since 1980 (value 0-127; 7 bits) | |
148 | * | |
0c530ab8 A |
149 | * Model |
150 | * Type: OSSymbol | |
151 | * IORegistry Key: kIOPMPSModelKey | |
152 | * String describing model number | |
153 | * | |
154 | * Serial | |
155 | * Type: OSSymbol | |
156 | * IORegistry Key: kIOPMPSSerialKey | |
2d21ac55 A |
157 | * String describing serial number or unique info |
158 | * The serial number published hear bears no correspondence to the Apple serial | |
159 | * number printed on each battery. This is a manufacturer serial number with | |
160 | * no correlation to the printed serial number. | |
0c530ab8 A |
161 | * |
162 | * LegacyIOBatteryInfo | |
163 | * Type: OSDictionary | |
164 | * IORegistry Key: kIOPMPSLegacyBatteryInfoKey | |
165 | * Dictionary conforming to the OS X 10.0-10.4 | |
166 | */ | |
8ad349bb | 167 | |
0c530ab8 | 168 | class IOPMPowerSource : public IOService |
1c79356b A |
169 | { |
170 | OSDeclareDefaultStructors(IOPMPowerSource) | |
171 | ||
0c530ab8 A |
172 | friend class IOPMPowerSourceList; |
173 | ||
1c79356b | 174 | protected: |
2d21ac55 A |
175 | |
176 | /* bool settingsChangedSinceLastUpdate | |
177 | * Used by subclasses to determine if any settings have been modified via the | |
178 | * accessors below since last call to update(). true is settings have changed; | |
179 | * false otherwise. | |
180 | */ | |
181 | bool settingsChangedSinceUpdate; | |
0c530ab8 | 182 | |
2d21ac55 A |
183 | /* OSDictionary properties |
184 | * Stores power source state | |
185 | */ | |
0c530ab8 | 186 | OSDictionary *properties; |
1c79356b | 187 | |
0c530ab8 A |
188 | const OSSymbol *externalConnectedKey; |
189 | const OSSymbol *externalChargeCapableKey; | |
190 | const OSSymbol *batteryInstalledKey; | |
191 | const OSSymbol *chargingKey; | |
192 | const OSSymbol *warnLevelKey; | |
193 | const OSSymbol *criticalLevelKey; | |
194 | const OSSymbol *currentCapacityKey; | |
195 | const OSSymbol *maxCapacityKey; | |
196 | const OSSymbol *timeRemainingKey; | |
197 | const OSSymbol *amperageKey; | |
198 | const OSSymbol *voltageKey; | |
199 | const OSSymbol *cycleCountKey; | |
200 | const OSSymbol *adapterInfoKey; | |
201 | const OSSymbol *locationKey; | |
202 | const OSSymbol *errorConditionKey; | |
203 | const OSSymbol *manufacturerKey; | |
204 | const OSSymbol *modelKey; | |
205 | const OSSymbol *serialKey; | |
206 | const OSSymbol *batteryInfoKey; | |
1c79356b | 207 | |
2d21ac55 A |
208 | // Tracking for IOPMPowerSourceList |
209 | IOPMPowerSource *nextInList; | |
210 | ||
1c79356b A |
211 | public: |
212 | ||
0c530ab8 A |
213 | /*! @function powerSource |
214 | @abstract Creates a new IOPMPowerSource nub. Must be attached to IORegistry, | |
215 | and registered by provider. | |
216 | */ | |
217 | static IOPMPowerSource *powerSource(void); | |
8ad349bb | 218 | |
0c530ab8 A |
219 | virtual bool init(void); |
220 | ||
221 | virtual void free(void); | |
8f6c56a5 | 222 | |
0c530ab8 A |
223 | /*! @function updateStatus |
224 | @abstract Must be called by physical battery controller when battery state | |
225 | has changed significantly. | |
226 | @discussion The system will not poll this object for battery updates. Rather \ | |
227 | the battery's controller must call updateStatus() every time state changes \ | |
228 | and the settings will be relayed to higher levels of power management. \ | |
229 | The subclassing driver should override this only if the driver needs to add \ | |
230 | new settings to the base class. | |
231 | */ | |
232 | virtual void updateStatus(void); | |
8f6c56a5 | 233 | |
0c530ab8 A |
234 | /* Public accessors for battery state |
235 | */ | |
236 | bool externalConnected(void); | |
237 | bool externalChargeCapable(void); | |
238 | bool batteryInstalled(void); | |
239 | bool isCharging(void); | |
240 | bool atWarnLevel(void); | |
241 | bool atCriticalLevel(void); | |
21362eb3 | 242 | |
0c530ab8 A |
243 | unsigned int currentCapacity(void); |
244 | unsigned int maxCapacity(void); | |
245 | unsigned int capacityPercentRemaining(void); | |
246 | int timeRemaining(void); | |
247 | int amperage(void); | |
248 | unsigned int voltage(void); | |
249 | unsigned int cycleCount(void); | |
250 | int adapterInfo(void); | |
251 | int location(void); | |
252 | ||
253 | OSSymbol *errorCondition(void); | |
254 | OSSymbol *manufacturer(void); | |
255 | OSSymbol *model(void); | |
256 | OSSymbol *serial(void); | |
257 | OSDictionary *legacyIOBatteryInfo(void); | |
258 | ||
2d21ac55 A |
259 | OSObject *getPSProperty(const OSSymbol *); |
260 | ||
0c530ab8 | 261 | protected: |
2d21ac55 | 262 | |
0c530ab8 A |
263 | /* Protected "setter" methods for subclasses |
264 | * Subclasses should use these setters to modify all battery properties. | |
265 | * | |
266 | * Subclasses must follow all property changes with a call to updateStatus() | |
267 | * to flush settings changes to upper level battery API clients. | |
268 | * | |
269 | */ | |
270 | void setExternalConnected(bool); | |
271 | void setExternalChargeCapable(bool); | |
272 | void setBatteryInstalled(bool); | |
273 | void setIsCharging(bool); | |
274 | void setAtWarnLevel(bool); | |
275 | void setAtCriticalLevel(bool); | |
21362eb3 | 276 | |
0c530ab8 A |
277 | void setCurrentCapacity(unsigned int); |
278 | void setMaxCapacity(unsigned int); | |
279 | void setTimeRemaining(int); | |
280 | void setAmperage(int); | |
281 | void setVoltage(unsigned int); | |
282 | void setCycleCount(unsigned int); | |
283 | void setAdapterInfo(int); | |
284 | void setLocation(int); | |
6601e61a | 285 | |
0c530ab8 A |
286 | void setErrorCondition(OSSymbol *); |
287 | void setManufacturer(OSSymbol *); | |
288 | void setModel(OSSymbol *); | |
289 | void setSerial(OSSymbol *); | |
290 | void setLegacyIOBatteryInfo(OSDictionary *); | |
2d21ac55 A |
291 | |
292 | /* All of these methods funnel through the generic accessor method | |
293 | setPSProperty. Caller can pass in any arbitrary OSSymbol key, and | |
294 | that value will be stored in the PM settings dictionary, and relayed | |
295 | onto the IORegistry at update time. | |
296 | */ | |
297 | void setPSProperty(const OSSymbol *, OSObject *); | |
0c530ab8 | 298 | }; |
6601e61a | 299 | |
0c530ab8 | 300 | #endif |