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

Revision 935, 77.8 KB (checked in by mds, 13 years ago)

(mds) add ds1621 driver from Christian Zuckschwerdt (zany@…)

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