/*@@var:*/
variables
{
  message StmMsg lStmMsg;
  message CSVMsg lCSVMsg;

  // defines the cycle of the output of the stimulated signals
  dword gOutTime;
  msTimer tOutStmMsg;

  // Remember the handles for the different stimulus:
  dword mRampId = 0;
  dword mToggleId = 0;
  dword mEnvVarId = 0;
  dword mCSVId = 0;

  /* 
   * Description of the stimuli functions in the demo.
   * - Creation of stimuli in the pre-start event
   * - control of the stimulated signals by environment variables
   */
}
/*@@end*/

/*@@preStart:PreStart:*/
on preStart
{
  // Initialize the DTF functionality.
  // Dependent to the development progress of the test,
  // DTF should be initialized with "user" or "developer".
  // The setting "user" is very silent and reports only severe problems.
  // The setting "developer" is more verbose and reports useful information

  ChkConfig_Init("user");

  // creates the different stimulus
  mRampId = StmCreate_Ramp(lStmMsg,
                           StmMsg::RampSig, 
                           @sysvar::Stimulus::RampValueA, 
                           @sysvar::Stimulus::RampValueB, 
                           @sysvar::Stimulus::RampCycleTime, 
                           @sysvar::Stimulus::RampTimeUp, 
                           @sysvar::Stimulus::RampTimeHigh, 
                           @sysvar::Stimulus::RampTimeDown, 
                           @sysvar::Stimulus::RampTimeLow);
  
  mToggleId = StmCreate_Toggle(lStmMsg,
                               StmMsg::ToggleSig, 
                               @sysvar::Stimulus::ToggleCycleTime);

  mEnvVarId = StmCreate_EnvVar(lStmMsg,
                               StmMsg::EnvVarSig, 
                               EnvStmEnvVar, 
                               @sysvar::Stimulus::EnvVarCycleTime);

  mCSVId = StmCreate_CSV(lCSVMsg, CSVMsg::CSVSig, "TestServiceLibraryStm.csv");
}
/*@@end*/

/*@@startStart:Start:*/
on start
{
  gOutTime = @sysvar::Stimulus::OutTime;
  SetTimer(tOutStmMsg, gOutTime);
}
/*@@end*/

/*@@timer:tOutStmMsg:*/
on timer tOutStmMsg
{
  output(lStmMsg);
  output(lCSVMsg);
  SetTimer(this, gOutTime);
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::ApplyOutTime:*/
on sysvar_update sysvar::Stimulus::ApplyOutTime
{
  if(@this)
  {
    CancelTimer(tOutStmMsg);
    gOutTime = @sysvar::Stimulus::OutTime;
    SetTimer(tOutStmMsg, gOutTime);
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::CtrlCSV:*/
on sysvar_update sysvar::Stimulus::CtrlCSV
{
  long lRet;

  if(mCSVId)
  {
    if(@this)
    {
      lRet = StmControl_Start(mCSVId);
    }
    else
    {
      lRet = StmControl_Stop(mCSVId);
    }
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::CtrlEnvVar:*/
on sysvar_update sysvar::Stimulus::CtrlEnvVar
{
  long lRet;

  if(@this)
  {
    lRet = StmControl_Start(mEnvVarId);
  }
  else
  {
    lRet = StmControl_Stop(mEnvVarId);
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::CtrlRamp:*/
on sysvar_update sysvar::Stimulus::CtrlRamp
{
  long lRet;

  if(@this)
  {
    lRet = StmControl_Start(mRampId);
  }
  else
  {
    lRet = StmControl_Stop(mRampId);
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::CtrlToggle:*/
on sysvar_update sysvar::Stimulus::CtrlToggle
{
  long lRet;

  if(@this)
  {
    lRet = StmControl_Start(mToggleId);
  }
  else
  {
    lRet = StmControl_Stop(mToggleId);
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::EnvVarApply:*/
on sysvar_update sysvar::Stimulus::EnvVarApply
{
  long lRet;

  if(@this)
  {
    if(mEnvVarId)
    {
      lRet = StmControl_Destroy(mEnvVarId);
      mEnvVarId = 0;
    }

    mEnvVarId = StmCreate_EnvVar(lStmMsg,
                                 StmMsg::EnvVarSig, 
                                 EnvStmEnvVar, 
                                 @sysvar::Stimulus::EnvVarCycleTime);

    if(@sysvar::Stimulus::CtrlEnvVar && mEnvVarId)
      lRet = StmControl_Start(mEnvVarId);
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::RampApply:*/
on sysvar_update sysvar::Stimulus::RampApply
{
  long lRet;

  if(@this)
  {
    if(mRampId)
    {
      lRet = StmControl_Destroy(mRampId);
      mRampId = 0;
    }

    mRampId = StmCreate_Ramp(lStmMsg,
                             StmMsg::RampSig, 
                             @sysvar::Stimulus::RampValueA, 
                             @sysvar::Stimulus::RampValueB, 
                             @sysvar::Stimulus::RampCycleTime, 
                             @sysvar::Stimulus::RampTimeUp, 
                             @sysvar::Stimulus::RampTimeHigh, 
                             @sysvar::Stimulus::RampTimeDown, 
                             @sysvar::Stimulus::RampTimeLow);

    if(@sysvar::Stimulus::CtrlRamp && mRampId)
    {
      lRet = StmControl_Start(mRampId);
    }
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::ResetCSV:*/
on sysvar_update sysvar::Stimulus::ResetCSV
{
  long lRet;

  if(@this)
  {
    if(mCSVId)
      lRet = StmControl_Reset(mCSVId);
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::ResetEnvVar:*/
on sysvar_update sysvar::Stimulus::ResetEnvVar
{
  long lRet;

  if(@this)
  {
    if(mEnvVarId)
      lRet = StmControl_Reset(mEnvVarId);
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::ResetRamp:*/
on sysvar_update sysvar::Stimulus::ResetRamp
{
  long lRet;

  if(@this)
  {
    if(mRampId)
      lRet = StmControl_Reset(mRampId);
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::ResetToggle:*/
on sysvar_update sysvar::Stimulus::ResetToggle
{
  long lRet;

  if(@this)
  {
    if(mToggleId)
      lRet = StmControl_Reset(mToggleId);
  }
}
/*@@end*/

/*@@sysvarUpdate:Stimulus::ToggleApply:*/
on sysvar_update sysvar::Stimulus::ToggleApply
{
  long lRet;

  if(@this)
  {
    if(mToggleId)
    {
      lRet = StmControl_Destroy(mToggleId);
      mToggleId = 0;
    }

    mToggleId = StmCreate_Toggle(lStmMsg, StmMsg::ToggleSig, @sysvar::Stimulus::ToggleCycleTime);

    if(@sysvar::Stimulus::CtrlToggle && mToggleId)
    {
      lRet = StmControl_Start(mToggleId);
    }
  }
}
/*@@end*/

