#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include "xc.h"
#include "math.h"
#include "UART.h"
#include "extern.h"
#include "conv.h"
#include "config.h"
#include "CalibrationConstants.h"



/*********************************************************/
/*  This routine Controls the PWM signals that activate Relay that controls the
 * Bender Ground fault detector.
 *
 * The Bender is programed to cycle on and off at a low duty cycle in auto mode,
 * unless the user has specifically asked for ON or OFF.  To turn it on this routine
 * applies a high duty cycle to turn it on, then backs the duty cycle off to hold it open.
 *
 *
 *
 *
 *
 *
 *
 ****************************************************/

void TurnBenderOn(void)
{
  //    char s[256];
  //  sprintf(s,"turning bender on  \r\n"); putsU1(s);
    BENDER_OUTPUT = 1;
}

void TurnBenderOff(void)
{
  ///  char s[256];
   // sprintf(s,"turning bender off  \r\n"); putsU1(s);
    BENDER_OUTPUT = 0;

}

void SetClrBenderRelay()
{
  static int first_time = 1;
  static unsigned int bender_on_ctr;
  static unsigned long int bender_period_ctr;

  static unsigned long ctr;
 // char s[255];

  if(first_time)  //Compute voltages and times in fractional units
      {
      bender_on_ctr = BENDER_ON_TIME * CAN_PACKET_RATE;
      bender_period_ctr = BENDER_PERIOD_TIME * CAN_PACKET_RATE;
      TurnBenderOn();

      Status.bits.BenderRequest = 2;  //Cause to start up in auto mode, cyling as needed.
      Status.bits.Bender = 2;
      first_time = 0;
      }
 
  if((Status.bits.BenderRequest == 0) && (Status.bits.Bender != 0))       //Status.bits.BenderRequest  1=on, 0 = off, or 2=auto
  {
    // sprintf(s,"turning bender off  \r\n"); putsU1(s);
     /* Turn Bender Off because user says so*/
      TurnBenderOff();
      Status.bits.Bender = 0;  //Reflect change in status bits
  }


  if((Status.bits.BenderRequest == 1) && (Status.bits.Bender != 1))  //Status.bits.BenderRequest  1=on, 0 = off, or 2=auto
  {
     //sprintf(s,"turning bender on  \r\n"); putsU1(s);
     /* Turn Bender On because user says so*/
     TurnBenderOn();
     Status.bits.Bender = 1;  //Reflect change in status bits
  }


  if((Status.bits.BenderRequest == 2) && (Status.bits.Bender == 2))  //Continue auto mode.
  {
        if(++ctr == bender_on_ctr)   //At end of on period, turn off bender
           TurnBenderOff();
        if(ctr == bender_period_ctr)
        {
            TurnBenderOn();
            ctr = 0L;
        }
  }

  if((Status.bits.BenderRequest == 2) && (Status.bits.Bender != 2))  //Enter auto mode.
  {
  //   sprintf(s,"Entering Auto Mode  \r\n"); putsU1(s);
      Status.bits.Bender = 2;  //Reflect change in status bits
      TurnBenderOn();
      ctr = 0L;
  }


  return;

}


