// PowerTestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "PowerTest.h"
#include "PowerTestDlg.h"
#include "adswave.h"
#include "wavedev.h"
#include <commctrl.h>
#include <Mmsystem.h>
#include "PWR_CTRL.h"
#include <ndis.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPowerTestDlg dialog

CPowerTestDlg::CPowerTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPowerTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPowerTestDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CPowerTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPowerTestDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPowerTestDlg, CDialog)
	//{{AFX_MSG_MAP(CPowerTestDlg)
	ON_WM_HELPINFO()
	ON_BN_CLICKED(IDC_AMP_ON, OnAmpOn)
	ON_BN_CLICKED(IDC_CODEC_ON, OnCodecOn)
	ON_BN_CLICKED(IDC_CODEC_OFF, OnCodecOff)
	ON_BN_CLICKED(IDC_AMP_OFF, OnAmpOff)
	ON_WM_CLOSE()
	ON_WM_LBUTTONDOWN()
	ON_BN_CLICKED(IDC_SERIAL_OFF, OnSerialOff)
	ON_BN_CLICKED(IDC_SERIAL_ON, OnSerialOn)
	ON_BN_CLICKED(IDC_PE1_ON, OnPe1On)
	ON_BN_CLICKED(IDC_PE1_OFF, OnPe1Off)
	ON_BN_CLICKED(IDC_PE2_ON, OnPe2On)
	ON_BN_CLICKED(IDC_PE2_OFF, OnPe2Off)
	ON_BN_CLICKED(IDC_PANEL_OFF, OnPanelOff)
	ON_BN_CLICKED(IDC_BACKLITE_OFF, OnBackliteOff)
	ON_BN_CLICKED(IDC_VEE_OFF, OnVeeOff)
	ON_BN_CLICKED(IDC_VEE_ON, OnVeeOn)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPowerTestDlg message handlers

BOOL CPowerTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	m_hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), 
				MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON,
				GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
				LR_DEFAULTCOLOR);

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	InitDialog();
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CPowerTestDlg::OnHelpInfo()
{
	// TODO: implement help here
	MessageBox(_T("Support contact : http://www.applieddata.net/forums"));
}


void CPowerTestDlg::OnAmpOn() 
{
	MMDRV_MESSAGE_PARAMS Parm;
	DWORD				 BytesReturned;
	DWORD				 Dummy;
	
	Parm.uMsg=WPDM_PRIVATE_TURN_ON_AUDIO_AMP;
	DeviceIoControl(m_hWav,IOCTL_WAV_MESSAGE,(LPVOID)&Parm, sizeof(MMDRV_MESSAGE_PARAMS),&Dummy, sizeof(Dummy),&BytesReturned, NULL );
}

void CPowerTestDlg::OnAmpOff() 
{
	MMDRV_MESSAGE_PARAMS Parm;
	DWORD				 BytesReturned;
	DWORD				 Dummy;
	
	Parm.uMsg=WPDM_PRIVATE_TURN_OFF_AUDIO_AMP;
	DeviceIoControl(m_hWav,IOCTL_WAV_MESSAGE,(LPVOID)&Parm, sizeof(MMDRV_MESSAGE_PARAMS),&Dummy, sizeof(Dummy),&BytesReturned, NULL );
}

void CPowerTestDlg::OnCodecOn() 
{
	MMDRV_MESSAGE_PARAMS Parm;
	DWORD				 BytesReturned;
	DWORD				 Dummy;

	MessageBox(TEXT("Audio AMP will be turned on too"), TEXT("Message"));
	
	Parm.uMsg=WPDM_PRIVATE_TURN_ON_AUDIO;
	DeviceIoControl(m_hWav,IOCTL_WAV_MESSAGE,(LPVOID)&Parm, sizeof(MMDRV_MESSAGE_PARAMS),&Dummy, sizeof(Dummy),&BytesReturned, NULL );

	CheckDlgButton(IDC_AMP_ON, BST_CHECKED);
	CheckDlgButton(IDC_AMP_OFF, BST_UNCHECKED);
}

