Guillermo Stedile / Mbed 2 deprecated SNOCC_V2

Dependencies:   NAVDATA RA8875 SDFileSystem VCODATA mbed

Files at this revision

API Documentation at this revision

Comitter:
gstedile
Date:
Mon May 15 22:52:48 2017 +0000
Child:
1:30b1ca228fc7
Commit message:
SD Card

Changed in this revision

NAVDATA.lib Show annotated file Show diff for this revision Revisions of this file
RA8875.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.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
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NAVDATA.lib	Mon May 15 22:52:48 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/gstedile/code/NAVDATA/#b4232b5aa4ed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RA8875.lib	Mon May 15 22:52:48 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/gstedile/code/RA8875/#658889d1eeb8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Mon May 15 22:52:48 2017 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/AlexVC97/code/SDFileSystem/#3bdfc1556537
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/VCODATA.lib	Mon May 15 22:52:48 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/gstedile/code/VCODATA/#c17042fc1c98
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon May 15 22:52:48 2017 +0000
@@ -0,0 +1,513 @@
+
+#include "mbed.h"           // v112
+#include "RA8875.h"         // v102
+#include "MyFont18x32.h"
+#include "BPG_Arial08x08.h"
+#include "BPG_Arial10x10.h"
+#include "BPG_Arial20x20.h"
+#include "BPG_Arial31x32.h"
+#include "BPG_Arial63x63.h"
+
+// Agrego includes para uso en la comunicacion con el gps.
+#include "GPS.h"
+// Agrego includes para la clase NAVDATA que maneja los datos de navegación del último período.
+#include "NAVDATA.h"
+// Agrego includes para la clase VCODATA que maneja los datos de navegación más recientes parametrizados por velocidad de cada período.
+#include "VCODATA.h" 
+// Agrego include para SD Card
+#include "SDFileSystem.h"
+
+
+#include <sstream>                                  //include this to use string streams
+#include <string> 
+
+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.
+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
+
+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
+
+
+
+ 
+//>>>>>>>>>>>>>>>>>>  SECCION AGREGADA PROVISORIAMENTE PARA EL TOUCH PANEL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+extern "C" void mbed_reset();
+
+
+#define min(a,b) ((a<b)?a:b)
+#define max(a,b) ((a>b)?a:b)
+
+bool Intersect(rect_t rect, point_t p)
+{
+    if (p.x >= min(rect.p1.x, rect.p2.x) && p.x <= max(rect.p1.x, rect.p2.x)
+    && p.y >= min(rect.p1.y, rect.p2.y) && p.y <= max(rect.p1.y, rect.p2.y))
+        return true;
+    else
+        return false;
+}
+
+int GetScreenCapture(void)
+{
+    char fqfn[50];
+    int i = 0;
+    
+    pc.printf("Screen Capture... ");
+    for (i=1; i< 100; i++) {
+        snprintf(fqfn, sizeof(fqfn), "/local/Screen%02d.bmp", i);
+        FILE * fh = fopen(fqfn, "rb");
+        if (!fh) {
+            lcd.PrintScreen(0,0,480,272,fqfn);
+            pc.printf(" as /local/Screen%02d.bmp\r\n", i);
+            return i;
+        } else {
+            fclose(fh);     // close this and try the next
+        }
+    }
+    return 0;
+}
+//>>>>>>>>>>>>>>>>>>  FIN SECCION AGREGADA PROVISORIAMENTE PARA EL TOUCH PANEL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ //Función para la interrupción
+  
+    void trigger() {                           
+         Counter++;
+         LCounter=Counter/2500;
+         }
+         
+         
+ /* 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 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=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 y_scale=90;                 // Escala para graficar eje y.
+        lcd.background(RGB(255,255,255));
+        lcd.foreground(Blue);
+        lcd.SelectUserFont(BPG_Arial20x20);
+        lcd.SetTextCursor(0,0);         // Pongo cursor en posicion
+        lcd.cls();
+        lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");
+        lcd.roundrect( 5,20,470,270,10,8, RGB(255,255,0));          // Rectangulo para encuadre de graficos
+        lcd.fillroundrect(10,25,465,264,5,3,  Green);
+        lcd.foreground(RGB(255,255,0));
+        lcd.background(Green);
+           
+        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 2 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;
+        }
+        
+        x_i=x_offset;
+        y_i=y_offset;
+        
+        lcd.SelectUserFont(BPG_Arial10x10);     // Seleccion de tipo y tamaño de letras
+        lcd.background(Green);
+        lcd.foreground(Blue);
+        lcd.SetTextCursor(30,32);
+        lcd.puts("Cons.(l/m)\r\n");
+        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){
+            int x=j*x_scale+x_offset;
+            lcd.line(x,y_i,x,y_i-5); 
+            lcd.SetTextCursor(x,y_i+5);
+            lcd.printf("%d",j);
+        }              
+        lcd.line(x_i,y_i,x_i,40);                           // Imprimo eje y.
+            for(int k=1;k<=5;k++){
+            y=y_offset-k*0.5*y_scale;
+            lcd.line(x_i,y,x_i+10,y); 
+            lcd.SetTextCursor(x_i-15,y+5);
+            if(y>=0)lcd.printf("%.1f",k*0.5);
+            } 
+        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 (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+20);
+            lcd.printf("%f l/m",s);              
+            lcd.SetTextCursor(VCO*x_scale+x_offset+10,y_offset-s*y_scale+40);
+            lcd.printf("VCO: %d kn",VCO);  
+
+        }
+        else{
+            lcd.SetTextCursor(120,35); 
+            lcd.SelectUserFont(BPG_Arial10x10);     // Seleccion de tipo y tamaño de letras        
+            lcd.printf("No hay datos suficientes para obtener la VCO");
+            lcd.printf("%d",VCO);//DEBUG
+        }
+        lcd.foreground(RGB(255,255,0));
+        lcd.background(Black);
+    }
+    
+    
+ /* 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)
+    Parametros: Objeto VCODATA; */
+
+    void print_VCO_data(VCODATA &Matrix_VCO){
+            float cons, vel;
+            lcd.SelectUserFont(BPG_Arial10x10);     // Seleccion de tipo y tamaño de letras
+            lcd.background(RGB(255,255,255));
+            lcd.foreground(Blue);
+            lcd.SetTextCursor(0,0);                 // Pongo cursor en posicion
+            lcd.cls();
+            lcd.puts("Velocidad-Consumo\r\n");
+            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);
+            } 
+            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.SelectUserFont(BPG_Arial20x20);     // Seleccion de tipo y tamaño de letras
+    
+    }
+    
+    
+/* 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;
+            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.
+                
+                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];
+                lttd_i= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[latitude_i];
+                tm_f= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[time_f];                  // El dato (timestamp al final del período en cuestion, en horas) se obtendrá luego proveniente del GPS.
+                tm_i= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[time_i];                  // Timestamp al inicio del período en horas.
+                dstnc_p= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[distance_p];          // Distancia recorrida durante este período en millas nauticas.
+                spd_p= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[speed_p];                // Velocidad media del período en nudos.
+                cnsmptn_i= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[consumption_i];    // Consumo en litros al comienzo del período.
+                cnsmptn_f= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[consumption_f];    // Consumo en litros al final del período.
+                cnsmptn_p= Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[consumption_p];    // Consumo en litros del período.
+                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);
+           }
+           
+/* 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;  
+        FILE *fp1;
+        fp1 = fopen(filename, "r");   //Apertura para escritura
+        if(fp1 == NULL) {
+            //error("Could not open file for read\n");
+            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
+            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;
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[latitude_i]=lttd_i;
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[time_f]=tm_f;
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[time_i]=tm_i;
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[distance_p]=dstnc_p;
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[speed_p]=spd_p;
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[consumption_i]=cnsmptn_i;
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[consumption_f]=cnsmptn_f; 
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[consumption_p]=cnsmptn_p;
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_mile_p]=cns_ml_p;
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_hour_p]=cns_hr_p;
+            Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_interpolated]=cns_ntrpltd;  
+
+        }               
+        return fclose(fp1);   
+        }
+           
+/* Funcion build_default_Mtrx: Carga los datos (consumo/milla) del vector LAST_NAV_DATA de los objetos NAVDATA de VCODATA para testing.*/
+
+void   build_default_Mtrx(VCODATA &Test_Matrix_VCO){
+     
+        NAVDATA TestNDO;
+ 
+        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);
+        }
+        for (int i=30,x=30;i>1;i--,x++){
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=i;
+        TestNDO.LAST_NAV_DATA[speed_p]=x;
+        Test_Matrix_VCO.store_data(TestNDO);
+        }
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=1;
+        TestNDO.LAST_NAV_DATA[speed_p]=55;
+        Test_Matrix_VCO.store_data(TestNDO);
+        for (int i=1,x=59;i<40;i++,x++){
+        TestNDO.LAST_NAV_DATA[cons_mile_p]=i+1;
+        TestNDO.LAST_NAV_DATA[speed_p]=x;
+        Test_Matrix_VCO.store_data(TestNDO);
+        }*/
+     }   
+
+    
+int main()
+{
+    pc.baud(460800);                                           // I like a snappy terminal, so crank it up!
+    pc.printf("\r\nRA8875 Soft Fonts - Build " __DATE__ " " __TIME__ "\r\n");
+    lcd.init();
+    lcd.TouchPanelCalibrate("Calibrate the touch panel");   // 4 touch
+    lcd.cls();
+    rect_t PrintScreenRect = { 425-65, 20, 425+65, 60};     // Rectangulo para encuadrar boton.
+    lcd.foreground(RGB(255,255,0));                         // Seteo del color de las letras.
+    lcd.SelectUserFont(BPG_Arial20x20);                     // Seleccion de tipo y tamaño de letras
+    GPS gps(p9, p10);                                       // Agrego para comunicacion con el GPS
+    
+
+//-------------------------------------------------------------------------------------------------------------         
+//      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.
+    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 (!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 crear directorio en SD card. No se podran almacenar los datos.\r\n");
+        } 
+    wait(3);
+       
+              
+       
+    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(gps.sample()) {             // Si es exitosa la obtencion de datos del gps.
+            poll_init=1;               
+            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.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); 
+            
+
+            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 {
+            lcd.background(Black);
+            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);                     // Posicionamiento de cursor.
+            lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n");
+            lcd.SetTextCursor(0,100);    
+            
+
+    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("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
+               
+               }
+                         
+           for (int i=0;i<200;i++) {                 // Barrido para el touch
+            point_t p;
+            lcd.fillrect(PrintScreenRect, Green);
+            lcd.foreground(Blue);
+            lcd.background(Green);
+            lcd.puts(425-60, 22, "GET CURVE");
+            lcd.background(Black);
+            //wait_us(1);
+            if (lcd.TouchPanelReadable(&p)) {
+            //lcd.foreground(Blue);
+            //lcd.SetTextCursor(10, 15);
+            //lcd.printf("(%3d,%3d)", p.x, p.y);
+            //lcd.foreground(RGB(255,255,0));
+            
+            if (Intersect(PrintScreenRect, p)) {
+            lcd.foreground(Red);
+            lcd.puts(400-38, 20, "GET CURVE");
+            //build_default_Mtrx(NAVIGATION_VMATRIX);    // 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
+            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);
+            print_VCO_data(NAVIGATION_VMATRIX);                     // Volcado de datos
+            wait(4);
+            break;
+                //GetScreenCapture();
+            }
+            
+           }
+             lcd.foreground(RGB(255,255,0));
+        }
+    }
+    }       
+    
+ 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon May 15 22:52:48 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/082adc85693f
\ No newline at end of file