[BACK]Return to sensors.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / systat

Annotation of src/usr.bin/systat/sensors.c, Revision 1.8

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