[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.3

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;
1.2       deraadt    88:                                if (sysctl(mib, 5, &sensor, &slen, NULL, 0)
1.1       deanna     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[] = {
1.2       deraadt   105:        NULL,
                    106:        "empty", "ready", "powerup", "online", "idle", "active",
                    107:        "rebuild", "powerdown", "fail", "pfail"
1.1       deanna    108: };
                    109:
                    110: void
                    111: showsensors(void)
                    112: {
                    113:        row = 2;
                    114:        if (sensor_cnt == 0)
                    115:                mvwaddstr(wnd, row, 0, "No sensors found.");
                    116: }
                    117:
                    118: int
                    119: initsensors(void)
                    120: {
                    121:        fetchsensors();
                    122: }
                    123:
                    124: void
                    125: printline(void)
                    126: {
                    127:        wmove(wnd, row, 0);
                    128:        wclrtoeol(wnd);
                    129:        mvwprintw(wnd, row, 0, "%s.%s%d", sensordev.xname,
                    130:            sensor_type_s[sensor.type], sensor.numt);
1.2       deraadt   131:        switch (sensor.type) {
1.1       deanna    132:        case SENSOR_TEMP:
                    133:                mvwprintw(wnd, row, 24, "%10.2f degC",
                    134:                    (sensor.value - 273150000) / 1000000.0);
                    135:                break;
                    136:        case SENSOR_FANRPM:
                    137:                mvwprintw(wnd, row, 24, "%11lld RPM", sensor.value);
                    138:                break;
                    139:        case SENSOR_VOLTS_DC:
                    140:                mvwprintw(wnd, row, 24, "%10.2f V DC",
                    141:                    sensor.value / 1000000.0);
                    142:                break;
                    143:        case SENSOR_AMPS:
                    144:                mvwprintw(wnd, row, 24, "%10.2f A", sensor.value / 1000000.0);
                    145:                break;
                    146:        case SENSOR_INDICATOR:
                    147:                mvwprintw(wnd, row, 24, "%15s", sensor.value? "On" : "Off");
                    148:                break;
                    149:        case SENSOR_INTEGER:
                    150:                mvwprintw(wnd, row, 24, "%11lld raw", sensor.value);
                    151:                break;
                    152:        case SENSOR_PERCENT:
                    153:                mvwprintw(wnd, row, 24, "%14.2f%%", sensor.value / 1000.0);
                    154:                break;
                    155:        case SENSOR_LUX:
                    156:                mvwprintw(wnd, row, 24, "%15.2f lx", sensor.value / 1000000.0);
                    157:                break;
                    158:        case SENSOR_DRIVE:
1.2       deraadt   159:                if (0 < sensor.value &&
                    160:                    sensor.value < sizeof(drvstat)/sizeof(drvstat[0])) {
1.1       deanna    161:                        mvwprintw(wnd, row, 24, "%15s", drvstat[sensor.value]);
                    162:                        break;
                    163:                }
1.3     ! deraadt   164:                break;
1.1       deanna    165:        case SENSOR_TIMEDELTA:
                    166:                mvwprintw(wnd, row, 24, "%10.6f secs",
                    167:                    sensor.value / 1000000000.0);
                    168:                break;
                    169:        case SENSOR_WATTHOUR:
                    170:                mvwprintw(wnd, row, 24, "%12.2f Wh", sensor.value / 1000000.0);
                    171:                break;
                    172:        case SENSOR_AMPHOUR:
                    173:                mvwprintw(wnd, row, 24, "%10.2f Ah", sensor.value / 1000000.0);
                    174:                break;
                    175:        default:
                    176:                mvwprintw(wnd, row, 24, "%10lld", sensor.value);
1.3     ! deraadt   177:                break;
1.1       deanna    178:        }
1.3     ! deraadt   179:        if (sensor.desc && strlen(sensor.desc) >= 1)
1.1       deanna    180:                mvwprintw(wnd, row, 58, "(%s)", sensor.desc);
1.2       deraadt   181:
1.1       deanna    182:        switch (sensor.status) {
                    183:        case SENSOR_S_UNKNOWN:
1.3     ! deraadt   184:                mvwaddstr(wnd, row, 45, "unknown");
1.1       deanna    185:                break;
                    186:        case SENSOR_S_WARN:
1.3     ! deraadt   187:                mvwaddstr(wnd, row, 45, "WARNING");
1.1       deanna    188:                break;
                    189:        case SENSOR_S_CRIT:
1.3     ! deraadt   190:                mvwaddstr(wnd, row, 45, "CRITICAL");
1.1       deanna    191:                break;
1.3     ! deraadt   192:        case SENSOR_S_OK:
        !           193:                mvwaddstr(wnd, row, 45, "OK");
1.1       deanna    194:                break;
                    195:        }
1.3     ! deraadt   196:        row++;
1.1       deanna    197: }