// GPIOCtrlDlg.cpp : implementation file
//

#include "stdafx.h"
#include "DVP2420Sample.h"
#include "GPIOCtrlDlg.h"
#include "DVP2420SampleDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGPIOCtrlDlg dialog


CGPIOCtrlDlg::CGPIOCtrlDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGPIOCtrlDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGPIOCtrlDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CGPIOCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGPIOCtrlDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CGPIOCtrlDlg, CDialog)
	//{{AFX_MSG_MAP(CGPIOCtrlDlg)
	ON_BN_CLICKED(IDC_DO0_CHK, OnDo0Chk)
	ON_BN_CLICKED(IDC_DO1_CHK, OnDo1Chk)
	ON_BN_CLICKED(IDC_DO2_CHK, OnDo2Chk)
	ON_BN_CLICKED(IDC_DO3_CHK, OnDo3Chk)
	ON_BN_CLICKED(IDC_GETDI_BTN, OnGetdiBtn)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGPIOCtrlDlg message handlers

BOOL CGPIOCtrlDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_bChipInited = ((CDVP2420SampleDlg *)GetParent())->m_bChipInited[0];

	//The first chip controls the GPIO. Thus, the chip must be initialized and download the firmware before controling the GPIO.
	if (!m_bChipInited)
	{
		if (pDVPEncSDK->DVP2420_InitChips(0) != ENC_SUCCEEDED)
		{
			TRACE("Initialize chip failed!\n");
			return TRUE;
		}

		if (!bSkipDL[0])
		{
			if (pDVPEncSDK->DVP2420_DownloadFW(0) != ENC_SUCCEEDED)
			{
				//Release chip
				if (pDVPEncSDK->DVP2420_ReleaseChips(0) != ENC_SUCCEEDED)
					TRACE("Release Chip failed!\n");

				TRACE("Download firmware failed!\n");
				return TRUE;
			}
			bSkipDL[0] = TRUE;
		}
	}

	CString ErrorMsg;
	BOOL bBitVal[MAXDIS];
	for(int i=0; i<MAXDIS; i++)  
	{
		if (pDVPEncSDK->DVP2420_GPIOGetData(i, &bBitVal[i]) == ENC_SUCCEEDED) 
		{
			GetDlgItem(IDC_DI0_CHK+i)->EnableWindow(TRUE);
			((CButton*)GetDlgItem(IDC_DI0_CHK+i))->SetCheck(bBitVal[i]);
		}
		else
		{
			ErrorMsg.Format(_T("Read DI%d failed!!\n"), i);
			AfxMessageBox(ErrorMsg);		
		}
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CGPIOCtrlDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	if (!m_bChipInited)
	{
		//Release chip
		if (pDVPEncSDK->DVP2420_ReleaseChips(0) != ENC_SUCCEEDED)
		{
			TRACE("Release Chip failed!\n");
		}
	}
	
}

void CGPIOCtrlDlg::OnGetdiBtn() 
{
	// TODO: Add your control notification handler code here
	CString ErrorMsg;
	BOOL bBitVal[MAXDIS];
	for(int i=0; i<MAXDIS; i++)  
	{
		if (pDVPEncSDK->DVP2420_GPIOGetData(i, &bBitVal[i]) == ENC_SUCCEEDED) 
		{
			((CButton*)GetDlgItem(IDC_DI0_CHK+i))->SetCheck(bBitVal[i]);
		}
		else
		{
			ErrorMsg.Format(_T("Read DI%d failed!!\n"), i);
			AfxMessageBox(ErrorMsg);		
		}
	}
}

void CGPIOCtrlDlg::OnDo0Chk() 
{
	// TODO: Add your control notification handler code here
	int bBitVal = ((CButton*)GetDlgItem(IDC_DO0_CHK))->GetCheck();
	if (pDVPEncSDK->DVP2420_GPIOSetData(0, bBitVal) != ENC_SUCCEEDED)
		AfxMessageBox("Write DO0 failed!!\n");
}

void CGPIOCtrlDlg::OnDo1Chk() 
{
	// TODO: Add your control notification handler code here
	int bBitVal = ((CButton*)GetDlgItem(IDC_DO1_CHK))->GetCheck();
	if (pDVPEncSDK->DVP2420_GPIOSetData(1, bBitVal) != ENC_SUCCEEDED)
		AfxMessageBox("Write DO1 failed!!\n");
}

void CGPIOCtrlDlg::OnDo2Chk() 
{
	// TODO: Add your control notification handler code here
	int bBitVal = ((CButton*)GetDlgItem(IDC_DO2_CHK))->GetCheck();
	if (pDVPEncSDK->DVP2420_GPIOSetData(2, bBitVal) != ENC_SUCCEEDED)
		AfxMessageBox("Write DO2 failed!!\n");
}

void CGPIOCtrlDlg::OnDo3Chk() 
{
	// TODO: Add your control notification handler code here
	int bBitVal = ((CButton*)GetDlgItem(IDC_DO3_CHK))->GetCheck();
	if (pDVPEncSDK->DVP2420_GPIOSetData(3, bBitVal) != ENC_SUCCEEDED)
		AfxMessageBox("Write DO3 failed!!\n");
}
