From: Florian Forster Date: Mon, 12 Sep 2016 06:34:09 +0000 (+0200) Subject: battery plugin: Replace getvalue() with parse_value_file(). X-Git-Tag: collectd-5.7.0~98^2~5 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=b9864f683bb778ef52b314db389187f1bd7755bb;p=collectd.git battery plugin: Replace getvalue() with parse_value_file(). --- diff --git a/src/battery_statefs.c b/src/battery_statefs.c index 53730ed0..ee739bf5 100644 --- a/src/battery_statefs.c +++ b/src/battery_statefs.c @@ -51,9 +51,6 @@ SOFTWARE. #include #define STATEFS_ROOT "/run/state/namespaces/Battery/" -#define BUFFER_SIZE 512 - -static int submitted_this_run = 0; static void battery_submit(const char *type, gauge_t value, const char *type_instance) { @@ -72,67 +69,52 @@ static void battery_submit(const char *type, gauge_t value, if (type_instance != NULL) sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance)); plugin_dispatch_values(&vl); - - submitted_this_run++; -} - -static _Bool getvalue(const char *fname, gauge_t *value) { - FILE *fh; - char buffer[BUFFER_SIZE]; - - if ((fh = fopen(fname, "r")) == NULL) { - WARNING("battery plugin: cannot open StateFS file %s", fname); - return (0); - } - - if (fgets(buffer, STATIC_ARRAY_SIZE(buffer), fh) == NULL) { - fclose(fh); - return (0); // empty file - } - - (*value) = atof(buffer); - - fclose(fh); - - return (1); } /* cannot be static, is referred to from battery.c */ int battery_read_statefs(void) { - gauge_t value = NAN; - - submitted_this_run = 0; - - if (getvalue(STATEFS_ROOT "ChargePercentage", &value)) - battery_submit("charge", value, NULL); - // Use capacity as a charge estimate if ChargePercentage is not available - else if (getvalue(STATEFS_ROOT "Capacity", &value)) - battery_submit("charge", value, NULL); - - if (getvalue(STATEFS_ROOT "Current", &value)) - battery_submit("current", value * 1e-6, NULL); // from uA to A - - if (getvalue(STATEFS_ROOT "Energy", &value)) - battery_submit("energy_wh", value * 1e-6, NULL); // from uWh to Wh - - if (getvalue(STATEFS_ROOT "Power", &value)) - battery_submit("power", value * 1e-6, NULL); // from uW to W - - if (getvalue(STATEFS_ROOT "Temperature", &value)) - battery_submit("temperature", value * 0.1, NULL); // from 10xC to C - - if (getvalue(STATEFS_ROOT "TimeUntilFull", &value)) - battery_submit("duration", value, "full"); - - if (getvalue(STATEFS_ROOT "TimeUntilLow", &value)) - battery_submit("duration", value, "low"); + value_t v; + int success = 0; + + if (parse_value_file(STATEFS_ROOT "ChargePercentage", &v, DS_TYPE_GAUGE) == 0) { + battery_submit("charge", v.gauge, NULL); + success++; + } else if (parse_value_file(STATEFS_ROOT "Capacity", &v, DS_TYPE_GAUGE) == 0) { + // Use capacity as a charge estimate if ChargePercentage is not available + battery_submit("charge", v.gauge, NULL); + success++; + } else { + WARNING("battery plugin: Neither \""STATEFS_ROOT"ChargePercentage\" " + "nor \""STATEFS_ROOT"Capacity\" could be read."); + } - if (getvalue(STATEFS_ROOT "Voltage", &value)) - battery_submit("voltage", value * 1e-6, NULL); // from uV to V + struct { + char *path; + char *type; + char *type_instance; + gauge_t factor; + } metrics[] = { + {STATEFS_ROOT "Current", "current", NULL, 1e-6}, // from uA to A + {STATEFS_ROOT "Energy", "energy_wh", NULL, 1e-6}, // from uWh to Wh + {STATEFS_ROOT "Power", "power", NULL, 1e-6}, // from uW to W + {STATEFS_ROOT "Temperature", "temperature", NULL, 0.1}, // from 10xC to C + {STATEFS_ROOT "TimeUntilFull", "duration", "full", 1.0}, + {STATEFS_ROOT "TimeUntilLow", "duration", "low", 1.0}, + {STATEFS_ROOT "Voltage", "voltage", NULL, 1e-6}, // from uV to V + }; + + for (size_t i = 0; i < STATIC_ARRAY_SIZE(metrics); i++) { + if (parse_value_file(metrics[i].path, &v, DS_TYPE_GAUGE) != 0) { + WARNING("battery plugin: Reading \"%s\" failed.", metrics[i].path); + continue; + } + + battery_submit(metrics[i].type, v.gauge * metrics[i].factor, metrics[i].type_instance); + success++; + } - if (submitted_this_run == 0) { - ERROR("battery plugin: statefs backend: none of the statistics are " - "available"); + if (success == 0) { + ERROR("battery plugin: statefs backend: none of the statistics are available"); return (-1); }