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