Program: bbtk
Module: $RCSfile: bbtkBlackBox.cxx,v $
Language: C++
- Date: $Date: 2008/12/09 11:48:31 $
- Version: $Revision: 1.33 $
+ Date: $Date: 2009/06/08 14:50:02 $
+ Version: $Revision: 1.48 $
=========================================================================*/
/* ---------------------------------------------------------------------
#include "bbtkConfigurationFile.h"
#include "bbtkWxBlackBox.h"
+#include "bbtkWx.h"
#include <fstream>
//#include <vector>
static std::set<BlackBox::WeakPointer> bbmgExecutionList;
//=========================================================================
+
BlackBox::Deleter::Deleter()
{
}
//=========================================================================
//=========================================================================
- void BlackBox::Deleter::Delete(Object* p)
+ int BlackBox::Deleter::Delete(Object* p)
{
BlackBox* b = dynamic_cast<BlackBox*>(p);
if (!b)
BlackBoxDescriptor::WeakPointer desc = b->bbGetDescriptor();
bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : deleting black box"<<std::endl);
- b->bbDelete();
+ int refs = b->bbDelete();
- bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : releasing descriptor ["<<desc.lock()<<"]"<<std::endl);
+ bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : releasing descriptor"<<std::endl);
if (!desc.expired())
{
bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : descriptor expired : nothing to do (was not held by a package or the box is a complex black box prototype)"<<std::endl);
}
bbtkDebugMessage("object",2,"<## BlackBox::Deleter(\""<<name<<"\")"<<std::endl);
+ return refs;
}
//=========================================================================
BlackBox::BlackBox(const std::string &name)
:
// bbmStatus(MODIFIED),
+ bbmInitialized(false),
bbmExecuting(false),
bbmName(name),
bbmBoxProcessMode("Pipeline"),
bbmParent()
{
- bbtkDebugMessage("object",4,"==> BlackBox::BlackBox(\""
+ bbtkBlackBoxDebugMessage("object",4,"==> BlackBox::BlackBox(\""
<<name<<"\")"<<std::endl);
- bbtkDebugMessage("object",4,"<== BlackBox::BlackBox(\""
+ bbtkBlackBoxDebugMessage("object",4,"<== BlackBox::BlackBox(\""
<<name<<"\")"<<std::endl);
}
//=========================================================================
BlackBox::BlackBox(BlackBox& from, const std::string &name)
:
// bbmStatus(from.bbmStatus),
- bbmExecuting(false),
- bbmName(name),
- bbmBoxProcessMode(from.bbmBoxProcessMode),
- bbmParent()
-
+ bbmInitialized(false),
+ bbmExecuting(false),
+ bbmName(name),
+ bbmBoxProcessMode(from.bbmBoxProcessMode),
+ bbmParent()
+
{
- bbtkDebugMessage("object",4,"==> BlackBox::BlackBox("
+ bbtkBlackBoxDebugMessage("object",4,"==> BlackBox::BlackBox("
<<from.bbGetFullName()<<",\""
<<name<<"\")"<<std::endl);
- bbtkDebugMessage("object",4,"<== BlackBox::BlackBox("
+ bbtkBlackBoxDebugMessage("object",4,"<== BlackBox::BlackBox("
<<from.bbGetFullName()<<",\""
<<name<<"\")"<<std::endl);
}
//=========================================================================
BlackBox::~BlackBox()
{
- bbtkDebugMessage("object",4,"==> BlackBox::~BlackBox() ["<<bbmName
+ bbtkBlackBoxDebugMessage("object",4,"==> BlackBox::~BlackBox() ["<<bbmName
<<"]"<<std::endl);
this->bbDesallocateConnectors();
- bbtkDebugMessage("object",4,"<== BlackBox::~BlackBox() ["<<bbmName
+ bbtkBlackBoxDebugMessage("object",4,"<== BlackBox::~BlackBox() ["<<bbmName
<<"]"<<std::endl);
}
//=========================================================================
- //=========================================================================
- /// Main processing method of the box.
- void BlackBox::bbExecute(bool force)
- {
- bbtkDebugMessageInc("process",2,
- "=> BlackBox::bbExecute("<<(int)force<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
-
- // If already executing : return
- if (bbGetExecuting())
- {
- bbtkDebugMessage("process",2,
- " -> already executing : bailing out"<<std::endl);
- return;
- }
-
- // If execution frozen : return
- if (bbGlobalGetFreezeExecution())
- {
- bbtkDebugMessage("process",2,
- " -> FreezeExecution global flag is 'true' : abort execution"<<std::endl);
- }
-
- BBTK_BUSY_CURSOR;
-
- // If force is true then update is triggered even if the box is UPTODATE
- // if (force) bbSetModifiedStatus();
-
- // Calls the main recursive update method
- bbBackwardUpdate(Connection::Pointer());
-
- bbtkDebugMessageDec("process",2,
- "<= BlackBox::bbExecute() ["
- <<bbGetFullName()<<"]"<<std::endl);
- }
- //=========================================================================
//=========================================================================
std::string BlackBox::bbGetFullName() const
//=========================================================================
- /// Returns the name with the name of the parent prepended if any
std::string BlackBox::bbGetNameWithParent() const
{
if (bbmParent.lock())
//=========================================================================
//=========================================================================
- /// Prints the Help on the BlackBox type
void BlackBox::bbGetHelp(bool full) const
{
bbGetDescriptor()->GetHelp(full);
//=========================================================================
- /// Returns true if the UserBlackBox has an input of name name
bool BlackBox::bbHasInput(const std::string& name) const
{
- bbtkDebugMessageInc("Kernel",8,
+ bbtkBlackBoxDebugMessage("kernel",8,
"BlackBox::bbHasInput(\""
- <<name<<"\") ["<<bbGetFullName()<<"]"
+ <<name<<"\")"
<<std::endl);
bool r = ( bbGetDescriptor()->GetInputDescriptorMap().find(name)
!= bbGetDescriptor()->GetInputDescriptorMap().end());
- bbtkDebugDecTab("Kernel",8);
+ bbtkDebugDecTab("kernel",8);
return r;
}
//=========================================================================
//=========================================================================
- /// Returns true if the UserBlackBox has an output of name name
bool BlackBox::bbHasOutput(const std::string& name) const
{
- bbtkDebugMessageInc("Kernel",8,"BlackBox::bbHasOutput(\""
- <<name<<"\") ["<<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("kernel",8,"BlackBox::bbHasOutput(\""
+ <<name<<"\")"
+ <<std::endl);
bool r = ( bbGetDescriptor()->GetOutputDescriptorMap().find(name)
!= bbGetDescriptor()->GetOutputDescriptorMap().end());
- bbtkDebugDecTab("Kernel",8);
+ bbtkDebugDecTab("kernel",8);
return r;
}
//=========================================================================
//=========================================================================
- /// Gets the output type of a given name
TypeInfo BlackBox::bbGetOutputType( const std::string &name ) const
{
- bbtkDebugMessageInc("Kernel",8,
- "BlackBox::bbGetOutputType(\""
- <<name<<"\") ["<<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("kernel",8,
+ "BlackBox::bbGetOutputType(\""
+ <<name<<"\")"
+ <<std::endl);
TypeInfo r = bbGetDescriptor()->GetOutputDescriptor(name)->GetTypeInfo();
- bbtkDebugDecTab("Kernel",8);
+ bbtkDebugDecTab("kernel",8);
return r;
}
//=========================================================================
//=========================================================================
- /// Gets the input type of a given name
TypeInfo BlackBox::bbGetInputType( const std::string &name ) const
{
- bbtkDebugMessageInc("Kernel",8,
- "BlackBox::bbGetInputType(\""
- <<name<<"\") ["<<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("kernel",8,
+ "BlackBox::bbGetInputType(\""
+ <<name<<"\")"
+ <<std::endl);
TypeInfo r = bbGetDescriptor()->GetInputDescriptor(name)->GetTypeInfo();
- bbtkDebugDecTab("Kernel",8);
+ bbtkDebugDecTab("kernel",8);
return r;
}
//=========================================================================
//=========================================================================
- /// Allocates the i/o connectors of the black box
void BlackBox::bbAllocateConnectors()
{
- bbtkDebugMessageInc("Kernel",8,
- "BlackBox::bbAllocateConnectors() ["
- <<bbGetFullName()<<"]"
+ bbtkBlackBoxDebugMessage("kernel",8,
+ "BlackBox::bbAllocateConnectors()"
<<std::endl);
+
+ MakeBlackBoxPointer(this,true);
+
const BlackBoxDescriptor::InputDescriptorMapType& imap
= bbGetDescriptor()->GetInputDescriptorMap();
BlackBoxDescriptor::InputDescriptorMapType::const_iterator i;
for ( i = imap.begin(); i != imap.end(); ++i )
{
- bbtkDebugMessage("Kernel",8,"* Allocate \""<<i->first<<"\""<<std::endl);
+ bbtkBlackBoxDebugMessage("kernel",8,"* Allocate \""<<i->first<<"\""<<std::endl);
bbGetInputConnectorMap()[i->second->GetName()]
= new BlackBoxInputConnector(GetThisPointer<BlackBox>());
}
BlackBoxDescriptor::OutputDescriptorMapType::const_iterator o;
for ( o = omap.begin(); o != omap.end(); ++o )
{
- bbtkDebugMessage("Kernel",8,"* Allocate \""<<o->first<<"\""<<std::endl);
+ bbtkBlackBoxDebugMessage("kernel",8,"* Allocate \""<<o->first<<"\""<<std::endl);
bbGetOutputConnectorMap()[o->second->GetName()]
- = new BlackBoxOutputConnector();
+ = new BlackBoxOutputConnector(GetThisPointer<BlackBox>());
}
- bbtkDebugDecTab("Kernel",8);
+
}
//=========================================================================
//=========================================================================
- /// Desallocates the i/o connectors of the black box
void BlackBox::bbDesallocateConnectors()
{
- bbtkDebugMessageInc("Kernel",8,
+ bbtkBlackBoxDebugMessage("kernel",8,
"BlackBox::bbDesallocateConnectors()"
<<std::endl);
for ( i = bbGetInputConnectorMap().begin();
i != bbGetInputConnectorMap().end(); ++i )
{
- bbtkDebugMessage("Kernel",8,"* Delete \""<<i->first<<"\""<<std::endl);
+ bbtkBlackBoxDebugMessage("kernel",8,"* Delete \""<<i->first<<"\""<<std::endl);
delete (i->second);
}
OutputConnectorMapType::const_iterator o;
for ( o = bbGetOutputConnectorMap().begin();
o != bbGetOutputConnectorMap().end(); ++o )
{
- bbtkDebugMessage("Kernel",8,"* Delete \""<<o->first<<"\""<<std::endl);
+ bbtkBlackBoxDebugMessage("kernel",8,"* Delete \""<<o->first<<"\""<<std::endl);
delete (o->second);
}
- bbtkDebugDecTab("Kernel",8);
+ bbtkDebugDecTab("kernel",8);
}
//=========================================================================
//=========================================================================
- /// Copies the input / output values from another box
void BlackBox::bbCopyIOValues(BlackBox& from)
{
- bbtkDebugMessageInc("Kernel",1,
- "BlackBox::bbCopyIOValues("
- <<from.bbGetFullName()<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("kernel",1,
+ "BlackBox::bbCopyIOValues("
+ <<from.bbGetFullName()<<")"
+ <<std::endl);
// copies the input values
const BlackBoxDescriptor::InputDescriptorMapType& imap
= bbGetDescriptor()->GetInputDescriptorMap();
{
if (! i->second->GetCopyConstruct() ) continue;
std::string input = i->second->GetName();
- bbtkDebugMessage("Kernel",2,"* Copying input "<<input<<std::endl);
+ bbtkBlackBoxDebugMessage("kernel",2,"* Copying input "<<input<<std::endl);
this->bbSetInput(input, from.bbGetInput(input) );
}
// copies the output values
{
if (! o->second->GetCopyConstruct() ) continue;
std::string output = o->second->GetName();
- bbtkDebugMessage("Kernel",2,"* Copying output "<<output<<std::endl);
+ bbtkBlackBoxDebugMessage("kernel",2,"* Copying output "<<output<<std::endl);
this->bbSetOutput(output, from.bbGetOutput(output) );
}
- bbtkDebugDecTab("Kernel",9);
+ bbtkDebugDecTab("kernel",9);
}
//=========================================================================
bool BlackBox::bbCanReact() const
{
return ( bbGlobalGetSomeBoxExecuting()
-#ifdef _USE_WXWIDGETS_
+#ifdef USE_WXWIDGETS
|| Wx::IsSomeWindowAlive()
#endif
);
- //=========================================================================
- /// User overloadable destruction method of a black box
- void BlackBox::bbUserDelete()
- {
- bbtkDebugMessage("process",5,
- "=> BlackBox::bbUserDelete() ["
- <<bbGetFullName()<<"]"
- <<" : not overloaded; using standard deletion"
- <<std::endl);
- delete this;
- }
- //=========================================================================
-
-
//=========================================================================
BlackBox::BoxProcessModeValue BlackBox::bbGetBoxProcessModeValue() const
{
if ( (p == "2") ||
(p == "R") || (p == "r") ||
(p == "Reactive") || (p == "reactive") ) return Reactive;
+ /*
+ if ( (p == "3") ||
+ (p == "F") || (p == "f") ||
+ (p == "Flash") || (p == "flash") ) return Flash;
+ */
bbtkError(bbGetFullName()<<" : BoxProcessMode value '"<<p
<<"' unknown. Possible values : "
<<"'0'/'P'/'p'/'Pipeline'/'pipeline' | "
<<"'1'/'A'/'a'/'Always'/'always' | "
- <<"'2'/'R'/'r'/'Reactive'/'reactive'"<<std::endl);
+ <<"'2'/'R'/'r'/'Reactive'/'reactive'"
+ // <<"'3'/'F'/'f'/'Flash'/'flash'"
+ <<std::endl);
}
//=========================================================================
//=========================================================================
- void BlackBox::AddChangeObserver(const std::string& output_name,
+ void BlackBox::bbAddOutputObserver(const std::string& output,
OutputChangeCallbackType f)
{
+ bbGetOutputConnector(output).AddChangeObserver(f);
}
//=========================================================================
//=========================================================================
- void BlackBox::RemoveChangeObserver(const std::string& output_name,
+ void BlackBox::bbRemoveOutputObserver(const std::string& output_name,
OutputChangeCallbackType f)
{
+ bbtkError("BlackBox::RemoveChangeObserver NOT IMPLEMENTED");
}
//=========================================================================
- /*
- //=========================================================================
- /// Sets the ChangeTime of input
- void BlackBox::bbSetInputChangeTime(BlackBoxInputConnector* c,
- const ChangeTime& t)
- {
- bbtkDebugMessage("change",1,
- "==> BlackBox::bbSetInputChangeTime("<<c<<","<<t<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
-
- // If new time is greater than old one
- if ( c->SetChangeTime(t) )
- {
- bool was_up_to_date = bbIsUpToDate();
- // If new time is greater than the old max time of inputs
- if ( mMaxInputChangeTime.Set(t) )
- {
- // If the box turned out-of-date
- if ( was_up_to_date && bbIsOutOfDate() )
- {
- //
- if ( ( bbBoxProcessModeIsReactive() ||
- (c==bbGetInputConnectorMap().find("BoxExecute")->second))
- && (bbCanReact() ) )
- {
- bbtkDebugMessage("change",2,
- "an input of "
- <<bbGetFullName()
- <<" changed and box is in Reactive mode or BoxExecute input changed : adding it to the global execution list"
- <<std::endl);
- bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
- }
- // Have to propagate the modification to aval boxes
- OutputConnectorMapType::iterator i;
- for (i = bbGetOutputConnectorMap().begin();
- i != bbGetOutputConnectorMap().end();
- ++i)
- {
- i->second->SetChangeTime(t);
- }
- // update the MinOutputChangeTime
- mMinOutputChangeTime.Set(t);
- }
- }
- }
- }
- //=========================================================================
-
- //=========================================================================
- /// Sets the ChangeTime of output
- void BlackBox::bbSetOutputChangeTime(BlackBoxOutputConnector* c,
- const ChangeTime& t)
- {
- bbtkDebugMessage("change",1,
- "==> BlackBox::bbSetOutputChangeTime("<<c<<","<<t<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
-
- //ChangeTime old =
- c->SetChangeTime(t);
- // c->GetChangeTime() = t;
- // bbUpdateMinOutputChangeTime(t);
- // propagate
-
- }
- //=========================================================================
- */
-
- /*
- //=========================================================================
- void BlackBox::bbUpdateMaxInputChangeTime(const ChangeTime& t)
- {
-
-
- if ( t > mMaxInputChangeTime )
- {
- mMaxInputChangeTime = t;
- if ( mMinOutputChangeTime > mMaxInputChangeTime )
- {
-
- }
- }
-
- }
- //=========================================================================
-
- //=========================================================================
- void bbUpdateMinOutputChangeTime(const ChangeTime& t)
- {
- ChangeTime old = mMinOutputChangeTime;
- mMinOutputChangeTime = MAXLONG;
- OutputConnectorMapType::iterator i;
- for (i = bbGetOutputConnectorMap.begin();
- i != bbGetOutputConnectorMap.end();
- ++i)
- {
- if (i->second->GetChangeTime() < mMinOutputChangeTime)
- mMinOutputChangeTime = i->second->GetChangeTime();
- }
- if ( mMinOutputChangeTime < old )
- {
- }
-
- }
- //=========================================================================
- */
-
//=========================================================================
- /// Signals that the BlackBox has been modified through
- /// the input connector c
- /// and propagates it downward
- /// ** NOT USER INTENDED **
void BlackBox::bbSetStatusAndPropagate(BlackBoxInputConnector* c,
IOStatus s)
{
- bbtkDebugMessageInc("change",5,
- "=> BlackBox::bbSetStatusAndPropagate(input,"
- <<GetIOStatusString(s)<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("change",5,
+ "=> BlackBox::bbSetStatusAndPropagate(input,"
+ <<GetIOStatusString(s)<<")"
+ <<std::endl);
if (s==UPTODATE) bbtkError("bbSetStatusAndPropagate with status UPTODATE!");
c->SetStatus(s);
+
+ // Flash reaction
+ /*
+ if (bbGetBoxProcessModeValue() == Flash)
+ {
+ this->bbExecute();
+ }
+ */
+
OutputConnectorMapType::const_iterator o;
for ( o = bbGetOutputConnectorMap().begin();
o != bbGetOutputConnectorMap().end(); ++o )
{
- // bbSetStatusAndPropagate(o->second, OUTOFDATE);
if (o->second->GetStatus()==UPTODATE)
{
o->second->SetStatus(OUTOFDATE);
(c==bbGetInputConnectorMap().find("BoxExecute")->second))
&& (bbCanReact() ) )
{
- bbtkDebugMessage("change",2,
+ bbtkBlackBoxDebugMessage("change",2,
"-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
}
- bbtkDebugMessageInc("change",5,
- "<= BlackBox::bbSetStatusAndPropagate(input) ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("change",5,
+ "<= BlackBox::bbSetStatusAndPropagate(input)"
+ <<std::endl);
}
//=========================================================================
- //=========================================================================
- void BlackBox::bbSetStatusAndPropagate(BlackBoxOutputConnector* c,
- IOStatus s)
- {
- bbtkError("bbSetStatusAndPropagate(BlackBoxOutputConnector* c,IOStatus s)");
- /*
- if (i->GetStatus()==UPTODATE)
- {
- i->second->SetStatus(s);
- i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
- }
- */
- }
- //=========================================================================
-
-
- /// Signals that the BlackBox has been modified
- /*
- void BlackBox::bbSetModifiedStatus(BlackBoxInputConnector* c)
- {
- bbtkDebugMessage("modified",1,
- "==> BlackBox::bbSetModifiedStatus("<<c<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
-
- if ( (c==bbGetInputConnectorMap().find("WinHide")->second) )
- // && (bbCanReact()))
- {
- bbtkDebugMessage("modified",2,
- "-> Hide triggered by WinHide input change"
- <<std::endl);
- this->bbHideWindow();
- this->bbSetStatus(MODIFIED);
- return;
- }
- if ( (c==bbGetInputConnectorMap().find("WinClose")->second) )
- // && (bbCanReact()))
- {
- bbtkDebugMessage("modified",2,
- "-> Close triggered by WinClose input change"
- <<std::endl);
- this->bbHideWindow();
- this->bbSetStatus(MODIFIED);
- return;
- }
-
- if ( ( bbBoxProcessModeIsReactive() ||
- (c==bbGetInputConnectorMap().find("BoxExecute")->second))
- && (bbCanReact() ) )
- {
- bbtkDebugMessage("modified",2,
- "-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
- this->bbSetStatus(MODIFIED);
- bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
- }
-
- //else if ( bbGetStatus() == MODIFIED ) //! this->bbIsUptodate())
- // {
-// bbtkDebugMessage("modified",2,"-> Already modified"<<std::endl);
-// return;
- // }
-
- else
- {
- bbtkDebugMessage("modified",2,"-> Status set to modified"<<std::endl);
- this->bbSetStatus(MODIFIED);
- }
-
- this->bbSignalOutputModification(false);
-
- bbtkDebugMessageDec("process",5,
- "<= BlackBox::bbSetModifiedStatus("<<c<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
- }
-*/
- //=========================================================================
//=========================================================================
void BlackBox::bbSignalOutputModification(bool reaction)
{
- bbtkDebugMessageInc("change",5,
- "=> BlackBox::bbSignalOutputModification("
- <<reaction<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("change",5,
+ "=> BlackBox::bbSignalOutputModification("
+ <<reaction<<")"
+ <<"]"<<std::endl);
OutputConnectorMapType::iterator i;
for ( i = bbGetOutputConnectorMap().begin();
i != bbGetOutputConnectorMap().end(); ++i)
{
- if (i->second->GetStatus()==UPTODATE)
- {
- // i->second->SetStatus(MODIFIED);
+ // std::cout << "Stat = "
+ //<<GetIOStatusString(i->second->GetStatus())
+ // <<std::endl;
+ // LG : CANNOT SIGNAL ONLY WHEN UPTODATE
+ // See bbtkSampleOutputObserver
+ // if (i->second->GetStatus()==UPTODATE)
+ // {
i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
- }
+ // }
}
if (reaction) bbGlobalProcessExecutionList();
- bbtkDebugMessageDec("change",5,
- "<= BlackBox::bbSignalOutputModification() ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("change",5,
+ "<= BlackBox::bbSignalOutputModification()"
+ <<std::endl);
}
//=========================================================================
void BlackBox::bbSignalOutputModification(const std::string& output,
bool reaction)
{
- bbtkDebugMessageInc("change",5,
- "=> BlackBox::bbSignalOutputModification("
- <<output<<","<<reaction<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("change",5,
+ "=> BlackBox::bbSignalOutputModification("
+ <<output<<","<<reaction<<")"
+ <<std::endl);
OutputConnectorMapType::iterator i =
bbGetOutputConnectorMap().find(output);
bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<output<<") : unknown output");
}
- if (i->second->GetStatus()==UPTODATE)
- {
- // i->second->SetStatus(MODIFIED);
+ // if (i->second->GetStatus()==UPTODATE)
+ // {
i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
// Has to notify the output "BoxChange" also
if (output != "BoxChange")
i = bbGetOutputConnectorMap().find("BoxChange");
if ( i != bbGetOutputConnectorMap().end() )
{
- // i->second->SetStatus(MODIFIED);
i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
}
}
if (reaction) bbGlobalProcessExecutionList();
- }
+ // }
- bbtkDebugMessageDec("change",5,
- "<= BlackBox::bbSignalOutputModification("
- <<output<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("change",5,
+ "<= BlackBox::bbSignalOutputModification("
+ <<output<<")"
+ <<std::endl);
}
//=========================================================================
void BlackBox::bbSignalOutputModification(const std::vector<std::string>& output,
bool reaction)
{
- bbtkDebugMessageInc("change",5,
- "=> BlackBox::bbSignalOutputModification(vector of outputs) ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("change",5,
+ "=> BlackBox::bbSignalOutputModification(vector of outputs)"
+<<std::endl);
OutputConnectorMapType::iterator i;
std::vector<std::string>::const_iterator o;
bool changed = false;
{
bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<*o<<") : unknown output");
}
- // Already OUTOFDATE : noting to do
- if (i->second->GetStatus()==UPTODATE)
- {
- // i->second->SetStatus(MODIFIED);
+
+ // if (i->second->GetStatus()==UPTODATE)
+ // {
i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
changed = true;
- }
+ // }
}
// Has to notify the output "BoxChange" also
i = bbGetOutputConnectorMap().find("BoxChange");
if ( changed && (i != bbGetOutputConnectorMap().end()))
{
- // Already OUTOFDATE : noting to do
- if (i->second->GetStatus()==UPTODATE)
- {
- // i->second->SetStatus(MODIFIED);
+ // if (i->second->GetStatus()==UPTODATE)
+ // {
i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
if (reaction) bbGlobalProcessExecutionList();
- }
+ // }
}
- bbtkDebugMessageDec("change",5,
- "<= BlackBox::bbSignalOutputModification(vector of outputs) ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("change",5,
+ "<= BlackBox::bbSignalOutputModification(vector of outputs)"
+ <<std::endl);
}
//=========================================================================
+
+
+
+
+
+
+ //=========================================================================
+ /// Main processing method of the box.
+ void BlackBox::bbExecute(bool force)
+ {
+ bbtkBlackBoxDebugMessage("process",2,
+ "=> BlackBox::bbExecute("<<(int)force<<")"
+ <<std::endl);
+
+ // If already executing : return
+ /*
+ if (bbGetExecuting())
+ {
+ bbtkBlackBoxDebugMessage("process",2,
+ " -> already executing : abort"<<std::endl);
+ return;
+ }
+ */
+
+ // If execution frozen : return
+ if (bbGlobalGetFreezeExecution())
+ {
+ bbtkBlackBoxDebugMessage("process",2,
+ " -> FreezeExecution global flag is 'true' : abort execution"<<std::endl);
+ }
+
+ BBTK_BUSY_CURSOR;
+
+ // If force is true then update is triggered even if the box is UPTODATE
+ // if (force) bbSetModifiedStatus();
+
+ // Calls the main recursive execution method
+ bbRecursiveExecute(Connection::Pointer());
+
+ bbtkBlackBoxDebugMessage("process",2,
+ "<= BlackBox::bbExecute()"
+ <<std::endl);
+ }
+ //=========================================================================
+
+ //=========================================================================
+ void BlackBox::bbInitializeProcessing()
+ {
+ if (!bbmInitialized)
+ {
+ bbtkBlackBoxDebugMessage("process",2,"** Initialize processing"
+ <<std::endl);
+ this->bbRecursiveInitializeProcessing();
+ bbmInitialized = true;
+ }
+ }
+ //=========================================================================
+
+ //=========================================================================
+ void BlackBox::bbFinalizeProcessing()
+ {
+ if (bbmInitialized)
+ {
+ bbtkBlackBoxDebugMessage("process",2,"** Finalize processing"
+ <<std::endl);
+ this->bbRecursiveFinalizeProcessing();
+ bbmInitialized = false;
+ }
+ }
+ //=========================================================================
+
+
+ //=========================================================================
+ void BlackBox::bbRecursiveExecute( Connection::Pointer caller )
+ {
+ bbtkBlackBoxDebugMessage("process",3,
+ "=> BlackBox::bbRecursiveExecute("
+ <<(caller?caller->GetFullName():"0")<<")"
+ <<std::endl);
+
+ // If already executing : return
+ if (bbGetExecuting())
+ {
+ bbtkBlackBoxDebugMessage("process",3,
+ " -> already executing : abort"<<std::endl);
+ return;
+ }
+
+ // If not initialized do it
+ bbInitializeProcessing();
+
+ bbSetExecuting(true);
+ bool wasExecuting = bbGlobalGetSomeBoxExecuting();
+ bbGlobalSetSomeBoxExecuting(true);
+
+ // Creates the window if the black box has one
+ this->bbCreateWindow();
+
+ // Updates its inputs
+ IOStatus s = bbUpdateInputs();
+
+ if ( (s != UPTODATE) ||
+ bbBoxProcessModeIsAlways() )
+ {
+ // Displays the window (WxBlackbox)
+ // bbShowWindow(caller);
+
+ // Actual processing (virtual)
+ this->bbProcess();
+
+
+ // Update the I/O statuses
+ bbComputePostProcessStatus();
+ }
+ else
+ {
+ // Test output status...
+ OutputConnectorMapType::iterator o;
+ for ( o = bbGetOutputConnectorMap().begin();
+ o!= bbGetOutputConnectorMap().end(); ++o)
+ {
+ if (o->second->GetStatus() != UPTODATE)
+ {
+ bbtkWarning("BlackBox::bbRecursiveExecute: "
+ <<"all inputs are Up-to-date but output '"
+ <<o->first<<"' is Out-of-date ???");
+ }
+ }
+
+ bbtkBlackBoxDebugMessage("process",3," -> Up-to-date : nothing to do"
+ <<std::endl);
+ }
+
+ // Shows the window if the black box has one
+ this->bbShowWindow();
+
+
+ bbtkBlackBoxDebugMessage("process",3,
+ "<= BlackBox::bbRecursiveExecute()"
+ <<std::endl);
+
+ bbSetExecuting(false);
+ bbGlobalSetSomeBoxExecuting(wasExecuting);
+
+ return;
+
+ }
+ //=========================================================================
+
+
+
+
+
//=========================================================================
- /// Updates the BlackBox inputs
- /// Calls BackwardUpdate on all BlackBoxInputConnector
- /// \returns The maximum of final IOStatus after each input update
IOStatus BlackBox::bbUpdateInputs()
{
- bbtkDebugMessageInc("process",4,
- "=> BlackBox::bbUpdateInputs() ["
- <<bbGetFullName()<<"]"
+ bbtkBlackBoxDebugMessage("process",4,
+ "=> BlackBox::bbUpdateInputs()"
<<std::endl);
IOStatus s = UPTODATE;
//if ( bbGetDescriptor()->GetInputDescriptor(i->first)->GetTypeInfo()
// == typeid(Void) )
// continue;
- bbtkDebugMessageDec("change",2,
- bbGetName()<<"."<<i->first
- <<" ["<<i->second<<"] "
- <<" status before update = '"
+ bbtkBlackBoxDebugMessage("change",2,
+ "Input '"<<i->first
+ <<"': status before update = '"
<<GetIOStatusString(i->second->GetStatus())
<<"'"<<std::endl);
- i->second->BackwardUpdate();
+ i->second->RecursiveExecute();
IOStatus t = i->second->GetStatus();
if (t > s) s = t;
- bbtkDebugMessageDec("change",2,
- bbGetName()<<"."<<i->first
- <<" ["<<i->second<<"] "
- <<" status before process = '"
- <<GetIOStatusString(i->second->GetStatus())
- <<"'"<<std::endl);
+ bbtkBlackBoxDebugMessage("change",2,
+ "Input '"<<i->first
+ <<"': status before process = '"
+ <<GetIOStatusString(i->second->GetStatus())
+ <<"'"<<std::endl);
}
- bbtkDebugMessageDec("process",4,
- "<= BlackBox::bbUpdateInputs() ["
- <<bbGetFullName()<<"]"
+ bbtkBlackBoxDebugMessage("process",4,
+ "<= BlackBox::bbUpdateInputs()"
<<std::endl);
//=========================================================================
//==================================================================
- /// Computes the final IOStatus of inputs and outputs after processing
- void BlackBox::bbComputePostProcessStatus()
+ void BlackBox::bbComputePostProcessStatus()
{
- bbtkDebugMessageInc("process",4,
- "=> BlackBox::bbComputePostProcessStatus() ["
- <<bbGetFullName()<<"]"
+ bbtkBlackBoxDebugMessage("process",4,
+ "=> BlackBox::bbComputePostProcessStatus()"
<<std::endl);
IOStatus new_output_status = UPTODATE;
if (t == OUTOFDATE) new_output_status = OUTOFDATE;
// A previously MODIFIED status turns to UPTODATE
if (t==MODIFIED) i->second->SetStatus(UPTODATE);
- bbtkDebugMessage("change",2,
- bbGetName()<<"."<<i->first<<" : "
+ bbtkBlackBoxDebugMessage("change",2,
+ "Input '"<<i->first<<"' : "
<< GetIOStatusString(t) << " -> "
<< GetIOStatusString(i->second->GetStatus())
<< std::endl);
}
- bbtkDebugMessage("change",2,
- bbGetName()<<" new output status : "
- << GetIOStatusString(new_output_status)
- <<std::endl);
+ bbtkBlackBoxDebugMessage("change",2,
+ "New output status : "
+ << GetIOStatusString(new_output_status)
+ <<std::endl);
// Update the output statuses
OutputConnectorMapType::iterator o;
for ( o = bbGetOutputConnectorMap().begin();
o->second->SetStatus(new_output_status);
}
- bbtkDebugMessageInc("process",4,
- "<= BlackBox::bbComputePostProcessStatus() ["
- <<bbGetFullName()<<"]"
+ bbtkBlackBoxDebugMessage("process",4,
+ "<= BlackBox::bbComputePostProcessStatus()"
<<std::endl);
}
//==================================================================
//=========================================================================
- /// Connects the input <name> to the connection c
void BlackBox::bbConnectInput( const std::string& name, Connection* c)
{
- bbtkDebugMessage("connection",2,
+ bbtkBlackBoxDebugMessage("connection",2,
"==> BlackBox::bbConnectInput(\""
- <<name<<"\","<<c->GetFullName()<<") ["
- <<bbGetFullName()<<"]"
+ <<name<<"\","<<c->GetFullName()<<")"
<<std::endl);
bbtkError("no input called '"<<name<<"'");
}
i->second->SetConnection(c);
-
- // Check the status of the from.output of c
- // to set the new status of the input
- IOStatus s = MODIFIED;
- if ( c->GetBlackBoxFrom()->bbGetOutputConnector(c->GetBlackBoxFromOutput()).GetStatus() == OUTOFDATE )
- s = OUTOFDATE;
- bbSetStatusAndPropagate(i->second,s);
+ // The input *MUST* be set OUTOFDATE to update its input on next execution
+ bbSetStatusAndPropagate(i->second,OUTOFDATE);
- bbtkDebugMessage("connection",2,
+ bbtkBlackBoxDebugMessage("connection",2,
"<== BlackBox::bbConnectInput(\""
- <<name<<"\","<<c->GetFullName()<<") ["
- <<bbGetFullName()<<"]"
+ <<name<<"\","<<c->GetFullName()<<")"
<<std::endl);
}
//=========================================================================
- /// Connects the output <name> to the connection c
void BlackBox::bbConnectOutput( const std::string& name, Connection* c)
{
- bbtkDebugMessage("connection",2,
- "==> BlackBox::bbConnectOutput(\""<<name<<"\","
- <<c->GetFullName()<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("connection",2,
+ "==> BlackBox::bbConnectOutput(\""<<name<<"\","
+ <<c->GetFullName()<<")"
+ <<std::endl);
OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(name);
if (i==bbGetOutputConnectorMap().end())
}
i->second->SetConnection(c);
- bbtkDebugMessage("connection",2,
- "<== BlackBox::bbConnectOutput(\""<<name<<"\","
- <<c->GetFullName()<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("connection",2,
+ "<== BlackBox::bbConnectOutput(\""<<name<<"\","
+ <<c->GetFullName()<<")"
+ <<std::endl);
}
//=========================================================================
//=========================================================================
- /// Disconnects the input <name> from the connection c
- void BlackBox::bbDisconnectInput( const std::string& name, Connection* c)
+ void BlackBox::bbDisconnectInput( const std::string& name, Connection* c)
{
- bbtkDebugMessage("connection",2,
+ bbtkBlackBoxDebugMessage("connection",2,
"==> BlackBox::bbDisconnectInput(\""<<name
- <<"\","<<c->GetFullName()<<") ["
- <<bbGetFullName()<<"]"
+ <<"\","<<c->GetFullName()<<")"
<<std::endl);
if (!c)
{
- bbtkDebugMessage("connection",2,"c==0"<<std::endl);
+ bbtkBlackBoxDebugMessage("connection",2,"c==0"<<std::endl);
return;
}
}
i->second->UnsetConnection(c);
- bbtkDebugMessage("connection",2,
+ bbtkBlackBoxDebugMessage("connection",2,
"<== BlackBox::bbDisconnectInput(\""<<name
- <<"\","<<c->GetFullName()<<") ["
- <<bbGetFullName()<<"]"
+ <<"\","<<c->GetFullName()<<")"
<<std::endl);
}
//=========================================================================
- /// Disconnects the output <name> from the connection c
- void BlackBox::bbDisconnectOutput( const std::string& name, Connection* c)
+ void BlackBox::bbDisconnectOutput( const std::string& name, Connection* c)
{
- bbtkDebugMessage("connection",2,
+ bbtkBlackBoxDebugMessage("connection",2,
"==> BlackBox::bbDisconnectOutput(\""<<name
- <<"\","<<c->GetFullName()<<") ["
- <<bbGetFullName()<<"]"
+ <<"\","<<c->GetFullName()<<")"
<<std::endl);
if (!c)
{
- bbtkDebugMessage("connection",2,"c==0"<<std::endl);
+ bbtkBlackBoxDebugMessage("connection",2,"c==0"<<std::endl);
return;
}
}
i->second->UnsetConnection(c);
- bbtkDebugMessage("connection",2,
+ bbtkBlackBoxDebugMessage("connection",2,
"<== BlackBox::bbDisconnectOutput(\""<<name
- <<"\","<<c->GetFullName()<<") ["
- <<bbGetFullName()<<"]"
+ <<"\","<<c->GetFullName()<<")"
<<std::endl);
}
//=========================================================================
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
//=========================================================================
- /// Virtual
void BlackBox::bbWriteDotInputOutputName(FILE *ff,bool inputoutput,int detail, int level)
{
fprintf(ff,"%s%p",bbGetTypeName().c_str(),this);
//=========================================================================
- void BlackBox::bbShowRelations(BlackBox::Pointer parentblackbox,
+ void BlackBox::bbPrintHelp(BlackBox::Pointer parentblackbox,
int detail, int level
/*,Factory *factory*/ )
{
if (this->bbGetDescriptor()->GetPackage())
{
- bbtkMessage("Help",1,"Black Box '"<<bbGetName()<<"' <"<<
+ bbtkBlackBoxMessage("help",1,"Black Box '"<<bbGetName()<<"' <"<<
this->bbGetDescriptor()->GetPackage()->GetName()
<<"::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
}
else
{
- bbtkMessage("Help",1,"Black Box <::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
+ bbtkBlackBoxMessage("help",1,"Black Box <::"<<this->bbGetDescriptor()->GetTypeName()<<">"<<std::endl);
}
/*
if (bbIsUpToDate())
{
- bbtkMessage("Help",1,"Up-to-date ["<<mMaxInputChangeTime<<","
+ bbtkBlackBoxMessage("help",1,"Up-to-date ["<<mMaxInputChangeTime<<","
<<mMinOutputChangeTime<<"]"<<std::endl);
}
else
{
- bbtkMessage("Help",1,"Out-of-date ["<<mMaxInputChangeTime<<","
+ bbtkBlackBoxMessage("help",1,"Out-of-date ["<<mMaxInputChangeTime<<","
<<mMinOutputChangeTime<<"]"<<std::endl);
}
*/
- // bbtkMessage("Help",1," "<<GetDescription()<<std::endl);
- // bbtkMessage("Help",1," By : "<<GetAuthor()<<std::endl);
+ // bbtkBlackBoxMessage("help",1," "<<GetDescription()<<std::endl);
+ // bbtkBlackBoxMessage("help",1," By : "<<GetAuthor()<<std::endl);
std::vector<std::string> iname;
std::vector<std::string> ivalue;
}
if (iname.size())
- bbtkMessage("Help",1," * Inputs : "<<std::endl);
+ bbtkBlackBoxMessage("help",1," * Inputs : "<<std::endl);
else
- bbtkMessage("Help",1," * No inputs"<<std::endl);
+ bbtkBlackBoxMessage("help",1," * No inputs"<<std::endl);
std::vector<std::string>::iterator i1,i2,i3,i4;
for (i1=iname.begin(),i2=ivalue.begin(),i3=iconn.begin(),i4=istatus.begin();
value += "'";
value.append(1+valuelmax-value.size(),' ');
if (i3->size())
- bbtkMessage("Help",1," '"<<name<<" = '"<<value<<" <-- '"
+ bbtkBlackBoxMessage("help",1," '"<<name<<" = '"<<value<<" <-- '"
<<*i3<<"'");
else
- bbtkMessage("Help",1," '"<<name<<" = '"<<value);
- bbtkMessage("Help",1," ["<<*i4<<"]"<<std::endl);
+ bbtkBlackBoxMessage("help",1," '"<<name<<" = '"<<value);
+ bbtkBlackBoxMessage("help",1," ["<<*i4<<"]"<<std::endl);
}
if (oname.size())
- bbtkMessage("Help",1," * Outputs : "<<std::endl);
+ bbtkBlackBoxMessage("help",1," * Outputs : "<<std::endl);
else
- bbtkMessage("Help",1," * No outputs"<<std::endl);
+ bbtkBlackBoxMessage("help",1," * No outputs"<<std::endl);
std::vector<std::vector<std::string> >::iterator i5;
value += "'";
value.append(1+valuelmax-value.size(),' ');
if (!(*i5).size())
- bbtkMessage("Help",1," '"<<name<<" = '"<<value);
+ bbtkBlackBoxMessage("help",1," '"<<name<<" = '"<<value);
else
{
std::string pref = " '"+name+" = '"+value;
for (i3=i5->begin();i3!=i5->end();++i3)
{
- bbtkMessage("Help",1,pref<<" --> '"<<*i3<<"'");
+ bbtkBlackBoxMessage("help",1,pref<<" --> '"<<*i3<<"'");
pref.replace(0,pref.size(),pref.size(),' ');
}
}
- bbtkMessage("Help",1," ["<<*i4<<"]"<<std::endl);
+ bbtkBlackBoxMessage("help",1," ["<<*i4<<"]"<<std::endl);
}
}
//=========================================================================
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
static bool bbmgGlobalProcessingExecutionList = false;
//=========================================================================
void BlackBox::bbGlobalProcessExecutionList()
{
- bbtkDebugMessageInc("process",3,
- "=> BlackBox::bbGlobalProcessExecutionList()"
- <<std::endl);
+ bbtkDebugMessage("process",3,
+ "=> BlackBox::bbGlobalProcessExecutionList()"
+ <<std::endl);
if (bbmgGlobalProcessingExecutionList)
{
bbtkDebugMessage("process",3,"BlackBox::bbGlobalProcessExecutionList() reentered !");
if (p.lock())
{
bbtkDebugMessage("process",4,
- " -> Executing "<<
- p.lock()->bbGetFullName()<<std::endl);
+ " -> Executing '"<<
+ p.lock()->bbGetName()<<"'"<<std::endl);
p.lock()->bbExecute(true);
}
else
}
bbmgExecutionList.clear();
- bbtkDebugMessageDec("process",3,
+ bbtkDebugMessage("process",3,
"<= BlackBox::bbGlobalProcessExecutionList()"
<<std::endl);
void BlackBox::bbGlobalAddToExecutionList( BlackBox::Pointer b )
{
- bbtkDebugMessage("process",3,"* bbGlobalAddToExecutionList("<<b->bbGetFullName()<<")"<<std::endl);
+ bbtkDebugMessage("process",3,"* bbGlobalAddToExecutionList("<<b->bbGetName()<<")"<<std::endl);
if (bbmgGlobalProcessingExecutionList)
{
bbtkDebugMessage("process",3,"bbGlobalAddToExecutionList called inside bbGlobalProcessExecutionList !");
//=========================================================================
void BlackBox::Check(bool recursive)
{
- bbtkMessage("debug",1,"*** Checking Black Box "<<(void*)this<<" ["<<bbGetFullName()
- <<"] ... OK"<<std::endl);
+ bbtkBlackBoxMessage("debug",1,"*** Checking"
+ <<" ... OK"<<std::endl);
}
//=========================================================================
- void BlackBox::bbUserOnShowWidget(std::string nameInput)
- {
- bbtk::BlackBoxInputConnector *cc;
- cc = this->bbGetInputConnectorMap().find( nameInput.c_str() )->second;
- if (cc->GetConnection()!=NULL)
- {
- cc->GetConnection()->GetBlackBoxFrom()->bbUserOnShow();
- }
- }