Annotation of src/usr.bin/systat/sensors.c, Revision 1.4
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>
28:
29: #include "systat.h"
30: #include "extern.h"
31:
32: struct sensor sensor;
33: struct sensordev sensordev;
34: int row, sensor_cnt;
35: void printline(void);
36:
37: WINDOW *
38: opensensors(void)
39: {
40: return (subwin(stdscr, LINES-5-1, 0, 5, 0));
41: }
42:
43: void
44: closesensors(WINDOW *w)
45: {
46: if (w == NULL)
47: return;
48: wclear(w);
49: wrefresh(w);
50: delwin(w);
51: }
52:
53: void
54: labelsensors(void)
55: {
56: wmove(wnd, 0, 0);
57: wclrtobot(wnd);
58: mvwaddstr(wnd, 1, 0, "Device");
59: mvwaddstr(wnd, 1, 34, "Value");
60: mvwaddstr(wnd, 1, 45, "Status");
61: mvwaddstr(wnd, 1, 58, "Description");
62: }
63:
64: void
65: fetchsensors(void)
66: {
67: enum sensor_type type;
68: size_t slen, sdlen;
69: int mib[5], dev, numt;
70:
71: mib[0] = CTL_HW;
72: mib[1] = HW_SENSORS;
73: slen = sizeof(struct sensor);
74: sdlen = sizeof(struct sensordev);
75:
76: row = 2;
77: sensor_cnt = 0;
78: for (dev = 0; dev < MAXSENSORDEVICES; dev++) {
79: mib[2] = dev;
80: if (sysctl(mib, 3, &sensordev, &sdlen, NULL, 0) == -1) {
81: if (errno != ENOENT)
82: warn("sysctl");
83: continue;
84: }
85: for (type = 0; type < SENSOR_MAX_TYPES; type++) {
86: mib[3] = type;
87: for (numt = 0; numt < sensordev.maxnumt[type]; numt++) {
88: mib[4] = numt;
1.2 deraadt 89: if (sysctl(mib, 5, &sensor, &slen, NULL, 0)
1.1 deanna 90: == -1) {
91: if (errno != ENOENT)
92: warn("sysctl");
93: continue;
94: }
95: if (sensor.flags & SENSOR_FINVALID)
96: continue;
97: sensor_cnt++;
98: if (sensor_cnt > 0)
99: printline();
100: }
101: }
102: }
103: }
104:
105: const char *drvstat[] = {
1.2 deraadt 106: NULL,
107: "empty", "ready", "powerup", "online", "idle", "active",
108: "rebuild", "powerdown", "fail", "pfail"
1.1 deanna 109: };
110:
111: void
112: showsensors(void)
113: {
114: row = 2;
115: if (sensor_cnt == 0)
116: mvwaddstr(wnd, row, 0, "No sensors found.");
117: }
118:
119: int
120: initsensors(void)
121: {
122: fetchsensors();
123: }
124:
125: void
126: printline(void)
127: {
128: wmove(wnd, row, 0);
129: wclrtoeol(wnd);
130: mvwprintw(wnd, row, 0, "%s.%s%d", sensordev.xname,
131: sensor_type_s[sensor.type], sensor.numt);
1.2 deraadt 132: switch (sensor.type) {
1.1 deanna 133: case SENSOR_TEMP:
134: mvwprintw(wnd, row, 24, "%10.2f degC",
135: (sensor.value - 273150000) / 1000000.0);
136: break;
137: case SENSOR_FANRPM:
138: mvwprintw(wnd, row, 24, "%11lld RPM", sensor.value);
139: break;
140: case SENSOR_VOLTS_DC:
141: mvwprintw(wnd, row, 24, "%10.2f V DC",
142: sensor.value / 1000000.0);
143: break;
144: case SENSOR_AMPS:
145: mvwprintw(wnd, row, 24, "%10.2f A", sensor.value / 1000000.0);
146: break;
147: case SENSOR_INDICATOR:
148: mvwprintw(wnd, row, 24, "%15s", sensor.value? "On" : "Off");
149: break;
150: case SENSOR_INTEGER:
151: mvwprintw(wnd, row, 24, "%11lld raw", sensor.value);
152: break;
153: case SENSOR_PERCENT:
154: mvwprintw(wnd, row, 24, "%14.2f%%", sensor.value / 1000.0);
155: break;
156: case SENSOR_LUX:
157: mvwprintw(wnd, row, 24, "%15.2f lx", sensor.value / 1000000.0);
158: break;
159: case SENSOR_DRIVE:
1.2 deraadt 160: if (0 < sensor.value &&
161: sensor.value < sizeof(drvstat)/sizeof(drvstat[0])) {
1.1 deanna 162: mvwprintw(wnd, row, 24, "%15s", drvstat[sensor.value]);
163: break;
164: }
1.3 deraadt 165: break;
1.1 deanna 166: case SENSOR_TIMEDELTA:
167: mvwprintw(wnd, row, 24, "%10.6f secs",
168: sensor.value / 1000000000.0);
169: break;
170: case SENSOR_WATTHOUR:
171: mvwprintw(wnd, row, 24, "%12.2f Wh", sensor.value / 1000000.0);
172: break;
173: case SENSOR_AMPHOUR:
174: mvwprintw(wnd, row, 24, "%10.2f Ah", sensor.value / 1000000.0);
175: break;
176: default:
177: mvwprintw(wnd, row, 24, "%10lld", sensor.value);
1.3 deraadt 178: break;
1.1 deanna 179: }
1.3 deraadt 180: if (sensor.desc && strlen(sensor.desc) >= 1)
1.1 deanna 181: mvwprintw(wnd, row, 58, "(%s)", sensor.desc);
1.2 deraadt 182:
1.1 deanna 183: switch (sensor.status) {
184: case SENSOR_S_UNKNOWN:
1.3 deraadt 185: mvwaddstr(wnd, row, 45, "unknown");
1.1 deanna 186: break;
187: case SENSOR_S_WARN:
1.3 deraadt 188: mvwaddstr(wnd, row, 45, "WARNING");
1.1 deanna 189: break;
190: case SENSOR_S_CRIT:
1.3 deraadt 191: mvwaddstr(wnd, row, 45, "CRITICAL");
1.1 deanna 192: break;
1.3 deraadt 193: case SENSOR_S_OK:
194: mvwaddstr(wnd, row, 45, "OK");
1.1 deanna 195: break;
196: }
1.3 deraadt 197: row++;
1.1 deanna 198: }