/* 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; }