// LN250Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "dashboard.h"
#include "LN250Dlg.h"
#include "remote/MMLN250.h"
#include "DashboardRecipient.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define LN250_TIMER 1
#define LN250_TIMER_ELAPSE 2000

/////////////////////////////////////////////////////////////////////////////
// CLN250Dlg dialog


CLN250Dlg::CLN250Dlg(CWnd* pParent /*=NULL*/)
	: CTestDlg(CLN250Dlg::IDD, pParent, IDC_LN250_STATUS)
{
	//{{AFX_DATA_INIT(CLN250Dlg)
	m_systime = 0.0f;
	m_mode = _T("");
	m_type = _T("");
	m_biasX = 0.0f;
	m_biasY = 0.0f;
	m_hyRoll = 0.0f;
	m_hyPitch = 0.0f;
	m_hyYaw = 0.0f;
	m_hyEvel = 0.0f;
	m_hyAlt = 0.0f;
	m_hyLat = 0.0f;
	m_hyLon = 0.0f;
	m_hyNvel = 0.0f;
	m_hyVvel = 0.0f;
	m_insRoll = 0.0f;
	m_insAlt = 0.0f;
	m_insPitch = 0.0f;
	m_insYaw = 0.0f;
	m_insEvel = 0.0f;
	m_insLat = 0.0f;
	m_insLon = 0.0f;
	m_insNvel = 0.0f;
	m_insVvel = 0.0f;
	m_Pitch2 = 0.0f;
	m_PitchRate = 0.0f;
	m_Roll2 = 0.0f;
	m_RollRate = 0.0f;
	m_Yaw2 = 0.0f;
	m_YawRate = 0.0f;
	//}}AFX_DATA_INIT
}


void CLN250Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLN250Dlg)
	DDX_Control(pDX, IDC_LN250TAB, m_Ln250TabControl);
	DDX_OCFloat(pDX, IDC_LN250_SYSTIME, DISPID(7), m_systime);
	DDX_Text(pDX, IDC_LN250_MODE, m_mode);
	DDX_OCFloat(pDX, IDC_LN250_ATTITUDE, DISPID(18), m_Roll);
	DDX_OCFloat(pDX, IDC_LN250_ATTITUDE, DISPID(19), m_Pitch);
	DDX_OCFloat(pDX, IDC_LN250_COMPASS, DISPID(1), m_Yaw);
	DDX_OCFloat(pDX, IDC_LN250_EVEL, DISPID(7), m_Evel);
	DDX_OCFloat(pDX, IDC_LN250_ALT, DISPID(7), m_Alt);
	DDX_OCFloat(pDX, IDC_LN250_LAT, DISPID(7), m_Lat);
	DDX_OCFloat(pDX, IDC_LN250_LON, DISPID(7), m_Lon);
	DDX_OCFloat(pDX, IDC_LN250_NVEL, DISPID(7), m_Nvel);
	DDX_OCFloat(pDX, IDC_LN250_VVEL, DISPID(7), m_Vvel);
	DDX_OCFloat(pDX, IDC_LN250_BIASX, DISPID(7), m_biasX);
	DDX_OCFloat(pDX, IDC_LN250_BIASY, DISPID(7), m_biasY);
	DDX_OCFloat(pDX, IDC_LN250_PITCH, DISPID(7), m_Pitch2);
	DDX_OCFloat(pDX, IDC_LN250_PITCHRATE, DISPID(7), m_PitchRate);
	DDX_OCFloat(pDX, IDC_LN250_ROLL, DISPID(7), m_Roll2);
	DDX_OCFloat(pDX, IDC_LN250_ROLLRATE, DISPID(7), m_RollRate);
	DDX_OCFloat(pDX, IDC_LN250_YAW, DISPID(7), m_Yaw2);
	DDX_OCFloat(pDX, IDC_LN250_YAWRATE, DISPID(7), m_YawRate);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CLN250Dlg, CTestDlg)
	//{{AFX_MSG_MAP(CLN250Dlg)
	ON_BN_CLICKED(IDC_FREE_INERTIAL, OnFreeInertial)
	ON_BN_CLICKED(IDC_LN250_MOT_ALIGN, OnLn250MotAlign)
	ON_BN_CLICKED(IDC_LN250_STAT_ALIGN, OnLn250StatAlign)
	ON_NOTIFY(TCN_SELCHANGE, IDC_LN250TAB, OnTabSelchange)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLN250Dlg message handlers

