// 7KReader.cpp: implementation of the C7KReader class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "6046dryend.h"
#include "7KReader.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

C7KReader::C7KReader()
{
	m_AccessMode = C7kFile::accessModeRead;
	fileOpen	 = FALSE;
	m_pRecordData = NULL;
	m_hParentWnd  = NULL;
	m_dReadErrorCount = 0;
}

C7KReader::~C7KReader()
{
	if(m_pRecordData)
	{	delete [] m_pRecordData;
		m_pRecordData = NULL;
	}
	
	if(fileOpen)
		m_7kFile.Close();

}

void C7KReader::InitReader(void *pThis, PFN_REMOTECLIENT_CALLBACK myDataCallBack)
{

	m_ulMaxBytes  = 1024*1024*2;//2MB

	if(m_pRecordData == NULL)
		m_pRecordData = new BYTE[m_ulMaxBytes]; 


	m_ptrThis   = pThis;
	m_pCallback = myDataCallBack;

}

BOOL C7KReader::Open7KFile(CString path)
{
	if(fileOpen)
	{
		fileOpen = !m_7kFile.Close();
	}
	fileOpen = (BOOL)m_7kFile.Open((LPCSTR)path, m_AccessMode);
	
	if(fileOpen)
		m_strOpenFile = path;

	return fileOpen;
}

void C7KReader::CloseFile()
{
	m_7kFile.Close();
}

BOOL C7KReader::RewindFile()
{
	
	if(m_7kFile.Close())
	{
		fileOpen = FALSE;
		fileOpen = (BOOL)m_7kFile.Open((LPCSTR)m_strOpenFile, m_AccessMode);
		return TRUE;
	}
	
	return FALSE;
}

void C7KReader::Shutdown()
{
	if(m_pRecordData)
	{	delete [] m_pRecordData;
		m_pRecordData = NULL;
	}
	if(fileOpen)
		m_7kFile.Close();
}

void CALLBACK C7KReader::TimerProc(HWND hWnd, UINT msg, UINT nTimerId, DWORD dwTimer)
{
	C7KReader *pThis;
	pThis = &((CMy6046DryEndDlg*)AfxGetMainWnd())->m_7kReader;	
	pThis->GetRecord();
}

void C7KReader::Start(int speed)
{
	m_timerID = ::SetTimer(NULL, EVENT_READ, speed, &TimerProc);
}

void C7KReader::Stop()
{
	::KillTimer(NULL, m_timerID);
	m_dReadErrorCount = 0;

}


BOOL C7KReader::GetRecord()
{		
	if(m_7kFile.Read(m_pRecordData, m_ulBytesRead, m_ulMaxBytes,false))
	{
		//ASSERT(m_pCallback);
		(m_pCallback)(m_ptrThis, m_pRecordData, m_ulBytesRead);
		return TRUE;
	}
	else
		m_dReadErrorCount++;

	if(m_dReadErrorCount > 1)
	{
		::PostMessage(m_hParentWnd, FILE_READ_DONE, 0,0);
		Stop();
		m_dReadErrorCount = 0;
		
	}
	return FALSE;
}
	

void C7KReader::SetParentHWND(HWND hParent)
{
	if(hParent != NULL)
		m_hParentWnd = hParent;
}

BOOL C7KReader::FileOpen()
{
	return (BOOL)fileOpen;
}