/* This program implements a simple PingPong-game on four LED's */
/* simulating a moving ball. The ball is hit by the bat using   */
/* two switches for left hit and right hit.                     */
/* Author: Bengt Molin                                          */
/* 2013-01-27 ver 0.1                                           */

enum State   // States for state machine
  {
    IDLE,
    LEFT_SHIFT,
    RIGHT_SHIFT,
    SHOW_POINT,
    GAME_OVER
  };

enum Hit   // Pad hit
  {
    RIGHT_HIT,
    LEFT_HIT,
    NO_HIT
  };


int DelayOneStep(int State)
{
/* Sense switches in delay loop and return if pad hit ball during delay, input direction of ball
   RIGHT_HIT if state is IDLE or LEFT_SHIFT, LEFT_HIT if state is IDLE or RIGHT_SHIFT
   NO_HIT if no switch has been activated,ie. no button pressed  */
  
  if (State == IDLE) return RIGHT_HIT;  //Test
  if (State == LEFT_SHIFT) return LEFT_HIT; // Test
  if (State == RIGHT_SHIFT) return RIGHT_HIT;  // Test
}

void LightLed(int State, int Lednr)
{
  /* Turn on new LED and turn off old LED */
  // Not implemented yet
}

int main()
{
    int Lednr, Padhit, Rightpoint, Leftpoint;
    int State = IDLE;
    Rightpoint=0; Leftpoint=0; Lednr=0;    //Initiera variabler

    while (1) { 

         //Code for state transitions.  
        switch (State) 
        {
             case IDLE: 
               Padhit = DelayOneStep(State);
               if (Padhit==RIGHT_HIT) State = LEFT_SHIFT;
               if (Padhit==LEFT_HIT)  State = RIGHT_SHIFT;
               break;
               
             case LEFT_SHIFT: 
               Lednr= Lednr++;   // Light next
               LightLed(State,Lednr);  // LED
               Padhit=DelayOneStep(State);
               if ((Padhit==LEFT_HIT)&&(Lednr==4)) 
               {
                 State = RIGHT_SHIFT; // Return ball
                 Lednr= 0;  // Clear LED counter
               }
               else 
               if (((Padhit==LEFT_HIT)&&(Lednr<4)) || ((Padhit==NO_HIT)&&(Lednr>4)))
               {
                 Rightpoint = Rightpoint++; // Missed ball, points to Right player
                 State = SHOW_POINT;
               }

               break;

             case RIGHT_SHIFT: 
               Lednr= Lednr++;   // Light next
               LightLed(State,Lednr);  // LED
               Padhit=DelayOneStep(State);
               if ((Padhit==RIGHT_HIT)&&(Lednr==4)) 
                 {
                   State = LEFT_SHIFT; // Return ball
                   Lednr= 0; // Clear LED counter
                 }
               else 
               if (((Padhit==RIGHT_HIT)&&(Lednr<4)) || ((Padhit==NO_HIT)&&(Lednr>4)))
               {
                 Leftpoint = Leftpoint++; // Missed ball, points to Right player
                 State = SHOW_POINT;
               }

               break;

             case SHOW_POINT: // Show points on LED's
               if ((Rightpoint<4)&&(Leftpoint<4)) 
                 {
                   State = IDLE; 
                   // Show points on LED here, not implemented yet
                 }             
               else
                 State = GAME_OVER;
               break;
               
               case GAME_OVER: 
                // Not implemented yet
               break;
 
               
               default:        State = IDLE;    // This should never happen!
        }
    }
  return 0;
}