// RequestSocket.cpp : implementation file
//

#include "stdafx.h"
#include "BaseClient.h"
#include "RequestSocket.h"
#include "BaseClientDlg.h"

// CRequestSocket

CRequestSocket::CRequestSocket(CBaseClientDlg *pDlg)
{
	m_buf.SetSize( 1024 );
	m_pDlg = pDlg;
}

CRequestSocket::~CRequestSocket()
{
}


// CRequestSocket Member functions

void CRequestSocket::OnReceive(int nErrorCode)
{
	int ndx = 0;
// get the data....
	int nBytes = Receive( m_buf.GetData(), (int)m_buf.GetSize() );
	if ( nBytes != SOCKET_ERROR )
	{
		while( ndx < nBytes )
		{
			// for Debugging (Set a break point to see the message string)
			char ch = (char)(m_buf.GetAt( ndx ));
			++ndx;
		}
		ProcessCommand(&m_buf, ndx);
		if (m_pDlg->m_nPlayID < 0) {
			nBytes = Send( "NG\n", 3); // return NG
		} else {
			if (m_pDlg->m_bIsBusy) {
//	Block the return "BUSY"
//				nBytes = Send( "BUSY\n", 5);
				m_pDlg->m_bSocketEnable = TRUE;
			} else {
				nBytes = Send( "OK\n", 3); // return OK
			}
		}
		if ( nBytes == SOCKET_ERROR )
		{
			if ( GetLastError() != WSAEWOULDBLOCK )
			{
				Release();
			} else {
				BOOL bOk = AsyncSelect( FD_WRITE | FD_CLOSE );
				ASSERT(bOk);
			}
		}
	} else {
		nBytes = GetLastError(); // Ignore error
	}
}

void CRequestSocket::OnSend(int nErrorCode)
{
	CAsyncSocket::OnSend(nErrorCode);
}

void CRequestSocket::OnClose(int nErrorCode)
{
	CAsyncSocket::OnClose(nErrorCode);
	m_pDlg->m_bSocketEnable = FALSE;
	Release();
}

int CRequestSocket::Release( void )
{
	delete this;
	return 0;
}

void CRequestSocket::ProcessCommand(CByteArray* pbuf, int nBufLen)
{
	CString cmd, arg;
	cmd.Format("%s",pbuf->GetData());
	cmd.TrimRight();

	int argPostion = cmd.Find(" ");
	if( argPostion != -1 ) {
		arg = cmd.Right(cmd.GetLength()-argPostion-1);
		arg.TrimRight();
		arg.TrimLeft();
		cmd = cmd.Left(argPostion);
	}

	if(cmd.Compare("HELLO") ==0 ) {
		m_pDlg->m_iRadio1 = 0;
		m_pDlg->UpdateData(FALSE);
		m_pDlg->OnBtnPlay();
	} else if(cmd.Compare("BYE") ==0 ) {
		m_pDlg->m_iRadio1 = 1;
		m_pDlg->UpdateData(FALSE);
		m_pDlg->OnBtnPlay();
	} else if(cmd.Compare("DANCE") ==0 ) {
		m_pDlg->m_iRadio1 = 2;
		m_pDlg->UpdateData(FALSE);
		m_pDlg->OnBtnPlay();
	} else if(cmd.Compare("PHOTO") ==0 ) {
		m_pDlg->TakePicture(arg.GetBuffer(arg.GetLength()+1));
		arg.ReleaseBuffer();
	} else if(cmd.Compare("FORWARD") ==0 ) {
		m_pDlg->DoWalking(DW_FORWARD_FAST, atoi(arg), 0);
		arg.ReleaseBuffer();
	} else if(cmd.Compare("BACK") ==0 ) {
		m_pDlg->DoWalking(DW_BACK, atoi(arg), 0);
		arg.ReleaseBuffer();
	} else if(cmd.Compare("RIGHT") ==0 ) {
		m_pDlg->DoWalking(DW_TURN_RIGHT, 0, atoi(arg));
		arg.ReleaseBuffer();
	} else if(cmd.Compare("LEFT") ==0 ) {
		m_pDlg->DoWalking(DW_TURN_LEFT_FAST, 0, atoi(arg));
		arg.ReleaseBuffer();
	} else if(cmd.Compare("STOP") ==0 ) {
		m_pDlg->DoWalking(DW_STOP, 0, 0);
		arg.ReleaseBuffer();
	} else if(cmd.Compare("MOVEHEADV") ==0 ) {
		m_pDlg->MoveHead(0, atoi(arg));
		arg.ReleaseBuffer();
	} else if(cmd.Compare("MOVEHEADH") ==0 ) {
		m_pDlg->MoveHead(atoi(arg),0);
		arg.ReleaseBuffer();
	} else if(cmd.Compare("MOVEHEADC") ==0 ) {
		m_pDlg->MoveHeadCenter();
		arg.ReleaseBuffer();
	} else if (cmd.Compare("STATUS") ==0 ) {
		// Do nothing
	}
}