void CPowerTestDlg::OnCodecOff() 
{
	MMDRV_MESSAGE_PARAMS Parm;
	DWORD				 BytesReturned;
	DWORD				 Dummy;
	
	MessageBox(TEXT("Audio AMP will be turned off too"), TEXT("Message"));

	Parm.uMsg=WPDM_PRIVATE_TURN_OFF_AUDIO;
	DeviceIoControl(m_hWav,IOCTL_WAV_MESSAGE,(LPVOID)&Parm, sizeof(MMDRV_MESSAGE_PARAMS),&Dummy, sizeof(Dummy),&BytesReturned, NULL );

	CheckDlgButton(IDC_AMP_ON, BST_UNCHECKED);
	CheckDlgButton(IDC_AMP_OFF, BST_CHECKED);
}

BOOL CPowerTestDlg::InitDialog()
{
	DWORD		dwCPLD;
	HINSTANCE	hHnd;

	SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

	m_hWav = CreateFile(TEXT("WAV1:"), GENERIC_READ|GENERIC_WRITE,
            				0, NULL, OPEN_EXISTING, 0, NULL);

	if (m_hWav == INVALID_HANDLE_VALUE) {
		MessageBox(TEXT("Can not open WAV1: driver"), TEXT("Driver Open Error"));
		RETAILMSG(1, (TEXT("Can not open WAV1:\r\n")));
		GetDlgItem(IDC_AMP_ON)->EnableWindow(FALSE);
		GetDlgItem(IDC_AMP_OFF)->EnableWindow(FALSE);
		GetDlgItem(IDC_CODEC_ON)->EnableWindow(FALSE);
		GetDlgItem(IDC_CODEC_OFF)->EnableWindow(FALSE);
		return FALSE;
	}
	else {
		GetDlgItem(IDC_AMP_ON)->EnableWindow();
		GetDlgItem(IDC_AMP_OFF)->EnableWindow();
		GetDlgItem(IDC_CODEC_ON)->EnableWindow();
		GetDlgItem(IDC_CODEC_OFF)->EnableWindow();
	}

	m_hPwrOff = CreateFile(TEXT("POW1:"), GENERIC_READ|GENERIC_WRITE,
            				0, NULL, OPEN_EXISTING, 0, NULL);

	if (m_hPwrOff == INVALID_HANDLE_VALUE) {
		MessageBox(TEXT("Can not open POW1: driver"), TEXT("Driver Open Error"));
		RETAILMSG(1, (TEXT("Can not open POW1:\r\n")));
		GetDlgItem(IDC_SERIAL_ON)->EnableWindow(FALSE);
		GetDlgItem(IDC_SERIAL_OFF)->EnableWindow(FALSE);
		GetDlgItem(IDC_PE1_ON)->EnableWindow(FALSE);
		GetDlgItem(IDC_PE1_OFF)->EnableWindow(FALSE);
		GetDlgItem(IDC_PE2_ON)->EnableWindow(FALSE);
		GetDlgItem(IDC_PE2_OFF)->EnableWindow(FALSE);
		return FALSE;
	}
	else {
		GetDlgItem(IDC_SERIAL_ON)->EnableWindow();
		GetDlgItem(IDC_SERIAL_OFF)->EnableWindow();
		GetDlgItem(IDC_PE1_ON)->EnableWindow();
		GetDlgItem(IDC_PE1_OFF)->EnableWindow();
		GetDlgItem(IDC_PE2_ON)->EnableWindow();
		GetDlgItem(IDC_PE2_OFF)->EnableWindow();
	}

	// Get address of Backlight Control function
	hHnd = LoadLibrary((TEXT("keybddr.dll")));
	if (hHnd == NULL) {
		MessageBox(TEXT("Can not open keybddr.dll\r\n"));
		return FALSE;
	}
	SIOBackLightOFF = (SIOBACKLIGHTOFF)GetProcAddress(hHnd,(TEXT("SIOBackLightOFF")));
	if (SIOBackLightOFF == NULL) {
		MessageBox(TEXT("Can not get address of SIOBackLightOFF\r\n"));
		return FALSE;
	}
	SIOBackLightON = (SIOBACKLIGHTON)GetProcAddress(hHnd,(TEXT("SIOBackLightON")));
	if (SIOBackLightON == NULL) {
		MessageBox(TEXT("Can not get address of SIOBackLightON\r\n"));
		return FALSE;
	}
	fBacklightOff = FALSE;		// initial condition
	fPanelOff = FALSE;			// initial condition

	if (DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_QUERY_PCON, 
		NULL, 0, &dwCPLD, sizeof(dwCPLD), NULL, NULL) == FALSE) {
		MessageBox(TEXT("Error at DeviceIoControl() to POW1"));
	}

	// Check AUDIO power status
	if (dwCPLD & 0x02) {
		// OFF
		CheckDlgButton(IDC_CODEC_ON, BST_UNCHECKED);
		CheckDlgButton(IDC_CODEC_OFF, BST_CHECKED);
	}
	else {
		// ON
		CheckDlgButton(IDC_CODEC_ON, BST_CHECKED);
		CheckDlgButton(IDC_CODEC_OFF, BST_UNCHECKED);
	}


	// Check AUDIOPA power status
	if (dwCPLD & 0x04) {
		// OFF
		CheckDlgButton(IDC_AMP_ON, BST_UNCHECKED);
		CheckDlgButton(IDC_AMP_OFF, BST_CHECKED);
	}
	else {
		// ON
		CheckDlgButton(IDC_AMP_ON, BST_CHECKED);
		CheckDlgButton(IDC_AMP_OFF, BST_UNCHECKED);
	}

	// Check COM1-3 power status
	if (dwCPLD & 0x08) {
		// ON
		CheckDlgButton(IDC_SERIAL_ON, BST_CHECKED);
		CheckDlgButton(IDC_SERIAL_OFF, BST_UNCHECKED);
	}
	else {
		// OFF
		CheckDlgButton(IDC_SERIAL_ON, BST_UNCHECKED);
		CheckDlgButton(IDC_SERIAL_OFF, BST_CHECKED);
	}

	// Check CONN_B_PE1 power status
	if (dwCPLD & 0x10) {
		// OFF
		CheckDlgButton(IDC_PE1_ON, BST_UNCHECKED);
		CheckDlgButton(IDC_PE1_OFF, BST_CHECKED);
	}
	else {
		// ON
		CheckDlgButton(IDC_PE1_ON, BST_CHECKED);
		CheckDlgButton(IDC_PE1_OFF, BST_UNCHECKED);
	}

	// Check CONN_B_PE2 power status
	if (dwCPLD & 0x20) {
		// ON
		CheckDlgButton(IDC_PE2_ON, BST_CHECKED);
		CheckDlgButton(IDC_PE2_OFF, BST_UNCHECKED);
	}
	else {
		// OFF
		CheckDlgButton(IDC_PE2_ON, BST_UNCHECKED);
		CheckDlgButton(IDC_PE2_OFF, BST_CHECKED);
	}

	if (DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_QUERY_SUPP, 
		NULL, 0, &dwCPLD, sizeof(dwCPLD), NULL, NULL) == FALSE) {
		MessageBox(TEXT("Error at DeviceIoControl() to POW1"));
	}

	// Check VEE power status
	if (dwCPLD & 0x01) {
		// ON
		CheckDlgButton(IDC_VEE_ON, BST_CHECKED);
		CheckDlgButton(IDC_VEE_OFF, BST_UNCHECKED);
	}
	else {
		// OFF
		CheckDlgButton(IDC_VEE_ON, BST_UNCHECKED);
		CheckDlgButton(IDC_VEE_OFF, BST_CHECKED);
	}

	return TRUE;
}

