      - Grey   : Switch 1                     |   Pin: PB3
      - White  : Switch 2                     |   Pin: PB2
      - Black  : Switch 3                     |   Pin: PB1
+   --------------------------------------------------------------------------------
+   Latest additions:
+     - 2016-01-28: Software switch debouncing
    ================================================================================ */
 
 // =================================================================================
 // Type definition
 // =================================================================================
-typedef struct
+
+#ifndef DEBOUNCE_THREASHOLD
+#define DEBOUNCE_THREASHOLD 50
+#endif
+
+// =================================================================================
+// Type definition
+// =================================================================================
+typedef struct ENCODER_
 {
-  int8_t  coordinate = 0;
-  uint8_t index      = 0;
+  int8_t  coordinate;
+  uint8_t index;
 } ENCODER_;
+
+typedef struct BUTTON_
+{
+  boolean state;
+  boolean needUpdate;
+  char    button;
+  byte    bitmask;
+  long    lastDebounceTime;
+} BUTTON_;
 
 // =================================================================================
 // Constant definition

// =================================================================================
// Volatile variables
// =================================================================================
volatile ENCODER_ xAxis;
volatile ENCODER_ yAxis;
volatile boolean leftButton   = false;
volatile boolean middleButton = false;
volatile boolean rightButton  = false;

// =================================================================================
// Setup function

  // ---------------------------------
  // Left mouse button state update
  // ---------------------------------
  ReadButton(leftButton);
  UpdateButton(leftButton);

  // ---------------------------------
  // Right mouse button state update
  // ---------------------------------  
  ReadButton(rightButton);
  UpdateButton(rightButton);
  
  // ---------------------------------
  // Middle mouse button state update
  // ---------------------------------
  ReadButton(middleButton);
  UpdateButton(middleButton);

  // Wait a little before next update
  delay(10);
