// TailconeDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Dashboard.h"
#include "TailconeDlg.h"
#include "DashboardRecipient.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define TAILCONE_TIMER 1
#define TAILCONE_TIMER_ELAPSE 2000

/////////////////////////////////////////////////////////////////////////////
// CTailconeDlg dialog


CTailconeDlg::CTailconeDlg(CWnd* pParent /*=NULL*/)
	: CTestDlg(CTailconeDlg::IDD, pParent, IDC_TAILCONE_STATUS)
{
	//{{AFX_DATA_INIT(CTailconeDlg)
	m_elevatorIndicator1 = 0.0f;
	m_elevatorIndicator2 = 0.0f;
	m_rawElevator = 0.0f;
	m_rawRudder = 0.0f;
	m_rawThrottle = 0.0f;
	m_rpmIndicator1 = 0.0f;
	m_rpmIndicator2 = 0.0f;
	m_rudderIndicator1 = 0.0f;
	m_rudderIndicator2 = 0.0f;
	m_rawRpm = 0.0f;
	//}}AFX_DATA_INIT
}

void CTailconeDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTailconeDlg)
	DDX_Control(pDX, IDC_ELEVATOR, m_elevatorControl);
	DDX_OCFloat(pDX, IDC_ELEVATOR_INDICATOR, DISPID(7), m_elevatorIndicator1);
	DDX_OCFloat(pDX, IDC_ELEVATOR_INDICATOR2, DISPID(7), m_elevatorIndicator2);
	DDX_Control(pDX, IDC_ELEVATOR_SLIDER, m_elevatorSlider);
	DDX_OCFloat(pDX, IDC_RAW_ELEVATOR, DISPID(7), m_rawElevator);
	DDX_OCFloat(pDX, IDC_RAW_RUDDER, DISPID(7), m_rawRudder);
	DDX_OCFloat(pDX, IDC_RAW_THROTTLE, DISPID(7), m_rawThrottle);
	DDX_Control(pDX, IDC_RPM, m_rpmControl);
	DDX_OCFloat(pDX, IDC_RPM_INDICATOR, DISPID(7), m_rpmIndicator1);
	DDX_OCFloat(pDX, IDC_RPM_INDICATOR2, DISPID(7), m_rpmIndicator2);
	DDX_Control(pDX, IDC_RPM_KNOB, m_rpmKnob);
	DDX_Control(pDX, IDC_RUDDER, m_rudderControl);
	DDX_OCFloat(pDX, IDC_RUDDER_INDICATOR, DISPID(7), m_rudderIndicator1);
	DDX_OCFloat(pDX, IDC_RUDDER_INDICATOR2, DISPID(7), m_rudderIndicator2);
	DDX_Control(pDX, IDC_RUDDER_SLIDER, m_rudderSlider);
	DDX_OCFloat(pDX, IDC_RAW_PROP, DISPID(7), m_rawRpm);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTailconeDlg, CTestDlg)
	//{{AFX_MSG_MAP(CTailconeDlg)
	ON_BN_CLICKED(IDC_RESETTAILCONE, OnResetTailcone)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTailconeDlg message handlers


void CTailconeDlg::initSubClassDlg()
{
	SetTimer(TAILCONE_TIMER,TAILCONE_TIMER_ELAPSE,0);
	m_touchWatchdog = False;
}

void CTailconeDlg::requestUpdate()
{
	Assert(m_recipient);
	m_recipient->requestData(MMAgentRequest::Start,
		ModemMessage::tMMTailcone,1);
	m_recipient->requestData(MMAgentRequest::Start,
		ModemMessage::tMMTailconeRaw,1);

	m_touchWatchdog = True;
}

void CTailconeDlg::stopRequests()
{
	Assert(m_recipient);
	m_recipient->setTailcone(0.,0.,0.);
	m_recipient->requestData(MMAgentRequest::Stop,
		ModemMessage::tMMTailcone,-1);
	m_recipient->requestData(MMAgentRequest::Stop,
		ModemMessage::tMMTailconeRaw,-1);

	m_touchWatchdog = False;
	resetDialog();
}

void CTailconeDlg::resetDialog()
{
	m_elevatorIndicator1 = 0.0f;
	m_rpmIndicator1 = 0.0f;
	m_rudderIndicator1 = 0.0f;
	m_elevatorIndicator2 = 0.0f;
	m_elevatorControl.SetValue(COleVariant(0.0));
	m_elevatorSlider.SetValue(COleVariant(0.0));
	m_rpmIndicator2 = 0.0f;
	m_rudderIndicator2 = 0.0f;
	m_rudderSlider.SetValue(COleVariant(0.0));
	m_rawElevator = 0.0f;
	m_rpmControl.SetValue(COleVariant(0.0));
	m_rpmKnob.SetValue(COleVariant(0.0));
	m_rawRpm = 0.0f;
	m_rawRudder = 0.0f;
	m_elevatorControl.SetValue(COleVariant(0.0));
	m_rawThrottle = 0.0f;
	UpdateData(FALSE);
}

