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
00027
00028 #ifndef LM_LOOM_KERNEL_H
00029 #define LM_LOOM_KERNEL_H
00030
00031
00032 #include <boost/bind.hpp>
00033 #include <boost/function.hpp>
00034 #include <boost/thread/mutex.hpp>
00035 #include <boost/thread/thread.hpp>
00036
00037 #include <list>
00038 #include <map>
00039 #include <queue>
00040 #include <string>
00041
00042 #ifdef PLEXUS
00043 #include <plx/Router/NodePtr.h>
00044 #endif
00045
00046 namespace lm
00047 {
00048
00049 class Agent;
00050 class Effector;
00051 class Sensor;
00052 class NetworkConnection;
00053
00054
00062 class LoomKernel
00063 {
00064 public:
00068 LoomKernel();
00069
00074 bool hasAgent(const std::string& name);
00075
00081 void init(int port = -1);
00082
00086 void connectTo(std::string hostname, int port);
00087
00092 void sendMessageWith(Agent* agent, Effector* e);
00093
00106 void update();
00107
00111 ~LoomKernel();
00112
00117 void add(const Sensor& newSensor);
00118
00123 void add(const Effector& newEffect);
00124
00129 void registerAgent(Agent* a);
00130
00136 void unregisterAgent(Agent* a);
00137
00142 std::string popPostQueue(Agent* a);
00143
00144 std::list<Agent*> getAgents();
00145
00146 public:
00147
00148 boost::function<void ()> bindedRun;
00149
00150 private:
00151
00158 void run(Agent* a);
00159
00160
00161 std::list<Agent*> mAgents;
00162
00163
00164 std::list<Effector*> effectorPool;
00165
00166
00167 std::list<Sensor*> sensorPool;
00168
00169 #ifdef PLEXUS
00170
00171 plx::NodePtr mLocalNode;
00172 #endif
00173
00177 boost::thread_group thrds;
00178
00183 boost::thread* mThreadPtr;
00184
00189 public:
00190 typedef std::map<Agent*, std::queue<std::string>* > QueueMap;
00191 QueueMap mPostQueueMap;
00192 QueueMap mPreQueueMap;
00193
00194 #ifdef PLEXUS
00195 NetworkConnection* mNetworkConnection;
00196 #endif
00197 };
00198
00199
00200 }
00201
00202 #endif // LM_AGENT_COLLECTOR_H