// PWA_AccessDlg.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include "PWA_Access.h"
#include "PWA_AccessDlg.h"
#include "TMI_API.h"
#include "SerialPort.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

	TMI_API	TMI_APIUS;

/////////////////////////////////////////////////////////////////////////////
// CPWA_AccessDlg ダイアログ

CPWA_AccessDlg::CPWA_AccessDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPWA_AccessDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPWA_AccessDlg)
		// メモ: この位置に ClassWizard によってメンバの初期化が追加されます。
	//}}AFX_DATA_INIT
	// メモ: LoadIcon は Win32 の DestroyIcon のサブシーケンスを要求しません。
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
}

void CPWA_AccessDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPWA_AccessDlg)
		// メモ: この場所には ClassWizard によって DDX と DDV の呼び出しが追加されます。
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPWA_AccessDlg, CDialog)
	//{{AFX_MSG_MAP(CPWA_AccessDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON7, OnOpenDevice)
	ON_BN_CLICKED(IDC_BUTTON6, OnOutput)
	ON_BN_CLICKED(IDC_BUTTON5, OnPreset1)
	ON_BN_CLICKED(IDC_BUTTON4, OnPreset2)
	ON_BN_CLICKED(IDC_BUTTON3, OnPreset3)
	ON_BN_CLICKED(IDC_BUTTON2, OnPresetOff)
	ON_BN_CLICKED(IDC_BUTTON1, OnReadMonitor)
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPWA_AccessDlg メッセージ ハンドラ

BOOL CPWA_AccessDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
	// ウィンドウがダイアログでない時は自動的に設定しません。
	SetIcon(m_hIcon, TRUE);			// 大きいアイコンを設定
	SetIcon(m_hIcon, FALSE);		// 小さいアイコンを設定
	
	// TODO: 特別な初期化を行う時はこの場所に追加してください。
	// TODO: 特別な初期化を行う時はこの場所に追加してください。
	Result0 = TMI_APIUS.IFInitialize();	/*　ＡＰＩ関数ハンドルの初期化　*/

	//コンボボックス初期設定
	CComboBox *cbx0,*cbx1,*cbx2;
	CButton *cbt1,*cbt2,*cbt3,*cbt4,*cbt5,*cbt6,*cbt7;
	int index0 ; 
	char buf[5];
		
	cbx0=(CComboBox*)GetDlgItem(IDC_COMBO1);
	cbx1=(CComboBox*)GetDlgItem(IDC_COMBO2);
	cbx2=(CComboBox*)GetDlgItem(IDC_COMBO3);
	cbt1=(CButton*)GetDlgItem(IDC_BUTTON7);
	cbt2=(CButton*)GetDlgItem(IDC_BUTTON2);
	cbt3=(CButton*)GetDlgItem(IDC_BUTTON3);
	cbt4=(CButton*)GetDlgItem(IDC_BUTTON4);
	cbt5=(CButton*)GetDlgItem(IDC_BUTTON5);
	cbt6=(CButton*)GetDlgItem(IDC_BUTTON6);
	cbt7=(CButton*)GetDlgItem(IDC_BUTTON1);
	
	cbx0->AddString("USB");
	cbx0->AddString("GPIB0");
	cbx0->AddString("COM");

	for (index0 = 1 ; index0 < 31 ; index0 ++)
	{
		_itoa(index0 , buf , 10);
		cbx1->AddString(buf);
		cbx2->AddString(buf);		
	}

	cbx0->SelectString (-1 , "USB");
	cbx1->SelectString (-1 , "1");
	cbx2->SelectString (-1 , "1");

	cbt2->EnableWindow(FALSE);
	cbt3->EnableWindow(FALSE);
	cbt4->EnableWindow(FALSE);
	cbt5->EnableWindow(FALSE);
	cbt6->EnableWindow(FALSE);
	cbt7->EnableWindow(FALSE);	
	return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
}

