Para Juan
Dependencies: NAVDATA RA8875 mbed VCODATA
Diff: main.cpp
- Revision:
- 9:fe7de0e11862
- Parent:
- 8:941a76c2d300
- Child:
- 10:be7bcb936dcd
diff -r 941a76c2d300 -r fe7de0e11862 main.cpp --- a/main.cpp Fri Apr 14 04:54:50 2017 +0000 +++ b/main.cpp Mon Apr 17 12:36:08 2017 +0000 @@ -15,14 +15,15 @@ // Agrego includes para la clase VCODATA que maneja los datos de navegación más recientes parametrizados por velocidad de cada período. #include "VCODATA.h" -#include <sstream> //include this to use string streams +#include <sstream> //include this to use string streams #include <string> -float Counter=0; //Contador de pulsos del sensor de flujo. -float LCounter=0; //Consumo en litros -float Consumo_km=0; //Consumo en litros/km. +float Counter=0; //Contador de pulsos del sensor de flujo. +float LCounter=0; //Consumo en litros +const int V_M=100; //Velocidad Maxima NAVDATA NAVIGATION_TABLE; //Objeto que maneja los datos de navegación del último período. $ -VCODATA NAVIGATION_VMATRIX(NAVIGATION_TABLE); // Objeto que maneja la matriz de datos de navegación $ +VCODATA NAVIGATION_VMATRIX(NAVIGATION_TABLE, V_M); // Objeto que maneja la matriz de datos de navegación $ +VCODATA NAVIGATION_V_INTRP_MTRX(NAVIGATION_TABLE, V_M); // Objeto que maneja la matriz de datos de navegación interpolados $ @@ -69,25 +70,26 @@ } //>>>>>>>>>>>>>>>>>> FIN SECCION AGREGADA PROVISORIAMENTE PARA EL TOUCH PANEL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - + //Función para la interrupción - - - void trigger() { //Función para la interrupción + void trigger() { Counter++; LCounter=Counter/2500; - //point_t p_cursor = lcd.GetTextCursor(); - //lcd.SetTextCursor(0,200); - //lcd.printf("Flujo %d pulsos", Counter); - //lcd.SetTextCursor(p_cursor); } - /* Funcion print_VCO_curve : Imprime la curva de consumo/milla en funcion de la velocidad a partir del vector de objetos NAV_DATA de la clase VCODATA.*/ + + + /* Funcion print_VCO_curve : Imprime la curva de consumo/milla en funcion de la velocidad a partir del vector de objetos NAV_DATA de la clase VCODATA, con lineas (printline=1) o puntos (=0)*/ - void print_VCO_curve(VCODATA Matrix_VCO){ - int s,y,z; + void print_VCO_curve(VCODATA Matrix_VCO, int printline){ + float s; // Consumo + int y,x; int VCO= Matrix_VCO.get_VCO(); - + int y_offset=200; + int x_offset=25; + int y_i=y_offset; //Punto origen y + int x_i=x_offset; //Punto origen x + int x_scale=4; // Escala para graficar eje x. + int y_scale=50; // Escala para graficar eje y. lcd.background(RGB(255,255,255)); lcd.foreground(Blue); lcd.SetTextCursor(0,0); // Pongo cursor en posicion @@ -103,23 +105,35 @@ lcd.SetTextCursor(240,240); lcd.puts("Velocidad(kn)\r\n"); lcd.foreground(RGB(255,255,0)); - for (int x=0;x<100;x++){ - s = Matrix_VCO.NAV_DATA[x].LAST_NAV_DATA[cons_mile_p]; - y=200-2*s; // el consumo máximo es alrededor de 100 l/m. Multiplico por 2 para que ocupe mas pantalla. - z=x*4; // para aumentar el span (eje x) - lcd.SetTextCursor(z+25,y); - //lcd.printf("%d",x); + + + + for (int n=0;n<Matrix_VCO.vel_max;n++){ // Recorre x de 0 a vel_max. + s = Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_mile_p]; // Consumo por milla del período + y=int(y_offset-y_scale*s); // El consumo máximo es alrededor de 100 l/m => Multiplico por y_scale para que ocupe mas pantalla. + x=n*x_scale+x_offset; // para aumentar el span (eje x) + if (printline)lcd.line(x_i,y_i,x,y); // Imprime linea + else{ + lcd.SetTextCursor(x,y); lcd.printf("."); } - s = Matrix_VCO.NAV_DATA[VCO].LAST_NAV_DATA[cons_mile_p];; - y=200-2*s; // el consumo máximo es alrededor de 100 l/m. Multiplico por 2 para que ocupe mas pantalla. + x_i=x; + y_i=y; + } if (VCO>0){ - z=VCO*4; // para aumentar el span (eje x) - lcd.SetTextCursor(z+25,y); - lcd.printf("*"); + s = Matrix_VCO.NAV_DATA[VCO].LAST_NAV_DATA[cons_mile_p];; // Valor de consumo para VCO. + y=int(y_offset-y_scale*s); // el consumo máximo es alrededor de 2 l/m. Multiplico por y_scale para que ocupe mas pantalla. + x=VCO*x_scale+x_offset; // para aumentar el span (eje x) + if (printline)lcd.circle(x,y,5); + else{ + lcd.SetTextCursor(x,y); + lcd.printf("o"); + } + lcd.SetTextCursor(20+x_offset,y_offset-130); + lcd.printf("Consumo_VCO: %f",s); } else{ - lcd.SetTextCursor(45,60); + lcd.SetTextCursor(40,60); lcd.printf("No hay datos suficientes para obtener la VCO"); //lcd.printf("%d",VCO); } @@ -132,7 +146,22 @@ void build_test_Mtrx(VCODATA Test_Matrix_VCO){ NAVDATA TestNDO; - for (int i=0;i<30;i++){ + + TestNDO.LAST_NAV_DATA[cons_mile_p]=3; + TestNDO.LAST_NAV_DATA[speed_p]=15; + Test_Matrix_VCO.store_data(TestNDO); + Test_Matrix_VCO.store_data(TestNDO); + TestNDO.LAST_NAV_DATA[cons_mile_p]=1; + TestNDO.LAST_NAV_DATA[speed_p]=30; + Test_Matrix_VCO.store_data(TestNDO); + Test_Matrix_VCO.store_data(TestNDO); + TestNDO.LAST_NAV_DATA[cons_mile_p]=2.5; + TestNDO.LAST_NAV_DATA[speed_p]=Test_Matrix_VCO.vel_max-1; + Test_Matrix_VCO.store_data(TestNDO); + Test_Matrix_VCO.store_data(TestNDO); + Test_Matrix_VCO.interpolate(); + + /*for (int i=0;i<30;i++){ TestNDO.LAST_NAV_DATA[cons_mile_p]=i+1; TestNDO.LAST_NAV_DATA[speed_p]=i; Test_Matrix_VCO.store_data(TestNDO); @@ -149,7 +178,7 @@ TestNDO.LAST_NAV_DATA[cons_mile_p]=i+1; TestNDO.LAST_NAV_DATA[speed_p]=x; Test_Matrix_VCO.store_data(TestNDO); - } + }*/ } @@ -175,25 +204,7 @@ GPS gps(p9, p10); // Agrego para comunicacion con el GPS - //Inicializo variables para el sensor de flujo - //---------------------------------------------------- - DigitalOut myled(LED1); - DigitalOut myled2(LED2); - DigitalOut myled3(LED3); - DigitalOut myled4(LED4); - - //DebounceIn pb(p8); - /*DigitalIn pb(p11); - int count=0; //Comento esto porque voy a usar interrupciones - int old_pb=0; - int new_pb; - // Use internal pullup for pushbutton - pb.mode(PullUp); - //pb.mode(PullNone); - // Delay for initial pullup to take effect - wait(.001);*/ - //---------------------------------------------------- // Sensor de flujo: //----------------------------------------------------- @@ -215,12 +226,7 @@ //lcd.SetTextCursor(0,20); //lcd.printf("M0: %s \r\n\r\n", gps.msg); //Imprimo el mensaje crudo proveniente de la uart - //lcd.printf("M1: %s \r\n", gps.mensaje1); - //lcd.printf("M2: %s \r\n", gps.mensaje2); - //lcd.printf("M3: %s \r\n", gps.mensaje3); - //lcd.printf("M4: %s \r\n", gps.mensaje4); - //lcd.printf("Posicion actual_0: %f, %f \r\n", gps.longitude, gps.latitude); - //lcd.printf("Contador = %d", Counter); + if(gps.sample()) { // Si es exitosa la obtencion de datos del gps. lcd.cls(); @@ -228,15 +234,15 @@ lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n"); if (NAVIGATION_TABLE.rotate_data(gps.longitude, gps.latitude, gps.time, Counter)){ - NAVIGATION_VMATRIX.store_data(NAVIGATION_TABLE);// Luego de rotar los datos en la tabla de navegacion, la guarda en la matriz, - // en el lugar correspondiente a la velocidad del preiodo (por ahora reemplaza...ver otras opciones) - + NAVIGATION_VMATRIX.store_data(NAVIGATION_TABLE);// Luego de rotar los datos en la tabla de navegacion, la guarda en la matriz segun criterios de la clase VCODATA lcd.puts("Rotacion exitosa!-->"); int i=int(NAVIGATION_TABLE.LAST_NAV_DATA[speed_p]); int VCO=NAVIGATION_VMATRIX.get_VCO(); + float timetick_f_Last = NAVIGATION_TABLE.LAST_NAV_DATA[speed_p]; // DEBUG float timetick_f_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[time_f]; // DEBUG float distance_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[distance_p]; // DEBUG float speed_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[speed_p]; // DEBUG + float speed_p_Last = NAVIGATION_TABLE.LAST_NAV_DATA[speed_p]; // DEBUG float longitude_f_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[longitude_f]; // DEBUG float latitude_f_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[latitude_f]; // DEBUG float cons_hour_p_Mtrx = NAVIGATION_VMATRIX.NAV_DATA[i].LAST_NAV_DATA[cons_hour_p]; @@ -244,15 +250,21 @@ //lcd.printf("Algunos datos guardados en la Matriz: \r\n"); // DEBUG lcd.printf("INDICE_Mtrx: %d\r\n\r\n",i); // DEBUG lcd.printf("Speed_f_Mtrx(%d): %f kn.\r\n",i, speed_p_Mtrx); // DEBUG - lcd.printf("Speed_f_Mtrx(%d): %f km/h.\r\n\r\n",i, speed_p_Mtrx*1.852); // DEBUG + lcd.printf("Speed_f_Last(%d): %f km/h.\r\n\r\n",i, speed_p_Last*1.852); // DEBUG lcd.printf("Time_f_Mtrx(%d): %f Hours.\r\n",i, timetick_f_Mtrx); // DEBUG + lcd.printf("Time_f_Last(%d): %f Hours.\r\n",i, timetick_f_Last); // DEBUG lcd.printf("Dist_p_Mtrx(%d): %f miles.\r\n",i,distance_p_Mtrx); // DEBUG lcd.printf("Posicion: Long(%d): %f ; Lat: %f\r\n",i,longitude_f_Mtrx,latitude_f_Mtrx); // DEBUG lcd.printf("FlujoVCOmtrx(%d): %f Litros/Hora\r\n",i, cons_hour_p_Mtrx); // DEBUG lcd.printf("FlujoVCOmtrx(%d): %f Litros/Milla\r\n",i, cons_mile_p_Mtrx); // DEBUG + lcd.printf("Cons. Acumulado: %f l\r\n", LCounter); lcd.printf("VCO: %d km/h\r\n", VCO); + + + NAVIGATION_VMATRIX.interpolate(); + //build_test_Mtrx(NAVIGATION_VMATRIX); // DEBUG Curve - //print_VCO_curve(NAVIGATION_VMATRIX); + //print_VCO_curve(NAVIGATION_VMATRIX,1); } else { @@ -272,20 +284,7 @@ lcd.printf("Posicion: Long(%d): %f, Lat: %f\r\n",i,longitude_f_Mtrx,latitude_f_Mtrx); // DEBUG lcd.printf("FlujoVCOmtrx(%d): %f Litros/Hora\r\n",i, cons_hour_p_Mtrx); // DEBUG } - /* lcd.SetTextCursor(0,80); - //lcd.printf("Posicion: %f, %f\r\n", gps.longitude, gps.latitude); - lcd.printf("Posicion: %f, %f\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[longitude_f], NAVIGATION_TABLE.LAST_NAV_DATA[latitude_f]); // $ - //lcd.printf("Velocidad %f km/h", gps.speed); - lcd.printf("Distancia_p %f km\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[distance_p]); - lcd.printf("Velocidad %f km/h\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[speed_p]); - lcd.printf("Timetick_i %f h\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[time_i]); - lcd.printf("Timetick_f %f h\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[time_f]); - lcd.printf("Timetick_gps %f NMEA\r\n", gps.time); - // lcd.printf("Consumo %f l/km", getConsumo(Count; gps.speed); */ - //lcd.SetTextCursor(0,220); - //lcd.printf("Flujo %f Litros/Hora\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[cons_hour_p]); - //lcd.printf("FlujoVCOmtrx %f Litros/Hora\r\n", cons_hour_p_Mtrx); - //lcd.printf("Flujo acumulado (contador):%f Litros\r\n", LCounter); + } else { @@ -298,6 +297,9 @@ lcd.printf("Timetick %f h\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[time_f]); lcd.printf("Flujo Mtrx: %f Litros/Hora\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[cons_hour_p]); lcd.printf("Flujo Counter: %f Litros\r\n", LCounter); + + //build_test_Mtrx(NAVIGATION_VMATRIX); //DEBUG + } @@ -308,7 +310,7 @@ lcd.background(Green); lcd.puts(425-60, 22, "GET CURVE"); lcd.background(Black); - wait_us(5); + //wait_us(1); if (lcd.TouchPanelReadable(&p)) { //lcd.foreground(Blue); //lcd.SetTextCursor(10, 15); @@ -319,9 +321,11 @@ lcd.foreground(Red); lcd.puts(400-38, 20, "GET CURVE"); //build_test_Mtrx(NAVIGATION_VMATRIX); // DEBUG Curve - print_VCO_curve(NAVIGATION_VMATRIX); + print_VCO_curve(NAVIGATION_VMATRIX,0); //lcd.foreground(RGB(255,255,0)); - wait(10); + wait(5); + print_VCO_curve(NAVIGATION_VMATRIX,1); + wait(5); break; //GetScreenCapture(); }