/* Driving a (remote control) model car with an EyeBot     */

/* Thomas Braunl, The Univ. of Auckland, New Zealand, 2000 */



#include "eyebot.h"

#define STEER_CHANNEL 2

#define PCONST 1



int steer_angle,steer_current,ad_current;

MotorHandle MSteer;

int adjust;



void IRQSteer();



TimerHandle STEERInit()

{

  MSteer=MOTORInit(RIGHTMOTOR);

  return OSAttachTimer(5,IRQSteer);

}



int STEERRelease(TimerHandle h)

{ int i;

  i=OSDetachTimer(h);

  MOTORRelease(MSteer);

  return i;

}



/* direction: -100 left 0 straight 100 right */

int STEERSet(TimerHandle h, int direction)

{

  if (&h==NULL) return -1;

  steer_angle=direction;

  return 0;

}



/* Control routinue */

/*

void IRQSteer() 

{

 

  

  ad_current=OSGetAD(STEER_CHANNEL);

  steer_current=(ad_current-400)/3-100;

  adjust=(steer_angle-steer_current)*PCONST;

  if (adjust<-100) adjust=-100; else

  if (adjust> 100) adjust= 100;   

  MOTORDrive(MSteer,adjust);

}

*/



void IRQSteer() 

{

  ad_current=OSGetAD(STEER_CHANNEL);

  steer_current=(ad_current-400)/3-100;

  if (steer_angle-steer_current >  10) MOTORDrive(MSteer,  75); else

  if (steer_angle-steer_current < -10) MOTORDrive(MSteer, -75); else

  MOTORDrive(MSteer,0);

}



int main()

{

TimerHandle h;

char z;

int direction;



  LCDMode(SCROLLING|NOCURSOR);

  LCDMenu("<< "," ^ "," >>","End");

  h=STEERInit();



  direction=0;



  do

  {

    z=KEYRead();

    switch (z) 

    {

      case KEY1:direction-=10; if (direction<-100) direction=-100;break;

      case KEY2:direction=0; break;

      case KEY3:direction+=10; if (direction> 100) direction=100; break;

      case KEY4:break;

    }

    STEERSet(h,direction);

    LCDSetPos(0,0);

  

    LCDPrintf("Desire: %4d\n",direction);

    LCDPrintf("Current:%4d\n",steer_current);

    LCDPrintf("AD: %5d\n",ad_current);

    LCDPrintf("Adj: %5d\n",adjust);

  } while (z!=KEY4);

  

  STEERRelease(h);

  return (0);

}



