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