Para Juan

Dependencies:   NAVDATA RA8875 mbed VCODATA

main.cpp

Committer:
gstedile
Date:
2017-04-08
Revision:
5:56d63eaa8415
Parent:
4:9901f6da64b7
Child:
6:aebb3a0a040c

File content as of revision 5:56d63eaa8415:


#include "mbed.h"           // v112
#include "RA8875.h"         // v102
#include "MyFont18x32.h"
#include "BPG_Arial08x08.h"
#include "BPG_Arial10x10.h"
#include "BPG_Arial20x20.h"
#include "BPG_Arial31x32.h"
#include "BPG_Arial63x63.h"

// Agrego includes para uso en la comunicacion con el gps.
#include "GPS.h"
// Agrego includes para la clase NAVDATA que maneja los datos de navegación del último período.
#include "NAVDATA.h"
// Agrego includes para la clase VCODATA que maneja los datos de navegación más recientes parametrizados por velocidad de cada período.
#include "VCODATA.h" 

#include <sstream>  //include this to use string streams
#include <string> 

float Counter=0;      //Contador de pulsos del sensor de flujo.
float LCounter=0;     //Consumo en litros
float Consumo_km=0;   //Consumo en litros/km.
NAVDATA NAVIGATION_TABLE;                       //Objeto que maneja los datos de navegación del último período. $
VCODATA NAVIGATION_VMATRIX(NAVIGATION_TABLE);   // Objeto que maneja la matriz de datos de navegación            $



LocalFileSystem local("local");                 // Because I want <PrintScreen>
Serial pc(USBTX, USBRX);                        // And a little feedback

  RA8875 lcd(p5, p6, p7, p12, NC, "tft");       // MOSI, MISO, SCK, /ChipSelect, /reset, name
 
    void trigger() {                            //Función para la interrupción
         Counter++;
         LCounter=Counter/2500;
         //point_t p_cursor = lcd.GetTextCursor();
         //lcd.SetTextCursor(0,200); 
         //lcd.printf("Flujo %d pulsos", Counter);
         //lcd.SetTextCursor(p_cursor);
         }
 /* Funcion  print_VCO_curve : Imprime la curva de consumo/milla en funcion de la velocidad a partir del vector de objetos NAV_DATA de la clase VCODATA.*/

    void print_VCO_curve(VCODATA Matrix_VCO){
        int s,y,z;
        for (int x=0;x<100;x++){
        s = Matrix_VCO.NAV_DATA[x].LAST_NAV_DATA[cons_mile_p];
        y=200-2*s;  // el consumo máximo es alrededor de 100 l/m. Multiplico por 2 para que ocupe mas pantalla.
        z=x*4;      // para aumentar el span (eje x)
        lcd.SetTextCursor(z,y);         
        //lcd.printf("%d",x);
        lcd.printf(".");
        }
    }


/* Funcion build_test_Mtrx: Carga los datos del vector LAST_NAV_DATA de los objetos NAVDATA de VCODATA para testing.*/

void   build_test_Mtrx(VCODATA Test_Matrix_VCO){
       NAVDATA TestNDO;
       for (int i=0;i<50;i++){
        TestNDO.LAST_NAV_DATA[cons_mile_p]=i;
        TestNDO.LAST_NAV_DATA[speed_p]=i;
        Test_Matrix_VCO.store_data(TestNDO);
        }
        for (int i=50,x=50;i>0;i--,x++){
        TestNDO.LAST_NAV_DATA[cons_mile_p]=i;
        TestNDO.LAST_NAV_DATA[speed_p]=x;
        Test_Matrix_VCO.store_data(TestNDO);
        }
     }   

    
