#include "pch.h"
#include "GpibContec.h"
#include "gpibac.h"
#include "SubFunc.h"

// コンストラクタ
CGpibContec::CGpibContec()
	: m_DeviceAddress(0)
	, m_ReceiveData(_T(""))
	, m_MyAddress(0)
{
}

// デストラクタ
CGpibContec::~CGpibContec()
{
}

// (1)接続
BOOL CGpibContec::OpenInterface(DWORD PrimaryAddress)
{
	DWORD Mode;
	DWORD Eoi;
	DWORD Delim;
	CString ErrorMessage;
	DWORD Result;

	Result = static_cast<DWORD>(GpibInit(&ErrorMessage));								// GPIBの初期化
	if (Result != 0) {
		MessageBox(NULL, ErrorMessage, AfxGetAppName(), MB_ICONERROR | MB_OK);
		return FALSE;
	}

	Result = GpBoardsts(0x0a, &Mode);													// マスタ/スレーブモードの読み出し
	if (Result != 0) {
		CheckRet(CString(_T("GpBoardsts")), Result, &ErrorMessage);						// GpBoardstsの戻り値をチェック
		MessageBox(NULL, ErrorMessage, AfxGetAppName(), MB_ICONERROR | MB_OK);
		return FALSE;
	}
	if (Mode != 0) {
		MessageBox(NULL, _T("この機器はマスタではありません。"), AfxGetAppName(), MB_ICONERROR | MB_OK);
		return FALSE;
	}

	Result = GpBoardsts(0x08, &m_MyAddress);											// マイアドレスの取得
	if (Result != 0) {
		CheckRet(CString(_T("GpBoardsts")), Result, &ErrorMessage);						// GpBoardstsの戻り値をチェック
		MessageBox(NULL, ErrorMessage, AfxGetAppName(), MB_ICONERROR | MB_OK);
		return FALSE;
	}

	Eoi = 1;																			// 0:使用しない / 1:使用する
	Delim = 3;																			// 0:未使用 / 1:CR+LF / 2:CR / 3:LF
	Result = GpDelim(Delim, Eoi); 														// デリミタコード(EOI)送出の設定
	if (Result != 0) {
		CheckRet(CString(_T("GpDelim")), Result, &ErrorMessage);						// GpDelimの戻り値をチェック
		MessageBox(NULL, ErrorMessage, AfxGetAppName(), MB_ICONERROR | MB_OK);
		return FALSE;
	}

	Result = GpTimeout(1000);															// タイムアウト時間の設定
	if (Result != 0) {
		CheckRet(CString(_T("GpTimeout")), Result, &ErrorMessage); 						// GpTimeoutの戻り値をチェック
		MessageBox(NULL, ErrorMessage, AfxGetAppName(), MB_ICONERROR | MB_OK);
		return FALSE;
	}

	m_DeviceAddress = static_cast<long>(PrimaryAddress);

	return TRUE;
}

// (2)切断
BOOL CGpibContec::CloseInterface()
{
	GpibExit();																			// GPIBの終了

	return TRUE;
}

// (3)コマンド送信
BOOL CGpibContec::SendMsg(CString SendData)
{
	long Result;

	Result = GpibPrint(m_DeviceAddress, SendData);										// 送信データを書き込み
	if (Result != 0) {
		return FALSE;
	}

	return TRUE;
}

// (4)応答受信
BOOL CGpibContec::ReceiveMsg(DWORD Timeout)
{
	CString Buffer;
	CString ErrorMessage;
	long Result;

	Result = GpTimeout(Timeout);														// タイムアウト時間の設定
	if (Result != 0) {
		CheckRet(CString(_T("GpTimeout")), Result, &ErrorMessage); 						// GpTimeoutの戻り値をチェック
		MessageBox(NULL, ErrorMessage, AfxGetAppName(), MB_ICONERROR | MB_OK);
		return FALSE;
	}

	Result = GpibInputHioki(m_DeviceAddress, &Buffer);									// 受信バッファに読み込み
	if (Result != 0) {
		m_ReceiveData = _T("Error");
		return FALSE;
	}
	m_ReceiveData = Buffer;																// 受信データを保存

	return TRUE;
}

// (5)コマンド送受信
BOOL CGpibContec::SendQueryMsg(CString SendData, DWORD Timeout)
{
	BOOL Result;

	Result = SendMsg(SendData);															// コマンド送信
	if (Result == TRUE) {
		if (SendData.Find(_T("?")) != -1) {
			Result = ReceiveMsg(Timeout);												// 送信が成功したら応答を受信
		}
	}

	return Result;
}
