00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef ARSERVERMODE_H
00027 #define ARSERVERMODE_H
00028
00029 #include "Aria.h"
00030 #include "ArServerBase.h"
00031
00032 class ArServerClient;
00033
00035
00061 class ArServerMode
00062 {
00063 public:
00065 AREXPORT ArServerMode(ArRobot *robot, ArServerBase *server, const char *name);
00067 AREXPORT virtual ~ArServerMode();
00069 AREXPORT virtual ArActionGroup *getActionGroup(void) { return NULL; }
00071 AREXPORT virtual void activate(void) = 0;
00073 AREXPORT virtual void deactivate(void) = 0;
00075 AREXPORT virtual void userTask(void) {}
00077 AREXPORT virtual void requestUnlock(void) { }
00079 AREXPORT void lockMode(bool willUnlockIfRequested = false);
00081 AREXPORT void unlockMode(void);
00083 AREXPORT const char *getMode(void) const { return myMode.c_str(); }
00085 AREXPORT const char *getStatus(void) const { return myStatus.c_str(); }
00087 AREXPORT const char *getName(void) const { return myName.c_str(); }
00089 AREXPORT bool isActive(void) const { return myIsActive; }
00091 AREXPORT static bool willUnlockIfRequested(void);
00093 AREXPORT static ArServerMode *getActiveMode(void);
00095 AREXPORT bool hasSetActivityTime(void) { return myHasSetActivityTime; }
00097 AREXPORT ArTime getActivityTime(void);
00099 AREXPORT void setActivityTimeToNow(void);
00101 AREXPORT static int getActiveModeActivityTimeSecSince(void);
00103 AREXPORT void addAsDefaultMode(ArListPos::Pos pos = ArListPos::LAST);
00105
00110 AREXPORT virtual void checkDefault(void) {}
00112 AREXPORT void setMode(const char *str) { myMode = str; }
00114
00120 AREXPORT void setStatus(const char *str)
00121 { myStatus = str; myStatusSetThisCycle = true; }
00123 AREXPORT bool addModeData(
00124 const char *name, const char *description,
00125 ArFunctor2<ArServerClient *, ArNetPacket *> *functor,
00126 const char *argumentDescription, const char *returnDescription,
00127 const char *commandGroup = NULL, const char *dataFlags = NULL);
00129 AREXPORT static void getModeDataList(ArServerClient *client,
00130 ArNetPacket *packet);
00132 AREXPORT static void getModeInfo(ArServerClient *client,
00133 ArNetPacket *packet);
00135 AREXPORT void addActivateCallback(
00136 ArFunctor *functor, ArListPos::Pos position = ArListPos::LAST)
00137 { myActivateCallbacks.addCallback(functor, position); }
00139 AREXPORT void remActivateCallback(ArFunctor *functor)
00140 { myActivateCallbacks.remCallback(functor); }
00142 AREXPORT void addDeactivateCallback(
00143 ArFunctor *functor, ArListPos::Pos position = ArListPos::LAST)
00144 { myDeactivateCallbacks.addCallback(functor, position); }
00146 AREXPORT void remDeactivateCallback(ArFunctor *functor)
00147 { myDeactivateCallbacks.remCallback(functor); }
00148 protected:
00149 AREXPORT static void modeUserTask(void);
00150 AREXPORT static void buildModeInfoPacket(ArNetPacket *packet);
00151 AREXPORT static std::list<ArServerMode *> *getRequestedActivateModes(void);
00152 AREXPORT void checkBroadcastModeInfoPacket(void);
00154 AREXPORT bool baseActivate(void);
00156 AREXPORT void baseDeactivate(void);
00157
00158 ArCallbackList myActivateCallbacks;
00159 ArCallbackList myDeactivateCallbacks;
00160
00161 bool myIsActive;
00162 ArRobot *myRobot;
00163 ArServerBase *myServer;
00164 std::string myName;
00165
00166
00167 std::string myMode;
00168 std::string myStatus;
00169 bool myStatusSetThisCycle;
00170
00171
00172
00173
00174
00175 bool myHasSetActivityTime;
00176 ArTime myActivityTime;
00177 ArMutex myActivityTimeMutex;
00178
00179 AREXPORT static bool ourActiveModeLocked;
00180 AREXPORT static bool ourActiveModeWillUnlockIfRequested;
00181 AREXPORT static ArServerMode *ourActiveMode;
00182 AREXPORT static ArServerMode *ourNextActiveMode;
00183 AREXPORT static std::list<ArServerMode *> ourModes;
00184 AREXPORT static std::list<ArServerMode *> ourDefaultModes;
00185 AREXPORT static std::list<ArServerMode *> ourRequestedActivateModes;
00186 AREXPORT static std::multimap<std::string, std::string> ourModeDataMap;
00187 AREXPORT static ArMutex ourModeDataMapMutex;
00188 AREXPORT static ArGlobalFunctor2<ArServerClient *,
00189 ArNetPacket *> ourGetModeDataListCB;
00190 AREXPORT static ArGlobalFunctor2<ArServerClient *,
00191 ArNetPacket *> ourGetModeInfoCB;
00192 AREXPORT static bool ourLastActiveModeLocked;
00193 AREXPORT static ArServerMode *ourLastActiveMode;
00194 AREXPORT static bool ourLastActiveModeWillUnlockIfRequested;
00195 static ArGlobalFunctor ourUserTaskCB;
00196 static bool ourUserTaskAdded;
00197
00198 ArLog::LogLevel myVerboseLogLevel;
00199 };
00200
00201 #endif // ARSERVERMODE_H