[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.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: }