Para Juan

Dependencies:   NAVDATA RA8875 mbed VCODATA

main.cpp

Committer:
gstedile
Date:
2017-04-14
Revision:
8:941a76c2d300
Parent:
7:93da358c67a1
Child:
9:fe7de0e11862

File content as of revision 8:941a76c2d300:


#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
 
//>>>>>>>>>>>>>>>>>>  SECCION AGREGADA PROVISORIAMENTE PARA EL TOUCH PANEL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

extern "C" void mbed_reset();


#define min(a,b) ((a<b)?a:b)
#define max(a,b) ((a>b)?a:b)

bool Intersect(rect_t rect, point_t p)
{
    if (p.x >= min(rect.p1.x, rect.p2.x) && p.x <= max(rect.p1.x, rect.p2.x)
    && p.y >= min(rect.p1.y, rect.p2.y) && p.y <= max(rect.p1.y, rect.p2.y))
        return true;
    else
        return false;
}

int GetScreenCapture(void)
{
    char fqfn[50];
    int i = 0;
    
    pc.printf("Screen Capture... ");
    for (i=1; i< 100; i++) {
        snprintf(fqfn, sizeof(fqfn), "/local/Screen%02d.bmp", i);
        FILE * fh = fopen(fqfn, "rb");
        if (!fh) {
            lcd.PrintScreen(0,0,480,272,fqfn);
            pc.printf(" as /local/Screen%02d.bmp\r\n", i);
            return i;
        } else {
            fclose(fh);     // close this and try the next
        }
    }
    return 0;
}
//>>>>>>>>>>>>>>>>>>  FIN SECCION AGREGADA PROVISORIAMENTE PARA EL TOUCH PANEL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  
  
  
  
  
    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;
        int VCO= Matrix_VCO.get_VCO();
        
        lcd.background(RGB(255,255,255));
        lcd.foreground(Blue);
        lcd.SetTextCursor(0,0);                      // Pongo cursor en posicion
        lcd.cls();
        lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");
        lcd.roundrect(    5,25, 470,270, 10,8,    RGB(255,255,0));
    //lcd.fillroundrect(415,165, 470,185,  5,3,    Orange);
        lcd.fillroundrect(10,30, 465,264,  5,3,  Green);
        lcd.background(Green);
        lcd.foreground(Blue);
        lcd.SetTextCursor(12,32);
        lcd.puts("Consumo(l/m)\r\n");
        lcd.SetTextCursor(240,240);
        lcd.puts("Velocidad(kn)\r\n");           
        lcd.foreground(RGB(255,255,0));
        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+25,y);         
        //lcd.printf("%d",x);
        lcd.printf(".");
        }
        s = Matrix_VCO.NAV_DATA[VCO].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.
        if (VCO>0){
        z=VCO*4;      // para aumentar el span (eje x)
        lcd.SetTextCursor(z+25,y);         
        lcd.printf("*");
        }
        else{
            lcd.SetTextCursor(45,60);         
            lcd.printf("No hay datos suficientes para obtener la VCO");
            //lcd.printf("%d",VCO);
        }
        lcd.foreground(RGB(255,255,0));
        lcd.background(Black);
    }


/* Funcion build_test_Mtrx: Carga los datos (consumo/milla) 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<30;i++){
        TestNDO.LAST_NAV_DATA[cons_mile_p]=i+1;
        TestNDO.LAST_NAV_DATA[speed_p]=i;
        Test_Matrix_VCO.store_data(TestNDO);
        }
        for (int i=30,x=30;i>1;i--,x++){
        TestNDO.LAST_NAV_DATA[cons_mile_p]=i;
        TestNDO.LAST_NAV_DATA[speed_p]=x;
        Test_Matrix_VCO.store_data(TestNDO);
        }
        TestNDO.LAST_NAV_DATA[cons_mile_p]=1;
        TestNDO.LAST_NAV_DATA[speed_p]=55;
        Test_Matrix_VCO.store_data(TestNDO);
        for (int i=1,x=59;i<40;i++,x++){
        TestNDO.LAST_NAV_DATA[cons_mile_p]=i+1;
        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();
    
    lcd.TouchPanelCalibrate("Calibrate the touch panel");   // 4 touch
    lcd.cls();
    
    rect_t PrintScreenRect = { 425-65, 20, 425+65, 60};

 
     // **************************
    //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]);   
            int VCO=NAVIGATION_VMATRIX.get_VCO();
            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];
            float cons_mile_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[cons_mile_p];
            //lcd.printf("Algunos datos guardados en la Matriz: \r\n");                             // DEBUG
            lcd.printf("INDICE_Mtrx: %d\r\n\r\n",i);                            // DEBUG
            lcd.printf("Speed_f_Mtrx(%d):     %f kn.\r\n",i, speed_p_Mtrx);                             // DEBUG
            lcd.printf("Speed_f_Mtrx(%d):     %f km/h.\r\n\r\n",i, speed_p_Mtrx*1.852);                     // DEBUG
            lcd.printf("Time_f_Mtrx(%d):      %f Hours.\r\n",i, timetick_f_Mtrx);                        // DEBUG
            lcd.printf("Dist_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.printf("FlujoVCOmtrx(%d):     %f Litros/Milla\r\n",i, cons_mile_p_Mtrx);                 // DEBUG
            lcd.printf("VCO:                      %d km/h\r\n", VCO); 
            //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("Aun no hay datos disponibles :(\r\n");
            lcd.SetTextCursor(0,180);
            lcd.printf("Timetick %f h\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[time_f]); 
            lcd.printf("Flujo Mtrx: %f Litros/Hora\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[cons_hour_p]);
            lcd.printf("Flujo Counter: %f Litros\r\n", LCounter);                
               }
               
               
           for (int i=0;i<200;i++) {
            point_t p;
            lcd.fillrect(PrintScreenRect, Green);
            lcd.foreground(Blue);
            lcd.background(Green);
            lcd.puts(425-60, 22, "GET CURVE");
            lcd.background(Black);
            wait_us(5);
            if (lcd.TouchPanelReadable(&p)) {
            //lcd.foreground(Blue);
            //lcd.SetTextCursor(10, 15);
            //lcd.printf("(%3d,%3d)", p.x, p.y);
            //lcd.foreground(RGB(255,255,0));
            
            if (Intersect(PrintScreenRect, p)) {
            lcd.foreground(Red);
            lcd.puts(400-38, 20, "GET CURVE");
            //build_test_Mtrx(NAVIGATION_VMATRIX);    // DEBUG Curve
            print_VCO_curve(NAVIGATION_VMATRIX);
            //lcd.foreground(RGB(255,255,0));
            wait(10);
            break;
                //GetScreenCapture();
            }
            
            /*for (int i=0; i<3; i++) {
                if (Intersect(RGBList[i], p)) {
                    uint8_t mag = (255 * (p.x - RGBList[i].p1.x)) / (RGBList[i].p2.x - RGBList[i].p1.x);
                    rgbVal[i] = mag;
                    lcd.SetTextCursor(380, 15);
                    lcd.foreground(Blue);
                    //lcd.printf("(%02X,%02X,%02X)", rgbVal[0], rgbVal[1], rgbVal[2]);
                    //rgb = RGB(rgbVal[0], rgbVal[1], rgbVal[2]);
                    //lcd.fillrect(RGBList[3], rgb);
                    break;
                }*/
             }
             lcd.foreground(RGB(255,255,0));
        }
    }
    }