// DvlDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Dashboard.h"
#include "DvlDlg.h"
#include "DashboardRecipient.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define DVL_TIMER 1
#define DVL_TIMER_ELAPSE 2000

/////////////////////////////////////////////////////////////////////////////
// CDvlDlg dialog


CDvlDlg::CDvlDlg(CWnd* pParent /*=NULL*/)
	: CTestDlg(CDvlDlg::IDD, pParent, IDC_DVL_STATUS)
{
	//{{AFX_DATA_INIT(CDvlDlg)
	m_range = 0.0f;
	m_range1 = 0.0f;
	m_range2 = 0.0f;
	m_range3 = 0.0f;
	m_range4 = 0.0f;
	m_velocity1 = 0.0f;
	m_velocity2 = 0.0f;
	m_velocity3 = 0.0f;
	m_velocity4 = 0.0f;
	m_vxIndicator = 0.0f;
	m_vyIndicator = 0.0f;
	m_vzIndicator = 0.0f;
	m_roll = 0.0f;
	m_pitch = 0.0f;
	m_heading = 0.0f;
	m_pitch2 = 0.0f;
	m_roll2 = 0.0f;
	m_heading2 = 0.0f;
	//}}AFX_DATA_INIT
}


void CDvlDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDvlDlg)
	DDX_OCFloat(pDX, IDC_COMBINED_RANGE_INDICATOR, DISPID(7), m_range);
	DDX_OCFloat(pDX, IDC_RANGE_INDICATOR1, DISPID(7), m_range1);
	DDX_OCFloat(pDX, IDC_RANGE_INDICATOR2, DISPID(7), m_range2);
	DDX_OCFloat(pDX, IDC_RANGE_INDICATOR3, DISPID(7), m_range3);
	DDX_OCFloat(pDX, IDC_RANGE_INDICATOR4, DISPID(7), m_range4);
	DDX_OCFloat(pDX, IDC_VELOCITY_INDICATOR1, DISPID(7), m_velocity1);
	DDX_OCFloat(pDX, IDC_VELOCITY_INDICATOR2, DISPID(7), m_velocity2);
	DDX_OCFloat(pDX, IDC_VELOCITY_INDICATOR3, DISPID(7), m_velocity3);
	DDX_OCFloat(pDX, IDC_VELOCITY_INDICATOR4, DISPID(7), m_velocity4);
	DDX_Control(pDX, IDC_VX, m_vx);
	DDX_OCFloat(pDX, IDC_VX_INDICATOR, DISPID(7), m_vxIndicator);
	DDX_Control(pDX, IDC_VY, m_vy);
	DDX_OCFloat(pDX, IDC_VY_INDICATOR, DISPID(7), m_vyIndicator);
	DDX_Control(pDX, IDC_VZ, m_vz);
	DDX_OCFloat(pDX, IDC_VZ_INDICATOR, DISPID(7), m_vzIndicator);
	DDX_OCFloat(pDX, IDC_DVLATTITUDE, DISPID(18), m_roll);
	DDX_OCFloat(pDX, IDC_DVLATTITUDE, DISPID(19), m_pitch);
	DDX_Control(pDX, IDC_DVLTEMP, m_tempControl);
	DDX_OCFloat(pDX, IDC_DVLCOMPASS, DISPID(1), m_heading);
	DDX_OCFloat(pDX, IDC_LN250_PITCH, DISPID(7), m_pitch2);
	DDX_OCFloat(pDX, IDC_LN250_ROLL, DISPID(7), m_roll2);
	DDX_OCFloat(pDX, IDC_LN250_YAW, DISPID(7), m_heading2);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDvlDlg, CTestDlg)
	//{{AFX_MSG_MAP(CDvlDlg)
	ON_WM_CANCELMODE()
	ON_BN_CLICKED(IDC_SLAVE, OnSlave)
	ON_BN_CLICKED(IDC_SLAVEOFF, OnSlaveoff)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDvlDlg message handlers

