// CDashboardRecipient.h: interface for the CDashboardRecipient class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DASHBOARDRECIPIENT_H__16141B56_7148_4310_A565_02A3F9566C3B__INCLUDED_)
#define AFX_DASHBOARDRECIPIENT_H__16141B56_7148_4310_A565_02A3F9566C3B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CDashboardDlg;

class ModemSocket;
class ModemSerial;
class ModemAcousticATM870;

#include <remote/ModemMessage.h>
#include <remote/MMRecipient.h>
#include <remote/MMAgentRequest.h>
#include <remote/MMBehavior.h>
#include "DataRecipient.h"
#include <vector>
#include <set>
#include "MissionControlSettingsDlg.h"

class CDashboardRecipient : public MMRecipient  
{
public:
	CDashboardRecipient(CDashboardDlg* dialog);
	virtual ~CDashboardRecipient();

	static CDashboardRecipient * getDashboardRecipient();

	//copy of DeviceIF for status info

	enum DeviceStatus {
		Offline = 0,
		Initializing,
		Ok,
		Error,
		FailedInit,
		FailedRead,
		Failed,
		Unknown
	}; 

	void test();
	void setRequestBlock(bool b);
	void setMessageManager(CMissionControlSettingsDlg *manager) 
		{ m_MessageManager = manager; };

	void requestData(MMAgentRequest::Request request,
		ModemMessage::Type type, int period, bool blockOverride = 0);
	void stopAllRequests();
	int getNumCircuits() { return m_numCircuits; };
	void setTailcone(double propRpm, double elevDeg, double rudderDeg);
	void setCircuit(int number, bool value);
	void setAllCircuits(bool values[]);
	void releaseDropWeight(int weight, bool fire);
	void setCommand(double propRpm, double elevAngle, double rudderAngle);
	void setCommand(double speed, double vertical, double horizontal,
		int speedMode, int verticalMode, int horizontalMode);
	void setBatteryPower(int pack, bool value);
	void setBatteryPower(bool value);
	void setWatchdog(int watchdog, bool value);
	void setNmeaString(char* str);
	void setRtcmString(char* str, int len);
	void setServer(int port, int val);
	void setMission(char * missionFile, char * abortFile, short startMission);
	void setBehavior(short stateNum, short priorityNum,
					 short nameSize, char* name,
					 short dataSize, char* data);
	void setBehaviorArray(short numChanges, short* states, 
						  short* priorities, short *nameSizes,
						  char**names, short* dataSizes, char** data);
	void setNormalMissionName(char* name, int jump = -1);
	void setAbortMissionName(char* name, int jump = -1);
	void setDriverCommand(char* name, Boolean turnOn);
	void setString(char* name);
	void setJumpBehavior(int j);

	void sendUSBLFix(long fixNum, float rxPitch, float rxRoll, float rxHeading, float dcl, float dcm, float eastings, float northings, Boolean reset = false);
	
	void addDataRecipient(CDataRecipient * recip) { m_recips.Add(recip); };

	void removeDataRecipient(CDataRecipient *recip);


	static DeviceStatus int2dev(int x) {
		switch(x) {
		case 0: return Offline;
		case 1: return Initializing;
		case 2: return Ok;
		case 3: return Error;
		case 4: return FailedInit;
		case 5: return FailedRead;
		case 6: return Failed;
		}
		return Unknown;
	}

	// Required by MMRecipient
	virtual void receive(const ModemMessage* pMM);

protected:
	// The dialog
	CDashboardDlg* m_dialog;
	bool m_requestBlock;
	CMissionControlSettingsDlg * m_MessageManager;

	CArray<CDataRecipient*, CDataRecipient*> m_recips;
 
	MMBehaviorArray* _lastBehaviorArray;
	MMBehavior* _lastBehavior;

	//FILE *debuglog;

	// List of requests
	CList<MMAgentRequest*,MMAgentRequest*> *m_requestList;
	void addRequest(MMAgentRequest* request);

	void handleString(char* str);

	void send(ModemMessage *message);

	// Conversion utility
	int port2int(const char* port);

	// Power board numbers
	int m_numCircuits;
	int m_numCurrents;
	int m_numGroundFaults;
	int m_numTemperatures;
	int m_numWaterAlarms;
	int m_numBatteryPacks;

	static CDashboardRecipient* _gpDashboardRecipient;
};

#endif // !defined(AFX_DASHBOARDRECIPIENT_H__16141B56_7148_4310_A565_02A3F9566C3B__INCLUDED_)
