#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Adafruit_FT6206.h>
//#include <SPI.h>
#include <Wire.h>

#define TFT_DC 8
#define TFT_LED 9
#define TFT_CS 10
#define TFT_MOSI 11
#define TFT_MISO 12
#define TFT_SCK 13
//#define TFT_SDA 14
//#define TFT_SCL 15
#define TFT_RST PD3
//#define TOUCH_INT value
#define TS_I2C_ADDRESS 0x38

#define Inter_ex_A PB8
#define Pin_B PB9
#define SW PA5

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
Adafruit_FT6206 ts = Adafruit_FT6206();

int j=5, counter=1, pos=0, k=10;

String value;

boolean change=0, press=0;

//STM32Timer ITimer(TIM1);

char hello[] = {"Hello World!"};
char key[4][4]={
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

void Hello() {
    int lenght=strlen(hello);
    for(int i = 0;i<lenght;i++){
      tft.drawChar(j, 10, hello[i], ILI9341_GREEN, 10, 3);
      j=j+20;
    }
    tft.drawLine(5, 40, 230, 40, ILI9341_GREEN);
  }

void Frame(){
  tft.drawRect(10, 100, 190, 30, ILI9341_WHITE);
  tft.drawLine(110, 101, 110, 129, ILI9341_WHITE);
}


void Fill() {
  pos=counter+110;
  if(counter>0){
    tft.drawLine(pos, 101, pos, 128, ILI9341_GREEN);
    tft.drawLine(++pos, 101, pos, 128, ILI9341_BLACK);
  }
  else {
    if(counter<0) {
      tft.drawLine(pos, 101, pos, 128, ILI9341_RED);
      tft.drawLine(--pos, 101, pos, 128, ILI9341_BLACK);
    }
    else {
      tft.drawLine(pos, 101, pos, 128, ILI9341_WHITE);
      tft.drawLine(++pos, 101, pos--, 128, ILI9341_BLACK);
      tft.drawLine(--pos, 101, pos, 128, ILI9341_BLACK);
    }
  }
}

void handleInterrupt_Encoder() {
  change=true;
}
/*
void timerHandler() {
  press=true;
  Serial.println("Interrupt ist da!");
}
*/
String Translate(int num){
  String value = String(num);
  return(value);
}

void Counter(){
  tft.setTextSize(4);
  tft.setCursor(10, 55);
  if(digitalRead(Pin_B)==HIGH){
    counter--;
    value=Translate(counter);
    tft.setTextColor(ILI9341_RED);
    tft.fillRect(10, 55, 80, 30, ILI9341_BLACK);
    tft.print(value);
  }
  else {
    counter++;
    value=Translate(counter);
    tft.setTextColor(ILI9341_GREEN);
    tft.fillRect(10, 55, 80, 30, ILI9341_BLACK);
    tft.print(value);
  }
  change=false;
}
/*
void Search(){
  Serial.println("Start Searching");
  for(int i=0;i<4;i++){
    digitalWrite(i, LOW);
    for(int a=4;a<8;a++){
      if(digitalRead(a)==LOW){
        Serial.print(a);
        Serial.println(i);
        Write(a, i);
        break;
      }
    }
    digitalWrite(i, HIGH);
  }
}

void Write(int r, int c){
  if(k>220){
    k=10;
    tft.drawRect(10, 150, 230, 30, ILI9341_WHITE);
  }
  tft.drawChar(k, 150, key[r][c], ILI9341_PINK, 10, 3);
  k=k+20;
}
*/

void setup() {
  // put your setup code here, to run once:
  
  Serial.begin(115200);
  Serial.println("Hello, STM32!");
  
  tft.begin();
  //ts.begin();
  Hello();
  Frame();
  Counter();

  if(!ts.begin(TS_I2C_ADDRESS)){
    Serial.println("Touchscreen nicht gestartet!");
  }
/*
  for(int num=0;num<4;num++){
    pinMode(num, OUTPUT);
    digitalWrite(num, HIGH);
  }

  for(int num=4;num<8;num++){
    pinMode(num, INPUT_PULLUP);
    //attachInterrupt(digitalPinToInterrupt(num), handleInterrupt_Matrix, FALLING);
  }

  ITimer.setTimer(100);
  ITimer.attachInterrupt(timerHandler);
*/
  pinMode(Inter_ex_A, INPUT_PULLUP);
  pinMode(Pin_B, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(Inter_ex_A), handleInterrupt_Encoder, CHANGE);
  
}

void loop() {
  
  if(change){
    Counter();
    Fill();
  }

  if(ts.touched()){
    TS_Point p=ts.getPoint();
    if(p.z>0){
      tft.fillCircle(p.x, p.y, 5, ILI9341_WHITE);
    }
  }
/*
  if(press){
    Search();
  }
  */
  delay(1); // this speeds up the simulation
}