// もしダイアログボックスに最小化ボタンを追加するならば、アイコンを描画する
// コードを以下に記述する必要があります。MFC アプリケーションは document/view
// モデルを使っているので、この処理はフレームワークにより自動的に処理されます。

void CPWA_AccessDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 描画用のデバイス コンテキスト

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// クライアントの矩形領域内の中央
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// アイコンを描画します。
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// システムは、ユーザーが最小化ウィンドウをドラッグしている間、
// カーソルを表示するためにここを呼び出します。
HCURSOR CPWA_AccessDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CPWA_AccessDlg::OnOpenDevice() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	CComboBox *cbx0,*cbx1,*cbx2;
	CButton *cbt1,*cbt2,*cbt3,*cbt4,*cbt5,*cbt6,*cbt7;
	CEdit *ced1;

	char buf[10];
	char buf_open[] = "OPEN" ;
	char buf_PWA[] = "PW-A";
	char Model[64];
	
	cbx0=(CComboBox*)GetDlgItem(IDC_COMBO1);
	cbx1=(CComboBox*)GetDlgItem(IDC_COMBO2);
	cbx2=(CComboBox*)GetDlgItem(IDC_COMBO3);

	cbt1=(CButton*)GetDlgItem(IDC_BUTTON1);
	cbt2=(CButton*)GetDlgItem(IDC_BUTTON2);
	cbt3=(CButton*)GetDlgItem(IDC_BUTTON3);
	cbt4=(CButton*)GetDlgItem(IDC_BUTTON4);
	cbt5=(CButton*)GetDlgItem(IDC_BUTTON5);
	cbt6=(CButton*)GetDlgItem(IDC_BUTTON6);
	cbt7=(CButton*)GetDlgItem(IDC_BUTTON7);
	ced1=(CEdit*)GetDlgItem(IDC_EDIT1);
	
	cbt7->GetWindowText (buf , 10) ;

	if ( strcmp( buf , buf_open) == 0){

		cbx1->GetWindowText (buf , 10) ;	//PC ADDR read
		Pc_Addr = atoi(buf);
		cbx2->GetWindowText (buf , 10) ;	//SYS ADDR read
		Sys_Addr = atoi(buf);

		cbx0->GetWindowText (buf , 10) ;	//IF read
		if( strcmp( "USB" , buf) == 0){
			IF_name = 1;
			sprintf(Model,"USB:%d:%d",Pc_Addr,Sys_Addr);
		}
		else if( strcmp( "GPIB0" , buf) == 0){
			IF_name = 2;
			sprintf(Model,"DEV0:%d:%d",Pc_Addr,Sys_Addr);
		}
		else if( strcmp( "COM" , buf) == 0){
			IF_name = 3;
			sprintf(Model,"COM1:%d:%d",Pc_Addr,Sys_Addr);
		}

        // デバイスオープン
        DeviceId = TMI_APIUS.TMI_HandleOpen(buf_PWA, Model);
		if (DeviceId < 0){
			ced1->SetWindowText("Device Open Error");
			return ;
		}
		// OutputをOFF
		TMI_APIUS.TMI_MainOutput(DeviceId, 0);
		// 出力CHAのアウトプットセレクトをONに設定
		TMI_APIUS.TMI_OutputSel(DeviceId, 1, 1);
		// 出力CHAをLEDディスプレイに表示
		TMI_APIUS.TMI_Display(DeviceId, 1);

		cbt7->SetWindowText ("CLOSE");
		cbt2->EnableWindow(TRUE);
		cbt3->EnableWindow(TRUE);
		cbt4->EnableWindow(TRUE);
		cbt5->EnableWindow(TRUE);
		cbt6->EnableWindow(TRUE);
		cbt1->EnableWindow(TRUE);
		ced1->SetWindowText("");
	}
	else
	{

        // OutputをOFFに設定する。
        TMI_APIUS.TMI_MainOutput(DeviceId, 0);
        // リモート状態をローカルに戻す
        TMI_APIUS.TMI_RemoteLocal(DeviceId);
        // Deviceクローズ
        TMI_APIUS.TMI_HandleClose(DeviceId);
        DeviceId = 0;

		cbt7->SetWindowText ("OPEN");
		cbt2->EnableWindow(FALSE);
		cbt3->EnableWindow(FALSE);
		cbt4->EnableWindow(FALSE);
		cbt5->EnableWindow(FALSE);
		cbt6->EnableWindow(FALSE);
		cbt1->EnableWindow(FALSE);
		cbt2->SetWindowText("ON");
		ced1->SetWindowText("");
		DeviceId = 0 ;
	}	
}

