-/*=========================================================================
+/*
+ # ---------------------------------------------------------------------
+ #
+ # 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: 2011/07/22 17:42:50 $
- Version: $Revision: 1.54 $
+ Date: $Date: 2012/11/16 08:49:01 $
+ Version: $Revision: 1.56 $
=========================================================================*/
-/* ---------------------------------------------------------------------
-
-* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
-* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
-*
-* 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.
-* ------------------------------------------------------------------------ */
+
/**
* \file
namespace bbtk
{
- static bool bbmgSomeBoxExecuting = false;
- static bool bbmgFreezeExecution = false;
+ static bool bbmgSomeBoxExecuting = false;
+ static bool bbmgFreezeExecution = false;
static std::set<BlackBox::WeakPointer> bbmgExecutionList;
//=========================================================================
if (!pack.expired())
{
Package::ReleaseBlackBoxDescriptor(pack,desc);
- }
- else
- {
+ } 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
- {
+ } 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);
bbmExecuting(false),
bbmName(name),
bbmBoxProcessMode("Pipeline"),
+ bbLetRecursiveExecuteManualMode(false),
bbmParent()
{
bbmExecuting(false),
bbmName(name),
bbmBoxProcessMode(from.bbmBoxProcessMode),
+ bbLetRecursiveExecuteManualMode(false),
bbmParent()
{
std::string BlackBox::bbGetNameWithParent() const
{
if (bbmParent.lock())
- {
- return bbmParent.lock()->bbGetNameWithParent() + ":" + bbmName;
- }
- else
- {
- return bbmName;
- }
+ {
+ return bbmParent.lock()->bbGetNameWithParent() + ":" + bbmName;
+ } else {
+ return bbmName;
+ }
}
//=========================================================================
(p == "F") || (p == "f") ||
(p == "Flash") || (p == "flash") ) return Flash;
*/
- bbtkError(bbGetFullName()<<" : BoxProcessMode value '"<<p
+
+ 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'"
// <<"'3'/'F'/'f'/'Flash'/'flash'"
- <<std::endl);
+ <<"'3'/'M'/'m'/'Manual'/'manual'"
+ <<std::endl);
}
//=========================================================================
//=========================================================================
-
+ //=========================================================================
+ bool BlackBox::bbBoxProcessModeIsManual() const
+ {
+ return (bbGetBoxProcessModeValue() == bbManual);
+ }
+ //=========================================================================
+
//=========================================================================
void BlackBox::bbAddOutputObserver(const std::string& output,
}
*/
+
OutputConnectorMapType::const_iterator o;
for ( o = bbGetOutputConnectorMap().begin();
o != bbGetOutputConnectorMap().end(); ++o )
- {
- if (o->second->GetStatus()==UPTODATE)
+ {
+
+
+ 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);
// 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);
<<std::endl);
// If already executing : return
- if (bbGetExecuting())
- {
- bbtkBlackBoxDebugMessage("process",3,
+ if (bbGetExecuting())
+ {
+ bbtkBlackBoxDebugMessage("process",3,
" -> already executing : abort"<<std::endl);
- return;
- }
+ return;
+ }
// If not initialized do it
bbInitializeProcessing();
this->bbCreateWindow();
// Updates its inputs
- IOStatus s = bbUpdateInputs();
-
- if ( (s != UPTODATE) ||
- bbBoxProcessModeIsAlways() )
+
+// 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)
- this->bbProcess();
-
-
- // Update the I/O statuses
- bbComputePostProcessStatus();
- }
- else
- {
+ if ( ( bbBoxProcessModeIsManual()==false ) ||
+ ( (bbBoxProcessModeIsManual()==true)&&(bbLetRecursiveExecuteManualMode==true) )
+ )
+ {
+
+//printf("EED BlackBox::bbRecursiveExecute bbProcess start %s \n", bbGetFullName().c_str() );
+
+//auto start = std::chrono::high_resolution_clock::now();
+ this->bbProcess();
+//auto stop = std::chrono::high_resolution_clock::now();
+//auto duration = duration_cast<std::chrono::microseconds>(stop - start);
+//printf("EED BlackBox::bbRecursiveExecute bbProcess time= %ld %s \n", duration.count() , bbGetFullName().c_str() );
+
+//printf("EED BlackBox::bbRecursiveExecute bbProcess end %s \n", bbGetFullName().c_str() );
+
+ } // 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();
<<"all inputs are Up-to-date but output '"
<<o->first<<"' is Out-of-date ???");
}
- }
+ } // for
bbtkBlackBoxDebugMessage("process",3," -> Up-to-date : nothing to do"
<<std::endl);
- }
+ } // if
// Shows the window if the black box has one
this->bbShowWindow();
}
//=========================================================================
-
-
-
//=========================================================================
IOStatus BlackBox::bbUpdateInputs()
for ( o = bbGetOutputConnectorMap().begin();
o!= bbGetOutputConnectorMap().end(); ++o)
{
- o->second->SetStatus(new_output_status);
+
+//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,
<<std::endl);
bbmgGlobalProcessingExecutionList = false;
+
}
//=========================================================================