From: hadaq Date: Fri, 14 Aug 2020 13:01:15 +0000 (+0200) Subject: add remote script for Odroid-connected HMP X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=96c97861feacb4c438b84206bc1d4f03e16e6f84;p=labtools.git add remote script for Odroid-connected HMP --- diff --git a/powersupplies/web/htdocs/pwr_remote.pl b/powersupplies/web/htdocs/pwr_remote.pl new file mode 100644 index 0000000..679a71d --- /dev/null +++ b/powersupplies/web/htdocs/pwr_remote.pl @@ -0,0 +1,190 @@ +use strict; +use warnings; +use Device::SerialPort; + +use feature 'state'; +use URI::Escape::XS qw(uri_unescape); +use Time::HiRes qw( usleep); +use Fcntl; +use POSIX qw/floor ceil strftime/; + +my $envstring = $ENV{'QUERY_STRING'}; +# print $envstring; + +(my $null,$envstring) = split('/',$envstring,2); +$envstring = '/'.$envstring; +$envstring =~ s/%20/ /g; + +my @new_command = split('!',$envstring); +my $ser_dev = shift(@new_command); +$ser_dev = "/dev/ttyUSB0" unless defined $ser_dev; + +my $ser_type = shift(@new_command); +$ser_type = "PSP" unless defined $ser_type; + +my $ser_speed = shift(@new_command); #speed or port number +$ser_speed = "2400" unless defined $ser_speed; + +my $cnt = 0; + +my $port = new Device::SerialPort($ser_dev); + unless ($port) + { + print "can't open serial interface $ser_dev\n"; + exit; + } + + $port->user_msg('ON'); + $port->baudrate($ser_speed); + $port->parity("none"); + $port->databits(8); + $port->stopbits(1); + $port->handshake("xoff"); + $port->handshake("none") if $ser_type eq "HMP" or $ser_type eq "HMC" or $ser_type eq "PST"; + $port->write_settings; + + +transmit_command() if $ser_type eq "PSP"; #if new command, send it! +receive_answer() if $ser_type eq "PSP"; # always called + +HMP_serial() if $ser_type eq 'HMP'; + +sub transmit_command { + +$port->lookclear; + +while ( my $command = shift(@new_command) ) { + $command = uri_unescape($command); + $port->write("$command\r"); + print "i sent the command: $command"; + #print "\n\nokay.\n"; + usleep 1E5; + } +} + +sub HMP_serial { + print strftime("%H:%M:%S &", localtime()); + my $fh; + if(-e $ser_dev && -w $ser_dev) { + sysopen($fh, $ser_dev, O_RDWR|O_NDELAY) or die $!; + } + else { print "Device not found"; return;} + + while ( my $command = shift(@new_command) ) { + $command = uri_unescape($command); + my $x = getValue($fh,$command,$cnt++); + $x =~ s/\&//; + print $x."&" if $command =~ /\?/; + usleep(40000);# if $ser_type eq "PST"; + } + close $fh; + return; + } + + +sub receive_answer { + + + + + my %state_lookup = ( + 0 => 'off', + 1 => 'on' ); + + my $found = 0; + + + + # clear buffers, then send the "list"-command to the power supply + $port->lookclear; + $port->write("L\r"); + + + # do polling for 5 seconds, break polling as soon as answer was received + my $i; + for ($i = 0; ($i<100) ;$i++) { + my $a = $port->lookfor; + #print $a."\n"; # debug output + if ($a =~ m/V(\d\d\.\d\d)A(\d\.\d\d\d)W(\d\d\d\.\d)U(\d\d)I(\d\.\d\d)P(\d\d\d)F(\d\d\d\d\d\d)/) { + $found = 1; + my $c_volt = $1; + my $c_cur = $2; + my $c_pwr = $3; + my $l_volt = $4; + my $l_cur = $5; + my $l_pwr = $6; + my $state_string = $7; + my $relais_state = $state_lookup{substr $state_string, 0,1}; + printf(" + + + + + + + + + + + +
%2.2f V +
%1.3f A +
%3.1f W +
voltage limit: %d V +
current limit: %1.2f A +
power limit: %d W +
output relais: $relais_state
" + ,$c_volt,$c_cur,$c_pwr,$l_volt,$l_cur,$l_pwr); + +# if( $c_cur > 0) { +# if($c_cur > ($l_cur * 0.9) ) { # check if current limit reached, if so, turn power off! +# print "!!! current limit reached, power off !!!
"; +# push(@new_command,"KOD"); +# } +# } + + last; + + } else { + usleep 5E4; # 50 ms delay + } + } +} + +sub serial_rw { + my ($fh, $command,$forceread) = @_; + my $x = ""; + if ($ser_type eq 'PSP') {$command .= "\r";} else {$command .= "\n";} + print $fh "$command"; +# print $command; + if($ser_type eq 'PWRSW' || $forceread || $command =~ /\?/) { + for my $i (0..500) { + $x .= <$fh> // ""; + if($x && ($x =~ /\n/ || $x =~ /\r/) ) { + chomp $x; + last; + } + usleep(1000); + } + } + else { + usleep(1000); + } + return $x; + } + + +sub getValue { + my ($fh,$cmd,$cnt,$forceread) = @_; +# if (0 && defined $db->{$cmd.$cnt}{tim} && $db->{$cmd.$cnt}{tim} > time()-10) { +# return $db->{$cmd.$cnt}{val}; +# } +# else { + my $val = serial_rw($fh,$cmd,$forceread); +# addDB($cmd.$cnt,$val); + return $val; +# } + } + + +