#ifndef DABC_Module #define DABC_Module #ifndef DABC_Folder #include "dabc/Folder.h" #endif #ifndef DABC_WorkingProcessor #include "dabc/WorkingProcessor.h" #endif #ifndef DABC_collections #include "dabc/collections.h" #endif #ifndef DABC_Command #include "dabc/Command.h" #endif #ifndef DABC_CommandClient #include "dabc/CommandClient.h" #endif #ifndef DABC_timing #include "dabc/timing.h" #endif #ifndef DABC_Buffer #include "dabc/Buffer.h" #endif #ifndef DABC_Parameter #include "dabc/Parameter.h" #endif namespace dabc { class PoolHandle; class ModuleItem; class Manager; class Port; class Timer; class Transport; class CommandDefinition; class Module : public Folder, public WorkingProcessor, public CommandClientBase { friend class Manager; friend class ModuleItem; friend class Port; enum { evntReinjectlost = evntFirstUser, evntReplyCommand }; protected: typedef std::vector PortsIndexVector; int fWorkStatus; // 1 - working, 0 - stoped, -1 - halt PointersVector fItems; // map for fast search of module items PortsIndexVector fInputPorts; // map for fast access to input ports PortsIndexVector fOutputPorts; // map for fast access to output ports PortsIndexVector fPorts; // map for fast access to IOports CommandsQueue fReplyes; // reply queue Queue fLostEvents; // events, coming while module is sleeping protected: void init(); Module(Manager* mgr, const char* name = "module"); Module(Manager* mgr, Command* cmd); public: virtual ~Module(); // this methods can be used from outside of module void Start(); void Stop(); // end of public methods, rest later will be moved to protected area unsigned NumInputs() const { return fInputPorts.size(); } unsigned NumOutputs() const { return fOutputPorts.size(); } unsigned NumPorts() const { return fPorts.size(); } Port* Input(unsigned n) const { return n < fInputPorts.size() ? GetPortItem(fInputPorts[n]) : 0; } Port* Output(unsigned n) const { return n < fOutputPorts.size() ? GetPortItem(fOutputPorts[n]) : 0; } Port* IOPort(unsigned n) const { return n < fPorts.size() ? GetPortItem(fPorts[n]) : 0; } Port* FindPort(const char* name); PoolHandle* FindPool(const char* name); unsigned InputNumber(Port* port); unsigned OutputNumber(Port* port); unsigned IOPortNumber(Port* port); Folder* GetPoolsFolder(bool force = false); Folder* GetPortsFolder(bool force = false); Folder* GetObjFolder(bool force = false); Folder* GetCmdDefFolder(bool force = false); Folder* GetTimersFolder(bool force = false); ModuleItem* GetItem(unsigned id) const { return idThrdTimeStamp() : NullTimeStamp; } TimeSource* GetThrdTimeSource() { return ProcessorThread() ? ProcessorThread()->ThrdTimeSource() : 0; } void GetUserEvent(ModuleItem* item, uint16_t evid); virtual void ProcessEvent(EventId evid); bool DoStop(); bool DoStart(); virtual void OnThreadAssigned(); virtual int PreviewCommand(Command* cmd); private: void ItemCreated(ModuleItem* item); void ItemDestroyed(ModuleItem* item); }; }; #endif