blob: 15609855d16c6da1d16f9401f41538ceb9a3dc79 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// //
// 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: EPTF_CLL_ExecCtrlClient_Functions
//
// Purpose:
// This module contains the implementation of EPTF_CLL_ExecCtrlClient functions.
//
// Module depends on:
// <EPTF_CLL_Common_Definitions>
// <EPTF_CLL_Base_Functions>
// <EPTF_CLL_LGenBase_Definitions>
// <EPTF_CLL_LGenBase_ConfigDefinitions>
// <EPTF_CLL_LGenBase_Functions>
// <EPTF_CLL_LGenBase_ConfigFunctions>
// <EPTF_CLL_LGenBase_TrafficFunctions>
// <EPTF_CLL_LGenBase_PhaseDefinitions>
// <EPTF_CLL_LGenBase_PhaseConfigFunctions>
// <EPTF_CLL_LGenBaseStats_Definitions>
// <EPTF_CLL_LGenBaseStats_Functions>
// <EPTF_CLL_LGenBase_EventHandlingFunctions>
// <EPTF_CLL_StatHandlerClient_Functions>
// <EPTF_CLL_StatHandlerClient_Definitions>
// <EPTF_CLL_Variable_Definitions>
// <EPTF_CLL_Variable_Functions>
// <EPTF_CLL_Logging_Definitions>
// <EPTF_CLL_Logging_Functions>
// <EPTF_CLL_ExecCtrl_Definitions>
// <EPTF_CLL_ExecCtrl_PhaseFunctions>
// <EPTF_CLL_ExecCtrl_LoggingFunctions>
// <EPTF_CLL_ExecCtrl_ScenarioDefinitions>
// <EPTF_CLL_ExecCtrlTimeProfile_Definitions>
// <EPTF_CLL_ExecCtrl_PhaseDefinitions>
// <EPTF_CLL_HashMapStr2Int_Functions>
// <EPTF_CLL_HashMap_Functions>
//
// Module Parameters:
// tsp_debug_EPTF_ExecCtrlClient_Functions - boolean
//
// Current Owner:
// Jozsef Gyurusi (ETHJGI)
//
// Last Review Date:
// 2009-02-03
//
// Detailed Comments:
// This module contains the interface functions for the EPTF_CLL_ExecCtrlClient.
//
// Public functions:
// <f_EPTF_ExecCtrlClient_init_CT>
// <f_EPTF_ExecCtrlClient_loadConfig>
// <f_EPTF_ExecCtrlClient_set_scenarioInitialized_fcb>
// <f_EPTF_ExecCtrlClient_registerEndOfConfigCallback>
// <f_EPTF_ExecCtrlClient_registerGuiDoneCallback>
// <f_EPTF_ExecCtrlClient_checkGuiDone>
// <f_EPTF_ExecCtrlClient_checkGuiDoneReported>
// <f_EPTF_ExecCtrlClient_reportGUIDone>
// <f_EPTF_ExecCtrlClient_readyToStart>
// <f_EPTF_ExecCtrlClient_checkEndOfConfig>
// <f_EPTF_ExecCtrlClient_getFirstEntityGlobalOffset>
// <f_EPTF_ExecCtrlClient_getEntityGroupGlobalOffset>
// <f_EPTF_ExecCtrlClient_getFirstEntityOffsetInEGrp>
// <f_EPTF_ExecCtrlClient_getEntityGroupSize>
// <f_EPTF_ExecCtrlClient_registerFinalTestReportGeneratorFn>
// <f_EPTF_ExecCtrlClient_deregisterFinalTestReportGeneratorFn>
//
// All other functions in this module are private!
//
///////////////////////////////////////////////////////////////
module EPTF_CLL_ExecCtrlClient_Functions {
import from EPTF_CLL_ExecCtrl_Definitions all;
import from EPTF_CLL_ExecCtrl_LoggingFunctions all;
import from EPTF_CLL_ExecCtrl_PhaseFunctions all;
import from EPTF_CLL_ExecCtrl_ScenarioDefinitions all;
import from EPTF_CLL_ExecCtrlTimeProfile_Definitions all;
import from EPTF_CLL_ExecCtrl_PhaseDefinitions all;
import from EPTF_CLL_ExecCtrl_ScenarioFunctions all;
import from EPTF_CLL_ExecCtrl_Functions all;
import from EPTF_CLL_LGenBase_Definitions all;
import from EPTF_CLL_LGenBase_Functions all;
import from EPTF_CLL_LGenBase_ConfigDefinitions all;
import from EPTF_CLL_LGenBase_TrafficFunctions all;
import from EPTF_CLL_LGenBase_ConfigFunctions all;
import from EPTF_CLL_LGenBaseStats_Definitions all;
import from EPTF_CLL_LGenBaseStats_Functions all;
import from EPTF_CLL_LGenBase_PhaseDefinitions all;
import from EPTF_CLL_LGenBase_PhaseConfigFunctions all;
import from EPTF_CLL_LGenBase_EventHandlingFunctions all;
import from EPTF_CLL_Variable_Definitions all;
import from EPTF_CLL_Variable_Functions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_Logging_Definitions all;
import from EPTF_CLL_Logging_Functions all;
import from EPTF_CLL_Common_Definitions all;
import from EPTF_CLL_HashMapStr2Int_Functions all;
import from EPTF_CLL_HashMap_Functions all;
modulepar boolean tsp_debug_EPTF_ExecCtrlClient_Functions := false;
modulepar boolean tsp_EPTF_ExecCtrlClient_terminateIfExecCtrlTerminates := true;
friend module EPTF_CLL_ExecCtrlUIHandler_Functions;
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_init_CT
//
// Purpose:
// Init EPTF_ExecCtrlClient feature
//
// Parameters:
// - pl_selfName - *in charstring* - the name of the component
// - pl_execCtrlCompRef - *in* <EPTF_ExecCtrl_CT> - the component reference of EPTF_ExecCtrl component
// - pl_reportReady - *in boolean* - if true: the client automatically sends "I am ready to start" message to the ExecCtrl
// default: true. To send "I am ready to start" manually (false setting), call <f_EPTF_ExecCtrlClient_readyToStart>
// - pl_reportGUIDone - *in boolean* - if true, GUIDone is reported automatically to ExecCtrl when the ExecCtrl client GUI is ready
// To report GUIDone at custom time, set this parameter to false and call <f_EPTF_ExecCtrlClient_reportGUIDone> later
//
// Return Value:
// -
//
// Errors & assertions:
//
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_init_CT(in charstring pl_selfName, in EPTF_ExecCtrl_CT pl_execCtrlCompRef,
in boolean pl_reportReady := true,
in boolean pl_reportGUIDone := true
) runs on EPTF_ExecCtrlClient_CT {
// f_EPTF_ExecCtrlClient_debug(%definitionId&": started...");
if (v_ExecCtrlClient_initialized) {
return;
}
f_EPTF_HashMap_init_CT (pl_selfName);
f_EPTF_Logging_init_CT(pl_selfName);
v_ExecCtrlClient_loggingMaskId := f_EPTF_Logging_registerComponentMasks(
tsp_EPTF_ExecCtrlClient_loggingComponentMask,
c_EPTF_ExecCtrl_loggingEventClasses,
EPTF_Logging_CLL);
if(tsp_debug_EPTF_ExecCtrlClient_Functions) {
f_EPTF_Logging_enableLocalMask(v_ExecCtrlClient_loggingMaskId, c_EPTF_ExecCtrl_loggingClassIdx_Debug);
} else {
f_EPTF_Logging_disableLocalMask(v_ExecCtrlClient_loggingMaskId, c_EPTF_ExecCtrl_loggingClassIdx_Debug);
}
vl_EPTF_ExecCtrlClient_def := activate(as_EPTF_ExecCtrlClient_MgmtIf());
f_EPTF_Base_assert(%definitionId&": LGenBase should be initialized before ExecCtrlClient", f_EPTF_LGenBase_initialized() or not pl_reportReady);
v_ExecCtrl_execCtrlMasterCompRef := pl_execCtrlCompRef;
f_EPTF_LGenBase_init(pl_selfName, 0, "");
f_EPTF_LGenBaseStats_init(pl_selfName,"");
// add listener to detect test finished:
if (-1!=f_EPTF_LGenBase_addGeneralEventListener(
c_EPTF_LGenBase_bIdx,
c_EPTF_LGenBase_inputIdx_testMgmt_testFinished,
refers(f_EPTF_ExecCtrlClient_testFinishedListener), {}
)) {}
f_EPTF_ExecCtrlClient_debug(%definitionId&": fill resource DB...");
// f_EPTF_ExecCtrlClient_fillResourceDB(); obsolated
f_EPTF_ExecCtrlClient_debug(%definitionId&": connecting to ExecCtrl...");
connect(self:ExecCtrlClient_MgmtIf_CP, v_ExecCtrl_execCtrlMasterCompRef:ExecCtrl_MgmtIf_CP);
f_EPTF_ExecCtrlClient_debug(%definitionId&": sending initial resource availability msg to ExecCtrl");
v_ExecCtrlClient_semaphore_DeclareScenario := 0;
v_ExecCtrlClient_semaphore_EndOfConfig := false;
t_EPTF_ExecCtrlClient_semaphoreTimer.start(0.0);
v_EPTF_ExecCtrlClient_guiPresent := false;
v_EPTF_ExecCtrlClient_guiDone := false;
v_EPTF_ExecCtrlClient_autoReportGuiDone := pl_reportGUIDone;
v_EPTF_ExecCtrlClient_guiDoneReported := false;
f_EPTF_ExecCtrlClient_initEGrpDB();
// replace with my groupFinishedFn:
//v_ExecCtrlClient_LGenBase_groupFinishedFn := v_LGenBase_groupFinishedFn;
v_ExecCtrlClient_LGenBase_groupFinishedDetectedFn :=
f_EPTF_LGenBase_setGroupFinishedDetectedFn(refers(f_EPTF_ExecCtrlClient_groupFinishedDetectedFn))
v_ExecCtrlClient_abortNextGroupFinish := true;
v_ExecCtrlClient_pauseDataForTCs := {};
f_EPTF_ExecCtrlClient_registerEndOfConfigCallback(refers(f_EPTF_ExecCtrlClient_registerFSMStats));
f_EPTF_LGenBase_registerTcStateChangedCallback(refers(f_EPTF_ExecCtrlClient_tcStateChanged_handlePaused));
f_EPTF_Base_registerCleanup(refers(f_EPTF_ExecCtrlClient_cleanup_CT));
v_ExecCtrlClient_started := false;
v_ExecCtrlClient_byeAckReceived := false;
v_ExecCtrlClient_byeReceived := false;
v_ExecCtrlClient_initialized := true;
// Client is ready:
if (pl_reportReady) {
f_EPTF_ExecCtrlClient_readyToStart();
}
f_EPTF_ExecCtrlClient_debug(%definitionId&": finished");
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_cleanup_CT
//
// Purpose:
// Cleanup EPTF_ExecCtrlClient feature
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private function f_EPTF_ExecCtrlClient_cleanup_CT() runs on EPTF_ExecCtrlClient_CT {
if (not v_ExecCtrlClient_initialized) {
return;
}
v_ExecCtrlClient_initialized := false;
f_EPTF_ExecCtrlClient_debug(%definitionId&": started");
// send bye only if ExecCtrl did not sent bye to me before
if (not v_ExecCtrlClient_byeReceived) {
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrl_Bye:{});
f_EPTF_ExecCtrlClient_waitForByeAck();
}
disconnect(self:ExecCtrlClient_MgmtIf_CP, v_ExecCtrl_execCtrlMasterCompRef:ExecCtrl_MgmtIf_CP);
v_ExecCtrlClient_started := false;
v_ExecCtrlClient_byeAckReceived := false;
v_ExecCtrlClient_byeReceived := false;
v_ExecCtrlClient_semaphore_DeclareScenario := 0;
v_ExecCtrlClient_semaphore_EndOfConfig := false;
v_EPTF_ExecCtrlClient_guiDone := false;
v_EPTF_ExecCtrlClient_autoReportGuiDone := true;
v_EPTF_ExecCtrlClient_guiDoneReported := false;
f_EPTF_ExecCtrlClient_cleanupEGrpDB();
v_ExecCtrlClient_EndOfConfigCallbackFns := {};
v_ExecCtrlClient_GuiDoneCallbackFns := {};
v_EPTF_ExecCtrlClient_GuiDoneCallbackFn := null;
v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns := {};
deactivate(vl_EPTF_ExecCtrlClient_def)
f_EPTF_ExecCtrlClient_debug(%definitionId&": finished");
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_loadConfig
//
// Purpose:
// Loads additional config data and appends them to existing data
//
// Parameters:
// pl_EPTF_LGenBase_TcMgmt_EntityGrpDeclaratorList - *in* <EPTF_LGenBase_TcMgmt_EntityGrpDeclaratorList>
// pl_EPTF_LGenBase_TcMgmt_Scenarios2GrpList - *in* <EPTF_LGenBase_TcMgmt_Scenarios2GrpList>
//
// pl_EPTF_LGenBase_ScenarioDeclaratorList - *in* <EPTF_LGenBase_ScenarioDeclaratorList>
// pl_EPTF_LGenBase_tcTypeDeclaratorList - *in* <EPTF_LGenBase_tcTypeDeclaratorList>
//
// pl_EPTF_LGenBase_TcMgmt_tcTypeDeclaratorList - *in* <EPTF_LGenBase_TcMgmt_tcTypeDeclaratorList>
// pl_EPTF_LGenBase_TcMgmt_ScenarioDeclaratorList - *in* <EPTF_LGenBase_TcMgmt_ScenarioDeclaratorList>
//
// pl_EPTF_LGenBase_TcMgmt_WeightedScenarioDeclaratorList - *in* <EPTF_LGenBase_TcMgmt_WeightedScenarioDeclaratorList>
//
// pl_EPTF_ExecCtrl_TimeProfileDescrList - *in* <EPTF_ExecCtrl_TimeProfileDescrList>
// pl_EPTF_ExecCtrl_TimeProfileList - *in* <EPTF_ExecCtrl_TimeProfileList>
// pl_EPTF_ExecCtrl_TimeProfile2TcList - *in* <EPTF_ExecCtrl_TimeProfile2TcList>
//
// pl_EPTF_LGenBase_ScenarioTypeDeclaratorList - *in* <EPTF_LGenBase_ScenarioTypeDeclaratorList> *optional* - Scenario Declator appeared in R3
// pl_EPTF_ExecCtrl_ScenarioInstanceTypeList - *in* <EPTF_ExecCtrl_ScenarioInstanceTypeList> - scenario instance decl
//
// pl_EPTF_ExecCtrl_LGenPool_Declarators - *in* <EPTF_ExecCtrl_LGenPool_Declarators> - LGen Pool declarators
// pl_EPTF_ExecCtrl_EntityGroup2LGenPool_List - *in* <EPTF_ExecCtrl_EntityGroup2LGenPool_List> - Entity group to LGen Pool declarators
//
// pl_EPTF_ExecCtrl_LGenFunction_Entry_List - *in* <EPTF_ExecCtrl_LGenFunction_Entry_List> - the LGen creator functions to register
//
// pl_EPTF_ExecCtrl_PhaseList_Declarators - *in* <EPTF_LGenBase_PhaseList_Declarators> - list of phaseLists
// pl_EPTF_ExecCtrl_ScenarioGroup_Declarators - *in* <EPTF_ExecCtrl_ScenarioGroup_Declarators> - list of scenario groups
//
// pl_EPTF_ExecCtrl_RegulatorNames - *in* <EPTF_ExecCtrl_RegulatorNames> - list of regulator names
// pl_EPTF_ExecCtrl_RegulatedItems - *in* <EPTF_ExecCtrl_RegulatedItems> - list of regulated items
//
// pl_EPTF_ExecCtrl_EntityGroupDistributionTypeList - *in* <EPTF_ExecCtrl_EntityGroupDistributionTypeList> - list of entity group distributions
//
// Return Value:
// -
//
// Errors & assertions:
//
// Detailed Comments:
// This function forwards the specified configuration data to ExecCtrl and calls the <f_EPTF_ExecCtrl_loadConfig> function with them.
// All parameters are optional. If specified, the value of that parameter is appended to the corresponding data already loaded.
// This function can be called more than once with different arguments.
// If you have your own tsp-s, this function can be used to load them into the ExecCtrl database from the LGen. The ExecCtr
// should know about all declarators in the system before it is started.
// The configuration can be loaded on an LGen if the LGen is not in an LGen-pool, because LGens in LGen pool are
// created after configuration data is loaded and ExecCtrl was started. Only from LGens created 'manually' is possible
// to load configuration data to ExecCtrl.
// This function should be called before the <f_EPTF_ExecCtrl_start> function is called (after which the configuration data is
// processed) on the ExecCtrl component and before the <f_EPTF_ExecCtrlClient_readyToStart> function is called.
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_loadConfig(
in EPTF_LGenBase_TcMgmt_EntityGrpDeclaratorList pl_EPTF_LGenBase_TcMgmt_EntityGrpDeclaratorList :={},
in EPTF_LGenBase_TcMgmt_Scenarios2GrpList pl_EPTF_LGenBase_TcMgmt_Scenarios2GrpList :={},
in EPTF_LGenBase_ScenarioDeclaratorList pl_EPTF_LGenBase_ScenarioDeclaratorList :={},
in EPTF_LGenBase_tcTypeDeclaratorList pl_EPTF_LGenBase_tcTypeDeclaratorList :={},
in EPTF_LGenBase_TcMgmt_tcTypeDeclaratorList pl_EPTF_LGenBase_TcMgmt_tcTypeDeclaratorList :={},
in EPTF_LGenBase_TcMgmt_ScenarioDeclaratorList pl_EPTF_LGenBase_TcMgmt_ScenarioDeclaratorList :={},
in EPTF_LGenBase_TcMgmt_WeightedScenarioDeclaratorList pl_EPTF_LGenBase_TcMgmt_WeightedScenarioDeclaratorList :={},
in EPTF_ExecCtrl_TimeProfileDescrList pl_EPTF_ExecCtrl_TimeProfileDescrList := {},
in EPTF_ExecCtrl_TimeProfileList pl_EPTF_ExecCtrl_TimeProfileList := {},
in EPTF_ExecCtrl_TimeProfile2TcList pl_EPTF_ExecCtrl_TimeProfile2TcList := {},
in EPTF_LGenBase_ScenarioTypeDeclaratorList pl_EPTF_LGenBase_ScenarioTypeDeclaratorList := {},
in EPTF_ExecCtrl_ScenarioInstanceTypeList pl_EPTF_ExecCtrl_ScenarioInstanceTypeList := {},
in EPTF_ExecCtrl_LGenPool_Declarators pl_EPTF_ExecCtrl_LGenPool_Declarators := {},
in EPTF_ExecCtrl_EntityGroup2LGenPool_List pl_EPTF_ExecCtrl_EntityGroup2LGenPool_List := {},
//in EPTF_ExecCtrl_LGenFunction_Entry_List pl_EPTF_ExecCtrl_LGenFunction_Entry_List := {},
in EPTF_LGenBase_PhaseList_Declarators pl_EPTF_ExecCtrl_PhaseList_Declarators := {},
in EPTF_ExecCtrl_ScenarioGroup_Declarators pl_EPTF_ExecCtrl_ScenarioGroup_Declarators := {},
in EPTF_ExecCtrl_RegulatorNames pl_EPTF_ExecCtrl_RegulatorNames := {},
in EPTF_ExecCtrl_RegulatedItems pl_EPTF_ExecCtrl_RegulatedItems := {},
in EPTF_ExecCtrl_EntityGroupDistributionTypeList pl_EPTF_ExecCtrl_EntityGroupDistributionTypeList := {}
) runs on EPTF_ExecCtrlClient_CT {
f_EPTF_ExecCtrlClient_debug(%definitionId&": started...");
if (v_ExecCtrlClient_byeReceived) {
f_EPTF_ExecCtrlClient_debug(log2str(%definitionId&": Config not loaded: ExecCtrl terminated."));
return;
}
if (v_ExecCtrlClient_started) {
f_EPTF_ExecCtrlClient_warning(log2str(%definitionId&": Config not loaded: ExecCtrlClient was already started"));
return;
}
var EPTF_ExecCtrlClient_LoadConfig vl_EPTF_ExecCtrlClient_LoadConfig := c_EPTF_ExecCtrlClient_LoadConfig_default;
vl_EPTF_ExecCtrlClient_LoadConfig := {
pl_EPTF_LGenBase_TcMgmt_EntityGrpDeclaratorList,
pl_EPTF_LGenBase_TcMgmt_Scenarios2GrpList,
pl_EPTF_LGenBase_ScenarioDeclaratorList,
pl_EPTF_LGenBase_tcTypeDeclaratorList,
pl_EPTF_LGenBase_TcMgmt_tcTypeDeclaratorList,
pl_EPTF_LGenBase_TcMgmt_ScenarioDeclaratorList,
pl_EPTF_LGenBase_TcMgmt_WeightedScenarioDeclaratorList,
pl_EPTF_ExecCtrl_TimeProfileDescrList,
pl_EPTF_ExecCtrl_TimeProfileList,
pl_EPTF_ExecCtrl_TimeProfile2TcList,
pl_EPTF_LGenBase_ScenarioTypeDeclaratorList,
pl_EPTF_ExecCtrl_ScenarioInstanceTypeList,
pl_EPTF_ExecCtrl_LGenPool_Declarators,
pl_EPTF_ExecCtrl_EntityGroup2LGenPool_List,
//pl_EPTF_ExecCtrl_LGenFunction_Entry_List,
pl_EPTF_ExecCtrl_PhaseList_Declarators,
pl_EPTF_ExecCtrl_ScenarioGroup_Declarators,
pl_EPTF_ExecCtrl_RegulatorNames,
pl_EPTF_ExecCtrl_RegulatedItems,
pl_EPTF_ExecCtrl_EntityGroupDistributionTypeList
}
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrlClient_LoadConfig:vl_EPTF_ExecCtrlClient_LoadConfig);
f_EPTF_ExecCtrlClient_debug(%definitionId&": finished...");
}
friend function f_EPTF_ExecCtrlClient_execCtrlMasterCompRef() runs on EPTF_ExecCtrlClient_CT return EPTF_ExecCtrl_CT {
return v_ExecCtrl_execCtrlMasterCompRef;
}
// declares and registers FSM Stats into the StatHandler in ExecCtrl
private function f_EPTF_ExecCtrlClient_registerFSMStats() runs on EPTF_ExecCtrlClient_CT {
// get statList
var EPTF_LGenBase_StatisticListOfTCList vl_statList;
f_EPTF_LGenBase_getStatisticsOfTcs(vl_statList);
f_EPTF_ExecCtrlClient_debug(log2str(%definitionId&": vl_statList: ", vl_statList));
// notify ExecCtrl about the new stats
f_EPTF_ExecCtrlClient_createFSMStats(vl_statList);
}
// notifies ExecCtrl about the FSM stats in LGen
private function f_EPTF_ExecCtrlClient_createFSMStats(in EPTF_ExecCtrl_CreateFSMStats pl_createFSMStats) runs on EPTF_ExecCtrlClient_CT {
if (v_ExecCtrlClient_byeReceived) {
f_EPTF_ExecCtrlClient_debug(log2str("CreateFSMStats is not sent: ExecCtrl terminated."));
return;
}
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrl_CreateFSMStats:pl_createFSMStats);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_set_scenarioInitialized_fcb
//
// Purpose:
// Function to set scenarioInitialized callback function
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_set_scenarioInitialized_fcb(in f_EPTF_ExecCtrlClient_scenarioInitialized_fcb_FT pl_scenarioInitialized_fcb) runs on EPTF_ExecCtrlClient_CT {
v_ExecCtrlClient_scenarioInitialized_fcb := pl_scenarioInitialized_fcb;
}
//====================================================
// f_EPTF_ExecCtrlClient_groupFinishedDetectedFn
// send groupFinish event to ExecCtrl:
//====================================================
private function f_EPTF_ExecCtrlClient_groupFinishedDetectedFn(
in integer pl_tcIdx,
in EPTF_LGenBase_ConditionTrue pl_condition,
out boolean pl_abortGroupFinished
) runs on EPTF_ExecCtrlClient_CT {
if (v_ExecCtrlClient_byeReceived) {
f_EPTF_ExecCtrlClient_debug(log2str("GroupFinished not sent: ExecCtrl terminated."));
pl_abortGroupFinished := true;
return;
}
pl_abortGroupFinished := v_ExecCtrlClient_abortNextGroupFinish;//(f_EPTF_LGenBase_getTrafficStartFinishConditionCounter(pl_tcIdx,nrOfExecStart) < 100);
if (v_ExecCtrlClient_abortNextGroupFinish) {
var charstring vl_eGrpName;
var charstring vl_scName;
var charstring vl_tcName;
f_EPTF_LGenBase_trafficCaseIdNames(pl_tcIdx,vl_eGrpName,vl_scName,vl_tcName);
var EPTF_ExecCtrl_GrpFinishConditionTypes vl_grpFinishConditionTypes := f_EPTF_ExecCtrl_condition2GrpFinishConditionType(pl_condition);
var EPTF_IntegerList vl_counters := {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
for(var integer i:=0; i<sizeof(vl_grpFinishConditionTypes); i:=i+1) {
vl_counters[vl_grpFinishConditionTypes[i]] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,vl_grpFinishConditionTypes[i]);
}
f_EPTF_ExecCtrl_accumulateConditions(pl_condition,v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].groupFinishedDetected);
// always fill the counters:
vl_counters[c_EPTF_ExecCtrl_groupFinishNofExecStartIdx] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinishNofExecStartIdx);
vl_counters[c_EPTF_ExecCtrl_groupFinishNofSuccessIdx] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinishNofSuccessIdx);
vl_counters[c_EPTF_ExecCtrl_groupFinishNofFailIdx] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinishNofFailIdx);
vl_counters[c_EPTF_ExecCtrl_groupFinishNofTimeoutIdx] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinishNofTimeoutIdx);
vl_counters[c_EPTF_ExecCtrl_groupFinishNofErrorIdx] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinishNofErrorIdx);
vl_counters[c_EPTF_ExecCtrl_groupFinish_RangeLoops] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinish_RangeLoops);
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrlClient_GroupFinished:{tcId := {vl_eGrpName,vl_scName,vl_tcName}, condition := pl_condition, thresholds := vl_counters});
if (f_EPTF_LGenBase_getTcState(pl_tcIdx) == c_EPTF_LGenBase_tcStateRunning) {
f_EPTF_LGenBase_pauseTrafficCaseByIdx(pl_tcIdx);
}
} else {
v_ExecCtrlClient_abortNextGroupFinish := true; // next group finish will be aborted by default
}
}
//====================================================
// f_EPTF_ExecCtrlClient_processGroupFinished
// TR HL56376: fixed by ETHBAAT
//====================================================
private function f_EPTF_ExecCtrlClient_processGroupFinished(
in integer pl_tcIdx,
in EPTF_LGenBase_ConditionTrue pl_condition,
in EPTF_IntegerList pl_newConditionCounters
) runs on EPTF_ExecCtrlClient_CT {
if (not pl_condition.anythingFinished) {
//increase condition change condition:
f_EPTF_ExecCtrlClient_setNewConditionCounters(pl_tcIdx, pl_condition,pl_newConditionCounters);
f_EPTF_ExecCtrl_clearGroupFinishConditionFired(pl_condition,v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].groupFinishedDetected);
if (not f_EPTF_ExecCtrl_checkGroupFinishConditionFired(v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].groupFinishedDetected)) {
// all conditions are updated
// reset my flags:
v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].groupFinishedDetected := c_EPTF_LGenBase_emptyConditionTrue;
// reset LGenBase groupFinishedCondition flags so that it could detect them again
f_EPTF_LGenBase_resetTcGroupFinishConditionDetected(pl_tcIdx);
// only start if all conditions that had been fullfilled were updated:
// resume the traffic case:
f_EPTF_LGenBase_resumeTrafficCaseByIdx(pl_tcIdx);
}
} else {
f_EPTF_ExecCtrlClient_setNewConditionCounters(pl_tcIdx, pl_condition,pl_newConditionCounters); // set counters to final values
v_ExecCtrlClient_abortNextGroupFinish := false; // allow LGenBase to detect group finish:
f_EPTF_LGenBase_groupFinishedDetected(pl_tcIdx,pl_condition);
}
}//f_
private function f_EPTF_ExecCtrlClient_setNewConditionCounters(
in integer pl_tcIdx,
in EPTF_LGenBase_ConditionTrue pl_condition,
in EPTF_IntegerList pl_newConditionCounters
) runs on EPTF_ExecCtrlClient_CT {
if(pl_condition.nrOfExecStart
and isbound(pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofExecStartIdx])
and pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofExecStartIdx]>=0) {
f_EPTF_LGenBase_setTrafficStartFinishConditionCounter(pl_tcIdx,nrOfExecStart,pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofExecStartIdx]);
}
if(pl_condition.nrOfSuccesses
and isbound(pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofSuccessIdx])
and pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofSuccessIdx]>=0) {
f_EPTF_LGenBase_setTrafficStartFinishConditionCounter(pl_tcIdx,nrOfSuccesses,pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofSuccessIdx]);
}
if(pl_condition.nrOfFails
and isbound(pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofFailIdx])
and pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofFailIdx]>=0) {
f_EPTF_LGenBase_setTrafficStartFinishConditionCounter(pl_tcIdx,nrOfFails,pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofFailIdx]);
}
if(pl_condition.nrOfErrors
and isbound(pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofErrorIdx])
and pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofErrorIdx]>=0) {
f_EPTF_LGenBase_setTrafficStartFinishConditionCounter(pl_tcIdx,nrOfErrors,pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofErrorIdx]);
}
if(pl_condition.nrOfTimeouts
and isbound(pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofTimeoutIdx])
and pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofTimeoutIdx]>=0) {
f_EPTF_LGenBase_setTrafficStartFinishConditionCounter(pl_tcIdx,nrOfTimeouts,pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinishNofTimeoutIdx]);
}
if(pl_condition.nrOfRangeLoop
and isbound(pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinish_RangeLoops])
and pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinish_RangeLoops]>=0) {
f_EPTF_LGenBase_setTrafficStartFinishConditionCounter(pl_tcIdx,nrOfRangeLoop,pl_newConditionCounters[c_EPTF_ExecCtrl_groupFinish_RangeLoops]);
}
}
// receive groupFinished from ExecCtrl:
private altstep as_EPTF_ExecCtrlClient_MgmtIf_groupFinished() runs on EPTF_ExecCtrlClient_CT {
var EPTF_ExecCtrlClient_GroupFinished vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrlClient_GroupFinished:?) -> value vl_msg {
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrlClient_GroupFinished received...");
// calling original groupFinish handler:
var integer vl_tcIdx := f_EPTF_LGenBase_trafficCaseId(vl_msg.tcId.eGrpName,vl_msg.tcId.scName,vl_msg.tcId.tcName);
f_EPTF_ExecCtrlClient_processGroupFinished(vl_tcIdx,vl_msg.condition,vl_msg.thresholds);
repeat;
}
}
//====================================================
// f_EPTF_ExecCtrl_processPauseTC
//====================================================
private function f_EPTF_ExecCtrl_processPauseTC(
in integer pl_tcIdx,
in EPTF_ExecCtrl_GrpFinishConditionType pl_groupFinishConditionType
) runs on EPTF_ExecCtrlClient_CT {
v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].pausing := true;
v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].groupFinishConditionType := pl_groupFinishConditionType;
var EPTF_LGenBase_ConditionTrue vl_cause := f_EPTF_ExecCtrl_grpFinishConditionType2Condition(pl_groupFinishConditionType);
f_EPTF_ExecCtrl_accumulateConditions(vl_cause,v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].groupFinishedDetected);
if (f_EPTF_LGenBase_getTcState(pl_tcIdx)==c_EPTF_LGenBase_tcStatePaused) {
// call handler here:
f_EPTF_ExecCtrlClient_tcStateChanged_handlePaused(pl_tcIdx);
} else {
// pause the given traffic case:
f_EPTF_LGenBase_pauseTrafficCaseByIdx(pl_tcIdx);
//the registered handler <f_EPTF_ExecCtrlClient_tcStateChanged_handlePaused> will send pausedTC to ExecCtrl with the given counter when TC is paused
}
}//f_
// receive pauseTC from ExecCtrl:
private altstep as_EPTF_ExecCtrlClient_MgmtIf_pauseTC() runs on EPTF_ExecCtrlClient_CT {
var EPTF_ExecCtrlClient_PauseTC vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrlClient_PauseTC:?) -> value vl_msg {
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrlClient_PauseTC received...");
// calling original groupFinish handler:
var integer vl_tcIdx := f_EPTF_LGenBase_trafficCaseId(vl_msg.tcId.eGrpName,vl_msg.tcId.scName,vl_msg.tcId.tcName);
f_EPTF_ExecCtrl_processPauseTC(vl_tcIdx,vl_msg.conditionType);
repeat;
}
}
function f_EPTF_ExecCtrlClient_tcStateChanged_handlePaused(in integer pl_tcIdx) runs on EPTF_ExecCtrlClient_CT {
// if tc gets paused
if (f_EPTF_LGenBase_getTcState(pl_tcIdx)==c_EPTF_LGenBase_tcStatePaused) {
// if pause was requested by ExecCtrl:
if (isbound(v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].pausing) and v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].pausing == true) {
// send paused to ExecCtrl
v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].pausing := false;
// get counter value for v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].onGroupFinishCounterId
var charstring vl_eGrpName;
var charstring vl_scName;
var charstring vl_tcName;
f_EPTF_LGenBase_trafficCaseIdNames(pl_tcIdx,vl_eGrpName,vl_scName,vl_tcName);
var EPTF_IntegerList vl_counters := {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
var integer vl_counter := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].groupFinishConditionType);
vl_counters[v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].groupFinishConditionType] := vl_counter;
// always fill the counters:
vl_counters[c_EPTF_ExecCtrl_groupFinishNofExecStartIdx] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinishNofExecStartIdx);
vl_counters[c_EPTF_ExecCtrl_groupFinishNofSuccessIdx] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinishNofSuccessIdx);
vl_counters[c_EPTF_ExecCtrl_groupFinishNofFailIdx] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinishNofFailIdx);
vl_counters[c_EPTF_ExecCtrl_groupFinishNofTimeoutIdx] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinishNofTimeoutIdx);
vl_counters[c_EPTF_ExecCtrl_groupFinishNofErrorIdx] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinishNofErrorIdx);
vl_counters[c_EPTF_ExecCtrl_groupFinish_RangeLoops] := f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(pl_tcIdx,c_EPTF_ExecCtrl_groupFinish_RangeLoops);
// send current values for all conditions
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrlClient_PauseTC:{
tcId := {
eGrpName := vl_eGrpName,
scName := vl_scName,
tcName := vl_tcName
},
conditionType := v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx].groupFinishConditionType,
counters := vl_counters
});
}
}
}
private function f_EPTF_ExecCtrlClient_getCounterForGroupFinishConditionType(
in integer pl_tcIdx,
in EPTF_ExecCtrl_GrpFinishConditionType pl_groupFinishConditionType
) runs on EPTF_ExecCtrlClient_CT return integer {
var integer vl_counter;
if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinishNofExecStartIdx) {
vl_counter := f_EPTF_LGenBase_getTcStarts(pl_tcIdx);
} else if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinishNofSuccessIdx) {
vl_counter := f_EPTF_LGenBase_getTcSuccesses(pl_tcIdx);
} else if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinishNofFailIdx) {
vl_counter := f_EPTF_LGenBase_getTcFails(pl_tcIdx);
} else if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinishNofErrorIdx) {
vl_counter := f_EPTF_LGenBase_getTcErrors(pl_tcIdx);
} else if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinishNofTimeoutIdx) {
vl_counter := f_EPTF_LGenBase_getTcTimeouts(pl_tcIdx);
} else if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinish_RangeLoops) {
var charstring vl_eGrpName;
var charstring vl_scName;
var charstring vl_tcName;
f_EPTF_LGenBase_trafficCaseIdNames(pl_tcIdx,vl_eGrpName,vl_scName,vl_tcName);
var charstring vl_varNameBase := f_EPTF_LGenBase_getNamePrefix(vl_eGrpName,vl_scName,vl_tcName);
vl_counter := f_EPTF_Var_getIntValue(f_EPTF_Var_getId(vl_varNameBase&c_EPTF_LGenBaseStats_nameOfTcRangeLoops));
} else if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinish_ExecTime) {
vl_counter := 1;
} else if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinish_EntitiesFinished) {
vl_counter := 1;//f_EPTF_LGenBase_getTcAllEntities(pl_tcIdx) - f_EPTF_LGenBase_getTcNotFinishedEntities(pl_tcIdx);
} else if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinish_AvailableEntitiesFinished) {
vl_counter := 1;//f_EPTF_LGenBase_getTcAvailable(pl_tcIdx);
} else if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinish_Custom) {
vl_counter := 1;
} else if(pl_groupFinishConditionType==c_EPTF_ExecCtrl_groupFinishConditionUnknown) {
vl_counter := -1;
} else {
vl_counter := -1;
}
return vl_counter;
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_UpdateActiveEntities
//
// Purpose:
// Handles EPTF_ExecCtrl_UpdateCps messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_UpdateActiveEntities() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_UpdateActiveEntities vl_updateActiveEntities_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_UpdateActiveEntities:?) -> value vl_updateActiveEntities_msg
{
//Note: Don't change the log string! There is a regression test based on it!
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_UpdateActiveEntities received...");
var integer vl_eGrpIdx := f_EPTF_LGenBase_entityGrpNameIndex(vl_updateActiveEntities_msg.eGrpName);
var integer vl_activeEntities := vl_updateActiveEntities_msg.activeEntities;
f_EPTF_LGenBase_limitExecution(vl_eGrpIdx,vl_activeEntities);
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_UpdateCps
//
// Purpose:
// Handles EPTF_ExecCtrl_UpdateCps messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_UpdateCps() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_UpdateCps vl_updateCps_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_UpdateCps:?) -> value vl_updateCps_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_UpdateCps received...");
/* f_EPTF_LGenBase_setCpsOrWeightOfTcByNames(
vl_updateCps_msg.eGrpName,
vl_updateCps_msg.scenName,
vl_updateCps_msg.cpsList[tcidx].tcName,
vl_updateCps_msg.cpsList[tcidx].cpsToReach);*/
// new code performs the update via the variable feature, resulting in proper GUI refresh:
// // this code does not update the GUI:
// f_EPTF_LGenBase_setCPSByNames(
// vl_updateCps_msg.eGrpName,
// vl_updateCps_msg.scenName,
// vl_updateCps_msg.tcName,
// vl_updateCps_msg.cps
// );
var integer vl_eGrpIdx := f_EPTF_LGenBase_entityGrpNameIndex(vl_updateCps_msg.eGrpName);
var integer vl_scInGrpIdx := f_EPTF_LGenBase_scNameIndexInEG(vl_eGrpIdx, vl_updateCps_msg.scenName);
var integer vl_varIdx := -1;
var charstring vl_varNameBase := f_EPTF_LGenBaseStats_getNamePrefix(
vl_updateCps_msg.eGrpName,
vl_updateCps_msg.scenName,
vl_updateCps_msg.tcName
);
if (f_EPTF_LGenBase_isWeightedScenario(vl_eGrpIdx,vl_scInGrpIdx)) {
// update traffic weight:
vl_varIdx := f_EPTF_Var_getId(vl_varNameBase&c_EPTF_LGenBaseStats_nameOfTcWeight);
} else {
// update cpsToReach
vl_varIdx := f_EPTF_Var_getId(vl_varNameBase&c_EPTF_LGenBaseStats_nameOfTcCpsToReach);
}
if(vl_varIdx >= 0) {
f_EPTF_Var_adjustContent(vl_varIdx, {floatVal := vl_updateCps_msg.cps});
}
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_UpdateStartDelay
//
// Purpose:
// Handles EPTF_ExecCtrl_UpdateStartDelay messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_UpdateStartDelay() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_UpdateStartDelay vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_UpdateStartDelay:?) -> value vl_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_UpdateStartDelay received...");
f_EPTF_LGenBase_setTCStartDelay(f_EPTF_LGenBase_trafficCaseId(vl_msg.eGrpName, vl_msg.scenName, vl_msg.tcName),vl_msg.startDelay);
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_UpdateScenarioCps
//
// Purpose:
// Handles EPTF_ExecCtrl_UpdateScenarioCps messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_UpdateScenarioCps() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_UpdateScenarioCps vl_updateCps_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_UpdateScenarioCps:?) -> value vl_updateCps_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_UpdateScenarioCps received...");
var integer vl_eGrpIdx := f_EPTF_LGenBase_entityGrpNameIndex(vl_updateCps_msg.eGrpName);
var integer vl_scInGrpIdx := f_EPTF_LGenBase_scNameIndexInEG(vl_eGrpIdx, vl_updateCps_msg.scenName);
f_EPTF_LGenBase_setScenarioCPSByIdx(
vl_eGrpIdx,
vl_scInGrpIdx,
vl_updateCps_msg.cps);
var integer vl_varIdx := -1;
var charstring vl_varNameBase;
if (f_EPTF_LGenBase_isWeightedScenario(vl_eGrpIdx,vl_scInGrpIdx)) {
vl_varNameBase := f_EPTF_LGenBaseStats_getScNamePrefix(vl_updateCps_msg.eGrpName,vl_updateCps_msg.scenName);
} else {
f_EPTF_Base_assert(log2str("Cannot set CPS of the scenario ",vl_updateCps_msg.scenName,
": The scenario is not weighted! EGrpName:",vl_updateCps_msg.eGrpName," scenName: ",vl_updateCps_msg.scenName),
false);
}
vl_varIdx := f_EPTF_Var_getId(vl_varNameBase&c_EPTF_LGenBaseStats_nameOfTcCpsToReach);
if(vl_varIdx >= 0) {
f_EPTF_Var_refreshContent(vl_varIdx);
}
repeat;
}
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_registerEndOfConfigCallback
//
// Purpose:
// Register an EndOfConfig callback function, that is called when all of the scenarios in the current LGEn are created
// and the configuration of the client is finished
//
// Parameters:
// - pl_EndOfConfigCallback - *in* <EPTF_ExecCtrlClient_EndOfConfigCallbackFn> - reference to the callback function
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_registerEndOfConfigCallback(in EPTF_ExecCtrlClient_EndOfConfigCallbackFn pl_EndOfConfigCallback) runs on EPTF_ExecCtrlClient_CT {
v_ExecCtrlClient_EndOfConfigCallbackFns[sizeof(v_ExecCtrlClient_EndOfConfigCallbackFns)] := pl_EndOfConfigCallback;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_callEndOfConfigCallbacks
//
// Purpose:
// Calls all EndOfConfig callback functions
//
// Parameters:
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private function f_EPTF_ExecCtrlClient_callEndOfConfigCallbacks() runs on EPTF_ExecCtrlClient_CT {
for(var integer i:=0; i<sizeof(v_ExecCtrlClient_EndOfConfigCallbackFns);i:=i+1) {
f_EPTF_ExecCtrlClient_debug(log2str("ExeCtrlClient: EndOfConfigCallback: ", v_ExecCtrlClient_EndOfConfigCallbackFns[i], " called"));
if (v_ExecCtrlClient_EndOfConfigCallbackFns[i]!=null) {
v_ExecCtrlClient_EndOfConfigCallbackFns[i].apply();
}
f_EPTF_ExecCtrlClient_debug(log2str("ExeCtrlClient: EndOfConfigCallback: ", v_ExecCtrlClient_EndOfConfigCallbackFns[i], " done"));
}
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_registerGuiDoneCallback
//
// Purpose:
// Register a GuiDone callback function, that is called when the ExecCtrl gui is ready
//
// Parameters:
// - pl_guiDoneCallback - *in* <EPTF_ExecCtrlClient_GuiDoneCallbackFn> - reference to the callback function
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_registerGuiDoneCallback(in EPTF_ExecCtrlClient_GuiDoneCallbackFn pl_guiDoneCallback) runs on EPTF_ExecCtrlClient_CT {
v_ExecCtrlClient_GuiDoneCallbackFns[sizeof(v_ExecCtrlClient_GuiDoneCallbackFns)] := pl_guiDoneCallback;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_callGuiDoneCallbacks
//
// Purpose:
// Calls all GuiDone callback functions
//
// Parameters:
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private function f_EPTF_ExecCtrlClient_callGuiDoneCallbacks() runs on EPTF_ExecCtrlClient_CT {
for(var integer i:=0; i<sizeof(v_ExecCtrlClient_GuiDoneCallbackFns);i:=i+1) {
f_EPTF_ExecCtrlClient_debug(log2str("ExeCtrlClient: GuiDoneCallback: ", v_ExecCtrlClient_GuiDoneCallbackFns[i], " called"));
if (v_ExecCtrlClient_GuiDoneCallbackFns[i]!=null) {
v_ExecCtrlClient_GuiDoneCallbackFns[i].apply();
}
f_EPTF_ExecCtrlClient_debug(log2str("ExeCtrlClient: GuiDoneCallback: ", v_ExecCtrlClient_GuiDoneCallbackFns[i], " done"));
}
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_registerGuiDoneCallbackForFSMStats
//
// Purpose:
// used by ExecCtrlClient_UIHandler to register the f_ExecCtrlClient_UIHandler_bindFSMStatsToWidget callback function, that is called when the ExecCtrl gui is ready
//
// Parameters:
// - pl_guiDoneCallback - *in* <EPTF_ExecCtrlClient_GuiDoneCallbackFn> - reference to the callback function
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
friend function f_EPTF_ExecCtrlClient_registerGuiDoneCallbackForFSMStats(in EPTF_ExecCtrlClient_GuiDoneCallbackFn pl_guiDoneCallback) runs on EPTF_ExecCtrlClient_CT {
v_EPTF_ExecCtrlClient_GuiDoneCallbackFn := pl_guiDoneCallback;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_callGuiDoneCallbackForFSMStats
//
// Purpose:
// Calls all GuiDone callback function for FSMStats
//
// Parameters:
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private function f_EPTF_ExecCtrlClient_callGuiDoneCallbackForFSMStats() runs on EPTF_ExecCtrlClient_CT {
f_EPTF_ExecCtrlClient_debug(log2str("ExeCtrlClient: GuiDoneCallbackForFSMStats: ", v_EPTF_ExecCtrlClient_GuiDoneCallbackFn, " called"));
if (v_EPTF_ExecCtrlClient_GuiDoneCallbackFn!=null) {
v_EPTF_ExecCtrlClient_GuiDoneCallbackFn.apply();
}
f_EPTF_ExecCtrlClient_debug(log2str("ExeCtrlClient: GuiDoneCallbackForFSMStats: ", v_EPTF_ExecCtrlClient_GuiDoneCallbackFn, " done"));
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_scenarioStateCalcFn
//
// Purpose:
// CalcFn function to copy the scenario state from LGBaseStats to this variable
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// pl_argList[0] : vl_lgenBaseVarIdx to copy the state from
//
///////////////////////////////////////////////////////////
private function f_EPTF_ExecCtrlClient_scenarioStateCalcFn(
in integer pl_idx,
in EPTF_IntegerList pl_argList,
in EPTF_IntegerList pl_nonVarArgList,
inout EPTF_Var_DirectContent pl_retVal
) runs on EPTF_ExecCtrlClient_CT {
f_EPTF_Var_getContent(pl_argList[0],pl_retVal);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_startScenario
//
// Purpose:
// Enables a scenario on an Entity Group and restores and starts
//
// Detailed Comments:
// Wrapper to f_EPTF_LGenBase_enableScenarioOnEntityGroup
///////////////////////////////////////////////////////////
private function f_EPTF_ExecCtrlClient_startScenario(
in integer pl_eGrpIdx, //entity group
in integer pl_scIdxInGrp, //scenario index in group
in boolean pl_autoStart := true)
runs on EPTF_ExecCtrlClient_CT{
var EPTF_LGenBase_tcState vl_scStatePrev := f_EPTF_LGenBase_getScState(pl_eGrpIdx,pl_scIdxInGrp)
if(c_EPTF_LGenBase_tcStateStopped == vl_scStatePrev or
c_EPTF_LGenBase_tcStateAborted == vl_scStatePrev or
c_EPTF_LGenBase_tcStateTerminated == vl_scStatePrev) {
if(not f_EPTF_LGenBase_restoreScenarioByIdx(pl_eGrpIdx, pl_scIdxInGrp, false)) {
f_EPTF_ExecCtrlClient_debug(log2str("Restoring scenario with state ", vl_scStatePrev, " failed."));
}
}
f_EPTF_LGenBase_enableScenarioOnEntityGroup(pl_eGrpIdx,pl_scIdxInGrp,pl_autoStart);
}
private function f_EPTF_ExecCtrlClient_restoreScenarioData(
in integer pl_eGrpIdx, //entity group
in integer pl_scIdxInGrp //scenario index in group
) runs on EPTF_ExecCtrlClient_CT {
// reset v_ExecCtrlClient_pauseDataForTCs for all TCs in the scenario:
var EPTF_IntegerList vl_tcIdxList;
f_EPTF_LGenBase_tcIdxListOfScenario(pl_eGrpIdx,pl_scIdxInGrp,vl_tcIdxList);
for(var integer i:=0; i<sizeof(vl_tcIdxList); i:=i+1) {
f_EPTF_ExecCtrlClient_restoreTCData(vl_tcIdxList[i]);
}
}
private function f_EPTF_ExecCtrlClient_restoreTCData(
in integer pl_tcIdx //traffic case abs index in LGenBase
) runs on EPTF_ExecCtrlClient_CT {
v_ExecCtrlClient_pauseDataForTCs[pl_tcIdx] := c_EPTF_ExecCtrlClient_PauseData_default;
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_StartScenario
//
// Purpose:
// Handles <EPTF_ExecCtrl_StartScenario> messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_StartScenario() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_StartScenario vl_StartScenario_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_StartScenario:?) -> value vl_StartScenario_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_StartScenario received...");
if (not f_EPTF_LGenBase_restoreScenario(vl_StartScenario_msg.eGrpName, vl_StartScenario_msg.scenarioName, false)) {/*to remove the warning*/};
var integer vl_eGrpIdx := f_EPTF_LGenBase_entityGrpNameIndex(vl_StartScenario_msg.eGrpName);
var integer vl_scIdx := f_EPTF_LGenBase_scNameIndexInEG(vl_eGrpIdx,vl_StartScenario_msg.scenarioName)
f_EPTF_ExecCtrlClient_restoreScenarioData(vl_eGrpIdx, vl_scIdx);
f_EPTF_ExecCtrlClient_startScenario(vl_eGrpIdx, vl_scIdx,true);
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_StopScenario
//
// Purpose:
// Handles <EPTF_ExecCtrl_StopScenario> messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_StopScenario() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_StopScenario vl_StopScenario_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_StopScenario:?) -> value vl_StopScenario_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_StopScenario received...");
var integer vl_eGrpIdx := f_EPTF_LGenBase_entityGrpNameIndex(vl_StopScenario_msg.eGrpName)
var integer vl_scIdx := f_EPTF_LGenBase_scNameIndexInEG(vl_eGrpIdx, vl_StopScenario_msg.scenarioName);
if(f_EPTF_LGenBase_isWeightedScenario(vl_eGrpIdx, vl_scIdx)) {
f_EPTF_LGenBase_stopWeightedScenarioByIdx(vl_eGrpIdx, vl_scIdx);
} else {
f_EPTF_LGenBase_stopScenarioByIdx(vl_eGrpIdx, vl_scIdx);
}
/*var integer vl_scenidx := f_EPTF_LGenBase_scenarioNameIndex(vl_StopScenario_msg.scenarioName);
for (var integer tcidx:=0;tcidx<sizeof(v_LGenBase_scenarioTypes[vl_scenidx].trafficCases);tcidx:=tcidx+1) {
f_EPTF_LGenBase_stopTrafficCase(
vl_StopScenario_msg.eGrpName,
vl_StopScenario_msg.scenarioName,
v_LGenBase_trafficCaseTypes[v_LGenBase_scenarioTypes[vl_scenidx].trafficCases[tcidx].tcTypeIdx].name // tcname
);
}*/
var EPTF_LGenBase_Scenario2Grp vl_scenario2Grp := {
eGrpName := vl_StopScenario_msg.eGrpName,
scenarioName := vl_StopScenario_msg.scenarioName
}
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_ResetScenario
//
// Purpose:
// Handles <EPTF_ExecCtrl_ResetScenario> messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_ResetScenario() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_ResetScenario vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_ResetScenario:?) -> value vl_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_ResetScenario received...");
if (not f_EPTF_LGenBase_restoreScenario(vl_msg.eGrpName, vl_msg.scenName, false)) {/*to remove the warning*/};
var integer vl_eGrpIdx := f_EPTF_LGenBase_entityGrpNameIndex(vl_msg.eGrpName)
var integer vl_scIdx := f_EPTF_LGenBase_scNameIndexInEG(vl_eGrpIdx, vl_msg.scenName);
f_EPTF_ExecCtrlClient_restoreScenarioData(vl_eGrpIdx, vl_scIdx);
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_ResetStats
//
// Purpose:
// Handles <EPTF_ExecCtrl_ResetStats> messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_ResetStats() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_ResetStats vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_ResetStats:?) -> value vl_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_ResetStats received...");
f_EPTF_LGenBase_resetStats();
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_StartTrafficCase
//
// Purpose:
// Handles <EPTF_ExecCtrl_StartTrafficCase> messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_StartTrafficCase() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_StartTrafficCase vl_StartTC_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_StartTrafficCase:?) -> value vl_StartTC_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_StartTrafficCase received...");
if (f_EPTF_LGenBase_get_restoreTCAtStartTC(
vl_StartTC_msg.eGrpName,
vl_StartTC_msg.scenName,
vl_StartTC_msg.tcName
)) {
if (not f_EPTF_LGenBase_restoreTC(
vl_StartTC_msg.eGrpName,
vl_StartTC_msg.scenName,
vl_StartTC_msg.tcName
)) {/*to remove the warning*/};
}
var integer vl_tcAbsIdx := f_EPTF_LGenBase_trafficCaseId(vl_StartTC_msg.eGrpName, vl_StartTC_msg.scenName, vl_StartTC_msg.tcName);
f_EPTF_ExecCtrlClient_restoreTCData(vl_tcAbsIdx);
f_EPTF_LGenBase_startTrafficCase(
vl_StartTC_msg.eGrpName,
vl_StartTC_msg.scenName,
vl_StartTC_msg.tcName
);
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_StopTrafficCase
//
// Purpose:
// Handles <EPTF_ExecCtrl_StopTrafficCase> messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_StopTrafficCase() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_StopTrafficCase vl_StopTC_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_StopTrafficCase:?) -> value vl_StopTC_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_StopTrafficCase received...");
f_EPTF_LGenBase_stopTrafficCase(
vl_StopTC_msg.eGrpName,
vl_StopTC_msg.scenName,
vl_StopTC_msg.tcName
);
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_SingleShotTc
//
// Purpose:
// Handles <EPTF_ExecCtrl_SingleShotTc> messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_SingleShotTc() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_SingleShotTc vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_SingleShotTc:?) -> value vl_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_SingleShotTc received...");
f_EPTF_LGenBase_singleShotTc(
vl_msg.eGrpName,
vl_msg.scName,
vl_msg.tcName,
vl_msg.eIdx//,
//vl_msg.enableLog
);
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_Bye
//
// Purpose:
// Handles <EPTF_ExecCtrl_Bye> messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_Bye() runs on EPTF_ExecCtrlClient_CT
{
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_Bye:?)
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_Bye received...");
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrl_ByeAck:{});
v_ExecCtrlClient_byeReceived := true;
// if cleanup is not in progress and termination enabled:
if (v_ExecCtrlClient_initialized and tsp_EPTF_ExecCtrlClient_terminateIfExecCtrlTerminates) {
f_EPTF_Base_stop(none);
}
repeat;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_ByeAck
//
// Purpose:
// Handles <EPTF_ExecCtrl_ByeAck> messages from ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_ByeAck() runs on EPTF_ExecCtrlClient_CT
{
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_ByeAck:?)
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_ByeAck received...");
v_ExecCtrlClient_byeAckReceived := true;
repeat;
}
}
private function f_EPTF_ExecCtrlClient_waitForByeAck() runs on EPTF_ExecCtrlClient_CT {
timer t_wait := 0.0;
t_wait.start;
alt {
[v_ExecCtrlClient_byeAckReceived] t_wait.timeout;
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf_unhandledMsg
//
// Purpose:
// Catch unhandled messages of <EPTF_ExecCtrl_Mgmt_PT>
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf_unhandledMsg() runs on EPTF_ExecCtrlClient_CT
{
[] ExecCtrlClient_MgmtIf_CP.receive
{
f_EPTF_ExecCtrlClient_error("************* Unhandled ExecCtrl message received *************");
//f_EPTF_Base_stopAll();
}
}
///////////////////////////////////////////////////////////
// Altstep: as_EPTF_ExecCtrlClient_MgmtIf
//
// Purpose:
// Management interface handler of EPTF_ExecCtrlClient feature
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
private altstep as_EPTF_ExecCtrlClient_MgmtIf() runs on EPTF_ExecCtrlClient_CT
{
[] as_EPTF_ExecCtrlClient_MgmtIf_UpdateActiveEntities() {};
[] as_EPTF_ExecCtrlClient_MgmtIf_UpdateCps() {}
[] as_EPTF_ExecCtrlClient_MgmtIf_UpdateScenarioCps();
[] as_EPTF_ExecCtrlClient_MgmtIf_UpdateStartDelay();
[] as_EPTF_ExecCtrlClient_MgmtIf_StartScenario() {}
[] as_EPTF_ExecCtrlClient_MgmtIf_StopScenario() {}
[] as_EPTF_ExecCtrlClient_MgmtIf_ResetScenario();
[] as_EPTF_ExecCtrlClient_MgmtIf_ResetStats();
[] as_EPTF_ExecCtrlClient_MgmtIf_StartTrafficCase();
[] as_EPTF_ExecCtrlClient_MgmtIf_StopTrafficCase();
[] as_EPTF_ExecCtrlClient_MgmtIf_SingleShotTc();
[] as_EPTF_ExecCtrlClient_MgmtIf_groupFinished();
[] as_EPTF_ExecCtrlClient_MgmtIf_pauseTC();
// R3 handlers:
[] as_EPTF_ExecCtrlClient_MgmtIf_CreateEntityGrp();
[] as_EPTF_ExecCtrlClient_MgmtIf_CreateEntityGrpList();
[] as_EPTF_ExecCtrlClient_MgmtIf_DeclarePhaseLists();
[] as_EPTF_ExecCtrlClient_MgmtIf_DeclareTcs();
[] as_EPTF_ExecCtrlClient_MgmtIf_CreateScenario();
[] as_EPTF_ExecCtrlClient_MgmtIf_handlePhaseMsgs(); // R3 phase handling
[] as_EPTF_ExecCtrlClient_MgmtIf_handleEndOfConfig();
[] as_EPTF_ExecCtrlClient_MgmtIf_handleGuiDone();
[] as_EPTF_ExecCtrlClient_MgmtIf_Bye();
[] as_EPTF_ExecCtrlClient_MgmtIf_ByeAck();
[] as_EPTF_ExecCtrlClient_MgmtIf_EofTest();
[] as_EPTF_ExecCtrlClient_MgmtIf_unhandledMsg() {}
}
// Functions using the R3 database
group R3 {
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_readyToStart
//
// Purpose:
// sends "I am ready to start" message to ExecCtrl.
// The ExecCtrl will configure the clients if all LGens are ready to start
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_readyToStart() runs on EPTF_ExecCtrlClient_CT {
f_EPTF_ExecCtrlClient_sendEntityResourceInfo();
v_ExecCtrlClient_started := true;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_sendEntityResourceInfo
//
// Purpose:
// Function for sending the LGen's resource availability
// list <EPTF_ExecCtrl_LGenResourceList> to EPTF_ExecCtrl
// component
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
// Replaces f_EPTF_ExecCtrlClient_sendAvailableResourceList
//
///////////////////////////////////////////////////////////
private function f_EPTF_ExecCtrlClient_sendEntityResourceInfo() runs on EPTF_ExecCtrlClient_CT
{
f_EPTF_ExecCtrlClient_debug(%definitionId&": started...");
if (v_ExecCtrlClient_byeReceived) {
f_EPTF_ExecCtrlClient_debug(log2str("ResourceInfo not sent: ExecCtrl terminated."));
return;
}
//FIXME Is it required?
//f_EPTF_ExecCtrlClient_debug(log2str("v_LGenBase_entityTypes = ", v_LGenBase_entityTypes));
//f_EPTF_ExecCtrlClient_debug(log2str("v_LGenBase_behaviorTypes = ", v_LGenBase_behaviorTypes));
// FIXME: replace the code below to an LGenBase function call
var EPTF_ExecCtrl_LGenResourceInfoList tmp_rList := {};
var integer minOf_availCount := 0;
// var integer maxOf_usageCount := 0;
var integer minOf_maxCount := 0;
var integer availCount := 0;
// var integer usageCount := 0;
var integer maxCount := 0;
for (var integer i:=0;i<f_EPTF_LGenBase_getETypeCount();i:=i+1) {
tmp_rList[i].eType := f_EPTF_LGenBase_getETypeName(i);
tmp_rList[i].eAvail := f_EPTF_LGenBase_getETypeAvailableByIdx(i);//minOf_availCount;
tmp_rList[i].eMaxCount := f_EPTF_LGenBase_getETypeMaxCountByIdx(i);//minOf_maxCount;
}
f_EPTF_ExecCtrlClient_debug(log2str("tmp_rList = ", tmp_rList));
if (sizeof(tmp_rList)>0) {
f_EPTF_ExecCtrlClient_debug(log2str("Sending resource list: ", tmp_rList));
} else {
f_EPTF_ExecCtrlClient_debug("empty resource list");
}
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrl_EntityResourceInfo:{
lgenName := f_EPTF_Base_selfName(),
available := tmp_rList
});
f_EPTF_ExecCtrlClient_debug(%definitionId&": finished...");
}
private altstep as_EPTF_ExecCtrlClient_MgmtIf_CreateEntityGrp() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_CreateEntityGrp vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_CreateEntityGrp:?) -> value vl_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_CreateEntityGrp received...");
// create Entity Group
var integer myETypeIdx;
myETypeIdx := f_EPTF_LGenBase_entityTypeNameIndex(vl_msg.eType);
if (myETypeIdx<0) {
f_EPTF_ExecCtrlClient_error(log2str("ERROR: unknown entityType in create entity group ",vl_msg,": ", vl_msg.eType));
//f_EPTF_Base_stopAll();
} else {
f_EPTF_ExecCtrlClient_debug(log2str("creating entityGroup: ", vl_msg));
// store entity group data:
f_EPTF_ExecCtrlClient_storeEGrpData(vl_msg);
var integer vl_grpSize := f_EPTF_LGenBase_createEntityGroup(
{
vl_msg.name,
vl_msg.eType,
vl_msg.eCount
}
);
f_EPTF_LGenBase_setTrafficCorrigationForEGrp(vl_msg.name,vl_msg.trafficCorrigation);
f_EPTF_ExecCtrlClient_debug(log2str("size of created entity group ", vl_msg.name, ": ", vl_grpSize));
}
f_EPTF_ExecCtrlClient_sendEntityResourceInfo();
//FIXME
//f_EPTF_ExecCtrlClient_debug(log2str("v_LGenBase_entityGroups = ", v_LGenBase_entityGroups));
repeat;
}
}
// initializes eGrp database
private function f_EPTF_ExecCtrlClient_initEGrpDB()
runs on EPTF_ExecCtrlClient_CT {
v_EPTF_ExecCtrlClient_eGrpHash := f_EPTF_str2int_HashMap_New(c_ExecCtrlClient_eGrpHashMapName);
}
// cleans up eGrp database
private function f_EPTF_ExecCtrlClient_cleanupEGrpDB()
runs on EPTF_ExecCtrlClient_CT {
f_EPTF_str2int_HashMap_Delete(c_ExecCtrlClient_eGrpHashMapName);
v_EPTF_ExecCtrlClient_eGrpHash := c_ExecCtrl_invalidIdx;
}
// stores the offsets of the entityGroup
private function f_EPTF_ExecCtrlClient_storeEGrpData(in EPTF_ExecCtrl_CreateEntityGrp pl_eGrpData) runs on EPTF_ExecCtrlClient_CT {
f_EPTF_str2int_HashMap_Insert(v_EPTF_ExecCtrlClient_eGrpHash, pl_eGrpData.name&".gOffset", pl_eGrpData.gOffset);
f_EPTF_str2int_HashMap_Insert(v_EPTF_ExecCtrlClient_eGrpHash, pl_eGrpData.name&".gCount", pl_eGrpData.gCount);
f_EPTF_str2int_HashMap_Insert(v_EPTF_ExecCtrlClient_eGrpHash, pl_eGrpData.name&".eOffset", pl_eGrpData.eOffset);
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_getFirstEntityGlobalOffset
//
// Purpose:
// returns the global offset of the first entity of the entity group deployed on this LGen
//
// Parameters:
// -
//
// Return Value:
// integer - the global offset of the first entity of the entity group deployed on this LGen, -1 if not found
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_getFirstEntityGlobalOffset(in charstring pl_eGrpName)
runs on EPTF_ExecCtrlClient_CT
return integer {
var integer vl_idx := -1;
if (not f_EPTF_str2int_HashMap_Find(
v_EPTF_ExecCtrlClient_eGrpHash,
pl_eGrpName&".eOffset",
vl_idx)) {
f_EPTF_ExecCtrlClient_warning(%definitionId&": Cannot find first entity global offset for entity group "&pl_eGrpName&" in database.");
return -1;
}
return vl_idx;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_getEntityGroupGlobalOffset
//
// Purpose:
// returns the global offset of the first entity of the entity group
//
// Parameters:
// -
//
// Return Value:
// integer - the global offset of the first entity of the entity group, -1 if not found
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_getEntityGroupGlobalOffset(in charstring pl_eGrpName)
runs on EPTF_ExecCtrlClient_CT
return integer {
var integer vl_idx := -1;
if (not f_EPTF_str2int_HashMap_Find(
v_EPTF_ExecCtrlClient_eGrpHash,
pl_eGrpName&".gOffset",
vl_idx)) {
f_EPTF_ExecCtrlClient_warning(%definitionId&": Cannot find global offset for entity group "&pl_eGrpName&" in database.");
return -1;
}
return vl_idx;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_getFirstEntityOffsetInEGrp
//
// Purpose:
// returns the relative offset of the first entity of the entity group deployed on this LGen in the entity group
//
// Parameters:
// -
//
// Return Value:
// integer - the relative offset of the first entity of the entity group deployed on this LGen in the entity group, -1 if not found
//
// Errors:
// -
//
// Detailed Comments:
// The returned index will be in the range: 0-eGrpSize, or -1 if not found
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_getFirstEntityOffsetInEGrp(in charstring pl_eGrpName)
runs on EPTF_ExecCtrlClient_CT
return integer {
var integer vl_idx := -1;
var integer gOffset := f_EPTF_ExecCtrlClient_getEntityGroupGlobalOffset(pl_eGrpName);
var integer eOffset := f_EPTF_ExecCtrlClient_getFirstEntityGlobalOffset(pl_eGrpName);
if (gOffset==-1 or eOffset==-1) {
f_EPTF_ExecCtrlClient_warning(%definitionId&": Cannot find relative offset of the first entity in the entity group "&pl_eGrpName&" in database.");
return -1;
}
return eOffset-gOffset;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_getEntityGroupSize
//
// Purpose:
// returns the size of the of the entity group
//
// Parameters:
// -
//
// Return Value:
// integer - the size of the of the entity group, -1 if not found
//
// Errors:
// -
//
// Detailed Comments:
//
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_getEntityGroupSize(in charstring pl_eGrpName)
runs on EPTF_ExecCtrlClient_CT
return integer {
var integer vl_idx := -1;
if (not f_EPTF_str2int_HashMap_Find(
v_EPTF_ExecCtrlClient_eGrpHash,
pl_eGrpName&".gCount",
vl_idx)) {
f_EPTF_ExecCtrlClient_warning(%definitionId&": Cannot find size for entity group "&pl_eGrpName&" in database.");
return -1;
}
return vl_idx;
}
private altstep as_EPTF_ExecCtrlClient_MgmtIf_CreateEntityGrpList() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_CreateEntityGrpList vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_CreateEntityGrpList:?) -> value vl_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_CreateEntityGrpList received...");
for(var integer i:=0; i<sizeof(vl_msg); i:=i+1) {
// create Entity Group
var integer myETypeIdx;
myETypeIdx := f_EPTF_LGenBase_entityTypeNameIndex(vl_msg[i].eType);
if (myETypeIdx<0) {
f_EPTF_ExecCtrlClient_error(log2str("ERROR: unknown entityType in create entity group ",vl_msg[i],": ", vl_msg[i].eType));
//f_EPTF_Base_stopAll();
} else {
f_EPTF_ExecCtrlClient_debug(log2str("creating entityGroup: ", vl_msg[i]));
// store entity group data:
f_EPTF_ExecCtrlClient_storeEGrpData(vl_msg[i]);
var integer vl_grpSize := f_EPTF_LGenBase_createEntityGroup(
{
vl_msg[i].name,
vl_msg[i].eType,
vl_msg[i].eCount
}
);
f_EPTF_LGenBase_setTrafficCorrigationForEGrp(vl_msg[i].name,vl_msg[i].trafficCorrigation);
f_EPTF_ExecCtrlClient_debug(log2str("size of created entity group ", vl_msg[i].name, ": ", vl_grpSize));
}
}
f_EPTF_ExecCtrlClient_sendEntityResourceInfo();
//FIXME
//f_EPTF_ExecCtrlClient_debug(log2str("v_LGenBase_entityGroups = ", v_LGenBase_entityGroups));
repeat;
}
}
private altstep as_EPTF_ExecCtrlClient_MgmtIf_DeclarePhaseLists() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_DeclarePhaseLists vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_DeclarePhaseLists:?) -> value vl_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_DeclarePhaseLists received...");
f_EPTF_LGenBase_PhaseList_Declarators_store(vl_msg);
f_EPTF_ExecCtrlClient_debug(log2str("PhaseLists declared ", vl_msg));
repeat;
}
}
private altstep as_EPTF_ExecCtrlClient_MgmtIf_DeclareTcs() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_DeclareTcs vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_DeclareTcs:?) -> value vl_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_DeclareTcs received...");
for(var integer i:=0; i<sizeof(vl_msg); i:=i+1) {
// declare traffic case
if (-1==f_EPTF_LGenBase_declareTrafficCaseTypeInternal(vl_msg[i])) {/*to remove the warning*/};
f_EPTF_ExecCtrlClient_debug(log2str("Traffic case declared ", vl_msg[i]));
}
repeat;
}
}
// notifies ExecCtrl that I am ready to run
private function f_EPTF_ExecCtrlClient_readyToRun() runs on EPTF_ExecCtrlClient_CT {
if (v_ExecCtrlClient_byeReceived) {
f_EPTF_ExecCtrlClient_debug(log2str("ReadyToRun not sent: ExecCtrl terminated."));
return;
}
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrl_ReadyToRun:{});
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_checkEndOfConfig
//
// Purpose:
// Returns true when the configuration of the ExecCtrlClient is finished,
// and all scenarioInitializedCallback function registered by <f_EPTF_ExecCtrlClient_set_scenarioInitialized_fcb>
// finished its operation
//
// Parameters:
// -
//
// Return Value:
// boolean - true when the configuration of the ExecCtrlClient is finished
//
// Errors:
// -
//
// Detailed Comments:
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_checkEndOfConfig() runs on EPTF_ExecCtrlClient_CT return boolean {
return (v_ExecCtrlClient_semaphore_EndOfConfig and v_ExecCtrlClient_semaphore_DeclareScenario==0);
}
private altstep as_EPTF_ExecCtrlClient_MgmtIf_handleEndOfConfig() runs on EPTF_ExecCtrlClient_CT {
var EPTF_ExecCtrl_EndOfConfig vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_EndOfConfig:?) -> value vl_msg {
if(f_EPTF_Base_cleanupIsInProgress()){
// cleanup is not in progress.
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_EndOfConfig received...");
v_ExecCtrlClient_semaphore_EndOfConfig := true;
f_EPTF_LGenBase_setDataSource(vl_msg.dataSourceCompRef);
} else {
// cleanup is in progress.
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_EndOfConfig received, but cleanup is already running...");
}
repeat;
}
// wait until all scenarios are created and EPTF_ExecCtrl_EndOfConfig is received:
[f_EPTF_ExecCtrlClient_checkEndOfConfig()] t_EPTF_ExecCtrlClient_semaphoreTimer.timeout {
f_EPTF_ExecCtrlClient_debug("All scenarios are declared, configuration ended.");
// all scenarios are ready.
f_EPTF_ExecCtrlClient_callEndOfConfigCallbacks();
f_EPTF_ExecCtrlClient_readyToRun();
repeat;
}
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_checkGuiDone
//
// Purpose:
// Returns true when the creation of the GUI is finished
//
// Parameters:
// -
//
// Return Value:
// boolean - true when the creation of the GUI is finished
//
// Errors:
// -
//
// Detailed Comments:
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_checkGuiDone()
runs on EPTF_ExecCtrlClient_CT
return boolean {
return v_EPTF_ExecCtrlClient_guiDone;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_checkGuiDoneReported
//
// Purpose:
// Returns true when the GUIDone was reported to ExecCtrl by <f_EPTF_ExecCtrlClient_reportGUIDone>
//
// Parameters:
// -
//
// Return Value:
// boolean - true when the creation of the GUI is finished
//
// Errors:
// -
//
// Detailed Comments:
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_checkGuiDoneReported()
runs on EPTF_ExecCtrlClient_CT
return boolean {
return v_EPTF_ExecCtrlClient_guiDoneReported;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_reportGUIDone
//
// Purpose:
// Reports GUIDone to ExecCtrl
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_reportGUIDone() runs on EPTF_ExecCtrlClient_CT {
if (v_EPTF_ExecCtrlClient_guiDoneReported or not v_EPTF_ExecCtrlClient_guiDone) {
return; // prevent reporting multiple times or before ExecCtrl GUI is ready
}
if (not v_ExecCtrlClient_byeReceived) {
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrl_GuiDone:{v_EPTF_ExecCtrlClient_guiPresent});
} else {
f_EPTF_ExecCtrlClient_debug(log2str("GUIDone not sent: ExecCtrl terminated."));
}
v_EPTF_ExecCtrlClient_guiDoneReported := true;
}
private altstep as_EPTF_ExecCtrlClient_MgmtIf_handleGuiDone() runs on EPTF_ExecCtrlClient_CT {
var EPTF_ExecCtrl_GuiDone vl_guiDone;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_GuiDone:?) -> value vl_guiDone {
v_EPTF_ExecCtrlClient_guiPresent := vl_guiDone.guiPresent;
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_GuiDone received...");
f_EPTF_ExecCtrlClient_callGuiDoneCallbackForFSMStats();
// call user callbacks:
f_EPTF_ExecCtrlClient_callGuiDoneCallbacks();
v_EPTF_ExecCtrlClient_guiDone := true;
// send gui done to execCtrl to synchronize:
if (v_EPTF_ExecCtrlClient_autoReportGuiDone) {
f_EPTF_ExecCtrlClient_reportGUIDone(); // GUIDone is reported automatically
}
repeat;
}
}
friend function f_EPTF_ExecCtrlClient_guiPresent() runs on EPTF_ExecCtrlClient_CT return boolean {
return v_EPTF_ExecCtrlClient_guiPresent
}
private function f_EPTF_ExecCtrlClient_createScenarioStatusVar(in charstring pl_eGrpName, in charstring pl_scName) runs on EPTF_ExecCtrlClient_CT {
// create new alias variable for scenario status:
var charstring vl_varName := "ExecCtrlClient.scenarioStatus."&pl_eGrpName&"."&pl_scName;
var integer vl_idx;
vl_idx := f_EPTF_Var_getId(vl_varName);
if (vl_idx != -1) {
return; // already exists
}
f_EPTF_Var_newCharstring(vl_varName,"",vl_idx);
// connect it to the LGenBaseStats scenario state:
var charstring vl_varNameBase := f_EPTF_LGenBaseStats_getScNamePrefix(pl_eGrpName,pl_scName);
vl_varName := vl_varNameBase&c_EPTF_LGenBaseStats_nameOfScStateName;
var integer vl_lgenBaseVarIdx := f_EPTF_Var_getId(vl_varName);
// this is never true, but kept for safety:
if (vl_lgenBaseVarIdx==-1) {
f_EPTF_ExecCtrlClient_debug(log2str("You should not see this: ", vl_varName, "!"));
f_EPTF_Var_adjustContent(vl_idx,{charstringVal := "StateUpdateError"});
return;
}
f_EPTF_Var_subscribeLocal(
vl_idx,
{
calcFn := {
funcRef := refers(f_EPTF_ExecCtrlClient_scenarioStateCalcFn),
argList := {vl_lgenBaseVarIdx},
nonVarArgList := {}
}
}
);
}
private function f_EPTF_ExecCtrlClient_createTrafficCaseStatusVar(in charstring pl_eGrpName, in charstring pl_scName, in charstring pl_tcName) runs on EPTF_ExecCtrlClient_CT {
// create new alias variable for scenario status:
var charstring vl_varName := "ExecCtrlClient.trafficCaseStatus."&pl_eGrpName&"."&pl_scName&"."&pl_tcName;
var integer vl_idx;
vl_idx := f_EPTF_Var_getId(vl_varName);
if (vl_idx != -1) {
return; // already exists
}
f_EPTF_Var_newCharstring(vl_varName,"",vl_idx);
// connect it to the LGenBaseStats scenario state:
var charstring vl_varNameBase := f_EPTF_LGenBaseStats_getNamePrefix(pl_eGrpName,pl_scName,pl_tcName);
vl_varName := vl_varNameBase&c_EPTF_LGenBaseStats_nameOfTcStateName;
var integer vl_lgenBaseVarIdx := f_EPTF_Var_getId(vl_varName);
// this is never true, but kept for safety:
if (vl_lgenBaseVarIdx==-1) {
f_EPTF_ExecCtrlClient_debug(log2str("You should not see this: ", vl_varName, "!"));
f_EPTF_Var_adjustContent(vl_idx,{charstringVal := "StateUpdateError"});
return;
}
f_EPTF_Var_subscribeLocal(
vl_idx,
{
calcFn := {
funcRef := refers(f_EPTF_ExecCtrlClient_scenarioStateCalcFn),
argList := {vl_lgenBaseVarIdx},
nonVarArgList := {}
}
}
);
}
private function f_EPTF_ExecCtrlClient_declareScenario(in EPTF_LGenBase_ScenarioTypeInternalDeclarator vl_scType, in EPTF_ExecCtrl_NamesInScenario pl_scNames) runs on EPTF_ExecCtrlClient_CT {
/*
// convert universal declarator to decl2 or weighted decl:
if (ispresent(vl_scType.weightedScData)) {
var EPTF_ExecCtrl_DeclareScenario3 vl_declareScenario3 := {
name := vl_scType.name,
enabled := vl_scType.enabled,
cpsToReach := vl_scType.weightedScData.cpsToReach,
lockCPS := false,
weightedScData := {
deterministicMix := vl_scType.weightedScData.deterministicMix
},
tcList := {}
};
for(var integer tc:=0; tc<sizeof(vl_scType.tcList);tc:=tc+1) {
vl_declareScenario3.tcList[tc] := {
tcName := pl_scNames.tcNames[tc],
//float startDelay,
tcWeight := vl_scType.tcList[tc].target.trafficWeight,
enableEntities := vl_scType.tcList[tc].enableEntities,
enable := vl_scType.tcList[tc].enable,
ranges := vl_scType.tcList[tc].ranges,
params := vl_scType.tcList[tc].params,
//finishConditions
groupFinishConditions := vl_scType.tcList[tc].groupFinishConditions,
entityFinishConditions := vl_scType.tcList[tc].entityFinishConditions,
//actionLists
entityFinishActions := vl_scType.tcList[tc].entityFinishActions,
tcFinishActions := vl_scType.tcList[tc].tcFinishActions
}
}
f_EPTF_LGenBase_declareWeightedScenarioType(vl_declareScenario3);
} else {
var EPTF_ExecCtrl_DeclareScenario2 vl_declareScenario2 := {
name := vl_scType.name,
tcList := {}
};
for(var integer tc:=0; tc<sizeof(vl_scType.tcList);tc:=tc+1) {
vl_declareScenario2.tcList[tc] := {
tcName := pl_scNames.tcNames[tc],
startDelay := vl_scType.tcList[tc].startDelay,
cpsToReach := vl_scType.tcList[tc].target.cpsToReach,
enableEntities := vl_scType.tcList[tc].enableEntities,
enable := vl_scType.tcList[tc].enable,
ranges := vl_scType.tcList[tc].ranges,
params := vl_scType.tcList[tc].params,
//finishConditions
groupFinishConditions := vl_scType.tcList[tc].groupFinishConditions,
entityFinishConditions := vl_scType.tcList[tc].entityFinishConditions,
//actionLists
entityFinishActions := vl_scType.tcList[tc].entityFinishActions,
tcFinishActions := vl_scType.tcList[tc].tcFinishActions
}
}
f_EPTF_LGenBase_declareScenarioType2(vl_declareScenario2);
}
*/
// declare scenario using the latest declararor type:
f_EPTF_ExecCtrlClient_debug(log2str("Declaring Scenario ", vl_scType, " names: ", pl_scNames));
v_ExecCtrlClient_semaphore_DeclareScenario := v_ExecCtrlClient_semaphore_DeclareScenario + 1;
if (-1==f_EPTF_LGenBase_declareScenarioTypeInternal(vl_scType)) {
/*to remove the warning*/
}
f_EPTF_LGenBase_createScenario2EntityGroup(
{pl_scNames.eGrpName,pl_scNames.scTypeName},
false
);
if (v_ExecCtrlClient_scenarioInitialized_fcb!=null) {
f_EPTF_ExecCtrlClient_debug(log2str("Calling callback fn: ", v_ExecCtrlClient_scenarioInitialized_fcb));
v_ExecCtrlClient_scenarioInitialized_fcb.apply({pl_scNames.eGrpName,pl_scNames.scTypeName});
}
v_ExecCtrlClient_semaphore_DeclareScenario := v_ExecCtrlClient_semaphore_DeclareScenario - 1;
f_EPTF_ExecCtrlClient_debug(log2str("Scenario ", pl_scNames.scTypeName, " added to eGrp: ", pl_scNames.eGrpName));
}
private altstep as_EPTF_ExecCtrlClient_MgmtIf_CreateScenario() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_CreateScenario vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_CreateScenario:?) -> value vl_msg
{
f_EPTF_ExecCtrlClient_debug("EPTF_ExecCtrl_CreateScenario received...");
for(var integer sc:=0; sc<sizeof(vl_msg.scList); sc:=sc+1) {
f_EPTF_ExecCtrlClient_declareScenario(vl_msg.scList[sc],vl_msg.scNames[sc]);
f_EPTF_ExecCtrlClient_createScenarioStatusVar(vl_msg.scNames[sc].eGrpName,vl_msg.scNames[sc].scTypeName);
for(var integer tc:=0; tc<sizeof(vl_msg.scNames[sc].tcNames);tc:=tc+1) {
f_EPTF_ExecCtrlClient_createTrafficCaseStatusVar(vl_msg.scNames[sc].eGrpName,vl_msg.scNames[sc].scTypeName,vl_msg.scNames[sc].tcNames[tc]);
}
}
repeat;
}
}
// R3: final test report generation
group EPTF_ExecCtrlClient_FinalTestReport {
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_registerFinalTestReportGeneratorFn
//
// Purpose:
// registers callback function to generate final test report
//
// Parameters:
// pl_reportGeneratorFn - in <EPTF_ExecCtrl_FinalTestReportGenerator_FT> - the report generator fn to register
//
// Return Value:
//
// Errors:
//
// Detailed Comments:
// called when the end of test execution detected:
// exit event detected in any of the LGens, or the Exit button pressed
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_registerFinalTestReportGeneratorFn(in EPTF_ExecCtrl_FinalTestReportGenerator_FT pl_reportGeneratorFn)
runs on EPTF_ExecCtrlClient_CT {
v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns[sizeof(v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns)] := pl_reportGeneratorFn;
}
///////////////////////////////////////////////////////////
// Function: f_EPTF_ExecCtrlClient_deregisterFinalTestReportGeneratorFn
//
// Purpose:
// removes the callback function registered earlier by <f_EPTF_ExecCtrl_registerFinalTestReportGeneratorFn>
//
// Parameters:
// pl_reportGeneratorFn - in <EPTF_ExecCtrl_FinalTestReportGenerator_FT> - the report generator fn to deregister
//
// Return Value:
//
// Errors:
//
// Detailed Comments:
//
///////////////////////////////////////////////////////////
public function f_EPTF_ExecCtrlClient_deregisterFinalTestReportGeneratorFn(in EPTF_ExecCtrl_FinalTestReportGenerator_FT pl_reportGeneratorFn)
runs on EPTF_ExecCtrlClient_CT {
for(var integer i:=0; i<sizeof(v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns); i:=i+1) {
if(v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns[i]==pl_reportGeneratorFn) {
v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns[i] := null;
}
}
}
// calls all F.T.R. generator functions
private function f_EPTF_ExecCtrlClient_callFinalTestReportGeneratorFns(inout charstring pl_report)
runs on EPTF_ExecCtrlClient_CT {
for(var integer i:=0; i<sizeof(v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns); i:=i+1) {
if(v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns[i]!=null) {
f_EPTF_ExecCtrlClient_debug(log2str(%definitionId&": Calling final test report generator function: ",v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns[i]));
v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns[i].apply(pl_report);
f_EPTF_ExecCtrlClient_debug(log2str(%definitionId&": Final test report generator function finished: ",v_EPTF_ExecCtrlClient_finalTestReportGeneratorFns[i]));
}
}
}
// sends EofTest request to ExecCtrl
private function f_EPTF_ExecCtrlClient_sendEofTest()
runs on EPTF_ExecCtrlClient_CT {
if (v_ExecCtrlClient_byeReceived) {
f_EPTF_ExecCtrlClient_debug(log2str("EofTest not sent: ExecCtrl terminated."));
return;
}
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrl_EofTest:{});
}
// sends EofTestDone to ExecCtrl
private function f_EPTF_ExecCtrlClient_sendEofTestDone(in charstring pl_reportMsg)
runs on EPTF_ExecCtrlClient_CT {
if (v_ExecCtrlClient_byeReceived) {
f_EPTF_ExecCtrlClient_debug(log2str("EofTestDone not sent: ExecCtrl terminated."));
return;
}
ExecCtrlClient_MgmtIf_CP.send(EPTF_ExecCtrl_EofTestDone:{pl_reportMsg});
}
private function f_EPTF_ExecCtrlClient_testFinishedListener(
EPTF_LGenBase_ReportedEventDescriptor pl_event,
EPTF_IntegerList pl_listenerArgs)
runs on EPTF_ExecCtrlClient_CT{
//v_ExecCtrlClient_testFinished := true;
f_EPTF_ExecCtrlClient_debug(log2str("Test finished in ",f_EPTF_Base_selfName()));
// send EofTest to ExecCtrl
f_EPTF_ExecCtrlClient_sendEofTest();
}
// handles EofTest/EofTestDone messages coming from the ExecCtrl
private altstep as_EPTF_ExecCtrlClient_MgmtIf_EofTest() runs on EPTF_ExecCtrlClient_CT
{
var EPTF_ExecCtrl_EofTest vl_msg;
[] ExecCtrlClient_MgmtIf_CP.receive(EPTF_ExecCtrl_EofTest:?) -> value vl_msg {
var charstring vl_reportMsg := "";
f_EPTF_ExecCtrlClient_callFinalTestReportGeneratorFns(vl_reportMsg);
f_EPTF_ExecCtrlClient_sendEofTestDone(vl_reportMsg);
repeat;
}
}
}
} // group R3
} // module