/* * FunctionCore.h * * Created on: 18 May 2016 * Author: wentzelc */ #ifndef REDACORE_FUNCTIONCORE_H_ #define REDACORE_FUNCTIONCORE_H_ // Standard C/C++ Libraries #include // redA Libraries #include "LogCore.h" #include "DataTreeCore.h" //--------------------------------------------------------------------------- // Preview typedef struct SChannel TChannel; typedef struct SChannelLink TChannelLink; class CFunctionCore; //--------------------------------------------------------------------------- struct SChannel { char * Name = NULL; char * Ref = NULL; TChannelLink * FirstLink = NULL; // List of channels linked for input/output bool Ready = false; // Channel ready to receive input TChannel * Next = NULL; }; //--------------------------------------------------------------------------- struct SChannelLink { CFunctionCore * Function = NULL; TChannel * Channel = NULL; bool Input = false; bool Output = false; SChannelLink * Next = NULL; }; //--------------------------------------------------------------------------- // Function Constructor #define TYPE_FUNCTION "Function" //CFunctionCore * NewFunctionCore( const char * Name ); //--------------------------------------------------------------------------- class CFunctionCore { protected: // Function Definition const char * Type = NULL; char * Name = NULL; bool WaitToTerminate = false; // JSON Config CDataMember * Config = NULL; // Channels TChannel * FirstChannel = NULL; // Logging CLogCore * Log = NULL; EDebugLevel LogLevel = dlNone; int LogOutput = loNone; // Manage Channel inline TChannel * GetChannel( const char * pName ) { if (!pName) return NULL; TChannel * Channel = FirstChannel; while (Channel && strcmp( pName, Channel->Name )) Channel = Channel->Next; return Channel; } inline TChannelLink * GetLinkChannel( TChannel * Channel, const char * LinkRef ) { if (!Channel || !LinkRef ) return NULL; SChannelLink * LinkChannel = Channel->FirstLink; while (LinkChannel && strcmp( LinkRef, LinkChannel->Channel->Ref )) LinkChannel = LinkChannel->Next; return LinkChannel; } // Data Input/Output virtual int Output( const TChannel * Channel, const char * TargetRef, const bool SourceRef, const char * Data, int Len, int OutputFormat = loNone ); public: // Life cycle CFunctionCore( const char * pName, const char * pType = TYPE_FUNCTION ); virtual ~CFunctionCore(); // Load Configuration virtual bool Init( CDataMember * FunctionConfig ); virtual bool InitChannelLinks( CDataMember *LinkConfig ); // Set Parameters Manually bool SetLogParam( EDebugLevel pDebugLevel, int pOutputDisplay ); bool SetLogLevel( EDebugLevel pDebugLevel ); // Miscellaneous inline const char * GetName() { return Name; }; inline const char * GetType() { return Type; }; // Manage Channels virtual TChannel * AddChannel( const char * ChannelName, const bool Ready ); virtual bool SetChannelState( TChannel * Channel, const bool Ready ); virtual bool ChannelStateEvent( TChannel * Channel, const char * SourceRef, const bool Ready ); // Pushing Data Output -> Input virtual int Output( const char * ChannelName, const char * TargetRef, const bool SourceRef, const char * Data, int Len = -1 ); virtual int Input( const char * ChannelName, const char * SourceRef, const char * Data, int Len = -1 ); // Automated Data Input/Output virtual bool LinkChannel( const char * ChannelName, const char * LinkFunctionName, const char * LinkChannelName, bool Input, bool Output ); virtual bool Process() = 0; friend class CApplication; }; //--------------------------------------------------------------------------- #endif /* REDACORE_FUNCTIONCORE_H_ */