00001 #ifndef __CONTROLLER_H__
00002 #define __CONTROLLER_H__
00003
00004 #include <stdint.h>
00005
00006 #include <map>
00007 #include <set>
00008 #include <list>
00009 #include <utility>
00010 #include <string>
00011
00012 #include "threadutils.h"
00013 #include "scheduler.h"
00014 #include "modules.h"
00015 #include "processthread.h"
00016
00017 #ifdef LoadImage
00018 #undef LoadImage
00019 #endif
00020
00022
00024 namespace spectral
00025 {
00026 class Image;
00027 class Parameters;
00028 }
00029
00030 namespace control
00031 {
00032 class ProcessThread;
00033 }
00034
00036
00038 namespace control
00039 {
00040
00041
00042
00043 class NodeData
00044 {
00045 public:
00046 NodeData();
00047 NodeData(const NodeData &);
00048 NodeData(spectral::Processor *);
00049 ~NodeData();
00050 const NodeData & operator=(const NodeData &other);
00051
00052 uint32_t GetIO(std::list<std::pair<uint32_t, uint32_t> >&,
00053 std::list<std::pair<uint32_t, uint32_t> >&) const;
00054
00055 spectral::Parameters *GetParameters(void) const;
00056 void SetParameters(spectral::Parameters *);
00057
00058 const std::map<uint32_t, int32_t>& GetInputs(void) const;
00059
00060 uint32_t GetInputType(uint32_t slot);
00061 int32_t GetInputID(uint32_t slot);
00062
00063 void LinkInput(uint32_t slot, int32_t id);
00064 void UnlinkInput(int32_t id);
00065 bool HasLink(int32_t id);
00066
00067 private:
00068 uint32_t m_outputType;
00069 std::list<std::pair<uint32_t, uint32_t> > m_mandatory;
00070 std::list<std::pair<uint32_t, uint32_t> > m_optional;
00071 spectral::Parameters *m_parameters;
00072 std::map<uint32_t, int32_t> m_inputs;
00073 };
00074
00075
00076
00077
00078 class STM_EXPORT Controller : public thread::Thread
00079 {
00080 public:
00081 Controller(const std::string &modulePath,
00082 const std::list<std::string> &modules);
00083 virtual ~Controller();
00084
00085 void LoadImage(const std::string &fn);
00086 void LoadImage(int32_t id, const std::string &fn);
00087 void SaveImage(int32_t id, const std::string &fn);
00088 void Process(void);
00089 void Shutdown(void);
00090
00091 void AddActor(int32_t id, std::string name);
00092 void RemoveActor(int32_t id);
00093 void AddLink(int32_t id, uint32_t slot, int32_t input_id);
00094
00095 void RequestParameters(int32_t id);
00096 void RequestImage(int32_t id);
00097
00098 void SetParameters(int32_t id, spectral::Parameters *params);
00099
00100 MessageQueue &GetOutputQueue(void) {return m_output;}
00101 protected:
00102 virtual void *MainLoop(void);
00103 private:
00104
00105
00106
00107
00108
00109 void LoadModules(const std::list<std::string> &);
00110
00111
00112 void ProcessImage(void);
00113 bool StartNextProcess(void);
00114
00115
00116 void _EraseImage(int32_t);
00117 uint32_t _SetImage(int32_t, spectral::Image *);
00118 spectral::Image *_GetImage(int32_t);
00119 uint32_t _GetImageSeq(int32_t);
00120 void _RemoveActor(int32_t);
00121
00122
00123 uint32_t _GetSeqNumber(void);
00124
00125
00126 void _RebuildDependencies(void);
00127
00128 void Stop(void);
00129
00130
00131
00132
00133
00134
00135 void OnMsgSetActor(int32_t id, std::string &name);
00136 void OnMsgSetInput(int32_t id, std::pair<uint32_t, int32_t> link);
00137 void OnMsgLoadImage(int32_t id, spectral::Image *img);
00138 void OnMsgSaveImage(int32_t id, const std::string &fn);
00139 void OnMsgResult(int32_t id, spectral::Image *img, bool &terminate);
00140
00141
00142
00143
00144
00145
00146 spectral::Modules m_moduleLoader;
00147 std::string m_modulePath;
00148
00149
00150 std::map<int32_t, NodeData> m_graph;
00151 Scheduler m_scheduler;
00152
00153
00154 std::map<int32_t, std::pair<uint32_t, spectral::Image*> > m_images;
00155
00156
00157 std::map<int32_t, ProcessThread*> m_actors;
00158
00159
00160 MessageQueue m_queue;
00161 MessageQueue m_output;
00162 uint32_t m_sequenceNumber;
00163 };
00164
00165 }
00166
00167 #endif