Guillermo Stedile / Mbed 2 deprecated SNOCC_V2

Dependencies:   NAVDATA RA8875 SDFileSystem VCODATA mbed

Revision:
1:30b1ca228fc7
Parent:
0:e40cf759ba9a
Child:
2:968b38c3ef49
--- a/main.cpp	Mon May 15 22:52:48 2017 +0000
+++ b/main.cpp	Fri Jun 23 03:59:11 2017 +0000
@@ -7,51 +7,42 @@
 #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" 
-// Agrego include para SD Card
-#include "SDFileSystem.h"
-
-
-#include <sstream>                                  //include this to use string streams
+#include "GPS.h"            // Comunicacion con el gps.
+#include "NAVDATA.h"        // Para la clase NAVDATA que maneja los datos de navegación del último período.
+#include "VCODATA.h"        // Para la clase VCODATA que maneja los datos de navegación más recientes parametrizados por velocidad de cada período.
+#include "SDFileSystem.h"   // SD Card
+#include <sstream>          // Para uso de streams
 #include <string> 
 
+int err_Store=0;
+int TESTING=0;                                     // -->1:Habilita test de funcionamiento del almacenamiento de datos.
+int DEBUG1=1;                                       // -->1:Habilita informacion para debug.
+int DEBUG2=1;                                       // -->1:Habilita informacion para debug2.
+int DEBUG_GPS=0;                                   // -->1:Habilita datos para debug de comunicacion con gps.
+enum sentido{DWN=0,UP,NO};
+enum figura{ZONA=0,SIN_DT,CIRC,FLECHA,ElIP};
 const char *sd_dir="/sd/snocc";                     // Directorio de almacenamiento de datos.
 const char *sd_file="/sd/snocc/sdsnocc.csv";        // Archivo csv de almacenamiento de datos. 
-int poll_init=0;                                    // Testigo de inicio de recoleccion de datos.
+const int V_M=54;                                  //Velocidad Maxima
 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_SMOOTH_MTRX(NAVIGATION_TABLE, V_M);    // Objeto que maneja la matriz de datos de navegación promediados $            
-
-
 
-LocalFileSystem local("local");                 // Because I want <PrintScreen>
-Serial pc(USBTX, USBRX);                        // And a little feedback
+NAVDATA NAVIGATION_OBJECT;                          //Objeto que maneja los datos de navegación del último período. (ANTERIORMENTE LLAMADO NAVIGATION_TABLE, nombre que generaba confusion)
+VCODATA NAVIGATION_VMATRIX(NAVIGATION_OBJECT, V_M);          // Objeto que maneja la matriz de datos de navegación            $
+VCODATA NAVIGATION_V_SMOOTH_MTRX(NAVIGATION_OBJECT, V_M);    // Objeto que maneja la matriz de datos de navegación promediados $            
+NAVDATA TestNAV;                                             // Objeto para crear matriz default;   ///  DEBUG?
 
-RA8875 lcd(p5, p6, p7, p8, NC, "tft");          // MOSI, MISO, SCK, /ChipSelect, /reset, name
-  
-SDFileSystem sd(p11, p12, p13, p14, "sd");       // SD CARD: mosi, miso, sclk, cs
-
+LocalFileSystem local("local");                     // Para <PrintScreen>
+Serial pc(USBTX, USBRX);                        
+RA8875 lcd(p5, p6, p7, p8, NC, "tft");              // MOSI, MISO, SCK, /ChipSelect, /reset, name   // Comunicacion con Display
+SDFileSystem sd(p11, p12, p13, p14, "sd");          // SD CARD: mosi, miso, sclk, cs                // Comunicacion con SD card
 
 
  
-//>>>>>>>>>>>>>>>>>>  SECCION AGREGADA PROVISORIAMENTE PARA EL TOUCH PANEL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-
+//>>>>>>>>>>>>>>>>>>  SECCION 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)
@@ -60,12 +51,10 @@
     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);
@@ -75,12 +64,12 @@
             pc.printf(" as /local/Screen%02d.bmp\r\n", i);
             return i;
         } else {
-            fclose(fh);     // close this and try the next
+            fclose(fh);     
         }
     }
     return 0;
 }
-//>>>>>>>>>>>>>>>>>>  FIN SECCION AGREGADA PROVISORIAMENTE PARA EL TOUCH PANEL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+//>>>>>>>>>>>>>>>>>>  FIN SECCION TOUCH PANEL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
  //Función para la interrupción
   
@@ -95,15 +84,16 @@
 
     void print_VCO_curve(VCODATA &Matrix_VCO, int interpolated){    
         //lcd.puts("ENTRANDO a print_VCO_curve\r\n");  // DEBUG
+        int vcc[2];
         float s; // Consumo
         int y,x;
-        int VCO= Matrix_VCO.get_VCO();   
+        int VCO= Matrix_VCO.get_VCO(vcc);   
         int y_offset=250;               //Para que imprima de abajo hacia arriba.
         int y_text_offset=15;           //Para cooregir diferencia de impresion entre caracter y linea.
         int x_offset=30;                //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 x_scale=8;                  // Escala para graficar eje x.
         int y_scale=90;                 // Escala para graficar eje y.
         lcd.background(RGB(255,255,255));
         lcd.foreground(Blue);
@@ -155,7 +145,7 @@
         lcd.SetTextCursor(420,235);
         lcd.puts("Vel.(kn)\r\n");  
         lcd.line(x_i,y_i,Matrix_VCO.vel_max*x_scale+x_offset,y_i);   // Imprimo eje x.
-        for(int j=10;j<=100;j+=10){
+        for(int j=10;j<=Matrix_VCO.vel_max;j+=10){
             int x=j*x_scale+x_offset;
             lcd.line(x,y_i,x,y_i-5); 
             lcd.SetTextCursor(x,y_i+5);
@@ -180,7 +170,7 @@
                 lcd.printf("*");
             } 
             lcd.SetTextCursor(VCO*x_scale+x_offset+10,y_offset-s*y_scale+20);
-            lcd.printf("%f l/m",s);              
+            lcd.printf("%lf l/m",s);              
             lcd.SetTextCursor(VCO*x_scale+x_offset+10,y_offset-s*y_scale+40);
             lcd.printf("VCO: %d kn",VCO);  
 
@@ -196,7 +186,7 @@
     }
     
     
- /* Funcion  print_VCO_data : Imprime una tabla con los datos 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_data : Imprime una tabla con los datos de consumo/milla en funcion de la velocidad a partir del vector de objetos NAV_DATA de la clase VCODATA.
     Parametros: Objeto VCODATA; */
 
     void print_VCO_data(VCODATA &Matrix_VCO){
@@ -210,14 +200,14 @@
             for (int n=0;n<83;n++){                                     // Recorre x de 0 a 83. (Maxima cantidad que entra en una pantalla)    
             cons = Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_mile_p];   // Consumo por milla del período
             vel= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[speed_p];         // Velocidad del período.
-            lcd.printf("|  %d - %f  |  %f  |",n,vel,cons);
+            lcd.printf("|  %d - %lf  |  %lf  |",n,vel,cons);
             } 
             wait(3);
             lcd.cls();
             for (int n=83;n<Matrix_VCO.vel_max;n++){                     // Recorre x de 0 a vel_max.     
             cons = Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_mile_p];   // Consumo por milla del período
             vel= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[speed_p];         // Velocidad del período.
-            lcd.printf("|  %d - %f  |  %f  |",n,vel,cons);
+            lcd.printf("|  %d - %lf  |  %lf  |",n,vel,cons);
             }                                       
             //lcd.SelectUserFont(BPG_Arial20x20);     // Seleccion de tipo y tamaño de letras
     
