///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright (c) 2000-2019 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v2.0     //
// which accompanies this distribution, and is available at                  //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
//  Module: ExecCtrl_Demo
// 
//  Purpose:
//    This module demonstrates the usage of the ExecCtrl feature
// 
//  Module Parameters:
//    tsp_numEntities - integer
//    tsp_testDuration - float
//    tsp_nrOfLGens - integer
//    tsp_LGname_prefix - charstrin
// 
//  Module depends on:
//    <EPTF_CLL_Base_Functions>
//    <EPTF_CLL_Base_Definitions>
//    <EPTF_CLL_LGenBase_Definitions>
//    <EPTF_CLL_LGenBase_Functions>
//    <EPTF_CLL_LGenBase_ConfigFunctions>
//    <AppLib_A_Definitions>
//    <AppLib_A_Functions>
//    <EPTF_CLL_ExecCtrl_Definitions>
//    <EPTF_CLL_ExecCtrl_Functions>
//    <EPTF_CLL_UIHandler_Definitions>
//    <EPTF_CLL_UIHandler_WidgetFunctions>
//    <EPTF_CLL_UIHandler_XTDPTemplateDefinitions>
//    <XTDP_PDU_Defs language>
//    <EPTF_CLL_UIHandlerClient_Functions>
//    <EPTF_CLL_RBTScheduler_Functions>
//
//  Current Owner:
//    ethzto
// 
//  Last Review Date:
//    2007-12-06
// 
// 
///////////////////////////////////////////////////////////

