bool Driving::read()

in atari_py/ale_interface/src/emucore/Driving.cxx [38:122]


bool Driving::read(DigitalPin pin)
{
  // Gray codes for clockwise rotation
  static const uInt8 clockwise[] = { 0x03, 0x01, 0x00, 0x02 };

  // Gray codes for counter-clockwise rotation
  static const uInt8 counterclockwise[] = { 0x03, 0x02, 0x00, 0x01 };

  // Delay used for moving through the gray code tables
    const uInt32 delay = 20;

  switch(pin)
  {
    case One:
      ++myCounter;

      if(myJack == Left)
      {
        if(myEvent.get(Event::DrivingZeroCounterClockwise) != 0)
        {
          return (counterclockwise[(myCounter / delay) & 0x03] & 0x01) != 0;
        }
        else if(myEvent.get(Event::DrivingZeroClockwise) != 0)
        {
          return (clockwise[(myCounter / delay) & 0x03] & 0x01) != 0;
        }
        else 
          return(myEvent.get(Event::DrivingZeroValue) & 0x01);
      }
      else
      {
        if(myEvent.get(Event::DrivingOneCounterClockwise) != 0)
        {
          return (counterclockwise[(myCounter / delay) & 0x03] & 0x01) != 0;
        }
        else if(myEvent.get(Event::DrivingOneClockwise) != 0)
        {
          return (clockwise[(myCounter / delay) & 0x03] & 0x01) != 0;
        }
        else 
          return(myEvent.get(Event::DrivingOneValue) & 0x01);
      }

    case Two:
      if(myJack == Left)
      {
        if(myEvent.get(Event::DrivingZeroCounterClockwise) != 0)
        {
          return (counterclockwise[(myCounter / delay) & 0x03] & 0x02) != 0;
        }
        else if(myEvent.get(Event::DrivingZeroClockwise) != 0)
        {
          return (clockwise[(myCounter / delay) & 0x03] & 0x02) != 0;
        }
        else 
          return(myEvent.get(Event::DrivingZeroValue) & 0x02);
      }
      else
      {
        if(myEvent.get(Event::DrivingOneCounterClockwise) != 0)
        {
          return (counterclockwise[(myCounter / delay) & 0x03] & 0x02) != 0;
        }
        else if(myEvent.get(Event::DrivingOneClockwise) != 0)
        {
          return (clockwise[(myCounter / delay) & 0x03] & 0x02) != 0;
        }
        else 
          return(myEvent.get(Event::DrivingOneValue) & 0x02);
      }

    case Three:
      return true;

    case Four:
      return true;

    case Six:
      return (myJack == Left) ? (myEvent.get(Event::DrivingZeroFire) == 0) : 
          (myEvent.get(Event::DrivingOneFire) == 0);

    default:
      return true;
  }
}