// AutonomyDlg.cpp : Implementation file
//

#include "stdafx.h"
#include "RemoteTest.h"
#include "AutonomyDlg.h"
#include "RemoteTestDlg.h"


#define SAFE_DELETE( p )  { if ( p ) { delete ( p );     ( p ) = NULL; } }
#define SAFE_RELEASE( p ) { if ( p ) { ( p )->Release(); ( p ) = NULL; } }


// CAutonomyDlg  dialog
CAutonomyDlg::CAutonomyDlg( CVAIBO *vaibo, CWnd* pParent/*=NULL*/ )
	: CDialog( CAutonomyDlg::IDD, pParent )
{
	//{{AFX_DATA_INIT(CAutonomyDlg)
	//}}AFX_DATA_INIT

	// Virtual AIBO
	m_vaibo = vaibo;
}

// Data translation table
void CAutonomyDlg::DoDataExchange( CDataExchange* pDX )
{
	CDialog::DoDataExchange( pDX );
	//{{AFX_DATA_MAP(CAutonomyDlg)
	DDX_Control(pDX, IDC_COMBO_FUNCTION, m_ComboFunction);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP( CAutonomyDlg, CDialog )
	//{{AFX_MSG_MAP(CAutonomyDlg)
	ON_BN_CLICKED( IDC_RADIO_INTERNAL_CONTROL, OnRadioInternalControl )
	ON_BN_CLICKED( IDC_RADIO_EXTERNAL_CONTROL, OnRadioExternalControl )
	ON_BN_CLICKED( IDC_RADIO_AUTONOMY, OnRadioAutonomy )
	ON_BN_CLICKED( IDC_RADIO_SAFTY, OnRadioSafty )
	ON_BN_CLICKED( IDC_RADIO_SHUTDOWN, OnRadioShutdown )
	ON_BN_CLICKED( IDC_RADIO_AR_ON, OnRadioAROn )
	ON_BN_CLICKED( IDC_RADIO_AR_OFF, OnRadioAROff )
	ON_BN_CLICKED( IDC_RADIO_MR_ON, OnRadioMROn )
	ON_BN_CLICKED( IDC_RADIO_MR_OFF, OnRadioMROff )
	ON_BN_CLICKED( IDC_RADIO_HFD_ON, OnRadioHFDOn )
	ON_BN_CLICKED( IDC_RADIO_HFD_OFF, OnRadioHFDff )
	ON_BN_CLICKED( IDC_RADIO_HFI_ON, OnRadioHFIOn )
	ON_BN_CLICKED( IDC_RADIO_HFI_OFF, OnRadioHFIff )
	ON_BN_CLICKED( IDC_RADIO_VPR_ON, OnRadioVPROn )
	ON_BN_CLICKED( IDC_RADIO_VPR_OFF, OnRadioVPRff )
	ON_BN_CLICKED( IDC_RADIO_PINK_ON, OnRadioPINKOn )
	ON_BN_CLICKED( IDC_RADIO_PINK_OFF, OnRadioPINKOff )
	ON_BN_CLICKED( IDC_RADIO_CLIFF_ON, OnRadioCliffOn )
	ON_BN_CLICKED( IDC_RADIO_CLIFF_OFF, OnRadioCliffOff )
	ON_BN_CLICKED( IDC_RADIO_SPEAKER_ON, OnRadioSpeakerOn )
	ON_BN_CLICKED( IDC_RADIO_SPEAKER_OFF, OnRadioSpeakerOff )
	ON_BN_CLICKED( IDC_BUTTON_FUNCTION, OnButtonFunction )
	ON_BN_CLICKED( IDC_BUTTON_FUNCTION2, OnButtonFunction2 )

	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CAutonomyDlg::OnOK()
{
	CDialog::OnOK();
}

BOOL	CAutonomyDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	m_isControl = false;
	ClearAutonomyService();
	m_ComboFunction.SetCurSel( 0 );
	buttonFunction().EnableWindow( false );
	buttonFunction2().EnableWindow( false );

	return TRUE;
}

void CAutonomyDlg::OnDestroy()
{
	CDialog::OnDestroy();
}

