/*@!Encoding:1252*/

// AL_Stepper

includes
{
  #include "AL_Output.cin"
}


variables
{
  // stepper is card '6': 0=1A, 1=2A, 2=2B, 3=1B
  const word cRlyStp_1A = 24; // ECU-Pin - ALTU-Input - Con-Cab '34' / '0' / blue
  const word cRlyStp_2A = 25; // ECU-Pin - ALTU-Input - Con-Cab '35' / '1' / gray
  const word cRlyStp_2B = 26; // ECU-Pin - ALTU-Input - Con-Cab '46' / '2' / yellow
  const word cRlyStp_1B = 27; // ECU-Pin - ALTU-Input - Con-Cab '45' / '3' / brown
  
  // plug green: Misc (top)
  // plug blue:  GND  (middle)
  // plug red:   Batt (bottom)
  
  word cStartupDelay = 750;
  msTimer StartupDelay;
  
  msTimer SC_Delay_1;
  msTimer SC_Delay_2;
}


on start
{
  setTimer(StartupDelay, cStartupDelay);
}

on preStop // stopMeasurement
{
  int idx;
  for(idx = 0; idx < 39; idx++)
  {
    RelayHelper_SC1_GND (idx, 0);
    RelayHelper_SC2_Batt(idx, 0);
    RelayHelper_SC3_Misc(idx, 0);
  }
  RelayHelper_OL(cRlyStp_1A, 0);
  RelayHelper_OL(cRlyStp_1B, 0);
  RelayHelper_OL(cRlyStp_2A, 0);
  RelayHelper_OL(cRlyStp_2B, 0);
}

int IsStartup()
{
  // debug: return 0;
  return (MilliSecondsSinceCANoeStart() < (cStartupDelay+100)) ? 1 : 0;
}

on timer StartupDelay
{
  @AL_Stepper::SetAllOk = 1;
}


on sysvar_update AL_Stepper::Out1_SC_AB
{
  int idx;
  OutputHelper(this);
  for(idx = 0; idx < 39; idx++)
    RelayHelper_SC3_Misc(idx, 0);
  if ((@AL_Stepper::Out1_SC_AB == 1) && (@AL_Stepper::Out2_SC_AB == 1))
  {
    @AL_Stepper::Out2_SC_AB = 0;

    // workaround
    cancelTimer(SC_Delay_1);
    cancelTimer(SC_Delay_2);
    setTimer(SC_Delay_1, 5); // now
  }
  RelayHelper_SC3_Misc(cRlyStp_1A, @this);
  RelayHelper_SC3_Misc(cRlyStp_1B, @this);
}
on sysvar_update AL_Stepper::Out2_SC_AB
{
  int idx;
  OutputHelper(this);
  for(idx = 0; idx < 39; idx++)
    RelayHelper_SC3_Misc(idx, 0);
  if ((@AL_Stepper::Out1_SC_AB == 1) && (@AL_Stepper::Out2_SC_AB == 1))
  {
    @AL_Stepper::Out1_SC_AB = 0;

    // workaround
    cancelTimer(SC_Delay_1);
    cancelTimer(SC_Delay_2);
    setTimer(SC_Delay_2, 5); // now
  }
  RelayHelper_SC3_Misc(cRlyStp_2A, @this);
  RelayHelper_SC3_Misc(cRlyStp_2B, @this);
}
on timer SC_Delay_1
{
  cancelTimer(SC_Delay_1);
  cancelTimer(SC_Delay_2);
  RelayHelper_SC3_Misc(cRlyStp_1A, 1);
  RelayHelper_SC3_Misc(cRlyStp_1B, 1);
}
on timer SC_Delay_2
{
  cancelTimer(SC_Delay_1);
  cancelTimer(SC_Delay_2);
  RelayHelper_SC3_Misc(cRlyStp_2A, 1);
  RelayHelper_SC3_Misc(cRlyStp_2B, 1);
}


on sysvar_update AL_Stepper::Out1A_OL
{
  OutputHelper(this);
  RelayHelper_OL(cRlyStp_1A, @this);
}
on sysvar_update AL_Stepper::Out1B_OL
{
  OutputHelper(this);
  RelayHelper_OL(cRlyStp_1B, @this);
}
on sysvar_update AL_Stepper::Out2A_OL
{
  OutputHelper(this);
  RelayHelper_OL(cRlyStp_2A, @this);
}
on sysvar_update AL_Stepper::Out2B_OL
{
  OutputHelper(this);
  RelayHelper_OL(cRlyStp_2B, @this);
}


