/* **********************************************
| Omnidirectional Drive - Mecanum Wheels
| Example for using MOTOR and QUAD functions for
| driving a vehicle with OMNI_DRIVE steering
|
| Thomas Braunl, 2004, 2005
| ---------------------------------------------------------------------------
*/ 

#include "eyebot.h"
MotorHandle motor_fl, motor_fr, motor_bl, motor_br;
QuadHandle  quad_fl, quad_fr, quad_bl, quad_br;
  
void Minit()
/* Initialize motors and encoders */
{ motor_fl = MOTORInit(MOTOR_FL);
  motor_fr = MOTORInit(MOTOR_FR);
  motor_bl = MOTORInit(MOTOR_BL);
  motor_br = MOTORInit(MOTOR_BR);
  quad_fl  = QUADInit(QUAD_FL);
  quad_fr  = QUADInit(QUAD_FR);
  quad_bl  = QUADInit(QUAD_BL);
  quad_br  = QUADInit(QUAD_BR);
  
  if(!motor_fl || !motor_fr || !motor_bl || !motor_br ||
     !quad_fl || !quad_fr || !quad_bl || !quad_br) 
    LCDPrintf("Init Error!\n");
}
 
void Mterm()
/* Release motors and encoders */
{ MOTORRelease(motor_fl|motor_fr|motor_bl|motor_br);
  QUADRelease (quad_fl|quad_fr|quad_bl|quad_br);
}

void Mdrive(char* txt, int Fleft, int Fright, int Bleft, int Bright)
/* Print txt and drive motors and encoders for 1.5s */
{ LCDPrintf("%s\n", txt);
  MOTORDrive(motor_fl,Fleft);
  MOTORDrive(motor_fr,Fright);
  MOTORDrive(motor_bl,Bleft);
  MOTORDrive(motor_br,Bright);
  OSWait(150);
  LCDPrintf("Enc.%5d %5d\n    %5d %5d\n",
   QUADRead(quad_fl), QUADRead(quad_fr), QUADRead(quad_bl), QUADRead(quad_br));
}


int main ()
{ LCDPutString("Mecanum Wheels\n");
  Minit();
	
  Mdrive("Forward",     60, 60, 60, 60);
  Mdrive("Backward",   -60,-60,-60,-60);
  Mdrive("Left",       -60, 60, 60,-60);
  Mdrive("Right",       60,-60,-60, 60);
  Mdrive("Left45",       0, 60, 60,  0);
  Mdrive("Right45",     60,  0,  0, 60);
  Mdrive("Turn Spot L",-60, 60,-60, 60);
  Mdrive("Turn Spot R", 60,-60, 60,-60);
  Mdrive("Stop",         0,  0,  0,  0);
  
  Mterm();
  return 0;
}

