+/*
+ # ---------------------------------------------------------------------
+ #
+ # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+ # pour la SantÈ)
+ # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+ # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+ # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+ #
+ # This software is governed by the CeCILL-B license under French law and
+ # abiding by the rules of distribution of free software. You can use,
+ # modify and/ or redistribute the software under the terms of the CeCILL-B
+ # license as circulated by CEA, CNRS and INRIA at the following URL
+ # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ # or in the file LICENSE.txt.
+ #
+ # As a counterpart to the access to the source code and rights to copy,
+ # modify and redistribute granted by the license, users are provided only
+ # with a limited warranty and the software's author, the holder of the
+ # economic rights, and the successive licensors have only limited
+ # liability.
+ #
+ # The fact that you are presently reading this means that you have had
+ # knowledge of the CeCILL-B license and that you accept its terms.
+ # ------------------------------------------------------------------------ */
+
+
/*=========================================================================
-
-Program: bbtk
-Module: $RCSfile: bbtkBlackBox.cxx,v $
-Language: C++
-Date: $Date: 2008/02/05 13:23:46 $
-Version: $Revision: 1.2 $
-
-Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
-l'Image). All rights reserved. See doc/license.txt or
-http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
-
-This software is distributed WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE. See the above copyright notices for more information.
-
+ Program: bbtk
+ Module: $RCSfile: bbtkBlackBox.cxx,v $
+ Language: C++
+ Date: $Date: 2012/11/16 08:49:01 $
+ Version: $Revision: 1.56 $
=========================================================================*/
+
/**
* \file
* \brief Class bbtk::BlackBox : abstract black-box interface.
#include "bbtkPackage.h"
#include "bbtkMessageManager.h"
#include "bbtkFactory.h"
+#include "bbtkBlackBoxOutputConnector.h"
#include "bbtkConfigurationFile.h"
#include "bbtkWxBlackBox.h"
+#include "bbtkWx.h"
#include <fstream>
//#include <vector>
namespace bbtk
{
+ static bool bbmgSomeBoxExecuting = false;
+ static bool bbmgFreezeExecution = false;
+ static std::set<BlackBox::WeakPointer> bbmgExecutionList;
+
+ //=========================================================================
+
+ BlackBox::Deleter::Deleter()
+ {
+ }
+ //=========================================================================
+
+ //=========================================================================
+ int BlackBox::Deleter::Delete(Object* p)
+ {
+ BlackBox* b = dynamic_cast<BlackBox*>(p);
+ if (!b)
+ {
+ bbtkInternalError("BlackBox::Deleter::Delete("<<p->GetObjectName()
+ <<"["<<p<<"]) : "
+ <<"dynamic cast to BlackBox* failed !");
+ }
+ std::string name = p->GetObjectName();//b->bbGetNameWithParent();
+ bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\")"<<std::endl);
+
+
+ BlackBoxDescriptor::WeakPointer desc = b->bbGetDescriptor();
+ bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : deleting black box"<<std::endl);
+
+ int refs = b->bbDelete();
+
+ bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : releasing descriptor"<<std::endl);
+
+ if (!desc.expired())
+ {
+ Package::WeakPointer pack = desc.lock()->GetPackage();
+ if (!pack.expired())
+ {
+ Package::ReleaseBlackBoxDescriptor(pack,desc);
+ }
+ else
+ {
+ bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : descriptor package expired (was not held by a package and the box was the last instance)"<<std::endl);
+ }
+ }
+ else
+ {
+ 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)
- : bbmName(name), bbmStatus(MODIFIED),
- bbmBoxProcessMode("Pipeline"),bbmParent(NULL)
+ :
+ // bbmStatus(MODIFIED),
+ bbmInitialized(false),
+ bbmExecuting(false),
+ bbmName(name),
+ bbmBoxProcessMode("Pipeline"),
+ bbLetRecursiveExecuteManualMode(false),
+ bbmParent()
+
{
- bbtkDebugMessage("Kernel",7,"BlackBox::BlackBox(\""
+ //JCP 02-11-09
+ // bbmBoxProcessMode = "Pipeline";
+//std::cout<<"JCP BlackBox::BlackBox(const std::string &name) name=" <<name
+// <<"bbmBoxProcessMode="<<bbmBoxProcessMode<<std::endl;
+ bbtkBlackBoxDebugMessage("object",4,"==> BlackBox::BlackBox(\""
+ <<name<<"\")"<<std::endl);
+ bbtkBlackBoxDebugMessage("object",4,"<== BlackBox::BlackBox(\""
<<name<<"\")"<<std::endl);
}
//=========================================================================
+ //=========================================================================
+ BlackBox::BlackBox(const BlackBox&)
+ {}
//=========================================================================
BlackBox::BlackBox(BlackBox& from, const std::string &name)
- : bbmName(name),
- bbmStatus(from.bbmStatus),
- bbmBoxProcessMode(from.bbmBoxProcessMode),bbmParent(NULL)
+ :
+ // bbmStatus(from.bbmStatus),
+ bbmInitialized(false),
+ bbmExecuting(false),
+ bbmName(name),
+ bbmBoxProcessMode(from.bbmBoxProcessMode),
+ bbLetRecursiveExecuteManualMode(false),
+ bbmParent()
+
{
- bbtkDebugMessage("Kernel",7,"BlackBox::BlackBox("
+ //JCP 02-11-09
+ //bbmBoxProcessMode = from.bbmBoxProcessMode;
+ //std::cout<<"JCP BlackBox::BlackBox(const std::string &name) name=" <<name
+ // <<"bbmBoxProcessMode="<<bbmBoxProcessMode<<std::endl;
+ bbtkBlackBoxDebugMessage("object",4,"==> BlackBox::BlackBox("
+ <<from.bbGetFullName()<<",\""
+ <<name<<"\")"<<std::endl);
+ bbtkBlackBoxDebugMessage("object",4,"<== BlackBox::BlackBox("
<<from.bbGetFullName()<<",\""
<<name<<"\")"<<std::endl);
}
//=========================================================================
BlackBox::~BlackBox()
{
- // std::cout << "EED BlackBox::~BlackBox 01 [" << bbGetName()<<"]\n";
- bbtkDebugMessageInc("Kernel",7,"BlackBox::~BlackBox()"<<std::endl);
+ bbtkBlackBoxDebugMessage("object",4,"==> BlackBox::~BlackBox() ["<<bbmName
+ <<"]"<<std::endl);
this->bbDesallocateConnectors();
- //printf("EED BlackBox::~BlackBox 02 \n");
- bbtkDebugDecTab("Kernel",7);
+ bbtkBlackBoxDebugMessage("object",4,"<== BlackBox::~BlackBox() ["<<bbmName
+ <<"]"<<std::endl);
}
//=========================================================================
- //=========================================================================
- /// Destruction method of a black box
- void BlackBox::bbDelete()
- {
- bbtkDebugMessage("Kernel",5,"BlackBox::bbDelete() ["
- <<bbGetFullName()<<"]"<<std::endl);
- this->bbUserDelete();
- }
- //=========================================================================
- //=========================================================================
- /// Main processing method of the box.
- void BlackBox::bbExecute(bool force)
- {
- bbtkDebugMessageInc("Process",1,
- "=> BlackBox::bbExecute() ["
- <<bbGetFullName()<<"]"<<std::endl);
-
- wx::BeginBusyCursor();
-
- // If execution frozen : return
- if (bbGlobalGetFreezeExecution())
- {
- bbtkDebugMessage("Process",1,
- " -> FreezeExecution global flag is 'true' : abort execution"<<std::endl);
- }
-
- // If force is true then update is triggered even if the box is UPTODATE
- if (force) bbSetModifiedStatus();
-
- // Calls the main recursive update method
- bbBackwardUpdate(0);
-
- wx::EndBusyCursor();
-
- bbtkDebugMessageDec("Process",1,
- "<= BlackBox::bbExecute() ["
- <<bbGetFullName()<<"]"<<std::endl);
- }
- //=========================================================================
-
//=========================================================================
std::string BlackBox::bbGetFullName() const
{
- return bbGetNameWithParent()+"<"+this->bbGetDescriptor()->GetTypeName()+">";
+ return this->bbGetNameWithParent()+"<"+this->bbGetDescriptor()->GetTypeName()+">";
}
//=========================================================================
//=========================================================================
- /// Returns the name with the name of the parent prepended if any
std::string BlackBox::bbGetNameWithParent() const
{
- if (bbmParent)
+ if (bbmParent.lock())
{
- return bbmParent->bbGetNameWithParent() + ":" + bbmName;
+ return bbmParent.lock()->bbGetNameWithParent() + ":" + bbmName;
}
else
{
//=========================================================================
//=========================================================================
- /// 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(this);
+ = new BlackBoxInputConnector(GetThisPointer<BlackBox>());
}
const BlackBoxDescriptor::OutputDescriptorMapType& omap
= bbGetDescriptor()->GetOutputDescriptorMap();
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",9,
- "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();
+ 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();
+ 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_
- || WxBlackBox::bbGlobalIsSomeWindowAlive()
+#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
{
const std::string& p = bbmBoxProcessMode;
if ( (p == "0") ||
(p == "P") || (p == "p") ||
- (p == "Pipeline") || (p == "pipeline") ) return Pipeline;
+ (p == "Pipeline") || (p == "pipeline") ) return bbPipeline;
if ( (p == "1") ||
(p == "A") || (p == "a") ||
- (p == "Always") || (p == "always") ) return Always;
+ (p == "Always") || (p == "always") ) return bbAlways;
if ( (p == "2") ||
(p == "R") || (p == "r") ||
- (p == "Reactive") || (p == "reactive") ) return Reactive;
- bbtkError(bbGetFullName()<<" : BoxProcessMode value '"<<p
+ (p == "Reactive") || (p == "reactive") )
+ return bbReactive;
+ /*
+ if ( (p == "3") ||
+ (p == "F") || (p == "f") ||
+ (p == "Flash") || (p == "flash") ) return Flash;
+ */
+
+ if ( (p == "3") ||
+ (p == "M") || (p == "m") ||
+ (p == "Manual") || (p == "manual") ) return bbManual;
+
+ 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'"
+ <<"'3'/'M'/'m'/'Manual'/'manual'"
+ <<std::endl);
}
//=========================================================================
//=========================================================================
bool BlackBox::bbBoxProcessModeIsReactive() const
{
- return (bbGetBoxProcessModeValue() == Reactive);
+ return (bbGetBoxProcessModeValue() == bbReactive);
}
//=========================================================================
//=========================================================================
bool BlackBox::bbBoxProcessModeIsAlways() const
{
- return (bbGetBoxProcessModeValue() == Always);
+ return (bbGetBoxProcessModeValue() == bbAlways);
+ }
+ //=========================================================================
+
+
+ //=========================================================================
+ bool BlackBox::bbBoxProcessModeIsManual() const
+ {
+ return (bbGetBoxProcessModeValue() == bbManual);
+ }
+ //=========================================================================
+
+
+ //=========================================================================
+ void BlackBox::bbAddOutputObserver(const std::string& output,
+ OutputChangeCallbackType f)
+ {
+ bbGetOutputConnector(output).AddChangeObserver(f);
+ }
+ //=========================================================================
+
+ //=========================================================================
+ void BlackBox::bbRemoveOutputObserver(const std::string& output_name,
+ OutputChangeCallbackType f)
+ {
+ bbtkError("BlackBox::RemoveChangeObserver NOT IMPLEMENTED");
}
//=========================================================================
+
//=========================================================================
- /// Signals that the BlackBox has been modified
- void BlackBox::bbSetModifiedStatus(BlackBoxInputConnector* c)
+ void BlackBox::bbSetStatusAndPropagate(BlackBoxInputConnector* c,
+ IOStatus s)
{
- bbtkDebugMessageInc("Process",5,
- "=> BlackBox::bbSetModifiedStatus("<<c<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
-
- if ( (c==bbGetInputConnectorMap().find("WinHide")->second) )
- // && (bbCanReact()))
- {
- bbtkDebugMessage("Process",9,
- "-> Hide triggered by WinHide input change"
- <<std::endl);
- this->bbHideWindow();
- this->bbSetStatus(MODIFIED);
- return;
- }
-
- if ( ( bbBoxProcessModeIsReactive() ||
- (c==bbGetInputConnectorMap().find("BoxExecute")->second))
- && (bbCanReact() ) )
+ 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)
{
- bbtkDebugMessage("Process",9,
- "-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
- this->bbSetStatus(MODIFIED);
- bbGlobalAddToExecutionList( this );
+ this->bbExecute();
}
- else if ( bbGetStatus() == MODIFIED ) //! this->bbIsUptodate())
- {
- bbtkDebugMessage("Process",5,"-> Already modified"<<std::endl);
- bbtkDebugDecTab("Process",5);
- return;
- }
- else
+ */
+
+
+ OutputConnectorMapType::const_iterator o;
+ for ( o = bbGetOutputConnectorMap().begin();
+ o != bbGetOutputConnectorMap().end(); ++o )
{
- bbtkDebugMessage("Process",5,"-> Status set to modified"<<std::endl);
- bbtkDebugDecTab("Process",5);
- this->bbSetStatus(MODIFIED);
- }
-
- this->bbSignalOutputModification(false);
- bbtkDebugMessageDec("Process",5,
- "<= BlackBox::bbSetModifiedStatus("<<c<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
- }
+
+ if (o->first=="BoxChange")
+ {
+ o->second->SetStatus(UPTODATE);
+ }
+
+
+
+//EED 24/08/2015
+// EED CASPITAS 2
+ if (o->second->GetStatus()==UPTODATE)
+// if ((o->second->GetStatus()==UPTODATE) || (o->second->GetStatus()==OUTOFDATE))
+// if ((o->second->GetStatus()==UPTODATE) || (o->second->GetStatus()==MODIFIED))
+ {
+ o->second->SetStatus(OUTOFDATE);
+ o->second->SignalChange(GetThisPointer<BlackBox>(),o->first);
+ } // if
+ } // for
+
+
+ if ( ( bbBoxProcessModeIsReactive()
+ || (c==bbGetInputConnectorMap().find("BoxExecute")->second))
+ && (bbCanReact() ) )
+ {
+ bbtkBlackBoxDebugMessage("change",2,
+ "-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
+ bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
+ } // if
+ bbtkBlackBoxDebugMessage("change",5,
+ "<= BlackBox::bbSetStatusAndPropagate(input)"
+ <<std::endl);
+ }
//=========================================================================
+
//=========================================================================
void BlackBox::bbSignalOutputModification(bool reaction)
{
- bbtkDebugMessageInc("Process",5,
- "=> BlackBox::bbSignalOutputModification() ["
- <<bbGetFullName()<<"]"<<std::endl);
-
- OutputConnectorMapType::iterator change = bbGetOutputConnectorMap().end();
+ bbtkBlackBoxDebugMessage("change",5,
+ "=> BlackBox::bbSignalOutputModification("
+ <<reaction<<")"
+ <<"]"<<std::endl);
+
OutputConnectorMapType::iterator i;
for ( i = bbGetOutputConnectorMap().begin();
- i != bbGetOutputConnectorMap().end(); ++i) {
- /* if ( i->first == "BoxChange" )
- {
- change = i;
- continue;
- }
- */
- i->second->SetModifiedStatus();
- }
- // if (change != bbGetOutputConnectorMap().end())
- // change->second->SetModifiedStatus();
+ i != bbGetOutputConnectorMap().end(); ++i)
+ {
+ // 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);
+ // }
+ } // for
if (reaction) bbGlobalProcessExecutionList();
- bbtkDebugMessageDec("Process",5,
- "<= BlackBox::bbSignalOutputModification() ["
- <<bbGetFullName()<<"]"<<std::endl);
-
+ bbtkBlackBoxDebugMessage("change",5,
+ "<= BlackBox::bbSignalOutputModification()"
+ <<std::endl);
}
//=========================================================================
+
+
//=========================================================================
void BlackBox::bbSignalOutputModification(const std::string& output,
- bool reaction)
+ bool reaction)
{
- bbtkDebugMessageInc("Process",5,
- "=> BlackBox::bbSignalOutputModification("
- <<output<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
+ bbtkBlackBoxDebugMessage("change",5,
+ "=> BlackBox::bbSignalOutputModification("
+ <<output<<","<<reaction<<")"
+ <<std::endl);
- OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(output);
+ OutputConnectorMapType::iterator i =
+ bbGetOutputConnectorMap().find(output);
+
+
if ( i == bbGetOutputConnectorMap().end() )
{
bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<output<<") : unknown output");
}
- i->second->SetModifiedStatus();
- // Has to notify the output "BoxChange" also
- if (output != "BoxChange")
- {
- i = bbGetOutputConnectorMap().find("BoxChange");
- if ( i != bbGetOutputConnectorMap().end() )
+
+ // if (i->second->GetStatus()==UPTODATE)
+ // {
+ i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
+ // Has to notify the output "BoxChange" also
+ if (output != "BoxChange")
{
- i->second->SetModifiedStatus();
+ i = bbGetOutputConnectorMap().find("BoxChange");
+ if ( i != bbGetOutputConnectorMap().end() )
+ {
+ i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
+ }
}
- }
- if (reaction) bbGlobalProcessExecutionList();
-
- bbtkDebugMessageDec("Process",5,
- "<= BlackBox::bbSignalOutputModification("
- <<output<<") ["
- <<bbGetFullName()<<"]"<<std::endl);
+ if (reaction) bbGlobalProcessExecutionList();
+ // }
+ bbtkBlackBoxDebugMessage("change",5,
+ "<= BlackBox::bbSignalOutputModification("
+ <<output<<")"
+ <<std::endl);
}
//=========================================================================
//=========================================================================
void BlackBox::bbSignalOutputModification(const std::vector<std::string>& output,
bool reaction)
{
- bbtkDebugMessageInc("Process",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;
for (o=output.begin();o!=output.end();++o)
{
// the output "BoxChange" must be signaled **AFTER** all others
{
bbtkError("BlackBox["<<bbGetFullName()<<"]::bbSignalOutputModification("<<*o<<") : unknown output");
}
- i->second->SetModifiedStatus();
+
+ // 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 ( i != bbGetOutputConnectorMap().end() )
+ if ( changed && (i != bbGetOutputConnectorMap().end()))
{
- i->second->SetModifiedStatus();
+ // if (i->second->GetStatus()==UPTODATE)
+ // {
+ i->second->SignalChange(GetThisPointer<BlackBox>(),i->first);
+ if (reaction) bbGlobalProcessExecutionList();
+ // }
}
- if (reaction) bbGlobalProcessExecutionList();
-
- bbtkDebugMessageDec("Process",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();
+
+ if ( bbBoxProcessModeIsManual() )
+ {
+ bbLetRecursiveExecuteManualMode = true;
+ }
+
+
+ // Calls the main recursive execution method
+ bbRecursiveExecute(Connection::Pointer());
+
+
+ if ( bbBoxProcessModeIsManual() )
+ {
+ bbLetRecursiveExecuteManualMode = false;
+ }
+
+
+ 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;
+ }
+ }
+ //=========================================================================
+
+
//=========================================================================
- /// Updates the BlackBox inputs
- /// \returns UPTODATE if all inputs are in UPTODATE status after update
- /// else MODIFIED
- IOStatus BlackBox::bbUpdateInputs(bool excludeParent)
+ void BlackBox::bbRecursiveExecute( Connection::Pointer caller )
{
- bbtkDebugMessageInc("Process",4,
- "=> BlackBox::bbUpdateInputs() ["
- <<bbGetFullName()<<"]"
+
+ 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;
+ IOStatus s=UPTODATE;
+// IOStatus s=OUTOFDATE;
+// IOStatus s=MODIFIED;
+
+
+ if ( ( bbBoxProcessModeIsManual()==false ) ||
+ ( (bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==true) ) )
+ {
+ s = bbUpdateInputs();
+ }
+
+ if ( (s != UPTODATE) || bbBoxProcessModeIsAlways() )
+ {
+ // Displays the window (WxBlackbox)
+ // bbShowWindow(caller);
+
+ // Actual processing (virtual)
+ if ( ( bbBoxProcessModeIsManual()==false ) ||
+ ( (bbBoxProcessModeIsManual()==true)&&(bbLetRecursiveExecuteManualMode==true) )
+ )
+ {
+ this->bbProcess();
+ } // Manual analysis
+
+//EED ups if ((bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==false))
+//EED ups {
+//EED ups bbSignalOutputModification(true);
+//EED ups }
+
+
+ // 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;
+ }
+ //=========================================================================
+
+
+
+
+
+ //=========================================================================
+ IOStatus BlackBox::bbUpdateInputs()
+ {
+ bbtkBlackBoxDebugMessage("process",4,
+ "=> BlackBox::bbUpdateInputs()"
<<std::endl);
IOStatus s = UPTODATE;
-
+
InputConnectorMapType::iterator i;
for ( i = bbGetInputConnectorMap().begin();
i!= bbGetInputConnectorMap().end(); ++i)
{
- if (excludeParent && (i->first=="WinParent")) continue;
- if (i->first=="WinHide") continue;
+ // if (i->first=="WinHide") continue;
// If input type is Void : no recurse
//if ( bbGetDescriptor()->GetInputDescriptor(i->first)->GetTypeInfo()
// == typeid(Void) )
// continue;
-
- IOStatus t = i->second->BackwardUpdate();
- if (t==MODIFIED) s = MODIFIED;
+ bbtkBlackBoxDebugMessage("change",2,
+ "Input '"<<i->first
+ <<"': status before update = '"
+ <<GetIOStatusString(i->second->GetStatus())
+ <<"'"<<std::endl);
+ i->second->RecursiveExecute();
+ IOStatus t = i->second->GetStatus();
+ if (t > s) s = t;
+ 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);
+ return s;
+ }
+ //=========================================================================
+
+ //==================================================================
+ void BlackBox::bbComputePostProcessStatus()
+ {
+ bbtkBlackBoxDebugMessage("process",4,
+ "=> BlackBox::bbComputePostProcessStatus()"
<<std::endl);
+ IOStatus new_output_status = UPTODATE;
+ if (bbBoxProcessModeIsAlways()) new_output_status = OUTOFDATE;
- return s;
+ // Update the input statuses
+ InputConnectorMapType::iterator i;
+ for ( i = bbGetInputConnectorMap().begin();
+ i!= bbGetInputConnectorMap().end(); ++i)
+ {
+ IOStatus t = i->second->GetStatus();
+ if (t == OUTOFDATE) new_output_status = OUTOFDATE;
+ // A previously MODIFIED status turns to UPTODATE
+ if (t==MODIFIED) i->second->SetStatus(UPTODATE);
+ bbtkBlackBoxDebugMessage("change",2,
+ "Input '"<<i->first<<"' : "
+ << GetIOStatusString(t) << " -> "
+ << GetIOStatusString(i->second->GetStatus())
+ << 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!= bbGetOutputConnectorMap().end(); ++o)
+ {
+
+//EED if ( ( bbBoxProcessModeIsManual()==false ) ||
+//EED ( (bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==true) )
+//EED )
+//EED {
+ o->second->SetStatus(new_output_status);
+//EED } else {
+//EED if (( (bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==false) ) )
+//EED {
+//EED o->second->SetStatus(UPTODATE);
+//EED }
+//EED } // Manual analysis
+
+ }
+
+ bbtkBlackBoxDebugMessage("process",4,
+ "<= BlackBox::bbComputePostProcessStatus()"
+ <<std::endl);
}
- //=========================================================================
+ //==================================================================
-
//=========================================================================
- /// Connects the input <name> to the connection c
void BlackBox::bbConnectInput( const std::string& name, Connection* c)
{
- bbtkDebugMessageInc("Kernel",7,
- "BlackBox::bbConnectInput(\""<<name<<"\","<<c<<") ["
- <<bbGetFullName()<<"]"
+ bbtkBlackBoxDebugMessage("connection",2,
+ "==> BlackBox::bbConnectInput(\""
+ <<name<<"\","<<c->GetFullName()<<")"
<<std::endl);
+
InputConnectorMapType::iterator i = bbGetInputConnectorMap().find(name);
if (i==bbGetInputConnectorMap().end())
{
bbtkError("no input called '"<<name<<"'");
}
i->second->SetConnection(c);
-
- // bbSetModifiedStatus();
+ // The input *MUST* be set OUTOFDATE to update its input on next execution
+ bbSetStatusAndPropagate(i->second,OUTOFDATE);
- bbtkDebugDecTab("Kernel",7);
+ bbtkBlackBoxDebugMessage("connection",2,
+ "<== BlackBox::bbConnectInput(\""
+ <<name<<"\","<<c->GetFullName()<<")"
+ <<std::endl);
}
//=========================================================================
//=========================================================================
- /// Connects the output <name> to the connection c
void BlackBox::bbConnectOutput( const std::string& name, Connection* c)
{
- bbtkDebugMessageInc("Kernel",7,
- "BlackBox::bbConnectOutput(\""<<name<<"\","<<c<<") ["
- <<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);
- bbtkDebugDecTab("Kernel",7);
+ 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)
{
- bbtkDebugMessageInc("Kernel",7,
- "BlackBox::bbDisconnectInput(\""<<name
- <<"\","<<c<<") ["
- <<bbGetFullName()<<"]"
- <<std::endl);
+
+ bbtkBlackBoxDebugMessage("connection",2,
+ "==> BlackBox::bbDisconnectInput(\""<<name
+ <<"\","<<c->GetFullName()<<")"
+ <<std::endl);
+ if (!c)
+ {
+
+ bbtkBlackBoxDebugMessage("connection",2,"c==0"<<std::endl);
+ return;
+ }
InputConnectorMapType::iterator i = bbGetInputConnectorMap().find(name);
if (i==bbGetInputConnectorMap().end())
}
i->second->UnsetConnection(c);
- bbtkDebugDecTab("Kernel",7);
+ bbtkBlackBoxDebugMessage("connection",2,
+ "<== BlackBox::bbDisconnectInput(\""<<name
+ <<"\","<<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)
{
- bbtkDebugMessageInc("Kernel",7,
- "BlackBox::bbDisconnectOutput(\""<<name
- <<"\","<<c<<") ["
- <<bbGetFullName()<<"]"
- <<std::endl);
+ bbtkBlackBoxDebugMessage("connection",2,
+ "==> BlackBox::bbDisconnectOutput(\""<<name
+ <<"\","<<c->GetFullName()<<")"
+ <<std::endl);
+ if (!c)
+ {
+
+ bbtkBlackBoxDebugMessage("connection",2,"c==0"<<std::endl);
+ return;
+ }
OutputConnectorMapType::iterator i = bbGetOutputConnectorMap().find(name);
if (i==bbGetOutputConnectorMap().end())
}
i->second->UnsetConnection(c);
- bbtkDebugDecTab("Kernel",7);
+ bbtkBlackBoxDebugMessage("connection",2,
+ "<== BlackBox::bbDisconnectOutput(\""<<name
+ <<"\","<<c->GetFullName()<<")"
+ <<std::endl);
}
//=========================================================================
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
//=========================================================================
- /// Virtual
void BlackBox::bbWriteDotInputOutputName(FILE *ff,bool inputoutput,int detail, int level)
{
fprintf(ff,"%s%p",bbGetTypeName().c_str(),this);
// Looks for the adaptor
if (bbGetOutputType(output).name() != typeid(std::string).name() )
{
- BlackBox* a = 0;
- try
+ // Look for factory
+ Package::Pointer p = bbGetDescriptor()->GetPackage();
+ if ((p != 0) && ( ! p->GetFactorySet().empty() ) )
{
- a = NewAdaptor(
- bbGetOutputType(output),
- typeid(std::string),
- "");
- } catch (bbtk::Exception e)
+ Factory::Pointer f = p->GetFactorySet().begin()->lock();
+ BlackBox::Pointer a;
+ try
+ {
+ a = f->NewAdaptor(
+ bbGetOutputType(output),
+ typeid(std::string),
+ "");
+ } catch (bbtk::Exception e)
+ {
+ }
+ if (a){
+ // bbUpdate();
+ a->bbSetInput("In",bbGetOutput(output));
+ a->bbExecute();
+ v = a->bbGetOutput("Out").unsafe_get<std::string>() ;
+ } else {
+ v="? (no adaptor found)";
+ }
+ }
+ else
{
+ v="? (no factory found)";
}
- if (a!=NULL){
- // bbUpdate();
- a->bbSetInput("In",bbGetOutput(output));
- a->bbExecute();
- v = a->bbGetOutput("Out").unsafe_get<std::string>() ;
- } else {
- v="? (no adaptor found)";
- }
- } else {
- // bbUpdate();
- v = bbGetOutput(output).unsafe_get<std::string>() ;
- }
+ }
+ else
+ {
+ // bbUpdate();
+ v = bbGetOutput(output).unsafe_get<std::string>() ;
+ }
return v;
}
//=========================================================================
// Looks for the adaptor
if (bbGetInputType(input) != typeid(std::string))
{
- BlackBox* a = 0;
- try
- {
- a = NewAdaptor(
- bbGetInputType(input),
- typeid(std::string),
- "");
- }catch (bbtk::Exception e)
- {
- }
- if (a!=NULL)
+ // Look for factory
+ Package::Pointer p = bbGetDescriptor()->GetPackage();
+ if ((p != 0) && ( ! p->GetFactorySet().empty() ) )
{
- // bbUpdate();
- a->bbSetInput("In",bbGetInput(input));
- a->bbExecute();
- v = a->bbGetOutput("Out").unsafe_get<std::string>() ;
+ Factory::Pointer f = p->GetFactorySet().begin()->lock();
+ BlackBox::Pointer a;
+ try
+ {
+ a = f->NewAdaptor(
+ bbGetInputType(input),
+ typeid(std::string),
+ "");
+ }catch (bbtk::Exception e)
+ {
+ }
+ if (a)
+ {
+ // bbUpdate();
+ a->bbSetInput("In",bbGetInput(input));
+ a->bbExecute();
+ v = a->bbGetOutput("Out").unsafe_get<std::string>() ;
+ }
+ else
+ {
+ v="? (no adaptor found)";
+ }
}
else
{
- v="? (no adaptor found)";
+ v="? (no factory found)";
}
- }
+ }
else
{
v = bbGetInput(input).unsafe_get<std::string>() ;
std::string ss("<");
std::string::size_type pos = 0;
pos = s.find(ss,0);
- char* cr = "[";
+ std::string cr("[");
while ( pos != std::string::npos )
{
// std::cout << "*** find one "<<std::endl;
- s.replace(pos,1,cr,1);
+ s.replace(pos,1,cr.c_str(),1);
pos = s.find(ss, pos);
}
ss = ">";
while ( pos != std::string::npos )
{
// std::cout << "*** find one "<<std::endl;
- s.replace(pos,1,cr,1);
+ s.replace(pos,1,cr.c_str(),1);
pos = s.find(ss, pos);
}
ss = ",";
while ( pos != std::string::npos )
{
// std::cout << "*** find one "<<std::endl;
- s.replace(pos,1,cr,1);
+ s.replace(pos,1,cr.c_str(),1);
pos = s.find(ss, pos);
} // std::cout << "AFTER=["<<s<<"]"<<std::endl;
}
//=========================================================================
/// Write Graphviz-dot description in file
void BlackBox::bbWriteDotFileBlackBox(FILE *ff,
- BlackBox *parentblackbox,
+ BlackBox::Pointer parentblackbox,
int detail, int level,
bool instanceOrtype,
bool relative_link )
- {
+ {
InputConnectorMapType::iterator i;
// label
std::string labelStr;
std::string valueStr("");
- if (detail==0)
- {
- labelStr = bbGetName() ;
- } else {
- labelStr = bbGetName();
- labelStr = labelStr + " [" +this->bbGetDescriptor()->GetPackage()->GetName()+"::"+ bbGetTypeName() + "] ";
+
+ if (detail==0) {
+ labelStr = bbGetName() ;
+//EED 18 Fev 2008
+ labelStr = labelStr + "\\n[" +this->bbGetDescriptor()->GetPackage()->GetName()+"::"+ bbGetTypeName() + "]";
+ } else {
+ labelStr = bbGetName();
+ labelStr = labelStr + " [" +this->bbGetDescriptor()->GetPackage()->GetName()+"::"+ bbGetTypeName() + "] ";
}
SubsBrackets(labelStr);
const BlackBoxOutputDescriptor* id = bbGetDescriptor()->GetOutputDescriptor(ii->first);
tempStrTypeName=id->GetTypeName();
SubsBrackets(tempStrTypeName);
- std::string Name(ii->first);
- SubsBrackets(Name);
+ std::string Name(ii->first);
+ SubsBrackets(Name);
labelStr=labelStr+"<"+ii->first.c_str()+"> " + valueStr + Name.c_str() + " ["+tempStrTypeName+"]";
}
labelStr = labelStr+ " } }" ;
// std::cout << labelStr << std::endl;
// Relation Input
- if (this!=parentblackbox){
+ if (GetThisPointer<BlackBox>()!=parentblackbox){
for ( i = mInputConnectorMap.begin(); i != mInputConnectorMap.end(); ++i )
{
if (i->second)
{
Connection* con = i->second->GetConnection();
if (con!=NULL){
- BlackBox *a=con->GetBlackBoxFrom();
- BlackBox *b=con->GetBlackBoxTo();
+ BlackBox::Pointer a=con->GetOriginalBlackBoxFrom();
+ BlackBox::Pointer b=con->GetOriginalBlackBoxTo();
fprintf(ff," ");
a->bbWriteDotInputOutputName(ff,false,detail,level);
if (detail==1)
{
- fprintf(ff,":%s",con->GetBlackBoxFromOutput().c_str());
+ fprintf(ff,":%s",con->GetOriginalBlackBoxFromOutput().c_str());
}
fprintf(ff,"->");
b->bbWriteDotInputOutputName(ff,true,detail,level);
if (detail==1)
{
- fprintf(ff,":%s",con->GetBlackBoxToInput().c_str());
+ fprintf(ff,":%s",con->GetOriginalBlackBoxToInput().c_str());
}
fprintf(ff,"%s\n",";");
} // if con
//=========================================================================
- void BlackBox::bbShowRelations(BlackBox *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())
+ {
+ bbtkBlackBoxMessage("help",1,"Up-to-date ["<<mMaxInputChangeTime<<","
+ <<mMinOutputChangeTime<<"]"<<std::endl);
+ }
+ else
+ {
+ 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;
std::vector<std::string> iconn;
+ std::vector<std::string> istatus;
InputConnectorMapType::iterator i;
unsigned int namelmax = 0;
unsigned int valuelmax = 0;
- unsigned int connlmax = 0;
+ // unsigned int connlmax = 0;
for ( i = mInputConnectorMap.begin(); i != mInputConnectorMap.end(); ++i )
- {
- iname.push_back(i->first);
- if (iname.back().size()>namelmax) namelmax = iname.back().size();
- ivalue.push_back(bbGetInputAsString(i->first));
- if (ivalue.back().size()>valuelmax) valuelmax = ivalue.back().size();
- std::string s("");
- Connection* con = i->second->GetConnection();
- if (con!=0){
- s = con->GetBlackBoxFrom()->bbGetName();
- s += ".";
- s += con->GetBlackBoxFromOutput();
- } // if con
- iconn.push_back(s);
- }
+ {
+ iname.push_back(i->first);
+ if (iname.back().size()>namelmax) namelmax = iname.back().size();
+ ivalue.push_back(bbGetInputAsString(i->first));
+ if (ivalue.back().size()>valuelmax) valuelmax = ivalue.back().size();
+ std::string s("");
+ Connection* con = i->second->GetConnection();
+ if (con!=0){
+ s = con->GetOriginalBlackBoxFrom()->bbGetName();
+ s += ".";
+ s += con->GetOriginalBlackBoxFromOutput();
+ } // if con
+ iconn.push_back(s);
+ istatus.push_back(GetIOStatusString(i->second->GetStatus()));
+ }
OutputConnectorMapType::iterator o;
std::vector<std::string> oname;
std::vector<std::string> ovalue;
std::vector<std::vector<std::string> > oconn;
+ std::vector<std::string> ostatus;
for ( o = mOutputConnectorMap.begin(); o != mOutputConnectorMap.end(); ++o )
- {
- oname.push_back(o->first);
- if (oname.back().size()>namelmax) namelmax = oname.back().size();
- ovalue.push_back(bbGetOutputAsString(o->first));
- if (ovalue.back().size()>valuelmax) valuelmax = ovalue.back().size();
- std::vector<std::string> ss;
- const std::vector<Connection*>& con = o->second->GetConnectionVector();
- std::vector<Connection*>::const_iterator c;
- for (c=con.begin();c!=con.end();++c)
- {
- std::string s;
- s = (*c)->GetBlackBoxTo()->bbGetName();
- s += ".";
- s += (*c)->GetBlackBoxToInput();
- ss.push_back(s);
- } // if con
- oconn.push_back(ss);
- }
+ {
+ oname.push_back(o->first);
+ if (oname.back().size()>namelmax)
+ namelmax = oname.back().size();
+ ovalue.push_back(bbGetOutputAsString(o->first));
+ if (ovalue.back().size()>valuelmax)
+ valuelmax = ovalue.back().size();
+ std::vector<std::string> ss;
+ const std::vector<Connection*>& con
+ = o->second->GetConnectionVector();
+ std::vector<Connection*>::const_iterator c;
+ for (c=con.begin();c!=con.end();++c)
+ {
+ std::string s;
+ s = (*c)->GetOriginalBlackBoxTo()->bbGetName();
+ s += ".";
+ s += (*c)->GetOriginalBlackBoxToInput();
+ ss.push_back(s);
+ } // if con
+ oconn.push_back(ss);
+ ostatus.push_back(GetIOStatusString(o->second->GetStatus()));
+ }
if (iname.size())
- bbtkMessage("Help",1," * Inputs : "<<std::endl);
+ bbtkBlackBoxMessage("help",1," * Inputs : "<<std::endl);
else
- bbtkMessage("Help",1," * No inputs"<<std::endl);
-
- std::vector<std::string>::iterator i1,i2,i3;
- for (i1=iname.begin(),i2=ivalue.begin(),i3=iconn.begin();
- i1!=iname.end(),i2!=ivalue.end(),i3!=iconn.end();
- ++i1,++i2,++i3)
- {
- std::string name(*i1);
- name += "'";
- name.append(1+namelmax-name.size(),' ');
- std::string value(*i2);
- value += "'";
- value.append(1+valuelmax-value.size(),' ');
- if (i3->size())
- bbtkMessage("Help",1," '"<<name<<" = '"<<value<<" <-- '"<<*i3<<"'"<<std::endl);
- else
- bbtkMessage("Help",1," '"<<name<<" = '"<<value<<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();
+ i1!=iname.end(),i2!=ivalue.end(),i3!=iconn.end(),i4!=istatus.end();
+ ++i1,++i2,++i3,++i4)
+ {
+ std::string name(*i1);
+ name += "'";
+ name.append(1+namelmax-name.size(),' ');
+ std::string value(*i2);
+ value += "'";
+ value.append(1+valuelmax-value.size(),' ');
+ if (i3->size())
+ bbtkBlackBoxMessage("help",1," '"<<name<<" = '"<<value<<" <-- '" <<*i3<<"'");
+ else
+ 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);
-
- std::vector<std::vector<std::string> >::iterator i4;
-
- for (i1=oname.begin(),i2=ovalue.begin(),i4=oconn.begin();
- i1!=oname.end(),i2!=ovalue.end(),i4!=oconn.end();
- ++i1,++i2,++i4)
- {
- std::string name(*i1);
- name += "'";
- name.append(1+namelmax-name.size(),' ');
- std::string value(*i2);
- value += "'";
- value.append(1+valuelmax-value.size(),' ');
- if (!(*i4).size())
- bbtkMessage("Help",1," '"<<name<<" = '"<<value<<std::endl);
- else
- {
- std::string pref = " '"+name+" = '"+value;
- for (i3=i4->begin();i3!=i4->end();++i3)
- {
- bbtkMessage("Help",1,pref<<" --> '"<<*i3<<"'"<<std::endl);
- pref.replace(0,pref.size(),pref.size(),' ');
- }
- }
- }
+ bbtkBlackBoxMessage("help",1," * No outputs"<<std::endl);
+
+ std::vector<std::vector<std::string> >::iterator i5;
+
+ for (i1=oname.begin(),i2=ovalue.begin(),i5=oconn.begin(),i4=ostatus.begin();
+ i1!=oname.end(),i2!=ovalue.end(),i5!=oconn.end(),i4!=ostatus.end();
+ ++i1,++i2,++i4,++i5)
+ {
+ std::string name(*i1);
+ name += "'";
+ name.append(1+namelmax-name.size(),' ');
+ std::string value(*i2);
+ value += "'";
+ value.append(1+valuelmax-value.size(),' ');
+ if (!(*i5).size())
+ bbtkBlackBoxMessage("help",1," '"<<name<<" = '"<<value);
+ else
+ {
+ std::string pref = " '"+name+" = '"+value;
+ for (i3=i5->begin();i3!=i5->end();++i3)
+ {
+ bbtkBlackBoxMessage("help",1,pref<<" --> '"<<*i3<<"'");
+ pref.replace(0,pref.size(),pref.size(),' ');
+ }
+ }
+ bbtkBlackBoxMessage("help",1," ["<<*i4<<"]"<<std::endl);
+ }
}
//=========================================================================
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ static bool bbmgGlobalProcessingExecutionList = false;
+
//=========================================================================
void BlackBox::bbGlobalProcessExecutionList()
{
- bbtkDebugMessageInc("Process",1,
- "=> BlackBox::bbGlobalProcessExecutionList()"
- <<std::endl);
-
- std::set<BlackBox*>::iterator i;
- for (i=bbmgExecutionList.begin();
- i!=bbmgExecutionList.end();
- ++i)
+ bbtkDebugMessage("process",3,
+ "=> BlackBox::bbGlobalProcessExecutionList()"
+ <<std::endl);
+ if (bbmgGlobalProcessingExecutionList)
{
- bbtkDebugMessage("Process",2,
- " -> Executing "<<(*i)->bbGetFullName()<<std::endl);
- (*i)->bbExecute(true);
+ bbtkDebugMessage("process",3,"BlackBox::bbGlobalProcessExecutionList() reentered !");
+ return;
+ }
+ bbmgGlobalProcessingExecutionList = true;
+
+ std::set<BlackBox::WeakPointer>::iterator i;
+ while (bbmgExecutionList.size()>0)
+ {
+ i = bbmgExecutionList.begin();
+ BlackBox::WeakPointer p = *i;
+ bbmgExecutionList.erase(i);
+ if (p.lock())
+ {
+ bbtkDebugMessage("process",4,
+ " -> Executing '"<<
+ p.lock()->bbGetName()<<"'"<<std::endl);
+ p.lock()->bbExecute(true);
+ }
+ else
+ {
+ bbtkGlobalError("Strange error in BlackBox::bbGlobalProcessExecutionList() : Weak bb pointer in bbmgExecutionList is no more valid...");
+ }
}
bbmgExecutionList.clear();
- bbtkDebugMessageDec("Process",1,
+ bbtkDebugMessage("process",3,
"<= BlackBox::bbGlobalProcessExecutionList()"
<<std::endl);
+ bbmgGlobalProcessingExecutionList = false;
+
}
//=========================================================================
- //=========================================================================
- // Static members initialization
- bool BlackBox::bbmgSomeBoxExecuting = false;
- bool BlackBox::bbmgFreezeExecution = false;
- std::set<BlackBox*> BlackBox::bbmgExecutionList;
+ bool BlackBox::bbGlobalGetSomeBoxExecuting()
+ {
+ return bbmgSomeBoxExecuting;
+ }
+
+ void BlackBox::bbGlobalSetSomeBoxExecuting(bool b)
+ {
+ bbmgSomeBoxExecuting = b;
+ }
+
+ void BlackBox::bbGlobalSetFreezeExecution(bool b)
+ {
+ bbmgFreezeExecution = b;
+ }
+
+ bool BlackBox::bbGlobalGetFreezeExecution()
+ {
+ return bbmgFreezeExecution;
+ }
+
+ void BlackBox::bbGlobalAddToExecutionList( BlackBox::Pointer b )
+ {
+ bbtkDebugMessage("process",3,"* bbGlobalAddToExecutionList("<<b->bbGetName()<<")"<<std::endl);
+ if (bbmgGlobalProcessingExecutionList)
+ {
+ bbtkDebugMessage("process",3,"bbGlobalAddToExecutionList called inside bbGlobalProcessExecutionList !");
+ }
+ bbmgExecutionList.insert(b);
+ }
+
+
//=========================================================================
+ //=========================================================================
+ void BlackBox::Check(bool recursive)
+ {
+ bbtkBlackBoxMessage("debug",1,"*** Checking"
+ <<" ... OK"<<std::endl);
+ }
+ //=========================================================================
+
+
+
} // EO namespace bbtk