From 5ab2c3456d8866d26bc7c3f630c1e1a0af3ab721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 6 Nov 2023 16:42:16 +0800 Subject: [PATCH] Battery (Apple): better detection --- src/detection/battery/battery.h | 1 + src/detection/battery/battery_apple.c | 59 +++++++++++++-------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/detection/battery/battery.h b/src/detection/battery/battery.h index 7df622ea2..d262a1194 100644 --- a/src/detection/battery/battery.h +++ b/src/detection/battery/battery.h @@ -15,6 +15,7 @@ typedef struct FFBatteryResult double capacity; FFstrbuf status; double temperature; + int32_t cycleCount; } FFBatteryResult; const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results); diff --git a/src/detection/battery/battery_apple.c b/src/detection/battery/battery_apple.c index c0950c0ee..2ca945ffe 100644 --- a/src/detection/battery/battery_apple.c +++ b/src/detection/battery/battery_apple.c @@ -5,16 +5,6 @@ #include -static double detectBatteryTemp(void) -{ - double result = 0; - - if(ffDetectCoreTemps(FF_TEMP_BATTERY, &result)) - return FF_BATTERY_TEMP_UNSET; - - return result; -} - const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results) { io_iterator_t iterator; @@ -24,7 +14,7 @@ const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results) io_registry_entry_t registryEntry; while((registryEntry = IOIteratorNext(iterator)) != 0) { - CFMutableDictionaryRef properties; + FF_CFTYPE_AUTO_RELEASE CFMutableDictionaryRef properties = NULL; if(IORegistryEntryCreateCFProperties(registryEntry, &properties, kCFAllocatorDefault, kNilOptions) != kIOReturnSuccess) { IOObjectRelease(registryEntry); @@ -35,7 +25,13 @@ const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results) const char* error; FFBatteryResult* battery = ffListAdd(results); + battery->temperature = FF_BATTERY_TEMP_UNSET; + ffStrbufInit(&battery->manufacturer); + ffStrbufInit(&battery->modelName); + ffStrbufInit(&battery->technology); + ffStrbufInit(&battery->status); battery->capacity = 0.0/0.0; + int currentCapacity, maxCapacity; if ((error = ffCfDictGetInt(properties, CFSTR("MaxCapacity"), &maxCapacity))) @@ -50,33 +46,36 @@ const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results) battery->capacity = currentCapacity * 100.0 / maxCapacity; - ffStrbufInit(&battery->manufacturer); - ffStrbufInit(&battery->modelName); - ffStrbufInit(&battery->technology); + ffCfDictGetString(properties, CFSTR("DeviceName"), &battery->modelName); + if (!ffCfDictGetBool(properties, CFSTR("built-in"), &boolValue) && boolValue) { ffStrbufAppendS(&battery->manufacturer, "Apple Inc."); - ffStrbufAppendS(&battery->modelName, "Builtin"); ffStrbufAppendS(&battery->technology, "Lithium"); + if (!battery->modelName.length) + ffStrbufAppendS(&battery->modelName, "Built-in"); } - else + + ffCfDictGetInt(properties, CFSTR("CycleCount"), &battery->cycleCount); + + if (!ffCfDictGetBool(properties, CFSTR("ExternalConnected"), &boolValue) && boolValue) + ffStrbufAppendS(&battery->status, "AC connected, "); + if (!ffCfDictGetBool(properties, CFSTR("IsCharging"), &boolValue) && boolValue) + ffStrbufAppendS(&battery->status, "Charging, "); + if (!ffCfDictGetBool(properties, CFSTR("AtCriticalLevel"), &boolValue) && boolValue) + ffStrbufAppendS(&battery->status, "Critical, "); + ffStrbufTrimRight(&battery->status, ' '); + ffStrbufTrimRight(&battery->status, ','); + + if (options->temp) { - ffStrbufAppendS(&battery->manufacturer, "Unknown"); - ffStrbufAppendS(&battery->modelName, "Unknown"); - ffStrbufAppendS(&battery->technology, "Unknown"); + int64_t temp; + if (!ffCfDictGetInt64(properties, CFSTR("Temperature"), &temp)) + battery->temperature = (double) temp / 10 - 273.15; + else + ffDetectCoreTemps(FF_TEMP_BATTERY, &battery->temperature); } - ffStrbufInit(&battery->status); - if (!ffCfDictGetBool(properties, CFSTR("FullyCharged"), &boolValue) && boolValue) - ffStrbufAppendS(&battery->status, "Fully charged"); - else if (!ffCfDictGetBool(properties, CFSTR("IsCharging"), &boolValue) && boolValue) - ffStrbufAppendS(&battery->status, "Charging"); - else - ffStrbufAppendS(&battery->status, ""); - - battery->temperature = options->temp ? detectBatteryTemp() : FF_BATTERY_TEMP_UNSET; - - CFRelease(properties); IOObjectRelease(registryEntry); }