#!/usr/bin/perl

use lib '.';
use lib 'd:/Program/Perl/lib';

use strict; 

use MyApplication;
use GPIB;
use MyGPIB::GPIBDevice;

my $Interface  = "ni";
#my $DeviceName = "Keithley6517A:27";
#my $DeviceName = "Keithley2000:17";

BEGIN {
#	$| = 1;
	open (STDERR, ">&STDOUT");
}

#===============================================
# Applicationオブジェクト作成
#===============================================
my $App = new MyApplication;
exit if($App->Initialize() < 0);
$App->SetOutputMode("auto");
my $ProgramPath = $App->SpeculateProgramPath($0, "");
my $IniFile = $App->OpenIniFile($ProgramPath, 1);
$App->AddIniFileVariable("\\Preferences\\DeviceName", "DeviceName", "Keithley2000:17");
$App->ReadSetting();
#$App->{DeviceName} = "Keithley2000:17" if(!defined $App->{DeviceName});

$App->print("ProgramPath: $ProgramPath\n");


#===============================================
# GPIBオブジェクト作成
#===============================================
my $g = new GPIBDevice($Interface, $App->{DeviceName}, GPIB->T1s, 1, 0);
if(!defined $g) {
	$App->print("GPIB can not be opened. [$Interface: $App->{DeviceName}]\n");
	exit;
}
$App->print("Device name : $App->{DeviceName}\n");
$App->print("GPIB Address: $g->{GPIBAddress}\n");
#my $DeviceID = $g->GetIdentification();
#$App->print("Device ID: $DeviceID\n");
$App->print("Use [>set address] command to change GPIB address.\n");
$App->print("   Keithley2000: 17   6517A: 27\n");



#===============================================
# メインループ
#===============================================
while(1) {
	print ">";
	my $line = <STDIN>;
	chomp $line;
	if($line =~ /^\s*$/) {
		next;
	}
	elsif($line =~ /^\s*bye\s*$/i) {
		last;
	}
	elsif($line =~ /set\s+(.*)/i) {
		my $DeviceName = $1;
		my ($name, $addr) = ($DeviceName =~ /(\w+):(\d+)/);
		if(!defined $addr) {
			$name = $g->DeviceName();
			$addr = $DeviceName;
		}
		$g->Open($Interface, 0, $name, $addr, 0, GPIB->T1s, 1, 0);
		$g->SetDeviceName($g->{DeviceName});
		$App->print("Device name : $g->{DeviceName}\n");
		$App->print("GPIB Address: $g->{GPIBAddress}\n");
#		my $DeviceID = $g->GetIdentification();
#		$App->print("Device ID: $DeviceID\n");
	}
	elsif($line =~ /use (\w*)/i) {
		my $devname = $1;
		my ($name, $addr) = ($devname =~ /(\w+):(\d+)/);
		if(!defined $addr) {
			$App->print("Invalid device [$devname].");
			$App->print("  Device should be DeviceName:GPIBAddress.\n");
			next;
		}
		eval "use MyGPIB::$name;";
		if (!defined(&{"$name::new"})) {
			$App->print("Can not find the module [$name].\n");
			next;
		}
		my $DeviceName = $devname;
		$g = &{"$name::new"}($Interface, $DeviceName, GPIB->T1s, 1, 0);
		if(!defiend $g) {
			$App->print("GPIB can not be opened. [$Interface: $DeviceName]\n");
			exit;
		}
		$App->SetDeviceName($g->{DeviceName});
		$App->print("Device name : $g->{DeviceName}\n");
		$App->print("GPIB Address: $g->{GPIBAddress}\n");
#		my $DeviceID = $g->GetIdentification();
#		$App->print("Device ID: $DeviceID\n");
	}
	elsif($line =~ /^\s*print\s+(.*)$/i) {
		$g->print($1);
	}
	elsif($line =~ /^\s*read\s*$/i) {
		my $ret = $g->read();
		$App->print($ret);
	}
	elsif($line =~ /bye/i) {
		last;
	}
	elsif($line =~ /help/i or $line =~ /^\s*\?\s*$/) {
		$App->print("*CLS: Clear status\n");
		$App->print("*IDN?: Query identification\n");
		$App->print("*RST: Reset\n");
		$App->print(":FETCh?: Read data\n");
		$App->print(":READ?: :ABORt, :INITiate & :FETCh?\n");
		$App->print(":sense:volt:range:auto 1\n");
		$App->print(":sense:volt:range 210\n");
		$App->print("set GPIBAddress\n");
		$App->print("use DeviceName:GPIBAddress\n");
		$App->print("print string\n");
		$App->print("read\n");
		next;
	}
	else {
		$g->print("$line\n");
#		$g->errorCheck("not ok 2  First write failed");
	}
	if($line =~ /\w\?/) {
		my $response = $g->read();
#		$g->errorCheck("not ok 3  First read failed");
		print "  >>>$response\n";
	}
}

$App->SaveSetting();
exit;
