// =====================================================================
//  $Id: TWaitCommand.cc,v 1.4 2004/03/07 10:30:28 goiwai Exp $
//  $Name: CLDAQ-1-14-03 $
//  $Log: TWaitCommand.cc,v $
//  Revision 1.4  2004/03/07 10:30:28  goiwai
//  ROOTに組みこむためのおまじないマクロを埋めこみました。
//  全てにおいて完全に動作するわけではありません。
//
//  Revision 1.3  2003/11/27 07:35:07  goiwai
//  *** empty log message ***
//
//  Revision 1.2  2003/11/25 19:13:10  goiwai
//  *** empty log message ***
//
//  Revision 1.1  2003/11/25 13:41:59  goiwai
//  まだ作りかけですが.
//  手打ち入力だと動くんですけど,マクロとして実行すると,ずっとスリープします.
//
// =====================================================================
#include "TWaitCommand.hh"
#include "TRunManager.hh"
#include "TRegularExpression.hh"

static const Tstring _name = "/system/wait";
static const Tstring _desc =
"マネージャーのステータスがSleep a parent process."
"\n"
"Some thread processes go on."
"\n"
"This command can accept only one argument and must be digit."
"\n"
"CLDAQ> /system/wait 10";

TWaitCommand::TWaitCommand( TRunManager* manager )
  : TCommand( manager, _name, _desc )
{;}

TWaitCommand::~TWaitCommand()
{;}

Tvoid TWaitCommand::Execute( const TstringList& arguments )
{
  static TRegularExpression regex( "^[0-9]+$" );

  // まだ作りかけ
  // とりあえず, RunManagerがスタンバイになるまで待つ
  // 手動だとまともな動作するけど
  // /system/execute でやるとずっとsleep しっぱなしになる
  Tint sec = 1;
  if ( !arguments.empty() ) {
    Tstring strtime = arguments[ 0 ];
    if ( regex == strtime ) {
      sec = strtoi( strtime );
    }
  }

  // TODO: バッチモードで実行するとだめなのです
  // マクロで読ませてもこの瞬間は tStatusReady の出力
  //Tcout << __FILE__ << __LINE__ << " " << theRunManager -> GetStatus() << Tendl;
  // ただイベントループだけが進行しないので eventlimit はいつまでたっても
  // おわらない
  // timelimit はちゃんと終了してくれる
  // マクロでの実行が問題なんだね
  // 手ではちゃんと動作する
  // doEventLoop() に問題かな?
  // ちょっと EventManagerとRunManagerの挙動をさぐる必要あり
  while ( theRunManager -> GetStatus() != tStatusStandby ) {
    sleep( sec );
  }

  return;
}

#ifdef __CLDAQ_ROOT_DLL
    ClassImp(TWaitCommand)
#endif
