| /////////////////////////////////////////////////////////////////////////////// |
| // // |
| // 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 |