//////////////////////////////////////////////////////////////////////
//
-// multiplaymgr.hpp
+// multiplaymgr.hxx
//
// Written by Duncan McCreanor, started February 2003.
// duncan.mccreanor@airservicesaustralia.com
#define MULTIPLAYTXMGR_HID "$Id$"
-#include "mpmessages.hxx"
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
#include <string>
-using std::string;
#include <vector>
-using std::vector;
+#include <memory>
#include <simgear/compiler.h>
#include <simgear/props/props.hxx>
-#include <plib/netSocket.h>
-#include <Main/globals.hxx>
-
-#include <AIModel/AIMultiplayer.hxx>
+#include <simgear/io/raw_socket.hxx>
+#include <simgear/structure/subsystem_mgr.hxx>
-struct FGExternalMotionInfo;
+struct FGExternalMotionData;
+class MPPropertyListener;
+struct T_MsgHdr;
+class FGAIMultiplayer;
-class FGMultiplayMgr
+class FGMultiplayMgr : public SGSubsystem
{
-public:
-
- struct IdPropertyList {
- unsigned id;
- const char* name;
- simgear::props::Type type;
- };
- static const IdPropertyList sIdPropertyList[];
- static const unsigned numProperties;
-
- static const IdPropertyList* findProperty(unsigned id);
-
+public:
FGMultiplayMgr();
~FGMultiplayMgr();
- bool init(void);
- void Close(void);
+
+ virtual void init(void);
+ virtual void update(double dt);
+
+ virtual void shutdown(void);
+ virtual void reinit();
+
// transmitter
- void SendMyPosition(const FGExternalMotionData& motionInfo);
+
void SendTextMessage(const string &sMsgText);
// receiver
- void Update(void);
private:
+ friend class MPPropertyListener;
+
+ void setPropertiesChanged()
+ {
+ mPropertiesChanged = true;
+ }
+
+ void findProperties();
+
+ void Send();
+ void SendMyPosition(const FGExternalMotionData& motionInfo);
+
union MsgBuf;
FGAIMultiplayer* addMultiplayer(const std::string& callsign,
const std::string& modelName);
FGAIMultiplayer* getMultiplayer(const std::string& callsign);
void FillMsgHdr(T_MsgHdr *MsgHdr, int iMsgId, unsigned _len = 0u);
- void ProcessPosMsg(const MsgBuf& Msg, const netAddress& SenderAddress,
+ void ProcessPosMsg(const MsgBuf& Msg, const simgear::IPAddress& SenderAddress,
long stamp);
- void ProcessChatMsg(const MsgBuf& Msg, const netAddress& SenderAddress);
+ void ProcessChatMsg(const MsgBuf& Msg, const simgear::IPAddress& SenderAddress);
+ bool isSane(const FGExternalMotionData& motionInfo);
/// maps from the callsign string to the FGAIMultiplayer
typedef std::map<std::string, SGSharedPtr<FGAIMultiplayer> > MultiPlayerMap;
MultiPlayerMap mMultiPlayerMap;
- netSocket* mSocket;
- netAddress mServer;
+ std::auto_ptr<simgear::Socket> mSocket;
+ simgear::IPAddress mServer;
bool mHaveServer;
bool mInitialised;
- string mCallsign;
+ std::string mCallsign;
+
+ // Map between the property id's from the multiplayers network packets
+ // and the property nodes
+ typedef std::map<unsigned int, SGSharedPtr<SGPropertyNode> > PropertyMap;
+ PropertyMap mPropertyMap;
+
+ bool mPropertiesChanged;
+ MPPropertyListener* mListener;
+
+ double mDt; // reciprocal of /sim/multiplay/tx-rate-hz
+ double mTimeUntilSend;
};
#endif