void CPWA_AccessDlg::OnOutput() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	CButton *cbt2;
	char buf[10];
	char buf_on[] = "ON" ;
	
	cbt2=(CButton*)GetDlgItem(IDC_BUTTON6);
	cbt2->GetWindowText (buf , 10) ;
	if ( strcmp( buf , buf_on) == 0){	// OFF -> ON
        // OutputをONに設定
        TMI_APIUS.TMI_MainOutput(DeviceId, 1);
		cbt2->SetWindowText ("OFF");
	}
	else								// ON -> OFF
	{
        // OutputをOFFに設定
        TMI_APIUS.TMI_MainOutput(DeviceId, 0);
		cbt2->SetWindowText ("ON");
	}		
}

void CPWA_AccessDlg::OnReadMonitor() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	CEdit *ced1;
	char MonitorMsg[64];
    double MVoltage;
    double MCurrent;
    unsigned char MCvcc;

	ced1=(CEdit*)GetDlgItem(IDC_EDIT1);

    // モニタ値をリード
    TMI_APIUS.TMI_MoniDataQ(DeviceId, 1, &MVoltage, &MCurrent, &MCvcc);

    // リードしたモニタ電圧、モニタ電流、CV/CC状態を表示
    if(MCvcc == 0)
    {
		sprintf(MonitorMsg,"Volt : %4.2f \r\nCurr : %4.2f \r\nCVCC: CV",MVoltage,MCurrent);
    }
    else
    {
		sprintf(MonitorMsg,"Volt : %4.2f \r\nCurr : %4.2f \r\nCVCC: CC",MVoltage,MCurrent);
    }
	ced1->SetWindowText(MonitorMsg);

}
void CPWA_AccessDlg::OnPreset1() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    // Preset 1を選択
    TMI_APIUS.TMI_Preset(DeviceId, 1);

}
void CPWA_AccessDlg::OnPreset2() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    // Preset 2を選択
    TMI_APIUS.TMI_Preset(DeviceId, 2);
}
void CPWA_AccessDlg::OnPreset3() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    // Preset 3を選択
    TMI_APIUS.TMI_Preset(DeviceId, 3);
}
void CPWA_AccessDlg::OnPresetOff() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    // Preset 4を選択
    API_test();
	TMI_APIUS.TMI_Preset(DeviceId, 4);
}
void CPWA_AccessDlg::OnClose() 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
    if (DeviceId != 0)
    {
        // OutputをOFFに設定する。
        TMI_APIUS.TMI_MainOutput(DeviceId, 0);

        // リモート状態をローカルに戻す
        TMI_APIUS.TMI_RemoteLocal(DeviceId);

        // Deviceクローズ
        TMI_APIUS.TMI_HandleClose(DeviceId);

        DeviceId = 0;
    }
	CDialog::OnClose();
}

