summaryrefslogtreecommitdiff
path: root/hpiutil/hpisensor.c
diff options
context:
space:
mode:
Diffstat (limited to 'hpiutil/hpisensor.c')
-rw-r--r--hpiutil/hpisensor.c467
1 files changed, 467 insertions, 0 deletions
diff --git a/hpiutil/hpisensor.c b/hpiutil/hpisensor.c
new file mode 100644
index 0000000..f7eef8f
--- /dev/null
+++ b/hpiutil/hpisensor.c
@@ -0,0 +1,467 @@
+/*
+ * hpisensor.c
+ *
+ * Author: Andy Cress arcress at users.sourceforge.net
+ * Copyright (c) 2003 Intel Corporation.
+ *
+ * 04/15/03 Andy Cress - created
+ * 04/17/03 Andy Cress - mods for resourceid, first good run
+ * 04/28/03 Andy Cress - adding Convert
+ * 05/02/03 Andy Cress v0.6 more Convert changes in ShowSensor (e.g. units)
+ * 06/06/03 Andy Cress v0.7 add more units, and buffer type
+ * 06/09/03 Andy Cress v0.8 added more for Compact Sensors
+ * 06/26/03 Andy Cress v1.0 added -t for thresholds
+ * 02/19/04 Andy Cress v1.1 recognize common errors for Compact & mBMC sensors.
+ * 10/14/04 Andy Cress v1.2 added HPI_A/HPI_B logic
+ * 01/07/05 Andy Cress v1.3 added HPI_B sleep for OpenHPI bug
+ */
+/*M*
+Copyright (c) 2003, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ a.. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ b.. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ c.. Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *M*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <string.h>
+#include <unistd.h>
+#include "SaHpi.h"
+
+#ifdef HPI_A
+char progver[] = "1.3 HPI-A";
+#else
+char progver[] = "1.3 HPI-B";
+#endif
+int fdebug = 0;
+int fshowthr = 0;
+char *rtypes[5] = {"None ", "Control ", "Sensor ", "Invent ", "Watchdog"};
+
+#define NSU 77
+char *units[NSU] = {
+"units", "degrees C", "degrees F", "degrees K", "volts", "amps",
+"watts", "joules", "coulombs", "va", "nits", "lumen",
+"lux", "candela", "kpa", "psi", "newton", "cfm",
+"rpm", "Hz", "us", "ms", "sec", "min",
+"hours", "days", "weeks", "mil", "in", "ft",
+/*30*/ "cu in", "cu ft", "mm", "cm", "m", "cu cm", "cu m",
+"liters", "fl oz", "radians", "sterad", "rev",
+"cycles", "grav", "oz", "lbs", "ft lb", "oz in", "gauss",
+"gilberts", "henry", "mhenry", "farad", "ufarad", "ohms",
+/*55*/ "", "", "", "", "", "", "", "", "", "",
+ "", "", "", "", "Gb",
+/*70*/ "bytes", "KB", "MB", "GB",
+/*74*/ "", "", "line"
+};
+
+#define NECODES 27
+struct { int code; char *str;
+} ecodes[NECODES] = {
+ { 0, "Success" },
+ { -1001, "HPI unspecified error" },
+ { -1002, "HPI unsupported function" },
+ { -1003, "HPI busy" },
+ { -1004, "HPI request invalid" },
+ { -1005, "HPI command invalid" },
+ { -1006, "HPI timeout" },
+ { -1007, "HPI out of space" },
+ { -1008, "HPI data truncated" },
+#ifdef HPI_A
+ { -1009, "HPI data length invalid" },
+#else
+ { -1009, "HPI invalid parameter" },
+#endif
+ { -1010, "HPI data exceeds limits" },
+ { -1011, "HPI invalid params" },
+ { -1012, "HPI invalid data" },
+ { -1013, "HPI not present" },
+ { -1014, "HPI invalid data field" },
+ { -1015, "HPI invalid sensor command" },
+ { -1016, "HPI no response" },
+ { -1017, "HPI duplicate request" },
+ { -1018, "HPI updating" },
+ { -1019, "HPI initializing" },
+ { -1020, "HPI unknown error" },
+ { -1021, "HPI invalid session" },
+ { -1022, "HPI invalid domain" },
+ { -1023, "HPI invalid resource id" },
+ { -1024, "HPI invalid request" },
+ { -1025, "HPI entity not present" },
+ { -1026, "HPI uninitialized" }
+};
+char def_estr[15] = "HPI error %d ";
+
+static
+char *decode_error(SaErrorT code)
+{
+ int i;
+ char *str = NULL;
+ for (i = 0; i < NECODES; i++) {
+ if (code == ecodes[i].code) { str = ecodes[i].str; break; }
+ }
+ if (str == NULL) {
+ sprintf(&def_estr[10],"%d",code);
+ str = &def_estr[0];
+ }
+ return(str);
+}
+
+static
+void ShowSensor(
+ SaHpiSessionIdT sessionid,
+ SaHpiResourceIdT resourceid,
+ SaHpiSensorRecT *sensorrec )
+{
+ SaHpiSensorNumT sensornum;
+ SaHpiSensorReadingT reading;
+ SaHpiSensorThresholdsT senstbuff;
+#ifdef HPI_A
+ SaHpiSensorReadingT conv_reading;
+#else
+ SaHpiEventStateT evtstate;
+#endif
+ SaErrorT rv;
+ char *unit;
+ int i;
+
+ sensornum = sensorrec->Num;
+#ifdef HPI_A
+ rv = saHpiSensorReadingGet(sessionid,resourceid, sensornum, &reading);
+#else
+ rv = saHpiSensorReadingGet(sessionid,resourceid, sensornum, &reading,&evtstate);
+#endif
+ /* ReadingGet returns -1024 if SDR type is mBMC */
+ if (!fdebug && rv == SA_ERR_HPI_INVALID_REQUEST) {
+ printf(" = no reading\n");
+ return;
+ } else if (rv != SA_OK) {
+ printf("ReadingGet ret=%d\n", rv);
+ return;
+ }
+
+#ifdef HPI_A
+ if ((reading.ValuesPresent & SAHPI_SRF_INTERPRETED) == 0) {
+ if ((reading.ValuesPresent & SAHPI_SRF_RAW) == 0) {
+ /* no raw or interpreted, so just show event status */
+ /* This is a Compact Sensor */
+ if (reading.ValuesPresent & SAHPI_SRF_EVENT_STATE)
+ printf(" = %x %x\n", reading.EventStatus.SensorStatus,
+ reading.EventStatus.EventStatus);
+ else printf(" = no reading\n");
+ return;
+ } else {
+ /* have raw, but not interpreted, so try convert. */
+ rv = saHpiSensorReadingConvert(sessionid, resourceid, sensornum,
+ &reading, &conv_reading);
+ if (rv != SA_OK) {
+ /* conv rv=-1012 on Compact sensors */
+ if (!fdebug && rv == SA_ERR_HPI_INVALID_DATA)
+ printf(" = %02x raw\n", reading.Raw);
+ else printf("raw=%x conv_ret=%d\n", reading.Raw, rv);
+ /* printf("conv_rv=%s\n", decode_error(rv)); */
+ return;
+ }
+ else {
+ if (fdebug) printf("conv ok: raw=%x conv=%x\n", reading.Raw,
+ conv_reading.Interpreted.Value.SensorUint32);
+ reading.Interpreted.Type = conv_reading.Interpreted.Type;
+ if (reading.Interpreted.Type == SAHPI_SENSOR_INTERPRETED_TYPE_BUFFER)
+ {
+ memcpy(reading.Interpreted.Value.SensorBuffer,
+ conv_reading.Interpreted.Value.SensorBuffer,
+ 4); /* SAHPI_SENSOR_BUFFER_LENGTH); */
+ /* IPMI 1.5 only returns 4 bytes */
+ } else
+ reading.Interpreted.Value.SensorUint32 =
+ conv_reading.Interpreted.Value.SensorUint32;
+ }
+ }
+ }
+ /* Also show units of interpreted reading */
+ i = sensorrec->DataFormat.BaseUnits;
+ if (i >= NSU) i = 0;
+ unit = units[i];
+ switch(reading.Interpreted.Type)
+ {
+ case SAHPI_SENSOR_INTERPRETED_TYPE_FLOAT32:
+ printf(" = %5.2f %s\n",
+ reading.Interpreted.Value.SensorFloat32,unit);
+ break;
+ case SAHPI_SENSOR_INTERPRETED_TYPE_UINT32:
+ printf(" = %d %s\n",
+ reading.Interpreted.Value.SensorUint32, unit);
+ break;
+ case SAHPI_SENSOR_INTERPRETED_TYPE_BUFFER:
+ printf(" = %02x %02x %02x %02x\n",
+ reading.Interpreted.Value.SensorBuffer[0],
+ reading.Interpreted.Value.SensorBuffer[1],
+ reading.Interpreted.Value.SensorBuffer[2],
+ reading.Interpreted.Value.SensorBuffer[3]);
+ break;
+ default:
+ printf(" = %x (itype=%x)\n",
+ reading.Interpreted.Value.SensorUint32,
+ reading.Interpreted.Type);
+ }
+
+ if (fshowthr) { /* Show thresholds, if any */
+#ifdef SHOWMAX
+ if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_MAX )
+ printf( " Max of Range: %5.2f\n",
+ sensorrec->DataFormat.Range.Max.Interpreted.Value.SensorFloat32);
+ if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_MIN )
+ printf( " Min of Range: %5.2f\n",
+ sensorrec->DataFormat.Range.Min.Interpreted.Value.SensorFloat32);
+#endif
+ if ((!sensorrec->Ignore) && (sensorrec->ThresholdDefn.IsThreshold)) {
+ rv = saHpiSensorThresholdsGet(sessionid, resourceid,
+ sensornum, &senstbuff);
+ if (rv != 0) { printf("ThresholdsGet ret=%d\n", rv); return; }
+ printf( "\t\t\t");
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_LOW_MINOR ) {
+ printf( "LoMin %5.2f ",
+ senstbuff.LowMinor.Interpreted.Value.SensorFloat32);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_LOW_MAJOR ) {
+ printf( "LoMaj %5.2f ",
+ senstbuff.LowMajor.Interpreted.Value.SensorFloat32);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_LOW_CRIT ) {
+ printf( "LoCri %5.2f ",
+ senstbuff.LowCritical.Interpreted.Value.SensorFloat32);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_UP_MINOR ) {
+ printf( "HiMin %5.2f ",
+ senstbuff.UpMinor.Interpreted.Value.SensorFloat32);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_UP_MAJOR ) {
+ printf( "HiMaj %5.2f ",
+ senstbuff.UpMajor.Interpreted.Value.SensorFloat32);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_UP_CRIT ) {
+ printf( "HiCri %5.2f ",
+ senstbuff.UpCritical.Interpreted.Value.SensorFloat32);
+ }
+#ifdef SHOWMAX
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_UP_HYSTERESIS ) {
+ printf( "Hi Hys %5.2f ",
+ senstbuff.PosThdHysteresis.Interpreted.Value.SensorFloat32);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_LOW_HYSTERESIS ) {
+ printf( "Lo Hys %5.2f ",
+ senstbuff.NegThdHysteresis.Interpreted.Value.SensorFloat32);
+ }
+#endif
+ printf( "\n");
+ } /* endif valid threshold */
+ } /* endif showthr */
+
+#else /* HPI_B: HPI B.01.01 logic */
+ i = sensorrec->DataFormat.BaseUnits;
+ if (i >= NSU) i = 0;
+ unit = units[i];
+ switch(reading.Type)
+ {
+ case SAHPI_SENSOR_READING_TYPE_FLOAT64:
+ printf(" = %5.2f %s\n",
+ reading.Value.SensorFloat64,unit);
+ break;
+ case SAHPI_SENSOR_READING_TYPE_UINT64:
+ printf(" = %lld %s\n",
+ reading.Value.SensorUint64, unit);
+ break;
+ case SAHPI_SENSOR_READING_TYPE_INT64:
+ printf(" = %lld %s\n",
+ reading.Value.SensorInt64, unit);
+ break;
+ case SAHPI_SENSOR_READING_TYPE_BUFFER:
+ printf(" = %02x %02x %02x %02x\n",
+ reading.Value.SensorBuffer[0],
+ reading.Value.SensorBuffer[1],
+ reading.Value.SensorBuffer[2],
+ reading.Value.SensorBuffer[3]);
+ break;
+ default:
+ printf(" = %llx (itype=%x)\n",
+ reading.Value.SensorUint64,
+ reading.Type);
+ }
+ if (fshowthr) { /* Show thresholds, if any */
+ if (sensorrec->ThresholdDefn.IsAccessible) {
+ rv = saHpiSensorThresholdsGet(sessionid, resourceid,
+ sensornum, &senstbuff);
+ if (rv != SA_OK) { printf("ThresholdsGet ret=%d\n", rv);
+ } else {
+ printf( "\t\t\t");
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_LOW_MINOR ) {
+ printf( "LoMin %5.2f ",
+ senstbuff.LowMinor.Value.SensorFloat64);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_LOW_MAJOR ) {
+ printf( "LoMaj %5.2f ",
+ senstbuff.LowMajor.Value.SensorFloat64);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_LOW_CRIT ) {
+ printf( "LoCri %5.2f ",
+ senstbuff.LowCritical.Value.SensorFloat64);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_UP_MINOR ) {
+ printf( "HiMin %5.2f ",
+ senstbuff.UpMinor.Value.SensorFloat64);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_UP_MAJOR ) {
+ printf( "HiMaj %5.2f ",
+ senstbuff.UpMajor.Value.SensorFloat64);
+ }
+ if ( sensorrec->ThresholdDefn.ReadThold & SAHPI_STM_UP_CRIT ) {
+ printf( "HiCri %5.2f ",
+ senstbuff.UpCritical.Value.SensorFloat64);
+ }
+ printf( "\n");
+ } /*endif get ok*/
+ } /* endif valid threshold */
+ } /* endif showthr */
+#endif
+ return;
+} /*end ShowSensor*/
+
+int
+main(int argc, char **argv)
+{
+ int c;
+ SaErrorT rv;
+ SaHpiSessionIdT sessionid;
+#ifdef HPI_A
+ SaHpiVersionT hpiVer;
+ SaHpiRptInfoT rptinfo;
+#endif
+ SaHpiRptEntryT rptentry;
+ SaHpiEntryIdT rptentryid;
+ SaHpiEntryIdT nextrptentryid;
+ SaHpiEntryIdT entryid;
+ SaHpiEntryIdT nextentryid;
+ SaHpiResourceIdT resourceid;
+ SaHpiRdrT rdr;
+
+ printf("%s: version %s\n",argv[0],progver);
+
+ while ( (c = getopt( argc, argv,"tx?")) != EOF )
+ switch(c) {
+ case 't': fshowthr = 1; break;
+ case 'x': fdebug = 1; break;
+ default:
+ printf("Usage %s [-t -x]\n",argv[0]);
+ printf("where -t = show Thresholds also\n");
+ printf(" -x = show eXtra debug messages\n");
+ exit(1);
+ }
+ if (fdebug) printf("fshowthr = %d, fdebug = %d\n",fshowthr,fdebug);
+#ifdef HPI_A
+ rv = saHpiInitialize(&hpiVer);
+ if (rv != SA_OK) {
+ printf("saHpiInitialize: %s\n",decode_error(rv));
+ exit(-1);
+ }
+ rv = saHpiSessionOpen(SAHPI_DEFAULT_DOMAIN_ID,&sessionid,NULL);
+ if (rv != SA_OK) {
+ if (rv == SA_ERR_HPI_ERROR)
+ printf("saHpiSessionOpen: error %d, SpiLibd not running\n",rv);
+ else
+ printf("saHpiSessionOpen: %s\n",decode_error(rv));
+ exit(-1);
+ }
+ if (fdebug) printf("Starting Discovery ...\n");
+ rv = saHpiResourcesDiscover(sessionid);
+ if (fdebug) printf("saHpiResourcesDiscover %s\n",decode_error(rv));
+ rv = saHpiRptInfoGet(sessionid,&rptinfo);
+ if (fdebug) printf("saHpiRptInfoGet %s\n",decode_error(rv));
+ printf("RptInfo: UpdateCount = %x, UpdateTime = %lx\n",
+ rptinfo.UpdateCount, (unsigned long)rptinfo.UpdateTimestamp);
+#else
+ rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID,&sessionid,NULL);
+ if (rv != SA_OK) {
+ printf("saHpiSessionOpen: %s\n",decode_error(rv));
+ exit(-1);
+ }
+ if (fdebug) printf("Starting Discovery ...\n");
+ rv = saHpiDiscover(sessionid);
+ if (fdebug) printf("saHpiDiscover %s\n",decode_error(rv));
+ if (fshowthr) {
+ /*
+ * If OpenHPI, we need to wait extra time before doing
+ * ThresholdsGet because its discovery isn't really done.
+ */
+ sleep(5);
+ }
+#endif
+
+ /* walk the RPT list */
+ rptentryid = SAHPI_FIRST_ENTRY;
+ while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY))
+ {
+ rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry);
+ if (fdebug) printf("saHpiRptEntryGet %s\n",decode_error(rv));
+ if (rv == SA_OK) {
+ /* walk the RDR list for this RPT entry */
+ entryid = SAHPI_FIRST_ENTRY;
+ resourceid = rptentry.ResourceId;
+#ifdef HPI_A
+ rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0;
+#endif
+ printf("rptentry[%d] resourceid=%d tag: %s\n",
+ rptentryid,resourceid, rptentry.ResourceTag.Data);
+ while ((rv == SA_OK) && (entryid != SAHPI_LAST_ENTRY))
+ {
+ rv = saHpiRdrGet(sessionid,resourceid,
+ entryid,&nextentryid, &rdr);
+ if (fdebug) printf("saHpiRdrGet[%d] rv = %d\n",entryid,rv);
+ if (rv == SA_OK) {
+ char *eol;
+ rdr.IdString.Data[rdr.IdString.DataLength] = 0;
+ if (rdr.RdrType == SAHPI_SENSOR_RDR) eol = " \t";
+ else eol = "\n";
+ printf("RDR[%02d]: %s %s %s",rdr.RecordId,
+ rtypes[rdr.RdrType],rdr.IdString.Data,eol);
+ if (rdr.RdrType == SAHPI_SENSOR_RDR) {
+ ShowSensor(sessionid,resourceid,
+ &rdr.RdrTypeUnion.SensorRec);
+ }
+ entryid = nextentryid;
+ }
+ }
+ rptentryid = nextrptentryid;
+ }
+ }
+
+ rv = saHpiSessionClose(sessionid);
+#ifdef HPI_A
+ rv = saHpiFinalize();
+#endif
+
+ exit(0);
+ return(0);
+}
+
+/* end hpisensor.c */