@@ -227,17 +217,14 @@
 /* Funcion mtrx2sd: Guarda los datos de la matriz en un archivo de texto existente*/
     
     int mtrx2sd(VCODATA &Matrix_VCO, const char *filename){
-            float lngtd_f,lngtd_i,lttd_f,lttd_i,tm_f,tm_i,dstnc_p,spd_p,cnsmptn_i,cnsmptn_f,cnsmptn_p,cns_ml_p,cns_hr_p,cns_ntrpltd; // Variables de navegacion;
+            double lngtd_f,lngtd_i,lttd_f,lttd_i,tm_f,tm_i,dstnc_p,spd_p,cnsmptn_i,cnsmptn_f,cnsmptn_p,cns_ml_p,cns_hr_p,cns_ntrpltd; // Variables de navegacion;
             FILE *fp1;
             fp1 = fopen(filename, "w");   //Apertura para escritura
             if(fp1 == NULL) {
             //error("Could not open file for write\n");
             return -1;
             }       
-            for (int n=0;n<Matrix_VCO.vel_max;n++){
-                //cons = Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_mile_p];   // Consumo por milla del período
-                //vel= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[speed_p];         // Velocidad del período.
-                
+            for (int n=0;n<=Matrix_VCO.vel_max;n++){
                 lngtd_f= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[longitude_f];        // Longitud y Latitud iniciales y finales.
                 lngtd_i= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[longitude_i];
                 lttd_f= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[latitude_f];
@@ -252,8 +239,7 @@
                 cns_ml_p= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_mile_p];        // Consumo en litros por milla nautica.
                 cns_hr_p= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_hour_p];        // Consumo en litros por hora.
                 cns_ntrpltd= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_interpolated];  // Consumo interpolado?: -1-> initial padding
-                
-                
+                               
                 fprintf(fp1,"%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f\r\n",lngtd_f,lngtd_i,lttd_f,lttd_i,tm_f,tm_i,dstnc_p,spd_p,cnsmptn_i,cnsmptn_f,cnsmptn_p,cns_ml_p,cns_hr_p,cns_ntrpltd);
                 }
            return fclose(fp1);