void CPowerTestDlg::OnClose() 
{
	CloseHandle(m_hWav);
	CloseHandle(m_hPwrOff);

	CDialog::OnClose();
}

void CPowerTestDlg::OnBackliteOff() 
{
	if (fBacklightOff == FALSE) {
		MessageBox(TEXT("This also turns off Panel\r\nBacklight & Panel will be ON again\r\nwhen panel of program area is touched."), TEXT("Message"));

		SIOBackLightOFF();

		fBacklightOff = TRUE;
	}
}

void CPowerTestDlg::OnPanelOff() 
{
	if (fPanelOff == FALSE) {
		MessageBox(TEXT("Panel will be ON again when panel of program area is touched."), TEXT("Message"));

		DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_PANEL_OFF, NULL, 0, NULL, 0, NULL, NULL);
		fPanelOff = TRUE;
	}
}

void CPowerTestDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if (fBacklightOff) {
		SIOBackLightON();
		fBacklightOff = FALSE;
	}
	else {
		if (fPanelOff) {
			// Turn ON Panel 
			DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_PANEL_ON, NULL, 0, NULL, 0, NULL, NULL);
			fPanelOff = FALSE;
		}
		else {
			CDialog::OnLButtonDown(nFlags, point);
		}
	}
}

void CPowerTestDlg::OnSerialOff() 
{
	DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_COM1_3_OFF, NULL, 0, NULL, 0, NULL, NULL);

	CheckDlgButton(IDC_SERIAL_ON, BST_UNCHECKED);
	CheckDlgButton(IDC_SERIAL_OFF, BST_CHECKED);
}

