/**************************************************************************

TapeSensors.c

ME 218B Project Hats Off

Team Firefox

March 7, 2010

 

Robot uses 7 tape sensors to track and align with tape on the floor.

***************************************************************************/

/*-------------------------- Include Files -------------------------------*/

#include "TapeSensors.h"

 

typedef enum {    WHITE = 0,

                  BLACK = 1

            } TAPE_Color_t;

 

/*-------------------------- Module Definitions -----------------------------*/

/*-------------------------- Module Functions -----------------------------*/

/*-------------------------- Module Variables -----------------------------*/

static TAPE_Color_t lastReads[] = {0,0,0,0,0,0,0};    //1 = black, 0 = white

                                                      //keeps track of last read for each sensor for hysteresis

 

/*-------------------------- Module Cal Variables -------------------------*/

const static int thresWhite = 230; // white threshold = 150

const static int thresBlack = 320; // black threshold = 300

 

char Tape_isBlack(TAPE_Sensor_t tapeNum) {

      int rawValue;

      rawValue = ADS12_ReadADPin(tapeNum);

      if (lastReads[tapeNum] == WHITE) {

            if (rawValue > thresBlack) lastReads[tapeNum] = BLACK;

      }

      else {

            if (rawValue < thresWhite) lastReads[tapeNum] = WHITE;

      }

      return  (lastReads[tapeNum] == BLACK);

}

 

char Tape_isParallel(void) {

      return (Tape_isBlack(FRONT) && Tape_isBlack(CENTER) && Tape_isBlack(REAR));

}

 

char Tape_isPerp(void) {

      return (Tape_isBlack(CENTER) && Tape_isBlack(CENTER_LEFT) && Tape_isBlack(CENTER_RIGHT));

}

 

TAPE_TrackStatus_t Tape_getTrackStatus(void) {

      char combo;

      combo = 4*Tape_isBlack(FRONT_LEFT) + 2*Tape_isBlack(FRONT) + Tape_isBlack(FRONT_RIGHT);

      switch(combo) {

            case 0: return LOST; break;

            case 1: return WAY_LEFT; break;

            case 2: return ALIGNED; break;

            case 3: return LIL_LEFT; break;

            case 4: return WAY_RIGHT; break;

            case 5: return ERROR; break;

            case 6: return LIL_RIGHT; break;

            case 7: return INTERSECTION; break;

      }

}