void CLN250Dlg::initSubClassDlg()
{
	DWORD dwExStyle= m_Ln250TabControl.GetExtendedStyle();
	m_Ln250TabControl.SetExtendedStyle(dwExStyle | TCS_EX_FLATSEPARATORS);

	TC_ITEM TabCtrlItem;
	TabCtrlItem.mask = TCIF_TEXT;
	TabCtrlItem.pszText = "Hybrid";
	m_Ln250TabControl.InsertItem( 0, &TabCtrlItem );
	TabCtrlItem.pszText = "Inertial";
	m_Ln250TabControl.InsertItem( 1, &TabCtrlItem );

	m_tabVal = 0;

	SetTimer(LN250_TIMER, LN250_TIMER_ELAPSE,0);
}

void CLN250Dlg::requestUpdate()
{
	Assert(m_recipient);
	m_recipient->requestData(MMAgentRequest::Start,
		ModemMessage::tMMLN250, 2);
}

void CLN250Dlg::stopRequests()
{
	Assert(m_recipient);
	m_recipient->requestData(MMAgentRequest::Stop,
		ModemMessage::tMMLN250, -1);
	resetDialog();
}

void CLN250Dlg::resetDialog()
{	
	UpdateData(TRUE);
	m_hyRoll = 0.0f;
	m_hyPitch = 0.0f;
	m_hyYaw = 0.0f;
	m_hyEvel = 0.0f;
	m_hyAlt = 0.0f;
	m_hyLat = 0.0f;
	m_hyLon = 0.0f;
	m_hyNvel = 0.0f;
	m_hyVvel = 0.0f;
	m_insRoll = 0.0f;
	m_insAlt = 0.0f;
	m_insPitch = 0.0f;
	m_insYaw = 0.0f;
	m_insEvel = 0.0f;
	m_insLat = 0.0f;
	m_insLon = 0.0f;
	m_insNvel = 0.0f;
	m_insVvel = 0.0f;
	m_systime = 0.0f;
	m_mode = _T("");
	m_type = _T("");
	m_biasX = 0.0f;
	m_biasY = 0.0f;
	UpdateData(FALSE);
}
/*
int i;
	m_TabSel = m_Tab1Ctrl.GetCurSel();
	m_RemoteFileControl.ResetContent();
	switch(m_TabSel)
	{
	case 0:
		for(i = 0; i < m_missionList.GetSize(); i++){
			m_RemoteFileControl.AddString(m_missionList[i]->GetBuffer(0));
		}
		break;
	case 1:
		for(i = 0; i < m_configList.GetSize(); i++){
			m_RemoteFileControl.AddString(m_configList[i]->GetBuffer(0));
		}
		break;
	}
*/

