#include "stdafx.h"
#include "Project1.h"
#include "Project1Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include <atlbase.h>
#include "CAO_i.c"

CProject1Dlg::CProject1Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CProject1Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CProject1Dlg)
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_brushLabel.CreateSolidBrush(RGB(255, 255, 255));
}

CProject1Dlg::~CProject1Dlg()
{
	m_brushLabel.DeleteObject();
}

void CProject1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CProject1Dlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CProject1Dlg, CDialog)
	//{{AFX_MSG_MAP(CProject1Dlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CTLCOLOR()
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_BTN_INIT, OnBtnInit)
	ON_BN_CLICKED(IDC_BTN_CONNECT, OnBtnConnect)
	ON_BN_CLICKED(IDC_BTN_DISCONNECT, OnBtnDisconnect)
	ON_BN_CLICKED(IDC_BTN_IREAD, OnBtnIread)
	ON_BN_CLICKED(IDC_BTN_IWRITE, OnBtnIwrite)
	ON_BN_CLICKED(IDC_BTN_FREAD, OnBtnFread)
	ON_BN_CLICKED(IDC_BTN_FWRITE, OnBtnFwrite)
	ON_BN_CLICKED(IDC_BTN_DREAD, OnBtnDread)
	ON_BN_CLICKED(IDC_BTN_DWRITE, OnBtnDwrite)
	ON_BN_CLICKED(IDC_BTN_VREAD, OnBtnVread)
	ON_BN_CLICKED(IDC_BTN_VWRITE, OnBtnVwrite)
	ON_BN_CLICKED(IDC_BTN_PREAD, OnBtnPread)
	ON_BN_CLICKED(IDC_BTN_PWRITE, OnBtnPwrite)
	ON_BN_CLICKED(IDC_BTN_JREAD, OnBtnJread)
	ON_BN_CLICKED(IDC_BTN_JWRITE, OnBtnJwrite)
	ON_BN_CLICKED(IDC_BTN_TREAD, OnBtnTread)
	ON_BN_CLICKED(IDC_BTN_TWRITE, OnBtnTwrite)
	ON_BN_CLICKED(IDC_BTN_SREAD, OnBtnSread)
	ON_BN_CLICKED(IDC_BTN_SWRITE, OnBtnSwrite)
	ON_BN_CLICKED(IDC_BTN_IOREAD, OnBtnIoread)
	ON_BN_CLICKED(IDC_BTN_IOWRITE, OnBtnIowrite)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL CProject1Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE);
	SetIcon(m_hIcon, FALSE);
	
	CoInitialize(NULL);
	m_eng = NULL;
	m_wss = NULL;
	m_ws = NULL;
	m_ctrl = NULL;
	m_varI = NULL;
	m_varF = NULL;
	m_varD = NULL;
	m_varV = NULL;
	m_varP = NULL;
	m_varJ = NULL;
	m_varT = NULL;
	m_varS = NULL;
	m_varIO = NULL;

	return TRUE;
}

void CProject1Dlg::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 CProject1Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

HBRUSH CProject1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
    if (nCtlColor == CTLCOLOR_STATIC && pWnd->GetDlgCtrlID() == IDC_LABEL_VALUE)
    {
		pDC->SetBkColor(RGB(255, 255, 255));
		return (HBRUSH)(m_brushLabel.GetSafeHandle());
    }

	return hbr;
}

void CProject1Dlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	OnBtnDisconnect();

	if(m_ws)
	{
		m_ws->Release();
		m_ws = NULL;
	}

	if(m_wss)
	{
		m_wss->Release();
		m_wss = NULL;
	}

	if(m_eng)
	{
		m_eng->Release();
		m_eng = NULL;
	}

	CoUninitialize();	
}

// -----------------------------Initialization----------------------------
void CProject1Dlg::OnBtnInit() 
{
	// Create Engine
	CoCreateInstance(CLSID_CaoEngine, NULL, CLSCTX_LOCAL_SERVER, IID_ICaoEngine, (void**)&m_eng);
	m_eng->get_Workspaces(&m_wss);
	m_wss->Item(CComVariant(0L), &m_ws);

	GetDlgItem(IDC_BTN_INIT)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_CONNECT)->EnableWindow(TRUE);
}