@@ -262,7 +248,7 @@
 /* Funcion sd2mtrx: Guarda los datos de un archivo de texto existente en la matriz*/           
            
     int sd2mtrx(VCODATA &Matrix_VCO, const char *filename){  
-        float lngtd_f,lngtd_i,lttd_f,lttd_i,tm_f,tm_i,dstnc_p,spd_p,cnsmptn_i,cnsmptn_f,cnsmptn_p,cns_ml_p,cns_hr_p,cns_ntrpltd; // Variables de navegacion;  
+        double lngtd_f,lngtd_i,lttd_f,lttd_i,tm_f,tm_i,dstnc_p,spd_p,cnsmptn_i,cnsmptn_f,cnsmptn_p,cns_ml_p,cns_hr_p,cns_ntrpltd; // Variables de navegacion;  
         FILE *fp1;
         fp1 = fopen(filename, "r");   //Apertura para escritura
         if(fp1 == NULL) {
@@ -270,7 +256,7 @@
             return -1;
             }
         for (int n=0;n<Matrix_VCO.vel_max;n++){
-            fscanf(fp1,"%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f",&lngtd_f,&lngtd_i,&lttd_f,&lttd_i,&tm_f,&tm_i,&dstnc_p,&spd_p,&cnsmptn_i,&cnsmptn_f,&cnsmptn_p,&cns_ml_p,&cns_hr_p,&cns_ntrpltd);                 // Leemos un float y lo guardamos
+            fscanf(fp1,"%lf;%lf;%lf;%lf;%lf;%lf;%lf;%lf;%lf;%lf;%lf;%lf;%lf;%lf",&lngtd_f,&lngtd_i,&lttd_f,&lttd_i,&tm_f,&tm_i,&dstnc_p,&spd_p,&cnsmptn_i,&cnsmptn_f,&cnsmptn_p,&cns_ml_p,&cns_hr_p,&cns_ntrpltd);                 // Leemos un double y lo guardamos
             Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[longitude_f]=lngtd_f;
             Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[longitude_i]=lngtd_i;
             Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[latitude_f]=lttd_f;
@@ -291,70 +277,205 @@
         }
            
 /* Funcion build_default_Mtrx: Carga los datos (consumo/milla) del vector LAST_NAV_DATA de los objetos NAVDATA de VCODATA para testing.*/
+/* Si el parámetro virtual_speed  es  cero, se completa la matríz con valores default. Sino, se carga
+   solamente un vector NAVDATA con valores default consistentes con los parámetros y se almacena en la matríz cuando la cantidad
+   de períodos a vel constante es alcanzada. Este caso es utilizado para testing.*/
 
-void   build_default_Mtrx(VCODATA &Test_Matrix_VCO){
-     
-        NAVDATA TestNDO;
+int   build_default_Mtrx(VCODATA &Test_Matrix_VCO,NAVDATA &TestNDO, double virtual_speed, double virtual_timestamp){
+     double virtual_time=0;
+     double virtual_longitude=-58.5797;                   // Mantiene cte la Longitud.
+     double virtual_latitude=-34.4251;
+     double virtual_counter=0;
+     if (virtual_speed==0){
+        //virtual_timestamp=0.00000001;             // en segundos
+        for (int i=1; i< Test_Matrix_VCO.vel_max; i++){
+            virtual_speed= i*1.0;
+                       
+            if (i<12) virtual_time=5.0*i;                          // Formato NMEA: hhmmss,ss
+            else {
+                int mnts=int(5*i/60);
+                virtual_time = ((mnts*100) +((5*i)- (mnts*60)));    // Formato NMEA: (hh)mmss,ss
+            }
+            TestNDO.LAST_NAV_DATA[cons_interpolated]=-1;        // --> -1:Datos iniciales.
+            TestNDO.np_concat=0;                                // Cantidad de periodos concatenados:-->0: Solo valores de inicio.
+            virtual_latitude+=(virtual_speed*5/3600)/(59.99999981628485);// Tomo delta_t virtual de (virtual_speed*Delta t) y                                                                                                        // calculo latitud recorrida en  virtual_timestamp @virtual_speed y longitud cte.
+            if (i<10) virtual_counter+=0.6*i*i;         // Simulacion de consumo; modificar y probar
+            else if (i<20) virtual_counter+=55;
+                 else if(i<30) virtual_counter+=900/i;
+                    else virtual_counter+=0.06*i*i;
+            int err_Rot=TestNDO.rotate_data(virtual_longitude, virtual_latitude, virtual_time, virtual_counter, NAVIGATION_VMATRIX.vel_max);
+            virtual_timestamp+=5;                               // en segundos, 5 segundos de período
+            if(err_Rot==0){                                     // Si la rotacion fue 100% exitosa
+                if(Test_Matrix_VCO.store_data(TestNDO,1)!=0) return -1; //Notar que no requiere validar velocidad constante para almacenar; almacena todos los periodos bien rotados.
+            }
+            else {
+                
+                if(err_Rot==1) return 1;                        // Tiempo entre muestras demasiado grande. Períódo no válido.
+                else return 2;                                  // Timestamp no válido. 
+            }
+        }            
+     }   
+     else{                        // Rota valores para la velocidad indicada, seteando valores crecientes de consumo para testing
+          
  
-        TestNDO.LAST_NAV_DATA[cons_interpolated]=-1;
-        
-        TestNDO.LAST_NAV_DATA[cons_mile_p]=0.3;   // 15-->0.3 ; 16-->0.2; 17-->0.35; 30-->0.1; 32-->0.15; 34-->0.12; 99-->0.25
-        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]=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]=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(); 
-       
-       /*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);
+            TestNDO.np_concat=0;                                // Cantidad de periodos concatenados:-->0: Solo valores de inicio.
+            float virtual_longitude=-58.5797;                   // Mantiene cte la Longitud.
+            float virtual_latitude=-34.4251+((virtual_speed*virtual_timestamp)/(59.99999981628485*3600));// Tomo delta_t virtual de (virtual_speed*virtual_timestamp) y calculo     
+                                                                                                         // latitud navegada en  virtual_timestamp @virtual_speed y longitud cte.
+            virtual_time=virtual_timestamp;                     //en formato NMEA hhmmss,ss
+            float virtual_counter=0.01*virtual_timestamp*virtual_timestamp;         // Simulacion de consumo creciente; modificar y probar
+            int err_Rot=TestNDO.rotate_data(virtual_longitude, virtual_latitude, virtual_time, virtual_counter, NAVIGATION_VMATRIX.vel_max);
+            if(err_Rot==0){                                     // Si la rotacion fue 100% exitosa
+                if(Test_Matrix_VCO.store_data(TestNDO,2)==-1) return -1;  // Notar que requiere 2 períodos a igual velocidad para que se almacene definitivamente.
+            }
+            else {
+                if(err_Rot==1) return 1;                        // Tiempo entre muestras demasiado grande. Períódo no válido.
+                else return 2;                                  // Timestamp no válido. 
+            }
+     }            
+        return 0;
+}
+
+
+/* Function print_signal: imprime un simbolo a partir de las coordenadas de un rectangulo: signal=0-> ZONA VCO,1:Sin datos; 2:Circulo; 3:flecha; 4: elipse */
+
+
+void print_signal(int x1, int y1, int x2, int y2, int R, int G, int B, figura FIG, sentido S){
+    int tx1,tx2,tx3,rx1,rx2,ty1,ty2,ty3,ry1,ry2, delta_ty1,delta_ty2,delta_ty3; 
+    int cex,cey,cer1,cer2;
+    cex=(x1+x2)/2;
+    cey=(y1+y2)/2;
+    cer2= (y2-y1)/2;
+    cer1= (x2-x1)/2;
+    
+    switch (S){
+          case 1: {        // UP
+            tx1=(x2+x1)/2;
+            ty1=y1;
+            tx2=x2;
+            ty2=(y2+y1)/2;
+            tx3=x1;
+            ty3=(y2+y1)/2;
+            delta_ty1=8;
+            delta_ty2=-5;
+            delta_ty3=-5;
+            rx1=(x2+3*x1)/4;
+            ry1=(y2+y1)/2;
+            rx2=(3*x2+x1)/4;
+            ry2=y2;
+        }
+            break;
+        case 0: {         // DWN
+            tx1=(x2+x1)/2;
+            ty1=y2;
+            tx2=x2;
+            ty2=(y2+y1)/2;
+            tx3=x1;
+            ty3=(y2+y1)/2;
+            delta_ty1=-8;
+            delta_ty2=5;
+            delta_ty3=5;
+            rx1=(x2+3*x1)/4;
+            ry1=y1;
+            rx2=(3*x2+x1)/4;
+            ry2=(y2+y1)/2;
         }
-        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);
-        }*/
-     }   
+        break;
+        default:
+        break;
+    }
+    switch (FIG){
+            case 0:
+                lcd.roundrect( x1-8,y1-8,x2+8,y2+8, 10,8,    BrightBlue);
+                lcd.roundrect( x1-4,y1-4, x2+4,y2+4, 10,8,    RGB(153,0,153));
+                lcd.foreground(BrightBlue);   
+                lcd.fillroundrect( x1+2,y1+2, x2-2,y2-2, 5,4,    RGB(R,G,B));
+                lcd.SetTextCursor(x1+10,y1+(y2-y1)/5);
+                lcd.background(BrightGreen);
+                lcd.foreground(White);
+                lcd.printf ("NAVEGANDO");
+                lcd.SetTextCursor(x1+55,y1+(y2-y1)/2-10);
+                //lcd.SetTextCursor(132,140);
+                lcd.printf ("EN");
+                lcd.SetTextCursor(x1+15,y1+(y2-y1)*2/3);
+                //lcd.SetTextCursor(135,170);  
+                lcd.printf ("ZONA VCO");          
+            break;
+            case 1:
+                lcd.roundrect( x1-8,y1-8,x2+8,y2+8, 10,8,    BrightBlue);
+                lcd.roundrect( x1-4,y1-4, x2+4,y2+4, 10,8,    RGB(153,0,153));
+                lcd.foreground(BrightBlue);     
+                lcd.SetTextCursor(x1+10,y1+28);
+                lcd.printf ("SIN DATOS");
+                lcd.SetTextCursor(x1+1,y1+48);
+                lcd.printf ("SUFICIENTES\r\n");                  
+            break;
+            case 2:   
+                lcd.circle(       cex,cey,  cer2+10, BrightBlue);
+                lcd.fillcircle(   cex,cey,cer2+5,RGB(R,G,B));
+                
+            break;
+            case 3: 
+                lcd.roundrect( x1-8,y1-8,x2+8,y2+8, 10,8,    BrightBlue);
+                lcd.roundrect( x1-4,y1-4, x2+4,y2+4, 10,8,    RGB(153,0,153));
+                lcd.fillroundrect(rx1,ry1, rx2,ry2,  5,3,   RGB(R,G,B) );
+                lcd.filltriangle( tx1,ty1, tx2,ty2, tx3,ty3, RGB(R,G,B));
+                lcd.SetTextCursor(x1+(x2-x1)/2-9,y1+(y2-y1)/5);
+                lcd.background(BrightGreen);
+                lcd.foreground(Black);
+                lcd.printf ("A");
+                lcd.SetTextCursor(x1+(x2-x1)/3-6,y1+(y2-y1)/2-10);
+                //lcd.SetTextCursor(132,140);
+                lcd.printf ("ZONA");
+                lcd.SetTextCursor(x1+(x2-x1)/3-3,y1+(y2-y1)*2/3);
+                //lcd.SetTextCursor(135,170);
+                lcd.printf ("VCO");  
+            break;
+            case 4:
+                lcd.ellipse(      cex,cey,  cer1,cer2, BrightBlue);
+                lcd.fillellipse(  cex,cey, cer1-5,cer2-5, RGB(R,G,B));
+            default:  
+                lcd.circle(       cex,cey,  cer2+10, Blue);
+                lcd.fillcircle(   cex,cey,cer2+5,RGB(R,G,B));     
+            break;    
+  
+        }       
+          
+            
+//      lcd.printf("printing 3 x 2 = %d", 3*2);
+//     lcd.circle(       cex,cey,  cer2+10,               Blue);
+//     lcd.fillcircle(   cex,cey,cer2+5,               Cyan);
+///     lcd.ellipse(      440,75,  35,20,            BrightBlue);
+///     lcd.fillellipse(  440,75,  25,10,            Blue);
+//     lcd.triangle(     tx1,ty1,tx2,ty2,tx3,ty3, Blue);
+//    lcd.filltriangle( tx1,ty1+delta_ty1, tx2-5,ty2+delta_ty2, tx3+5,ty3+delta_ty3, RGB(R,G,B));
 
