#include <SC16IS752.h>
#include <Adafruit_MCP23008.h>

/*
   Check switch configuration: 1:X, 2: ON, 3: X, 4: ON
   Board: ESP32 Dev Module
   
   ESP32 PLC sketch utilizado para enviar comandos AT manualmente por monitor serie.
   Enviamos un comando AT, y esperaremos siempre recibir el OK
   
   En caso del módulo SARA-R412M, enviamos:
   AT
   ATZ
   AT+CFUN=0
   AT+UMNOPROF=100
   AT+CFUN=15 //Reinicia el módulo
   AT (seguimos enviando AT, hasta que haya respuesta)
   AT+URAT=9
   AT+CFUN=15 //Reinicia el módulo
   AT (seguimos enviando AT, hasta que haya respuesta)
   AT+CGDCONT=1,"IP","wlapn.com"
   AT+UAUTHREQ=1,1,"WLTRIALS","WLTRIALS"
   AT+UBANDMASK? Comprobamos que nos devuelve +UBANDMASK: 0,524420,1,524420
   AT+CGATT=1
   AT+CGACT=1,1
   AT+USOCR=6
   AT+USOCO=0,"140.82.8.62",1234
   AT+USOWR=0,12,"Hello world!" (12 es la longitud del String, en caso de cambiar el mensaje, habría que cambiar también la longitud)
   AT+USOCL
*/

// If the click board is located next to Ethernet connector
#define SPIUART_CLICK SC16IS752_CHANNEL_A
// Otherwise
//#define SPIUART_CLICK SC16IS752_CHANNEL_B


#define SC16IS752_CS 12
#define MCP_ADDR 3
#define MCP_RST 3
#define BAUD 115200  // Also 115200. It can be some other

Adafruit_MCP23008 mcp;
SC16IS752 spiuart = SC16IS752(SC16IS750_PROTOCOL_SPI, SC16IS752_CS);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
  Serial.begin(115200UL);
  delay(1000);

  setupMCP();

  spiuart.begin(BAUD, BAUD);
  if (spiuart.ping() != 1) {
    Serial.println("SC16IS752 not found");
    while (1);
  } else {
    Serial.println("SC16IS752 found");
  }

  Serial.println("Start serial communication");

 // while (!spiuart.available(SPIUART_CLICK));
  while (spiuart.available(SPIUART_CLICK)) {
    Serial.print((char)spiuart.read(SPIUART_CLICK));
    delay(10);
  }
  delay(1000);

  spiuart.flush(SPIUART_CLICK);
  Serial.println("Sending AT...");
  const char* command = "AT\r\n";
  for (int i = 0; i < strlen(command); i++) {
    spiuart.write(SPIUART_CLICK, command[i]);
  }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
  if (Serial.available()) {
    byte rx = Serial.read();
    spiuart.write(SPIUART_CLICK, rx);
  }
  while (spiuart.available(SPIUART_CLICK)) {
    Serial.print((char)spiuart.read(SPIUART_CLICK));
  }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setupMCP()
{
  Serial.println("Initializing MCP23008...");
  mcp.begin(MCP_ADDR);			// MCP: 0x23
  mcp.pinMode(MCP_RST, OUTPUT);	// RST: GP3
  delay(1000);
  mcp.digitalWrite(MCP_RST, LOW);
  delay(12000);
  mcp.digitalWrite(MCP_RST, HIGH);
  delay(1000);
  Serial.println("OK");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
