8#include <IOKit/ps/IOPowerSources.h>
9#include <IOKit/ps/IOPSKeys.h>
10#include <AvailabilityMacros.h>
13#define kIOMainPortDefault kIOMasterPortDefault
16#define LOC QString("PowerOSX: ")
35 CFRunLoopRemoveSource(CFRunLoopGetCurrent(),
37 kCFRunLoopDefaultMode );
45 CFRunLoopRemoveSource(CFRunLoopGetCurrent(),
m_powerRef, kCFRunLoopDefaultMode);
58 CFRunLoopAddSource(CFRunLoopGetCurrent(),
60 kCFRunLoopDefaultMode);
64 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to setup power status callback");
68 CFArrayRef batteryinfo = NULL;
71 CFRelease(batteryinfo);
77 CFRunLoopAddSource(CFRunLoopGetCurrent(),
m_powerRef, kCFRunLoopDefaultMode);
83 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to setup power source callback");
86 if (IOPMSleepEnabled())
104 default:
return false;
115 CFTypeRef
info = IOPSCopyPowerSourcesInfo();
116 CFArrayRef list = IOPSCopyPowerSourcesList(
info);
118 for (
int i = 0; i < CFArrayGetCount(list); i++)
120 CFTypeRef source = CFArrayGetValueAtIndex(list, i);
121 CFDictionaryRef description = IOPSGetPowerSourceDescription(
info, source);
123 if (
static_cast<CFBooleanRef
>(CFDictionaryGetValue(description, CFSTR(kIOPSIsPresentKey))) == kCFBooleanFalse)
126 auto type =
static_cast<CFStringRef
>(CFDictionaryGetValue(description, CFSTR(kIOPSTransportTypeKey)));
127 if (
type && CFStringCompare(
type, CFSTR(kIOPSInternalType), 0) == kCFCompareEqualTo)
129 auto state =
static_cast<CFStringRef
>(CFDictionaryGetValue(description, CFSTR(kIOPSPowerSourceStateKey)));
130 if (state && CFStringCompare(state, CFSTR(kIOPSACPowerValue), 0) == kCFCompareEqualTo)
134 else if (state && CFStringCompare(state, CFSTR(kIOPSBatteryPowerValue), 0) == kCFCompareEqualTo)
138 auto capacity =
static_cast<CFNumberRef
>(CFDictionaryGetValue(description, CFSTR(kIOPSCurrentCapacityKey)));
139 CFNumberGetValue(capacity, kCFNumberSInt32Type, &
current);
140 capacity =
static_cast<CFNumberRef
>(CFDictionaryGetValue(description, CFSTR(kIOPSMaxCapacityKey)));
141 CFNumberGetValue(capacity, kCFNumberSInt32Type, &max);
142 newlevel =
static_cast<int>(((
static_cast<float>(
current) /
143 (
static_cast<float>(max))) * 100.0F));
176 natural_t Type,
void *Data)
185 case kIOMessageCanSystemPowerOff:
186 IOAllowPowerChange(power->m_rootPowerDomain,
reinterpret_cast<intptr_t
>(Data));
189 case kIOMessageCanSystemSleep:
190 IOAllowPowerChange(power->m_rootPowerDomain,
reinterpret_cast<intptr_t
>(Data));
193 case kIOMessageSystemWillPowerOff:
194 IOAllowPowerChange(power->m_rootPowerDomain,
reinterpret_cast<intptr_t
>(Data));
197 case kIOMessageSystemWillRestart:
198 IOAllowPowerChange(power->m_rootPowerDomain,
reinterpret_cast<intptr_t
>(Data));
201 case kIOMessageSystemWillSleep:
202 IOAllowPowerChange(power->m_rootPowerDomain,
reinterpret_cast<intptr_t
>(Data));
205 case kIOMessageSystemHasPoweredOn:
214 AEAddressDesc targetDesc;
215 static const ProcessSerialNumber kPSNOfSystemProcess = { 0, kSystemProcess };
216 AppleEvent eventReply = { typeNull,
nullptr };
217 AppleEvent appleEventToSend = { typeNull,
nullptr };
219 OSStatus
error = noErr;
220 error = AECreateDesc(typeProcessSerialNumber, &kPSNOfSystemProcess,
221 sizeof(kPSNOfSystemProcess), &targetDesc);
225 error = AECreateAppleEvent(kCoreEventClass, EventToSend, &targetDesc,
226 kAutoGenerateReturnID, kAnyTransactionID, &appleEventToSend);
227 AEDisposeDesc(&targetDesc);
231 error = AESendMessage(&appleEventToSend, &eventReply, kAENormalPriority, kAEDefaultTimeout);
232 AEDisposeDesc(&appleEventToSend);
236 AEDisposeDesc(&eventReply);
bool DoFeature(bool Delayed=false) override
static void PowerSourceCallBack(void *Reference)
Receive notification of changes to the power supply.
IONotificationPortRef m_powerNotifyPort
MythPowerOSX()
Power management for OSX.
static void PowerCallBack(void *Reference, io_service_t Service, natural_t Type, void *Data)
Receive notification of power status changes.
void Refresh(void) override
io_connect_t m_rootPowerDomain
CFRunLoopSourceRef m_powerRef
io_object_t m_powerNotifier
virtual void FeatureHappening(Feature Spontaneous=FeatureNone)
Signal to the rest of MythTV that the given feature will happen now.
Feature m_scheduledFeature
void PowerLevelChanged(int Level)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
static OSStatus SendAppleEventToSystemProcess(AEEventID EventToSend)
#define kIOMainPortDefault
QDateTime current(bool stripped)
Returns current Date and Time in UTC.