trb_init_ports() or die trb_strerror();
+my $write;
+my $execute;
+my $help;
+Getopt::Long::Configure(qw(gnu_getopt));
+GetOptions(
+ 'help|h' => \$help,
+ 'write|w' => \$write,
+ 'exec|e' => \$execute,
+);
+if($help) {
+print <<HELP;
+./check_voltages.pl [-e] [-w]
+
+Reads voltages of all MBO and suggests changes.
+Use -e to directly execute commands and -w to store changes in file.
+HELP
+exit;
+}
+
+
+$write = $write?'-w':'';
my $values = trb_register_read_mem(0xfe90,0xd488,0,4);
my $stepsize = 200;
my $headroom = 250;
my @nominal = (1100,3300);
-print("Suggested changes to voltage settings:\n");
-print("Board\tActual\tChannel\tChange\n");
+
+
+
+print("Suggested changes to voltage settings:\n\n");
+
foreach my $b (sort keys %{$values}) {
my $value = $values->{$b}[0] / 16;
my $diff = $value - $nominal[0] - $headroom;
if($diff > $stepsize) {
my $sugg = $diff/$stepsize ;
- printf("%04x\t%i\t%i\t%i\n",$b,$value,1,-$sugg);
+ makechange($b,$value,1,-$sugg);
+
}
if($diff < 0) {
my $sugg = (-$diff)/$stepsize + 1;
- printf("%04x\t%i\t%i\t%i\n",$b,$value,1,$sugg);
+ makechange($b,$value,1,$sugg);
}
$value = $values->{$b}[2] / 16;
$diff = $value - $nominal[1] - $headroom;
if($diff > $stepsize) {
my $sugg = $diff/$stepsize ;
- printf("%04x\t%i\t%i\t%i\n",$b,$value,0,-$sugg);
+ makechange($b,$value,0,-$sugg);
}
if($diff < 0) {
my $sugg = (-$diff)/$stepsize + 1;
- printf("%04x\t%i\t%i\t%i\n",$b,$value,0,$sugg);
+ makechange($b,$value,0,$sugg);
}
}
+
+
+sub makechange {
+ my ($b,$v,$c,$r) = @_;
+ my $cmd = sprintf("./mdc_voltage.pl %s -b 0x%04x\t-c %i\t-r %i\t#%i mV\n",$write,$b,$c,$r,$v);
+ print $cmd;
+ qx($cmd) if defined $execute;
+ }