/*
  L298 -- access L298 H-bridge using schip's board
  This code is in some domain.
 */
#include "L298.h"

/** Constructor -- setup pin usage for both channels
 **/
L298::L298()
{
  // initialize the L298 digital pins as outputs and clear them all
  //  note the logic, where ENable is used as a PWM signal if needed:
  //    ENable == LOW -> free run stop, all transistors OFF
  //    ENable == HIGH -> go man go
  pinMode( HBA_en, OUTPUT );     // A do this first to ensure the device is OFF
  digitalWrite( HBA_en, LOW);
  pinMode( HBA_dir, OUTPUT );     
  digitalWrite( HBA_dir, LOW);
  pinMode( HBB_en, OUTPUT );     // B do this first to ensure the device is OFF
  digitalWrite( HBB_en, LOW);
  pinMode( HBB_dir, OUTPUT );     
  digitalWrite( HBB_dir, LOW);

/** Done as a separate object in Trsw.cpp
  // also enable and turn off the transistor switches
  // they can now be used as regular switches with digitalWrite()
  //  or as PWM outputs with analogWrite()
  pinMode( TRSWA, OUTPUT );     // A
  digitalWrite( TRSWA, LOW);
  pinMode( TRSWB, OUTPUT );     // B
  digitalWrite( TRSWB, LOW);
  pinMode( TRSWC, OUTPUT );     // C
  digitalWrite( TRSWC, LOW);
  pinMode( TRSWD, OUTPUT );     // D
  digitalWrite( TRSWD, LOW);
**/

  return;
}

// note: PWM implemented //

/** run forward
 *  @param m -- motor number 0=A, 1=B
 *  @param s -- pwm speed 1 to 255 min-max, 0 is stop
 */
void L298::runFwd( uint8_t m, uint8_t s )
{
  if( m == 0 )
  {
	  digitalWrite( HBA_dir, HIGH );
	  analogWrite(  HBA_en, s );
  }
  else if ( m == 1 )
  {
	  digitalWrite( HBB_dir, HIGH );
	  analogWrite(  HBB_en, s );
  }

  return;
}

/* run backward
 *  @param m -- motor number 0=A, 1=B
 *  @param s -- pwm speed
 */
void L298::runBkd( uint8_t m, uint8_t s )
{
  if( m == 0 )
  {
	  digitalWrite( HBA_dir, LOW );
	  analogWrite(  HBA_en, s );
  }
  else if ( m == 1 )
  {
	  digitalWrite( HBB_dir, LOW );
	  analogWrite(  HBB_en, s );
  }

  return;
}

/* setSpeed -- speed is implemented with PWM...
 *  @param m -- motor number 0=A, 1=B
 *  @param s -- pwm speed
 */
void L298::setSpeed(  uint8_t m, uint8_t s )
{
  if( m == 0 )
  {
	  analogWrite(  HBA_en, s );
  }
  else if ( m == 1 )
  {
	  analogWrite(  HBB_en, s );
  }

  return;
}

/* disable outputs, does free-stop due to C&D pin combination
 *  @param m -- motor number 0=A, 1=B
 */
void L298::stop( uint8_t m )
{
  if( m == 0 )
  {
	  digitalWrite( HBA_en, LOW );
  }
  else if ( m == 1 )
  {
	  digitalWrite( HBB_en, LOW );
  }

  return;
}
