Para Juan

Dependencies:   NAVDATA RA8875 mbed VCODATA

Revision:
10:be7bcb936dcd
Parent:
9:fe7de0e11862
--- a/main.cpp	Mon Apr 17 12:36:08 2017 +0000
+++ b/main.cpp	Sun Apr 23 18:27:58 2017 +0000
@@ -18,12 +18,14 @@
 #include <sstream>                              //include this to use string streams
 #include <string> 
 
+int poll_init=0;                              // Testigo de inicio de recoleccion de datos.
 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, 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 $            
+//VCODATA NAVIGATION_V_INTRP_MTRX(NAVIGATION_TABLE, V_M); // Objeto que maneja la matriz de datos de navegación interpolados $
+VCODATA NAVIGATION_V_SMOOTH_MTRX(NAVIGATION_TABLE, V_M); // Objeto que maneja la matriz de datos de navegación promediados $            
 
 
 
@@ -78,85 +80,130 @@
          }
          
          
- /* 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)*/
+ /* 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)
+    Parametros: Objeto VCODATA; Interpolated: 0 -> no imprime valores interpolados o promediados; 1: interpola con puntos, 2: interpola con lineas*/
 
-    void print_VCO_curve(VCODATA Matrix_VCO, int printline){    
+    void print_VCO_curve(VCODATA &Matrix_VCO, int interpolated){    
+        //lcd.puts("ENTRANDO a print_VCO_curve\r\n");  // DEBUG
         float s; // Consumo
         int y,x;
-        int VCO= Matrix_VCO.get_VCO();
-        int y_offset=200;
-        int x_offset=25;
+        int VCO= Matrix_VCO.get_VCO();   
+        int y_offset=220;               //Para que imprima de abajo hacia arriba.
+        int y_text_offset=15;           //Para cooregir diferencia de impresion entre caracter y linea.
+        int x_offset=18;                //Posicionamiento en x
         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.
+        int y_scale=500;                // Escala para graficar eje y.
         lcd.background(RGB(255,255,255));
         lcd.foreground(Blue);
-        lcd.SetTextCursor(0,0);                      // Pongo cursor en posicion
+        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.roundrect( 5,25, 470,270, 10,8, RGB(255,255,0));
         lcd.fillroundrect(10,30, 465,264,  5,3,  Green);
         lcd.background(Green);
         lcd.foreground(Blue);
-        lcd.SetTextCursor(12,32);
+        lcd.SetTextCursor(20,32);
         lcd.puts("Consumo(l/m)\r\n");
-        lcd.SetTextCursor(240,240);
-        lcd.puts("Velocidad(kn)\r\n");           
+        lcd.SetTextCursor(265,240);
+        lcd.puts("Velocidad(kn)\r\n");  
+        lcd.line(x_i,y_i,Matrix_VCO.vel_max*x_scale,y_i);   // Imprimo eje x.
+        lcd.line(x_i,y_i,x_i,40);                           // Imprimo eje y.
+                 
         lcd.foreground(RGB(255,255,0));
         
           
         
-        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(".");
-        }
+        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 4 l/m => Multiplico por y_scale 
+                                                                    // para que ocupe mas pantalla.
+            x=n*x_scale+x_offset;                                   // para aumentar el span (eje x)       
+            switch (interpolated){ 
+        
+            case 0:  if (Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_interpolated]==0){  //Valores sin interpolar
+                        lcd.SetTextCursor(x,y-y_text_offset);
+                        lcd.printf(".");  
+                        }
+                    break;
+            case 1:  if ((Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_interpolated]==1) || (Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_interpolated]==2))lcd.foreground(Orange); // interpola con puntos de otro color
+                        lcd.SetTextCursor(x,y-y_text_offset);   // el offset adicional es para corregir la diferencia de ubicacion linea-caracter.
+                        lcd.printf(".");
+                        lcd.foreground(RGB(255,255,0));
+                    break;
+            case 2: lcd.line(x_i,y_i,x,y);  // Imprime linea
+                    break;
+            default: 
+                    lcd.SetTextCursor(x,y-y_text_offset);
+                    lcd.printf(".");
+                    break;
+        }        
         x_i=x;
         y_i=y;
         }
         if (VCO>0){
-        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);
+            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 (interpolated==2){
+                lcd.circle(x,y,5); 
+            }                                        
+            else{
+                lcd.SetTextCursor(x,y);         
+                lcd.printf("*");
+            } 
+            lcd.SetTextCursor(VCO*x_scale+x_offset+10,y_offset-s*y_scale);
+            lcd.printf("%f l/m",s);              
+            lcd.SetTextCursor(VCO*x_scale+x_offset+10,y_offset-s*y_scale+20);
+            lcd.printf("VCO: %f kn",s);  
+
         }
         else{
             lcd.SetTextCursor(40,60);         
             lcd.printf("No hay datos suficientes para obtener la VCO");
-            //lcd.printf("%d",VCO);
+            lcd.printf("%d",VCO);//DEBUG
         }
         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){
+void   build_test_Mtrx(VCODATA &Test_Matrix_VCO){
+     
        NAVDATA TestNDO;
+ 
+        TestNDO.LAST_NAV_DATA[cons_interpolated]=-1;
         
-        TestNDO.LAST_NAV_DATA[cons_mile_p]=3;
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=0.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[cons_mile_p]=0.2;
+        TestNDO.LAST_NAV_DATA[speed_p]=16;
+        Test_Matrix_VCO.store_data(TestNDO);
+        Test_Matrix_VCO.store_data(TestNDO);
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=0.35;
+        TestNDO.LAST_NAV_DATA[speed_p]=17;
+        Test_Matrix_VCO.store_data(TestNDO);
+        Test_Matrix_VCO.store_data(TestNDO);
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=0.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;
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=0.15;
+        TestNDO.LAST_NAV_DATA[speed_p]=32;
+        Test_Matrix_VCO.store_data(TestNDO);
+        Test_Matrix_VCO.store_data(TestNDO);        
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=0.12;
+        TestNDO.LAST_NAV_DATA[speed_p]=34;
+        Test_Matrix_VCO.store_data(TestNDO);
+        Test_Matrix_VCO.store_data(TestNDO);
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=0.25;
+        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();
@@ -229,6 +276,7 @@
 
          
         if(gps.sample()) {             // Si es exitosa la obtencion de datos del gps.
+            poll_init=1;               
             lcd.cls();
             lcd.SetTextCursor(0,0);                      // Pongo cursor en posicion
             lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");
@@ -298,12 +346,14 @@
             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
+            //if (poll_init==0) build_test_Mtrx(NAVIGATION_VMATRIX);     //DEBUG
                
                }
                
+           //lcd.puts(425-90, 22, "ANTES DEL FOR");// DEBUG
                
            for (int i=0;i<200;i++) {
+            
             point_t p;
             lcd.fillrect(PrintScreenRect, Green);
             lcd.foreground(Blue);
@@ -320,28 +370,25 @@
             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,0);
-            //lcd.foreground(RGB(255,255,0));
-            wait(5);
-            print_VCO_curve(NAVIGATION_VMATRIX,1);
-            wait(5);
+            build_test_Mtrx(NAVIGATION_VMATRIX);    // DEBUG Curve
+            NAVIGATION_V_SMOOTH_MTRX.smooth(3, NAVIGATION_VMATRIX);
+            //lcd.puts(425-120, 22, "ANTES de PRINT");                     //DEBUG
+            print_VCO_curve(NAVIGATION_VMATRIX,0);  // Valores recolectados
+            wait(2);
+            print_VCO_curve(NAVIGATION_VMATRIX,1);  // Interpolados (puntos)
+            wait(3);
+            print_VCO_curve(NAVIGATION_V_SMOOTH_MTRX,1); // Suavizado (puntos)
+            wait(3);
+        
+            print_VCO_curve(NAVIGATION_VMATRIX,2);      // Interpolados (lineas)
+            wait(3);
+            print_VCO_curve(NAVIGATION_V_SMOOTH_MTRX,2); // Suavizados (lineas)
+            wait(3);
             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));
         }
     }