// DashboardDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Dashboard.h"
#include "DashboardRecipient.h"
#include "DashboardDlg.h"
#include "DlgProxy.h"
#include "DeviceDlg.h"
#include "CommsDlg.h"
#include "MissionControlDlg.h"
#include <remote/MMDropWeight.h>
#include "NmeaDlg.h"
#include "DataDlg.h"
#include "DataRecipient.h"
#include "FileManagerDlg.h"
#include "MissionControlSettingsDlg.h"
#include "TopsideLogDlg.h"

#include <remote/MMNmea.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define MMCOMMS_TIMER 1
#define MMCOMMS_TIMER_ELAPSE 25

#define MMNMEA_TIMER 2
#define MMNMEA_TIMER_ELAPSE 25



/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDashboardDlg dialog

IMPLEMENT_DYNAMIC(CDashboardDlg, CDialog);

CDashboardDlg::CDashboardDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDashboardDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDashboardDlg)
	m_connected = FALSE;
	m_devicesOK = FALSE;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_pAutoProxy = NULL;
	m_deviceDlg = NULL;
	m_commsDlg = NULL;
	m_nmeaDlg = NULL;
	m_missionDlg = NULL;
	m_dataDlg = NULL;
	m_filemanagerDlg = NULL;
	m_settingsDlg = NULL;
	m_logger = NULL;

	char temp[128];
	GetCurrentDirectory(128,temp);
	m_homeDir = temp;

	EnableToolTips(TRUE);
}

CDashboardDlg::~CDashboardDlg()
{
	// If there is an automation proxy for this dialog, set
	//  its back pointer to this dialog to NULL, so it knows
	//  the dialog has been deleted.
	if (m_pAutoProxy != NULL)
		m_pAutoProxy->m_pDialog = NULL;

	if (m_recipient) delete m_recipient;
	if (m_deviceDlg) delete m_deviceDlg;
	if (m_commsDlg) delete m_commsDlg;
	if (m_missionDlg) delete m_missionDlg;
	if (m_nmeaDlg) delete m_nmeaDlg;
	if (m_filemanagerDlg) delete m_filemanagerDlg;
	if (m_settingsDlg) delete m_settingsDlg;
}

void CDashboardDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDashboardDlg)
	DDX_OCBool(pDX, IDC_DEVICESOK, DISPID(2), m_devicesOK);
	DDX_OCBool(pDX, IDC_CONNECT, DISPID(2), m_connected);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDashboardDlg, CDialog)
	//{{AFX_MSG_MAP(CDashboardDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_DESTROY()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CLOSE()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_DEVICE_CHECKOUT, OnDeviceCheckout)
	ON_BN_CLICKED(IDC_COMM_SETTINGS, OnCommSettings)
	ON_BN_CLICKED(IDC_MISSION_CONTROL, OnMissionControl)
	ON_BN_CLICKED(IDC_DATA_WINDOW, OnDataDlg)
	ON_BN_CLICKED(IDC_FILEMANAGER, OnFileManagerDlg)
	ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify )
	ON_BN_CLICKED(IDC_MESSAGE_WINDOW, OnMessageDlg )
	ON_BN_CLICKED(IDC_TOPLOG, OnTopsideLog )
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDashboardDlg message handlers

//	ON_BN_CLICKED(IDC_TOPLOG, OnTopsideLog )

BOOL CDashboardDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here
	m_recipient = new CDashboardRecipient(this);
	//m_recipient->addDataRecipient(this);

	char temp[128];
	GetCurrentDirectory(128,temp);
	m_homeDir = temp;
		

	// Add new stuff here
	OnNmeaDlg();
	
	//gotta call this before commsDlg
	OnTopsideLog();

	OnCommsDlg();
	SetupMessageDlg();

	SetTimer(MMCOMMS_TIMER,MMCOMMS_TIMER_ELAPSE,0);
	SetTimer(MMNMEA_TIMER,MMNMEA_TIMER_ELAPSE,0);


	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CDashboardDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

void CDashboardDlg::OnDestroy()
{
	WinHelp(0L, HELP_QUIT);
	CDialog::OnDestroy();
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CDashboardDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		/*
		// device context for painting
		CPaintDC dc(this);
		CBitmap bmp;
		bmp.LoadBitmap( IDB_THALESAUV );

		// Calculate bitmap size using a BITMAP structure.
		BITMAP bm;
		bmp.GetBitmap(&bm);

		// Create a memory DC, select the bitmap into the
		// memory DC, and BitBlt it into the view.
		CDC dcMem;
		dcMem.CreateCompatibleDC( &dc );
		CBitmap* pbmpOld = dcMem.SelectObject( &bmp );
		dc.BitBlt( 10,10, bm.bmWidth, bm.bmHeight,&dcMem, 0,0, SRCCOPY );

		// Reselect the original bitmap into the memory DC.
		dcMem.SelectObject( pbmpOld );
		*/
		CDialog::OnPaint();
	}
}

