From 6e5043f2898a6360e5431c9d073b2bce84306ea7 Mon Sep 17 00:00:00 2001 From: Jim Mankovich Date: Thu, 16 Feb 2012 12:55:52 +0000 Subject: [PATCH] sensor units should handle percentage units - ID: 3014014 --- ipmitool/include/ipmitool/ipmi_sdr.h | 3 +- ipmitool/lib/ipmi_sdr.c | 67 ++++++++++++++-------------- ipmitool/lib/ipmi_sel.c | 49 +++++--------------- ipmitool/lib/ipmi_sensor.c | 28 +++--------- ipmitool/src/ipmievd.c | 3 +- 5 files changed, 54 insertions(+), 96 deletions(-) diff --git a/ipmitool/include/ipmitool/ipmi_sdr.h b/ipmitool/include/ipmitool/ipmi_sdr.h index 7dd1676..d51a9bb 100644 --- a/ipmitool/include/ipmitool/ipmi_sdr.h +++ b/ipmitool/include/ipmitool/ipmi_sdr.h @@ -896,7 +896,8 @@ int ipmi_sdr_print_rawentry(struct ipmi_intf *intf, uint8_t type, uint8_t * raw, int len); int ipmi_sdr_print_listentry(struct ipmi_intf *intf, 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, uint8_t stat); double sdr_convert_sensor_tolerance(struct sdr_record_full_sensor *sensor, diff --git a/ipmitool/lib/ipmi_sdr.c b/ipmitool/lib/ipmi_sdr.c index 381649b..86ab1d0 100644 --- a/ipmitool/lib/ipmi_sdr.c +++ b/ipmitool/lib/ipmi_sdr.c @@ -64,30 +64,44 @@ static struct ipmi_sdr_iterator *sdr_list_itr = NULL; /* ipmi_sdr_get_unit_string - return units for base/modifier * + * @pct: units are a percentage * @type: unit type * @base: base * @modifier: modifier * * returns pointer to static string */ -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) { 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)); switch (type) { case 2: - snprintf(unitstr, sizeof (unitstr), "%s * %s", - unit_desc[base], unit_desc[modifier]); + snprintf(unitstr, sizeof (unitstr), "%s%s * %s", + pctstr, unit_desc[base], unit_desc[modifier]); break; case 1: - snprintf(unitstr, sizeof (unitstr), "%s/%s", - unit_desc[base], unit_desc[modifier]); + snprintf(unitstr, sizeof (unitstr), "%s%s/%s", + pctstr, unit_desc[base], unit_desc[modifier]); break; case 0: 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; } @@ -1154,8 +1168,9 @@ int ipmi_sdr_print_sensor_full(struct ipmi_intf *intf, struct sdr_record_full_sensor *sensor) { - char sval[16], unitstr[16], desc[17]; - int i = 0, validread = 1, do_unit = 1; + const char *unitstr = NULL; + char sval[16], desc[17]; + int i = 0, validread = 1; double val = 0.0, creading = 0.0; struct ipmi_rs *rsp; uint8_t target, lun, channel; @@ -1219,25 +1234,11 @@ ipmi_sdr_print_sensor_full(struct ipmi_intf *intf, } /* determine units with possible modifiers */ - if (do_unit && validread) { - memset(unitstr, 0, sizeof (unitstr)); - switch (sensor->unit.modifier) { - case 2: - i += snprintf(unitstr, sizeof (unitstr), "%s * %s", - 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; - } + if (validread) { + unitstr = ipmi_sdr_get_unit_string(sensor->unit.pct, + sensor->unit.modifier, + sensor->unit.type.base, + sensor->unit.type.modifier); } /* @@ -1252,7 +1253,7 @@ ipmi_sdr_print_sensor_full(struct ipmi_intf *intf, if (validread) { 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])); } else { printf(",,ns"); @@ -1310,8 +1311,7 @@ ipmi_sdr_print_sensor_full(struct ipmi_intf *intf, if (validread) i += snprintf(sval, sizeof (sval), "%.*f %s", - (val == (int) val) ? 0 : 2, val, - do_unit ? unitstr : ""); + (val == (int) val) ? 0 : 2, val, unitstr); else if (rsp && IS_SCANNING_DISABLED(rsp->data[1])) i += snprintf(sval, sizeof (sval), "disabled "); else @@ -1344,8 +1344,7 @@ ipmi_sdr_print_sensor_full(struct ipmi_intf *intf, if (validread) i += snprintf(sval, sizeof (sval), "%.*f %s", - (val == (int) val) ? 0 : 2, val, - do_unit ? unitstr : ""); + (val == (int) val) ? 0 : 2, val, unitstr); else if (rsp && IS_SCANNING_DISABLED(rsp->data[1])) i += snprintf(sval, sizeof (sval), "Disabled"); else diff --git a/ipmitool/lib/ipmi_sel.c b/ipmitool/lib/ipmi_sel.c index bfb27c4..64f679d 100644 --- a/ipmitool/lib/ipmi_sel.c +++ b/ipmitool/lib/ipmi_sel.c @@ -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) ? ">" : "<", (threshold_reading==(int)threshold_reading) ? 0 : 2, 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.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, evt->sel_type.standard_type.event_data[1])); /* determine units with possible modifiers */ - switch (sdr->record.full->unit.modifier) { - case 2: - printf(" %s * %s\n", - unit_desc[sdr->record.full->unit.type.base], - 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; - } + printf ("%s\n", 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.modifier)); break; case 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, evt->sel_type.standard_type.event_data[2])); /* determine units with possible modifiers */ - switch (sdr->record.full->unit.modifier) { - case 2: - printf(" %s * %s\n", - unit_desc[sdr->record.full->unit.type.base], - 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; - } + printf ("%s\n", 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.modifier)); break; case 2: /* OEM code in byte 3 */ diff --git a/ipmitool/lib/ipmi_sensor.c b/ipmitool/lib/ipmi_sensor.c index 52ea89a..58b793b 100644 --- a/ipmitool/lib/ipmi_sensor.c +++ b/ipmitool/lib/ipmi_sensor.c @@ -228,8 +228,9 @@ static int ipmi_sensor_print_full_analog(struct ipmi_intf *intf, struct sdr_record_full_sensor *sensor) { - char unitstr[16], id[17]; - int i = 0, validread = 1, thresh_available = 1; + const char *unitstr = NULL; + char id[17]; + int validread = 1, thresh_available = 1; double val = 0.0; struct ipmi_rs *rsp; char *status = NULL; @@ -277,25 +278,10 @@ ipmi_sensor_print_full_analog(struct ipmi_intf *intf, /* * Figure out units */ - memset(unitstr, 0, sizeof (unitstr)); - switch (sensor->unit.modifier) { - case 2: - i += snprintf(unitstr, sizeof (unitstr), "%s * %s", - 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; - } - + unitstr = ipmi_sdr_get_unit_string(sensor->unit.pct, + sensor->unit.modifier, + sensor->unit.type.base, + sensor->unit.type.modifier); /* * Get sensor thresholds */ diff --git a/ipmitool/src/ipmievd.c b/ipmitool/src/ipmievd.c index 422fcda..2512250 100644 --- a/ipmitool/src/ipmievd.c +++ b/ipmitool/src/ipmievd.c @@ -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) ? ">" : "<", (threshold_reading==(int)threshold_reading) ? 0 : 2, 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.modifier)); }