// ---------------------------------------------------------------
// Connect with the Robot
// ---------------------------------------------------------------
void CProject1Dlg::OnBtnConnect() 
{
	HRESULT hr = E_FAIL;

	// Create object and connect with VRC
	if(m_ws != NULL)
	{
		hr = m_ws->AddController(CComBSTR(L"Robot"), CComBSTR(L"caoProv.DENSO.RC8"), CComBSTR(L""), CComBSTR(L"Server=192.168.0.1"), &m_ctrl);
		
		if(SUCCEEDED(hr)){
			// Create object of valiable(I,F,D,V,P,J,T,S,IO)
			hr = m_ctrl->AddVariable(CComBSTR(L"I1"), CComBSTR(L""), &m_varI);
			hr = m_ctrl->AddVariable(CComBSTR(L"F1"), CComBSTR(L""), &m_varF);
			hr = m_ctrl->AddVariable(CComBSTR(L"D1"), CComBSTR(L""), &m_varD);
			hr = m_ctrl->AddVariable(CComBSTR(L"V1"), CComBSTR(L""), &m_varV);
			hr = m_ctrl->AddVariable(CComBSTR(L"P1"), CComBSTR(L""), &m_varP);
			hr = m_ctrl->AddVariable(CComBSTR(L"J1"), CComBSTR(L""), &m_varJ);
			hr = m_ctrl->AddVariable(CComBSTR(L"T1"), CComBSTR(L""), &m_varT);
			hr = m_ctrl->AddVariable(CComBSTR(L"S1"), CComBSTR(L""), &m_varS);
			hr = m_ctrl->AddVariable(CComBSTR(L"IO128"), CComBSTR(L""), &m_varIO);
		}
	}

	if(SUCCEEDED(hr))
	{
		// Enable command buttons
		GetDlgItem(IDC_BTN_CONNECT)->EnableWindow(FALSE);
		GetDlgItem(IDC_BTN_DISCONNECT)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_IREAD)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_IWRITE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_FREAD)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_FWRITE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_DREAD)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_DWRITE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_VREAD)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_VWRITE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_PREAD)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_PWRITE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_JREAD)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_JWRITE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_TREAD)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_TWRITE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_SREAD)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_SWRITE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_IOREAD)->EnableWindow(TRUE);
		GetDlgItem(IDC_BTN_IOWRITE)->EnableWindow(TRUE);
	}
	else
	{
		OnBtnDisconnect();
		ShowErrorMessage(hr);
	}
}

// ---------------------------------------------------------------
// disconnect from the Robot
// ---------------------------------------------------------------
void CProject1Dlg::OnBtnDisconnect() 
{
	// Disconnect from the controller
	if(m_varI){
		m_varI->Release();
		m_varI = NULL;
	}

	if(m_varF){
		m_varF->Release();
		m_varF = NULL;
	}

	if(m_varD){
		m_varD->Release();
		m_varD = NULL;
	}

	if(m_varV){
		m_varV->Release();
		m_varV = NULL;
	}

	if(m_varP){
		m_varP->Release();
		m_varP = NULL;
	}

	if(m_varJ){
		m_varJ->Release();
		m_varJ = NULL;
	}

	if(m_varT){
		m_varT->Release();
		m_varT = NULL;
	}

	if(m_varS){
		m_varS->Release();
		m_varS = NULL;
	}

	if(m_varIO){
		m_varIO->Release();
		m_varIO = NULL;
	}

	// Disconnect from the controller
	if(m_ctrl)
	{
		if(m_ws)
		{
			CComVariant vntCtrlName;
			CComPtr<ICaoControllers> ctrls;

			m_ws->get_Controllers(&ctrls);

			vntCtrlName.vt = VT_BSTR;
			m_ctrl->get_Name(&vntCtrlName.bstrVal);

			ctrls->Remove(vntCtrlName);
		}

		m_ctrl->Release();
		m_ctrl = NULL;
	}

	// Disable command buttons
	GetDlgItem(IDC_BTN_CONNECT)->EnableWindow(TRUE);
	GetDlgItem(IDC_BTN_DISCONNECT)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_IREAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_IWRITE)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_FREAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_FWRITE)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_DREAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_DWRITE)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_VREAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_VWRITE)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_PREAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_PWRITE)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_JREAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_JWRITE)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_TREAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_TWRITE)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_SREAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_SWRITE)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_IOREAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_BTN_IOWRITE)->EnableWindow(FALSE);
}

