Important Update:

- ItemBufferCore:
  - New Class for storing items in a FIFO style buffer
- FunctionCore:
  - Implemented pulled input:
    - Function creates static output: StoredOutput & StoredOutputLen
    - Other Function pulls static output from input linked functions
- FunctionCore-ChannelBuffer:
  - Tried to create a processing buffer
  - Abandoned for now
This commit is contained in:
Charl Wentzel
2017-07-24 16:33:01 +02:00
parent 2f81d1fbbe
commit 3e0ff00dbe
6 changed files with 592 additions and 15 deletions

View File

@@ -42,7 +42,7 @@ CFunctionCore::CFunctionCore( const char * pName, const char * pType )
}
// Channels
FirstChannel = NULL;
FirstChannel = NULL;
// List
Application->AddFunction( this );
@@ -52,10 +52,14 @@ CFunctionCore::CFunctionCore( const char * pName, const char * pType )
ConfigMember = NULL;
LinkConfigMember = NULL;
// Output
// Logging
Log = Application->Log;
LogLevel = dlNone;
LogOutput = OUT_NORMAL;
// Stored output
StoredOutput = NULL;
StoredOutputLen = 0;
}
//---------------------------------------------------------------------------
@@ -411,7 +415,7 @@ bool CFunctionCore::LinkOutputChannel( const char * ChannelName, const char * In
//---------------------------------------------------------------------------
// Manual Data Input/Output
int CFunctionCore::Input( const char * ChannelName, const char * Data, int MaxLen )
int CFunctionCore::Input( const char * ChannelName, const char * Data, int Len )
{
TChannel * Channel = NULL;
@@ -433,11 +437,11 @@ int CFunctionCore::Input( const char * ChannelName, const char * Data, int MaxLe
}
else {
// Return processed bytes
if (MaxLen == -1) {
MaxLen = strlen( Data );
if (Len == -1) {
Len = strlen( Data );
}
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, MaxLen, "%s: Channel '%s' - IN:", Name, ChannelName );
return MaxLen;
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Channel '%s' - IN:", Name, ChannelName );
return Len;
}
}
//---------------------------------------------------------------------------
@@ -495,3 +499,92 @@ int CFunctionCore::Output( const TChannel * Channel, const char * Data, int Len
return Len;
}
//---------------------------------------------------------------------------
bool CFunctionCore::PullInput( const char * ChannelName )
{
TChannel * Channel = NULL;
// Validate
if (!ChannelName) {
return false;
}
// Get Channel
if (!(Channel = GetChannel( ChannelName ))) {
// Channel not found
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input failed, Channel not found", Name, ChannelName );
return false;
}
else {
// Return success
return PullInput( Channel );
}
}
//---------------------------------------------------------------------------
bool CFunctionCore::PullInput( TChannel * Channel )
{
TChannelLink * InChannel = NULL;
char ** Data = NULL;
int * Len = NULL;
// Validate
if (!Channel) {
return false;
}
// Check if enabled
if (!Channel->InputEnabled) {
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input failed, Channel input disabled", Name, Channel->Name );
return false;
}
// Pass output to all linked inputs
InChannel = Channel->FirstInput;
while (InChannel)
{
// Pull Output from Channel
if (InChannel->Function->PullOutput( InChannel->Name, Data, Len ))
{
// Use input
Input( Channel->Name, *Data, ((*Len)? *Len : -1) );
}
InChannel = InChannel->Next;
}
// Return success
return Len;
}
//---------------------------------------------------------------------------
bool CFunctionCore::PullOutput( const char * ChannelName, char ** Data, int * Len )
{
TChannel * Channel = NULL;
int TempLen = 0;
// Validate
if (!ChannelName || !Data) {
return 0;
}
// Get Channel
if (!(Channel = GetChannel( ChannelName ))) {
// Channel not found
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Output failed, Channel not found", Name, ChannelName );
return 0;
}
else if (!Channel->InputEnabled) {
// Channel disabled
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Output failed, Channel output disabled", Name, ChannelName );
return 0;
}
else {
// Return processed bytes
*Data = StoredOutput;
TempLen = (*Data)? strlen(*Data) : 0;
if (Len) *Len = TempLen;
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, ((*Data)? *Data : "(NULL)"), TempLen, "%s: Channel '%s' - IN:", Name, ChannelName );
return Len;
}
}
//---------------------------------------------------------------------------