void CLN250Dlg::setLn250(int ln250type, float sysTime, char valid, float lat, 
			  float lon, float alt, float nvel, float evel, 
			  float vvel, float biasX, float biasY, float pitch, float roll, float yaw,
			  float pRate, float rRate, float yRate, short mode, 
			  short type)
{
	UpdateData(TRUE);

	receiveData();

	m_systime = sysTime;

	m_biasX = biasX;
	m_biasY = biasY;
	if(alt > 100) alt = 100.0;

	//only do mode in hybrid
	CString temp;
	m_mode.Format("Mode %d:", mode);
	switch(mode) {
	case 1:
		temp = "Leveling";
		break;
	case 2:
		temp = "Wide Angle/GC Align";
		break;
	case 3:
		temp = "Reserved";
		break;
	case 4:
		temp = "Inflight Coarse Align/Transfer Align";
		break;
	case 5:
		temp = "Integrated Nav";
		break;
	case 6:
		temp = "Stored/External Heading Align";
		break;
	default:
		temp = "Unknown Mode";
		break;
	}

	m_mode += temp;

	switch(ln250type){
	case MMLN250::InsOnly:
		m_insLat = lat;
		m_insLon = lon;
		m_insAlt = alt;
		m_insNvel = nvel;
		m_insEvel = evel;
		m_insVvel = vvel;
		m_insPitch = pitch;
		m_insRoll = roll;
		m_insYaw = yaw;
		m_insPitchRate = pRate;
		m_insRollRate = rRate;
		m_insYawRate = yRate;
		break;
	case MMLN250::Hybrid:
		m_hyLat = lat;
		m_hyLon = lon;
		m_hyAlt = alt;
		m_hyNvel = nvel;
		m_hyEvel = evel;
		m_hyVvel = vvel;
		m_hyPitch = pitch;
		m_hyRoll = roll;
		m_hyYaw = yaw;
		m_hyPitchRate = pRate;
		m_hyRollRate = rRate;
		m_hyYawRate = yRate;
		break;
	}
	if (m_tabVal == 0) { // hybrid
		m_Lat = m_hyLat;
		m_Lon = m_hyLon;
		m_Alt = m_hyAlt;
		m_Nvel = m_hyNvel;
		m_Evel = m_hyEvel;
		m_Vvel = m_hyVvel;
		m_Pitch = m_hyPitch;
		m_Roll = m_hyRoll;
		m_Yaw = m_hyYaw;
		m_Pitch2 = m_hyPitch;
		m_Roll2 = m_hyRoll;
		m_Yaw2 = m_hyYaw;
		m_PitchRate = m_hyPitchRate;
		m_RollRate = m_hyRollRate;
		m_YawRate = m_hyYawRate;
	} 

	if (m_tabVal == 1) { // free inertial
		m_Lat = m_insLat;
		m_Lon = m_insLon;
		m_Alt = m_insAlt;
		m_Nvel = m_insNvel;
		m_Evel = m_insEvel;
		m_Vvel = m_insVvel;
		m_Pitch = m_insPitch;
		m_Roll = m_insRoll;
		m_Yaw = m_insYaw;
		m_Pitch2 = m_insPitch;
		m_Roll2 = m_insRoll;
		m_Yaw2 = m_insYaw;
		m_PitchRate = m_insPitchRate;
		m_RollRate = m_insRollRate;
		m_YawRate = m_insYawRate;
	}

	UpdateData(FALSE);
}

void CLN250Dlg::OnFreeInertial() 
{
	m_recipient->setString("ln250FreeInertial");	
}

void CLN250Dlg::OnLn250MotAlign() 
{
	m_recipient->setString("ln250MotionAlign");	
}

void CLN250Dlg::OnLn250StatAlign() 
{
	m_recipient->setString("ln250StatAlign");
}

void CLN250Dlg::OnTabSelchange(NMHDR* pNMHDR, LRESULT* pResult)
{
	m_tabVal = m_Ln250TabControl.GetCurSel();

	switch(m_tabVal)
	{
	case 0:
		m_Lat = m_hyLat;
		m_Lon = m_hyLon;
		m_Alt = m_hyAlt;
		m_Nvel = m_hyNvel;
		m_Evel = m_hyEvel;
		m_Vvel = m_hyVvel;
		m_Pitch = m_hyPitch;
		m_Roll = m_hyRoll;
		m_Yaw = m_hyYaw;
		m_Pitch2 = m_hyPitch;
		m_Roll2 = m_hyRoll;
		m_Yaw2 = m_hyYaw;
		m_PitchRate = m_hyPitchRate;
		m_RollRate = m_hyRollRate;
		m_YawRate = m_hyYawRate;
		break;
	case 1:
		m_Lat = m_insLat;
		m_Lon = m_insLon;
		m_Alt = m_insAlt;
		m_Nvel = m_insNvel;
		m_Evel = m_insEvel;
		m_Vvel = m_insVvel;
		m_Pitch = m_insPitch;
		m_Roll = m_insRoll;
		m_Yaw = m_insYaw;
		m_Pitch2 = m_insPitch;
		m_Roll2 = m_insRoll;
		m_Yaw2 = m_insYaw;
		m_PitchRate = m_insPitchRate;
		m_RollRate = m_insRollRate;
		m_YawRate = m_insYawRate;
		break;
	}
	UpdateData(FALSE);

	*pResult = 0;
}