//{{AFX_INCLUDES()
#include "cwknob.h"
//}}AFX_INCLUDES
#if !defined(AFX_COMMSDLG_H__A09C80C2_B47F_4E83_82FF_D195EB6C9EDB__INCLUDED_)
#define AFX_COMMSDLG_H__A09C80C2_B47F_4E83_82FF_D195EB6C9EDB__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// CommsDlg.h : header file
//

#include "WinSerialDevice.h"
#include "DataRecipient.h"

class CDashboardRecipient;
class CNmeaDlg;
class CDashboardDlg;
class ModemBroker;

class ModemSocket;
class ModemSerial;
class ModemAcousticATM870;
class LogListener;
class CTopsideLogDlg;

/////////////////////////////////////////////////////////////////////////////
// CCommsDlg dialog

class CCommsDlg : public CDialog, public CDataRecipient
{
// Construction
public:
	CCommsDlg(CWnd* pParent = NULL);   // standard constructor
	~CCommsDlg();

	void gotMessage(const ModemMessage* pMM);
	void sentMessage(const ModemMessage* pMM);



// Dialog Data
	//{{AFX_DATA(CCommsDlg)
	enum { IDD = IDD_COMMS_DIALOG };
	CComboBox	m_baudCombo5;
	CComboBox	m_serialCombo5;
	CEdit	m_MessageWatcher;
	CComboBox	m_serialCombo4;
	CComboBox	m_serialCombo3;
	CComboBox	m_serialCombo2;
	CComboBox	m_serialCombo1;
	CComboBox	m_baudCombo4;
	CComboBox	m_baudCombo3;
	CComboBox	m_baudCombo2;
	CComboBox	m_baudCombo1;
	CIPAddressCtrl	m_socket2;
	CIPAddressCtrl	m_socket1;
	BOOL	m_socketConnection1;
	BOOL	m_serialConnection2;
	BOOL	m_serialConnection1;
	int		m_baudSelection2;
	int		m_baudSelection1;
	BOOL	m_serialOn1;
	BOOL	m_serialOn2;
	BOOL	m_socketOn1;
	BOOL	m_socketConnection2;
	BOOL	m_socketOn2;
	int		m_baudSelection3;
	BOOL	m_serialConnection3;
	BOOL	m_serialOn3;
	int		m_baudSelection4;
	BOOL	m_serialConnection4;
	BOOL	m_serialOn4;
	int		m_serialSelection1;
	int		m_serialSelection2;
	int		m_serialSelection3;
	int		m_serialSelection4;
	CString	m_serialPort1;
  	CString	m_serialPort2;
	CString	m_serialPort3;
  	CString	m_serialPort4;
	CString	m_MessageWatcherString;
	BOOL	m_serialConnection5;
	int		m_baudSelection5;
	CString	m_serialPort5;
	int		m_serialSelection5;
	BOOL	m_serialOn5;
	CCWKnob	m_MessageGuageControl;
	//}}AFX_DATA

	void InitStuff();

	void loadConfiguration();
	void storeConfiguration();

	static bool getConnected(void);

	// My members
	void stopRequests() {};
	
	void splitIPAddress(char *address,BYTE *b1,BYTE *b2,BYTE *b3,BYTE *b4);

	void setNmeaDlg(CNmeaDlg* nmeaDlg) 
		{ m_nmeaDlg = nmeaDlg; };
	void setRecipient(CDashboardRecipient *recipient)
		{ m_recipient = recipient; };
	void setDialog(CDashboardDlg *dialog)
		{ m_dialog = dialog; };
	void setHomeDir(CString hd)
		{ m_homeDir = hd; };
	void setLogDlg(CTopsideLogDlg* l);
	
	// Simple serial comm commands
	void openSerialDriver(SerialDevice** device, const char* port, int baudRate);
	void disconnectSerialDriver(SerialDevice** device);
	void runSerialCycle();

	// Vehicle Modem system commands
	void initializeModemSystem();
	void runCycle();


	// Modems
	void addSocketModem1(const char *address);
	void addSocketModem2(const char *address);
	void addSerialModem1(const char *port, int baudRate);
	void addSerialModem2(const char *port, int baudRate);
	void addSerialModem3(const char *port, int baudRate);

	// Socket connection 1
	void disconnectSocket1();
	void getSocketAddress1(char *address)
		{ strcpy(address,m_socketAddress1); };

	// Socket connection 2
	void disconnectSocket2();
	void getSocketAddress2(char *address)
		{ strcpy(address,m_socketAddress2); };

	// Serial connection 1
	void disconnectSerial1();

	void SendSerialString(char * str);


// Remote socket addresses
	char *m_socketAddress1;
	char *m_socketAddress2;


	// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CCommsDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:

	bool m_active;

	//My members
	CDashboardRecipient *m_recipient;
	CNmeaDlg* m_nmeaDlg;
	CDashboardDlg* m_dialog;

	//for storeConfiguration
	CString m_homeDir;

	virtual BOOL OnInitDialog();
	void EnumerateSerialPorts(CUIntArray& ports);
	void addBaudToCombos(char *str);
	void SaveSettings();

	CUIntArray m_ports;

	//  Simple serial comms	
	SerialDevice* m_devNmeaIn;
	SerialDevice* m_devNmeaOut;
	SerialDevice* m_devRtcmIn;
	SerialDevice* m_devUsbl;

	// The vehicle modem system
	ModemBroker* m_pModemBroker;

	ModemSocket* m_pModemSocket1;
	ModemSocket* m_pModemSocket2;
	ModemSerial* m_pModemSerial1;
	
	LogListener* m_logListener;

	// Modem instantiated
	bool m_socketAlive1;
	bool m_socketAlive2;
	bool m_serialAlive1;
	
	// Cycle flag
	bool m_cycle;

	int m_rtcmFailCount;
	int m_usblFailCount;

	bool m_mw;
	
	long m_fix1;
	long m_fix2;
	float m_rxPitch;
	float m_rxRoll;
	float m_rxHeading;
	float m_dcl;
	float m_dcm;
	float m_eastings;
	float m_northings;


	char m_nmeaBuf[256];
	char m_rtcmBuf[256];

	CDataExchange* m_pDX;

	// Generated message map functions
	//{{AFX_MSG(CCommsDlg)
	virtual void OnOK();
	afx_msg void OnConnect();
	afx_msg void OnValueChangedSerialOn1(BOOL Value);
	afx_msg void OnValueChangedSerialOn2(BOOL Value);
	afx_msg void OnValueChangedSerialOn3(BOOL Value);
	afx_msg void OnValueChangedSocketOn1(BOOL Value);
	afx_msg void OnValueChangedSocketOn2(BOOL Value);
	afx_msg void OnNmeabutton();
	afx_msg void OnValueChangedSerialOn4(BOOL Value);
	afx_msg void OnValueChangedSerialOn5(BOOL Value);
	DECLARE_EVENTSINK_MAP()
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_COMMSDLG_H__A09C80C2_B47F_4E83_82FF_D195EB6C9EDB__INCLUDED_)