BEGIN_EVENTSINK_MAP(CTailconeDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTailconeDlg)
	ON_EVENT(CTailconeDlg, IDC_RUDDER_SLIDER, 2 /* PointerValueCommitted */, OnPointerValueCommittedRudderSlider, VTS_I4 VTS_PVARIANT)
	ON_EVENT(CTailconeDlg, IDC_RPM_KNOB, 2 /* PointerValueCommitted */, OnPointerValueCommittedRpmKnob, VTS_I4 VTS_PVARIANT)
	ON_EVENT(CTailconeDlg, IDC_ELEVATOR_SLIDER, 2 /* PointerValueCommitted */, OnPointerValueCommittedElevatorSlider, VTS_I4 VTS_PVARIANT)
	ON_EVENT(CTailconeDlg, IDC_RUDDER_SLIDER, 1 /* PointerValueChanged */, OnPointerValueChangedRudderSlider, VTS_I4 VTS_PVARIANT)
	ON_EVENT(CTailconeDlg, IDC_RPM_KNOB, 1 /* PointerValueChanged */, OnPointerValueChangedRpmKnob, VTS_I4 VTS_PVARIANT)
	ON_EVENT(CTailconeDlg, IDC_ELEVATOR_SLIDER, 1 /* PointerValueChanged */, OnPointerValueChangedElevatorSlider, VTS_I4 VTS_PVARIANT)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CTailconeDlg::sendCommand()
{
	m_recipient->setTailcone(m_rpmKnob.GetValue().dblVal,
		m_elevatorSlider.GetValue().dblVal,m_rudderSlider.GetValue().dblVal);
}

void CTailconeDlg::setTailcone(double rpm, double elevator, double rudder)
{
	receiveData();
	UpdateData(TRUE);
	m_rpmControl.SetValue(COleVariant(rpm));
	m_rpmIndicator1 = rpm;
	m_elevatorControl.SetValue(COleVariant(elevator));
	m_elevatorIndicator1 = elevator;
	m_rudderControl.SetValue(COleVariant(rudder));
	m_rudderIndicator1 = rudder;
	UpdateData(FALSE);
}

void CTailconeDlg::setTailconeRaw(short propeller, short elevator,
		short rudder, short throttle)
{
	receiveData();
	UpdateData(TRUE);
	m_rawRpm = propeller;
	m_rawElevator = elevator;
	m_rawRudder = rudder;
	m_rawThrottle = throttle;
	UpdateData(FALSE);
}

void CTailconeDlg::OnPointerValueCommittedRudderSlider(long Pointer, VARIANT FAR* Value) 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_rudderIndicator2 = Value->dblVal;
	sendCommand();		
	UpdateData(FALSE);	
}

void CTailconeDlg::OnPointerValueCommittedRpmKnob(long Pointer, VARIANT FAR* Value) 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_rpmIndicator2 = Value->dblVal;
	sendCommand();
	UpdateData(FALSE);
}

void CTailconeDlg::OnPointerValueCommittedElevatorSlider(long Pointer, VARIANT FAR* Value) 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_elevatorIndicator2 = Value->dblVal;
	sendCommand();	
	UpdateData(FALSE);
}

void CTailconeDlg::OnPointerValueChangedRudderSlider(long Pointer, VARIANT FAR* Value) 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_rudderIndicator2 = Value->dblVal;
	UpdateData(FALSE);		
}

void CTailconeDlg::OnPointerValueChangedRpmKnob(long Pointer, VARIANT FAR* Value) 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_rpmIndicator2 = Value->dblVal;
	UpdateData(FALSE);	
}

void CTailconeDlg::OnPointerValueChangedElevatorSlider(long Pointer, VARIANT FAR* Value) 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_elevatorIndicator2 = Value->dblVal;
	UpdateData(FALSE);	
}

void CTailconeDlg::OnResetTailcone() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_recipient->setTailcone(0.,0.,0.);
	m_elevatorIndicator2 = 0.;
	m_elevatorSlider.SetValue(COleVariant(0.));
	m_rudderIndicator2 = 0.;
	m_rudderSlider.SetValue(COleVariant(0.));
	m_rpmIndicator2 = 0.;
	m_rpmKnob.SetValue(COleVariant(0.));
	UpdateData(FALSE);
}

void CTailconeDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CDialog::OnTimer(nIDEvent);
	SetWindowText(m_title);
	UpdateData(True);
	if(m_touchWatchdog)
		sendCommand();
}
