return 0;
}
-typedef int (*find_sensors_callback)(td_ctx* ctx, td_source* source,
- const sensors_chip_name* chip, const sensors_feature* feature, td_metrics* metrics);
+typedef struct sensors_value {
+ // Field
+ const char* field;
+
+ // Type
+ sensors_subfeature_type type;
+} sensors_value;
+
+static int read_values(td_ctx* ctx, const sensors_chip_name* chip,
+ const sensors_feature* feature, td_metrics* metrics, const sensors_value* values) {
+ const sensors_subfeature* subfeature = NULL;
+ double value = 0;
+ int index = 0;
+ int r;
+
+ // Iterate over all subfeatures
+ for (;;) {
+ subfeature = sensors_get_all_subfeatures(chip, feature, &index);
+ if (!subfeature)
+ break;
+
+ // Search for any matching values and read them
+ for (const sensors_value* v = values; v->field; v++) {
+ if (subfeature->type == v->type) {
+ // Read the value
+ r = sensors_get_value(chip, subfeature->number, &value);
+ if (r < 0)
+ return r;
+
+ // Convert some temperature values from Celsius to Kelvin
+ switch (v->type) {
+ case SENSORS_SUBFEATURE_TEMP_INPUT:
+ case SENSORS_SUBFEATURE_TEMP_MAX:
+ case SENSORS_SUBFEATURE_TEMP_MAX_HYST:
+ case SENSORS_SUBFEATURE_TEMP_MIN:
+ case SENSORS_SUBFEATURE_TEMP_CRIT:
+ case SENSORS_SUBFEATURE_TEMP_CRIT_HYST:
+ case SENSORS_SUBFEATURE_TEMP_LCRIT:
+ case SENSORS_SUBFEATURE_TEMP_EMERGENCY:
+ case SENSORS_SUBFEATURE_TEMP_EMERGENCY_HYST:
+ case SENSORS_SUBFEATURE_TEMP_LOWEST:
+ case SENSORS_SUBFEATURE_TEMP_HIGHEST:
+ case SENSORS_SUBFEATURE_TEMP_ALARM:
+ case SENSORS_SUBFEATURE_TEMP_MAX_ALARM:
+ case SENSORS_SUBFEATURE_TEMP_MIN_ALARM:
+ case SENSORS_SUBFEATURE_TEMP_CRIT_ALARM:
+ case SENSORS_SUBFEATURE_TEMP_EMERGENCY_ALARM:
+ case SENSORS_SUBFEATURE_TEMP_LCRIT_ALARM:
+ case SENSORS_SUBFEATURE_TEMP_FAULT:
+ case SENSORS_SUBFEATURE_TEMP_TYPE:
+ case SENSORS_SUBFEATURE_TEMP_OFFSET:
+ case SENSORS_SUBFEATURE_TEMP_BEEP:
+ value += 273.15;
+ break;
-static int find_sensors(td_ctx* ctx, td_source* source,
- sensors_feature_type type, find_sensors_callback callback) {
+ default:
+ break;
+ }
+
+ // Push the value
+ r = td_metrics_push_float(metrics, v->field, value);
+ if (r < 0)
+ return r;
+
+ // We are done for this subfeature
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int read_sensors(td_ctx* ctx, td_source* source,
+ sensors_feature_type type, const sensors_value* values) {
const sensors_feature* feature = NULL;
const sensors_chip_name* chip = NULL;
td_metrics* metrics = NULL;
if (r < 0)
goto ERROR;
- // Call the callback
- r = callback(ctx, source, chip, feature, metrics);
+ // Read the values
+ r = read_values(ctx, chip, feature, metrics, values);
if (r < 0)
goto ERROR;
return r;
}
-typedef struct sensors_value {
- // Field
- const char* field;
-
- // Type
- sensors_subfeature_type type;
-} sensors_value;
-
-static int read_sensors(td_ctx* ctx, const sensors_chip_name* chip,
- const sensors_feature* feature, td_metrics* metrics, sensors_value* values) {
- const sensors_subfeature* subfeature = NULL;
- double value = 0;
- int index = 0;
- int r;
-
- // Iterate over all subfeatures
- for (;;) {
- subfeature = sensors_get_all_subfeatures(chip, feature, &index);
- if (!subfeature)
- break;
-
- // Search for any matching values and read them
- for (sensors_value* v = values; v->field; v++) {
- if (subfeature->type == v->type) {
- // Read the value
- r = sensors_get_value(chip, subfeature->number, &value);
- if (r < 0)
- return r;
-
- // Convert some temperature values from Celsius to Kelvin
- switch (v->type) {
- case SENSORS_SUBFEATURE_TEMP_INPUT:
- case SENSORS_SUBFEATURE_TEMP_MAX:
- case SENSORS_SUBFEATURE_TEMP_MAX_HYST:
- case SENSORS_SUBFEATURE_TEMP_MIN:
- case SENSORS_SUBFEATURE_TEMP_CRIT:
- case SENSORS_SUBFEATURE_TEMP_CRIT_HYST:
- case SENSORS_SUBFEATURE_TEMP_LCRIT:
- case SENSORS_SUBFEATURE_TEMP_EMERGENCY:
- case SENSORS_SUBFEATURE_TEMP_EMERGENCY_HYST:
- case SENSORS_SUBFEATURE_TEMP_LOWEST:
- case SENSORS_SUBFEATURE_TEMP_HIGHEST:
- case SENSORS_SUBFEATURE_TEMP_ALARM:
- case SENSORS_SUBFEATURE_TEMP_MAX_ALARM:
- case SENSORS_SUBFEATURE_TEMP_MIN_ALARM:
- case SENSORS_SUBFEATURE_TEMP_CRIT_ALARM:
- case SENSORS_SUBFEATURE_TEMP_EMERGENCY_ALARM:
- case SENSORS_SUBFEATURE_TEMP_LCRIT_ALARM:
- case SENSORS_SUBFEATURE_TEMP_FAULT:
- case SENSORS_SUBFEATURE_TEMP_TYPE:
- case SENSORS_SUBFEATURE_TEMP_OFFSET:
- case SENSORS_SUBFEATURE_TEMP_BEEP:
- value += 273.15;
- break;
-
- default:
- break;
- }
-
- // Push the value
- r = td_metrics_push_float(metrics, v->field, value);
- if (r < 0)
- return r;
-
- // We are done for this subfeature
- break;
- }
- }
- }
-
- return 0;
-}
-
/*
(Voltage) Input
*/
-static int read_input_sensors(td_ctx* ctx, td_source* source, const sensors_chip_name* chip,
- const sensors_feature* feature, td_metrics* metrics) {
- sensors_value values[] = {
+static int sensors_input_heartbeat(td_ctx* ctx, td_source* source) {
+ const sensors_value values[] = {
{ "current", SENSORS_SUBFEATURE_IN_INPUT },
{ "min", SENSORS_SUBFEATURE_IN_MIN },
{ "max", SENSORS_SUBFEATURE_IN_MAX },
{ NULL },
};
- // Read values
- return read_sensors(ctx, chip, feature, metrics, values);
-}
-
-static int sensors_input_heartbeat(td_ctx* ctx, td_source* source) {
- return find_sensors(ctx, source, SENSORS_FEATURE_IN, read_input_sensors);
+ return read_sensors(ctx, source, SENSORS_FEATURE_IN, values);
}
const td_source_impl sensors_input_source = {
/*
Temperature
*/
-static int read_temp_sensors(td_ctx* ctx, td_source* source, const sensors_chip_name* chip,
- const sensors_feature* feature, td_metrics* metrics) {
+static int sensors_temp_heartbeat(td_ctx* ctx, td_source* source) {
sensors_value values[] = {
{ "current", SENSORS_SUBFEATURE_TEMP_INPUT },
{ "max", SENSORS_SUBFEATURE_TEMP_MAX },
{ NULL },
};
- // Read values
- return read_sensors(ctx, chip, feature, metrics, values);
-}
-
-static int sensors_temp_heartbeat(td_ctx* ctx, td_source* source) {
- return find_sensors(ctx, source, SENSORS_FEATURE_TEMP, read_temp_sensors);
+ return read_sensors(ctx, source, SENSORS_FEATURE_TEMP, values);
}
const td_source_impl sensors_temp_source = {