void	CAutonomyDlg::OnRadioExternalControl()
{
	// Request remote (external) control.
	if ( m_vaibo->ExternalControl() ) {
		m_isControl = true;
		InitAutonomyService();

		// Change MainWindow state.
		CRemoteTestApp*	pApp = ( CRemoteTestApp* )AfxGetApp();
		CRemoteTestDlg*	pDlg = ( CRemoteTestDlg* )pApp->GetMainWnd();
		pDlg->SetControlFlag( true );

	}
	else {
		// Uncheck remote control.
		radioExternalControl().SetCheck( BST_UNCHECKED );
	}
}

void	CAutonomyDlg::OnRadioInternalControl()
{
	// Request internal (autonomous) control.
	if ( m_vaibo->InternalControl() ) {
		m_isControl = false;
		ClearAutonomyService();

		// Change MainWindow state.
		CRemoteTestApp*	pApp = ( CRemoteTestApp* )AfxGetApp();
		CRemoteTestDlg*	pDlg = ( CRemoteTestDlg* )pApp->GetMainWnd();
		pDlg->SetControlFlag( false );
	}
	else {
		// Uncheck internal control.
		radioInternalControl().SetCheck( BST_UNCHECKED );
	}
}

void	CAutonomyDlg::OnRadioAutonomy()
{
	if ( m_vaibo->ChangeDisconnectMode( DISCONNECT_MODE_AUTONOMY ) ) {
		m_nCutoffMode = eCutoffModeAutonomy;
	}
	else {
		radioAutonomy().SetCheck( BST_UNCHECKED );
	}
}

void	CAutonomyDlg::OnRadioSafty()
{
	if ( m_vaibo->ChangeDisconnectMode( DISCONNECT_MODE_SAFTY ) ) {
		m_nCutoffMode = eCutoffModeSafty;
	}
	else {
		radioSafty().SetCheck( BST_UNCHECKED );
	}
}

void	CAutonomyDlg::OnRadioShutdown()
{
	if ( m_vaibo->ChangeDisconnectMode( DISCONNECT_MODE_SAFTYSHUTDOWN ) ) {
		m_nCutoffMode = eCutoffModeShutdown;
	}
	else {
		radioShutdown().SetCheck( BST_UNCHECKED );
	}
}

