#!/usr/bin/perl
#
# $Id: i2c-stat.pl,v 0.6 2005/06/04 10:58:48 root Exp root $
#
# Prints some PC health statistics for Winbond w83627hf chip
# * Needs Kernel >= 2.6 with i2c-support
# * Voltage multipliers are from gkrellm-2.2.4.tar.bz2 (src/sysdeps/linux.c)
#
# Author: Martin Bock <martin (at) martin-bock (dot) de>
# Date:   01-May-2005

# modules
#
use File::Basename;

# variables
#
$app_name = basename($0);
$data_dir = "/sys/class/i2c-adapter/i2c-0/device/0-0290";
$cpu0_temp_file = "${data_dir}/temp1_input";
$cpu1_temp_file = "${data_dir}/temp2_input";
$mobo_temp_file = "${data_dir}/temp3_input";
$cpu0_fan_file = "${data_dir}/fan1_input";
$cpu1_fan_file = "${data_dir}/fan2_input";
$mobo_fan_file = "${data_dir}/fan3_input";
$vcor1_file ="${data_dir}/in0_input";
$vcor2_file ="${data_dir}/in1_input";
$v3_file = "${data_dir}/in2_input";
$v5_file = "${data_dir}/in3_input";
$v12_file = "${data_dir}/in4_input";
$v5sb_file ="${data_dir}/in7_input";
$vbat_file ="${data_dir}/in8_input";

# rock'n'roll
#
if (! -d $data_dir) {
  print "$data_dir not found, aborting ...\n";
  exit(1);
}

if (@ARGV == 0) {
  $count = 1;
} elsif ((@ARGV == 1) && (($ARGV[0] eq "-h") || ($ARGV[0] eq "--help"))) {
  hilfe();
  exit(0);
} elsif ((@ARGV == 1 ) && ($ARGV[0] =~ /[0-9]+/)) {
  $count = $ARGV[0];
  $delay = 15;
} elsif ((@ARGV == 2) && (($ARGV[0] =~ /[0-9]+/) && ($ARGV[1] =~ /[0-9]+/))) {
  $count = $ARGV[0];
  $delay = $ARGV[1];
} else {
  hilfe();
  exit(1);
}

pr_header();
if ($count > 1) {
  for ($i = 1; $i < $count; $i++) {
    pr_date();
    pr_data();
    sleep $delay;
  }
  pr_date();
}
pr_data();

exit(0);

# subs
#
sub hilfe() {
  print "$app_name -- prints machine's health status\n";
  print "Usage:\n";
  print "$app_name\t[c] [d]\t\t->\tprints status c times with d seconds delay\n";
  print "\t\t[-h | --help]\t->\tprints this braindead message\n";
}

sub pr_date() {
  ($sec,$min,$hour,$mday,$mon,$year,$temp) = localtime(time);
  $year += 1900; $mon ++;
  for ($mon) {
    if    (/1/)  {$mon = Jan}
    elsif (/2/)  {$mon = Feb}
    elsif (/3/)  {$mon = Mar}
    elsif (/4/)  {$mon = Apr}
    elsif (/5/)  {$mon = May}
    elsif (/6/)  {$mon = Jun}
    elsif (/7/)  {$mon = Jul}
    elsif (/8/)  {$mon = Aug}
    elsif (/9/)  {$mon = Sep}
    elsif (/10/) {$mon = Oct}
    elsif (/11/) {$mon = Nov}
    else          {Dec}
  }
  $stamp = sprintf("%02d-%3s %02d:%02d:%02d", $mday,$mon,$hour,$min,$sec);
  print "$stamp\t";
}

sub pr_data() {
  foreach $i ($cpu0_temp_file, $cpu1_temp_file, $mobo_temp_file) {
    open(SENSOR, "<$i") or die "Can't open $i: $!";
    $val = <SENSOR>;
    chomp($val);
    if (length($val) == 5) {
      $val = $val / 1000;
    }
    $val = sprintf("%.1f", $val);
    print "$val\t";
    close(SENSOR) or die "Can't close $i: $!";
  }

  foreach $i ($cpu0_fan_file, $cpu1_fan_file, $mobo_fan_file) {
    open(SENSOR, "<$i") or die "Can't open $i: $!";
    $val = <SENSOR>;
    chomp($val);
    $val = sprintf("%4d", $val);
    print "$val\t";
    close(SENSOR) or die "Can't close $i: $!";
  }

  foreach $i ($vcor1_file, $vcor2_file, $v3_file, $v5_file, $v12_file, $v5sb_file, $vbat_file) {
    open(SENSOR, "<$i") or die "Can't open $i: $!";
    $val = <SENSOR>;
    chomp($val);
    if ($i eq "$v5_file") {
      $val = int($val * 1.68);
    } elsif ($i eq "$v12_file") {
      $val = $val * 4.0;
    } elsif ($i eq "$v5sb_file") {
      $val = int($val * 1.68);
    }
    if (length($val) == 4) {
      $val = $val / 1000;
    }
    $val = sprintf("%.3f", $val);
    print "$val\t";
    close(SENSOR) or die "Can't close $i: $!";
  }

  print "\n";
}

sub pr_header() {
  $def_header1 = "Temperature (Celsius)\tFan Speed (RPM)\t\tVoltage\n";
  $def_header2 = "CPU0\tCPU1\tMoBo\tFan1\tFan2\tFan3\tVcor1\tVcor2\t3,3V\t5V\t12V\tV5SB\tVBat\n";
  $date_header1 = "Date\t\t";
  $date_header2 = "Day\tTime\t";

  if ($count > 1) {
    print "${date_header1}${def_header1}";
    print "${date_header2}${def_header2}";
  } else {
    print "${def_header1}";
    print "${def_header2}";
  }
}

