#============================================================ # Cornerstone130 #============================================================ package Cornerstone130; use Device::DeviceObject; @ISA = qw(DeviceObject); #公開したいサブルーチン @EXPORT = qw(); use strict; use Deps; my $DefaultWaitForGratingChange = 10; my $UseRead = 0; #============================================================ # コンストラクタ、デストラクタ #============================================================ BEGIN { } sub new { my ($module, @args) = @_; my $this = {}; bless $this; # $this->Initialize(); return $this; } sub DESTROY { my $this = shift; $this->Finish(); } #============================================================ # 変数取得関数 #============================================================ sub GetFunctions { return "|Wavelength|"; } #============================================================ # 一般関数 #============================================================ sub Initialize { my ($this) = @_; # $this->ChangeGrating(1); } sub Finish { my ($this) = @_; # $this->Shutter("close"); } sub eof { my ($this) = @_; return $this->{CommObject}->eof(); } sub GetWave { my ($this) = @_; $this->print("WAVE?\n"); my $wl = -1; for(my $i = 0 ; $i < 100 ; $i++) { my $line1 = $this->read(); #print "line[$i]: $line1\n"; last if($line1 eq ''); if($line1 =~ /WAVE\?(.*[^\d\.]([\d\.]+\D))?/s) { #print "w\n"; if(!defined $2) { $this->print("WAVE?\n"); next; } $wl = $2; #print "wl:$wl\n"; last; } } return $wl; } sub GetId { return "CornerStone130(fixed response from Perl.pm)"; } sub GOWAVE { my ($this, $wavelength) = @_; $this->{CommObject}->truncate(); print "wavel: $wavelength\n"; # for grating 1: 180 - 750 # for grating 2: 600 - 2500 if($wavelength < 180.0 or $wavelength > 2500) { print "\nError: Cornerstone130::GOWAVE: [Invalid wavelength: $wavelength nm]\n\n"; exit; } #print "wavel: $wavelength\n"; my $GraingShuldBeChanged = 1; if($this->{CurrentGrating} == 1) { if($wavelength >= 180.0 and $wavelength <= 750) { $GraingShuldBeChanged = 0; } } elsif($this->{CurrentGrating} == 2) { if($wavelength >= 600.0 and $wavelength <= 2500) { $GraingShuldBeChanged = 0; } } else { } #print "GraingShuldBeChanged: $GraingShuldBeChanged\n"; $this->ChangeGrating($wavelength) if($GraingShuldBeChanged); $this->print("GOWAVE $wavelength\n"); my $wl = $wavelength; if($UseRead) { $wl = -1; my $ret = $this->read(); Utils::sleep(1.0); $wl = $this->GetWave(); #print "WL: $wl\n"; } else { Utils::sleep(1.0); } return $wl; } sub GoWave { my ($this, $wavelength) = @_; return $this->GOWAVE($wavelength); } sub Shutter { my ($this, $status) = @_; $status = 'O' if($status == 0 or $status =~ /open/i); $status = 'C' if($status == 1 or $status =~ /close/i); $this->print("SHUTTER $status\n"); # return $this->read(); } sub ChangeGrating { # $Wait: in seconds # $iGrating: 1 or 2, or wavelength in nm my ($this, $iGrating, $Wait) = @_; $Wait = $DefaultWaitForGratingChange if(!defined $Wait); # for grating 1: 180 - 750 # for grating 2: 600 - 25008 if($iGrating > 2 and ($iGrating < 180.0 or $iGrating > 2500)) { print "\nError: Cornerstone130::ChangeGrating: [Invalid wavelength: $iGrating nm]\n\n"; exit; } if($iGrating >= 180 and $iGrating <= 750) { $iGrating = 1; } if($iGrating >= 600 and $iGrating <= 2500) { $iGrating = 2; } return 0 if(defined $this->{CurrentGrating} and $this->{CurrentGrating} == $iGrating); my ($iCurrentGrating, $nGratings) = $this->GetGrating(); return 1 if($iGrating == $iCurrentGrating); print "Cornerstone130::ChangeGrating Change grating to $iGrating\n"; $this->print("GRAT $iGrating\n"); $this->{CurrentGrating} = $iGrating; if($UseRead) { my $ret = $this->read(); #print "ret: $ret\n"; } else { print " Wait for $Wait seconds\n"; Utils::sleep($Wait); } return 1; } sub GetGrating { my ($this) = @_; my ($iGrating, $nGratings); for(my $i = 0 ; $i < 10 ; $i++) { $this->print("GRAT?\n"); my $s = $this->read(); #print "s: $s\n"; last if(!defined $s or $s eq ''); if($s =~ /^GRAT?.*(\d+),(\d+),/s) { $iGrating = $1; $nGratings = $2; #print "GRAT: $iGrating\n"; last; } } return ($iGrating, $nGratings); } 1;