#include "MultitapKeypad.h"
#include <LiquidCrystal_I2C.h>

#define ENCODER_CLK 2
#define ENCODER_DT  3

#define I2C_ADDR    0x27
#define LCD_COLUMNS 16
#define LCD_LINES   2

const byte ROW0 = 5;
const byte ROW1 = 7;
const byte ROW2 = 8;
const byte COL0 = 9;
const byte COL1 = 4;
const byte COL2 = 6;
bool hold = false;
bool encoderCheck = false;
int encoder_value = 0;


// matrix 3 x 3 keypad and key for keypad object
MultitapKeypad kpd( ROW0, ROW1, ROW2, COL0, COL1, COL2);
Key key;
//screen init
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);



void setup() {
  lcd.init();
  lcd.backlight();
  pinMode(ENCODER_CLK, INPUT);          //pin2 for encoder clock
  pinMode(ENCODER_DT, INPUT);           //pin3 for encoder data
  attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
  Serial.begin(9600);
  Serial.println( F( "Keypad test" ) );
  lcd.print("Keypad test:");
  lcd.setCursor(0, 1); //x,y
  lcd.print("Press key");

}

void loop() {

  check_buttons();
  //Serial.println("go");
  if (encoderCheck) {
    Serial.println("encoder checker passed");
    encoderCheck = false;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Encoder ");
    lcd.setCursor(0, 1);
    lcd.print( encoder_value );
  }

}

void readEncoder() {
  int dtValue = digitalRead(ENCODER_DT);
  if (dtValue == HIGH) {
    encoderCheck = true;
    encoder_value++;
    Serial.println("++");
  }
  if (dtValue == LOW) {
    encoderCheck = true;
    encoder_value--;
    Serial.println("--");
  }
}

void check_buttons() {
  key = kpd.getKey();
  if ( key.character > 0 && key.character < 250) {
    switch ( key.state ) {
      case KEY_DOWN:
        hold = false;
        break;
      case LONG_TAP:
        hold = true;
        Serial.print( F( "Key " ) );
        Serial.print( char( key.character ) );
        Serial.println( F( " pressed long" ) );
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Key ");
        lcd.print( char( key.character ) );
        lcd.setCursor(0, 1);
        lcd.print( F( " pressed long" ) );
        break;
      case KEY_UP:
        if (!hold) {
          Serial.print( F( "Key " ) );
          Serial.print( char( key.character ) );
          Serial.println( F( " pressed short" ) );
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Key ");
          lcd.print( char( key.character ) );
          lcd.setCursor(0, 1);
          lcd.print( F( " pressed short" ) );
        }
        break;
    }
  }
}