X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fbattery.c;h=fa93b1c66a6b81903fe4f53a63925176590cdb33;hb=d68f1b428fd794fae3e909c65396289f14c6f99b;hp=123a05acd812915a4095feee5c87e61f3a259cd0;hpb=c09dbb4a855dc2a31dcd906b49ac702af60cf914;p=collectd.git diff --git a/src/battery.c b/src/battery.c index 123a05ac..fa93b1c6 100644 --- a/src/battery.c +++ b/src/battery.c @@ -23,11 +23,37 @@ #include "collectd.h" #include "common.h" #include "plugin.h" +#include "utils_debug.h" #define MODULE_NAME "battery" #define BUFSIZE 512 -#if defined(KERNEL_LINUX) +#if HAVE_MACH_MACH_TYPES_H +# include +#endif +#if HAVE_MACH_MACH_INIT_H +# include +#endif +#if HAVE_MACH_MACH_ERROR_H +# include +#endif +#if HAVE_COREFOUNDATION_COREFOUNDATION_H +# include +#endif +#if HAVE_IOKIT_IOKITLIB_H +# include +#endif +#if HAVE_IOKIT_IOTYPES_H +# include +#endif +#if HAVE_IOKIT_PS_IOPOWERSOURCES_H +# include +#endif +#if HAVE_IOKIT_PS_IOPSKEYS_H +# include +#endif + +#if HAVE_IOKIT_PS_IOPOWERSOURCES_H || KERNEL_LINUX # define BATTERY_HAVE_READ 1 #else # define BATTERY_HAVE_READ 0 @@ -41,31 +67,41 @@ static char *battery_charge_file = "battery-%s/charge.rrd"; static char *ds_def_current[] = { - "DS:current:GAUGE:25:U:U", + "DS:current:GAUGE:"COLLECTD_HEARTBEAT":U:U", NULL }; static int ds_num_current = 1; static char *ds_def_voltage[] = { - "DS:voltage:GAUGE:25:U:U", + "DS:voltage:GAUGE:"COLLECTD_HEARTBEAT":U:U", NULL }; static int ds_num_voltage = 1; static char *ds_def_charge[] = { - "DS:charge:GAUGE:25:0:U", + "DS:charge:GAUGE:"COLLECTD_HEARTBEAT":0:U", NULL }; static int ds_num_charge = 1; +#if HAVE_IOKIT_PS_IOPOWERSOURCES_H + /* No global variables */ +/* #endif HAVE_IOKIT_PS_IOPOWERSOURCES_H */ + +#elif KERNEL_LINUX static int battery_pmu_num = 0; static char *battery_pmu_file = "/proc/pmu/battery_%i"; +#endif /* KERNEL_LINUX */ static void battery_init (void) { -#if BATTERY_HAVE_READ +#if HAVE_IOKIT_PS_IOPOWERSOURCES_H + /* No init neccessary */ +/* #endif HAVE_IOKIT_PS_IOPOWERSOURCES_H */ + +#elif KERNEL_LINUX int len; char filename[BUFSIZE]; @@ -79,7 +115,7 @@ static void battery_init (void) if (access (filename, R_OK)) break; } -#endif +#endif /* KERNEL_LINUX */ return; } @@ -168,7 +204,138 @@ static void battery_submit (char *inst, double current, double voltage, double c static void battery_read (void) { -#ifdef KERNEL_LINUX +#if HAVE_IOKIT_PS_IOPOWERSOURCES_H + CFTypeRef ps_raw; + CFArrayRef ps_array; + int ps_array_len; + CFDictionaryRef ps_dict; + CFTypeRef ps_obj; + CFTypeRef ps_value; + + int i; + + char name[128]; + double charge = INVALID_VALUE; + double current = INVALID_VALUE; + double voltage = INVALID_VALUE; + + ps_raw = IOPSCopyPowerSourcesInfo (); + ps_array = IOPSCopyPowerSourcesList (ps_raw); + ps_array_len = CFArrayGetCount (ps_array); + + DBG ("ps_array_len == %i", ps_array_len); + + for (i = 0; i < ps_array_len; i++) + { + ps_obj = CFArrayGetValueAtIndex (ps_array, i); + ps_dict = IOPSGetPowerSourceDescription (ps_raw, ps_obj); + + if (CFGetTypeID (ps_dict) != CFDictionaryGetTypeID ()) + { + DBG ("IOPSGetPowerSourceDescription did not return a CFDictionaryRef"); + continue; + } + + if (ps_dict != NULL) + { + /* Get the current capacity/charge */ + ps_value = NULL; + charge = INVALID_VALUE; + if (CFDictionaryGetValueIfPresent (ps_dict, + CFSTR (kIOPSCurrentCapacityKey), + &ps_value)) + { + if (CFGetTypeID (ps_value) != CFNumberGetTypeID ()) + CFNumberGetValue (ps_value, + kCFNumberDoubleType, + &charge); + else + DBG ("kIOPSCurrentCapacityKey: Not a CFNumber"); + + DBG ("charge = %f", charge); + } + else + DBG ("`%s' does not exist", kIOPSCurrentCapacityKey); + + /* Get the current */ + ps_value = NULL; + current = INVALID_VALUE; + if (CFDictionaryGetValueIfPresent (ps_dict, + CFSTR (kIOPSCurrentKey), + &ps_value)) + { + if (CFGetTypeID (ps_value) != CFNumberGetTypeID ()) + CFNumberGetValue (ps_value, + kCFNumberDoubleType, + ¤t); + else + DBG ("kIOPSCurrentKey: Not a CFNumber"); + DBG ("current = %f", current); + } + else + DBG ("`%s' does not exist", kIOPSCurrentKey); + + /* Get the voltage */ + ps_value = NULL; + voltage = INVALID_VALUE; + if (CFDictionaryGetValueIfPresent (ps_dict, + CFSTR (kIOPSVoltageKey), + &ps_value)) + { + if (CFGetTypeID (ps_value) != CFNumberGetTypeID ()) + CFNumberGetValue (ps_value, + kCFNumberDoubleType, + &voltage); + else + DBG ("kIOPSVoltageKey: Not a CFNumber"); + DBG ("voltage = %f", voltage); + } + else + DBG ("`%s' does not exist", kIOPSVoltageKey); + + /* Get the name of the device.. */ + ps_value = NULL; + if (CFDictionaryGetValueIfPresent (ps_dict, + CFSTR (kIOPSNameKey), + &ps_value)) + { + if (CFGetTypeID (ps_value) != CFStringGetTypeID ()) + { + if (!CFStringGetCString (ps_value, + name, 128, + kCFStringEncodingASCII)) + continue; + } + else + { + DBG ("kIOPSNameKey: Not a CFStringGetTypeID"); + } + DBG ("Original string: `%s'", name); + } + else + { + strncpy (name, "unknown", 128); + } + name[127] = '\0'; + for (i = 0; i < 128; i++) + { + if (name[i] == '\0') + break; + else if (isalnum (name[i])) + name[i] = (char) tolower (name[i]); + else + name[i] = '_'; + } + + battery_submit (name, current, voltage, charge); + } + } + + CFRelease(ps_array); + CFRelease(ps_raw); +/* #endif HAVE_IOKIT_PS_IOPOWERSOURCES_H */ + +#elif KERNEL_LINUX FILE *fh; char buffer[BUFSIZE]; char filename[BUFSIZE]; @@ -256,6 +423,9 @@ static void battery_read (void) while ((ent = readdir (dh)) != NULL) { + if (ent->d_name[0] == '.') + continue; + len = snprintf (filename, BUFSIZE, "/proc/acpi/battery/%s/state", ent->d_name); if ((len >= BUFSIZE) || (len < 0)) continue; @@ -275,29 +445,29 @@ static void battery_read (void) * [11:00] <@tokkee> remaining capacity: 4136 mAh * [11:00] <@tokkee> present voltage: 12428 mV */ - while (fgets (buffer, BUFSIZE, fh) == NULL) + while (fgets (buffer, BUFSIZE, fh) != NULL) { numfields = strsplit (buffer, fields, 8); if (numfields < 3) continue; - if ((strcmp (fields[0], "present")) - && (strcmp (fields[1], "rate:"))) + if ((strcmp (fields[0], "present") == 0) + && (strcmp (fields[1], "rate:") == 0)) valptr = ¤t; - else if ((strcmp (fields[0], "remaining")) - && (strcmp (fields[1], "capacity:"))) + else if ((strcmp (fields[0], "remaining") == 0) + && (strcmp (fields[1], "capacity:") == 0)) valptr = &charge; - else if ((strcmp (fields[0], "present")) - && (strcmp (fields[1], "voltage:"))) + else if ((strcmp (fields[0], "present") == 0) + && (strcmp (fields[1], "voltage:") == 0)) valptr = &voltage; else valptr = NULL; - if ((strcmp (fields[0], "charging")) - && (strcmp (fields[1], "state:"))) + if ((strcmp (fields[0], "charging") == 0) + && (strcmp (fields[1], "state:") == 0)) { - if (strcmp (fields[2], "charging")) + if (strcmp (fields[2], "charging") == 0) charging = 1; else charging = 0;