void CDvlDlg::initSubClassDlg()
{
	SetTimer(DVL_TIMER,DVL_TIMER_ELAPSE,0);
}

void CDvlDlg::requestUpdate()
{
	Assert(m_recipient);
	m_recipient->requestData(MMAgentRequest::Start,
		ModemMessage::tMMDvl,1);
	m_recipient->requestData(MMAgentRequest::Start,
		ModemMessage::tMMDvlBeamVelocities,1);
	m_recipient->requestData(MMAgentRequest::Start,
		ModemMessage::tMMDvlBeamRanges,1);
	m_recipient->requestData(MMAgentRequest::Start,
		ModemMessage::tMMDvlAttTemp, 1);

}

void CDvlDlg::stopRequests()
{
	Assert(m_recipient);
	m_recipient->requestData(MMAgentRequest::Stop,
		ModemMessage::tMMDvl,-1);
	m_recipient->requestData(MMAgentRequest::Stop,
		ModemMessage::tMMDvlBeamVelocities,-1);
	m_recipient->requestData(MMAgentRequest::Stop,
		ModemMessage::tMMDvlBeamRanges,-1);
	m_recipient->requestData(MMAgentRequest::Stop,
		ModemMessage::tMMDvlAttTemp, -1);

	resetDialog();
}

void CDvlDlg::resetDialog()
{
	m_range = 0.0f;
	m_range1 = 0.0f;
	m_range2 = 0.0f;
	m_range3 = 0.0f;
	m_range4 = 0.0f;
	m_velocity1 = 0.0f;
	m_velocity2 = 0.0f;
	m_velocity3 = 0.0f;
	m_velocity4 = 0.0f;
	m_vxIndicator = 0.0f;
	m_vyIndicator = 0.0f;
	m_vzIndicator = 0.0f;
	m_roll = 0.0f;
	m_pitch = 0.0f;
	m_heading = 0.0f;
	UpdateData(FALSE);
}

void CDvlDlg::setDvl(double vx, double vy, double vz, double range)
{
	receiveData();
	UpdateData(TRUE);
	m_vx.SetValue(COleVariant(vx));
	m_vy.SetValue(COleVariant(vy));
	m_vz.SetValue(COleVariant(vz));
	m_vxIndicator = vx;
	m_vyIndicator = vy;
	m_vzIndicator = vz;
	m_range = range;
	UpdateData(FALSE);
}

void CDvlDlg::setDvlBeamVelocities(double v1, double v2, double v3, double v4)
{
	receiveData();
	UpdateData(TRUE);
	m_velocity1 = v1;
	m_velocity2 = v2;
	m_velocity3 = v3;
	m_velocity4 = v4;
	UpdateData(FALSE);
}

void CDvlDlg::setDvlBeamRanges(double r1, double r2, double r3, double r4)
{
	receiveData();
	UpdateData(TRUE);
	m_range1 = r1;
	m_range2 = r2;
	m_range3 = r3;
	m_range4 = r4;
	UpdateData(FALSE);
}

void CDvlDlg::setDvlAttTemp(double roll, double pitch, double yaw, double temp)
{
	receiveData();
	UpdateData(TRUE);
	m_roll = roll;
	m_pitch = pitch;
	m_heading = yaw;
	m_roll2 = roll;
	m_pitch2 = pitch;
	m_heading2 = yaw;
	//TRACE("Dvl air: %g %g %g %g\n", roll, pitch, yaw, temp);
	m_tempControl.SetValue(COleVariant(temp));
	UpdateData(FALSE);
}

void CDvlDlg::OnCancelMode() 
{
	CDialog::OnCancelMode();
	stopRequests();
	// TODO: Add your message handler code here
	
}

void CDvlDlg::OnSlave() 
{
	// TODO: Add your control notification handler code here
	m_recipient->setString("dvlSlaveModeOn");		
}

void CDvlDlg::OnSlaveoff() 
{
	// TODO: Add your control notification handler code here
	m_recipient->setString("dvlSlaveModeOff");	
}
