///////////////////////////////////////////////////////////////////////////////
// Copyright (c) Winnov L.P., 1998.  All rights reserved.
// hadwrap.cpp: had wrapper class implementation.
///////////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include "wnvhad.h"
#include "eeprom.h"
#include "wnvhw.h"
#include "log.h"
#include "hadwrap.h"


CHadWrap::CHadWrap (DWORD dwBoard)
{
	memset (&m_Eeprom, 0, sizeof (m_Eeprom));
	m_dwBoard = dwBoard;
	m_hBoardHandle = NULL;
}

CHadWrap::~CHadWrap ()
{
	if (m_hBoardHandle)
	{
		LogEvent (WNVERR_BOARD_NOT_ACTIVE, L"\n********** CHadWrap::~CHadWrap: Missing Close.");
	}
}

NTSTATUS CHadWrap::Open (void)
{
	DWORD dwSetParam;

	m_hBoardHandle = HadAttachBoard (m_dwBoard);

    if (!m_hBoardHandle)
    {
		LogEvent (WNVERR_BOARD_NOT_ACTIVE, L"\n********** CHadWrap::Open: HadAttachBoard failed.");
        return WNVERR_BOARD_NOT_ACTIVE;
    }

    dwSetParam = HADSHR_LOGICAL_PORT;
    HadSetMode (m_hBoardHandle, HAD_SET_PORT_TYPE, &dwSetParam);
	return STATUS_SUCCESS;
}

NTSTATUS CHadWrap::Close (void)
{
	NTSTATUS status = STATUS_SUCCESS;
	if (m_hBoardHandle)
	{
		status = HadDetachBoard (m_hBoardHandle);
		m_hBoardHandle = NULL;
	}

	return status;
}

NTSTATUS CHadWrap::GetBoardType (PBYTE pbBoardType)
{
	NTSTATUS status;

	status = HadReadEEPROM(
		m_hBoardHandle,	//IN HAD_BOARD_HANDLE hBoardHandle,
        &m_Eeprom);
	if (status)
	{
		LogEvent (WNVERR_BOARD_NOT_ACTIVE, L"\n********** CHadWrap::GetBoardType: HadReadEEPROM failed.");
        return status;
	}
	*pbBoardType = m_Eeprom.bBoardType;
	return status;
}

NTSTATUS CHadWrap::GetMinorType (PBYTE pbMinorType)
{
	NTSTATUS status;

	status = HadReadEEPROM(
		m_hBoardHandle,	//IN HAD_BOARD_HANDLE hBoardHandle,
        &m_Eeprom);
	if (status)
	{
		LogEvent (WNVERR_BOARD_NOT_ACTIVE, L"\n********** CHadWrap::GetMinorType: HadReadEEPROM failed.");
        return status;
	}
	*pbMinorType = m_Eeprom.bMinorType;
	return status;
}

NTSTATUS CHadWrap::GetHwFlags (PDWORD pdwHwFlags)
{
	NTSTATUS status;

	status = HadReadEEPROM(
		m_hBoardHandle,	//IN HAD_BOARD_HANDLE hBoardHandle,
        &m_Eeprom);
	if (status)
	{
		LogEvent (WNVERR_BOARD_NOT_ACTIVE, L"\n********** CHadWrap::GetHwFlags: HadReadEEPROM failed.");
        return status;
	}
	*pdwHwFlags = m_Eeprom.dwHwFlags;
	return status;
}

NTSTATUS CHadWrap::WriteWaviReg (DWORD dwReg, WORD wValue)
{
	NTSTATUS	status;

	status = HadWriteRegister (
		m_hBoardHandle,		//IN HAD_BOARD_HANDLE       hBoardHandle,
        dwReg,				//IN DWORD                   dwRegNum,
		wValue);			//IN WORD                    wRegValue);

	if (status)
	{
		LogEvent (WNVERR_BOARD_NOT_ACTIVE, L"\n********** CHadWrap::WriteWaviReg: HadWriteRegister failed.");
        return status;
	}
	return status;
}

NTSTATUS CHadWrap::ReadWaviReg (DWORD dwReg, PWORD pwValue)
{
	*pwValue = HadReadRegister (
		m_hBoardHandle,	//IN HAD_BOARD_HANDLE         hBoardHandle,
		dwReg);			//IN DWORD                    dwRegNum);
	return STATUS_SUCCESS;
}

NTSTATUS CHadWrap::SetAudioInterruptEnable (BOOL fState)
{
	WORD	wMasks[2];
	NTSTATUS	status;

	wMasks [0] = (WORD)~WNVHW_AIEBIT;	// AND mask
	wMasks [1] = fState?WNVHW_AIEBIT:0;	// OR mask

	status = HadReadANDORWriteWord (
		m_hBoardHandle,	//IN HAD_BOARD_HANDLE         hBoardHandle,
		WNVHW_PORT_ISR,	//IN DWORD            dwPortNum,
		wMasks);		//IN WORD             *pwMasks);
	if (status)
	{
		LogEvent (WNVERR_BOARD_NOT_ACTIVE, L"\n********** CHadWrap::SetAudioInterruptEnable: HadReadANDORWriteWord failed.");
        return status;
	}
	return status;
}

NTSTATUS CHadWrap::ResetInterrupts (void)
{
	WORD wDummy;
	NTSTATUS status;

	status = ReadWaviReg (WNVHW_PORT_ITR, &wDummy);	// read clear
	if (status)
	{
		LogEvent (WNVERR_BOARD_NOT_ACTIVE, L"\n********** CHadWrap::ResetInterrupts: ReadWaviReg failed.");
        return status;
	}
	return status;
}

NTSTATUS CHadWrap::GetAudioBase (PDWORD pdwAudioBase)
{
	HADSHR_SRAM_BREAKDOWN_TYPE	SramConfig;
	NTSTATUS	status;

	status = HadQueryBoard (
		m_hBoardHandle,			//IN HAD_BOARD_HANDLE hBoardHandle, 
        HADSHR_GET_SRAM_CONFIG,	//IN HADSHR_QUERY_CMD_TYPE cmd,
        NULL,					// In
        (PDWORD)&SramConfig);	// Out

	if (status)
	{
		LogEvent (WNVERR_BOARD_NOT_ACTIVE, L"\n********** CHadWrap::GetAudioBase: HadQueryBoard failed.");
        return status;
	}

	*pdwAudioBase = SramConfig.dwAudioBase;

	return status;
}