on sysvar_update AL_Stepper::Out1A_SC_GND
{
  OutputHelper(this);
  RelayHelper_SC1_GND(cRlyStp_1A, @this);
}
on sysvar_update AL_Stepper::Out1B_SC_GND
{
  OutputHelper(this);
  RelayHelper_SC1_GND(cRlyStp_1B, @this);
}
on sysvar_update AL_Stepper::Out2A_SC_GND
{
  OutputHelper(this);
  RelayHelper_SC1_GND(cRlyStp_2A, @this);
}
on sysvar_update AL_Stepper::Out2B_SC_GND
{
  OutputHelper(this);
  RelayHelper_SC1_GND(cRlyStp_2B, @this);
}


on sysvar_update AL_Stepper::Out1A_SC_Batt
{
  OutputHelper(this);
  RelayHelper_SC2_Batt(cRlyStp_1A, @this);
}
on sysvar_update AL_Stepper::Out1B_SC_Batt
{
  OutputHelper(this);
  RelayHelper_SC2_Batt(cRlyStp_1B, @this);
}
on sysvar_update AL_Stepper::Out2A_SC_Batt
{
  OutputHelper(this);
  RelayHelper_SC2_Batt(cRlyStp_2A, @this);
}
on sysvar_update AL_Stepper::Out2B_SC_Batt
{
  OutputHelper(this);
  RelayHelper_SC2_Batt(cRlyStp_2B, @this);
}


void RelayHelper_OL(word relayIndex, int state)
{
  @sys_Control::anRelay_OL[relayIndex] = state;
}
void RelayHelper_SC1_GND(word relayIndex, int state)
{
  @sys_Control::anRelay_SC1[relayIndex] = state;
}
void RelayHelper_SC2_Batt(word relayIndex, int state)
{
  @sys_Control::anRelay_SC2[relayIndex] = state;
}
void RelayHelper_SC3_Misc(word relayIndex, int state)
{
  @sys_Control::anRelay_SC3[relayIndex] = state;
}


void OutputHelper(sysvarInt * sysVarStpErrHndlng)
{
  if(IsStartup() == 0)
    Output("Err-Hndlng: %s: '%d'", sysVarStpErrHndlng.name, @sysVarStpErrHndlng);
}
void OutputHelper2(sysvarInt * sysVarStpErrHndlng)
{
  if(IsStartup() == 0)
    Output("Err-Hndlng: '%s'", sysVarStpErrHndlng.name);
}


on sysvar AL_Stepper::SetAutoRandomErrorsStop
{
  if (@this == 0)
    return;
  @this = 0; // reset

  OutputHelper2(this);
}


on sysvar AL_Stepper::SetAllOk
{
  if (@this == 0)
    return;
  @this = 0; // reset

  OutputHelper2(this);

  @AL_Stepper::SetAutoRandomErrorsStop = 1;

  @AL_Stepper::Out1_SC_AB = 0;
  @AL_Stepper::Out2_SC_AB = 0;

  // checkboxes ARE checked -> ALL connected
  @AL_Stepper::Out1A_OL = 1;
  @AL_Stepper::Out1B_OL = 1;
  @AL_Stepper::Out2A_OL = 1;
  @AL_Stepper::Out2B_OL = 1;

  @AL_Stepper::Out1A_SC_GND = 0;
  @AL_Stepper::Out1B_SC_GND = 0;
  @AL_Stepper::Out2A_SC_GND = 0;
  @AL_Stepper::Out2B_SC_GND = 0;

  @AL_Stepper::Out1A_SC_Batt = 0;
  @AL_Stepper::Out1B_SC_Batt = 0;
  @AL_Stepper::Out2A_SC_Batt = 0;
  @AL_Stepper::Out2B_SC_Batt = 0;
}


on sysvar AL_Stepper::SetOpenAll
{
  if (@this == 0)
    return;
  @this = 0; // reset

  OutputHelper2(this);

  // checkboxes NOT checked -> NOT connected
  @AL_Stepper::Out1A_OL = 0;
  @AL_Stepper::Out1B_OL = 0;
  @AL_Stepper::Out2A_OL = 0;
  @AL_Stepper::Out2B_OL = 0;
}

// EOF
