IOPMPowerSource.cpp [plain text]
#include <IOKit/pwr_mgt/IOPMPowerSource.h>
#include <IOKit/pwr_mgt/IOPM.h>
#include <IOKit/IOMessage.h>
#include <IOKit/IOLib.h>
#define super IOService
OSDefineMetaClassAndStructors(IOPMPowerSource, IOService)
IOPMPowerSource *IOPMPowerSource::powerSource(void)
{
IOPMPowerSource *ps = new IOPMPowerSource;
if(ps) {
ps->init();
return ps;
}
return NULL;
}
bool IOPMPowerSource::init (void)
{
if (!super::init()) {
return false;
}
nextInList = NULL;
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;
}
void IOPMPowerSource::free(void)
{
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();
}
void IOPMPowerSource::updateStatus (void)
{
OSCollectionIterator *iterator;
OSObject *iteratorKey;
OSObject *obj;
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;
messageClients(kIOPMMessageBatteryStatusHasChanged);
}
void IOPMPowerSource::setPSProperty(const OSSymbol *key, OSObject *val)
{
OSObject *lastVal;
OSNumber *newNumVal;
if(!key || !val) return;
if( (lastVal = properties->getObject(key)) ) {
newNumVal = OSDynamicCast(OSNumber, val);
if(newNumVal) {
if(newNumVal->isEqualTo(lastVal)) {
} else {
settingsChangedSinceUpdate = true;
}
} else {
if(lastVal != val)
settingsChangedSinceUpdate = true;
}
} else {
settingsChangedSinceUpdate = true;
}
properties->setObject(key, val);
}
void IOPMPowerSource::setExternalConnected(bool b) {
setPSProperty(externalConnectedKey,
b ? kOSBooleanTrue : kOSBooleanFalse);
}
void IOPMPowerSource::setExternalChargeCapable(bool b) {
setPSProperty(externalChargeCapableKey,
b ? kOSBooleanTrue : kOSBooleanFalse);
}
void IOPMPowerSource::setBatteryInstalled(bool b) {
setPSProperty(batteryInstalledKey,
b ? kOSBooleanTrue : kOSBooleanFalse);
}
void IOPMPowerSource::setIsCharging(bool b) {
setPSProperty(chargingKey,
b ? kOSBooleanTrue : kOSBooleanFalse);
}
void IOPMPowerSource::setAtWarnLevel(bool b) {
setPSProperty(warnLevelKey,
b ? kOSBooleanTrue : kOSBooleanFalse);
}
void IOPMPowerSource::setAtCriticalLevel(bool b) {
setPSProperty(criticalLevelKey,
b ? kOSBooleanTrue : kOSBooleanFalse);
}
void IOPMPowerSource::setCurrentCapacity(unsigned int val) {
OSNumber *n = OSNumber::withNumber(val, 32);
setPSProperty(currentCapacityKey, n);
n->release();
}
void IOPMPowerSource::setMaxCapacity(unsigned int val) {
OSNumber *n = OSNumber::withNumber(val, 32);
setPSProperty(maxCapacityKey, n);
n->release();
}
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);
}
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));
}