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