text: /* RETROgames 2015 WS example code with working timer and
     already build some features needed for the game. Very simple
     and can easily made better.
  
     Based on Nokia 5100 LCD Example Code by: Jim Lindblom and Nathan Seidle
     RETROgames additions (button controls and timers) by Toni Heikkinen
     date: 26.9.2015
     license: Beerware. Feel free to use, reuse, and modify this
     code as you see fit. If you find it useful, and we meet someday,
     you can buy me a beer.
    
      Graphic LCD Pin ---------- Arduino/Galileo Pin
         1-VCC       ----------------  5V
         2-GND       ----------------  GND
         3-SCE       ----------------  6
         4-RST       ----------------  5
         5-D/C       ----------------  7
         6-DN(MOSI)  ----------------  11
         7-SCLK      ----------------  13
         8-LED       - 330 Ohm res --  9
     The SCLK, DN(MOSI), must remain where they are, but the other
     pins can be swapped. The LED pin should remain a PWM-capable
     pin. Don't forget to stick a current-limiting resistor in line
     between the LCD's LED pin and Arduino pin 9!
  */
  #ifndef DEFINITIONS_H
  #define DEFINITIONS_H
  
  /* PCD8544-specific defines: */
  #define LCD_COMMAND  0
  #define LCD_DATA     1
  
  /* 84x48 LCD Defines: */
  #define LCD_WIDTH   84 // Note: x-coordinates go wide
  #define LCD_HEIGHT  48 // Note: y-coordinates go high
  #define WHITE       0  // For drawing pixels. A 0 draws white.
  #define BLACK       1  // A 1 draws black.
  
  /* Pin definitions:
  Most of these pins can be moved to any digital or analog pin.
  DN(MOSI)and SCLK should be left where they are (SPI pins). The
  LED (backlight) pin should remain on a PWM-capable pin. */
  const int scePin = 6;   // SCE - Chip select, pin 3 on LCD.
  const int rstPin = 5;   // RST - Reset, pin 4 on LCD.
  const int dcPin = 7;    // DC - Data/Command, pin 5 on LCD.
  const int sdinPin = 11;  // DN(MOSI) - Serial data, pin 6 on LCD.
  const int sclkPin = 13;  // SCLK - Serial clock, pin 7 on LCD.
  const int blPin = 9;    // LED - Backlight LED, pin 8 on LCD.
  
  // Button definitions
  const int butLeft = 1;
  const int butRight = 3;
  const int butUp = 4;
  const int butDown = 0;
  const int butJoy = 2;
  
  // Joystick
  const int joyY = A0;
  const int joyX = A1;
  
  // Joystick inputvalues
  volatile int valueJoyX = 0;
  volatile int valueJoyY = 0;
  const int zeroJoyX = 355;
  const int zeroJoyY = 355;
  
  // Button last state:
  int butLeftLast = HIGH;
  int butRightLast = HIGH;
  int butDownLast = HIGH;
  int butUpLast = HIGH;
  int butJoyLast = HIGH;
  
  volatile int pushedButton = 0;
  volatile byte direction = 0;
  volatile int xPos = 0;
  volatile int yPos = 0;
  
  struct Pong {
    int x;
    int y;
  };
  const int ANGLES[][2] = {
    {0, 2},   // 1, north
    {1, 2},   // 2
    {2, 2},   // 3
    {2, 1},   // 4
    {2, 0},   // 5, east
    {2, -1},  // 6
    {2, -2},  // 7
    {1, -2},  // 8
    {0, -2},  // 9, south
    {-1, -2}, // 10
    {-2, -2}, // 11
    {-2, -1}, // 12 
    {-2, 0},  // 13, west
    {-2, 1},  // 14
    {-2, 2},  // 15
    {-1, 2}   // 16
  };
  
  struct Ball {
    int x, y, angle;
  };
  struct Pong p1 = {2, 10};
  struct Pong p2 = {80, 10};
  struct Ball ball = {41, 25, 0};
  
  /* Font table:
  This table contains the hex values that represent pixels for a
  font that is 5 pixels wide and 8 pixels high. Each byte in a row
  represents one, 8-pixel, vertical column of a character. 5 bytes
  per character. */
  static const byte ASCII[][5] = {
    // First 32 characters (0x00-0x19) are ignored. These are
    // non-displayable, control characters.
     {0x00, 0x00, 0x00, 0x00, 0x00} // 0x20
    ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 0x21 !
    ,{0x00, 0x07, 0x00, 0x07, 0x00} // 0x22 "
    ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 0x23 #
    ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 0x24 $
    ,{0x23, 0x13, 0x08, 0x64, 0x62} // 0x25 %
    ,{0x36, 0x49, 0x55, 0x22, 0x50} // 0x26 &
    ,{0x00, 0x05, 0x03, 0x00, 0x00} // 0x27 '
    ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 0x28 (
    ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 0x29 )
    ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 0x2a *
    ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 0x2b +
    ,{0x00, 0x50, 0x30, 0x00, 0x00} // 0x2c ,
    ,{0x08, 0x08, 0x08, 0x08, 0x08} // 0x2d -
    ,{0x00, 0x60, 0x60, 0x00, 0x00} // 0x2e .
    ,{0x20, 0x10, 0x08, 0x04, 0x02} // 0x2f /
    ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 0x30 0
    ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 0x31 1
    ,{0x42, 0x61, 0x51, 0x49, 0x46} // 0x32 2
    ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 0x33 3
    ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 0x34 4
    ,{0x27, 0x45, 0x45, 0x45, 0x39} // 0x35 5
    ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 0x36 6
    ,{0x01, 0x71, 0x09, 0x05, 0x03} // 0x37 7
    ,{0x36, 0x49, 0x49, 0x49, 0x36} // 0x38 8
    ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 0x39 9
    ,{0x00, 0x36, 0x36, 0x00, 0x00} // 0x3a :
    ,{0x00, 0x56, 0x36, 0x00, 0x00} // 0x3b ;
    ,{0x08, 0x14, 0x22, 0x41, 0x00} // 0x3c <
    ,{0x14, 0x14, 0x14, 0x14, 0x14} // 0x3d =
    ,{0x00, 0x41, 0x22, 0x14, 0x08} // 0x3e >
    ,{0x02, 0x01, 0x51, 0x09, 0x06} // 0x3f ?
    ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 0x40 @
    ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 0x41 A
    ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 0x42 B
    ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 0x43 C
    ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 0x44 D
    ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 0x45 E
    ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 0x46 F
    ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 0x47 G
    ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 0x48 H
    ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 0x49 I
    ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 0x4a J
    ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 0x4b K
    ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 0x4c L
    ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 0x4d M
    ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 0x4e N
    ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 0x4f O
    ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 0x50 P
    ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 0x51 Q
    ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 0x52 R
    ,{0x46, 0x49, 0x49, 0x49, 0x31} // 0x53 S
    ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 0x54 T
    ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 0x55 U
    ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 0x56 V
    ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 0x57 W
    ,{0x63, 0x14, 0x08, 0x14, 0x63} // 0x58 X
    ,{0x07, 0x08, 0x70, 0x08, 0x07} // 0x59 Y
    ,{0x61, 0x51, 0x49, 0x45, 0x43} // 0x5a Z
    ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 0x5b [
    ,{0x02, 0x04, 0x08, 0x10, 0x20} // 0x5c \
    ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 0x5d ]
    ,{0x04, 0x02, 0x01, 0x02, 0x04} // 0x5e ^
    ,{0x40, 0x40, 0x40, 0x40, 0x40} // 0x5f _
    ,{0x00, 0x01, 0x02, 0x04, 0x00} // 0x60 `
    ,{0x20, 0x54, 0x54, 0x54, 0x78} // 0x61 a
    ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 0x62 b
    ,{0x38, 0x44, 0x44, 0x44, 0x20} // 0x63 c
    ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 0x64 d
    ,{0x38, 0x54, 0x54, 0x54, 0x18} // 0x65 e
    ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 0x66 f
    ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 0x67 g
    ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 0x68 h
    ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 0x69 i
    ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 0x6a j
    ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 0x6b k
    ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 0x6c l
    ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 0x6d m
    ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 0x6e n
    ,{0x38, 0x44, 0x44, 0x44, 0x38} // 0x6f o
    ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 0x70 p
    ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 0x71 q
    ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 0x72 r
    ,{0x48, 0x54, 0x54, 0x54, 0x20} // 0x73 s
    ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 0x74 t
    ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 0x75 u
    ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 0x76 v
    ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 0x77 w
    ,{0x44, 0x28, 0x10, 0x28, 0x44} // 0x78 x
    ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 0x79 y
    ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 0x7a z
    ,{0x00, 0x08, 0x36, 0x41, 0x00} // 0x7b {
    ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 0x7c |
    ,{0x00, 0x41, 0x36, 0x08, 0x00} // 0x7d }
    ,{0x10, 0x08, 0x08, 0x10, 0x08} // 0x7e ~
    ,{0x78, 0x46, 0x41, 0x46, 0x78} // 0x7f DEL
  };
  
  /* The displayMap variable stores a buffer representation of the
  pixels on our display. There are 504 total bits in this array,
  same as how many pixels there are on a 84 x 48 display.
  
  Each byte in this array covers a 8-pixel vertical block on the
  display. Each successive byte covers the next 8-pixel column over
  until you reach the right-edge of the display and step down 8 rows.
  
  To update the display, we first have to write to this array, then
  call the updateDisplay() function, which sends this whole array
  to the PCD8544.
  
  Because the PCD8544 won't let us write individual pixels at a
  time, this is how we can make targeted changes to the display. */
  byte displayMap[LCD_WIDTH * LCD_HEIGHT / 8] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xC0,
  0x20, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x00, 0x40, 0x40,
  0x40, 0x80, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x80, 0x40, 0x40, 0x80, 0x00, 0x00, 0xC0, 0x80, 0x40,
  0x40, 0x80, 0x00, 0x00, 0x80, 0x40, 0x40, 0x80, 0x00, 0x00, 0xC0, 0x80, 0x40, 0x00, 0x80, 0x40,
  0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x08,
  0x08, 0x00, 0x00, 0x03, 0x04, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00,
  0x00, 0x00, 0x06, 0x09, 0x09, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00,
  0x00, 0x3F, 0x08, 0x08, 0x08, 0x07, 0x00, 0x00, 0x07, 0x09, 0x09, 0x09, 0x00, 0x00, 0x0F, 0x00,
  0x00, 0x00, 0x07, 0x09, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x10, 0x08, 0x08, 0xF0,
  0x00, 0x00, 0xF8, 0x10, 0x08, 0x00, 0xF0, 0x28, 0x28, 0x30, 0x00, 0x00, 0x10, 0x28, 0xC8, 0x00,
  0x00, 0xF0, 0x28, 0x28, 0x30, 0x00, 0x00, 0xF8, 0x10, 0x08, 0x08, 0xF0, 0x00, 0x08, 0xFE, 0x08,
  0x08, 0x00, 0x10, 0x28, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
  0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00,
  0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
  0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  };
  
  #endif
  