void CPWA_AccessDlg::API_test()
{
    int iRet;
    unsigned char Ch_A;
    unsigned char Pre_1;
    double Voltage;
    double Current;
    unsigned char cv_cc;
    unsigned char Addr;
    unsigned char Output;
    unsigned char DelayOn = 0;
    double DelayValue = 0;
    unsigned char TrackOn = 0;
    unsigned char v_Set = 0;
    unsigned char TrackGroup = 0;
    double TrackValue = 0;
    char PName[256];
    char strPresetData[256];
	//double PresetData[32];
    char Que[256];

    Voltage = 3.124;
    Current = 1.235;
    Ch_A = 1;
    Pre_1 = 1;
    Output = 1;
    iRet = TMI_APIUS.TMI_ModelNameQ(DeviceId, PName);
    iRet = TMI_APIUS.TMI_TimeOut(DeviceId, 10);
	
    //iRet = TMI_APIUS.TMI_AllPresetQ(DeviceId, PresetData[0]);
    iRet = TMI_APIUS.TMI_AllPresetQS(DeviceId, strPresetData);
	iRet = TMI_APIUS.TMI_DataBackUp(DeviceId);
    iRet = TMI_APIUS.TMI_SRQEnable(DeviceId, 1);

    iRet = TMI_APIUS.TMI_Refresh(DeviceId);
    iRet = TMI_APIUS.TMI_Voltage(DeviceId, Ch_A, Pre_1, Voltage);
    iRet = TMI_APIUS.TMI_VoltageQ(DeviceId, Ch_A, Pre_1, &Voltage);
    iRet = TMI_APIUS.TMI_Current(DeviceId, Ch_A, Pre_1, Current);
    iRet = TMI_APIUS.TMI_CurrentQ(DeviceId, Ch_A, Pre_1, &Current);
    iRet = TMI_APIUS.TMI_MainOutput(DeviceId, Output);
    iRet = TMI_APIUS.TMI_MainOutputQ(DeviceId, &Output);
    iRet = TMI_APIUS.TMI_OutputSel(DeviceId, Ch_A, Output);
    iRet = TMI_APIUS.TMI_OutputSelQ(DeviceId, Ch_A, &Output);

    iRet = TMI_APIUS.TMI_Display(DeviceId, Ch_A);
    iRet = TMI_APIUS.TMI_DisplayQ(DeviceId, &Ch_A);
    iRet = TMI_APIUS.TMI_Preset(DeviceId, Pre_1);
    iRet = TMI_APIUS.TMI_PresetQ(DeviceId, &Pre_1);
    iRet = TMI_APIUS.TMI_MoniDataQ(DeviceId, Ch_A, &Voltage, &Current, &cv_cc);

    iRet = TMI_APIUS.TMI_TrackingOnOff(DeviceId, TrackOn);
    iRet = TMI_APIUS.TMI_TrackingOnOffQ(DeviceId, &TrackOn);
    iRet = TMI_APIUS.TMI_TrackingMode(DeviceId, TrackOn);
    iRet = TMI_APIUS.TMI_TrackingModeQ(DeviceId, &TrackOn);
    iRet = TMI_APIUS.TMI_TrackingGroup(DeviceId, Ch_A, TrackGroup);
    iRet = TMI_APIUS.TMI_TrackingGroupQ(DeviceId, Ch_A, &TrackGroup);
    iRet = TMI_APIUS.TMI_TrackingData(DeviceId, Ch_A, v_Set, TrackValue);
    iRet = TMI_APIUS.TMI_TrackingDataQ(DeviceId, Ch_A, v_Set, &TrackValue);

    iRet = TMI_APIUS.TMI_Delay(DeviceId, DelayOn);
    iRet = TMI_APIUS.TMI_DelayQ(DeviceId, &DelayOn);
    iRet = TMI_APIUS.TMI_DelayTime(DeviceId, Ch_A, DelayValue);
    iRet = TMI_APIUS.TMI_DelayTimeQ(DeviceId, Ch_A, &DelayValue);

    iRet = TMI_APIUS.TMI_AdrQ(DeviceId, &Addr);
    iRet = TMI_APIUS.TMI_RemoteLocal(DeviceId);

    iRet = TMI_APIUS.TMI_Out(DeviceId, "ST3");
    iRet = TMI_APIUS.TMI_In(DeviceId, Que);

    iRet = TMI_APIUS.TMI_LocalLockOut(DeviceId);
}