From: Francois I. <isa...@us...> - 2006-11-03 19:04:25
|
Update of /cvsroot/ipmitool/ipmitool/lib In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv2254/lib Modified Files: ipmi_sdr.c Log Message: Added sdr_convert_sensor_hysterisis to avoid taking "B" into consideration Index: ipmi_sdr.c =================================================================== RCS file: /cvsroot/ipmitool/ipmitool/lib/ipmi_sdr.c,v retrieving revision 1.71 retrieving revision 1.72 diff -C2 -d -r1.71 -r1.72 *** ipmi_sdr.c 25 Oct 2006 03:21:57 -0000 1.71 --- ipmi_sdr.c 3 Nov 2006 19:04:15 -0000 1.72 *************** *** 93,97 **** return unitstr; } - /* sdr_convert_sensor_reading - convert raw sensor reading * --- 93,96 ---- *************** *** 170,173 **** --- 169,253 ---- return result; } + /* sdr_convert_sensor_hysterisis - convert raw sensor hysterisis + * + * Even though spec says histerisis should be computed using Mx+B + * formula, B is irrelevant when doing raw comparison + * + * threshold rearm point is computed using threshold +/- hysterisis + * with the full formula however B can't be applied in raw comparisons + * + * @sensor: sensor record + * @val: raw sensor reading + * + * returns floating-point sensor reading + */ + double + sdr_convert_sensor_hysterisis(struct sdr_record_full_sensor *sensor, uint8_t val) + { + int m, k1, k2; + double result; + + m = __TO_M(sensor->mtol); + + k1 = __TO_B_EXP(sensor->bacc); + k2 = __TO_R_EXP(sensor->bacc); + + switch (sensor->unit.analog) { + case 0: + result = (double) (((m * val)) * pow(10, k2)); + break; + case 1: + if (val & 0x80) + val++; + /* Deliberately fall through to case 2. */ + case 2: + result = (double) (((m * (int8_t) val) ) * pow(10, k2)); + break; + default: + /* Oops! This isn't an analog sensor. */ + return 0.0; + } + + switch (sensor->linearization & 0x7f) { + case SDR_SENSOR_L_LN: + result = log(result); + break; + case SDR_SENSOR_L_LOG10: + result = log10(result); + break; + case SDR_SENSOR_L_LOG2: + result = (double) (log(result) / log(2.0)); + break; + case SDR_SENSOR_L_E: + result = exp(result); + break; + case SDR_SENSOR_L_EXP10: + result = pow(10.0, result); + break; + case SDR_SENSOR_L_EXP2: + result = pow(2.0, result); + break; + case SDR_SENSOR_L_1_X: + result = pow(result, -1.0); /*1/x w/o exception */ + break; + case SDR_SENSOR_L_SQR: + result = pow(result, 2.0); + break; + case SDR_SENSOR_L_CUBE: + result = pow(result, 3.0); + break; + case SDR_SENSOR_L_SQRT: + result = sqrt(result); + break; + case SDR_SENSOR_L_CUBERT: + result = cbrt(result); + break; + case SDR_SENSOR_L_LINEAR: + default: + break; + } + return result; + } + /* sdr_convert_sensor_tolerance - convert raw sensor reading *************** *** 1274,1278 **** creading = ! sdr_convert_sensor_reading(sensor, sensor->threshold.hysteresis.positive); if (sensor->threshold.hysteresis.positive == 0x00 --- 1354,1358 ---- creading = ! sdr_convert_sensor_hysterisis(sensor, sensor->threshold.hysteresis.positive); if (sensor->threshold.hysteresis.positive == 0x00 *************** *** 1283,1287 **** creading = ! sdr_convert_sensor_reading(sensor, sensor->threshold.hysteresis.negative); if (sensor->threshold.hysteresis.negative == 0x00 --- 1363,1367 ---- creading = ! sdr_convert_sensor_hysterisis(sensor, sensor->threshold.hysteresis.negative); if (sensor->threshold.hysteresis.negative == 0x00 |