void CProject1Dlg::OnBtnIread() 
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;
	
	// Reading of "I variable"
	hr = m_varI->get_Value(&vntValue);

	if(SUCCEEDED(hr)){
		strValue.Format(_T("%d"), vntValue.lVal);
		GetDlgItem(IDC_LABEL_VALUE)->SetWindowText(strValue);
	}else{
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnIwrite() 
{
	HRESULT hr;
	CComVariant vntValue;

	vntValue.vt = VT_I4;
	vntValue.lVal = 1L;

	// Writing of "I variable"
	hr = m_varI->put_Value(vntValue);

	if(FAILED(hr)){
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnFread() 
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;
	
	// Reading of "F variable"
	hr = m_varF->get_Value(&vntValue);

	if(SUCCEEDED(hr)){
		strValue.Format(_T("%f"), vntValue.fltVal);
		GetDlgItem(IDC_LABEL_VALUE)->SetWindowText(strValue);
	}else{
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnFwrite() 
{
	HRESULT hr;
	CComVariant vntValue;

	vntValue.vt = VT_R4;
	vntValue.fltVal = 1.23f;

	// Writing of "F variable"
	hr = m_varF->put_Value(vntValue);

	if(FAILED(hr)){
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnDread() 
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;
	
	// Reading of "D variable"
	hr = m_varD->get_Value(&vntValue);

	if(SUCCEEDED(hr)){
		strValue.Format(_T("%f"), vntValue.dblVal);
		GetDlgItem(IDC_LABEL_VALUE)->SetWindowText(strValue);
	}else{
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnDwrite() 
{
	HRESULT hr;
	CComVariant vntValue;

	vntValue.vt = VT_R8;
	vntValue.dblVal = 0.123456789;

	// Writing of "D variable"
	hr = m_varD->put_Value(vntValue);

	if(FAILED(hr)){
		ShowErrorMessage(hr);
	}	
}

void CProject1Dlg::OnBtnVread() 
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;
	FLOAT *pfData;
	
	// Reading of "V variable"
	hr = m_varV->get_Value(&vntValue);

	if(SUCCEEDED(hr)){
		SafeArrayAccessData(vntValue.parray, (void**)&pfData);
		strValue.Format(_T("%.2f, %.2f, %.2f"),
			pfData[0], pfData[1], pfData[2]);
		SafeArrayUnaccessData(vntValue.parray);

		GetDlgItem(IDC_LABEL_VALUE)->SetWindowText(strValue);
	}else{
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnVwrite() 
{
	HRESULT hr;
	CComVariant vntValue;
	FLOAT* pfData;

	vntValue.vt = VT_R4 | VT_ARRAY;
	vntValue.parray = SafeArrayCreateVector(VT_R4, 0L, 3L);

	SafeArrayAccessData(vntValue.parray, (void**)&pfData);
	pfData[0] = 100;
	pfData[1] = 200;
	pfData[2] = 300;
	SafeArrayUnaccessData(vntValue.parray);

	// Writing of "V variable"
	hr = m_varV->put_Value(vntValue);

	if(FAILED(hr)){
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnPread() 
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;
	FLOAT *pfData;
	
	// Reading of "P variable"
	hr = m_varP->get_Value(&vntValue);

	if(SUCCEEDED(hr)){
		SafeArrayAccessData(vntValue.parray, (void**)&pfData);
		strValue.Format(_T("%.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d"),
			pfData[0], pfData[1], pfData[2], pfData[3], pfData[4], pfData[5], (INT)pfData[6]);
		SafeArrayUnaccessData(vntValue.parray);

		GetDlgItem(IDC_LABEL_VALUE)->SetWindowText(strValue);
	}else{
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnPwrite() 
{
	HRESULT hr;
	CComVariant vntValue;
	FLOAT* pfData;

	vntValue.vt = VT_R4 | VT_ARRAY;
	vntValue.parray = SafeArrayCreateVector(VT_R4, 0L, 7L);

	SafeArrayAccessData(vntValue.parray, (void**)&pfData);
	pfData[0] = 500;
	pfData[1] = 0;
	pfData[2] = 350;
	pfData[3] = 180;
	pfData[4] = 0;
	pfData[5] = 180;
	pfData[6] = 5;
	SafeArrayUnaccessData(vntValue.parray);

	// Writing of "P variable"
	hr = m_varP->put_Value(vntValue);

	if(FAILED(hr)){
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnJread() 
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;
	FLOAT *pfData;
	
	// Reading of "J variable"
	hr = m_varJ->get_Value(&vntValue);

	if(SUCCEEDED(hr)){
		SafeArrayAccessData(vntValue.parray, (void**)&pfData);
		strValue.Format(_T("%.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f"),
			pfData[0], pfData[1], pfData[2], pfData[3], pfData[4], pfData[5], pfData[6], pfData[7]);
		SafeArrayUnaccessData(vntValue.parray);

		GetDlgItem(IDC_LABEL_VALUE)->SetWindowText(strValue);
	}else{
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnJwrite() 
{
	HRESULT hr;
	CComVariant vntValue;
	FLOAT* pfData;

	vntValue.vt = VT_R4 | VT_ARRAY;
	vntValue.parray = SafeArrayCreateVector(VT_R4, 0L, 8L);

	SafeArrayAccessData(vntValue.parray, (void**)&pfData);
	pfData[0] = 0;
	pfData[1] = 39.52f;
	pfData[2] = 95.71f;
	pfData[3] = 0;
	pfData[4] = 44.77f;
	pfData[5] = 0;
	pfData[6] = 0;
	pfData[7] = 0;
	SafeArrayUnaccessData(vntValue.parray);

	// Writing of "J variable"
	hr = m_varJ->put_Value(vntValue);

	if(FAILED(hr)){
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnTread() 
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;
	FLOAT *pfData;
	
	// Reading of "T variable"
	hr = m_varT->get_Value(&vntValue);

	if(SUCCEEDED(hr)){
		SafeArrayAccessData(vntValue.parray, (void**)&pfData);
		strValue.Format(_T("%.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d"),
			pfData[0], pfData[1], pfData[2], pfData[3], pfData[4], pfData[5], pfData[6], pfData[7], pfData[8], (INT)pfData[9]);
		SafeArrayUnaccessData(vntValue.parray);

		GetDlgItem(IDC_LABEL_VALUE)->SetWindowText(strValue);
	}else{
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnTwrite() 
{
	HRESULT hr;
	CComVariant vntValue;
	FLOAT* pfData;

	vntValue.vt = VT_R4 | VT_ARRAY;
	vntValue.parray = SafeArrayCreateVector(VT_R4, 0L, 10L);

	SafeArrayAccessData(vntValue.parray, (void**)&pfData);
	pfData[0] = 500;
	pfData[1] = 0;
	pfData[2] = 300;
	pfData[3] = 0;
	pfData[4] = 1;
	pfData[5] = 0;
	pfData[6] = 0;
	pfData[7] = 0;
	pfData[8] = -1;
	pfData[9] = 5;
	SafeArrayUnaccessData(vntValue.parray);

	// Writing of "T variable"
	hr = m_varT->put_Value(vntValue);

	if(FAILED(hr)){
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnSread() 
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;
	
	// Reading of "S variable"
	hr = m_varS->get_Value(&vntValue);

	if(SUCCEEDED(hr)){
		strValue.Format(_T("%ls"), vntValue.bstrVal);
		GetDlgItem(IDC_LABEL_VALUE)->SetWindowText(strValue);
	}else{
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnSwrite() 
{
	HRESULT hr;
	CComVariant vntValue;

	vntValue.vt = VT_BSTR;
	vntValue.bstrVal = SysAllocString(L"DENSO ROBOT");

	// Writing of "S variable"
	hr = m_varS->put_Value(vntValue);

	if(FAILED(hr)){
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnIoread() 
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;
	
	// Reading of "IO variable"
	hr = m_varIO->get_Value(&vntValue);

	if(SUCCEEDED(hr)){
		strValue.Format(_T("%d"), vntValue.boolVal);
		GetDlgItem(IDC_LABEL_VALUE)->SetWindowText(strValue);
	}else{
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::OnBtnIowrite() 
{
	HRESULT hr;
	CComVariant vntValue;

	vntValue.vt = VT_BOOL;
	vntValue.boolVal = VARIANT_TRUE; // On
	//vntValue.boolVal = VARIANT_FALSE; // Off

	// Writing of "IO variable"
	hr = m_varIO->put_Value(vntValue);

	if(FAILED(hr)){
		ShowErrorMessage(hr);
	}
}

void CProject1Dlg::ShowErrorMessage(HRESULT hr)
{
	CString strMsg;
	strMsg.Format(_T("%X"), hr);
	MessageBox(strMsg, _T("Error"));
}
