Para Juan

Dependencies:   NAVDATA RA8875 mbed VCODATA

Files at this revision

API Documentation at this revision

Comitter:
gstedile
Date:
Sun Apr 23 18:27:58 2017 +0000
Parent:
9:fe7de0e11862
Commit message:
Se agrega procesamiento a los datos. Funcion smooth que promedia n puntos del entorno de cada punto.; Se pasan los objetos por referencia en vez de por valor, por un problema, que estimamos que es de memoria.

Changed in this revision

NAVDATA.lib Show annotated file Show diff for this revision Revisions of this file
VCODATA.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/NAVDATA.lib	Mon Apr 17 12:36:08 2017 +0000
+++ b/NAVDATA.lib	Sun Apr 23 18:27:58 2017 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/users/gstedile/code/NAVDATA/#e105a233d4b1
+https://developer.mbed.org/users/gstedile/code/NAVDATA/#b4232b5aa4ed
--- a/VCODATA.lib	Mon Apr 17 12:36:08 2017 +0000
+++ b/VCODATA.lib	Sun Apr 23 18:27:58 2017 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/users/gstedile/code/VCODATA/#302b432beab9
+https://developer.mbed.org/users/gstedile/code/VCODATA/#8b37dcdc2b36
--- 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));
         }
     }