#include <stdint.h>
#include "SimpleILI9341.h"
#include <SPI.h>
#include "calcdecl.h"
#include "memory.h"
#include "calc.h"
#include "solver.h"
#include "Storage.h"
#include "gauss.h"
#include "parse.h"
#include "Help.h"
#include "Table.h"
#include "Plotter.h"
#include "VDU.h"
#include "EEPROM.h"
#include "Storage.h"

#define pinSCK    18
#define pinMOSI   23
#define pinDC     16
#define pinRESET  17
#define pinCS     5

byte KbdPin[] = {32,33,25,26,27,14,12,13};

void setup() {
  Serial.begin(19200);
  Serial.println("");
  Serial.println("Starting");

  ILI9341Begin(pinCS, pinDC, pinRESET, 320, 240, ILI9341_Rotation1);
  SPI.setFrequency(32000000);
  
  for (int i=0; i<sizeof(KbdPin)/sizeof(KbdPin[0]); i++) 
    pinMode(KbdPin[i], INPUT_PULLUP);
    
//  ClearDisplay(TFT_BLACK);
//  DrawStringAt(0,TextHeight(LargeFont),"Solver " __DATE__ " " __TIME__,LargeFont, TFT_WHITE);
//  DrawStringAt(0,TextHeight(LargeFont)*2,"",LargeFont, TFT_WHITE);
  Serial.println("Solver " __DATE__ " " __TIME__);
  delay(2000);

  ClearDisplay(TFT_BLACK);
  DrawStringAt(130,4*TextHeight(LargeFont),"Solver",LargeFont, TFT_WHITE);
  DrawStringAt(30,tft_height-TextHeight(LargeFont),"For Help, hold down '?' key",LargeFont, TFT_YELLOW);
  delay(1000);

  EEPROM.begin(EEPROMsize);
  LinesClear(true);
  has_plot = false;
  ResetPlot();
  InitEEPROM();
  ResetTable();
  ImageMode = imEdit;
  ResetVDU();
  DrawImageEditor();  
}

void CheckSerial() {
  if (Serial.available() > 0) 
    SerialReceived(Serial.read()); 
}

void loop() {
  static int prev = 0;
  int k;
  
  k = 0;
  for (int i=0; i<8; i++) {
    pinMode(KbdPin[i], OUTPUT);
    digitalWrite(KbdPin[i],LOW);
    for (int j=i+1; j<8; j++) 
      if (digitalRead(KbdPin[j]) == LOW) {
        k = (i+1)*10+j+1;
      }
    pinMode(KbdPin[i], INPUT_PULLUP);
  }

  if (k != prev) {      
    if (k != 0)
      ButtonDown(k); else
      ButtonUp();
  }
  prev = k;
  
  Timer();
  CheckSerial();
}
