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 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,

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
*
* @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

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) ? ">" : "<",
(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 */

View File

@ -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
*/

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) ? ">" : "<",
(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));
}