Generic chip support / get featuretype fixes just received from Bob Schlarmann, as the version I committed wasn't the latest version

git-svn-id: http://lm-sensors.org/svn/lm-sensors/branches/lm-sensors-3.0.0@4366 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Hans de Goede committed 2007-04-09 17:48:57 +00:00
1 parent 1b65a96744
commit ba5140b3d8
3 files changed
+124 -68

No files matched your search

+95 -58
View File
@@ -20,6 +20,7 @@
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <regex.h>
#include "access.h"
#include "sensors.h"
#include "data.h"
@@ -27,6 +28,13 @@
#include "proc.h"
#include "general.h"
#define GET_TYPE_REGEX "\\([[:alpha:]]\\{1,\\}\\)[[:digit:]]\\{0,\\}\\(_\\([[:alpha:]]\\{1,\\}\\)\\)\\{0,1\\}"
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (const char *)__mptr - offsetof(type,member) );})
static int sensors_do_this_chip_sets(sensors_chip_name name);
/* Compare two chips name descriptions, to see whether they could match.
@@ -497,72 +505,101 @@ int sensors_do_all_sets(void)
return sensors_do_chip_sets(name);
}
/* Static mappings for use by sensors_feature_get_type() */
struct feature_type_match
{
const char *name;
sensors_feature_type type;
struct feature_type_match *submatches;
};
static struct feature_type_match temp_matches[] = {
{ "max", SENSORS_FEATURE_TEMP_MAX },
{ "min", SENSORS_FEATURE_TEMP_MIN },
{ "type", SENSORS_FEATURE_TEMP_SENS },
{ "hyst", SENSORS_FEATURE_TEMP_HYST },
{ "over", SENSORS_FEATURE_TEMP_OVER },
{ "max", SENSORS_FEATURE_TEMP_MAX },
{ "min", SENSORS_FEATURE_TEMP_MIN },
{ "low", SENSORS_FEATURE_TEMP_LOW },
{ "crit", SENSORS_FEATURE_TEMP_CRIT },
{ "fault", SENSORS_FEATURE_TEMP_FAULT },
{ "alarm", SENSORS_FEATURE_TEMP_ALARM },
{ "type", SENSORS_FEATURE_TEMP_SENS },
{ 0 }
};
static struct feature_type_match in_matches[] = {
{ "max", SENSORS_FEATURE_IN_MAX },
{ "max_alarm", SENSORS_FEATURE_IN_MAX_ALARM },
{ "min", SENSORS_FEATURE_IN_MIN },
{ "min_alarm", SENSORS_FEATURE_IN_MIN_ALARM },
{ "alarm", SENSORS_FEATURE_IN_ALARM },
{ 0 }
};
static struct feature_type_match fan_matches[] = {
{ "min", SENSORS_FEATURE_FAN_MIN },
{ "div", SENSORS_FEATURE_FAN_DIV },
{ "alarm", SENSORS_FEATURE_FAN_ALARM },
{ "fault", SENSORS_FEATURE_FAN_FAULT },
{ 0 }
};
static struct feature_type_match matches[] = {
{ "temp", SENSORS_FEATURE_TEMP, temp_matches },
{ "in", SENSORS_FEATURE_IN, in_matches },
{ "fan", SENSORS_FEATURE_FAN, fan_matches },
{ "vrm", SENSORS_FEATURE_VRM, 0 },
{ "vid", SENSORS_FEATURE_VID, 0 },
{ "sensor", SENSORS_FEATURE_TEMP_SENS, 0 },
{ 0 }
};
/* Return the feature type based on the feature name */
sensors_feature_type sensors_feature_get_type(
const sensors_feature_data *feature)
{
const char *name;
const char *name;
regex_t preg;
regmatch_t pmatch[4];
int size_first, size_second, retval, i;
struct feature_type_match *submatches;
/* this will only work when the sensors_chip_feature is obtained through
sensors_get_all_features */
if (((const struct sensors_chip_feature *)feature)->sysname)
name = ((const struct sensors_chip_feature *)feature)->sysname;
/* use sysname if exists */
if (container_of(feature, const struct sensors_chip_feature, data)->sysname)
name = container_of(feature, const struct sensors_chip_feature, data)->sysname;
else
name = feature->name;
if (strstr(name, "temp")) {
if (strlen(name) == 5)
return SENSORS_FEATURE_TEMP;
if (strstr(name, "hyst"))
return SENSORS_FEATURE_TEMP_HYST;
if (strstr(name, "over"))
return SENSORS_FEATURE_TEMP_OVER;
if (strstr(name, "max"))
return SENSORS_FEATURE_TEMP_MAX;
if (strstr(name, "min"))
return SENSORS_FEATURE_TEMP_MIN;
if (strstr(name, "low"))
return SENSORS_FEATURE_TEMP_LOW;
if (strstr(name, "crit"))
return SENSORS_FEATURE_TEMP_CRIT;
} else if (strstr(name, "in") && name[0] != 'f') {
if (strlen(name) == 3 || strstr(name, "input"))
return SENSORS_FEATURE_IN;
if (strstr(name, "max_alarm"))
return SENSORS_FEATURE_IN_MAX_ALARM;
if (strstr(name, "max"))
return SENSORS_FEATURE_IN_MAX;
if (strstr(name, "min_alarm"))
return SENSORS_FEATURE_IN_MIN_ALARM;
if (strstr(name, "min"))
return SENSORS_FEATURE_IN_MIN;
if (strstr(name, "alarm"))
return SENSORS_FEATURE_IN_ALARM;
} else if (strstr(name, "fan")) {
if (strlen(name) == 4)
return SENSORS_FEATURE_FAN;
if (strstr(name, "min"))
return SENSORS_FEATURE_FAN_MIN;
if (strstr(name, "div"))
return SENSORS_FEATURE_FAN_DIV;
} else if (!strcmp(name, "vrm")) {
return SENSORS_FEATURE_VRM;
} else if (strstr(name, "vid")) {
return SENSORS_FEATURE_VID;
}
regcomp(&preg, GET_TYPE_REGEX, 0);
retval = regexec(&preg, name, 4, pmatch, 0);
regfree(&preg);
if (retval == -1)
return SENSORS_FEATURE_UNKNOWN;
size_first = pmatch[1].rm_eo - pmatch[1].rm_so;
size_second = pmatch[3].rm_eo - pmatch[3].rm_so;
for(i = 0; matches[i].name != 0; i++)
if (!strncmp(name, matches[i].name, size_first))
break;
if (matches[i].name == NULL) /* no match */
return SENSORS_FEATURE_UNKNOWN;
else if (size_second == 0) /* single type */
return matches[i].type;
else if (matches[i].submatches == NULL) /* not single type, but no submatches */
return SENSORS_FEATURE_UNKNOWN;
submatches = matches[i].submatches;
for(i = 0; submatches[i].name != 0; i++)
if (!strncmp(name + pmatch[3].rm_so, submatches[i].name, size_second))
return submatches[i].type;
return SENSORS_FEATURE_UNKNOWN;
}
+12 -7
View File
@@ -21,6 +21,7 @@
#define LIB_SENSORS_SENSORS_H
#include <stdio.h>
#include <limits.h>
/* Publicly accessible library functions */
@@ -147,8 +148,10 @@ extern const sensors_feature_data *sensors_get_all_features
(sensors_chip_name name, int *nr1,int *nr2);
typedef enum sensors_feature_type {
SENSORS_FEATURE_TEMP = 0,
SENSORS_FEATURE_TEMP = 0x0,
SENSORS_FEATURE_TEMP_ALARM,
SENSORS_FEATURE_TEMP_FAULT,
SENSORS_FEATURE_TEMP_SENS,
SENSORS_FEATURE_TEMP_HYST,
SENSORS_FEATURE_TEMP_OVER,
SENSORS_FEATURE_TEMP_MAX,
@@ -158,26 +161,28 @@ typedef enum sensors_feature_type {
SENSORS_FEATURE_TEMP_LIM,
SENSORS_FEATURE_TEMP_CRIT,
SENSORS_FEATURE_IN,
SENSORS_FEATURE_IN = 0x100,
SENSORS_FEATURE_IN_ALARM,
SENSORS_FEATURE_IN_MIN,
SENSORS_FEATURE_IN_MAX,
SENSORS_FEATURE_IN_MIN_ALARM,
SENSORS_FEATURE_IN_MAX_ALARM,
SENSORS_FEATURE_FAN,
SENSORS_FEATURE_FAN = 0x200,
SENSORS_FEATURE_FAN_ALARM,
SENSORS_FEATURE_FAN_FAULT,
SENSORS_FEATURE_FAN_MIN,
SENSORS_FEATURE_FAN_DIV,
SENSORS_FEATURE_VID,
SENSORS_FEATURE_VID = 0x300,
SENSORS_FEATURE_VRM,
SENSORS_FEATURE_UNKNOWN
SENSORS_FEATURE_UNKNOWN = INT_MAX
} sensors_feature_type;
sensors_feature_type sensors_feature_get_type(
const sensors_feature_data *feature);
sensors_feature_type sensors_feature_get_type
(const sensors_feature_data *feature);
#ifdef __cplusplus
}
#endif /* __cplusplus */
+17 -3
View File
@@ -193,9 +193,23 @@ static void print_generic_chip_temp(const sensors_chip_name *name,
print_temp_info_real(val, max, min, 0.0, type, 1, 1);
}
/* TODO: check for FAULT */
if (TEMP_FEATURE(SENSORS_FEATURE_TEMP_ALARM) &&
TEMP_FEATURE_VAL(SENSORS_FEATURE_TEMP_ALARM)) {
/* print out temperature sensor info */
if (TEMP_FEATURE(SENSORS_FEATURE_TEMP_SENS)) {
int sens = (int)TEMP_FEATURE_VAL(SENSORS_FEATURE_TEMP_SENS);
printf("sensor = %s ", sens == 0 ? "disabled" :
sens == 1 ? "diode" :
sens == 2 ? "transistor" :
sens == 3 ? "thermal diode" :
sens == 4 ? "thermistor" :
"unkown");
}
/* ALARM and FAULT features */
if (TEMP_FEATURE(SENSORS_FEATURE_TEMP_FAULT) &&
TEMP_FEATURE_VAL(SENSORS_FEATURE_TEMP_FAULT) > 0.5) {
printf(" FAULT");
} else if (TEMP_FEATURE(SENSORS_FEATURE_TEMP_ALARM) &&
TEMP_FEATURE_VAL(SENSORS_FEATURE_TEMP_ALARM) > 0.5) {
printf(" ALARM");
}
printf("\n");