root/lm-sensors/trunk/prog/sensors/chips.c @ 909

Revision 909, 76.6 KB (checked in by mds, 13 years ago)

(mds) MTP008 driver patch from Kris Van Hees.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/*
2    chips.c - Part of sensors, a user-space program for hardware monitoring
3    Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl>
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18*/
19
20#include <stdio.h>
21#include <stdlib.h>
22
23#include "chips.h"
24#include "lib/sensors.h"
25#include "lib/chips.h"
26#include "kernel/include/sensors.h"
27
28static char *spacestr(int n);
29static void print_label(const char *label, int space);
30static void free_the_label(char **label);
31
32char *spacestr(int n)
33{
34  static char buf[80];
35  int i;
36  for (i = 0; i < n; i++)
37    buf[i]=' ';
38  buf[n] = '\0';
39  return buf;
40}
41
42void print_label(const char *label, int space)
43{
44  int len=strlen(label)+1;
45  if (len > space)
46    printf("%s:\n%s",label,spacestr(space));
47  else
48    printf("%s:%s",label,spacestr(space - len));
49}
50
51void free_the_label(char **label)
52{
53  if (*label)
54    free(*label);
55  *label = NULL;
56}
57
58int sensors_get_label_and_valid(sensors_chip_name name, int feature, char **label,
59                        int *valid)
60{
61  int err;
62  err = sensors_get_label(name,feature,label);
63  if (!err)
64    err = sensors_get_ignored(name,feature);
65  if (err >= 0) {
66    *valid = err;
67    err = 0;
68  }
69  return err;
70}
71
72void print_lm75(const sensors_chip_name *name)
73{
74  char *label;
75  double cur,hyst,over;
76  int valid;
77
78  if (!sensors_get_label_and_valid(*name,SENSORS_LM75_TEMP,&label,&valid) &&
79      !sensors_get_feature(*name,SENSORS_LM75_TEMP,&cur) &&
80      !sensors_get_feature(*name,SENSORS_LM75_TEMP_HYST,&hyst) &&
81      !sensors_get_feature(*name,SENSORS_LM75_TEMP_OVER,&over))  {
82    if (valid) {
83      print_label(label,10);
84      printf("%6.1f C (limit: %6.1f C, hysteresis: %6.1f C)\n",
85             cur,over,hyst);
86    }
87  } else
88    printf("ERROR: Can't get temperature data!\n");
89  free_the_label(&label);
90}
91
92void print_adm1021(const sensors_chip_name *name)
93{
94  char *label;
95  double cur,hyst,over;
96  int alarms,i,valid;
97
98  if (!sensors_get_feature(*name,SENSORS_LM78_ALARMS,&cur)) 
99    alarms = cur + 0.5;
100  else {
101    printf("ERROR: Can't get alarm data!\n");
102    alarms = 0;
103  }
104
105  if (!sensors_get_label_and_valid(*name,SENSORS_ADM1021_TEMP,&label,&valid) &&
106      !sensors_get_feature(*name,SENSORS_ADM1021_TEMP,&cur) &&
107      !sensors_get_feature(*name,SENSORS_ADM1021_TEMP_HYST,&hyst) &&
108      !sensors_get_feature(*name,SENSORS_ADM1021_TEMP_OVER,&over))  {
109    if (valid) {
110      print_label(label,10);
111      printf("%4.0f C (limit: %4.0f C, hysteresis: %4.0f C)    ",
112             cur,over,hyst);
113      if (alarms & (ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW)) {
114        printf("ALARM (");
115        i = 0;
116        if (alarms & ADM1021_ALARM_TEMP_LOW) {
117          printf("LOW");
118          i++;
119        }
120        if (alarms & ADM1021_ALARM_TEMP_HIGH)
121          printf("%sHIGH",i?",":"");
122        printf(")");
123      }
124      printf("\n");
125    }
126  } else
127    printf("ERROR: Can't get temperature data!\n");
128  free_the_label(&label);
129
130  if (!sensors_get_label_and_valid(*name,SENSORS_ADM1021_REMOTE_TEMP,
131                                   &label,&valid) &&
132      !sensors_get_feature(*name,SENSORS_ADM1021_REMOTE_TEMP,&cur) &&
133      !sensors_get_feature(*name,SENSORS_ADM1021_REMOTE_TEMP_HYST,&hyst) &&
134      !sensors_get_feature(*name,SENSORS_ADM1021_REMOTE_TEMP_OVER,&over))  {
135    if (valid) {
136      print_label(label,10);
137      printf("%4.0f C (limit: %4.0f C, hysteresis: %4.0f C)    ",
138             cur,over,hyst);
139      if (alarms & (ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW |
140                    ADM1021_ALARM_RTEMP_NA)) {
141        printf("ALARM (");
142        i = 0;
143          if (alarms & ADM1021_ALARM_RTEMP_NA) {
144          printf("N/A");
145          i++;
146        }
147        if (alarms & ADM1021_ALARM_RTEMP_LOW) {
148          printf("%sLOW",i?",":"");
149          i++;
150        }
151        if (alarms & ADM1021_ALARM_RTEMP_HIGH)
152          printf("%sHIGH",i?",":"");
153        printf(")\n");
154      }
155    }
156  } else
157    printf("ERROR: Can't get temperature data!\n");
158  free_the_label(&label);
159
160  if (!strcmp(name->prefix,"adm1021")) {
161    if (!sensors_get_label_and_valid(*name,SENSORS_ADM1021_DIE_CODE,
162                                     &label,&valid) &&
163        !sensors_get_feature(*name,SENSORS_ADM1021_DIE_CODE,&cur)) {
164      if (valid) {
165        print_label(label,10);
166        printf("%4.0f\n",cur);
167      }
168    } else
169      printf("ERROR: Can't get die-code data!\n");
170    free_the_label(&label);
171  }
172}
173
174void print_adm9240(const sensors_chip_name *name)
175{
176  char *label = NULL;
177  double cur,min,max,fdiv;
178  int alarms;
179  int valid;
180
181  if (!sensors_get_feature(*name,SENSORS_ADM9240_ALARMS,&cur)) 
182    alarms = cur + 0.5;
183  else {
184    printf("ERROR: Can't get alarm data!\n");
185    alarms = 0;
186  }
187
188  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN0,&label,&valid) &&
189      !sensors_get_feature(*name,SENSORS_ADM9240_IN0,&cur) &&
190      !sensors_get_feature(*name,SENSORS_ADM9240_IN0_MIN,&min) &&
191      !sensors_get_feature(*name,SENSORS_ADM9240_IN0_MAX,&max)) {
192    if (valid) {
193      print_label(label,10);
194      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
195             cur,min,max,alarms&ADM9240_ALARM_IN0?"ALARM":"");
196    }
197  } else
198    printf("ERROR: Can't get IN0 data!\n");
199  free_the_label(&label);
200  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN1,&label,&valid) &&
201      !sensors_get_feature(*name,SENSORS_ADM9240_IN1,&cur) &&
202      !sensors_get_feature(*name,SENSORS_ADM9240_IN1_MIN,&min) &&
203      !sensors_get_feature(*name,SENSORS_ADM9240_IN1_MAX,&max)) {
204    if (valid) {
205      print_label(label,10);
206      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
207             cur,min,max,alarms&ADM9240_ALARM_IN1?"ALARM":"");
208    }
209  } else
210    printf("ERROR: Can't get IN1 data!\n");
211  free_the_label(&label);
212  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN2,&label,&valid) &&
213      !sensors_get_feature(*name,SENSORS_ADM9240_IN2,&cur) &&
214      !sensors_get_feature(*name,SENSORS_ADM9240_IN2_MIN,&min) &&
215      !sensors_get_feature(*name,SENSORS_ADM9240_IN2_MAX,&max)) {
216    if (valid) {
217      print_label(label,10);
218      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
219             cur,min,max,alarms&ADM9240_ALARM_IN2?"ALARM":"");
220    }
221  } else
222    printf("ERROR: Can't get IN2 data!\n");
223  free_the_label(&label);
224  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN3,&label,&valid) &&
225      !sensors_get_feature(*name,SENSORS_ADM9240_IN3,&cur) &&
226      !sensors_get_feature(*name,SENSORS_ADM9240_IN3_MIN,&min) &&
227      !sensors_get_feature(*name,SENSORS_ADM9240_IN3_MAX,&max)) {
228    if (valid) {
229      print_label(label,10);
230      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
231             cur,min,max,alarms&ADM9240_ALARM_IN3?"ALARM":"");
232    }
233  } else
234    printf("ERROR: Can't get IN3 data!\n");
235  free_the_label(&label);
236  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN4,&label,&valid) &&
237      !sensors_get_feature(*name,SENSORS_ADM9240_IN4,&cur) &&
238      !sensors_get_feature(*name,SENSORS_ADM9240_IN4_MIN,&min) &&
239      !sensors_get_feature(*name,SENSORS_ADM9240_IN4_MAX,&max)) {
240    if (valid) {
241      print_label(label,10);
242      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
243             cur,min,max,alarms&ADM9240_ALARM_IN4?"ALARM":"");
244    }
245  } else
246    printf("ERROR: Can't get IN4 data!\n");
247  free_the_label(&label);
248  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN5,&label,&valid) &&
249      !sensors_get_feature(*name,SENSORS_ADM9240_IN5,&cur) &&
250      !sensors_get_feature(*name,SENSORS_ADM9240_IN5_MIN,&min) &&
251      !sensors_get_feature(*name,SENSORS_ADM9240_IN5_MAX,&max)) {
252    if (valid) {
253      print_label(label,10);
254      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
255             cur,min,max,alarms&ADM9240_ALARM_IN5?"ALARM":"");
256    }
257  } else
258    printf("ERROR: Can't get IN5 data!\n");
259  free_the_label(&label);
260
261  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_FAN1,&label,&valid) &&
262      !sensors_get_feature(*name,SENSORS_ADM9240_FAN1,&cur) &&
263      !sensors_get_feature(*name,SENSORS_ADM9240_FAN1_DIV,&fdiv) &&
264      !sensors_get_feature(*name,SENSORS_ADM9240_FAN1_MIN,&min)) {
265    if (valid) {
266      print_label(label,10);
267      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
268             cur,min,fdiv, alarms&ADM9240_ALARM_FAN1?"ALARM":"");
269    }
270  } else
271    printf("ERROR: Can't get FAN1 data!\n");
272  free_the_label(&label);
273  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_FAN2,&label,&valid) &&
274      !sensors_get_feature(*name,SENSORS_ADM9240_FAN2,&cur) &&
275      !sensors_get_feature(*name,SENSORS_ADM9240_FAN2_DIV,&fdiv) &&
276      !sensors_get_feature(*name,SENSORS_ADM9240_FAN2_MIN,&min)) {
277    if (valid) {
278      print_label(label,10);
279      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
280             cur,min,fdiv, alarms&ADM9240_ALARM_FAN2?"ALARM":"");
281    }
282  } else
283    printf("ERROR: Can't get FAN2 data!\n");
284  free_the_label(&label);
285
286  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_TEMP,&label,&valid) &&
287      !sensors_get_feature(*name,SENSORS_ADM9240_TEMP,&cur) &&
288      !sensors_get_feature(*name,SENSORS_ADM9240_TEMP_HYST,&min) &&
289      !sensors_get_feature(*name,SENSORS_ADM9240_TEMP_OVER,&max)) {
290    if (valid) {
291      print_label(label,10);
292      printf("%+3.0f C     (limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
293             cur,max,min, alarms&ADM9240_ALARM_TEMP?"ALARM":"");
294    }
295  } else
296    printf("ERROR: Can't get TEMP data!\n");
297  free_the_label(&label);
298
299  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_VID,&label,&valid) &&
300      !sensors_get_feature(*name,SENSORS_ADM9240_VID,&cur)) {
301    if (valid) {
302      print_label(label,10);
303      printf("%+5.2f V\n",cur);
304    }
305  }
306  free_the_label(&label);
307   
308  if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_ALARMS,&label,&valid)) {
309    if (valid) {
310      print_label(label,10);
311      printf("Chassis intrusion detection                  %s\n",
312             alarms & ADM9240_ALARM_CHAS?"ALARM":"     ");
313    }
314  }
315  free_the_label(&label);
316}
317
318void print_sis5595(const sensors_chip_name *name)
319{
320  char *label = NULL;
321  double cur,min,max,fdiv;
322  int alarms,valid;
323
324  if (!sensors_get_feature(*name,SENSORS_SIS5595_ALARMS,&cur)) 
325    alarms = cur + 0.5;
326  else {
327    printf("ERROR: Can't get alarm data!\n");
328    alarms = 0;
329  }
330
331  if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_IN0,&label,&valid) &&
332      !sensors_get_feature(*name,SENSORS_SIS5595_IN0,&cur) &&
333      !sensors_get_feature(*name,SENSORS_SIS5595_IN0_MIN,&min) &&
334      !sensors_get_feature(*name,SENSORS_SIS5595_IN0_MAX,&max)) {
335    if (valid) {
336      print_label(label,10);
337      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
338             cur,min,max,alarms&SIS5595_ALARM_IN0?"ALARM":"");
339    }
340  } else
341    printf("ERROR: Can't get IN0 data!\n");
342  free_the_label(&label);
343  if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_IN1,&label,&valid) &&
344      !sensors_get_feature(*name,SENSORS_SIS5595_IN1,&cur) &&
345      !sensors_get_feature(*name,SENSORS_SIS5595_IN1_MIN,&min) &&
346      !sensors_get_feature(*name,SENSORS_SIS5595_IN1_MAX,&max)) {
347    if (valid) {
348      print_label(label,10);
349      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
350             cur,min,max,alarms&SIS5595_ALARM_IN1?"ALARM":"");
351    }
352  } else
353    printf("ERROR: Can't get IN1 data!\n");
354  free_the_label(&label);
355  if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_IN2,&label,&valid) &&
356      !sensors_get_feature(*name,SENSORS_SIS5595_IN2,&cur) &&
357      !sensors_get_feature(*name,SENSORS_SIS5595_IN2_MIN,&min) &&
358      !sensors_get_feature(*name,SENSORS_SIS5595_IN2_MAX,&max)) {
359    if (valid) {
360      print_label(label,10);
361      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
362             cur,min,max,alarms&SIS5595_ALARM_IN2?"ALARM":"");
363    }
364  } else
365    printf("ERROR: Can't get IN2 data!\n");
366  free_the_label(&label);
367  if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_IN3,&label,&valid) &&
368      !sensors_get_feature(*name,SENSORS_SIS5595_IN3,&cur) &&
369      !sensors_get_feature(*name,SENSORS_SIS5595_IN3_MIN,&min) &&
370      !sensors_get_feature(*name,SENSORS_SIS5595_IN3_MAX,&max)) {
371    if (valid) {
372      print_label(label,10);
373      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
374             cur,min,max,alarms&SIS5595_ALARM_IN3?"ALARM":"");
375    }
376  } else
377    printf("ERROR: Can't get IN3 data!\n");
378  free_the_label(&label);
379
380  if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_FAN1,&label,&valid) &&
381      !sensors_get_feature(*name,SENSORS_SIS5595_FAN1,&cur) &&
382      !sensors_get_feature(*name,SENSORS_SIS5595_FAN1_DIV,&fdiv) &&
383      !sensors_get_feature(*name,SENSORS_SIS5595_FAN1_MIN,&min)) {
384    if (valid) {
385      print_label(label,10);
386      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
387             cur,min,fdiv, alarms&SIS5595_ALARM_FAN1?"ALARM":"");
388    }
389  } else
390    printf("ERROR: Can't get FAN1 data!\n");
391  free_the_label(&label);
392  if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_FAN2,&label,&valid) &&
393      !sensors_get_feature(*name,SENSORS_SIS5595_FAN2,&cur) &&
394      !sensors_get_feature(*name,SENSORS_SIS5595_FAN2_DIV,&fdiv) &&
395      !sensors_get_feature(*name,SENSORS_SIS5595_FAN2_MIN,&min)) {
396    if (valid) {
397    print_label(label,10);
398    printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
399           cur,min,fdiv, alarms&SIS5595_ALARM_FAN2?"ALARM":"");
400    }
401  } else
402    printf("ERROR: Can't get FAN2 data!\n");
403  free_the_label(&label);
404
405  if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_TEMP,&label,&valid) &&
406      !sensors_get_feature(*name,SENSORS_SIS5595_TEMP,&cur) &&
407      !sensors_get_feature(*name,SENSORS_SIS5595_TEMP_HYST,&min) &&
408      !sensors_get_feature(*name,SENSORS_SIS5595_TEMP_OVER,&max)) {
409    if (valid) {
410      print_label(label,10);
411      printf("%+3.0f C     (limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
412             cur,max,min, alarms&SIS5595_ALARM_TEMP?"ALARM":"");
413    }
414  } else
415    printf("ERROR: Can't get TEMP data!\n");
416  free_the_label(&label);
417
418  if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_ALARMS,&label,&valid)
419      && valid) {
420    print_label(label,10);
421    printf("Board temperature input (usually LM75 chips) %s\n",
422           alarms & SIS5595_ALARM_BTI ?"ALARM":"     ");
423  }
424  free_the_label(&label);
425
426}
427
428void print_via686a(const sensors_chip_name *name)
429{
430  char *label = NULL;
431  double cur,min,max,fdiv;
432  int alarms,valid;
433
434  if (!sensors_get_feature(*name,SENSORS_VIA686A_ALARMS,&cur)) 
435    alarms = cur + 0.5;
436  else {
437    printf("ERROR: Can't get alarm data!\n");
438    alarms = 0;
439  }
440
441  if (!sensors_get_label_and_valid(*name,SENSORS_VIA686A_IN0,&label,&valid) &&
442      !sensors_get_feature(*name,SENSORS_VIA686A_IN0,&cur) &&
443      !sensors_get_feature(*name,SENSORS_VIA686A_IN0_MIN,&min) &&
444      !sensors_get_feature(*name,SENSORS_VIA686A_IN0_MAX,&max)) {
445    if (valid) {
446      print_label(label,10);
447      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
448             cur,min,max,alarms&VIA686A_ALARM_IN0?"ALARM":"");
449    }
450  } else
451    printf("ERROR: Can't get IN0 data!\n");
452  free_the_label(&label);
453  if (!sensors_get_label_and_valid(*name,SENSORS_VIA686A_IN1,&label,&valid) &&
454      !sensors_get_feature(*name,SENSORS_VIA686A_IN1,&cur) &&
455      !sensors_get_feature(*name,SENSORS_VIA686A_IN1_MIN,&min) &&
456      !sensors_get_feature(*name,SENSORS_VIA686A_IN1_MAX,&max)) {
457    if (valid) {
458      print_label(label,10);
459      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
460             cur,min,max,alarms&VIA686A_ALARM_IN1?"ALARM":"");
461    }
462  } else
463    printf("ERROR: Can't get IN1 data!\n");
464  free_the_label(&label);
465  if (!sensors_get_label_and_valid(*name,SENSORS_VIA686A_IN2,&label,&valid) &&
466      !sensors_get_feature(*name,SENSORS_VIA686A_IN2,&cur) &&
467      !sensors_get_feature(*name,SENSORS_VIA686A_IN2_MIN,&min) &&
468      !sensors_get_feature(*name,SENSORS_VIA686A_IN2_MAX,&max)) {
469    if (valid) {
470      print_label(label,10);
471      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
472             cur,min,max,alarms&VIA686A_ALARM_IN2?"ALARM":"");
473    }
474  } else
475    printf("ERROR: Can't get IN2 data!\n");
476  free_the_label(&label);
477  if (!sensors_get_label_and_valid(*name,SENSORS_VIA686A_IN3,&label,&valid) &&
478      !sensors_get_feature(*name,SENSORS_VIA686A_IN3,&cur) &&
479      !sensors_get_feature(*name,SENSORS_VIA686A_IN3_MIN,&min) &&
480      !sensors_get_feature(*name,SENSORS_VIA686A_IN3_MAX,&max)) {
481    if (valid) {
482      print_label(label,10);
483      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
484             cur,min,max,alarms&VIA686A_ALARM_IN3?"ALARM":"");
485    }
486  } else
487    printf("ERROR: Can't get IN3 data!\n");
488  free_the_label(&label);
489  if (!sensors_get_label_and_valid(*name,SENSORS_VIA686A_IN4,&label,&valid) &&
490      !sensors_get_feature(*name,SENSORS_VIA686A_IN4,&cur) &&
491      !sensors_get_feature(*name,SENSORS_VIA686A_IN4_MIN,&min) &&
492      !sensors_get_feature(*name,SENSORS_VIA686A_IN4_MAX,&max)) {
493    if (valid) {
494      print_label(label,10);
495      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
496             cur,min,max,alarms&VIA686A_ALARM_IN4?"ALARM":"");
497    }
498  } else
499    printf("ERROR: Can't get IN4 data!\n");
500  free_the_label(&label);
501
502  if (!sensors_get_label_and_valid(*name,SENSORS_VIA686A_FAN1,&label,&valid) &&
503      !sensors_get_feature(*name,SENSORS_VIA686A_FAN1,&cur) &&
504      !sensors_get_feature(*name,SENSORS_VIA686A_FAN1_DIV,&fdiv) &&
505      !sensors_get_feature(*name,SENSORS_VIA686A_FAN1_MIN,&min)) {
506    if (valid) {
507      print_label(label,10);
508      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
509             cur,min,fdiv, alarms&VIA686A_ALARM_FAN1?"ALARM":"");
510    }
511  } else
512    printf("ERROR: Can't get FAN1 data!\n");
513  free_the_label(&label);
514  if (!sensors_get_label_and_valid(*name,SENSORS_VIA686A_FAN2,&label,&valid) &&
515      !sensors_get_feature(*name,SENSORS_VIA686A_FAN2,&cur) &&
516      !sensors_get_feature(*name,SENSORS_VIA686A_FAN2_DIV,&fdiv) &&
517      !sensors_get_feature(*name,SENSORS_VIA686A_FAN2_MIN,&min)) {
518    if (valid) {
519    print_label(label,10);
520    printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
521           cur,min,fdiv, alarms&VIA686A_ALARM_FAN2?"ALARM":"");
522    }
523  } else
524    printf("ERROR: Can't get FAN2 data!\n");
525  free_the_label(&label);
526
527  if (!sensors_get_label_and_valid(*name,SENSORS_VIA686A_TEMP,&label,&valid) &&
528      !sensors_get_feature(*name,SENSORS_VIA686A_TEMP,&cur) &&
529      !sensors_get_feature(*name,SENSORS_VIA686A_TEMP_HYST,&min) &&
530      !sensors_get_feature(*name,SENSORS_VIA686A_TEMP_OVER,&max)) {
531    if (valid) {
532      print_label(label,10);
533      printf("%+3.1f C     (limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
534             cur,max,min, alarms&VIA686A_ALARM_TEMP?"ALARM":"");
535    }
536  } else
537    printf("ERROR: Can't get TEMP data!\n");
538  free_the_label(&label);
539  if (!sensors_get_label_and_valid(*name,SENSORS_VIA686A_TEMP2,&label,&valid) &&
540      !sensors_get_feature(*name,SENSORS_VIA686A_TEMP2,&cur) &&
541      !sensors_get_feature(*name,SENSORS_VIA686A_TEMP2_HYST,&min) &&
542      !sensors_get_feature(*name,SENSORS_VIA686A_TEMP2_OVER,&max)) {
543    if (valid) {
544      print_label(label,10);
545      printf("%+3.1f C     (limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
546             cur,max,min, alarms&VIA686A_ALARM_TEMP2?"ALARM":"");
547    }
548  } else
549    printf("ERROR: Can't get TEMP2 data!\n");
550  free_the_label(&label);
551  if (!sensors_get_label_and_valid(*name,SENSORS_VIA686A_TEMP3,&label,&valid) &&
552      !sensors_get_feature(*name,SENSORS_VIA686A_TEMP3,&cur) &&
553      !sensors_get_feature(*name,SENSORS_VIA686A_TEMP3_HYST,&min) &&
554      !sensors_get_feature(*name,SENSORS_VIA686A_TEMP3_OVER,&max)) {
555    if (valid) {
556      print_label(label,10);
557      printf("%+3.1f C     (limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
558             cur,max,min, alarms&VIA686A_ALARM_TEMP3?"ALARM":"");
559    }
560  } else
561    printf("ERROR: Can't get TEMP3 data!\n");
562  free_the_label(&label);
563
564}
565
566void print_lm78(const sensors_chip_name *name)
567{
568  char *label = NULL;
569  double cur,min,max,fdiv;
570  int alarms,valid;
571
572  if (!sensors_get_feature(*name,SENSORS_LM78_ALARMS,&cur)) 
573    alarms = cur + 0.5;
574  else {
575    printf("ERROR: Can't get alarm data!\n");
576    alarms = 0;
577  }
578
579
580  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN0,&label,&valid) &&
581      !sensors_get_feature(*name,SENSORS_LM78_IN0,&cur) &&
582      !sensors_get_feature(*name,SENSORS_LM78_IN0_MIN,&min) &&
583      !sensors_get_feature(*name,SENSORS_LM78_IN0_MAX,&max)) {
584    if (valid) {
585      print_label(label,10);
586      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
587             cur,min,max,alarms&LM78_ALARM_IN0?"ALARM":"");
588    }
589  } else
590    printf("ERROR: Can't get IN0 data!\n");
591  free_the_label(&label);
592  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN1,&label,&valid) &&
593      !sensors_get_feature(*name,SENSORS_LM78_IN1,&cur) &&
594      !sensors_get_feature(*name,SENSORS_LM78_IN1_MIN,&min) &&
595      !sensors_get_feature(*name,SENSORS_LM78_IN1_MAX,&max)) {
596    if (valid) {
597      print_label(label,10);
598      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
599             cur,min,max,alarms&LM78_ALARM_IN1?"ALARM":"");
600    }
601  } else
602    printf("ERROR: Can't get IN1 data!\n");
603  free_the_label(&label);
604  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN2,&label,&valid) &&
605      !sensors_get_feature(*name,SENSORS_LM78_IN2,&cur) &&
606      !sensors_get_feature(*name,SENSORS_LM78_IN2_MIN,&min) &&
607      !sensors_get_feature(*name,SENSORS_LM78_IN2_MAX,&max)) {
608    if (valid) {
609      print_label(label,10);
610      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
611             cur,min,max,alarms&LM78_ALARM_IN2?"ALARM":"");
612    }
613  } else
614    printf("ERROR: Can't get IN2 data!\n");
615  free_the_label(&label);
616  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN3,&label,&valid) &&
617      !sensors_get_feature(*name,SENSORS_LM78_IN3,&cur) &&
618      !sensors_get_feature(*name,SENSORS_LM78_IN3_MIN,&min) &&
619      !sensors_get_feature(*name,SENSORS_LM78_IN3_MAX,&max)) {
620    if (valid) {
621      print_label(label,10);
622      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
623             cur,min,max,alarms&LM78_ALARM_IN3?"ALARM":"");
624    }
625  } else
626    printf("ERROR: Can't get IN3 data!\n");
627  free_the_label(&label);
628  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN4,&label,&valid) &&
629      !sensors_get_feature(*name,SENSORS_LM78_IN4,&cur) &&
630      !sensors_get_feature(*name,SENSORS_LM78_IN4_MIN,&min) &&
631      !sensors_get_feature(*name,SENSORS_LM78_IN4_MAX,&max)) {
632    if (valid) {
633      print_label(label,10);
634      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
635             cur,min,max,alarms&LM78_ALARM_IN4?"ALARM":"");
636    }
637  } else
638    printf("ERROR: Can't get IN4 data!\n");
639  free_the_label(&label);
640  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN5,&label,&valid) &&
641      !sensors_get_feature(*name,SENSORS_LM78_IN5,&cur) &&
642      !sensors_get_feature(*name,SENSORS_LM78_IN5_MIN,&min) &&
643      !sensors_get_feature(*name,SENSORS_LM78_IN5_MAX,&max)) {
644    if (valid) {
645      print_label(label,10);
646      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
647             cur,min,max,alarms&LM78_ALARM_IN5?"ALARM":"");
648    }
649  } else
650    printf("ERROR: Can't get IN5 data!\n");
651  free_the_label(&label);
652  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN6,&label,&valid) &&
653      !sensors_get_feature(*name,SENSORS_LM78_IN6,&cur) &&
654      !sensors_get_feature(*name,SENSORS_LM78_IN6_MIN,&min) &&
655      !sensors_get_feature(*name,SENSORS_LM78_IN6_MAX,&max)) {
656    if (valid) {
657      print_label(label,10);
658      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
659             cur,min,max,alarms&LM78_ALARM_IN6?"ALARM":"");
660    }
661  } else
662    printf("ERROR: Can't get IN6 data!\n");
663  free_the_label(&label);
664
665  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_FAN1,&label,&valid) &&
666      !sensors_get_feature(*name,SENSORS_LM78_FAN1,&cur) &&
667      !sensors_get_feature(*name,SENSORS_LM78_FAN1_DIV,&fdiv) &&
668      !sensors_get_feature(*name,SENSORS_LM78_FAN1_MIN,&min)) {
669    if (valid) {
670      print_label(label,10);
671      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
672             cur,min,fdiv, alarms&LM78_ALARM_FAN1?"ALARM":"");
673    }
674  } else
675    printf("ERROR: Can't get FAN1 data!\n");
676  free_the_label(&label);
677  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_FAN2,&label,&valid) &&
678      !sensors_get_feature(*name,SENSORS_LM78_FAN2,&cur) &&
679      !sensors_get_feature(*name,SENSORS_LM78_FAN2_DIV,&fdiv) &&
680      !sensors_get_feature(*name,SENSORS_LM78_FAN2_MIN,&min)) {
681    if (valid) {
682      print_label(label,10);
683      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
684             cur,min,fdiv, alarms&LM78_ALARM_FAN2?"ALARM":"");
685    }
686  } else
687    printf("ERROR: Can't get FAN2 data!\n");
688  free_the_label(&label);
689  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_FAN3,&label,&valid) &&
690      !sensors_get_feature(*name,SENSORS_LM78_FAN3,&cur) &&
691      !sensors_get_feature(*name,SENSORS_LM78_FAN3_DIV,&fdiv) &&
692      !sensors_get_feature(*name,SENSORS_LM78_FAN3_MIN,&min)) {
693    if (valid) {
694      print_label(label,10);
695      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
696             cur,min,fdiv, alarms&LM78_ALARM_FAN3?"ALARM":"");
697    }
698  } else
699    printf("ERROR: Can't get FAN3 data!\n");
700  free_the_label(&label);
701
702  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_TEMP,&label,&valid) &&
703      !sensors_get_feature(*name,SENSORS_LM78_TEMP,&cur) &&
704      !sensors_get_feature(*name,SENSORS_LM78_TEMP_HYST,&min) &&
705      !sensors_get_feature(*name,SENSORS_LM78_TEMP_OVER,&max)) {
706    if (valid) {
707      print_label(label,10);
708      printf("%+3.0f C     (limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
709             cur,max,min, alarms&LM78_ALARM_TEMP?"ALARM":"");
710    }
711  } else
712    printf("ERROR: Can't get TEMP data!\n");
713  free_the_label(&label);
714
715  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_VID,&label,&valid) &&
716      !sensors_get_feature(*name,SENSORS_LM78_VID,&cur)) {
717    if (valid) {
718      print_label(label,10);
719      printf("%+5.2f V\n",cur);
720    }
721  }
722  free_the_label(&label);
723   
724  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_ALARMS,&label,&valid)
725      && valid) {
726    print_label(label,10);
727    printf("Board temperature input (usually LM75 chips) %s\n",
728           alarms & LM78_ALARM_BTI?"ALARM":"");
729    print_label(label,10);
730    printf("Chassis intrusion detection                  %s\n",
731           alarms & LM78_ALARM_CHAS?"ALARM":"     ");
732  }
733  free_the_label(&label);
734}
735
736void print_gl518(const sensors_chip_name *name)
737{
738  char *label = NULL;
739  double cur,min,max,fdiv;
740  int alarms,beeps,valid;
741  int is_r00;
742
743  is_r00 = !strcmp(name->prefix,"gl518sm-r00");
744  if (!sensors_get_feature(*name,SENSORS_GL518_ALARMS,&cur)) 
745    alarms = cur + 0.5;
746  else {
747    printf("ERROR: Can't get alarm data!\n");
748    alarms = 0;
749  }
750  if (!sensors_get_feature(*name,SENSORS_GL518_BEEPS,&cur)) 
751    beeps = cur + 0.5;
752  else {
753    printf("ERROR: Can't get beep data!\n");
754    beeps = 0;
755  }
756
757  /* We need special treatment for the R00 chips, because they can't display
758     actual readings! We hardcode this, as this is the easiest way. */
759  if (is_r00) {
760    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VDD,&label,&valid) &&
761        !sensors_get_feature(*name,SENSORS_GL518_VDD,&cur) &&
762        !sensors_get_feature(*name,SENSORS_GL518_VDD_MIN,&min) &&
763        !sensors_get_feature(*name,SENSORS_GL518_VDD_MAX,&max)) {
764      if (valid) {
765        print_label(label,10);
766        if (cur == 0.0)
767          printf("(n/a)     ");
768        else
769          printf("%+6.2f V  ",cur);
770        printf(  "(min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
771               min,max,alarms&GL518_ALARM_VDD?"ALARM":"     ",
772               beeps&GL518_ALARM_VDD?"(beep)":"");
773      }
774    } else
775      printf("ERROR: Can't get VDD data!\n");
776    free_the_label(&label);
777
778    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN1,&label,&valid) &&
779        !sensors_get_feature(*name,SENSORS_GL518_VIN1,&cur) &&
780        !sensors_get_feature(*name,SENSORS_GL518_VIN1_MIN,&min) &&
781        !sensors_get_feature(*name,SENSORS_GL518_VIN1_MAX,&max)) {
782      if (valid) {
783        print_label(label,10);
784        if (cur == 0.0)
785          printf("(n/a)     ");
786        else
787          printf("%+6.2f V  ",cur);
788        printf("(min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
789               min,max,alarms&GL518_ALARM_VIN1?"ALARM":"     ",
790               beeps&GL518_ALARM_VIN1?"(beep)":"");
791      }
792    } else
793      printf("ERROR: Can't get VIN1 data!\n");
794    free_the_label(&label);
795    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN2,&label,&valid) &&
796        !sensors_get_feature(*name,SENSORS_GL518_VIN2,&cur) &&
797        !sensors_get_feature(*name,SENSORS_GL518_VIN2_MIN,&min) &&
798        !sensors_get_feature(*name,SENSORS_GL518_VIN2_MAX,&max)) {
799      if (valid) {
800        print_label(label,10);
801        if (cur == 0.0)
802          printf("(n/a)     ");
803        else
804          printf("%+6.2f V  ",cur);
805        printf("(min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
806               min,max,alarms&GL518_ALARM_VIN2?"ALARM":"     ",
807               beeps&GL518_ALARM_VIN2?"(beep)":"");
808      }
809    } else
810      printf("ERROR: Can't get IN2 data!\n");
811    free_the_label(&label);
812  } else {
813    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VDD,&label,&valid) &&
814        !sensors_get_feature(*name,SENSORS_GL518_VDD,&cur) &&
815        !sensors_get_feature(*name,SENSORS_GL518_VDD_MIN,&min) &&
816        !sensors_get_feature(*name,SENSORS_GL518_VDD_MAX,&max)) {
817      if (valid) {
818        print_label(label,10);
819        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
820               cur,min,max,alarms&GL518_ALARM_VDD?"ALARM":"     ",
821               beeps&GL518_ALARM_VDD?"(beep)":"");
822      }
823    } else
824      printf("ERROR: Can't get VDD data!\n");
825    free_the_label(&label);
826    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN1,&label,&valid) &&
827        !sensors_get_feature(*name,SENSORS_GL518_VIN1,&cur) &&
828        !sensors_get_feature(*name,SENSORS_GL518_VIN1_MIN,&min) &&
829        !sensors_get_feature(*name,SENSORS_GL518_VIN1_MAX,&max)) {
830      if (valid) {
831        print_label(label,10);
832        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
833               cur,min,max,alarms&GL518_ALARM_VIN1?"ALARM":"     ",
834               beeps&GL518_ALARM_VIN1?"(beep)":"");
835      }
836    } else
837      printf("ERROR: Can't get VIN1 data!\n");
838    free_the_label(&label);
839    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN2,&label,&valid) &&
840        !sensors_get_feature(*name,SENSORS_GL518_VIN2,&cur) &&
841        !sensors_get_feature(*name,SENSORS_GL518_VIN2_MIN,&min) &&
842        !sensors_get_feature(*name,SENSORS_GL518_VIN2_MAX,&max)) {
843      if (valid) {
844        print_label(label,10);
845        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
846               cur,min,max,alarms&GL518_ALARM_VIN2?"ALARM":"     ",
847               beeps&GL518_ALARM_VIN2?"(beep)":"");
848      }
849    } else
850      printf("ERROR: Can't get IN2 data!\n");
851    free_the_label(&label);
852  }
853
854  if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN3,&label,&valid) &&
855      !sensors_get_feature(*name,SENSORS_GL518_VIN3,&cur) &&
856      !sensors_get_feature(*name,SENSORS_GL518_VIN3_MIN,&min) &&
857      !sensors_get_feature(*name,SENSORS_GL518_VIN3_MAX,&max)) {
858    if (valid) {
859      print_label(label,10);
860      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
861             cur,min,max,alarms&GL518_ALARM_VIN3?"ALARM":"     ",
862             beeps&GL518_ALARM_VIN3?"(beep)":"");
863     }
864  } else
865    printf("ERROR: Can't get VIN3 data!\n");
866  free_the_label(&label);
867 
868  if (!sensors_get_label_and_valid(*name,SENSORS_GL518_FAN1,&label,&valid) &&
869      !sensors_get_feature(*name,SENSORS_GL518_FAN1,&cur) &&
870      !sensors_get_feature(*name,SENSORS_GL518_FAN1_DIV,&fdiv) &&
871      !sensors_get_feature(*name,SENSORS_GL518_FAN1_MIN,&min)) {
872    if (valid) {
873      print_label(label,10);
874      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s  %s\n",
875             cur,min,fdiv, alarms&GL518_ALARM_FAN1?"ALARM":"     ",
876             beeps&GL518_ALARM_FAN1?"(beep)":"");
877    }
878  } else
879    printf("ERROR: Can't get FAN1 data!\n");
880  free_the_label(&label);
881  if (!sensors_get_label_and_valid(*name,SENSORS_GL518_FAN2,&label,&valid) &&
882      !sensors_get_feature(*name,SENSORS_GL518_FAN2,&cur) &&
883      !sensors_get_feature(*name,SENSORS_GL518_FAN2_DIV,&fdiv) &&
884      !sensors_get_feature(*name,SENSORS_GL518_FAN2_MIN,&min)) {
885    if (valid) {
886      print_label(label,10);
887      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s  %s\n",
888             cur,min,fdiv, alarms&GL518_ALARM_FAN2?"ALARM":"     ",
889             beeps&GL518_ALARM_FAN2?"(beep)":"");
890    }
891  } else
892    printf("ERROR: Can't get FAN2 data!\n");
893  free_the_label(&label);
894
895  if (!sensors_get_label_and_valid(*name,SENSORS_GL518_TEMP,&label,&valid) &&
896      !sensors_get_feature(*name,SENSORS_GL518_TEMP,&cur) &&
897      !sensors_get_feature(*name,SENSORS_GL518_TEMP_OVER,&max) &&
898      !sensors_get_feature(*name,SENSORS_GL518_TEMP_HYST,&min)) {
899    if (valid) {
900      print_label(label,10);
901      printf("%+3.0f C     (limit = %+3.0f C,  hysteresis = %+3.0f C) %s  %s\n",
902             cur,max,min, alarms&GL518_ALARM_TEMP?"ALARM":"     ",
903             beeps&GL518_ALARM_TEMP?"(beep)":"");
904    }
905  } else
906    printf("ERROR: Can't get TEMP data!\n");
907  free_the_label(&label);
908
909  if (!sensors_get_label_and_valid(*name,SENSORS_GL518_BEEP_ENABLE,&label,&valid)
910      && valid) {
911    if (!sensors_get_feature(*name,SENSORS_GL518_BEEP_ENABLE,&cur)) {
912      print_label(label,10);
913      if (cur < 0.5) 
914        printf("Sound alarm disabled\n");
915      else
916        printf("Sound alarm enabled\n");
917    } else
918      printf("ERROR: Can't get BEEP data!\n");
919  }
920  free_the_label(&label);
921}
922
923void print_adm1025(const sensors_chip_name *name)
924{
925  char *label = NULL;
926  double cur,min,max;
927  int alarms,valid;
928
929  if (!sensors_get_feature(*name,SENSORS_ADM1025_ALARMS,&cur)) 
930    alarms = cur + 0.5;
931  else {
932    printf("ERROR: Can't get alarm data!\n");
933    alarms = 0;
934  }
935
936  if (!sensors_get_label_and_valid(*name,SENSORS_ADM1025_IN0,&label,&valid) &&
937      !sensors_get_feature(*name,SENSORS_ADM1025_IN0,&cur) &&
938      !sensors_get_feature(*name,SENSORS_ADM1025_IN0_MIN,&min) &&
939      !sensors_get_feature(*name,SENSORS_ADM1025_IN0_MAX,&max)) {
940    if (valid) {
941      print_label(label,10);
942      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
943           cur,min,max,alarms&ADM1025_ALARM_IN0?"ALARM":"");
944    }
945  } else
946    printf("ERROR: Can't get IN0 data!\n");
947  free_the_label(&label);
948  if (!sensors_get_label_and_valid(*name,SENSORS_ADM1025_IN1,&label,&valid) &&
949      !sensors_get_feature(*name,SENSORS_ADM1025_IN1,&cur) &&
950      !sensors_get_feature(*name,SENSORS_ADM1025_IN1_MIN,&min) &&
951      !sensors_get_feature(*name,SENSORS_ADM1025_IN1_MAX,&max)) {
952    if (valid) {
953      print_label(label,10);
954      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
955           cur,min,max,alarms&ADM1025_ALARM_IN1?"ALARM":"");
956    }
957  } else
958    printf("ERROR: Can't get IN1 data!\n");
959  free_the_label(&label);
960  if (!sensors_get_label_and_valid(*name,SENSORS_ADM1025_IN2,&label,&valid) &&
961      !sensors_get_feature(*name,SENSORS_ADM1025_IN2,&cur) &&
962      !sensors_get_feature(*name,SENSORS_ADM1025_IN2_MIN,&min) &&
963      !sensors_get_feature(*name,SENSORS_ADM1025_IN2_MAX,&max)) {
964    if (valid) {
965      print_label(label,10);
966      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
967           cur,min,max,alarms&ADM1025_ALARM_IN2?"ALARM":"");
968    }
969  } else
970    printf("ERROR: Can't get IN2 data!\n");
971  free_the_label(&label);
972  if (!sensors_get_label_and_valid(*name,SENSORS_ADM1025_IN3,&label,&valid) &&
973      !sensors_get_feature(*name,SENSORS_ADM1025_IN3,&cur) &&
974      !sensors_get_feature(*name,SENSORS_ADM1025_IN3_MIN,&min) &&
975      !sensors_get_feature(*name,SENSORS_ADM1025_IN3_MAX,&max)) {
976    if (valid) {
977      print_label(label,10);
978      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
979           cur,min,max,alarms&ADM1025_ALARM_IN3?"ALARM":"");
980    }
981  } else
982    printf("ERROR: Can't get IN3 data!\n");
983  free_the_label(&label);
984  if (!sensors_get_label_and_valid(*name,SENSORS_ADM1025_IN4,&label,&valid) &&
985      !sensors_get_feature(*name,SENSORS_ADM1025_IN4,&cur) &&
986      !sensors_get_feature(*name,SENSORS_ADM1025_IN4_MIN,&min) &&
987      !sensors_get_feature(*name,SENSORS_ADM1025_IN4_MAX,&max)) {
988    if (valid) {
989      print_label(label,10);
990      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
991           cur,min,max,alarms&ADM1025_ALARM_IN4?"ALARM":"");
992    }
993  } else
994    printf("ERROR: Can't get IN4 data!\n");
995  free_the_label(&label);
996  if (!sensors_get_label_and_valid(*name,SENSORS_ADM1025_IN5,&label,&valid) &&
997      !sensors_get_feature(*name,SENSORS_ADM1025_IN5,&cur) &&
998      !sensors_get_feature(*name,SENSORS_ADM1025_IN5_MIN,&min) &&
999      !sensors_get_feature(*name,SENSORS_ADM1025_IN5_MAX,&max)) {
1000    if (valid) {
1001      print_label(label,10);
1002      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1003           cur,min,max,alarms&ADM1025_ALARM_IN5?"ALARM":"");
1004    }
1005  } else
1006    printf("ERROR: Can't get IN5 data!\n");
1007  free_the_label(&label);
1008
1009  if (!sensors_get_label_and_valid(*name,SENSORS_ADM1025_TEMP1,&label,&valid) &&
1010      !sensors_get_feature(*name,SENSORS_ADM1025_TEMP1,&cur) &&
1011      !sensors_get_feature(*name,SENSORS_ADM1025_TEMP1_HYST,&min) &&
1012      !sensors_get_feature(*name,SENSORS_ADM1025_TEMP1_OVER,&max)) {
1013    if (valid) {
1014      print_label(label,10);
1015      printf("%+3.0f C   (limit = %+3.0f C, hysteresis = %+3.0f C) %s\n",
1016           cur,max,min, alarms&ADM1025_ALARM_TEMP?"ALARM":"");
1017    }
1018  } else
1019    printf("ERROR: Can't get TEMP data!\n");
1020  free_the_label(&label);
1021
1022}
1023
1024void print_lm80(const sensors_chip_name *name)
1025{
1026  char *label = NULL;
1027  double cur,min,max,min2,max2,fdiv;
1028  int alarms,valid;
1029
1030  if (!sensors_get_feature(*name,SENSORS_LM80_ALARMS,&cur)) 
1031    alarms = cur + 0.5;
1032  else {
1033    printf("ERROR: Can't get alarm data!\n");
1034    alarms = 0;
1035  }
1036
1037  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN0,&label,&valid) &&
1038      !sensors_get_feature(*name,SENSORS_LM80_IN0,&cur) &&
1039      !sensors_get_feature(*name,SENSORS_LM80_IN0_MIN,&min) &&
1040      !sensors_get_feature(*name,SENSORS_LM80_IN0_MAX,&max)) {
1041    if (valid) {
1042      print_label(label,10);
1043      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1044           cur,min,max,alarms&LM80_ALARM_IN0?"ALARM":"");
1045    }
1046  } else
1047    printf("ERROR: Can't get IN0 data!\n");
1048  free_the_label(&label);
1049  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN1,&label,&valid) &&
1050      !sensors_get_feature(*name,SENSORS_LM80_IN1,&cur) &&
1051      !sensors_get_feature(*name,SENSORS_LM80_IN1_MIN,&min) &&
1052      !sensors_get_feature(*name,SENSORS_LM80_IN1_MAX,&max)) {
1053    if (valid) {
1054      print_label(label,10);
1055      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1056           cur,min,max,alarms&LM80_ALARM_IN1?"ALARM":"");
1057    }
1058  } else
1059    printf("ERROR: Can't get IN1 data!\n");
1060  free_the_label(&label);
1061  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN2,&label,&valid) &&
1062      !sensors_get_feature(*name,SENSORS_LM80_IN2,&cur) &&
1063      !sensors_get_feature(*name,SENSORS_LM80_IN2_MIN,&min) &&
1064      !sensors_get_feature(*name,SENSORS_LM80_IN2_MAX,&max)) {
1065    if (valid) {
1066      print_label(label,10);
1067      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1068           cur,min,max,alarms&LM80_ALARM_IN2?"ALARM":"");
1069    }
1070  } else
1071    printf("ERROR: Can't get IN2 data!\n");
1072  free_the_label(&label);
1073  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN3,&label,&valid) &&
1074      !sensors_get_feature(*name,SENSORS_LM80_IN3,&cur) &&
1075      !sensors_get_feature(*name,SENSORS_LM80_IN3_MIN,&min) &&
1076      !sensors_get_feature(*name,SENSORS_LM80_IN3_MAX,&max)) {
1077    if (valid) {
1078      print_label(label,10);
1079      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1080           cur,min,max,alarms&LM80_ALARM_IN3?"ALARM":"");
1081    }
1082  } else
1083    printf("ERROR: Can't get IN3 data!\n");
1084  free_the_label(&label);
1085  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN4,&label,&valid) &&
1086      !sensors_get_feature(*name,SENSORS_LM80_IN4,&cur) &&
1087      !sensors_get_feature(*name,SENSORS_LM80_IN4_MIN,&min) &&
1088      !sensors_get_feature(*name,SENSORS_LM80_IN4_MAX,&max)) {
1089    if (valid) {
1090      print_label(label,10);
1091      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1092           cur,min,max,alarms&LM80_ALARM_IN4?"ALARM":"");
1093    }
1094  } else
1095    printf("ERROR: Can't get IN4 data!\n");
1096  free_the_label(&label);
1097  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN5,&label,&valid) &&
1098      !sensors_get_feature(*name,SENSORS_LM80_IN5,&cur) &&
1099      !sensors_get_feature(*name,SENSORS_LM80_IN5_MIN,&min) &&
1100      !sensors_get_feature(*name,SENSORS_LM80_IN5_MAX,&max)) {
1101    if (valid) {
1102      print_label(label,10);
1103      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1104           cur,min,max,alarms&LM80_ALARM_IN5?"ALARM":"");
1105    }
1106  } else
1107    printf("ERROR: Can't get IN5 data!\n");
1108  free_the_label(&label);
1109  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN6,&label,&valid) &&
1110      !sensors_get_feature(*name,SENSORS_LM80_IN6,&cur) &&
1111      !sensors_get_feature(*name,SENSORS_LM80_IN6_MIN,&min) &&
1112      !sensors_get_feature(*name,SENSORS_LM80_IN6_MAX,&max)) {
1113    if (valid) {
1114      print_label(label,10);
1115      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1116           cur,min,max,alarms&LM80_ALARM_IN6?"ALARM":"");
1117    }
1118  } else
1119    printf("ERROR: Can't get IN6 data!\n");
1120  free_the_label(&label);
1121
1122  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_FAN1,&label,&valid) &&
1123      !sensors_get_feature(*name,SENSORS_LM80_FAN1,&cur) &&
1124      !sensors_get_feature(*name,SENSORS_LM80_FAN1_DIV,&fdiv) &&
1125      !sensors_get_feature(*name,SENSORS_LM80_FAN1_MIN,&min)) {
1126    if (valid) {
1127      print_label(label,10);
1128      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
1129           cur,min,fdiv, alarms&LM80_ALARM_FAN1?"ALARM":"");
1130    }
1131  } else
1132    printf("ERROR: Can't get FAN1 data!\n");
1133  free_the_label(&label);
1134  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_FAN2,&label,&valid) &&
1135      !sensors_get_feature(*name,SENSORS_LM80_FAN2,&cur) &&
1136      !sensors_get_feature(*name,SENSORS_LM80_FAN2_DIV,&fdiv) &&
1137      !sensors_get_feature(*name,SENSORS_LM80_FAN2_MIN,&min)) {
1138    if (valid) {
1139      print_label(label,10);
1140      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
1141           cur,min,fdiv, alarms&LM80_ALARM_FAN2?"ALARM":"");
1142    }
1143  } else
1144    printf("ERROR: Can't get FAN2 data!\n");
1145  free_the_label(&label);
1146
1147  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_TEMP,&label,&valid) &&
1148      !sensors_get_feature(*name,SENSORS_LM80_TEMP,&cur) &&
1149      !sensors_get_feature(*name,SENSORS_LM80_TEMP_HOT_HYST,&min) &&
1150      !sensors_get_feature(*name,SENSORS_LM80_TEMP_HOT_MAX,&max) &&
1151      !sensors_get_feature(*name,SENSORS_LM80_TEMP_OS_HYST,&min2) &&
1152      !sensors_get_feature(*name,SENSORS_LM80_TEMP_OS_MAX,&max2)) {
1153    if (valid) {
1154      print_label(label,10);
1155      printf("%+3.2f C (hot:limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
1156           cur,max,min, alarms&LM80_ALARM_TEMP_HOT?"ALARM":"");
1157    printf("         (os: limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
1158           max2,min2, alarms&LM80_ALARM_TEMP_HOT?"ALARM":"");
1159    }
1160  } else
1161    printf("ERROR: Can't get TEMP data!\n");
1162  free_the_label(&label);
1163
1164  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_ALARMS,&label,&valid)
1165      && valid) {
1166    if (alarms & LM80_ALARM_BTI) {
1167      print_label(label,10);
1168      printf("Board temperature input (a LM75 perhaps?)    ALARM\n");
1169    }
1170    if (alarms & LM80_ALARM_CHAS) {
1171      print_label(label,10);
1172      printf("Chassis intrusion detection                  ALARM\n");
1173    }
1174  }
1175  free_the_label(&label);
1176}
1177
1178void print_mtp008(const sensors_chip_name *name)
1179{
1180  char *label = NULL;
1181  double cur,min,max,fdiv;
1182  int alarms,valid;
1183
1184  if (!sensors_get_feature(*name,SENSORS_MTP008_ALARMS,&cur))
1185    alarms = cur + 0.5;
1186  else {
1187    printf("ERROR: Can't get alarm data!\n");
1188    alarms = 0;
1189  }
1190
1191
1192  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_IN0,&label,&valid) &&
1193      !sensors_get_feature(*name,SENSORS_MTP008_IN0,&cur) &&
1194      !sensors_get_feature(*name,SENSORS_MTP008_IN0_MIN,&min) &&
1195      !sensors_get_feature(*name,SENSORS_MTP008_IN0_MAX,&max)) {
1196    if (valid) {
1197      print_label(label,10);
1198      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1199             cur,min,max,alarms&MTP008_ALARM_IN0?"ALARM":"");
1200    }
1201  } else
1202    printf("ERROR: Can't get IN0 data!\n");
1203  free_the_label(&label);
1204  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_IN1,&label,&valid) &&
1205      !sensors_get_feature(*name,SENSORS_MTP008_IN1,&cur) &&
1206      !sensors_get_feature(*name,SENSORS_MTP008_IN1_MIN,&min) &&
1207      !sensors_get_feature(*name,SENSORS_MTP008_IN1_MAX,&max)) {
1208    if (valid) {
1209      print_label(label,10);
1210      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1211             cur,min,max,alarms&MTP008_ALARM_IN1?"ALARM":"");
1212    }
1213  } else
1214    printf("ERROR: Can't get IN1 data!\n");
1215  free_the_label(&label);
1216  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_IN2,&label,&valid) &&
1217      !sensors_get_feature(*name,SENSORS_MTP008_IN2,&cur) &&
1218      !sensors_get_feature(*name,SENSORS_MTP008_IN2_MIN,&min) &&
1219      !sensors_get_feature(*name,SENSORS_MTP008_IN2_MAX,&max)) {
1220    if (valid) {
1221      print_label(label,10);
1222      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1223             cur,min,max,alarms&MTP008_ALARM_IN2?"ALARM":"");
1224    }
1225  } else
1226    printf("ERROR: Can't get IN2 data!\n");
1227  free_the_label(&label);
1228  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_IN3,&label,&valid) &&
1229      !sensors_get_feature(*name,SENSORS_MTP008_IN3,&cur) &&
1230      !sensors_get_feature(*name,SENSORS_MTP008_IN3_MIN,&min) &&
1231      !sensors_get_feature(*name,SENSORS_MTP008_IN3_MAX,&max)) {
1232    if (valid) {
1233      print_label(label,10);
1234      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1235             cur,min,max,alarms&MTP008_ALARM_IN3?"ALARM":"");
1236    }
1237  } else
1238    printf("ERROR: Can't get IN3 data!\n");
1239  free_the_label(&label);
1240  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_IN4,&label,&valid) &&
1241      !sensors_get_feature(*name,SENSORS_MTP008_IN4,&cur) &&
1242      !sensors_get_feature(*name,SENSORS_MTP008_IN4_MIN,&min) &&
1243      !sensors_get_feature(*name,SENSORS_MTP008_IN4_MAX,&max)) {
1244    if (valid) {
1245      print_label(label,10);
1246      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1247             cur,min,max,alarms&MTP008_ALARM_IN4?"ALARM":"");
1248    }
1249  } else
1250    printf("ERROR: Can't get IN4 data!\n");
1251  free_the_label(&label);
1252  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_IN5,&label,&valid) &&
1253      !sensors_get_feature(*name,SENSORS_MTP008_IN5,&cur) &&
1254      !sensors_get_feature(*name,SENSORS_MTP008_IN5_MIN,&min) &&
1255      !sensors_get_feature(*name,SENSORS_MTP008_IN5_MAX,&max)) {
1256    if (valid) {
1257      print_label(label,10);
1258      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1259             cur,min,max,alarms&MTP008_ALARM_IN5?"ALARM":"");
1260    }
1261  } else
1262    printf("ERROR: Can't get IN5 data!\n");
1263  free_the_label(&label);
1264  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_IN6,&label,&valid) &&
1265      !sensors_get_feature(*name,SENSORS_MTP008_IN6,&cur) &&
1266      !sensors_get_feature(*name,SENSORS_MTP008_IN6_MIN,&min) &&
1267      !sensors_get_feature(*name,SENSORS_MTP008_IN6_MAX,&max)) {
1268    if (valid) {
1269      print_label(label,10);
1270      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
1271             cur,min,max,alarms&MTP008_ALARM_IN6?"ALARM":"");
1272    }
1273  } else
1274    printf("ERROR: Can't get IN6 data!\n");
1275  free_the_label(&label);
1276
1277  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_FAN1,&label,&valid) &&
1278      !sensors_get_feature(*name,SENSORS_MTP008_FAN1,&cur) &&
1279      !sensors_get_feature(*name,SENSORS_MTP008_FAN1_DIV,&fdiv) &&
1280      !sensors_get_feature(*name,SENSORS_MTP008_FAN1_MIN,&min)) {
1281    if (valid) {
1282      print_label(label,10);
1283      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
1284             cur,min,fdiv, alarms&MTP008_ALARM_FAN1?"ALARM":"");
1285    }
1286  } else
1287    printf("ERROR: Can't get FAN1 data!\n");
1288  free_the_label(&label);
1289  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_FAN2,&label,&valid) &&
1290      !sensors_get_feature(*name,SENSORS_MTP008_FAN2,&cur) &&
1291      !sensors_get_feature(*name,SENSORS_MTP008_FAN2_DIV,&fdiv) &&
1292      !sensors_get_feature(*name,SENSORS_MTP008_FAN2_MIN,&min)) {
1293    if (valid) {
1294      print_label(label,10);
1295      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
1296             cur,min,fdiv, alarms&MTP008_ALARM_FAN2?"ALARM":"");
1297    }
1298  } else
1299    printf("ERROR: Can't get FAN2 data!\n");
1300  free_the_label(&label);
1301  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_FAN3,&label,&valid) &&
1302      !sensors_get_feature(*name,SENSORS_MTP008_FAN3,&cur) &&
1303      !sensors_get_feature(*name,SENSORS_MTP008_FAN3_DIV,&fdiv) &&
1304      !sensors_get_feature(*name,SENSORS_MTP008_FAN3_MIN,&min)) {
1305    if (valid) {
1306      print_label(label,10);
1307      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
1308             cur,min,fdiv, alarms&MTP008_ALARM_FAN3?"ALARM":"");
1309    }
1310  } else
1311    printf("ERROR: Can't get FAN3 data!\n");
1312  free_the_label(&label);
1313
1314  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_TEMP1,&label,&valid) &&
1315      !sensors_get_feature(*name,SENSORS_MTP008_TEMP1,&cur) &&
1316      !sensors_get_feature(*name,SENSORS_MTP008_TEMP1_HYST,&min) &&
1317      !sensors_get_feature(*name,SENSORS_MTP008_TEMP1_OVER,&max)) {
1318    if (valid) {
1319      print_label(label,10);
1320      printf("%+6.0f C  (limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
1321             cur,max,min, alarms&MTP008_ALARM_TEMP1?"ALARM":"");
1322    }
1323  } else
1324    printf("ERROR: Can't get TEMP1 data!\n");
1325  free_the_label(&label);
1326
1327  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_TEMP2,&label,&valid) &&
1328      !sensors_get_feature(*name,SENSORS_MTP008_TEMP2,&cur) &&
1329      !sensors_get_feature(*name,SENSORS_MTP008_TEMP2_HYST,&min) &&
1330      !sensors_get_feature(*name,SENSORS_MTP008_TEMP2_OVER,&max)) {
1331    if (valid) {
1332      print_label(label,10);
1333      printf("%+6.0f C  (limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
1334             cur,max,min, alarms&MTP008_ALARM_TEMP2?"ALARM":"");
1335    }
1336  } else
1337    printf("ERROR: Can't get TEMP2 data!\n");
1338  free_the_label(&label);
1339
1340  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_TEMP3,&label,&valid) &&
1341      !sensors_get_feature(*name,SENSORS_MTP008_TEMP3,&cur) &&
1342      !sensors_get_feature(*name,SENSORS_MTP008_TEMP3_HYST,&min) &&
1343      !sensors_get_feature(*name,SENSORS_MTP008_TEMP3_OVER,&max)) {
1344    if (valid) {
1345      print_label(label,10);
1346      printf("%+6.0f C  (limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
1347             cur,max,min, alarms&MTP008_ALARM_TEMP3?"ALARM":"");
1348    }
1349  } else
1350    printf("ERROR: Can't get TEMP3 data!\n");
1351  free_the_label(&label);
1352
1353  if (!sensors_get_label_and_valid(*name,SENSORS_MTP008_VID,&label,&valid) &&
1354      !sensors_get_feature(*name,SENSORS_MTP008_VID,&cur)) {
1355    if (valid) {
1356      print_label(label,10);
1357      printf("%+6.2f V\n",cur);
1358    }
1359  }
1360  free_the_label(&label);
1361}
1362
1363void print_w83781d(const sensors_chip_name *name)
1364{
1365  char *label = NULL;
1366  double cur,min,max,fdiv,sens;
1367  int alarms,beeps;
1368  int is82d, is83s,valid;
1369
1370  is82d = (!strcmp(name->prefix,"w83782d")) ||
1371          (!strcmp(name->prefix,"w83627hf"));
1372  is83s = !strcmp(name->prefix,"w83783s");
1373  if (!sensors_get_feature(*name,SENSORS_W83781D_ALARMS,&cur)) 
1374    alarms = cur + 0.5;
1375  else {
1376    printf("ERROR: Can't get alarm data!\n");
1377    alarms = 0;
1378  }
1379
1380  if (!sensors_get_feature(*name,SENSORS_W83781D_BEEPS,&cur)) {
1381    beeps = cur + 0.5;
1382    /* strangely, as99127f beep bits are inverted */
1383    if (!strcmp(name->prefix,"as99127f"))
1384      beeps = ~beeps;
1385  } else {
1386    printf("ERROR: Can't get beep data!\n");
1387    beeps = 0;
1388  }
1389
1390  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN0,&label,&valid) &&
1391      !sensors_get_feature(*name,SENSORS_W83781D_IN0,&cur) &&
1392      !sensors_get_feature(*name,SENSORS_W83781D_IN0_MIN,&min) &&
1393      !sensors_get_feature(*name,SENSORS_W83781D_IN0_MAX,&max)) {
1394    if (valid) {
1395      print_label(label,10);
1396      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1397           cur,min,max,alarms&W83781D_ALARM_IN0?"ALARM":"     ",
1398           beeps&W83781D_ALARM_IN0?"(beep)":"");
1399    }
1400  } else
1401    printf("ERROR: Can't get IN0 data!\n");
1402  free_the_label(&label);
1403  if (!is83s) {
1404    if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN1,&label,&valid) &&
1405        !sensors_get_feature(*name,SENSORS_W83781D_IN1,&cur) &&
1406        !sensors_get_feature(*name,SENSORS_W83781D_IN1_MIN,&min) &&
1407        !sensors_get_feature(*name,SENSORS_W83781D_IN1_MAX,&max)) {
1408      if (valid) {
1409        print_label(label,10);
1410        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1411             cur,min,max,alarms&W83781D_ALARM_IN1?"ALARM":"     ",
1412             beeps&W83781D_ALARM_IN1?"(beep)":"");
1413      }
1414    } else
1415      printf("ERROR: Can't get IN1 data!\n");
1416    free_the_label(&label);
1417  }
1418  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN2,&label,&valid) &&
1419      !sensors_get_feature(*name,SENSORS_W83781D_IN2,&cur) &&
1420      !sensors_get_feature(*name,SENSORS_W83781D_IN2_MIN,&min) &&
1421      !sensors_get_feature(*name,SENSORS_W83781D_IN2_MAX,&max)) {
1422    if (valid) {
1423      print_label(label,10);
1424      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1425           cur,min,max,alarms&W83781D_ALARM_IN2?"ALARM":"     ",
1426           beeps&W83781D_ALARM_IN2?"(beep)":"");
1427    }
1428  } else
1429    printf("ERROR: Can't get IN2 data!\n");
1430  free_the_label(&label);
1431  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN3,&label,&valid) &&
1432      !sensors_get_feature(*name,SENSORS_W83781D_IN3,&cur) &&
1433      !sensors_get_feature(*name,SENSORS_W83781D_IN3_MIN,&min) &&
1434      !sensors_get_feature(*name,SENSORS_W83781D_IN3_MAX,&max)) {
1435    if (valid) {
1436      print_label(label,10);
1437      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1438           cur,min,max,alarms&W83781D_ALARM_IN3?"ALARM":"     ",
1439           beeps&W83781D_ALARM_IN3?"(beep)":"");
1440    }
1441  } else
1442    printf("ERROR: Can't get IN3 data!\n");
1443  free_the_label(&label);
1444  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN4,&label,&valid) &&
1445      !sensors_get_feature(*name,SENSORS_W83781D_IN4,&cur) &&
1446      !sensors_get_feature(*name,SENSORS_W83781D_IN4_MIN,&min) &&
1447      !sensors_get_feature(*name,SENSORS_W83781D_IN4_MAX,&max)) {
1448    if (valid) {
1449      print_label(label,10);
1450      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1451           cur,min,max,alarms&W83781D_ALARM_IN4?"ALARM":"     ",
1452           beeps&W83781D_ALARM_IN4?"(beep)":"");
1453    }
1454  } else
1455    printf("ERROR: Can't get IN4 data!\n");
1456  free_the_label(&label);
1457  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN5,&label,&valid) &&
1458      !sensors_get_feature(*name,SENSORS_W83781D_IN5,&cur) &&
1459      !sensors_get_feature(*name,SENSORS_W83781D_IN5_MIN,&min) &&
1460      !sensors_get_feature(*name,SENSORS_W83781D_IN5_MAX,&max)) {
1461    if (valid) {
1462      print_label(label,10);
1463      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1464           cur,min,max,alarms&W83781D_ALARM_IN5?"ALARM":"     ",
1465           beeps&W83781D_ALARM_IN5?"(beep)":"");
1466    }
1467  } else
1468    printf("ERROR: Can't get IN5 data!\n");
1469  free_the_label(&label);
1470  if (!is83s) {
1471    if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN6,&label,&valid) &&
1472        !sensors_get_feature(*name,SENSORS_W83781D_IN6,&cur) &&
1473        !sensors_get_feature(*name,SENSORS_W83781D_IN6_MIN,&min) &&
1474        !sensors_get_feature(*name,SENSORS_W83781D_IN6_MAX,&max)) {
1475      if (valid) {
1476        print_label(label,10);
1477        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1478             cur,min,max,alarms&W83781D_ALARM_IN6?"ALARM":"     ",
1479             beeps&W83781D_ALARM_IN6?"(beep)":"");
1480      }
1481    } else
1482      printf("ERROR: Can't get IN6 data!\n");
1483    free_the_label(&label);
1484  }
1485  if (is82d) {
1486    if (!sensors_get_label_and_valid(*name,SENSORS_W83782D_IN7,&label,&valid) &&
1487        !sensors_get_feature(*name,SENSORS_W83782D_IN7,&cur) &&
1488        !sensors_get_feature(*name,SENSORS_W83782D_IN7_MIN,&min) &&
1489        !sensors_get_feature(*name,SENSORS_W83782D_IN7_MAX,&max)) {
1490      if (valid) {
1491        print_label(label,10);
1492        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1493             cur,min,max,alarms&W83782D_ALARM_IN7?"ALARM":"     ",
1494             beeps&W83782D_ALARM_IN7?"(beep)":"");
1495      }
1496    } else
1497      printf("ERROR: Can't get IN7 data!\n");
1498    free_the_label(&label);
1499    if (!sensors_get_label_and_valid(*name,SENSORS_W83782D_IN8,&label,&valid) &&
1500        !sensors_get_feature(*name,SENSORS_W83782D_IN8,&cur) &&
1501        !sensors_get_feature(*name,SENSORS_W83782D_IN8_MIN,&min) &&
1502        !sensors_get_feature(*name,SENSORS_W83782D_IN8_MAX,&max)) {
1503      if (valid) {
1504        print_label(label,10);
1505        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1506             cur,min,max,alarms&W83782D_ALARM_IN8?"ALARM":"     ",
1507             beeps&W83782D_ALARM_IN8?"(beep)":"");
1508      }
1509    } else
1510      printf("ERROR: Can't get IN6 data!\n");
1511    free_the_label(&label);
1512  }
1513
1514  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_FAN1,&label,&valid) &&
1515      !sensors_get_feature(*name,SENSORS_W83781D_FAN1,&cur) &&
1516      !sensors_get_feature(*name,SENSORS_W83781D_FAN1_DIV,&fdiv) &&
1517      !sensors_get_feature(*name,SENSORS_W83781D_FAN1_MIN,&min)) {
1518    if (valid) {
1519      print_label(label,10);
1520      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)              %s  %s\n",
1521           cur,min,fdiv, alarms&W83781D_ALARM_FAN1?"ALARM":"     ",
1522           beeps&W83781D_ALARM_FAN1?"(beep)":"");
1523    }
1524  } else
1525    printf("ERROR: Can't get FAN1 data!\n");
1526  free_the_label(&label);
1527  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_FAN2,&label,&valid) &&
1528      !sensors_get_feature(*name,SENSORS_W83781D_FAN2,&cur) &&
1529      !sensors_get_feature(*name,SENSORS_W83781D_FAN2_DIV,&fdiv) &&
1530      !sensors_get_feature(*name,SENSORS_W83781D_FAN2_MIN,&min)) {
1531    if (valid) {
1532      print_label(label,10);
1533      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)              %s  %s\n",
1534           cur,min,fdiv, alarms&W83781D_ALARM_FAN2?"ALARM":"     ",
1535           beeps&W83781D_ALARM_FAN2?"(beep)":"");
1536    }
1537  } else
1538    printf("ERROR: Can't get FAN2 data!\n");
1539  free_the_label(&label);
1540  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_FAN3,&label,&valid) &&
1541      !sensors_get_feature(*name,SENSORS_W83781D_FAN3,&cur) &&
1542      !sensors_get_feature(*name,SENSORS_W83781D_FAN3_DIV,&fdiv) &&
1543      !sensors_get_feature(*name,SENSORS_W83781D_FAN3_MIN,&min)) {
1544    if (valid) {
1545      print_label(label,10);
1546      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)              %s  %s\n",
1547           cur,min,fdiv, alarms&W83781D_ALARM_FAN3?"ALARM":"     ",
1548           beeps&W83781D_ALARM_FAN3?"(beep)":"");
1549    }
1550  } else
1551    printf("ERROR: Can't get FAN3 data!\n");
1552  free_the_label(&label);
1553
1554  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_TEMP1,&label,&valid) &&
1555      !sensors_get_feature(*name,SENSORS_W83781D_TEMP1,&cur) &&
1556      !sensors_get_feature(*name,SENSORS_W83781D_TEMP1_HYST,&min) &&
1557      !sensors_get_feature(*name,SENSORS_W83781D_TEMP1_OVER,&max)) {
1558    if (valid) {
1559      if((!is82d) && (!is83s)) {
1560        print_label(label,10);
1561        printf("%+3.0f C   (limit = %+3.0f C, hysteresis = %+3.0f C) %s  %s\n",
1562               cur,max,min, alarms&W83781D_ALARM_TEMP1 ?"ALARM":"     ",
1563               beeps&W83781D_ALARM_TEMP1?"(beep)":"");
1564      } else {
1565        if(!sensors_get_feature(*name,SENSORS_W83781D_SENS1,&sens)) {
1566          print_label(label,10);
1567          printf(
1568  "%+3.0f C  (limit = %+3.0f C, hysteresis = %+3.0f C, sensor = %s) %s  %s\n",
1569                 cur,max,min,
1570                 (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)?
1571                 "3904 transistor":"thermistor",
1572                 alarms&W83781D_ALARM_TEMP1?"ALARM":"     ",
1573                 beeps&W83781D_ALARM_TEMP1?"(beep)":"");
1574        } else {
1575          printf("ERROR: Can't get TEMP1 data!\n");
1576        }
1577      }
1578    }
1579  } else
1580    printf("ERROR: Can't get TEMP1 data!\n");
1581  free_the_label(&label);
1582
1583  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_TEMP2,&label,&valid) &&
1584      !sensors_get_feature(*name,SENSORS_W83781D_TEMP2,&cur) &&
1585      !sensors_get_feature(*name,SENSORS_W83781D_TEMP2_HYST,&min) &&
1586      !sensors_get_feature(*name,SENSORS_W83781D_TEMP2_OVER,&max)) {
1587    if (valid) {
1588      if((!is82d) && (!is83s)) {
1589        print_label(label,10);
1590        printf("%+3.1f C   (limit = %+3.1f C, hysteresis = %+3.1f C) %s  %s\n",
1591               cur,max,min, alarms&W83781D_ALARM_TEMP23 ?"ALARM":"     ",
1592               beeps&W83781D_ALARM_TEMP23?"(beep)":"");
1593      } else {
1594        if(!sensors_get_feature(*name,SENSORS_W83781D_SENS2,&sens)) {
1595          print_label(label,10);
1596          printf(
1597  "%+3.1f C  (limit = %+3.1f C, hysteresis = %+3.1f C, sensor = %s) %s  %s\n",
1598                 cur,max,min,
1599                 (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)?
1600                 "3904 transistor":"thermistor",
1601                 alarms&W83781D_ALARM_TEMP2?"ALARM":"     ",
1602                 beeps&W83781D_ALARM_TEMP2?"(beep)":"");
1603        } else {
1604          printf("ERROR: Can't get TEMP2 data!\n");
1605        }
1606      }
1607    }
1608  } else
1609    printf("ERROR: Can't get TEMP2 data!\n");
1610  free_the_label(&label);
1611
1612  if (!is83s) {
1613    if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_TEMP3,&label,&valid) &&
1614        !sensors_get_feature(*name,SENSORS_W83781D_TEMP3,&cur) &&
1615        !sensors_get_feature(*name,SENSORS_W83781D_TEMP3_HYST,&min) &&
1616        !sensors_get_feature(*name,SENSORS_W83781D_TEMP3_OVER,&max)) {
1617      if (valid) {
1618        if(!is82d) {
1619          print_label(label,10);
1620          printf("%+3.1f C   (limit = %+3.1f C, hysteresis = %+3.1f C) %s  %s\n",
1621                 cur,max,min, alarms&W83781D_ALARM_TEMP23 ?"ALARM":"     ",
1622                 beeps&W83781D_ALARM_TEMP23?"(beep)":"");
1623        } else {
1624          if(!sensors_get_feature(*name,SENSORS_W83781D_SENS3,&sens)) {
1625            print_label(label,10);
1626            printf(
1627  "%+3.1f C  (limit = %+3.1f C, hysteresis = %+3.1f C, sensor = %s) %s  %s\n",
1628                   cur,max,min,
1629                   (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)?
1630                   "3904 transistor":"thermistor",
1631                   alarms&W83781D_ALARM_TEMP3?"ALARM":"     ",
1632                   beeps&W83781D_ALARM_TEMP3?"(beep)":"");
1633          } else {
1634            printf("ERROR: Can't get TEMP3 data!\n");
1635          }
1636        }
1637      }
1638    } else
1639      printf("ERROR: Can't get TEMP3 data!\n");
1640    free_the_label(&label);
1641  }
1642
1643  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_VID,&label,&valid) &&
1644      !sensors_get_feature(*name,SENSORS_W83781D_VID,&cur)) {
1645    if (valid) {
1646      print_label(label,10);
1647      printf("%+5.2f V\n",cur);
1648    }
1649  }
1650  free_the_label(&label);
1651   
1652  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_ALARMS,&label,&valid)
1653      && valid) {
1654    print_label(label,10);
1655    printf("Chassis intrusion detection                      %s  %s\n",
1656           alarms & W83781D_ALARM_CHAS?"ALARM":"     ",
1657           beeps & W83781D_ALARM_CHAS?"(beep)":"");
1658  }
1659  free_the_label(&label);
1660
1661  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_BEEP_ENABLE,&label,&valid)
1662      && valid) {
1663    if (!sensors_get_feature(*name,SENSORS_W83781D_BEEP_ENABLE,&cur)) {
1664      print_label(label,10);
1665      if (cur < 0.5) 
1666        printf("Sound alarm disabled\n");
1667      else
1668        printf("Sound alarm enabled\n");
1669    } else
1670      printf("ERROR: Can't get BEEP data!\n");
1671  }
1672  free_the_label(&label);
1673}
1674
1675void print_maxilife(const sensors_chip_name *name)
1676{
1677   char  *label = NULL;
1678   double cur, min, max;
1679   int    alarms,valid;
1680
1681   if (!sensors_get_feature(*name, SENSORS_MAXI_CG_ALARMS, &cur)) 
1682      alarms = cur + 0.5;
1683   else {
1684      printf("ERROR: Can't get alarm data!\n");
1685      alarms = 0;
1686   }
1687
1688   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP1, &label,&valid) &&
1689       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP1, &cur) &&
1690       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP1_MAX, &max) &&
1691       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP1_HYST, &min)) {
1692      if (valid && (cur || max || min)) {
1693         print_label(label, 12);
1694         printf("%+3.1f C     (limit = %+3.1f C, hysteresis = %+3.1f C)\n",
1695                cur, max, min);
1696      }
1697   } else
1698      printf("ERROR: Can't get TEMP1 data!\n");
1699   free_the_label(&label);
1700
1701   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP2, &label,&valid) &&
1702       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP2, &cur) &&
1703       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP2_MAX, &max) &&
1704       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP2_HYST, &min)) {
1705      if (valid && (cur || max || min)) {
1706         print_label(label, 12);
1707         printf("%+3.1f C     (limit = %+3.1f C, hysteresis = %+3.1f C) %s\n",
1708                cur, max, min, alarms&MAXI_ALARM_TEMP2 ? "ALARM" : "");
1709      }
1710   } else
1711      printf("ERROR: Can't get TEMP2 data!\n");
1712   free_the_label(&label);
1713
1714   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP3, &label,&valid) &&
1715       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP3, &cur) &&
1716       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP3_MAX, &max) &&
1717       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP3_HYST, &min)) {
1718      if (valid && (cur || max || min)) {
1719         print_label(label, 12);
1720         printf("%+3.1f C     (limit = %+3.1f C, hysteresis = %+3.1f C)\n",
1721                cur, max, min);
1722      }
1723   } else
1724      printf("ERROR: Can't get TEMP3 data!\n");
1725   free_the_label(&label);
1726
1727   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP4, &label,&valid) &&
1728       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP4, &cur) &&
1729       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP4_MAX, &max) &&
1730       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP4_HYST, &min)) {
1731      if (valid && (cur || max || min)) {
1732         print_label(label, 12);
1733         printf("%+3.1f C     (limit = %+3.1f C, hysteresis = %+3.1f C) %s\n",
1734                cur, max, min, alarms&MAXI_ALARM_TEMP4 ? "ALARM" : "");
1735      }
1736   } else
1737      printf("ERROR: Can't get TEMP4 data!\n");
1738   free_the_label(&label);
1739
1740   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP5, &label,&valid) &&
1741       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP5, &cur) &&
1742       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP5_MAX, &max) &&
1743       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP5_HYST, &min)) {
1744      if (valid && (cur || max || min)) {
1745         print_label(label, 12);
1746         printf("%+3.1f C     (limit = %+3.1f C, hysteresis = %+3.1f C) %s\n",
1747                cur, max, min, alarms&MAXI_ALARM_TEMP5 ? "ALARM" : "");
1748      }
1749   } else
1750      printf("ERROR: Can't get TEMP5 data!\n");
1751   free_the_label(&label);
1752   
1753   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_FAN1, &label,&valid) &&
1754       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN1, &cur) &&
1755       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN1_MIN, &min) &&
1756       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN1_DIV, &max)) {
1757      if (valid && (cur || min || max)) {
1758         print_label(label, 12);
1759         if (cur < 0)
1760            printf("  OFF       (min = %4.0f RPM, div = %1.0f)      %s\n",
1761                   min/max, max, alarms&MAXI_ALARM_FAN1 ? "ALARM" : "");
1762         else
1763            printf("%5.0f RPM   (min = %4.0f RPM, div = %1.0f)      %s\n",
1764                   cur/max, min/max, max, alarms&MAXI_ALARM_FAN1 ? "ALARM" : "");
1765      }
1766   } else
1767      printf("ERROR: Can't get FAN1 data!\n");
1768   free_the_label(&label);
1769
1770   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_FAN2, &label,&valid) &&
1771       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN2, &cur) &&
1772       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN2_MIN, &min) &&
1773       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN2_DIV, &max)) {
1774      if (valid && (cur || min || max)) {
1775         print_label(label, 12);
1776         if (cur < 0)
1777            printf("  OFF       (min = %4.0f RPM, div = %1.0f)      %s\n",
1778                   min/max, max, alarms&MAXI_ALARM_FAN2 ? "ALARM" : "");
1779         else
1780            printf("%5.0f RPM   (min = %4.0f RPM, div = %1.0f)      %s\n",
1781                   cur/max, min/max, max, alarms&MAXI_ALARM_FAN2 ? "ALARM" : "");
1782      }
1783   } else
1784      printf("ERROR: Can't get FAN2 data!\n");
1785   free_the_label(&label);
1786
1787   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_FAN3, &label,&valid) &&
1788       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN3, &cur) &&
1789       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN3_MIN, &min) &&
1790       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN3_DIV, &max)) {
1791      if (valid && (cur || min || max)) {
1792         print_label(label, 12);
1793         if (cur < 0)
1794            printf("  OFF       (min = %4.0f RPM, div = %1.0f)      %s\n",
1795                   min/max, max, alarms&MAXI_ALARM_FAN3 ? "ALARM" : "");
1796         else
1797            printf("%5.0f RPM   (min = %4.0f RPM, div = %1.0f)      %s\n",
1798                   cur/max, min/max, max, alarms&MAXI_ALARM_FAN3 ? "ALARM" : "");
1799      }
1800   } else
1801      printf("ERROR: Can't get FAN3 data!\n");
1802   free_the_label(&label);
1803
1804   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_PLL, &label,&valid) &&
1805       !sensors_get_feature(*name, SENSORS_MAXI_CG_PLL, &cur) &&
1806       !sensors_get_feature(*name, SENSORS_MAXI_CG_PLL_MIN, &min) &&
1807       !sensors_get_feature(*name, SENSORS_MAXI_CG_PLL_MAX, &max)) {
1808      if (valid && (cur || min || max)) {
1809         print_label(label, 12);
1810         printf("%4.2f MHz   (min = %4.2f MHz, max = %4.2f MHz) %s\n",
1811                cur, min, max, alarms&MAXI_ALARM_PLL ? "ALARM" : "");
1812      }
1813   } else
1814      printf("ERROR: Can't get PLL data!\n");
1815   free_the_label(&label);
1816
1817   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID1, &label,&valid) &&
1818       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID1, &cur) &&
1819       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID1_MIN, &min) &&
1820       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID1_MAX, &max)) {
1821      if (valid && (cur || min || max)) {
1822         print_label(label, 12);
1823         printf("%+6.2f V    (min = %+6.2f V, max = %+6.2f V)   %s\n",
1824                cur, min, max, alarms&MAXI_ALARM_VID1 ? "ALARM" : "");
1825      }
1826   } else
1827      printf("ERROR: Can't get VID1 data!\n");
1828   free_the_label(&label);
1829
1830   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID2, &label,&valid) &&
1831       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID2, &cur) &&
1832       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID2_MIN, &min) &&
1833       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID2_MAX, &max)) {
1834      if (valid && (cur || min || max)) {
1835         print_label(label, 12);
1836         printf("%+6.2f V    (min = %+6.2f V, max = %+6.2f V)   %s\n",
1837                cur, min, max, alarms&MAXI_ALARM_VID2 ? "ALARM" : "");
1838      }
1839   } else
1840      printf("ERROR: Can't get VID2 data!\n");
1841   free_the_label(&label);
1842
1843   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID3, &label,&valid) &&
1844       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID3, &cur) &&
1845       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID3_MIN, &min) &&
1846       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID3_MAX, &max)) {
1847      if (valid && (cur || min || max)) {
1848         print_label(label, 12);
1849         printf("%+6.2f V    (min = %+6.2f V, max = %+6.2f V)   %s\n",
1850                cur, min, max, alarms&MAXI_ALARM_VID3 ? "ALARM" : "");
1851      }
1852   } else
1853      printf("ERROR: Can't get VID3 data!\n");
1854   free_the_label(&label);
1855
1856   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID4, &label,&valid) &&
1857       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID4, &cur) &&
1858       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID4_MIN, &min) &&
1859       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID4_MAX, &max)) {
1860      if (valid && (cur || min || max)) {
1861         print_label(label, 12);
1862         printf("%+6.2f V    (min = %+6.2f V, max = %+6.2f V)   %s\n",
1863                cur, min, max, alarms&MAXI_ALARM_VID4 ? "ALARM" : "");
1864      }
1865   } else
1866      printf("ERROR: Can't get VID4 data!\n");
1867   free_the_label(&label);
1868}
1869
1870void print_ddcmon(const sensors_chip_name *name)
1871{
1872        char  *label = NULL;
1873        double a, b;
1874        int    valid, i;
1875        char  s[8];
1876       
1877   if (!sensors_get_label_and_valid(*name, SENSORS_DDCMON_ID, &label,&valid) &&
1878       !sensors_get_feature(*name, SENSORS_DDCMON_ID, &a)) {
1879      if (valid) {
1880        i = (int) a;   
1881        s[0] = ((i >> 10) & 0x1f) | 0x40;
1882        s[1] = ((i >> 5) & 0x1f) | 0x40;
1883        s[2] = (i & 0x1f) | 0x40;
1884        s[3] = ((i >> 20) & 0x0f) + '0';
1885        s[4] = ((i >> 16) & 0x0f) + '0';
1886        s[5] = ((i >> 28) & 0x0f) + '0';
1887        s[6] = ((i >> 24) & 0x0f) + '0';
1888        s[7] = 0;
1889         print_label(label, 24);
1890         printf("%s\n", s);
1891      }
1892   } else
1893      printf("ERROR: data 1\n");
1894   free_the_label(&label);
1895
1896   if (!sensors_get_label_and_valid(*name, SENSORS_DDCMON_SERIAL, &label,&valid) &&
1897       !sensors_get_feature(*name, SENSORS_DDCMON_SERIAL, &a)) {
1898      if (valid) {
1899         print_label(label, 24);
1900         printf("%d\n", (int) a);
1901      }
1902   } else
1903      printf("ERROR: data 2\n");
1904   free_the_label(&label);
1905
1906   if (!sensors_get_label_and_valid(*name, SENSORS_DDCMON_VERSIZE, &label,&valid) &&
1907       !sensors_get_feature(*name, SENSORS_DDCMON_VERSIZE, &a) &&
1908       !sensors_get_feature(*name, SENSORS_DDCMON_HORSIZE, &b)) {
1909      if (valid) {
1910         print_label(label, 24);
1911         printf("%dx%d\n", (int) a, (int) b);
1912      }
1913   } else
1914      printf("ERROR: data 3\n");
1915   free_the_label(&label);
1916
1917   if (!sensors_get_label_and_valid(*name, SENSORS_DDCMON_VERSYNCMIN, &label,&valid) &&
1918       !sensors_get_feature(*name, SENSORS_DDCMON_VERSYNCMIN, &a) &&
1919       !sensors_get_feature(*name, SENSORS_DDCMON_VERSYNCMAX, &b)) {
1920      if (valid) {
1921         print_label(label, 24);
1922         printf("%d-%d\n", (int) a, (int) b);
1923      }
1924   } else
1925      printf("ERROR: data 4\n");
1926   free_the_label(&label);
1927
1928   if (!sensors_get_label_and_valid(*name, SENSORS_DDCMON_HORSYNCMIN, &label,&valid) &&
1929       !sensors_get_feature(*name, SENSORS_DDCMON_HORSYNCMIN, &a) &&
1930       !sensors_get_feature(*name, SENSORS_DDCMON_HORSYNCMAX, &b)) {
1931      if (valid) {
1932         print_label(label, 24);
1933         printf("%d-%d\n", (int) a, (int) b);
1934      }
1935   } else
1936      printf("ERROR: data 5\n");
1937   free_the_label(&label);
1938
1939}
1940
1941void print_eeprom(const sensors_chip_name *name)
1942{
1943        char  *label = NULL;
1944        double a, b, c, d;
1945        int    valid, i;
1946
1947   if (!sensors_get_label_and_valid(*name, SENSORS_EEPROM_TYPE, &label,&valid) &&
1948       !sensors_get_feature(*name, SENSORS_EEPROM_TYPE, &a)) {
1949      if (valid) {
1950        if(((int) a) != 4)     
1951            return;
1952         print_label(label, 24);
1953         printf("SDRAM DIMM SPD\n");
1954      }
1955   } else
1956      printf("ERROR: data 1\n");
1957   free_the_label(&label);
1958
1959   if (!sensors_get_label_and_valid(*name, SENSORS_EEPROM_ROWADDR, &label,&valid) &&
1960       !sensors_get_feature(*name, SENSORS_EEPROM_ROWADDR, &a) &&
1961       !sensors_get_feature(*name, SENSORS_EEPROM_COLADDR, &b) &&
1962       !sensors_get_feature(*name, SENSORS_EEPROM_NUMROWS, &c) &&
1963       !sensors_get_feature(*name, SENSORS_EEPROM_BANKS, &d)) {
1964      if (valid) {
1965         print_label(label, 24);
1966         i = (((int) a) & 0x0f) + (((int) b) & 0x0f) - 17;
1967         if(i > 0 && i <= 12 && c <= 8 && d <= 8)
1968                 printf("%d\n", (1 << i) * ((int) c) * ((int) d));
1969         else
1970{
1971                 printf("invalid\n");
1972printf("%d %d %d %d\n", (int) a, (int) b, (int) c, (int) d);
1973}
1974      }
1975   } else
1976      printf("ERROR: data 2\n");
1977   free_the_label(&label);
1978
1979}
1980
1981void print_unknown_chip(const sensors_chip_name *name)
1982{
1983  int a,b,valid;
1984  const sensors_feature_data *data;
1985  char *label;
1986  double val;
1987 
1988  a=b=0;
1989  while((data=sensors_get_all_features(*name,&a,&b))) {
1990    if (sensors_get_label_and_valid(*name,data->number,&label,&valid)) {
1991      printf("ERROR: Can't get feature `%s' data!",data->name);
1992      continue;
1993    }
1994    if (! valid)
1995      continue;
1996    if (data->mode & SENSORS_MODE_R) {
1997      if(sensors_get_feature(*name,data->number,&val)) {
1998        printf("ERROR: Can't get feature `%s' data!",data->name);
1999        continue;
2000      }
2001      if (data->mapping != SENSORS_NO_MAPPING)
2002        printf("  %s: %.2f (%s)\n",label,val,data->name);
2003      else
2004        printf("%s: %.2f (%s)\n",label,val,data->name);
2005    } else 
2006      printf("(%s)",label);
2007  }
2008}
2009
Note: See TracBrowser for help on using the browser.