/*
Codigo de ejemplo para el uso de libreria xplane a traves de wifi con la placa ESP8266.
Para configurar wifi hay que indicar el identificador y pass en STASSID y STAPSK respectivamente.
*/
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4);

#include <ESP8266WiFi.h>

//Necesario para conectar con xplane
#include "Xplane.h"

#ifndef STASSID
#define STASSID "xxxxxxxxxx"
#define STAPSK  "yyyyyyyyyy"
#endif

const char* ssid     = STASSID;
const char* password = STAPSK;
float roll_Anterior = 0;
float pitch_Anterior = 0;
float heading_Anterior = 0;
float anterior;
int conta = 0;

//Necesario para conectar con xplane
XPLANE xplane;

void setup() {
  Serial.begin(9600);
  Serial.print("Connectando wifi");
  /* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
     would try to act as both a client and an access-point and could cause
     network-issues with your other WiFi-devices on your WiFi-network. */
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

//Necesario para conectar con xplane  
  xplane.infoXplane(WiFi.localIP());


/*Necesario para conectar con xplane
  Crear una linea por cada dataref que se quiere recibir, (frecuencia -veces por segundo-, orden, dataref)
  Si se indica frecuencia 0, entondes xplane deja de enviar ese data ref.
  Si alguna suscripcion devuelve siempre valor 0, es posible que no se haya especificado bien el dataref, es sensible a las mayusculas.*/
  
  xplane.suscribeDataRef(1,1,"sim/flightmodel/position/theta");  //float y degrees The pitch relative to the plane normal to the Y axis in degrees - OpenGL coordinates
  xplane.suscribeDataRef(1,2,"sim/flightmodel/position/phi");  //float y degrees The roll of the aircraft in degrees - OpenGL coordinates
  xplane.suscribeDataRef(1,3,"sim/flightmodel/position/psi");  //float y degrees The true heading of the aircraft in degrees from the Z axis - OpenGL coordinates
}

void loop() {
  //Necesario para conectar con xplane
  xplane.readDataRef();

}

//Funcion que sera llamada automaticamente por cada dato recibido, el orden equivale al orden que se ha indicado anteriormente en la suscripcion.  
void DataRefOut(int orden, float valor){
   if(conta == 0) {
     conta++;
     String titulo;
        switch (orden) {
          case 1: titulo = "pitch: ";
              anterior = pitch_Anterior;
              pitch_Anterior = valor;
             break;
          case 2: titulo = "roll: ";
              anterior = roll_Anterior;
              roll_Anterior = valor;
             break;
          case 3: titulo = "heading: ";
              anterior = heading_Anterior;
              heading_Anterior = valor;
             break;
     }
     String valorEnCaracteres = String(valor, 6);
     lcd.backlight();
     lcd.clear();
     float x = valor;
     lcd.print(titulo); 
     lcd.print(x,6);
     lcd.setCursor(0,2);
     float z = valor - anterior;
     lcd.print ("Ant. = ");
     lcd.print(z,6);
     if(conta >= 5000) conta = 0;
   }  
 }