void	CAutonomyDlg::OnRadioAROn()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRognizeAudio, eRobotObjectModeStart ) ) {
		m_isRobotObject[ eRobotObjectRognizeAudio ] = true;
	}
	else {
		radioAROn().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioAROff()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRognizeAudio, eRobotObjectModeStop ) ) {
		m_isRobotObject[ eRobotObjectRognizeAudio ] = false;
	}
	else {
		radioAROff().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioMROn()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeMObject, eRobotObjectModeStart ) ) {
		m_isRobotObject[ eRobotObjectRecognizeMObject ] = true;
	}
	else {
		radioMROn().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioMROff()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeMObject, eRobotObjectModeStop ) ) {
		m_isRobotObject[ eRobotObjectRecognizeMObject ] = false;
	}
	else {
		radioMROff().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioHFDOn()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectDetectiveFace, eRobotObjectModeStart ) ) {
		m_isRobotObject[ eRobotObjectDetectiveFace ] = true;
		radioHFIOn().EnableWindow( true );
		radioHFIOff().EnableWindow( true );
		radioHFIOn().SetCheck( BST_CHECKED );
		radioHFIOff().SetCheck( BST_UNCHECKED );
		m_isRobotObject[ eRobotObjectDetectiveFace ] = true;
	}
	else {
		radioHFDOn().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioHFDff()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectDetectiveFace, eRobotObjectModeStop ) ) {
		m_isRobotObject[ eRobotObjectDetectiveFace ] = false;
		radioHFIOn().EnableWindow( false );
		radioHFIOff().EnableWindow( false );
		radioHFIOn().SetCheck( BST_UNCHECKED );
		radioHFIOff().SetCheck( BST_CHECKED );
		m_isRobotObject[ eRobotObjectRecognizeFace ] = false;
	}
	else {
		radioHFDOff().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioHFIOn()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeFace, eRobotObjectModeStart ) ) {
		m_isRobotObject[ eRobotObjectRecognizeFace ] = true;
	}
	else {
		radioHFIOn().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioHFIff()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeFace, eRobotObjectModeStop ) ) {
		m_isRobotObject[ eRobotObjectRecognizeFace ] = false;
	}
	else {
		radioHFIOff().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioVPROn()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeVisualPattern, eRobotObjectModeStart ) ) {
		m_isRobotObject[ eRobotObjectRecognizeVisualPattern ] = true;
	}
	else {
		radioVPROn().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioVPRff()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeVisualPattern, eRobotObjectModeStop ) ) {
		m_isRobotObject[ eRobotObjectRecognizeVisualPattern ] = false;
	}
	else {
		radioVPROff().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioPINKOn()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeObjectPink, eRobotObjectModeStart ) ) {
		m_isRobotObject[ eRobotObjectRecognizeObjectPink ] = true;
	}
	else {
		radioPINKOn().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioPINKOff()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeObjectPink, eRobotObjectModeStop ) ) {
		m_isRobotObject[ eRobotObjectRecognizeObjectPink ] = false;
	}
	else {
		radioPINKOff().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioCliffOn()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeCliff, eRobotObjectModeStart ) ) {
		m_isRobotObject[ eRobotObjectRecognizeCliff ] = true;
	}
	else {
		radioCliffOn().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioCliffOff()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeCliff, eRobotObjectModeStop ) ) {
		m_isRobotObject[ eRobotObjectRecognizeCliff ] = false;
	}
	else {
		radioCliffOff().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioSpeakerOn()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeSpeaker, eRobotObjectModeStart ) ) {
		m_isRobotObject[ eRobotObjectRecognizeSpeaker ] = true;
	}
	else {
		radioSpeakerOn().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::OnRadioSpeakerOff()
{
	if ( m_vaibo->SetRobotObjectMode( eRobotObjectRecognizeSpeaker, eRobotObjectModeStop ) ) {
		m_isRobotObject[ eRobotObjectRecognizeSpeaker ] = false;
	}
	else {
		radioSpeakerOff().SetCheck( BST_UNCHECKED );
	}

	CheckAutonomyService();
}

void	CAutonomyDlg::InitAutonomyService()
{
	for ( int i = 0; i < eRobotObjectMax; i++ ) {
		if ( i == eRobotObjectRecognizeCliff ) {
			m_isRobotObject[ i ] = true;
		}
		else {
			m_isRobotObject[ i ] = false;
		}
	}
	m_nCutoffMode = eCutoffModeAutonomy;

	radioAutonomy().EnableWindow();
	radioAutonomy().SetCheck( BST_CHECKED );
	radioSafty().EnableWindow();
	radioSafty().SetCheck( BST_UNCHECKED );
	radioShutdown().EnableWindow();
	radioShutdown().SetCheck( BST_UNCHECKED );

	radioAROn().EnableWindow();
	radioAROff().EnableWindow();
	radioAROn().SetCheck( BST_UNCHECKED );
	radioAROff().SetCheck( BST_CHECKED );

	radioMROn().EnableWindow();
	radioMROff().EnableWindow();
	radioMROn().SetCheck( BST_UNCHECKED );
	radioMROff().SetCheck( BST_CHECKED );

	radioHFDOn().EnableWindow();
	radioHFDOff().EnableWindow();
	radioHFDOn().SetCheck( BST_UNCHECKED );
	radioHFDOff().SetCheck( BST_CHECKED );

	radioHFIOn().EnableWindow();
	radioHFIOff().EnableWindow();
	radioHFIOn().SetCheck( BST_UNCHECKED );
	radioHFIOff().SetCheck( BST_CHECKED );

	radioVPROn().EnableWindow();
	radioVPROff().EnableWindow();
	radioVPROn().SetCheck( BST_UNCHECKED );
	radioVPROff().SetCheck( BST_CHECKED );

	radioPINKOn().EnableWindow();
	radioPINKOff().EnableWindow();
	radioPINKOn().SetCheck( BST_UNCHECKED );
	radioPINKOff().SetCheck( BST_CHECKED );

	radioCliffOn().EnableWindow();
	radioCliffOff().EnableWindow();
	radioCliffOn().SetCheck( BST_CHECKED );
	radioCliffOff().SetCheck( BST_UNCHECKED );

	radioSpeakerOn().EnableWindow();
	radioSpeakerOff().EnableWindow();
	radioSpeakerOn().SetCheck( BST_UNCHECKED );
	radioSpeakerOff().SetCheck( BST_CHECKED );

	// Internal AIBO functions can be performed.
	buttonFunction().EnableWindow( true );

}

// Reset services when internal control is disabled.
void	CAutonomyDlg::ClearAutonomyService()
{
	for ( int i = 0; i < eRobotObjectMax; i++ ) {
		m_isRobotObject[ i ] = false;
	}
	m_nCutoffMode = eCutoffModeIllegal;

	radioAutonomy().EnableWindow( false );
	radioAutonomy().SetCheck( BST_UNCHECKED );
	radioSafty().EnableWindow( false );
	radioSafty().SetCheck( BST_UNCHECKED );
	radioShutdown().EnableWindow( false );
	radioShutdown().SetCheck( BST_UNCHECKED );

	radioAROn().EnableWindow( false );
	radioAROff().EnableWindow( false );
	radioAROn().SetCheck( BST_UNCHECKED );
	radioAROff().SetCheck( BST_UNCHECKED );

	radioMROn().EnableWindow( false );
	radioMROff().EnableWindow( false );
	radioMROn().SetCheck( BST_UNCHECKED );
	radioMROff().SetCheck( BST_UNCHECKED );

	radioHFDOn().EnableWindow( false );
	radioHFDOff().EnableWindow( false );
	radioHFDOn().SetCheck( BST_UNCHECKED );
	radioHFDOff().SetCheck( BST_UNCHECKED );

	radioHFIOn().EnableWindow( false );
	radioHFIOff().EnableWindow( false );
	radioHFIOn().SetCheck( BST_UNCHECKED );
	radioHFIOff().SetCheck( BST_UNCHECKED );

	radioVPROn().EnableWindow( false );
	radioVPROff().EnableWindow( false );
	radioVPROn().SetCheck( BST_UNCHECKED );
	radioVPROff().SetCheck( BST_UNCHECKED );

	radioPINKOn().EnableWindow( false );
	radioPINKOff().EnableWindow( false );
	radioPINKOn().SetCheck( BST_UNCHECKED );
	radioPINKOff().SetCheck( BST_UNCHECKED );

	radioCliffOn().EnableWindow( false );
	radioCliffOff().EnableWindow( false );
	radioCliffOn().SetCheck( BST_UNCHECKED );
	radioCliffOff().SetCheck( BST_UNCHECKED );

	radioSpeakerOn().EnableWindow( false );
	radioSpeakerOff().EnableWindow( false );
	radioSpeakerOn().SetCheck( BST_UNCHECKED );
	radioSpeakerOff().SetCheck( BST_UNCHECKED );

	// Internal AIBO functions can't be performed.
	buttonFunction().EnableWindow( false );
	buttonFunction2().EnableWindow( false );

}

// Change control state (internal/external).
void	CAutonomyDlg::SetControlFlag( bool isControl )
{
	m_isControl = isControl;

	if ( m_isControl ) {
		radioInternalControl().SetCheck( BST_UNCHECKED );
		radioExternalControl().SetCheck( BST_CHECKED );
		InitAutonomyService();
	}
	else {
		radioInternalControl().SetCheck( BST_CHECKED );
		radioExternalControl().SetCheck( BST_UNCHECKED );
		ClearAutonomyService();
	}
}

// Check services
void	CAutonomyDlg::CheckAutonomyService()
{
	CString	strDebug;
	strDebug.Format( "%S.E.", "Audio,Moving,FaceD,FaceR,Visual,Object,Criff,Speak" );
	for ( int i = 0; i < eRobotObjectMax; i++ ) {
		if ( m_vaibo->GetRobotObjectMode( ( E_ROBOTOBJECT )i ) == eRobotObjectModeStart ) {
			strDebug += "  OK ,";
		}
		else {
			strDebug += "  NG ,";
		}
	}
	strDebug += "\n";

	TRACE( strDebug );
}

// Perform internal AIBO function
void	CAutonomyDlg::OnButtonFunction()
{
	if ( m_vaibo ) {
		if ( m_vaibo->DoRobotFunction( ( E_ROBOTFUNCTION )m_ComboFunction.GetCurSel() ) ) {
			buttonFunction2().EnableWindow( true );
		}
	}
}

// Stop internal AIBO function
void	CAutonomyDlg::OnButtonFunction2()
{
	if ( m_vaibo ) {
		m_vaibo->StopRobotFunction();
	}
}