BOOL CDashboardDlg::OnToolTipNotify(UINT id, NMHDR * pTTTStruct, LRESULT * pResult)
{
	UINT nID = ::GetDlgCtrlID((HWND)pTTTStruct->idFrom);
	switch (nID) {
	case (IDC_DEVICE_CHECKOUT):
		((NMTTDISPINFO *)pTTTStruct)->lpszText = "Run device checkout";
		break;
	case (IDC_MISSION_CONTROL):
		((NMTTDISPINFO *)pTTTStruct)->lpszText = "Monitor a mission";
		break;
	case (IDC_COMM_SETTINGS):
		((NMTTDISPINFO *)pTTTStruct)->lpszText = "Check communication settings";
		break;
	case (ID_HELP):
		((NMTTDISPINFO *)pTTTStruct)->lpszText = "Display Dashboard help";
		break;
	case (IDOK):
		((NMTTDISPINFO *)pTTTStruct)->lpszText = "Exit application";
		break;
	case (IDC_CONNECT):
		((NMTTDISPINFO *)pTTTStruct)->lpszText = "Connection status";
		break;
	}
	return TRUE;
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDashboardDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

// Automation servers should not exit when a user closes the UI
//  if a controller still holds on to one of its objects.  These
//  message handlers make sure that if the proxy is still in use,
//  then the UI is hidden but the dialog remains around if it
//  is dismissed.

void CDashboardDlg::OnClose()
{
	if (CanExit())
		CDialog::OnClose();
}

void CDashboardDlg::OnOK()
{
	if (CanExit())
		CDialog::OnOK();
}

void CDashboardDlg::OnCancel()
{
	if (CanExit())
		CDialog::OnCancel();
}

BOOL CDashboardDlg::CanExit()
{
	// If the proxy object is still around, then the automation
	//  controller is still holding on to this application.  Leave
	//  the dialog around, but hide its UI.
	if (m_pAutoProxy != NULL)
	{
		ShowWindow(SW_HIDE);
		return FALSE;
	}

	return TRUE;
}

void CDashboardDlg::OnTimer(UINT nIDEvent)
{
	// Run a recipient cycle.
	static bool b = false;
	if (((nIDEvent == MMCOMMS_TIMER) & !b) && (m_commsDlg != NULL)) {
		b = true;
		m_commsDlg->runCycle();
		b = false;
	}

	// Run a nmea cycle.
	static bool c = false;
	if (((nIDEvent == MMNMEA_TIMER) & !c) && (m_commsDlg != NULL)) {
		c = true;
		m_commsDlg->runSerialCycle();
		c = false;
	}

	// Run MessageControl
	static bool d = false;
	if (((nIDEvent == MMCOMMS_TIMER) & !d) && (m_settingsDlg != NULL)) {
		d = true;
		m_settingsDlg->runCycle();
		d = false;
	}

	CDialog::OnTimer(nIDEvent);
}

void CDashboardDlg::setConnected(bool value)
{
	UpdateData(TRUE);
	BOOL prev = m_connected;
	m_connected = value;
	// if (prev && !m_connected) setUnderway(false);
	UpdateData(FALSE);
}

void CDashboardDlg::setDevicesOK(bool value)
{
	UpdateData(True);
	m_devicesOK = value;
	UpdateData(False);
}

/*
void CDashboardDlg::setServerAlarm(int number, bool value)
{
	if ((MMServerAlarm::Server) number == MMServerAlarm::LayeredControl) {
		setUnderway(!value);
	}
}
*/

void CDashboardDlg::OnDeviceCheckout()
{
	if (!m_socketConnect1 && !m_socketConnect2) {
		if (MessageBox("You do not have a socket connection.  "
			"Do you still want to run a device checkout?",
			"Confirm",MB_YESNO) == IDNO) {
			return;
		}
	}

	if (!m_deviceDlg) {
		m_deviceDlg = new CDeviceDlg(this);
		m_recipient->addDataRecipient(m_deviceDlg);
		m_deviceDlg->setRecipient(m_recipient);
		m_deviceDlg->setHomeDir(m_homeDir);
		m_deviceDlg->Create(IDD_DEVICE_DIALOG);
		m_deviceDlg->setDashboardDlg(this);
		m_deviceDlg->resetDialog();
		m_deviceDlg->ShowWindow(SW_SHOWNORMAL);
	} else {
		m_deviceDlg->ShowWindow(SW_SHOWNORMAL);
		m_deviceDlg->requestUpdate();
	}
}

void CDashboardDlg::OnCommsDlg()
{
	// TODO: Add your control notification handler code here
	if (!m_commsDlg) {
		m_commsDlg = new CCommsDlg(this);
		m_recipient->addDataRecipient(m_commsDlg);
		m_commsDlg->setRecipient(m_recipient);
		m_commsDlg->setHomeDir(m_homeDir);
		m_commsDlg->initializeModemSystem();
		m_commsDlg->setNmeaDlg(m_nmeaDlg);
		m_commsDlg->setDialog(this);
		m_commsDlg->setLogDlg(m_logger);
		m_commsDlg->Create(IDD_COMMS_DIALOG);
	}
}

void CDashboardDlg::OnCommSettings()
{
	// TODO: Add your control notification handler code here
	Assert(m_commsDlg != NULL);
	m_commsDlg->ShowWindow(SW_SHOWNORMAL);	
	m_commsDlg->InitStuff();
}


void CDashboardDlg::OnTopsideLog()
{
	if (!m_logger) {
		m_logger = new CTopsideLogDlg(this);
		m_logger->Create(IDD_TOPSIDE_LOG_DLG);
	} else {
		m_logger->ShowWindow(SW_SHOWNORMAL);
	}
}


void CDashboardDlg::OnMissionControl()
{
	// TODO: Add your control notification handler code here
	if (!m_missionDlg) {
		m_missionDlg = new CMissionControlDlg(this);
		m_recipient->addDataRecipient(m_missionDlg);
		m_missionDlg->setDashboardDlg(this);
		m_missionDlg->setRecipient(m_recipient);
		m_missionDlg->Create(IDD_MISSION_DIALOG);
		m_missionDlg->ShowWindow(SW_SHOWNORMAL);
	} else {
		m_missionDlg->requestUpdate();
		m_missionDlg->ShowWindow(SW_SHOWNORMAL);
	}
}

void CDashboardDlg::OnNmeaDlg()
{
	if (!m_nmeaDlg) {
		m_nmeaDlg = new CNmeaDlg(this);
		m_nmeaDlg->setRecipient(m_recipient);
		m_nmeaDlg->setDialog(this);
		m_nmeaDlg->Create(IDD_NMEA_DIALOG);
	}
}
/*
void CDashboardDlg::setNmeaPos(char* str)
{
	if (m_nmeaDlg) {
		m_nmeaDlg->setVehiclePos(str);		
		m_commsDlg->SendSerialString(str);
	}
}
*/


void CDashboardDlg::OnDataDlg()
{
	if (!m_dataDlg) {
		m_dataDlg = new CDataDlg(this);
		m_recipient->addDataRecipient(m_dataDlg);
		m_dataDlg->Create(IDD_DATA_DIALOG);
//		SetWindowPos( this, 50, 50, 0, 0, 0);
		m_dataDlg->ShowWindow(SW_SHOWNORMAL);	
	}else {
		m_dataDlg->ShowWindow(SW_SHOWNORMAL);
	}
}

void CDashboardDlg::getCommsInfo(char* addrOne, bool* conOne, char* addrTwo, bool* conTwo) {
	if (m_commsDlg != NULL) {
		strcpy(addrOne, m_commsDlg->m_socketAddress1);
		strcpy(addrTwo, m_commsDlg->m_socketAddress2);
		*conOne = ((m_commsDlg->m_socketConnection1 == 0) ? 0 : 1);
		*conTwo = ((m_commsDlg->m_socketConnection2 == 0) ? 0 : 1);
	}
}


void CDashboardDlg::OnFileManagerDlg()
{
	if (!m_filemanagerDlg) {
		m_filemanagerDlg = new CFileManagerDlg(this);
		m_filemanagerDlg->setRecipient(m_recipient);
		m_filemanagerDlg->setDashboadDlg(this);
		m_filemanagerDlg->setHomeDir(m_homeDir);
		m_filemanagerDlg->ConfigureFTP(m_commsDlg->m_socketAddress1,
										m_commsDlg->m_socketConnection1,
										m_commsDlg->m_socketAddress2,
										m_commsDlg->m_socketConnection2);
		m_filemanagerDlg->Create(IDD_FILEMANAGER_DIALOG);
		m_filemanagerDlg->ShowWindow(SW_SHOWNORMAL);	
	}else {
		m_filemanagerDlg->ShowWindow(SW_SHOWNORMAL);
	}
}

void CDashboardDlg::closeDevCheckout()
{
	if(m_deviceDlg == NULL) return;
	m_deviceDlg->closeAllTests();
	m_deviceDlg->stopRequests();
	m_deviceDlg->resetDialog();
	m_deviceDlg->EndDialog(0);
}

void CDashboardDlg::SetupMessageDlg(){
	if (!m_settingsDlg) {
		m_settingsDlg = new CMissionControlSettingsDlg(this);
		m_recipient->addDataRecipient(m_settingsDlg);
		m_settingsDlg->setRecipient(m_recipient);
		m_settingsDlg->setHomeDir(m_homeDir);
		m_recipient->setMessageManager(m_settingsDlg);
		m_settingsDlg->Create(IDD_SETTINGS_DIALOG);
	}
}

void CDashboardDlg::OnMessageDlg()
{
	Assert(m_settingsDlg != NULL);
	m_settingsDlg->ShowWindow(SW_SHOWNORMAL);
}
