///////////////////////////////////////////////////////////////////////////////
// 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_Common_RndFunctions
// 
//  Purpose:
//    This module contains the implementation of the RndValues component
// 
//  Module Parameters:
//    tsp_EPTF_Common_rndValues_behaviour - *float* - the behaviour of the random number generation
//    tsp_EPTF_Common_rndValues_numberOfRndValues - *integer* - the number of the generated random values
//
//  Module depends on:
//    <EPTF_CLL_Common_RndDefinitions>
// 
//  Current Owner:
//    ENORPIN
// 
//  Last Review Date:
//    2007-xx-xx
//
//  Detailed Comments:
//    -
// 
///////////////////////////////////////////////////////////////
module EPTF_CLL_Common_RndFunctions
{

//=========================================================================
// Import Part
//=========================================================================
import from EPTF_CLL_Common_RndDefinitions all;
import from EPTF_CLL_Common_Functions all;

//=========================================================================
// Module Parameters
//=========================================================================
modulepar {
  float tsp_EPTF_Common_RndValues_behaviour := 0.1; //-1:no seed, otherwise the value of the first seed
  integer tsp_EPTF_Common_RndValues_numberOfRndValues := 10;
}

//=========================================================================
// Functions
//=========================================================================
///////////////////////////////////////////////////////////
//  Function: f_EPTF_Common_RndValues_init_CT
// 
//  Purpose:
//    Function to initialize the rndValues component
//
//  Parameters:
//    -
//
//  Return Value:
//    *boolean* - true, if the initialization finished
//
//  Errors:
//    -
//
//  Detailed Comments:
//    -  
//  
///////////////////////////////////////////////////////////
function f_EPTF_Common_RndValues_init_CT(
  in integer pl_nofRndValues := -1,
  in float pl_behavior := 0.0 )
runs on EPTF_Common_RndValues_CT 
return boolean
{
  if ( v_EPTF_Common_RndValues_initialized) {return false;}
  
  if (pl_nofRndValues != -1) {
    v_EPTF_Common_RndValues_numberOfRndValues := pl_nofRndValues;
  }
  else {
    v_EPTF_Common_RndValues_numberOfRndValues := tsp_EPTF_Common_RndValues_numberOfRndValues;
  }
  
  if (pl_behavior != 0.0) {
    v_EPTF_Common_RndValues_behaviour := pl_behavior;
  }
  else {
    v_EPTF_Common_RndValues_behaviour := tsp_EPTF_Common_RndValues_behaviour;
  }
  
  
  if( not( v_EPTF_Common_RndValues_behaviour == -1.0  or (v_EPTF_Common_RndValues_behaviour>=0.0 and v_EPTF_Common_RndValues_behaviour<1.0)))
  {
    f_EPTF_Common_error(log2str("ERROR:Faulty input value in f_EPTF_Common_RndValues_init_CT:",v_EPTF_Common_RndValues_behaviour));
    return false;
  }

  if( v_EPTF_Common_RndValues_behaviour == -1.0 )
  {
    f_EPTF_Common_RndValues_generateRandomNumbers(false);
  }
  else //( tsp_EPTF_Common_RndValues_behaviour>=0.0 and tsp_EPTF_Common_RndValues_behaviour<1.0)
  {
    f_EPTF_Common_RndValues_generateRandomNumbers(true);
  }

  v_EPTF_Common_RndValues_initialized := true;
  return true;
}

///////////////////////////////////////////////////////////
//  Function: f_EPTF_Common_RndValues_generateRandomNumbers
// 
//  Purpose:
//    Function to generate random numbers
//
//  Parameters:
//    pl_isFirstTime - *boolean* - boolean to indicate the first usage time
//
//  Return Value:
//    -
//
//  Errors:
//    -
//
//  Detailed Comments:
//    -  
//  
///////////////////////////////////////////////////////////
function f_EPTF_Common_RndValues_generateRandomNumbers(
  in boolean pl_isFirstTime := false) 
runs on EPTF_Common_RndValues_CT 
{
  if (pl_isFirstTime) {
    v_EPTF_Common_RndValues_rndNumberList[0] := rnd(v_EPTF_Common_RndValues_behaviour);
  }
  else {
    v_EPTF_Common_RndValues_rndNumberList[0] := rnd();
  }
  for(var integer i := 1; i< v_EPTF_Common_RndValues_numberOfRndValues;  i:=i+1)
  {
    v_EPTF_Common_RndValues_rndNumberList[i] := rnd();
  }
  v_EPTF_Common_RndValues_actualIndex := 0;
  
}

///////////////////////////////////////////////////////////
//  Function: f_EPTF_Common_RndValues_getNextRndValue
// 
//  Purpose:
//    Function to get the next generated random value
//
//  Parameters:
//    -
//
//  Return Value:
//    *float* - the next generated random number
//
//  Errors:
//    -
//
//  Detailed Comments:
//    -  
//  
///////////////////////////////////////////////////////////
function f_EPTF_Common_RndValues_getNextRndValue()
  runs on EPTF_Common_RndValues_CT
return float
{
  var float vloc_retval := -1.0;
  if(v_EPTF_Common_RndValues_initialized == true) {
    if (v_EPTF_Common_RndValues_actualIndex >= tsp_EPTF_Common_RndValues_numberOfRndValues) {
      f_EPTF_Common_RndValues_generateRandomNumbers(false);
    }
    
    vloc_retval := v_EPTF_Common_RndValues_rndNumberList[v_EPTF_Common_RndValues_actualIndex];
    v_EPTF_Common_RndValues_actualIndex := v_EPTF_Common_RndValues_actualIndex+1;  
  }
  else {
    f_EPTF_Common_error("ERROR: The component has not been initialized yet");
  }
  return vloc_retval;
}

}  // end of module