int main()
{
    pc.baud(460800);                            // I like a snappy terminal, so crank it up!
    pc.printf("\r\nRA8875 Soft Fonts - Build " __DATE__ " " __TIME__ "\r\n");

    lcd.init();
 
     // **************************
    //RunTestSet(lcd, pc);  // If the library was compiled for test mode...
    
    lcd.foreground(RGB(255,255,0));     // Seteo del color de las letras.
    lcd.SelectUserFont(BPG_Arial20x20);     // Seleccion de tipo y tamaño de letras
    //lcd.puts("BPG_Arial63x63");


           GPS gps(p9, p10);                            // Agrego para comunicacion con el GPS
           
 //Inicializo variables para el sensor de flujo
 //----------------------------------------------------
            DigitalOut myled(LED1);
            DigitalOut myled2(LED2);
            DigitalOut myled3(LED3);
            DigitalOut myled4(LED4);


            //DebounceIn pb(p8);
            /*DigitalIn pb(p11);             
            int count=0;    //Comento esto porque voy a usar interrupciones
            int old_pb=0;
            int new_pb;
            // Use internal pullup for pushbutton
            pb.mode(PullUp);
            //pb.mode(PullNone);
           // Delay for initial pullup to take effect
            wait(.001);*/
          
//----------------------------------------------------         
//      Sensor de flujo:       
//-----------------------------------------------------
        InterruptIn pulse_sensor(p11);  // Defino pulse_sensor como una entrada de interrupción en p11.
        pulse_sensor.mode(PullUp);      // PullUp para esa entrada.
        //DigitalOut led(LED1);
        pulse_sensor.rise(&trigger);    // Dispara interrupción con flanco ascendente. (Podría tambien ser desecendente--> fall)
        
       
       
       
        while(1) {
            
            lcd.SetTextCursor(0,0);                      // Pongo cursor en posicion
            lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");
           

//-----------------------------------------------------            
        
        //lcd.SetTextCursor(0,20);
        //lcd.printf("M0: %s \r\n\r\n", gps.msg);  //Imprimo el mensaje crudo proveniente de la uart
        //lcd.printf("M1: %s \r\n", gps.mensaje1);
        //lcd.printf("M2: %s \r\n", gps.mensaje2);
        //lcd.printf("M3: %s \r\n", gps.mensaje3);
        //lcd.printf("M4: %s \r\n", gps.mensaje4);
        //lcd.printf("Posicion actual_0: %f, %f \r\n", gps.longitude, gps.latitude);
        //lcd.printf("Contador = %d", Counter);
         
        if(gps.sample()) {             // Si es exitosa la obtencion de datos del gps.
            lcd.cls();
            lcd.SetTextCursor(0,0);                      // Pongo cursor en posicion
            lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");
            
            if (NAVIGATION_TABLE.rotate_data(gps.longitude, gps.latitude, gps.time, Counter)){
            NAVIGATION_VMATRIX.store_data(NAVIGATION_TABLE);// Luego de rotar los datos en la tabla de navegacion, la guarda en la matriz, 
                                                            // en el lugar correspondiente a la velocidad del preiodo (por ahora reemplaza...ver otras opciones)
            
            lcd.puts("Rotacion exitosa!-->");
            int i=int(NAVIGATION_TABLE.LAST_NAV_DATA[speed_p]);                         
            float timetick_f_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[time_f];           // DEBUG
            float distance_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[distance_p];       // DEBUG
            float speed_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[speed_p];             // DEBUG
            float longitude_f_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[longitude_f];     // DEBUG
            float latitude_f_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[latitude_f];       // DEBUG
            float cons_hour_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[cons_hour_p];
            //lcd.printf("Algunos datos guardados en la Matriz: \r\n");                               // DEBUG
            lcd.printf("INDICE_Mtrx: %d\r\n",i);                            // DEBUG
            /*lcd.printf("Speed_f_Mtrx(%d): %f kn.\r\n",i, speed_p_Mtrx);                             // DEBUG
            lcd.printf("Time_f_Mtrx(%d): %f Hours.\r\n",i, timetick_f_Mtrx);                        // DEBUG
            lcd.printf("Distance_p_Mtrx(%d): %f miles.\r\n",i,distance_p_Mtrx);                     // DEBUG
            lcd.printf("Posicion: Long(%d): %f, Lat: %f\r\n",i,longitude_f_Mtrx,latitude_f_Mtrx);   // DEBUG
            lcd.printf("FlujoVCOmtrx(%d): %f Litros/Hora\r\n",i, cons_hour_p_Mtrx);                 // DEBUG
            */
            build_test_Mtrx(NAVIGATION_VMATRIX);    // DEBUG Curve
            print_VCO_curve(NAVIGATION_VMATRIX);
            }
            else
            {
            lcd.puts("Periodo no valido!\r\n");  
            int i=int(NAVIGATION_TABLE.LAST_NAV_DATA[speed_p]);
            float timetick_f_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[time_f];           // DEBUG
            float distance_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[distance_p];       // DEBUG
            float speed_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[speed_p];             // DEBUG
            float longitude_f_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[longitude_f];     // DEBUG
            float latitude_f_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[latitude_f];       // DEBUG
            float cons_hour_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[cons_hour_p];     // DEBUG
            lcd.printf("Algunos datos guardados en la Matriz: \r\n");                               // DEBUG
            lcd.printf("INDICE_Mtrx: %d (Parte entera de speed)\r\n",i);                            // DEBUG
            lcd.printf("Speed_f_Mtrx(%d): %f kn.\r\n",i, speed_p_Mtrx);                             // DEBUG
            lcd.printf("Time_f_Mtrx(%d): %f Hours.\r\n",i, timetick_f_Mtrx);                        // DEBUG
            lcd.printf("Distance_p_Mtrx(%d): %f miles.\r\n",i,distance_p_Mtrx);                     // DEBUG
            lcd.printf("Posicion: Long(%d): %f, Lat: %f\r\n",i,longitude_f_Mtrx,latitude_f_Mtrx);   // DEBUG
            lcd.printf("FlujoVCOmtrx(%d): %f Litros/Hora\r\n",i, cons_hour_p_Mtrx);                 // DEBUG
              }
           /* lcd.SetTextCursor(0,80);            
            //lcd.printf("Posicion: %f, %f\r\n", gps.longitude, gps.latitude);
            lcd.printf("Posicion: %f, %f\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[longitude_f], NAVIGATION_TABLE.LAST_NAV_DATA[latitude_f]);     //   $
            //lcd.printf("Velocidad %f km/h", gps.speed);
            lcd.printf("Distancia_p %f km\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[distance_p]);
            lcd.printf("Velocidad %f km/h\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[speed_p]);
            lcd.printf("Timetick_i %f h\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[time_i]);
            lcd.printf("Timetick_f %f h\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[time_f]);
            lcd.printf("Timetick_gps %f NMEA\r\n", gps.time);
 //            lcd.printf("Consumo %f l/km", getConsumo(Count; gps.speed);  */
            //lcd.SetTextCursor(0,220); 
            //lcd.printf("Flujo %f Litros/Hora\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[cons_hour_p]);
            //lcd.printf("FlujoVCOmtrx %f Litros/Hora\r\n", cons_hour_p_Mtrx);
            //lcd.printf("Flujo acumulado (contador):%f Litros\r\n", LCounter); 
            
            } 
            else {
            lcd.cls();
            lcd.SetTextCursor(0,0);                      // Pongo cursor en posicion
            lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");
            lcd.SetTextCursor(0,100);    
            lcd.printf("No hay datos disponibles :(\r\n");
            lcd.SetTextCursor(0,180);
            lcd.printf("Timestick %f km/h\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[time_f]); 
            lcd.printf("Flujo %f Litros/Hora\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[cons_hour_p]);
            lcd.printf("Flujo %f Litros\r\n", LCounter);                
               }
    }       
}