Annotation of src/usr.bin/systat/sensors.c, Revision 1.1
1.1 ! deanna 1: /*
! 2: * Copyright (c) 2007 Deanna Phillips <deanna@openbsd.org>
! 3: * Copyright (c) 2003 Henning Brauer <henning@openbsd.org>
! 4: *
! 5: * Permission to use, copy, modify, and distribute this software for any
! 6: * purpose with or without fee is hereby granted, provided that the above
! 7: * copyright notice and this permission notice appear in all copies.
! 8: *
! 9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
! 15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 16: *
! 17: */
! 18:
! 19: #include <sys/param.h>
! 20: #include <sys/sysctl.h>
! 21: #include <sys/sensors.h>
! 22:
! 23: #include <err.h>
! 24: #include <errno.h>
! 25: #include <stdio.h>
! 26: #include <stdlib.h>
! 27:
! 28: #include "systat.h"
! 29: #include "extern.h"
! 30:
! 31: struct sensor sensor;
! 32: struct sensordev sensordev;
! 33: int row, sensor_cnt;
! 34: void printline(void);
! 35:
! 36: WINDOW *
! 37: opensensors(void)
! 38: {
! 39: return (subwin(stdscr, LINES-5-1, 0, 5, 0));
! 40: }
! 41:
! 42: void
! 43: closesensors(WINDOW *w)
! 44: {
! 45: if (w == NULL)
! 46: return;
! 47: wclear(w);
! 48: wrefresh(w);
! 49: delwin(w);
! 50: }
! 51:
! 52: void
! 53: labelsensors(void)
! 54: {
! 55: wmove(wnd, 0, 0);
! 56: wclrtobot(wnd);
! 57: mvwaddstr(wnd, 1, 0, "Device");
! 58: mvwaddstr(wnd, 1, 34, "Value");
! 59: mvwaddstr(wnd, 1, 45, "Status");
! 60: mvwaddstr(wnd, 1, 58, "Description");
! 61: }
! 62:
! 63: void
! 64: fetchsensors(void)
! 65: {
! 66: enum sensor_type type;
! 67: size_t slen, sdlen;
! 68: int mib[5], dev, numt;
! 69:
! 70: mib[0] = CTL_HW;
! 71: mib[1] = HW_SENSORS;
! 72: slen = sizeof(struct sensor);
! 73: sdlen = sizeof(struct sensordev);
! 74:
! 75: row = 2;
! 76: sensor_cnt = 0;
! 77: for (dev = 0; dev < MAXSENSORDEVICES; dev++) {
! 78: mib[2] = dev;
! 79: if (sysctl(mib, 3, &sensordev, &sdlen, NULL, 0) == -1) {
! 80: if (errno != ENOENT)
! 81: warn("sysctl");
! 82: continue;
! 83: }
! 84: for (type = 0; type < SENSOR_MAX_TYPES; type++) {
! 85: mib[3] = type;
! 86: for (numt = 0; numt < sensordev.maxnumt[type]; numt++) {
! 87: mib[4] = numt;
! 88: if (sysctl(mib, 5, &sensor, &slen, NULL, 0)
! 89: == -1) {
! 90: if (errno != ENOENT)
! 91: warn("sysctl");
! 92: continue;
! 93: }
! 94: if (sensor.flags & SENSOR_FINVALID)
! 95: continue;
! 96: sensor_cnt++;
! 97: if (sensor_cnt > 0)
! 98: printline();
! 99: }
! 100: }
! 101: }
! 102: }
! 103:
! 104: const char *drvstat[] = {
! 105: NULL, "empty", "ready", "powerup", "online", "idle", "active",
! 106: "rebuild", "powerdown", "fail", "pfail"
! 107: };
! 108:
! 109: void
! 110: showsensors(void)
! 111: {
! 112: row = 2;
! 113: if (sensor_cnt == 0)
! 114: mvwaddstr(wnd, row, 0, "No sensors found.");
! 115: }
! 116:
! 117: int
! 118: initsensors(void)
! 119: {
! 120: fetchsensors();
! 121: }
! 122:
! 123: void
! 124: printline(void)
! 125: {
! 126: wmove(wnd, row, 0);
! 127: wclrtoeol(wnd);
! 128: mvwprintw(wnd, row, 0, "%s.%s%d", sensordev.xname,
! 129: sensor_type_s[sensor.type], sensor.numt);
! 130: switch(sensor.type) {
! 131: case SENSOR_TEMP:
! 132: mvwprintw(wnd, row, 24, "%10.2f degC",
! 133: (sensor.value - 273150000) / 1000000.0);
! 134: break;
! 135: case SENSOR_FANRPM:
! 136: mvwprintw(wnd, row, 24, "%11lld RPM", sensor.value);
! 137: break;
! 138: case SENSOR_VOLTS_DC:
! 139: mvwprintw(wnd, row, 24, "%10.2f V DC",
! 140: sensor.value / 1000000.0);
! 141: break;
! 142: case SENSOR_AMPS:
! 143: mvwprintw(wnd, row, 24, "%10.2f A", sensor.value / 1000000.0);
! 144: break;
! 145: case SENSOR_INDICATOR:
! 146: mvwprintw(wnd, row, 24, "%15s", sensor.value? "On" : "Off");
! 147: break;
! 148: case SENSOR_INTEGER:
! 149: mvwprintw(wnd, row, 24, "%11lld raw", sensor.value);
! 150: break;
! 151: case SENSOR_PERCENT:
! 152: mvwprintw(wnd, row, 24, "%14.2f%%", sensor.value / 1000.0);
! 153: break;
! 154: case SENSOR_LUX:
! 155: mvwprintw(wnd, row, 24, "%15.2f lx", sensor.value / 1000000.0);
! 156: break;
! 157: case SENSOR_DRIVE:
! 158: if (0 < sensor.value && sensor.value <
! 159: sizeof(drvstat)/sizeof(drvstat[0])) {
! 160: mvwprintw(wnd, row, 24, "%15s", drvstat[sensor.value]);
! 161: break;
! 162: }
! 163: case SENSOR_TIMEDELTA:
! 164: mvwprintw(wnd, row, 24, "%10.6f secs",
! 165: sensor.value / 1000000000.0);
! 166: break;
! 167: case SENSOR_WATTHOUR:
! 168: mvwprintw(wnd, row, 24, "%12.2f Wh", sensor.value / 1000000.0);
! 169: break;
! 170: case SENSOR_AMPHOUR:
! 171: mvwprintw(wnd, row, 24, "%10.2f Ah", sensor.value / 1000000.0);
! 172: break;
! 173: /* FALLTHROUGH */
! 174: default:
! 175: mvwprintw(wnd, row, 24, "%10lld", sensor.value);
! 176: }
! 177: if ((sensor.desc != NULL) && strlen(sensor.desc) < 1)
! 178: mvwprintw(wnd, row, 58, "(%s%d)",
! 179: sensor_type_s[sensor.type], sensor.numt);
! 180: else
! 181: mvwprintw(wnd, row, 58, "(%s)", sensor.desc);
! 182: switch (sensor.status) {
! 183: case SENSOR_S_UNKNOWN:
! 184: mvwaddstr(wnd, row++, 45, "unknown");
! 185: break;
! 186: case SENSOR_S_WARN:
! 187: mvwaddstr(wnd, row++, 45, "WARNING");
! 188: break;
! 189: case SENSOR_S_CRIT:
! 190: mvwaddstr(wnd, row++, 45, "CRITICAL");
! 191: break;
! 192: /* FALLTHROUGH */
! 193: default:
! 194: mvwaddstr(wnd, row++, 45, "OK");
! 195: break;
! 196: }
! 197:
! 198: }