+///     lcd.rect(         400,130, 475,155,          Brown);
+///     lcd.fillrect(     405,135, 470,150,          Pink);
+
+//     lcd.fillroundrect(x1-4,y1-4, x2+4,y2+4,  5,3,Blue); 
+//     lcd.roundrect( rx1,ry1,rx2,ry2, 10,8,    Blue);
+//     lcd.fillroundrect(rx1+5,ry1+5, rx2-5,ry2-5,  5,3,   RGB(R,G,B) );
+
+}
+
+
+//###################-----------  MAIN  ------------#########################
     
 int main()
-{
-    pc.baud(460800);                                           // I like a snappy terminal, so crank it up!
+{   int VCC[2];     // Array de valores crucero críticos. VCC[0]=VCO; VCC[1]=VMC (Velocidad de Máximo Consumo)
+    VCC[0]=-1;
+    VCC[1]=-1;
+    int R,G,B=0;
+    int R1,G1,B1=0;
+    int err_Mtrx=0;  
+    float PRFM=-1;    // Performance
+    sentido SENTIDO;  // Sentido de la flecha
+    figura FIG;       // 
+    pc.baud(460800);                                           
     pc.printf("\r\nRA8875 Soft Fonts - Build " __DATE__ " " __TIME__ "\r\n");
     lcd.init();
-    lcd.TouchPanelCalibrate("Calibrate the touch panel");   // 4 touch
+    lcd.TouchPanelCalibrate();   // Funcion modificada para fijar calibracion.
     lcd.cls();
     rect_t PrintScreenRect = { 425-65, 20, 425+65, 60};     // Rectangulo para encuadrar boton.
     lcd.foreground(RGB(255,255,0));                         // Seteo del color de las letras.
@@ -363,113 +484,357 @@
     
 
 //-------------------------------------------------------------------------------------------------------------         
-//      Sensor de flujo:       
-
+//  Sensor de flujo:       
     InterruptIn pulse_sensor(p15);          // Defino pulse_sensor como una entrada de interrupción en p15 .
     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)
     pulse_sensor.fall(&trigger); 
+//--------------------------------------------------------------------------------------------------------------           
  
- //--------------------------------------------------------------------------------------------------------------           
     lcd.SetTextCursor(0,0);                 // Posicionamiento de cursor.
-    lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");
-    
-    if (!sd2mtrx(NAVIGATION_VMATRIX, sd_file)) lcd.puts("Datos leidos de SD card\r\n");                       // Cargo matriz desde SD.
+    lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");   
+    if (!sd2mtrx(NAVIGATION_VMATRIX, sd_file)) lcd.puts("Datos leidos de SD card\r\n");                         // Cargando matriz desde SD.
     else{
         lcd.puts("Error al leer los datos.\r\n Inicio sin datos historicos.\r\n");
-        lcd.printf("Creando directorio en SD card...\r\n");
-        if(!mkdir(sd_dir, 0777)){                                                                               // Creo directorio si no existe.
-        lcd.printf("Creado:  %s\r\n", sd_dir);
-        lcd.printf("Cargando datos de inicio default en SD card...\r\n");
-        build_default_Mtrx(NAVIGATION_VMATRIX);                                                                 // Creando matriz de inicio default.
+        if (TESTING){
+            err_Mtrx=build_default_Mtrx(NAVIGATION_VMATRIX,TestNAV,0,0);
+            if(err_Mtrx!=0) lcd.printf("Error al crear la Matriz default.%d\r\n",err_Mtrx);   // Creando matriz de inicio default.
+            else lcd.printf("Matriz default creada con exito.\r\n");
+        }
         if (!mtrx2sd(NAVIGATION_VMATRIX, sd_file)) lcd.printf("Datos default guardados en SD card\r\n");
-        else lcd.puts("Error al guardar los datos default.\r\nNo se podran almacenar los datos.\r\n");
+        else {
+            lcd.puts("Error al guardar los datos default.\r\nCreando directorio en SD card...\r\n");
+            if(!mkdir(sd_dir, 0777)){                                                                               // Creando directorio si no existe.
+                lcd.printf("Creado:  %s\r\n", sd_dir);
+                lcd.printf("Cargando datos de inicio default en SD card...\r\n");
+                if (!mtrx2sd(NAVIGATION_VMATRIX, sd_file)) lcd.printf("Datos default guardados en SD card\r\n");
+                else lcd.puts("Error al guardar los datos default.\r\nNo se podran almacenar los datos.\r\n");
+            }
+            else lcd.puts("Error al guardar los datos default.\r\nNo se podran almacenar los datos.\r\n");
         }
-        else lcd.puts("Error al crear directorio en SD card. No se podran almacenar los datos.\r\n");
-        } 
+    }    
     wait(3);
+         
+       float delta=5.0;//DEBUG
+       float virtual_tmstmp=0.0;//DEBUG 
        
-              
+    int   prueba=0;  // BORRAR ESTO. ES SOLO PARA PROBAR <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        
+// --------------------------------  LOOP INFINITO  ------------------------------------
     while(1) {
             
         lcd.SetTextCursor(0,0);             // Pongo cursor en posicion
         lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");
-        //lcd.printf("M0: %s \r\n\r\n", gps.msg);  //Imprimo el mensaje crudo proveniente de la uart
+        if (DEBUG_GPS) lcd.printf("M0: %s \r\n\r\n", gps.msg);  //Imprimo el mensaje crudo proveniente de la uart
          
-        if(gps.sample()) {             // Si es exitosa la obtencion de datos del gps.
-            poll_init=1;               
+        if(gps.sample()) {                                      // Si es exitosa la obtencion de datos del gps.                        
             lcd.cls();
-            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.SetTextCursor(0,0);                      // Pongo cursor en posicion
+            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.SetTextCursor(0,0);                             // 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 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];
-            float cons_mile_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[cons_mile_p];
-            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("Speed_f_Last(%d):     %f km/h.\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); 
-            
+            if (!NAVIGATION_OBJECT.rotate_data(gps.longitude, gps.latitude, gps.time, Counter,NAVIGATION_VMATRIX.vel_max )){
+                NAVIGATION_OBJECT.LAST_NAV_DATA[cons_interpolated]=0; // Dato tipo recolectado
+                err_Store=NAVIGATION_VMATRIX.store_data(NAVIGATION_OBJECT,2); // Luego de rotar los datos en la tabla de navegacion, 
+                                                                    // la guarda en la matriz segun criterios de la clase VCODATA
+                    
+                int i=int(NAVIGATION_OBJECT.LAST_NAV_DATA[speed_p]);   
+                //int VCO=NAVIGATION_VMATRIX.get_VCO(&VCC[0]);
+                NAVIGATION_V_SMOOTH_MTRX.smooth(4, NAVIGATION_VMATRIX); // Genera matriz de datos filtrados con pasabajos
+                int VCO=NAVIGATION_V_SMOOTH_MTRX.get_VCO(&VCC[0]);      // VCO OBTENIDA DE MATRIZ FILTRADA.
+                
+                           
+                if (DEBUG1) {    
+                lcd.puts("Rotacion exitosa!-->");   
+                lcd.printf("Error de rotacion:\t %d\r\n",err_Store);                                            // DEBUG
+                lcd.printf("Speed_f_Mtrx(%d):\t     %lf kn.\r\n",i, NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[speed_p]);                              // DEBUG
+                lcd.printf("Speed_f_Last(%d):\t\t     %lf km/h.\r\n",i, NAVIGATION_OBJECT.LAST_NAV_DATA[speed_p]*1.852);                    // DEBUG
+                lcd.printf("Time_f_Mtrx(%d):\t      %lf Hours.\r\n",i, NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[time_f]);                        // DEBUG
+                lcd.printf("Time_f_Last(%d):\t      %lf Hours.\r\n",i, NAVIGATION_OBJECT.LAST_NAV_DATA[time_f]);                        // DEBUG
+                lcd.printf("Dist_p_Mtrx(%d):\t      %lf miles.\r\n",i,NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[distance_p]);                         // DEBUG
+                }
+                lcd.printf("Posicion: Long(%d):\t   %lf    ; Lat:     %lf\r\n",i,NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[longitude_f],NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[latitude_f]);   // DEBUG
+                lcd.printf("FlujoVCOmtrx(%d):\t     %lf Litros/Hora\r\n",i, NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[cons_hour_p]);                  // DEBUG
+                lcd.printf("FlujoVCOmtrx(%d):\t     %lf Litros/Milla\r\n",i, NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[cons_mile_p]);                 // DEBUG
+                lcd.printf("Cons. Acumulado:\t      %lf l\r\n", LCounter);
+                lcd.printf("VCO:\t                  %d knots\r\n", VCO); 
+                
+                NAVIGATION_VMATRIX.interpolate();                                                              // Interpolacion.
+                if (!mtrx2sd(NAVIGATION_VMATRIX, sd_file)) lcd.printf("Datos guardados en SD card\r\n");       // Almacenamiento de datos en SD.
+                else lcd.printf("Error al guardar los datos.\r\n");
+                
+//_____________________________________________________________________________________________________________________
+                int signal_x=80;   // REGION DE SEÑALIZACION
+                int signal_y=60;
+                int signal_x_sz=120;
+                int signal_y_sz=150;
+                
+                //PRFM=NAVIGATION_VMATRIX.performance(i);
+                PRFM=NAVIGATION_V_SMOOTH_MTRX.performance(i); // PERFORMANCE OBTENIDA DE MATRIZ FILTRADA.
+                
+                R1=0;       // COLOR DEFAULT PARA CIRCULO DE REFERENCIA DE PERFORMANCE (VERDE)
+                G1=255;
+                B1=0;
+                lcd.foreground(RGB(R1,G1,B1));
+                lcd.SetTextCursor(200,245);
+                lcd.printf("VCO: %d \t\t",VCC[0]);
+                lcd.printf("VMC: %d \r\n",VCC[1]);
+                if (PRFM!=-1 && VCC[0]!=-1){
+                    if (PRFM>0.98) {
+                        R=0;
+                        G=255;
+                        B=0;
+                    }    
+                    else {
+                        if (PRFM<0.75){
+                            R=255;
+                            G=255*4*PRFM/3;
+                            B=0;
+                        }    
+                        else {
+                            R=255*4*(1-PRFM);
+                            G=255;
+                            B=0;
+                        }    
+                    } 
+                    float delta_vel= NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[speed_p]-VCC[0];    // ES IGUAL QUE EN MTRX FILTRADA               
+                    if (fabs(delta_vel)<2){
+                        FIG=ZONA;  
+                        signal_x=60;   // REGION DE SEÑALIZACION
+                        signal_y=80;
+                        signal_x_sz=150;
+                        signal_y_sz=120;
+                    }    
+                    else FIG=FLECHA;
+                    if (delta_vel<0) SENTIDO=UP;
+                    else SENTIDO=DWN;
+                 
+                    
+                print_signal(signal_x, signal_y, signal_x + signal_x_sz,signal_y + signal_y_sz, 0, 255, 0,FIG,SENTIDO);  //  SI ESTA EN ENTORNO DE VCO-->  IMPRIMIR "ZONA VCO". 
+                
+                }
+                else {
+                    int signal_x=80;   //CAMBIO ZONA DE SEÑALIZACION (PARA TEXTO "SIN DATOS..")
+                    int signal_y=85;
+                    signal_y_sz=100;    
+                    signal_x_sz=130;
+                    R1=190;
+                    G1=190;
+                    B1=190;
+                    print_signal(signal_x, signal_y, signal_x + signal_x_sz,signal_y + signal_y_sz,R,G,B,SIN_DT,NO);   // SIN DATOS: SOLO RECUADRO PARA TEXTO
+    
+                } 
+                signal_x=265;            // ZONA PERFORMANCE
+                signal_y=85;
+                signal_x_sz=90;
+                signal_y_sz=90;             
+                print_signal(signal_x, signal_y, signal_x + signal_x_sz,signal_y + signal_y_sz, R1, G1, B1,CIRC,NO);     // CIRCULO VERDE
+                
+                if (PRFM >= 0){
+                    if (SENTIDO==DWN) {
+                        print_signal(signal_x+5, (signal_y+5)-(signal_y_sz*(1-PRFM)), signal_x+signal_x_sz-5, (signal_y+signal_y_sz-5)-(signal_y_sz*(1-PRFM)), R, G, B,CIRC,NO);
+                        lcd.SetTextCursor(signal_x+20,(signal_y+5)-(signal_y_sz*(1-PRFM))+ 25);                
+                        lcd.foreground(RGB(0,0,0));
+                        lcd.background(RGB(R,G,B));
+                        lcd.SelectUserFont(BPG_Arial31x32);
+                        lcd.printf ("%.2f\r\n",PRFM);
+                    }    
+                    else {
+                        print_signal(signal_x+5, (signal_y+5)+(signal_y_sz*(1-PRFM)), signal_x+signal_x_sz-5, (signal_y+signal_y_sz-5)+(signal_y_sz*(1-PRFM)), R, G, B,CIRC,NO);
+                        lcd.SetTextCursor(signal_x+20,(signal_y+5)+(signal_y_sz*(1-PRFM))+ 25);
+                        lcd.foreground(RGB(0,0,0));
+                        lcd.background(RGB(R,G,B));
+                        lcd.SelectUserFont(BPG_Arial31x32);
+                        lcd.printf ("%.2f\r\n",PRFM);       
+                    }
+                }    
+                lcd.background(Black);
+                lcd.foreground(RGB(0,255,0));
+                lcd.SetTextCursor(20,245);
+                lcd.SelectUserFont(BPG_Arial20x20);
+                lcd.printf("VEL: %.1f \r\n",NAVIGATION_OBJECT.LAST_NAV_DATA[speed_p]);    // VELOCIDAD ACTUAL.
 
-            NAVIGATION_VMATRIX.interpolate();                                                              // Interpolacion.
-            if (!mtrx2sd(NAVIGATION_VMATRIX, sd_file)) lcd.printf("Datos guardados en SD card\r\n");       // Almacenamiento de datos en SD.
-            else lcd.printf("Error al guardar los datos.\r\n");
-           
-            //build_default_Mtrx(NAVIGATION_VMATRIX);    // DEBUG Curve
-            //print_VCO_curve(NAVIGATION_VMATRIX,1);
+//____________________________________________________________________________________________________________________________________________________________              
             }
             else lcd.puts("Periodo no valido!\r\n");  
            
-            } 
-            else {
+        } 
+        else {    // No hay datos gps
             lcd.background(Black);
             lcd.cls();
-            lcd.foreground(RGB(255,255,0));             // Seteo del color de las letras.
+            lcd.foreground(RGB(0,255,0));             // Seteo del color de las letras.
             lcd.SelectUserFont(BPG_Arial20x20);         // Seleccion de tipo y tamaño de letras
             lcd.SetTextCursor(0,0);                     // Posicionamiento de cursor.
             lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");
-            lcd.SetTextCursor(0,100);    
+            lcd.SetTextCursor(0,20);    
             
+            if (!mtrx2sd(NAVIGATION_VMATRIX, sd_file)) lcd.printf("Datos default guardados en SD card\r\n");     //DEBUG
+            else lcd.printf("Error al guardar los datos default.\r\n");                                                  //DEBUG
+                    
+            lcd.printf("Aun no hay datos gps disponibles. Usando historicos.\r\n");
 
-    if (!mtrx2sd(NAVIGATION_VMATRIX, sd_file)) lcd.printf("Datos guardados en SD card\r\n");
-    else lcd.printf("Error al guardar los datos.\r\n");
+            //lcd.printf("Timetick %lf h\r\n", NAVIGATION_OBJECT.LAST_NAV_DATA[time_f]); 
+            
+            //_____________________________________________________________________________________________________________________
+            int signal_x=80;   // REGION DE SEÑALIZACION
+            int signal_y=60;
+            int signal_x_sz=120;
+            int signal_y_sz=150;
+            
+            if (prueba >= NAVIGATION_VMATRIX.vel_max) prueba=prueba-NAVIGATION_VMATRIX.vel_max;
+            PRFM=NAVIGATION_VMATRIX.performance(prueba);
+            R1=0;       // COLOR DEFAULT PARA CIRCULO DE REFERENCIA DE PERFORMANCE (VERDE)
+            G1=255;
+            B1=0;
+            lcd.foreground(RGB(R1,G1,B1));
+            //lcd.printf("Indice: %d \r\n",prueba);
+            //lcd.printf("Perf.: %f \r\n",PRFM);
+            lcd.SetTextCursor(200,245);
+            lcd.printf("VCO: %d \t\t",NAVIGATION_VMATRIX.get_VCO(&VCC[0]));
+            lcd.printf("VMC: %d \r\n",VCC[1]);
+            if (PRFM!=-1 && VCC[0]!=-1){
+                if (PRFM>0.98) {
+                    R=0;
+                    G=255;
+                    B=0;
+                }    
+                else {
+                    if (PRFM<0.75){
+                        R=255;
+                        G=255*4*PRFM/3;
+                        B=0;
+                    }    
+                    else {
+                        R=255*4*(1-PRFM);
+                        G=255;
+                        B=0;
+                    }    
+                } 
+                float delta_vel= NAVIGATION_VMATRIX.NAV_DATA[prueba].LAST_NAV_DATA[speed_p]-VCC[0];
+                
+                //float delta_vel=int(NAVIGATION_OBJECT.LAST_NAV_DATA[speed_p])-VCC[0];
+                
+                if (fabs(delta_vel)<2){
+                    FIG=ZONA;  
+                    signal_x=60;   // REGION DE SEÑALIZACION
+                    signal_y=80;
+                    signal_x_sz=150;
+                    signal_y_sz=120;
+                }    
+                else FIG=FLECHA;
+                if (delta_vel<0) SENTIDO=UP;
+                else SENTIDO=DWN;
+             
+                
+            print_signal(signal_x, signal_y, signal_x + signal_x_sz,signal_y + signal_y_sz, 0, 255, 0,FIG,SENTIDO);  //  SI ESTA EN ENTORNO DE VCO-->  IMPRIMIR "ZONA VCO". 
+            
+            /*
+            lcd.SetTextCursor(signal_x+signal_x_sz/2-6,signal_y+signal_y_sz/4);
+            lcd.background(RGB(0,255,0));
+            lcd.foreground(RGB(0,0,255));
+            lcd.printf ("A");
+            lcd.SetTextCursor(signal_x+signal_x_sz/3-3,signal_y+signal_y_sz/2-10);
+            //lcd.SetTextCursor(132,140);
+            lcd.printf ("ZONA");
+            lcd.SetTextCursor(signal_x+signal_x_sz/3,signal_y+2*signal_y_sz/3);
+            //lcd.SetTextCursor(135,170);
+            lcd.printf ("VCO");  
+            */
+          
             
-            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);                
-               
-            //if (poll_init==0) build_default_Mtrx(NAVIGATION_VMATRIX);     //DEBUG
-               
-               }
+            //lcd.printf("Delta_v: %.0f \r\n",delta_vel);
+            }
+            else {
+                int signal_x=80;   //CAMBIO ZONA DE SEÑALIZACION (PARA TEXTO "SIN DATOS..")
+                int signal_y=85;
+                signal_y_sz=100;    
+                signal_x_sz=130;
+                R1=190;
+                G1=190;
+                B1=190;
+                print_signal(signal_x, signal_y, signal_x + signal_x_sz,signal_y + signal_y_sz,R,G,B,SIN_DT,NO);   // SIN DATOS: SOLO RECUADRO PARA TEXTO
+
+            } 
+            signal_x=265;            // ZONA PERFORMANCE
+            signal_y=85;
+            signal_x_sz=90;
+            signal_y_sz=90;             
+            print_signal(signal_x, signal_y, signal_x + signal_x_sz,signal_y + signal_y_sz, R1, G1, B1,CIRC,NO);     // CIRCULO VERDE
+            
+            if (SENTIDO==DWN){
+                print_signal(signal_x+5, (signal_y+5)-(signal_y_sz*(1-PRFM)), signal_x+signal_x_sz-5, (signal_y+signal_y_sz-5)-(signal_y_sz*(1-PRFM)), R, G, B,CIRC,NO);
+                lcd.SetTextCursor(signal_x+20,(signal_y+5)-(signal_y_sz*(1-PRFM))+ 25);                
+                lcd.foreground(RGB(0,0,0));
+                lcd.background(RGB(R,G,B));
+                lcd.SelectUserFont(BPG_Arial31x32);
+                if (PRFM >= 0) lcd.printf ("%.2f\r\n",PRFM);
+            }    
+            else {
+                print_signal(signal_x+5, (signal_y+5)+(signal_y_sz*(1-PRFM)), signal_x+signal_x_sz-5, (signal_y+signal_y_sz-5)+(signal_y_sz*(1-PRFM)), R, G, B,CIRC,NO);
+                lcd.SetTextCursor(signal_x+20,(signal_y+5)+(signal_y_sz*(1-PRFM))+ 25);
+                lcd.foreground(RGB(0,0,0));
+                lcd.background(RGB(R,G,B));
+                lcd.SelectUserFont(BPG_Arial31x32);
+                lcd.printf ("%.2f\r\n",PRFM);       
+            }
+            lcd.background(Black);
+            lcd.foreground(RGB(0,255,0));
+            lcd.SetTextCursor(20,235);
+            lcd.printf("Flujo Acum: %.1f \r\n",LCounter);
+            lcd.SetTextCursor(20,245);
+            lcd.SelectUserFont(BPG_Arial20x20);
+            lcd.printf("Speed_p: %.1f \r\n",NAVIGATION_VMATRIX.NAV_DATA[prueba].LAST_NAV_DATA[speed_p]);
+            prueba++;
+            //______________________________________________________________________________________________________________________
+            
+            if (TESTING){      //DEBUG
+
+           // ESTA PARTE ES PARA PROBAR EL FUNCIONAMIENTO DE LA ROTACION Y ALMACENAMIENTO DE DATOS......DEBUG.
+            //lcd.SelectUserFont(BPG_Arial10x10);         // Seleccion de tipo y tamaño de letras
+            
+            float vrtl_speed=12;   // pruebo cargar datos para velocidad 12.
+            TestNAV.LAST_NAV_DATA[cons_interpolated]=0;        // --> -1:Datos iniciales. 0--> recolectado (setear para testing)
+            err_Mtrx=build_default_Mtrx(NAVIGATION_VMATRIX, TestNAV, vrtl_speed, virtual_tmstmp);
+            if(err_Mtrx!=0){
+                lcd.printf("Error al cargar datos en la Matriz default.%d..\r\n", err_Mtrx); // DEBUG; ya se crea la matriz en el arranque, si no hay archivo.
+            }
+            else lcd.printf("Datos para virtual_speed= %.1f cargado con exito.\r\n",vrtl_speed);            
+            lcd.printf("Virtual_Timestamp=%.2f.\t",virtual_tmstmp);//DEBUG
+            virtual_tmstmp+=delta; // DEBUG  Esta en formato NMEA(hhmmss.ss): no son validos los valores de segundos mayores a 59, por lo tanto
+                                                 // cuando se ingrese 100,00 despues de 95,00 se espera que el sistema no valide la ronda pues en ese
+                                                 // formato 100,00 < 95,00  (1m < 95s); seria un valor entrante menor que el anterior.
+            
+            lcd.printf("V_time(h):%lf\r\n",TestNAV.time_NMEA2hours(virtual_tmstmp));
+
+            // FIN   DE LA PARTE PARA PROBAR EL FUNCIONAMIENTO DE LA ROTACION Y ALMACENAMIENTO DE DATOS......DEBUG.
+            
+            }
+            if (DEBUG2){
+             int buff_indx=int(NAVIGATION_VMATRIX.NAV_DATA[NAVIGATION_VMATRIX.vel_max].LAST_NAV_DATA[speed_p]+0.5); // DEBUG
+             lcd.printf("Cons_m_p[%d]=  %.3f l/ml\t",buff_indx, NAVIGATION_VMATRIX.NAV_DATA[buff_indx].LAST_NAV_DATA[cons_mile_p]); 
+             lcd.printf("Dist_p[%d]=  %lf ml\r\n",buff_indx, NAVIGATION_VMATRIX.NAV_DATA[buff_indx].LAST_NAV_DATA[distance_p]);
+             lcd.printf("Tiempo_f[%d]=  %lf h\t",buff_indx, NAVIGATION_VMATRIX.NAV_DATA[buff_indx].LAST_NAV_DATA[time_f]);
+             lcd.printf("Tiempo_i[%d]=  %lf h\r\n",buff_indx, NAVIGATION_VMATRIX.NAV_DATA[buff_indx].LAST_NAV_DATA[time_i]);
+             lcd.printf("Buff_INDX =  %d \t", buff_indx);
+             lcd.printf("Speed_p[%d]=  %.2f knots\r\n",buff_indx, NAVIGATION_VMATRIX.NAV_DATA[buff_indx].LAST_NAV_DATA[speed_p]);
+             lcd.printf("Per_con[vel_max]=  %d \t", NAVIGATION_VMATRIX.NAV_DATA[NAVIGATION_VMATRIX.vel_max].np_concat);
+             lcd.printf("V_buff[%d]=  %.2f\t", NAVIGATION_VMATRIX.vel_max,NAVIGATION_VMATRIX.NAV_DATA[NAVIGATION_VMATRIX.vel_max].LAST_NAV_DATA[speed_p]);
+             lcd.printf("TestNAV-time_f =  %lf \t", TestNAV.LAST_NAV_DATA[time_f]);
+             lcd.printf("TestNAV-time_i =  %lf \r\n", TestNAV.LAST_NAV_DATA[time_i]);
+             lcd.printf("TestNAV-max_per_t =  %lf \t", TestNAV.max_period_time);
+             lcd.printf("TestNAV-time_p =  %lf \r\n", TestNAV.LAST_NAV_DATA[time_f]-TestNAV.LAST_NAV_DATA[time_i]);
+             lcd.printf("TestNAV-cons_m_p =  %lf \t", TestNAV.LAST_NAV_DATA[cons_mile_p]);
+             lcd.printf("TestNAV-cons_h_p =  %lf \r\n", TestNAV.LAST_NAV_DATA[cons_hour_p]);
+             //lcd.SelectUserFont(BPG_Arial20x20);         // Seleccion de tipo y tamaño de letras
+             }// FIN DEBUG
+             }
                          
-           for (int i=0;i<200;i++) {                 // Barrido para el touch
+            for (int i=0;i<200;i++) {                 // Barrido para el touch
             point_t p;
-            lcd.fillrect(PrintScreenRect, Green);
-            lcd.foreground(Blue);
+            lcd.fillroundrect(PrintScreenRect,5,2, Green);
+            lcd.roundrect(PrintScreenRect, 5,2, BrightBlue);
+            lcd.foreground(BrightBlue);
             lcd.background(Green);
             lcd.puts(425-60, 22, "GET CURVE");
             lcd.background(Black);
@@ -483,7 +848,7 @@
             if (Intersect(PrintScreenRect, p)) {
             lcd.foreground(Red);
             lcd.puts(400-38, 20, "GET CURVE");
-            //build_default_Mtrx(NAVIGATION_VMATRIX);    // DEBUG Curve
+            //if(build_default_Mtrx(NAVIGATION_VMATRIX)==-1) lcd.printf("Error al crear la Matriz default...\r\n");     // DEBUG Curve
             NAVIGATION_V_SMOOTH_MTRX.smooth(4, NAVIGATION_VMATRIX); // Genera matriz de datos filtrados con pasabajos
             //lcd.puts(425-120, 22, "ANTES de PRINT");                     //DEBUG
             print_VCO_curve(NAVIGATION_VMATRIX,0);                  // Valores recolectados
@@ -497,10 +862,13 @@
             wait(3);
             print_VCO_curve(NAVIGATION_V_SMOOTH_MTRX,2);            // Suavizados (lineas)
             wait(3);
-            print_VCO_data(NAVIGATION_VMATRIX);                     // Volcado de datos
-            wait(4);
+            if (DEBUG2){
+                print_VCO_data(NAVIGATION_VMATRIX);                     // Volcado de datos
+                wait(4);
+            }  
+            //GetScreenCapture();  
             break;
-                //GetScreenCapture();
+
             }
             
            }