#include <Keypad.h>
#include <math.h>
#include <LiquidCrystal_I2C.h>
#define FILAS 4
#define COLUMNAS 4
byte pinesFilas[FILAS] = { 13, 12, 14, 27 };
byte pinesColumnas[COLUMNAS] = { 26, 25, 33, 32 };
char teclas[FILAS][COLUMNAS] = {
  { '1', '2', '3', 'A' },
  { '4', '5', '6', 'B' },
  { '7', '8', '9', 'C' },
  { '*', '0', '#', 'D' },
};
Keypad teclado(makeKeymap(teclas), pinesFilas, pinesColumnas, FILAS, COLUMNAS);
LiquidCrystal_I2C LCD (0x27, 20, 4);
int i = 0;
byte im = 0;
float Total1 = 0;
float Total2 = 0;
char signo = '1';
byte ima = 0;
String num[20] = {};
String mostrar;
byte Reinicio = 0;
void setup() {
  Serial.begin(115200, SERIAL_8N1);
  LCD.init();
  LCD.backlight();
  LCD.clear();
  LCD.print("Bienvenido");
  delay(1000);
  LCD.clear();
  LCD.setCursor(0, 0);
  LCD.print("Cargando...");
  delay(2000);
  LCD.clear();
  LCD.setCursor(0, 0);
  LCD.print("A: Rect a Polar");
  LCD.setCursor(0, 1);
  LCD.print("B: Polar a Rect");
  delay(2000);
  LCD.clear();
}

void loop() {
  int i=0, j=0, r=0, m=0, a=0;
  char real[7];
  char imaginario[7];
  char mod[7];
  char ang[7];
  float re, im, modulo, angulo;
  bool imag=false, angu=false;
  char hold, tecla;
  char menu = teclado.getKey();
  if (menu != '\0') {
    if (menu == 'A') {
      LCD.setCursor(0, 0);
      LCD.print(menu);
      hold=menu;
      delay(1000);
      LCD.clear();
      while(hold !='#'){
        tecla = teclado.getKey();
        if (tecla != '\0'){
          //impresion por pantalla
          switch(tecla){
            case 'A':
            LCD.setCursor(i, 0);
            LCD.print("+");
            i++;
            break;
            case 'B':
            LCD.setCursor(i, 0);
            LCD.print("-");
            if(i==0){
              real[0]='-';
              r++;
            }
            else{
              imaginario[0]='-';
              j++;
            }
            i++;
            break;
            case 'C':
            LCD.setCursor(i, 0);
            LCD.print("j");
            imag=true;
            i++;
            break;
            case '*':
            LCD.setCursor(i, 0);
            LCD.print(".");
            if(imag){
              imaginario[j]='.';
              j++;
            }
            else{
              real[r]='.';
              r++;
            }
            i++;
            break;
            case 'D':
            i--;
            if(imag){
              j--;
              imaginario[j]=' ';
            }  
            else{
              r--;
              real[r]=' ';
            }
            LCD.setCursor(i, 0);
            LCD.print(" ");
            break;
            case '#':
            hold=tecla;
            LCD.clear();
            re=atof(real);
            im=atof(imaginario);
            Serial.print("Real: ");
            Serial.println(re);
            Serial.print("Imaginario: ");
            Serial.println(im);
            break;
            default:
            LCD.setCursor(i, 0);
            LCD.print(tecla);
            //Guardado de números
            if(imag){
              imaginario[j]=tecla;
              j++;
            }  
            else{
              real[r]=tecla;
              r++;
            }
            i++;
          }
        }
      }
      modulo=sqrtf(sq(re)+sq(im));
      angulo=atan((im/re));
      angulo=degrees(angulo);
      if( re>0.0 && im<0.0){
          angulo=360+angulo;
      }
      if(re<0.0){
        angulo=180+angulo;
      }
      Serial.print("Módulo: ");
      Serial.println(modulo);
      Serial.print("Ángulo: ");
      Serial.println(angulo);
      LCD.setCursor(0, 0);
      LCD.print("Modulo: ");
      LCD.setCursor(8, 0);
      LCD.print(modulo);
      LCD.setCursor(0, 1);
      LCD.print("Angulo: ");
      LCD.setCursor(8, 1);
      LCD.print(angulo);
    }
    if (menu == 'B') {
      LCD.setCursor(0, 0);
      LCD.print(menu);
      hold=menu;
      delay(1000);
      LCD.clear();
      while(hold !='#'){
        tecla = teclado.getKey();
        if (tecla != '\0'){
          //impresion por pantalla
          switch(tecla){
            case 'A':
            break;
            case 'B':
            break;
            case 'C':
            LCD.setCursor(i, 0);
            LCD.print("|");
            angu=true;
            i++;
            break;
            case '*':
            LCD.setCursor(i, 0);
            LCD.print(".");
            if(angu){
              ang[a]='.';
              a++;
            }
            else{
              mod[m]='.';
              m++;
            }
            i++;
            break;
            case 'D':
            i--;
            if(angu){
              a--;
              ang[a]=' ';
            }  
            else{
              m--;
              mod[m]=' ';
            }
            LCD.setCursor(i, 0);
            LCD.print(" ");
            break;
            case '#':
            hold=tecla;
            LCD.clear();
            modulo=atof(mod);
            angulo=atof(ang);
            Serial.print("Módulo: ");
            Serial.println(modulo);
            Serial.print("Ángulo: ");
            Serial.println(angulo);
            break;
            default:
            LCD.setCursor(i, 0);
            LCD.print(tecla);
            //Guardado de números
            if(angu){
              ang[a]=tecla;
              a++;
            }  
            else{
              mod[m]=tecla;
              m++;
            }
            i++;
          }
        }
      }
      re=modulo*cos(radians(angulo));
      im=modulo*sin(radians(angulo));
      Serial.print("Real: ");
      Serial.println(re);
      Serial.print("Imaginario: ");
      Serial.println(im);
      LCD.setCursor(0, 0);
      LCD.print("Real: ");
      LCD.setCursor(6, 0);
      LCD.print(re);
      LCD.setCursor(0, 1);
      LCD.print("Imag: ");
      LCD.setCursor(6, 1);
      LCD.print(im);
    }
  }
}