void CPowerTestDlg::OnSerialOn() 
{
	DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_COM1_3_ON, NULL, 0, NULL, 0, NULL, NULL);

	CheckDlgButton(IDC_SERIAL_ON, BST_CHECKED);
	CheckDlgButton(IDC_SERIAL_OFF, BST_UNCHECKED);
}

void CPowerTestDlg::OnPe1On() 
{
	DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_CONNB_PE1_ON, NULL, 0, NULL, 0, NULL, NULL);

	CheckDlgButton(IDC_PE1_ON, BST_CHECKED);
	CheckDlgButton(IDC_PE1_OFF, BST_UNCHECKED);
}

void CPowerTestDlg::OnPe1Off() 
{
	DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_CONNB_PE1_OFF, NULL, 0, NULL, 0, NULL, NULL);

	CheckDlgButton(IDC_PE1_ON, BST_UNCHECKED);
	CheckDlgButton(IDC_PE1_OFF, BST_CHECKED);
}

void CPowerTestDlg::OnPe2On() 
{
	DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_CONNB_PE2_ON, NULL, 0, NULL, 0, NULL, NULL);

	CheckDlgButton(IDC_PE2_ON, BST_CHECKED);
	CheckDlgButton(IDC_PE2_OFF, BST_UNCHECKED);
}

void CPowerTestDlg::OnPe2Off() 
{
	DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_CONNB_PE2_OFF, NULL, 0, NULL, 0, NULL, NULL);

	CheckDlgButton(IDC_PE2_ON, BST_UNCHECKED);
	CheckDlgButton(IDC_PE2_OFF, BST_CHECKED);
}

void CPowerTestDlg::OnVeeOn() 
{
	DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_SUPP_VEE_ON, NULL, 0, NULL, 0, NULL, NULL);

	CheckDlgButton(IDC_VEE_ON, BST_CHECKED);
	CheckDlgButton(IDC_VEE_OFF, BST_UNCHECKED);
}

void CPowerTestDlg::OnVeeOff() 
{
	DeviceIoControl(m_hPwrOff, IOCTL_PWROFF_SUPP_VEE_OFF, NULL, 0, NULL, 0, NULL, NULL);

	CheckDlgButton(IDC_VEE_ON, BST_UNCHECKED);
	CheckDlgButton(IDC_VEE_OFF, BST_CHECKED);
}
