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

Revision 716, 59.2 KB (checked in by mds, 13 years ago)

(mds) added simple eeprom and ddcmon support to sensors and libsensors.

  • 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(*name,SENSORS_SIS5595_ALARMS,&label)) {
419    print_label(label,10);
420    printf("Board temperature input (usually LM75 chips) %s\n",
421           alarms & SIS5595_ALARM_BTI?"ALARM":"     ");
422  }
423  free_the_label(&label);
424}
425
426void print_lm78(const sensors_chip_name *name)
427{
428  char *label = NULL;
429  double cur,min,max,fdiv;
430  int alarms,valid;
431
432  if (!sensors_get_feature(*name,SENSORS_LM78_ALARMS,&cur)) 
433    alarms = cur + 0.5;
434  else {
435    printf("ERROR: Can't get alarm data!\n");
436    alarms = 0;
437  }
438
439
440  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN0,&label,&valid) &&
441      !sensors_get_feature(*name,SENSORS_LM78_IN0,&cur) &&
442      !sensors_get_feature(*name,SENSORS_LM78_IN0_MIN,&min) &&
443      !sensors_get_feature(*name,SENSORS_LM78_IN0_MAX,&max)) {
444    if (valid) {
445      print_label(label,10);
446      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
447             cur,min,max,alarms&LM78_ALARM_IN0?"ALARM":"");
448    }
449  } else
450    printf("ERROR: Can't get IN0 data!\n");
451  free_the_label(&label);
452  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN1,&label,&valid) &&
453      !sensors_get_feature(*name,SENSORS_LM78_IN1,&cur) &&
454      !sensors_get_feature(*name,SENSORS_LM78_IN1_MIN,&min) &&
455      !sensors_get_feature(*name,SENSORS_LM78_IN1_MAX,&max)) {
456    if (valid) {
457      print_label(label,10);
458      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
459             cur,min,max,alarms&LM78_ALARM_IN1?"ALARM":"");
460    }
461  } else
462    printf("ERROR: Can't get IN1 data!\n");
463  free_the_label(&label);
464  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN2,&label,&valid) &&
465      !sensors_get_feature(*name,SENSORS_LM78_IN2,&cur) &&
466      !sensors_get_feature(*name,SENSORS_LM78_IN2_MIN,&min) &&
467      !sensors_get_feature(*name,SENSORS_LM78_IN2_MAX,&max)) {
468    if (valid) {
469      print_label(label,10);
470      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
471             cur,min,max,alarms&LM78_ALARM_IN2?"ALARM":"");
472    }
473  } else
474    printf("ERROR: Can't get IN2 data!\n");
475  free_the_label(&label);
476  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN3,&label,&valid) &&
477      !sensors_get_feature(*name,SENSORS_LM78_IN3,&cur) &&
478      !sensors_get_feature(*name,SENSORS_LM78_IN3_MIN,&min) &&
479      !sensors_get_feature(*name,SENSORS_LM78_IN3_MAX,&max)) {
480    if (valid) {
481      print_label(label,10);
482      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
483             cur,min,max,alarms&LM78_ALARM_IN3?"ALARM":"");
484    }
485  } else
486    printf("ERROR: Can't get IN3 data!\n");
487  free_the_label(&label);
488  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN4,&label,&valid) &&
489      !sensors_get_feature(*name,SENSORS_LM78_IN4,&cur) &&
490      !sensors_get_feature(*name,SENSORS_LM78_IN4_MIN,&min) &&
491      !sensors_get_feature(*name,SENSORS_LM78_IN4_MAX,&max)) {
492    if (valid) {
493      print_label(label,10);
494      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
495             cur,min,max,alarms&LM78_ALARM_IN4?"ALARM":"");
496    }
497  } else
498    printf("ERROR: Can't get IN4 data!\n");
499  free_the_label(&label);
500  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN5,&label,&valid) &&
501      !sensors_get_feature(*name,SENSORS_LM78_IN5,&cur) &&
502      !sensors_get_feature(*name,SENSORS_LM78_IN5_MIN,&min) &&
503      !sensors_get_feature(*name,SENSORS_LM78_IN5_MAX,&max)) {
504    if (valid) {
505      print_label(label,10);
506      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
507             cur,min,max,alarms&LM78_ALARM_IN5?"ALARM":"");
508    }
509  } else
510    printf("ERROR: Can't get IN5 data!\n");
511  free_the_label(&label);
512  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN6,&label,&valid) &&
513      !sensors_get_feature(*name,SENSORS_LM78_IN6,&cur) &&
514      !sensors_get_feature(*name,SENSORS_LM78_IN6_MIN,&min) &&
515      !sensors_get_feature(*name,SENSORS_LM78_IN6_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&LM78_ALARM_IN6?"ALARM":"");
520    }
521  } else
522    printf("ERROR: Can't get IN6 data!\n");
523  free_the_label(&label);
524
525  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_FAN1,&label,&valid) &&
526      !sensors_get_feature(*name,SENSORS_LM78_FAN1,&cur) &&
527      !sensors_get_feature(*name,SENSORS_LM78_FAN1_DIV,&fdiv) &&
528      !sensors_get_feature(*name,SENSORS_LM78_FAN1_MIN,&min)) {
529    if (valid) {
530      print_label(label,10);
531      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
532             cur,min,fdiv, alarms&LM78_ALARM_FAN1?"ALARM":"");
533    }
534  } else
535    printf("ERROR: Can't get FAN1 data!\n");
536  free_the_label(&label);
537  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_FAN2,&label,&valid) &&
538      !sensors_get_feature(*name,SENSORS_LM78_FAN2,&cur) &&
539      !sensors_get_feature(*name,SENSORS_LM78_FAN2_DIV,&fdiv) &&
540      !sensors_get_feature(*name,SENSORS_LM78_FAN2_MIN,&min)) {
541    if (valid) {
542      print_label(label,10);
543      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
544             cur,min,fdiv, alarms&LM78_ALARM_FAN2?"ALARM":"");
545    }
546  } else
547    printf("ERROR: Can't get FAN2 data!\n");
548  free_the_label(&label);
549  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_FAN3,&label,&valid) &&
550      !sensors_get_feature(*name,SENSORS_LM78_FAN3,&cur) &&
551      !sensors_get_feature(*name,SENSORS_LM78_FAN3_DIV,&fdiv) &&
552      !sensors_get_feature(*name,SENSORS_LM78_FAN3_MIN,&min)) {
553    if (valid) {
554      print_label(label,10);
555      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
556             cur,min,fdiv, alarms&LM78_ALARM_FAN3?"ALARM":"");
557    }
558  } else
559    printf("ERROR: Can't get FAN3 data!\n");
560  free_the_label(&label);
561
562  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_TEMP,&label,&valid) &&
563      !sensors_get_feature(*name,SENSORS_LM78_TEMP,&cur) &&
564      !sensors_get_feature(*name,SENSORS_LM78_TEMP_HYST,&min) &&
565      !sensors_get_feature(*name,SENSORS_LM78_TEMP_OVER,&max)) {
566    if (valid) {
567      print_label(label,10);
568      printf("%+3.0f C     (limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
569             cur,max,min, alarms&LM78_ALARM_TEMP?"ALARM":"");
570    }
571  } else
572    printf("ERROR: Can't get TEMP data!\n");
573  free_the_label(&label);
574
575  if (!sensors_get_label_and_valid(*name,SENSORS_LM78_VID,&label,&valid) &&
576      !sensors_get_feature(*name,SENSORS_LM78_VID,&cur)) {
577    if (valid) {
578      print_label(label,10);
579      printf("%+5.2f V\n",cur);
580    }
581  }
582  free_the_label(&label);
583   
584  if (!sensors_get_label(*name,SENSORS_LM78_ALARMS,&label)) {
585    print_label(label,10);
586    printf("Board temperature input (usually LM75 chips) %s\n",
587           alarms & LM78_ALARM_BTI?"ALARM":"");
588    print_label(label,10);
589    printf("Chassis intrusion detection                  %s\n",
590           alarms & LM78_ALARM_CHAS?"ALARM":"     ");
591  }
592  free_the_label(&label);
593}
594
595void print_gl518(const sensors_chip_name *name)
596{
597  char *label = NULL;
598  double cur,min,max,fdiv;
599  int alarms,beeps,valid;
600  int is_r00;
601
602  is_r00 = !strcmp(name->prefix,"gl518sm-r00");
603  if (!sensors_get_feature(*name,SENSORS_GL518_ALARMS,&cur)) 
604    alarms = cur + 0.5;
605  else {
606    printf("ERROR: Can't get alarm data!\n");
607    alarms = 0;
608  }
609  if (!sensors_get_feature(*name,SENSORS_GL518_BEEPS,&cur)) 
610    beeps = cur + 0.5;
611  else {
612    printf("ERROR: Can't get beep data!\n");
613    beeps = 0;
614  }
615
616  /* We need special treatment for the R00 chips, because they can't display
617     actual readings! We hardcode this, as this is the easiest way. */
618  if (is_r00) {
619    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VDD,&label,&valid) &&
620        !sensors_get_feature(*name,SENSORS_GL518_VDD,&cur) &&
621        !sensors_get_feature(*name,SENSORS_GL518_VDD_MIN,&min) &&
622        !sensors_get_feature(*name,SENSORS_GL518_VDD_MAX,&max)) {
623      if (valid) {
624        print_label(label,10);
625        if (cur == 0.0)
626          printf("(n/a)     ");
627        else
628          printf("%+6.2f V  ",cur);
629        printf(  "(min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
630               min,max,alarms&GL518_ALARM_VDD?"ALARM":"     ",
631               beeps&GL518_ALARM_VDD?"(beep)":"");
632      }
633    } else
634      printf("ERROR: Can't get VDD data!\n");
635    free_the_label(&label);
636
637    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN1,&label,&valid) &&
638        !sensors_get_feature(*name,SENSORS_GL518_VIN1,&cur) &&
639        !sensors_get_feature(*name,SENSORS_GL518_VIN1_MIN,&min) &&
640        !sensors_get_feature(*name,SENSORS_GL518_VIN1_MAX,&max)) {
641      if (valid) {
642        print_label(label,10);
643        if (cur == 0.0)
644          printf("(n/a)     ");
645        else
646          printf("%+6.2f V  ",cur);
647        printf("(min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
648               min,max,alarms&GL518_ALARM_VIN1?"ALARM":"     ",
649               beeps&GL518_ALARM_VIN1?"(beep)":"");
650      }
651    } else
652      printf("ERROR: Can't get VIN1 data!\n");
653    free_the_label(&label);
654    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN2,&label,&valid) &&
655        !sensors_get_feature(*name,SENSORS_GL518_VIN2,&cur) &&
656        !sensors_get_feature(*name,SENSORS_GL518_VIN2_MIN,&min) &&
657        !sensors_get_feature(*name,SENSORS_GL518_VIN2_MAX,&max)) {
658      if (valid) {
659        print_label(label,10);
660        if (cur == 0.0)
661          printf("(n/a)     ");
662        else
663          printf("%+6.2f V  ",cur);
664        printf("(min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
665               min,max,alarms&GL518_ALARM_VIN2?"ALARM":"     ",
666               beeps&GL518_ALARM_VIN2?"(beep)":"");
667      }
668    } else
669      printf("ERROR: Can't get IN2 data!\n");
670    free_the_label(&label);
671  } else {
672    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VDD,&label,&valid) &&
673        !sensors_get_feature(*name,SENSORS_GL518_VDD,&cur) &&
674        !sensors_get_feature(*name,SENSORS_GL518_VDD_MIN,&min) &&
675        !sensors_get_feature(*name,SENSORS_GL518_VDD_MAX,&max)) {
676      if (valid) {
677        print_label(label,10);
678        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
679               cur,min,max,alarms&GL518_ALARM_VDD?"ALARM":"     ",
680               beeps&GL518_ALARM_VDD?"(beep)":"");
681      }
682    } else
683      printf("ERROR: Can't get VDD data!\n");
684    free_the_label(&label);
685    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN1,&label,&valid) &&
686        !sensors_get_feature(*name,SENSORS_GL518_VIN1,&cur) &&
687        !sensors_get_feature(*name,SENSORS_GL518_VIN1_MIN,&min) &&
688        !sensors_get_feature(*name,SENSORS_GL518_VIN1_MAX,&max)) {
689      if (valid) {
690        print_label(label,10);
691        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
692               cur,min,max,alarms&GL518_ALARM_VIN1?"ALARM":"     ",
693               beeps&GL518_ALARM_VIN1?"(beep)":"");
694      }
695    } else
696      printf("ERROR: Can't get VIN1 data!\n");
697    free_the_label(&label);
698    if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN2,&label,&valid) &&
699        !sensors_get_feature(*name,SENSORS_GL518_VIN2,&cur) &&
700        !sensors_get_feature(*name,SENSORS_GL518_VIN2_MIN,&min) &&
701        !sensors_get_feature(*name,SENSORS_GL518_VIN2_MAX,&max)) {
702      if (valid) {
703        print_label(label,10);
704        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
705               cur,min,max,alarms&GL518_ALARM_VIN2?"ALARM":"     ",
706               beeps&GL518_ALARM_VIN2?"(beep)":"");
707      }
708    } else
709      printf("ERROR: Can't get IN2 data!\n");
710    free_the_label(&label);
711  }
712
713  if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN3,&label,&valid) &&
714      !sensors_get_feature(*name,SENSORS_GL518_VIN3,&cur) &&
715      !sensors_get_feature(*name,SENSORS_GL518_VIN3_MIN,&min) &&
716      !sensors_get_feature(*name,SENSORS_GL518_VIN3_MAX,&max)) {
717    if (valid) {
718      print_label(label,10);
719      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s  %s\n",
720             cur,min,max,alarms&GL518_ALARM_VIN3?"ALARM":"     ",
721             beeps&GL518_ALARM_VIN3?"(beep)":"");
722     }
723  } else
724    printf("ERROR: Can't get VIN3 data!\n");
725  free_the_label(&label);
726 
727  if (!sensors_get_label_and_valid(*name,SENSORS_GL518_FAN1,&label,&valid) &&
728      !sensors_get_feature(*name,SENSORS_GL518_FAN1,&cur) &&
729      !sensors_get_feature(*name,SENSORS_GL518_FAN1_DIV,&fdiv) &&
730      !sensors_get_feature(*name,SENSORS_GL518_FAN1_MIN,&min)) {
731    if (valid) {
732      print_label(label,10);
733      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s  %s\n",
734             cur,min,fdiv, alarms&GL518_ALARM_FAN1?"ALARM":"     ",
735             beeps&GL518_ALARM_FAN1?"(beep)":"");
736    }
737  } else
738    printf("ERROR: Can't get FAN1 data!\n");
739  free_the_label(&label);
740  if (!sensors_get_label_and_valid(*name,SENSORS_GL518_FAN2,&label,&valid) &&
741      !sensors_get_feature(*name,SENSORS_GL518_FAN2,&cur) &&
742      !sensors_get_feature(*name,SENSORS_GL518_FAN2_DIV,&fdiv) &&
743      !sensors_get_feature(*name,SENSORS_GL518_FAN2_MIN,&min)) {
744    if (valid) {
745      print_label(label,10);
746      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s  %s\n",
747             cur,min,fdiv, alarms&GL518_ALARM_FAN2?"ALARM":"     ",
748             beeps&GL518_ALARM_FAN2?"(beep)":"");
749    }
750  } else
751    printf("ERROR: Can't get FAN2 data!\n");
752  free_the_label(&label);
753
754  if (!sensors_get_label_and_valid(*name,SENSORS_GL518_TEMP,&label,&valid) &&
755      !sensors_get_feature(*name,SENSORS_GL518_TEMP,&cur) &&
756      !sensors_get_feature(*name,SENSORS_GL518_TEMP_OVER,&max) &&
757      !sensors_get_feature(*name,SENSORS_GL518_TEMP_HYST,&min)) {
758    if (valid) {
759      print_label(label,10);
760      printf("%+3.0f C     (limit = %+3.0f C,  hysteresis = %+3.0f C) %s  %s\n",
761             cur,max,min, alarms&GL518_ALARM_TEMP?"ALARM":"     ",
762             beeps&GL518_ALARM_TEMP?"(beep)":"");
763    }
764  } else
765    printf("ERROR: Can't get TEMP data!\n");
766  free_the_label(&label);
767
768  if (!sensors_get_label(*name,SENSORS_GL518_BEEP_ENABLE,&label) &&
769      !sensors_get_feature(*name,SENSORS_GL518_BEEP_ENABLE,&cur)) {
770    print_label(label,10);
771    if (cur < 0.5) 
772      printf("Sound alarm disabled\n");
773    else
774      printf("Sound alarm enabled\n");
775  } else
776    printf("ERROR: Can't get BEEP data!\n");
777  free_the_label(&label);
778}
779
780void print_lm80(const sensors_chip_name *name)
781{
782  char *label = NULL;
783  double cur,min,max,min2,max2,fdiv;
784  int alarms,valid;
785
786  if (!sensors_get_feature(*name,SENSORS_LM80_ALARMS,&cur)) 
787    alarms = cur + 0.5;
788  else {
789    printf("ERROR: Can't get alarm data!\n");
790    alarms = 0;
791  }
792
793  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN0,&label,&valid) &&
794      !sensors_get_feature(*name,SENSORS_LM80_IN0,&cur) &&
795      !sensors_get_feature(*name,SENSORS_LM80_IN0_MIN,&min) &&
796      !sensors_get_feature(*name,SENSORS_LM80_IN0_MAX,&max)) {
797    if (valid) {
798      print_label(label,10);
799      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
800           cur,min,max,alarms&LM80_ALARM_IN0?"ALARM":"");
801    }
802  } else
803    printf("ERROR: Can't get IN0 data!\n");
804  free_the_label(&label);
805  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN1,&label,&valid) &&
806      !sensors_get_feature(*name,SENSORS_LM80_IN1,&cur) &&
807      !sensors_get_feature(*name,SENSORS_LM80_IN1_MIN,&min) &&
808      !sensors_get_feature(*name,SENSORS_LM80_IN1_MAX,&max)) {
809    if (valid) {
810      print_label(label,10);
811      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
812           cur,min,max,alarms&LM80_ALARM_IN1?"ALARM":"");
813    }
814  } else
815    printf("ERROR: Can't get IN1 data!\n");
816  free_the_label(&label);
817  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN2,&label,&valid) &&
818      !sensors_get_feature(*name,SENSORS_LM80_IN2,&cur) &&
819      !sensors_get_feature(*name,SENSORS_LM80_IN2_MIN,&min) &&
820      !sensors_get_feature(*name,SENSORS_LM80_IN2_MAX,&max)) {
821    if (valid) {
822      print_label(label,10);
823      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
824           cur,min,max,alarms&LM80_ALARM_IN2?"ALARM":"");
825    }
826  } else
827    printf("ERROR: Can't get IN2 data!\n");
828  free_the_label(&label);
829  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN3,&label,&valid) &&
830      !sensors_get_feature(*name,SENSORS_LM80_IN3,&cur) &&
831      !sensors_get_feature(*name,SENSORS_LM80_IN3_MIN,&min) &&
832      !sensors_get_feature(*name,SENSORS_LM80_IN3_MAX,&max)) {
833    if (valid) {
834      print_label(label,10);
835      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
836           cur,min,max,alarms&LM80_ALARM_IN3?"ALARM":"");
837    }
838  } else
839    printf("ERROR: Can't get IN3 data!\n");
840  free_the_label(&label);
841  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN4,&label,&valid) &&
842      !sensors_get_feature(*name,SENSORS_LM80_IN4,&cur) &&
843      !sensors_get_feature(*name,SENSORS_LM80_IN4_MIN,&min) &&
844      !sensors_get_feature(*name,SENSORS_LM80_IN4_MAX,&max)) {
845    if (valid) {
846      print_label(label,10);
847      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
848           cur,min,max,alarms&LM80_ALARM_IN4?"ALARM":"");
849    }
850  } else
851    printf("ERROR: Can't get IN4 data!\n");
852  free_the_label(&label);
853  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN5,&label,&valid) &&
854      !sensors_get_feature(*name,SENSORS_LM80_IN5,&cur) &&
855      !sensors_get_feature(*name,SENSORS_LM80_IN5_MIN,&min) &&
856      !sensors_get_feature(*name,SENSORS_LM80_IN5_MAX,&max)) {
857    if (valid) {
858      print_label(label,10);
859      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
860           cur,min,max,alarms&LM80_ALARM_IN5?"ALARM":"");
861    }
862  } else
863    printf("ERROR: Can't get IN5 data!\n");
864  free_the_label(&label);
865  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN6,&label,&valid) &&
866      !sensors_get_feature(*name,SENSORS_LM80_IN6,&cur) &&
867      !sensors_get_feature(*name,SENSORS_LM80_IN6_MIN,&min) &&
868      !sensors_get_feature(*name,SENSORS_LM80_IN6_MAX,&max)) {
869    if (valid) {
870      print_label(label,10);
871      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)   %s\n",
872           cur,min,max,alarms&LM80_ALARM_IN6?"ALARM":"");
873    }
874  } else
875    printf("ERROR: Can't get IN6 data!\n");
876  free_the_label(&label);
877
878  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_FAN1,&label,&valid) &&
879      !sensors_get_feature(*name,SENSORS_LM80_FAN1,&cur) &&
880      !sensors_get_feature(*name,SENSORS_LM80_FAN1_DIV,&fdiv) &&
881      !sensors_get_feature(*name,SENSORS_LM80_FAN1_MIN,&min)) {
882    if (valid) {
883      print_label(label,10);
884      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
885           cur,min,fdiv, alarms&LM80_ALARM_FAN1?"ALARM":"");
886    }
887  } else
888    printf("ERROR: Can't get FAN1 data!\n");
889  free_the_label(&label);
890  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_FAN2,&label,&valid) &&
891      !sensors_get_feature(*name,SENSORS_LM80_FAN2,&cur) &&
892      !sensors_get_feature(*name,SENSORS_LM80_FAN2_DIV,&fdiv) &&
893      !sensors_get_feature(*name,SENSORS_LM80_FAN2_MIN,&min)) {
894    if (valid) {
895      print_label(label,10);
896      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)          %s\n",
897           cur,min,fdiv, alarms&LM80_ALARM_FAN2?"ALARM":"");
898    }
899  } else
900    printf("ERROR: Can't get FAN2 data!\n");
901  free_the_label(&label);
902
903  if (!sensors_get_label_and_valid(*name,SENSORS_LM80_TEMP,&label,&valid) &&
904      !sensors_get_feature(*name,SENSORS_LM80_TEMP,&cur) &&
905      !sensors_get_feature(*name,SENSORS_LM80_TEMP_HOT_HYST,&min) &&
906      !sensors_get_feature(*name,SENSORS_LM80_TEMP_HOT_MAX,&max) &&
907      !sensors_get_feature(*name,SENSORS_LM80_TEMP_OS_HYST,&min2) &&
908      !sensors_get_feature(*name,SENSORS_LM80_TEMP_OS_MAX,&max2)) {
909    if (valid) {
910      print_label(label,10);
911      printf("%+3.2f C (hot:limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
912           cur,max,min, alarms&LM80_ALARM_TEMP_HOT?"ALARM":"");
913    printf("         (os: limit = %+3.0f C,  hysteresis = %+3.0f C) %s\n",
914           max2,min2, alarms&LM80_ALARM_TEMP_HOT?"ALARM":"");
915    }
916  } else
917    printf("ERROR: Can't get TEMP data!\n");
918  free_the_label(&label);
919
920  if (!sensors_get_label(*name,SENSORS_LM80_ALARMS,&label)) {
921    if (alarms & LM80_ALARM_BTI) {
922      print_label(label,10);
923      printf("Board temperature input (a LM75 perhaps?)    ALARM\n");
924    }
925    if (alarms & LM80_ALARM_CHAS) {
926      print_label(label,10);
927      printf("Chassis intrusion detection                  ALARM\n");
928    }
929  }
930  free_the_label(&label);
931}
932
933void print_w83781d(const sensors_chip_name *name)
934{
935  char *label = NULL;
936  double cur,min,max,fdiv,sens;
937  int alarms,beeps;
938  int is82d, is83s,valid;
939
940  is82d = (!strcmp(name->prefix,"w83782d")) ||
941          (!strcmp(name->prefix,"w83627hf")) ||
942          (!strcmp(name->prefix,"as99127f"));
943  is83s = !strcmp(name->prefix,"w83783s");
944  if (!sensors_get_feature(*name,SENSORS_W83781D_ALARMS,&cur)) 
945    alarms = cur + 0.5;
946  else {
947    printf("ERROR: Can't get alarm data!\n");
948    alarms = 0;
949  }
950
951  if (!sensors_get_feature(*name,SENSORS_W83781D_BEEPS,&cur)) 
952    beeps = cur + 0.5;
953  else {
954    printf("ERROR: Can't get beep data!\n");
955    beeps = 0;
956  }
957
958  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN0,&label,&valid) &&
959      !sensors_get_feature(*name,SENSORS_W83781D_IN0,&cur) &&
960      !sensors_get_feature(*name,SENSORS_W83781D_IN0_MIN,&min) &&
961      !sensors_get_feature(*name,SENSORS_W83781D_IN0_MAX,&max)) {
962    if (valid) {
963      print_label(label,10);
964      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
965           cur,min,max,alarms&W83781D_ALARM_IN0?"ALARM":"     ",
966           beeps&W83781D_ALARM_IN0?"(beep)":"");
967    }
968  } else
969    printf("ERROR: Can't get IN0 data!\n");
970  free_the_label(&label);
971  if (!is83s) {
972    if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN1,&label,&valid) &&
973        !sensors_get_feature(*name,SENSORS_W83781D_IN1,&cur) &&
974        !sensors_get_feature(*name,SENSORS_W83781D_IN1_MIN,&min) &&
975        !sensors_get_feature(*name,SENSORS_W83781D_IN1_MAX,&max)) {
976      if (valid) {
977        print_label(label,10);
978        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
979             cur,min,max,alarms&W83781D_ALARM_IN1?"ALARM":"     ",
980             beeps&W83781D_ALARM_IN1?"(beep)":"");
981      }
982    } else
983      printf("ERROR: Can't get IN1 data!\n");
984    free_the_label(&label);
985  }
986  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN2,&label,&valid) &&
987      !sensors_get_feature(*name,SENSORS_W83781D_IN2,&cur) &&
988      !sensors_get_feature(*name,SENSORS_W83781D_IN2_MIN,&min) &&
989      !sensors_get_feature(*name,SENSORS_W83781D_IN2_MAX,&max)) {
990    if (valid) {
991      print_label(label,10);
992      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
993           cur,min,max,alarms&W83781D_ALARM_IN2?"ALARM":"     ",
994           beeps&W83781D_ALARM_IN2?"(beep)":"");
995    }
996  } else
997    printf("ERROR: Can't get IN2 data!\n");
998  free_the_label(&label);
999  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN3,&label,&valid) &&
1000      !sensors_get_feature(*name,SENSORS_W83781D_IN3,&cur) &&
1001      !sensors_get_feature(*name,SENSORS_W83781D_IN3_MIN,&min) &&
1002      !sensors_get_feature(*name,SENSORS_W83781D_IN3_MAX,&max)) {
1003    if (valid) {
1004      print_label(label,10);
1005      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1006           cur,min,max,alarms&W83781D_ALARM_IN3?"ALARM":"     ",
1007           beeps&W83781D_ALARM_IN3?"(beep)":"");
1008    }
1009  } else
1010    printf("ERROR: Can't get IN3 data!\n");
1011  free_the_label(&label);
1012  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN4,&label,&valid) &&
1013      !sensors_get_feature(*name,SENSORS_W83781D_IN4,&cur) &&
1014      !sensors_get_feature(*name,SENSORS_W83781D_IN4_MIN,&min) &&
1015      !sensors_get_feature(*name,SENSORS_W83781D_IN4_MAX,&max)) {
1016    if (valid) {
1017      print_label(label,10);
1018      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1019           cur,min,max,alarms&W83781D_ALARM_IN4?"ALARM":"     ",
1020           beeps&W83781D_ALARM_IN4?"(beep)":"");
1021    }
1022  } else
1023    printf("ERROR: Can't get IN4 data!\n");
1024  free_the_label(&label);
1025  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN5,&label,&valid) &&
1026      !sensors_get_feature(*name,SENSORS_W83781D_IN5,&cur) &&
1027      !sensors_get_feature(*name,SENSORS_W83781D_IN5_MIN,&min) &&
1028      !sensors_get_feature(*name,SENSORS_W83781D_IN5_MAX,&max)) {
1029    if (valid) {
1030      print_label(label,10);
1031      printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1032           cur,min,max,alarms&W83781D_ALARM_IN5?"ALARM":"     ",
1033           beeps&W83781D_ALARM_IN5?"(beep)":"");
1034    }
1035  } else
1036    printf("ERROR: Can't get IN5 data!\n");
1037  free_the_label(&label);
1038  if (!is83s) {
1039    if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN6,&label,&valid) &&
1040        !sensors_get_feature(*name,SENSORS_W83781D_IN6,&cur) &&
1041        !sensors_get_feature(*name,SENSORS_W83781D_IN6_MIN,&min) &&
1042        !sensors_get_feature(*name,SENSORS_W83781D_IN6_MAX,&max)) {
1043      if (valid) {
1044        print_label(label,10);
1045        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1046             cur,min,max,alarms&W83781D_ALARM_IN6?"ALARM":"     ",
1047             beeps&W83781D_ALARM_IN6?"(beep)":"");
1048      }
1049    } else
1050      printf("ERROR: Can't get IN6 data!\n");
1051    free_the_label(&label);
1052  }
1053  if (is82d) {
1054    if (!sensors_get_label_and_valid(*name,SENSORS_W83782D_IN7,&label,&valid) &&
1055        !sensors_get_feature(*name,SENSORS_W83782D_IN7,&cur) &&
1056        !sensors_get_feature(*name,SENSORS_W83782D_IN7_MIN,&min) &&
1057        !sensors_get_feature(*name,SENSORS_W83782D_IN7_MAX,&max)) {
1058      if (valid) {
1059        print_label(label,10);
1060        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1061             cur,min,max,alarms&W83782D_ALARM_IN7?"ALARM":"     ",
1062             beeps&W83782D_ALARM_IN7?"(beep)":"");
1063      }
1064    } else
1065      printf("ERROR: Can't get IN7 data!\n");
1066    free_the_label(&label);
1067    if (!sensors_get_label_and_valid(*name,SENSORS_W83782D_IN8,&label,&valid) &&
1068        !sensors_get_feature(*name,SENSORS_W83782D_IN8,&cur) &&
1069        !sensors_get_feature(*name,SENSORS_W83782D_IN8_MIN,&min) &&
1070        !sensors_get_feature(*name,SENSORS_W83782D_IN8_MAX,&max)) {
1071      if (valid) {
1072        print_label(label,10);
1073        printf("%+6.2f V  (min = %+6.2f V, max = %+6.2f V)       %s  %s\n",
1074             cur,min,max,alarms&W83782D_ALARM_IN8?"ALARM":"     ",
1075             beeps&W83782D_ALARM_IN8?"(beep)":"");
1076      }
1077    } else
1078      printf("ERROR: Can't get IN6 data!\n");
1079    free_the_label(&label);
1080  }
1081
1082  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_FAN1,&label,&valid) &&
1083      !sensors_get_feature(*name,SENSORS_W83781D_FAN1,&cur) &&
1084      !sensors_get_feature(*name,SENSORS_W83781D_FAN1_DIV,&fdiv) &&
1085      !sensors_get_feature(*name,SENSORS_W83781D_FAN1_MIN,&min)) {
1086    if (valid) {
1087      print_label(label,10);
1088      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)              %s  %s\n",
1089           cur,min,fdiv, alarms&W83781D_ALARM_FAN1?"ALARM":"     ",
1090           beeps&W83781D_ALARM_FAN1?"(beep)":"");
1091    }
1092  } else
1093    printf("ERROR: Can't get FAN1 data!\n");
1094  free_the_label(&label);
1095  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_FAN2,&label,&valid) &&
1096      !sensors_get_feature(*name,SENSORS_W83781D_FAN2,&cur) &&
1097      !sensors_get_feature(*name,SENSORS_W83781D_FAN2_DIV,&fdiv) &&
1098      !sensors_get_feature(*name,SENSORS_W83781D_FAN2_MIN,&min)) {
1099    if (valid) {
1100      print_label(label,10);
1101      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)              %s  %s\n",
1102           cur,min,fdiv, alarms&W83781D_ALARM_FAN2?"ALARM":"     ",
1103           beeps&W83781D_ALARM_FAN2?"(beep)":"");
1104    }
1105  } else
1106    printf("ERROR: Can't get FAN2 data!\n");
1107  free_the_label(&label);
1108  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_FAN3,&label,&valid) &&
1109      !sensors_get_feature(*name,SENSORS_W83781D_FAN3,&cur) &&
1110      !sensors_get_feature(*name,SENSORS_W83781D_FAN3_DIV,&fdiv) &&
1111      !sensors_get_feature(*name,SENSORS_W83781D_FAN3_MIN,&min)) {
1112    if (valid) {
1113      print_label(label,10);
1114      printf("%4.0f RPM  (min = %4.0f RPM, div = %1.0f)              %s  %s\n",
1115           cur,min,fdiv, alarms&W83781D_ALARM_FAN3?"ALARM":"     ",
1116           beeps&W83781D_ALARM_FAN3?"(beep)":"");
1117    }
1118  } else
1119    printf("ERROR: Can't get FAN3 data!\n");
1120  free_the_label(&label);
1121
1122  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_TEMP1,&label,&valid) &&
1123      !sensors_get_feature(*name,SENSORS_W83781D_TEMP1,&cur) &&
1124      !sensors_get_feature(*name,SENSORS_W83781D_TEMP1_HYST,&min) &&
1125      !sensors_get_feature(*name,SENSORS_W83781D_TEMP1_OVER,&max)) {
1126    if (valid) {
1127      if((!is82d) && (!is83s)) {
1128        print_label(label,10);
1129        printf("%+3.0f C   (limit = %+3.0f C, hysteresis = %+3.0f C) %s  %s\n",
1130               cur,max,min, alarms&W83781D_ALARM_TEMP1 ?"ALARM":"     ",
1131               beeps&W83781D_ALARM_TEMP1?"(beep)":"");
1132      } else {
1133        if(!sensors_get_feature(*name,SENSORS_W83781D_SENS1,&sens)) {
1134          print_label(label,10);
1135          printf(
1136  "%+3.0f C  (limit = %+3.0f C, hysteresis = %+3.0f C, sensor = %s) %s  %s\n",
1137                 cur,max,min,
1138                 (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)?
1139                 "3904 transistor":"thermistor",
1140                 alarms&W83781D_ALARM_TEMP1?"ALARM":"     ",
1141                 beeps&W83781D_ALARM_TEMP1?"(beep)":"");
1142        } else {
1143          printf("ERROR: Can't get TEMP1 data!\n");
1144        }
1145      }
1146    }
1147  } else
1148    printf("ERROR: Can't get TEMP1 data!\n");
1149  free_the_label(&label);
1150
1151  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_TEMP2,&label,&valid) &&
1152      !sensors_get_feature(*name,SENSORS_W83781D_TEMP2,&cur) &&
1153      !sensors_get_feature(*name,SENSORS_W83781D_TEMP2_HYST,&min) &&
1154      !sensors_get_feature(*name,SENSORS_W83781D_TEMP2_OVER,&max)) {
1155    if (valid) {
1156      if((!is82d) && (!is83s)) {
1157        print_label(label,10);
1158        printf("%+3.1f C   (limit = %+3.1f C, hysteresis = %+3.1f C) %s  %s\n",
1159               cur,max,min, alarms&W83781D_ALARM_TEMP23 ?"ALARM":"     ",
1160               beeps&W83781D_ALARM_TEMP23?"(beep)":"");
1161      } else {
1162        if(!sensors_get_feature(*name,SENSORS_W83781D_SENS2,&sens)) {
1163          print_label(label,10);
1164          printf(
1165  "%+3.1f C  (limit = %+3.1f C, hysteresis = %+3.1f C, sensor = %s) %s  %s\n",
1166                 cur,max,min,
1167                 (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)?
1168                 "3904 transistor":"thermistor",
1169                 alarms&W83781D_ALARM_TEMP2?"ALARM":"     ",
1170                 beeps&W83781D_ALARM_TEMP2?"(beep)":"");
1171        } else {
1172          printf("ERROR: Can't get TEMP2 data!\n");
1173        }
1174      }
1175    }
1176  } else
1177    printf("ERROR: Can't get TEMP2 data!\n");
1178  free_the_label(&label);
1179
1180  if (!is83s) {
1181    if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_TEMP3,&label,&valid) &&
1182        !sensors_get_feature(*name,SENSORS_W83781D_TEMP3,&cur) &&
1183        !sensors_get_feature(*name,SENSORS_W83781D_TEMP3_HYST,&min) &&
1184        !sensors_get_feature(*name,SENSORS_W83781D_TEMP3_OVER,&max)) {
1185      if (valid) {
1186        if(!is82d) {
1187          print_label(label,10);
1188          printf("%+3.1f C   (limit = %+3.1f C, hysteresis = %+3.1f C) %s  %s\n",
1189                 cur,max,min, alarms&W83781D_ALARM_TEMP23 ?"ALARM":"     ",
1190                 beeps&W83781D_ALARM_TEMP23?"(beep)":"");
1191        } else {
1192          if(!sensors_get_feature(*name,SENSORS_W83781D_SENS3,&sens)) {
1193            print_label(label,10);
1194            printf(
1195  "%+3.1f C  (limit = %+3.1f C, hysteresis = %+3.1f C, sensor = %s) %s  %s\n",
1196                   cur,max,min,
1197                   (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)?
1198                   "3904 transistor":"thermistor",
1199                   alarms&W83781D_ALARM_TEMP3?"ALARM":"     ",
1200                   beeps&W83781D_ALARM_TEMP3?"(beep)":"");
1201          } else {
1202            printf("ERROR: Can't get TEMP3 data!\n");
1203          }
1204        }
1205      }
1206    } else
1207      printf("ERROR: Can't get TEMP3 data!\n");
1208    free_the_label(&label);
1209  }
1210
1211  if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_VID,&label,&valid) &&
1212      !sensors_get_feature(*name,SENSORS_W83781D_VID,&cur)) {
1213    if (valid) {
1214      print_label(label,10);
1215      printf("%+5.2f V\n",cur);
1216    }
1217  }
1218  free_the_label(&label);
1219   
1220  if (!sensors_get_label(*name,SENSORS_W83781D_ALARMS,&label)) {
1221    print_label(label,10);
1222    printf("Chassis intrusion detection                      %s  %s\n",
1223           alarms & W83781D_ALARM_CHAS?"ALARM":"     ",
1224           beeps & W83781D_ALARM_CHAS?"(beep)":"");
1225  }
1226  free_the_label(&label);
1227
1228  if (!sensors_get_label(*name,SENSORS_W83781D_BEEP_ENABLE,&label) &&
1229      !sensors_get_feature(*name,SENSORS_W83781D_BEEP_ENABLE,&cur)) {
1230    print_label(label,10);
1231    if (cur < 0.5) 
1232      printf("Sound alarm disabled\n");
1233    else
1234      printf("Sound alarm enabled\n");
1235  } else
1236    printf("ERROR: Can't get BEEP data!\n");
1237  free_the_label(&label);
1238}
1239
1240void print_maxilife(const sensors_chip_name *name)
1241{
1242   char  *label = NULL;
1243   double cur, min, max;
1244   int    alarms,valid;
1245
1246   if (!sensors_get_feature(*name, SENSORS_MAXI_CG_ALARMS, &cur)) 
1247      alarms = cur + 0.5;
1248   else {
1249      printf("ERROR: Can't get alarm data!\n");
1250      alarms = 0;
1251   }
1252
1253   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP1, &label,&valid) &&
1254       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP1, &cur) &&
1255       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP1_MAX, &max) &&
1256       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP1_HYST, &min)) {
1257      if (valid && (cur || max || min)) {
1258         print_label(label, 12);
1259         printf("%+3.1f C     (limit = %+3.1f C, hysteresis = %+3.1f C)\n",
1260                cur, max, min);
1261      }
1262   } else
1263      printf("ERROR: Can't get TEMP1 data!\n");
1264   free_the_label(&label);
1265
1266   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP2, &label,&valid) &&
1267       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP2, &cur) &&
1268       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP2_MAX, &max) &&
1269       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP2_HYST, &min)) {
1270      if (valid && (cur || max || min)) {
1271         print_label(label, 12);
1272         printf("%+3.1f C     (limit = %+3.1f C, hysteresis = %+3.1f C) %s\n",
1273                cur, max, min, alarms&MAXI_ALARM_TEMP2 ? "ALARM" : "");
1274      }
1275   } else
1276      printf("ERROR: Can't get TEMP2 data!\n");
1277   free_the_label(&label);
1278
1279   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP3, &label,&valid) &&
1280       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP3, &cur) &&
1281       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP3_MAX, &max) &&
1282       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP3_HYST, &min)) {
1283      if (valid && (cur || max || min)) {
1284         print_label(label, 12);
1285         printf("%+3.1f C     (limit = %+3.1f C, hysteresis = %+3.1f C)\n",
1286                cur, max, min);
1287      }
1288   } else
1289      printf("ERROR: Can't get TEMP3 data!\n");
1290   free_the_label(&label);
1291
1292   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP4, &label,&valid) &&
1293       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP4, &cur) &&
1294       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP4_MAX, &max) &&
1295       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP4_HYST, &min)) {
1296      if (valid && (cur || max || min)) {
1297         print_label(label, 12);
1298         printf("%+3.1f C     (limit = %+3.1f C, hysteresis = %+3.1f C) %s\n",
1299                cur, max, min, alarms&MAXI_ALARM_TEMP4 ? "ALARM" : "");
1300      }
1301   } else
1302      printf("ERROR: Can't get TEMP4 data!\n");
1303   free_the_label(&label);
1304
1305   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP5, &label,&valid) &&
1306       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP5, &cur) &&
1307       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP5_MAX, &max) &&
1308       !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP5_HYST, &min)) {
1309      if (valid && (cur || max || min)) {
1310         print_label(label, 12);
1311         printf("%+3.1f C     (limit = %+3.1f C, hysteresis = %+3.1f C) %s\n",
1312                cur, max, min, alarms&MAXI_ALARM_TEMP5 ? "ALARM" : "");
1313      }
1314   } else
1315      printf("ERROR: Can't get TEMP5 data!\n");
1316   free_the_label(&label);
1317   
1318   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_FAN1, &label,&valid) &&
1319       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN1, &cur) &&
1320       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN1_MIN, &min) &&
1321       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN1_DIV, &max)) {
1322      if (valid && (cur || min || max)) {
1323         print_label(label, 12);
1324         if (cur < 0)
1325            printf("  OFF       (min = %4.0f RPM, div = %1.0f)      %s\n",
1326                   min/max, max, alarms&MAXI_ALARM_FAN1 ? "ALARM" : "");
1327         else
1328            printf("%5.0f RPM   (min = %4.0f RPM, div = %1.0f)      %s\n",
1329                   cur/max, min/max, max, alarms&MAXI_ALARM_FAN1 ? "ALARM" : "");
1330      }
1331   } else
1332      printf("ERROR: Can't get FAN1 data!\n");
1333   free_the_label(&label);
1334
1335   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_FAN2, &label,&valid) &&
1336       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN2, &cur) &&
1337       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN2_MIN, &min) &&
1338       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN2_DIV, &max)) {
1339      if (valid && (cur || min || max)) {
1340         print_label(label, 12);
1341         if (cur < 0)
1342            printf("  OFF       (min = %4.0f RPM, div = %1.0f)      %s\n",
1343                   min/max, max, alarms&MAXI_ALARM_FAN2 ? "ALARM" : "");
1344         else
1345            printf("%5.0f RPM   (min = %4.0f RPM, div = %1.0f)      %s\n",
1346                   cur/max, min/max, max, alarms&MAXI_ALARM_FAN2 ? "ALARM" : "");
1347      }
1348   } else
1349      printf("ERROR: Can't get FAN2 data!\n");
1350   free_the_label(&label);
1351
1352   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_FAN3, &label,&valid) &&
1353       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN3, &cur) &&
1354       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN3_MIN, &min) &&
1355       !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN3_DIV, &max)) {
1356      if (valid && (cur || min || max)) {
1357         print_label(label, 12);
1358         if (cur < 0)
1359            printf("  OFF       (min = %4.0f RPM, div = %1.0f)      %s\n",
1360                   min/max, max, alarms&MAXI_ALARM_FAN3 ? "ALARM" : "");
1361         else
1362            printf("%5.0f RPM   (min = %4.0f RPM, div = %1.0f)      %s\n",
1363                   cur/max, min/max, max, alarms&MAXI_ALARM_FAN3 ? "ALARM" : "");
1364      }
1365   } else
1366      printf("ERROR: Can't get FAN3 data!\n");
1367   free_the_label(&label);
1368
1369   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_PLL, &label,&valid) &&
1370       !sensors_get_feature(*name, SENSORS_MAXI_CG_PLL, &cur) &&
1371       !sensors_get_feature(*name, SENSORS_MAXI_CG_PLL_MIN, &min) &&
1372       !sensors_get_feature(*name, SENSORS_MAXI_CG_PLL_MAX, &max)) {
1373      if (valid && (cur || min || max)) {
1374         print_label(label, 12);
1375         printf("%4.2f MHz   (min = %4.2f MHz, max = %4.2f MHz) %s\n",
1376                cur, min, max, alarms&MAXI_ALARM_PLL ? "ALARM" : "");
1377      }
1378   } else
1379      printf("ERROR: Can't get PLL data!\n");
1380   free_the_label(&label);
1381
1382   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID1, &label,&valid) &&
1383       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID1, &cur) &&
1384       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID1_MIN, &min) &&
1385       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID1_MAX, &max)) {
1386      if (valid && (cur || min || max)) {
1387         print_label(label, 12);
1388         printf("%+6.2f V    (min = %+6.2f V, max = %+6.2f V)   %s\n",
1389                cur, min, max, alarms&MAXI_ALARM_VID1 ? "ALARM" : "");
1390      }
1391   } else
1392      printf("ERROR: Can't get VID1 data!\n");
1393   free_the_label(&label);
1394
1395   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID2, &label,&valid) &&
1396       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID2, &cur) &&
1397       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID2_MIN, &min) &&
1398       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID2_MAX, &max)) {
1399      if (valid && (cur || min || max)) {
1400         print_label(label, 12);
1401         printf("%+6.2f V    (min = %+6.2f V, max = %+6.2f V)   %s\n",
1402                cur, min, max, alarms&MAXI_ALARM_VID2 ? "ALARM" : "");
1403      }
1404   } else
1405      printf("ERROR: Can't get VID2 data!\n");
1406   free_the_label(&label);
1407
1408   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID3, &label,&valid) &&
1409       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID3, &cur) &&
1410       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID3_MIN, &min) &&
1411       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID3_MAX, &max)) {
1412      if (valid && (cur || min || max)) {
1413         print_label(label, 12);
1414         printf("%+6.2f V    (min = %+6.2f V, max = %+6.2f V)   %s\n",
1415                cur, min, max, alarms&MAXI_ALARM_VID3 ? "ALARM" : "");
1416      }
1417   } else
1418      printf("ERROR: Can't get VID3 data!\n");
1419   free_the_label(&label);
1420
1421   if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID4, &label,&valid) &&
1422       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID4, &cur) &&
1423       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID4_MIN, &min) &&
1424       !sensors_get_feature(*name, SENSORS_MAXI_CG_VID4_MAX, &max)) {
1425      if (valid && (cur || min || max)) {
1426         print_label(label, 12);
1427         printf("%+6.2f V    (min = %+6.2f V, max = %+6.2f V)   %s\n",
1428                cur, min, max, alarms&MAXI_ALARM_VID4 ? "ALARM" : "");
1429      }
1430   } else
1431      printf("ERROR: Can't get VID4 data!\n");
1432   free_the_label(&label);
1433}
1434
1435void print_ddcmon(const sensors_chip_name *name)
1436{
1437        char  *label = NULL;
1438        double a, b;
1439        int    valid, i;
1440        char  s[8];
1441       
1442   if (!sensors_get_label_and_valid(*name, SENSORS_DDCMON_ID, &label,&valid) &&
1443       !sensors_get_feature(*name, SENSORS_DDCMON_ID, &a)) {
1444      if (valid) {
1445        i = (int) a;   
1446        s[0] = ((i >> 10) & 0x1f) | 0x40;
1447        s[1] = ((i >> 5) & 0x1f) | 0x40;
1448        s[2] = (i & 0x1f) | 0x40;
1449        s[3] = ((i >> 20) & 0x0f) + '0';
1450        s[4] = ((i >> 16) & 0x0f) + '0';
1451        s[5] = ((i >> 28) & 0x0f) + '0';
1452        s[6] = ((i >> 24) & 0x0f) + '0';
1453        s[7] = 0;
1454         print_label(label, 24);
1455         printf("%s\n", s);
1456      }
1457   } else
1458      printf("ERROR: data 1\n");
1459   free_the_label(&label);
1460
1461   if (!sensors_get_label_and_valid(*name, SENSORS_DDCMON_SERIAL, &label,&valid) &&
1462       !sensors_get_feature(*name, SENSORS_DDCMON_SERIAL, &a)) {
1463      if (valid) {
1464         print_label(label, 24);
1465         printf("%d\n", (int) a);
1466      }
1467   } else
1468      printf("ERROR: data 2\n");
1469   free_the_label(&label);
1470
1471   if (!sensors_get_label_and_valid(*name, SENSORS_DDCMON_VERSIZE, &label,&valid) &&
1472       !sensors_get_feature(*name, SENSORS_DDCMON_VERSIZE, &a) &&
1473       !sensors_get_feature(*name, SENSORS_DDCMON_HORSIZE, &b)) {
1474      if (valid) {
1475         print_label(label, 24);
1476         printf("%dx%d\n", (int) a, (int) b);
1477      }
1478   } else
1479      printf("ERROR: data 3\n");
1480   free_the_label(&label);
1481
1482   if (!sensors_get_label_and_valid(*name, SENSORS_DDCMON_VERSYNCMIN, &label,&valid) &&
1483       !sensors_get_feature(*name, SENSORS_DDCMON_VERSYNCMIN, &a) &&
1484       !sensors_get_feature(*name, SENSORS_DDCMON_VERSYNCMAX, &b)) {
1485      if (valid) {
1486         print_label(label, 24);
1487         printf("%d-%d\n", (int) a, (int) b);
1488      }
1489   } else
1490      printf("ERROR: data 4\n");
1491   free_the_label(&label);
1492
1493   if (!sensors_get_label_and_valid(*name, SENSORS_DDCMON_HORSYNCMIN, &label,&valid) &&
1494       !sensors_get_feature(*name, SENSORS_DDCMON_HORSYNCMIN, &a) &&
1495       !sensors_get_feature(*name, SENSORS_DDCMON_HORSYNCMAX, &b)) {
1496      if (valid) {
1497         print_label(label, 24);
1498         printf("%d-%d\n", (int) a, (int) b);
1499      }
1500   } else
1501      printf("ERROR: data 5\n");
1502   free_the_label(&label);
1503
1504}
1505
1506void print_eeprom(const sensors_chip_name *name)
1507{
1508        char  *label = NULL;
1509        double a, b, c;
1510        int    valid, i;
1511
1512   if (!sensors_get_label_and_valid(*name, SENSORS_EEPROM_TYPE, &label,&valid) &&
1513       !sensors_get_feature(*name, SENSORS_EEPROM_TYPE, &a)) {
1514      if (valid) {
1515        if(((int) a) != 4)     
1516            return;
1517         print_label(label, 24);
1518         printf("SDRAM DIMM SPD\n");
1519      }
1520   } else
1521      printf("ERROR: data 1\n");
1522   free_the_label(&label);
1523
1524   if (!sensors_get_label_and_valid(*name, SENSORS_EEPROM_ROWADDR, &label,&valid) &&
1525       !sensors_get_feature(*name, SENSORS_EEPROM_ROWADDR, &a) &&
1526       !sensors_get_feature(*name, SENSORS_EEPROM_COLADDR, &b) &&
1527       !sensors_get_feature(*name, SENSORS_EEPROM_NUMROWS, &c)) {
1528      if (valid) {
1529         print_label(label, 24);
1530         i = (((int) a) & 0x0f) + (((int) b) & 0x0f) + ((int) c) - 16;
1531         if(i > 0 && i <= 10)
1532                 printf("%d\n", 1 << i);
1533         else
1534                 printf("invalid\n");
1535      }
1536   } else
1537      printf("ERROR: data 2\n");
1538   free_the_label(&label);
1539
1540}
1541
1542void print_unknown_chip(const sensors_chip_name *name)
1543{
1544  int a,b,valid;
1545  const sensors_feature_data *data;
1546  char *label;
1547  double val;
1548 
1549  a=b=0;
1550  while((data=sensors_get_all_features(*name,&a,&b))) {
1551    if (sensors_get_label_and_valid(*name,data->number,&label,&valid)) {
1552      printf("ERROR: Can't get feature `%s' data!",data->name);
1553      continue;
1554    }
1555    if (! valid)
1556      continue;
1557    if (data->mode & SENSORS_MODE_R) {
1558      if(sensors_get_feature(*name,data->number,&val)) {
1559        printf("ERROR: Can't get feature `%s' data!",data->name);
1560        continue;
1561      }
1562      if (data->mapping != SENSORS_NO_MAPPING)
1563        printf("  %s: %.2f (%s)\n",label,val,data->name);
1564      else
1565        printf("%s: %.2f (%s)\n",label,val,data->name);
1566    } else 
1567      printf("(%s)",label);
1568  }
1569}
1570
Note: See TracBrowser for help on using the browser.