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

#include "stdafx.h"
#include "PSF_Access.h"
#include "PSF_AccessDlg.h"
#include "IF60_API.h"
#include "SerialPort.h"

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

	IF60_API	IF_60US ;
	SerialPort	IF_60RS ;

/////////////////////////////////////////////////////////////////////////////
// CPSF_AccessDlg ダイアログ

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

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

BEGIN_MESSAGE_MAP(CPSF_AccessDlg, CDialog)
	//{{AFX_MSG_MAP(CPSF_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()

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

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

	// このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
	// ウィンドウがダイアログでない時は自動的に設定しません。
	SetIcon(m_hIcon, TRUE);			// 大きいアイコンを設定
	SetIcon(m_hIcon, FALSE);		// 小さいアイコンを設定
	
	// TODO: 特別な初期化を行う時はこの場所に追加してください。
	// TODO: 特別な初期化を行う時はこの場所に追加してください。
	Result0 = IF_60US.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("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 CPSF_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 CPSF_AccessDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

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

	char buf[10];
	char buf_open[] = "OPEN" ;
	
	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;
		}
		else if( strcmp( "COM" , buf) == 0){
			IF_name = 2;
		}

		DeviceId = OpenDev(IF_name , Pc_Addr ,Sys_Addr);
		if (DeviceId < 0){
			ced1->SetWindowText("Device Open Error");
			return ;
		}
		Result0 = SendMsg( Pc_Addr,":OUTP 0\n" );

		cbt7->SetWindowText ("CLOSE");
		cbt2->EnableWindow(TRUE);
		cbt3->EnableWindow(TRUE);
		cbt4->EnableWindow(TRUE);
		cbt5->EnableWindow(TRUE);
		cbt6->EnableWindow(TRUE);
		cbt1->EnableWindow(TRUE);
		ced1->SetWindowText("");
	}
	else
	{
		Result0 = SendMsg(Pc_Addr,":OUTP 0\n" );
		Result0 = SendMsg(Pc_Addr,":ADDR 1\n" );
		Result0 = SendMsg(Pc_Addr,":Remote 0\n" );
		Result0 = CloseDev(Pc_Addr);
		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 CPSF_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
		cbt2->SetWindowText ("OFF");
		Result0 = SendMsg(Pc_Addr,":OUTP 1\n" );
	}
	else								// ON -> OFF
	{
		cbt2->SetWindowText ("ON");
		Result0 = SendMsg(Pc_Addr,":OUTP 0\n" );
	}		
}

void CPSF_AccessDlg::OnReadMonitor() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
	CEdit *ced1;
	char MonitorMsg[64];
	double MonData[4];
	int count , count1 ,index; 

	ced1=(CEdit*)GetDlgItem(IDC_EDIT1);

	Result0 = SendMsg(Pc_Addr,":meas?\n" );
	Sleep(200);
	Result0 = ReadMsg(Pc_Addr ,64 ,MonitorMsg);
	count = 1 ;
	count1 = 0 ;
	MonData[0] = atof(&MonitorMsg[0]);			// P1
	for (index = 0 ;index < 64 ; index ++){
		if( MonitorMsg[index] == ','){
			count1 = index ; 
			MonData[count] = atof(&MonitorMsg[count1+1]);
			count ++;
			if (count > 4 ) break; 
		}
	}
	count1 = index ; 
	MonData[count] = atof(&MonitorMsg[count1+1]);
	sprintf(MonitorMsg,"Volt : %4.2f \r\nCurr : %4.2f \r\nWatt : %4.2f \r\nCVCC: %1.0f",MonData[0],MonData[1],MonData[2],MonData[3]);
	ced1->SetWindowText(MonitorMsg);

}
void CPSF_AccessDlg::OnPreset1() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
		Result0 = SendMsg(Pc_Addr,":pres:call 1\n" );
}

void CPSF_AccessDlg::OnPreset2() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
		Result0 = SendMsg(Pc_Addr,":pres:call 2\n" );
}

void CPSF_AccessDlg::OnPreset3() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
		Result0 = SendMsg(Pc_Addr,":pres:call 3\n" );	
}

void CPSF_AccessDlg::OnPresetOff() 
{
	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
		Result0 = SendMsg(Pc_Addr,":pres:call 0\n" );
}


// Interface Select
long CPSF_AccessDlg::OpenDev( int if_name , int addrs ,int lcaddr)
{
	char LocalAd[20] ;

	sprintf( LocalAd , ":ADDR %d\n",lcaddr) ;
	switch(if_name){
	case IF_USB :	//USB
		DeviceId = IF_60US.DeviceOpen (addrs);
		break;
	case IF_COM : //COM
		DeviceHandle = IF_60RS.COM_OpenDevice (addrs);
		if (DeviceHandle == (HANDLE) -1 ){
			DeviceId = -1;
		}
		else{
			DeviceId = addrs ;
		}
		break;
	}
	if (DeviceId < 0 ){
		return -1;
	}
	SendMsg (addrs , LocalAd);

	return DeviceId ;
}

int CPSF_AccessDlg::CloseDev(int addrs)
{
	switch(IF_name){
	case IF_USB :	//USB
		Result0 = IF_60US.DeviceClose  (addrs);
		break;

	case IF_COM : //COM
		Result0 = IF_60RS.COM_CloseDevice (DeviceHandle);
		break;
	}		
	return Result0 ;
}

int CPSF_AccessDlg::SendMsg(int addrs , char *cMsg)
{
	int iLength ;
	
	iLength = strlen(cMsg);
	switch(IF_name){
	case IF_USB :	//USB
		Result0 = IF_60US.Send (addrs , cMsg);
		break;

	case IF_COM : //COM
		if (IF_60RS.COM_Send (DeviceHandle , cMsg , iLength) == 0)
			Result0 = iLength ;
		else 
			Result0 = -1;
		break;
	}		
	return Result0 ;
}

int CPSF_AccessDlg::ReadMsg(int addrs , int count, char *cMsg)
{
	switch(IF_name){
	case IF_USB :	//USB
		Result0 = IF_60US.Receive (addrs , count , cMsg);
		break;

	case IF_COM : //COM
		Result0 = IF_60RS.COM_Receive (DeviceHandle , cMsg);
		break;
	}		
	return 0 ;
}

void CPSF_AccessDlg::OnClose() 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
	if (DeviceId != 0){				//Device Opened
		Result0 = SendMsg(Pc_Addr,":OUTP 0\n" );
		Result0 = SendMsg(Pc_Addr,":ADDR 1\n" );
		Result0 = SendMsg(Pc_Addr,":Remote 0\n" );
		Result0 = CloseDev(Pc_Addr);
	}
	CDialog::OnClose();
}
