Para Juan

Dependencies:   NAVDATA RA8875 mbed VCODATA

Revision:
9:fe7de0e11862
Parent:
8:941a76c2d300
Child:
10:be7bcb936dcd
--- a/main.cpp	Fri Apr 14 04:54:50 2017 +0000
+++ b/main.cpp	Mon Apr 17 12:36:08 2017 +0000
@@ -15,14 +15,15 @@
 // 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 <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.
+float Counter=0;                                //Contador de pulsos del sensor de flujo.
+float LCounter=0;                               //Consumo en litros
+const int V_M=100;                               //Velocidad Maxima
 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            $
+VCODATA NAVIGATION_VMATRIX(NAVIGATION_TABLE, V_M);      // Objeto que maneja la matriz de datos de navegación            $
+VCODATA NAVIGATION_V_INTRP_MTRX(NAVIGATION_TABLE, V_M); // Objeto que maneja la matriz de datos de navegación interpolados $            
 
 
 
@@ -69,25 +70,26 @@
 }
 //>>>>>>>>>>>>>>>>>>  FIN SECCION AGREGADA PROVISORIAMENTE PARA EL TOUCH PANEL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
-  
-  
+ //Función para la interrupción
   
-  
-  
-    void trigger() {                            //Función para la interrupción
+    void trigger() {                           
          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.*/
+         
+         
+ /* 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, con lineas (printline=1) o puntos (=0)*/
 
-    void print_VCO_curve(VCODATA Matrix_VCO){
-        int s,y,z;
+    void print_VCO_curve(VCODATA Matrix_VCO, int printline){    
+        float s; // Consumo
+        int y,x;
         int VCO= Matrix_VCO.get_VCO();
-        
+        int y_offset=200;
+        int x_offset=25;
+        int y_i=y_offset;               //Punto origen y
+        int x_i=x_offset;               //Punto origen x
+        int x_scale=4;                  // Escala para graficar eje x.
+        int y_scale=50;                 // Escala para graficar eje y.
         lcd.background(RGB(255,255,255));
         lcd.foreground(Blue);
         lcd.SetTextCursor(0,0);                      // Pongo cursor en posicion
@@ -103,23 +105,35 @@
         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);
+        
+          
+        
+        for (int n=0;n<Matrix_VCO.vel_max;n++){                 // Recorre x de 0 a vel_max.
+        s = Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_mile_p];  // Consumo por milla del período
+        y=int(y_offset-y_scale*s);                              // El consumo máximo es alrededor de 100 l/m => Multiplico por y_scale para que ocupe mas pantalla.
+        x=n*x_scale+x_offset;                                   // para aumentar el span (eje x)       
+        if (printline)lcd.line(x_i,y_i,x,y);                    // Imprime linea
+        else{
+        lcd.SetTextCursor(x,y);
         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.
+        x_i=x;
+        y_i=y;
+        }
         if (VCO>0){
-        z=VCO*4;      // para aumentar el span (eje x)
-        lcd.SetTextCursor(z+25,y);         
-        lcd.printf("*");
+        s = Matrix_VCO.NAV_DATA[VCO].LAST_NAV_DATA[cons_mile_p];;   // Valor de consumo para VCO.
+        y=int(y_offset-y_scale*s);                                  // el consumo máximo es alrededor de 2 l/m. Multiplico por y_scale para que ocupe mas pantalla.
+        x=VCO*x_scale+x_offset;                                     // para aumentar el span (eje x)
+        if (printline)lcd.circle(x,y,5);                                          
+        else{
+            lcd.SetTextCursor(x,y);         
+            lcd.printf("o");
+        }    
+        lcd.SetTextCursor(20+x_offset,y_offset-130);
+        lcd.printf("Consumo_VCO: %f",s);
         }
         else{
-            lcd.SetTextCursor(45,60);         
+            lcd.SetTextCursor(40,60);         
             lcd.printf("No hay datos suficientes para obtener la VCO");
             //lcd.printf("%d",VCO);
         }
@@ -132,7 +146,22 @@
 
 void   build_test_Mtrx(VCODATA Test_Matrix_VCO){
        NAVDATA TestNDO;
-       for (int i=0;i<30;i++){
+        
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=3;
+        TestNDO.LAST_NAV_DATA[speed_p]=15;
+        Test_Matrix_VCO.store_data(TestNDO);
+        Test_Matrix_VCO.store_data(TestNDO);
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=1;
+        TestNDO.LAST_NAV_DATA[speed_p]=30;
+        Test_Matrix_VCO.store_data(TestNDO);
+        Test_Matrix_VCO.store_data(TestNDO);
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=2.5;
+        TestNDO.LAST_NAV_DATA[speed_p]=Test_Matrix_VCO.vel_max-1;
+        Test_Matrix_VCO.store_data(TestNDO);
+        Test_Matrix_VCO.store_data(TestNDO);
+        Test_Matrix_VCO.interpolate();
+       
+       /*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);
@@ -149,7 +178,7 @@
         TestNDO.LAST_NAV_DATA[cons_mile_p]=i+1;
         TestNDO.LAST_NAV_DATA[speed_p]=x;
         Test_Matrix_VCO.store_data(TestNDO);
-        }
+        }*/
      }   
 
     
@@ -175,25 +204,7 @@
     
            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:       
 //-----------------------------------------------------
@@ -215,12 +226,7 @@
         
         //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();
@@ -228,15 +234,15 @@
             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)
-            
+            NAVIGATION_VMATRIX.store_data(NAVIGATION_TABLE);// Luego de rotar los datos en la tabla de navegacion, la guarda en la matriz segun criterios de la clase VCODATA                                                                
             lcd.puts("Rotacion exitosa!-->");
             int i=int(NAVIGATION_TABLE.LAST_NAV_DATA[speed_p]);   
             int VCO=NAVIGATION_VMATRIX.get_VCO();
+            float timetick_f_Last = NAVIGATION_TABLE.LAST_NAV_DATA[speed_p];                        // DEBUG
             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 speed_p_Last = NAVIGATION_TABLE.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];
@@ -244,15 +250,21 @@
             //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("Speed_f_Last(%d):     %f km/h.\r\n\r\n",i, speed_p_Last*1.852);                     // DEBUG
             lcd.printf("Time_f_Mtrx(%d):      %f Hours.\r\n",i, timetick_f_Mtrx);                        // DEBUG
+            lcd.printf("Time_f_Last(%d):      %f Hours.\r\n",i, timetick_f_Last);                        // 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("Cons. Acumulado:      %f l\r\n", LCounter);
             lcd.printf("VCO:                      %d km/h\r\n", VCO); 
+            
+
+            NAVIGATION_VMATRIX.interpolate(); 
+            
             //build_test_Mtrx(NAVIGATION_VMATRIX);    // DEBUG Curve
-            //print_VCO_curve(NAVIGATION_VMATRIX);
+            //print_VCO_curve(NAVIGATION_VMATRIX,1);
             }
             else
             {
@@ -272,20 +284,7 @@
             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 {
@@ -298,6 +297,9 @@
             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);                
+               
+            //build_test_Mtrx(NAVIGATION_VMATRIX);     //DEBUG
+               
                }
                
                
@@ -308,7 +310,7 @@
             lcd.background(Green);
             lcd.puts(425-60, 22, "GET CURVE");
             lcd.background(Black);
-            wait_us(5);
+            //wait_us(1);
             if (lcd.TouchPanelReadable(&p)) {
             //lcd.foreground(Blue);
             //lcd.SetTextCursor(10, 15);
@@ -319,9 +321,11 @@
             lcd.foreground(Red);
             lcd.puts(400-38, 20, "GET CURVE");
             //build_test_Mtrx(NAVIGATION_VMATRIX);    // DEBUG Curve
-            print_VCO_curve(NAVIGATION_VMATRIX);
+            print_VCO_curve(NAVIGATION_VMATRIX,0);
             //lcd.foreground(RGB(255,255,0));
-            wait(10);
+            wait(5);
+            print_VCO_curve(NAVIGATION_VMATRIX,1);
+            wait(5);
             break;
                 //GetScreenCapture();
             }