module ExecCtrl_Demo
{
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_Base_Definitions all;
import from EPTF_CLL_LGenBase_Definitions all;
import from EPTF_CLL_LGenBase_Functions all;
import from EPTF_CLL_LGenBase_ConfigFunctions all;

import from AppLib_A_Definitions all;
import from AppLib_A_Functions all;
//import from AppLib_B_Definitions all;
//import from AppLib_B_Functions all;

import from EPTF_CLL_ExecCtrl_Definitions all;
import from EPTF_CLL_ExecCtrl_Functions all;
import from EPTF_CLL_ExecCtrlClient_Functions all;

import from EPTF_CLL_UIHandler_Definitions all;
import from EPTF_CLL_UIHandler_WidgetFunctions all;
import from EPTF_CLL_UIHandler_XTDPTemplateDefinitions all;
import from EPTF_CLL_UIHandler_XULFunctions all;

import from XTDP_PDU_Defs language "ASN.1:2002" all;
import from EPTF_CLL_UIHandlerClient_Functions all;

import from EPTF_CLL_RBTScheduler_Functions all;

modulepar integer tsp_numEntities := 10;
modulepar float tsp_testDuration := 30.0;
modulepar integer tsp_nrOfLGens := 2;
modulepar charstring tsp_LGname_prefix := "LG_";

type component ExecCtrl_Demo_CT 
extends EPTF_LGenBase_CT, EPTF_ExecCtrlClient_CT, LGen_A_CT //, LGen_B_CT 
{
  var integer v_myBIdx;
}

const charstring c_appl_stepNameInitTc0 := "Initialize behavior contexts for tc0"
const integer c_appl_stepIdxInitTc0 := 0;
function f_step_initTc0(in EPTF_LGenBase_TestStepArgs pl_ptr) 
runs on ExecCtrl_Demo_CT { 
  var integer bCtx;
  bCtx:= f_EPTF_LGenBase_getBehaviorCtxItem(pl_ptr.eIdx,c_A_bIdx,0);
  v_A_contexts[bCtx].fooMessage := "Entity " & f_EPTF_LGenBase_getEntityName(pl_ptr.eIdx) &": "& v_A_contexts[bCtx].fooMessage ;
  v_A_contexts[bCtx].byeMessage := "Entity " & f_EPTF_LGenBase_getEntityName(pl_ptr.eIdx) &": "& v_A_contexts[bCtx].byeMessage ;
  //  bCtx:= v_LGenBase_entities[pl_ptr.eIdx].bCtxList[c_B_bIdx][0]
  //  v_B_contexts[bCtx].firstMessage := "Entity " & v_LGenBase_entities[pl_ptr.eIdx].name
  //  & " sends its first message acting as \"B\" in testcase#0";
  // v_B_contexts[bCtx].secondMessage := "Entity " & v_LGenBase_entities[pl_ptr.eIdx].name
  //  & " sends its second message acting as \"B\" in testcase#0"
  //  f_LGenBase_testStepIsOver(pl_ptr)
}



//init the "application level virtual library"
const charstring c_myVirtualAppLib_behaviorType := "LGen demo application"; // ethzto
function f_init_myVirtualAppLib() runs on ExecCtrl_Demo_CT {
  var integer i;
  
  v_myBIdx:=f_EPTF_LGenBase_declareBehaviorType(c_myVirtualAppLib_behaviorType, 100, null, null, null);
  log(%definitionId,": myBIdx is ", v_myBIdx);
  i:=f_EPTF_LGenBase_declareStep(c_myVirtualAppLib_behaviorType,{c_appl_stepNameInitTc0,refers(f_step_initTc0)});
  //  i:=f_EPTF_LGenBase_declareStep(c_myVirtualAppLib_behaviorType,{c_appl_stepNameInitTc1,refers(f_step_initTc1)});
  
}

// note the applib init function call seq. must be consistent 
// with these c_xxx_bIdx declarations 
const integer c_appl_bIdx := 1;
const integer c_A_bIdx := 2;
const integer c_B_bIdx := 3;

function f_LGen_Demo_init(in charstring pl_selfName, in EPTF_ExecCtrl_CT pl_ExecCtrlRef) runs on ExecCtrl_Demo_CT {
  
  f_EPTF_LGenBase_init(pl_selfName, 0, "DemoEntity#");
  
  //note the applib init function call seq. must be consistent with ...bIdx declarations 
  f_init_myVirtualAppLib() ;      //behavior type index==0 
  f_LGen_A_init(tsp_numEntities); //behavior type index==1
  //  f_LGen_B_init(tsp_numEntities); //behavior type index==2


  var integer vl_eTypeIdx := f_EPTF_LGenBase_declareEntityType("Entity_A", {c_A_behaviorType});
  vl_eTypeIdx := f_EPTF_LGenBase_declareEntityType("Entity_B", {c_myVirtualAppLib_behaviorType});
  vl_eTypeIdx := f_EPTF_LGenBase_declareEntityType("Entity_AB", {c_A_behaviorType, c_myVirtualAppLib_behaviorType});
  
  connect(self:port_A,self:port_A);  
  
  f_EPTF_ExecCtrlClient_init_CT(pl_selfName, pl_ExecCtrlRef);   // Only after library init(s)
  f_EPTF_LGenBase_log();

}

function f_LGen_Demo_behavior(in charstring pl_selfName, in EPTF_ExecCtrl_CT pl_ExecCtrlRef) runs on ExecCtrl_Demo_CT
{
  log(%definitionId,": started...");

  f_LGen_Demo_init(pl_selfName, pl_ExecCtrlRef); 

  timer t;
  t.start(tsp_testDuration);

  log(%definitionId,": entering main EH...")
  alt {
    [] as_LibA() 
    //    []as_LibB() 
    [] t.timeout {}
  }
  setverdict(pass);

//  f_cleanup...
  log(%definitionId,": finished...");
}

function f_ExecCtrl_Demo_initGui() runs on EPTF_UIHandler_CT{

  var XTDP_XML_Tag execCtrlMainWindow := {        
      xtdp_tabpanel := {      
        id := omit,
        maxheight := omit,
        orient := "vertical",
        widgets := {
          {
            hbox := {
              id := omit,
              flex := omit,
              disabled := omit,
              orient := "horizontal",
              widgets := {
                {
                  hbox := {
                    id := omit,
                    flex := omit,
                    disabled := omit,
                    orient := "vertical",
                    widgets := {
                      { 
                        tabbox := {
                          id := omit,
                          flex := omit,
                          disabled := omit,
                          layout := omit,
                          tabs := {
                            {
                              id := "Execution_Control.tab",
                              tablabel := "Execution Control" 
                            }
                          },
                          tabpanels := {
                          }
                        }
                      },
                      {
                        hbox := {
                          id := omit,
                          flex := omit,
                          disabled := omit,
                          orient := "horizontal",
                          widgets := {
                            {
                              hbox := {
                                id := omit,
                                flex := omit,
                                disabled := omit,
                                orient := "vertical",
                                widgets := {
                                  {
                                    textlabel := {
                                      id := "timeelapsed",
                                      flex := omit,
                                      disabled := omit,
                                      style := omit,
                                      textvalue := "Time elapsed since Test was started: 0.0" 
                                    }
                                  },
                                  {
                                    textlabel := {
                                      id := "listeningon",
                                      flex := omit,
                                      disabled := omit,
                                      style := omit,
                                      textvalue := "Listening on ." 
                                    }
                                  }                      
                                }
                              }
                            },
                            {
                              button := {
                                checked := omit,
                                disabled := omit,
                                id := "EPTF_snapshot_button",
                                flex := omit,
                                buttonlabel := "Snapshot",
                                buttontype := omit,
                                imageId := omit 
                              }                          
                            },
                            {
                              spacer := {
                                flex := 0.1,
                                id := omit
                              }
                            },
                            {
                              button := {
                                checked := omit,
                                disabled := omit,
                                id := "EPTF_exit_ttcn_button",
                                flex := omit,
                                buttonlabel := "Exit TTCN",
                                buttontype := omit,
                                imageId := omit 
                              }                          
                            }                        
                          }
                        }
                      }                    
                    }
                  } 
                }              
              }
            }                      
          }
        }      
      }  
    };
      
  var boolean widgetExist := false;
  log("execCtrlMainWindow: ", execCtrlMainWindow);
  if (not f_EPTF_UIHandler_addElementToGui(
    execCtrlMainWindow, 
    "",
    widgetExist)) {
    log(%definitionId,": InitGUI failed. Exiting...");
    f_EPTF_Base_stopAll();
    //stop; // this is not needed
  };
}

// Test config deployment manually
type component myMTC_CT extends EPTF_Base_CT, EPTF_UIHandler_CT {} 

// User functions for LGenPools
function f_EPTF_ExecCtrl_myExecCtrlBehavior(in charstring pl_selfName, in integer pl_nrOfClients)
runs on EPTF_ExecCtrl_CT
{
  var EPTF_ExecCtrl_LGenFunction_Entry_List vl_functions :=
  {
    {
      name := "userCreate",
      fn  := refers(f_EPTF_ExecCtrl_CreateLGen_userCreate)
    }
  }
  
  f_EPTF_ExecCtrl_loadConfig(pl_EPTF_ExecCtrl_LGenFunction_Entry_List := vl_functions);
  f_EPTF_ExecCtrl_behavior(pl_selfName, pl_nrOfClients);
}

function f_EPTF_ExecCtrl_CreateLGen_userCreate
  (
    in charstring pl_hostname,
    in charstring pl_componentName
  
  )
  runs on EPTF_ExecCtrl_CT
  return EPTF_ExecCtrlClient_CT
{
  // Create LGen instance
  var ExecCtrl_Demo_CT vc_client := ExecCtrl_Demo_CT.create(pl_hostname);
  
  // Connect and Start the LGen
  vc_client.start(f_LGen_Demo_behavior(tsp_LGname_prefix & pl_componentName, self));
  
  return vc_client;
}

testcase TC() runs on myMTC_CT
{
  log(%definitionId,": Creating UIHandler...");

  f_EPTF_UIHandler_init_CT("ExecCtrlDemo_UIHandler", true);
  f_EPTF_UIHandler_clearGUI();
  if(not f_EPTF_UIHandler_addWindow()) {
    log(%definitionId,": Cannot add main window. Exiting...");
    f_EPTF_Base_stopAll();
    //stop; this is not necessary
  };

  f_ExecCtrl_Demo_initGui();

  log(%definitionId,": Creating ExecCtrl...");
  f_EPTF_Base_init_CT("ExecCtrl_Demo");

  var EPTF_ExecCtrl_CT ExtCtrl := EPTF_ExecCtrl_CT.create;
  ExtCtrl.start(f_EPTF_ExecCtrl_myExecCtrlBehavior("ExecCtrl", tsp_nrOfLGens));

  log(%definitionId,": Creating LGens (ExecCtrlClients)...")
  var ExecCtrl_Demo_CT LG;
  for (var integer i:=0;i<tsp_nrOfLGens;i:=i+1) {
    LG := ExecCtrl_Demo_CT.create;
    LG.start(f_LGen_Demo_behavior(tsp_LGname_prefix & int2str(i), ExtCtrl));
  }

  timer t;
  t.start(tsp_testDuration);

  log(%definitionId,": myMTC_CT: entering main EH...")
  alt
  {

  [] t.timeout
    {
      log(%definitionId,": myMTC_CT: main EH: timeout...")
    }
  } // alt

  f_EPTF_Base_cleanup_CT();

  log(%definitionId,": finished")
}

control {
  execute(TC());
}

}  // end of module
