sensor units should handle percentage units - ID: 3014014

This commit is contained in:
Jim Mankovich 2012-02-16 12:55:52 +00:00
parent 83b34749c5
commit 6e5043f289
5 changed files with 54 additions and 96 deletions

View File

@ -896,7 +896,8 @@ int ipmi_sdr_print_rawentry(struct ipmi_intf *intf, uint8_t type, uint8_t * raw,
int len); int len);
int ipmi_sdr_print_listentry(struct ipmi_intf *intf, int ipmi_sdr_print_listentry(struct ipmi_intf *intf,
struct sdr_record_list *entry); struct sdr_record_list *entry);
char *ipmi_sdr_get_unit_string(uint8_t type, uint8_t base, uint8_t modifier); const char *ipmi_sdr_get_unit_string(uint8_t pct, uint8_t type,
uint8_t base, uint8_t modifier);
const char *ipmi_sdr_get_status(struct sdr_record_full_sensor *sensor, const char *ipmi_sdr_get_status(struct sdr_record_full_sensor *sensor,
uint8_t stat); uint8_t stat);
double sdr_convert_sensor_tolerance(struct sdr_record_full_sensor *sensor, double sdr_convert_sensor_tolerance(struct sdr_record_full_sensor *sensor,

View File

@ -64,30 +64,44 @@ static struct ipmi_sdr_iterator *sdr_list_itr = NULL;
/* ipmi_sdr_get_unit_string - return units for base/modifier /* ipmi_sdr_get_unit_string - return units for base/modifier
* *
* @pct: units are a percentage
* @type: unit type * @type: unit type
* @base: base * @base: base
* @modifier: modifier * @modifier: modifier
* *
* returns pointer to static string * returns pointer to static string
*/ */
char * const char *
ipmi_sdr_get_unit_string(uint8_t type, uint8_t base, uint8_t modifier) ipmi_sdr_get_unit_string(uint8_t pct, uint8_t type, uint8_t base, uint8_t modifier)
{ {
static char unitstr[16]; static char unitstr[16];
/*
* By default, if units are supposed to be percent, we will pre-pend
* the percent string to the textual representation of the units.
*/
char *pctstr = pct ? "% " : "";
memset(unitstr, 0, sizeof (unitstr)); memset(unitstr, 0, sizeof (unitstr));
switch (type) { switch (type) {
case 2: case 2:
snprintf(unitstr, sizeof (unitstr), "%s * %s", snprintf(unitstr, sizeof (unitstr), "%s%s * %s",
unit_desc[base], unit_desc[modifier]); pctstr, unit_desc[base], unit_desc[modifier]);
break; break;
case 1: case 1:
snprintf(unitstr, sizeof (unitstr), "%s/%s", snprintf(unitstr, sizeof (unitstr), "%s%s/%s",
unit_desc[base], unit_desc[modifier]); pctstr, unit_desc[base], unit_desc[modifier]);
break; break;
case 0: case 0:
default: default:
snprintf(unitstr, sizeof (unitstr), "%s", unit_desc[base]); /*
* Display the text "percent" only when the Base unit is
* "unspecified" and the caller specified to print percent.
*/
if (base == 0 && pct) {
snprintf(unitstr, sizeof(unitstr), "percent");
} else {
snprintf(unitstr, sizeof (unitstr), "%s%s",
pctstr, unit_desc[base]);
}
break; break;
} }
@ -1154,8 +1168,9 @@ int
ipmi_sdr_print_sensor_full(struct ipmi_intf *intf, ipmi_sdr_print_sensor_full(struct ipmi_intf *intf,
struct sdr_record_full_sensor *sensor) struct sdr_record_full_sensor *sensor)
{ {
char sval[16], unitstr[16], desc[17]; const char *unitstr = NULL;
int i = 0, validread = 1, do_unit = 1; char sval[16], desc[17];
int i = 0, validread = 1;
double val = 0.0, creading = 0.0; double val = 0.0, creading = 0.0;
struct ipmi_rs *rsp; struct ipmi_rs *rsp;
uint8_t target, lun, channel; uint8_t target, lun, channel;
@ -1219,25 +1234,11 @@ ipmi_sdr_print_sensor_full(struct ipmi_intf *intf,
} }
/* determine units with possible modifiers */ /* determine units with possible modifiers */
if (do_unit && validread) { if (validread) {
memset(unitstr, 0, sizeof (unitstr)); unitstr = ipmi_sdr_get_unit_string(sensor->unit.pct,
switch (sensor->unit.modifier) { sensor->unit.modifier,
case 2: sensor->unit.type.base,
i += snprintf(unitstr, sizeof (unitstr), "%s * %s", sensor->unit.type.modifier);
unit_desc[sensor->unit.type.base],
unit_desc[sensor->unit.type.modifier]);
break;
case 1:
i += snprintf(unitstr, sizeof (unitstr), "%s/%s",
unit_desc[sensor->unit.type.base],
unit_desc[sensor->unit.type.modifier]);
break;
case 0:
default:
i += snprintf(unitstr, sizeof (unitstr), "%s",
unit_desc[sensor->unit.type.base]);
break;
}
} }
/* /*
@ -1252,7 +1253,7 @@ ipmi_sdr_print_sensor_full(struct ipmi_intf *intf,
if (validread) { if (validread) {
printf("%.*f,", (val == (int) val) ? 0 : 3, val); printf("%.*f,", (val == (int) val) ? 0 : 3, val);
printf("%s,%s", do_unit ? unitstr : "", printf("%s,%s", unitstr,
ipmi_sdr_get_status(sensor, rsp->data[2])); ipmi_sdr_get_status(sensor, rsp->data[2]));
} else { } else {
printf(",,ns"); printf(",,ns");
@ -1310,8 +1311,7 @@ ipmi_sdr_print_sensor_full(struct ipmi_intf *intf,
if (validread) if (validread)
i += snprintf(sval, sizeof (sval), "%.*f %s", i += snprintf(sval, sizeof (sval), "%.*f %s",
(val == (int) val) ? 0 : 2, val, (val == (int) val) ? 0 : 2, val, unitstr);
do_unit ? unitstr : "");
else if (rsp && IS_SCANNING_DISABLED(rsp->data[1])) else if (rsp && IS_SCANNING_DISABLED(rsp->data[1]))
i += snprintf(sval, sizeof (sval), "disabled "); i += snprintf(sval, sizeof (sval), "disabled ");
else else
@ -1344,8 +1344,7 @@ ipmi_sdr_print_sensor_full(struct ipmi_intf *intf,
if (validread) if (validread)
i += snprintf(sval, sizeof (sval), "%.*f %s", i += snprintf(sval, sizeof (sval), "%.*f %s",
(val == (int) val) ? 0 : 2, val, (val == (int) val) ? 0 : 2, val, unitstr);
do_unit ? unitstr : "");
else if (rsp && IS_SCANNING_DISABLED(rsp->data[1])) else if (rsp && IS_SCANNING_DISABLED(rsp->data[1]))
i += snprintf(sval, sizeof (sval), "Disabled"); i += snprintf(sval, sizeof (sval), "Disabled");
else else

View File

@ -1124,7 +1124,8 @@ ipmi_sel_print_std_entry(struct ipmi_intf * intf, struct sel_event_record * evt)
((evt->sel_type.standard_type.event_data[0] & 0xf) % 2) ? ">" : "<", ((evt->sel_type.standard_type.event_data[0] & 0xf) % 2) ? ">" : "<",
(threshold_reading==(int)threshold_reading) ? 0 : 2, (threshold_reading==(int)threshold_reading) ? 0 : 2,
threshold_reading, threshold_reading,
ipmi_sdr_get_unit_string(sdr->record.full->unit.modifier, ipmi_sdr_get_unit_string(sdr->record.full->unit.pct,
sdr->record.full->unit.modifier,
sdr->record.full->unit.type.base, sdr->record.full->unit.type.base,
sdr->record.full->unit.type.modifier)); sdr->record.full->unit.type.modifier));
} }
@ -1311,25 +1312,10 @@ ipmi_sel_print_extended_entry_verbose(struct ipmi_intf * intf, struct sel_event_
sdr_convert_sensor_reading(sdr->record.full, sdr_convert_sensor_reading(sdr->record.full,
evt->sel_type.standard_type.event_data[1])); evt->sel_type.standard_type.event_data[1]));
/* determine units with possible modifiers */ /* determine units with possible modifiers */
switch (sdr->record.full->unit.modifier) { printf ("%s\n", ipmi_sdr_get_unit_string(sdr->record.full->unit.pct,
case 2: sdr->record.full->unit.modifier,
printf(" %s * %s\n", sdr->record.full->unit.type.base,
unit_desc[sdr->record.full->unit.type.base], sdr->record.full->unit.type.modifier));
unit_desc[sdr->record.full->unit.type.modifier]);
break;
case 1:
printf(" %s/%s\n",
unit_desc[sdr->record.full->unit.type.base],
unit_desc[sdr->record.full->unit.type.modifier]);
break;
case 0:
printf(" %s\n",
unit_desc[sdr->record.full->unit.type.base]);
break;
default:
printf("\n");
break;
}
break; break;
case 2: case 2:
/* oem code in byte 2 */ /* oem code in byte 2 */
@ -1352,25 +1338,10 @@ ipmi_sel_print_extended_entry_verbose(struct ipmi_intf * intf, struct sel_event_
sdr_convert_sensor_reading(sdr->record.full, sdr_convert_sensor_reading(sdr->record.full,
evt->sel_type.standard_type.event_data[2])); evt->sel_type.standard_type.event_data[2]));
/* determine units with possible modifiers */ /* determine units with possible modifiers */
switch (sdr->record.full->unit.modifier) { printf ("%s\n", ipmi_sdr_get_unit_string(sdr->record.full->unit.pct,
case 2: sdr->record.full->unit.modifier,
printf(" %s * %s\n", sdr->record.full->unit.type.base,
unit_desc[sdr->record.full->unit.type.base], sdr->record.full->unit.type.modifier));
unit_desc[sdr->record.full->unit.type.modifier]);
break;
case 1:
printf(" %s/%s\n",
unit_desc[sdr->record.full->unit.type.base],
unit_desc[sdr->record.full->unit.type.modifier]);
break;
case 0:
printf(" %s\n",
unit_desc[sdr->record.full->unit.type.base]);
break;
default:
printf("\n");
break;
}
break; break;
case 2: case 2:
/* OEM code in byte 3 */ /* OEM code in byte 3 */

View File

@ -228,8 +228,9 @@ static int
ipmi_sensor_print_full_analog(struct ipmi_intf *intf, ipmi_sensor_print_full_analog(struct ipmi_intf *intf,
struct sdr_record_full_sensor *sensor) struct sdr_record_full_sensor *sensor)
{ {
char unitstr[16], id[17]; const char *unitstr = NULL;
int i = 0, validread = 1, thresh_available = 1; char id[17];
int validread = 1, thresh_available = 1;
double val = 0.0; double val = 0.0;
struct ipmi_rs *rsp; struct ipmi_rs *rsp;
char *status = NULL; char *status = NULL;
@ -277,25 +278,10 @@ ipmi_sensor_print_full_analog(struct ipmi_intf *intf,
/* /*
* Figure out units * Figure out units
*/ */
memset(unitstr, 0, sizeof (unitstr)); unitstr = ipmi_sdr_get_unit_string(sensor->unit.pct,
switch (sensor->unit.modifier) { sensor->unit.modifier,
case 2: sensor->unit.type.base,
i += snprintf(unitstr, sizeof (unitstr), "%s * %s", sensor->unit.type.modifier);
unit_desc[sensor->unit.type.base],
unit_desc[sensor->unit.type.modifier]);
break;
case 1:
i += snprintf(unitstr, sizeof (unitstr), "%s/%s",
unit_desc[sensor->unit.type.base],
unit_desc[sensor->unit.type.modifier]);
break;
case 0:
default:
i += snprintf(unitstr, sizeof (unitstr), "%s",
unit_desc[sensor->unit.type.base]);
break;
}
/* /*
* Get sensor thresholds * Get sensor thresholds
*/ */

View File

@ -284,7 +284,8 @@ log_event(struct ipmi_event_intf * eintf, struct sel_event_record * evt)
((evt->sel_type.standard_type.event_data[0] & 0xf) % 2) ? ">" : "<", ((evt->sel_type.standard_type.event_data[0] & 0xf) % 2) ? ">" : "<",
(threshold_reading==(int)threshold_reading) ? 0 : 2, (threshold_reading==(int)threshold_reading) ? 0 : 2,
threshold_reading, threshold_reading,
ipmi_sdr_get_unit_string(sdr->record.full->unit.modifier, ipmi_sdr_get_unit_string(sdr->record.full->unit.pct,
sdr->record.full->unit.modifier,
sdr->record.full->unit.type.base, sdr->record.full->unit.type.base,
sdr->record.full->unit.type.modifier)); sdr->record.full->unit.type.modifier));
} }