Para Juan
Dependencies: NAVDATA RA8875 mbed VCODATA
Diff: main.cpp
- Revision:
- 10:be7bcb936dcd
- Parent:
- 9:fe7de0e11862
--- a/main.cpp Mon Apr 17 12:36:08 2017 +0000 +++ b/main.cpp Sun Apr 23 18:27:58 2017 +0000 @@ -18,12 +18,14 @@ #include <sstream> //include this to use string streams #include <string> +int poll_init=0; // Testigo de inicio de recoleccion de datos. float Counter=0; //Contador de pulsos del sensor de flujo. float LCounter=0; //Consumo en litros const int V_M=100; //Velocidad Maxima NAVDATA NAVIGATION_TABLE; //Objeto que maneja los datos de navegación del último período. $ VCODATA NAVIGATION_VMATRIX(NAVIGATION_TABLE, V_M); // Objeto que maneja la matriz de datos de navegación $ -VCODATA NAVIGATION_V_INTRP_MTRX(NAVIGATION_TABLE, V_M); // Objeto que maneja la matriz de datos de navegación interpolados $ +//VCODATA NAVIGATION_V_INTRP_MTRX(NAVIGATION_TABLE, V_M); // Objeto que maneja la matriz de datos de navegación interpolados $ +VCODATA NAVIGATION_V_SMOOTH_MTRX(NAVIGATION_TABLE, V_M); // Objeto que maneja la matriz de datos de navegación promediados $ @@ -78,85 +80,130 @@ } - /* Funcion print_VCO_curve : Imprime la curva de consumo/milla en funcion de la velocidad a partir del vector de objetos NAV_DATA de la clase VCODATA, con lineas (printline=1) o puntos (=0)*/ + /* Funcion print_VCO_curve : Imprime la curva de consumo/milla en funcion de la velocidad a partir del vector de objetos NAV_DATA de la clase VCODATA, con lineas (printline=1) o puntos (=0) + Parametros: Objeto VCODATA; Interpolated: 0 -> no imprime valores interpolados o promediados; 1: interpola con puntos, 2: interpola con lineas*/ - void print_VCO_curve(VCODATA Matrix_VCO, int printline){ + void print_VCO_curve(VCODATA &Matrix_VCO, int interpolated){ + //lcd.puts("ENTRANDO a print_VCO_curve\r\n"); // DEBUG float s; // Consumo int y,x; - int VCO= Matrix_VCO.get_VCO(); - int y_offset=200; - int x_offset=25; + int VCO= Matrix_VCO.get_VCO(); + int y_offset=220; //Para que imprima de abajo hacia arriba. + int y_text_offset=15; //Para cooregir diferencia de impresion entre caracter y linea. + int x_offset=18; //Posicionamiento en x int y_i=y_offset; //Punto origen y int x_i=x_offset; //Punto origen x int x_scale=4; // Escala para graficar eje x. - int y_scale=50; // Escala para graficar eje y. + int y_scale=500; // Escala para graficar eje y. lcd.background(RGB(255,255,255)); lcd.foreground(Blue); - lcd.SetTextCursor(0,0); // Pongo cursor en posicion + lcd.SetTextCursor(0,0); // Pongo cursor en posicion lcd.cls(); lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n"); - lcd.roundrect( 5,25, 470,270, 10,8, RGB(255,255,0)); - //lcd.fillroundrect(415,165, 470,185, 5,3, Orange); + lcd.roundrect( 5,25, 470,270, 10,8, RGB(255,255,0)); lcd.fillroundrect(10,30, 465,264, 5,3, Green); lcd.background(Green); lcd.foreground(Blue); - lcd.SetTextCursor(12,32); + lcd.SetTextCursor(20,32); lcd.puts("Consumo(l/m)\r\n"); - lcd.SetTextCursor(240,240); - lcd.puts("Velocidad(kn)\r\n"); + lcd.SetTextCursor(265,240); + lcd.puts("Velocidad(kn)\r\n"); + lcd.line(x_i,y_i,Matrix_VCO.vel_max*x_scale,y_i); // Imprimo eje x. + lcd.line(x_i,y_i,x_i,40); // Imprimo eje y. + lcd.foreground(RGB(255,255,0)); - for (int n=0;n<Matrix_VCO.vel_max;n++){ // Recorre x de 0 a vel_max. - s = Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_mile_p]; // Consumo por milla del período - y=int(y_offset-y_scale*s); // El consumo máximo es alrededor de 100 l/m => Multiplico por y_scale para que ocupe mas pantalla. - x=n*x_scale+x_offset; // para aumentar el span (eje x) - if (printline)lcd.line(x_i,y_i,x,y); // Imprime linea - else{ - lcd.SetTextCursor(x,y); - lcd.printf("."); - } + for (int n=0;n<Matrix_VCO.vel_max;n++){ // Recorre x de 0 a vel_max. + s = Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_mile_p]; // Consumo por milla del período + y=int(y_offset-y_scale*s); // El consumo máximo es alrededor de 4 l/m => Multiplico por y_scale + // para que ocupe mas pantalla. + x=n*x_scale+x_offset; // para aumentar el span (eje x) + switch (interpolated){ + + case 0: if (Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_interpolated]==0){ //Valores sin interpolar + lcd.SetTextCursor(x,y-y_text_offset); + lcd.printf("."); + } + break; + case 1: if ((Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_interpolated]==1) || (Matrix_VCO.NAV_DATA[n].LAST_NAV_DATA[cons_interpolated]==2))lcd.foreground(Orange); // interpola con puntos de otro color + lcd.SetTextCursor(x,y-y_text_offset); // el offset adicional es para corregir la diferencia de ubicacion linea-caracter. + lcd.printf("."); + lcd.foreground(RGB(255,255,0)); + break; + case 2: lcd.line(x_i,y_i,x,y); // Imprime linea + break; + default: + lcd.SetTextCursor(x,y-y_text_offset); + lcd.printf("."); + break; + } x_i=x; y_i=y; } if (VCO>0){ - s = Matrix_VCO.NAV_DATA[VCO].LAST_NAV_DATA[cons_mile_p];; // Valor de consumo para VCO. - y=int(y_offset-y_scale*s); // el consumo máximo es alrededor de 2 l/m. Multiplico por y_scale para que ocupe mas pantalla. - x=VCO*x_scale+x_offset; // para aumentar el span (eje x) - if (printline)lcd.circle(x,y,5); - else{ - lcd.SetTextCursor(x,y); - lcd.printf("o"); - } - lcd.SetTextCursor(20+x_offset,y_offset-130); - lcd.printf("Consumo_VCO: %f",s); + s = Matrix_VCO.NAV_DATA[VCO].LAST_NAV_DATA[cons_mile_p];; // Valor de consumo para VCO. + y=int(y_offset-y_scale*s); // el consumo máximo es alrededor de 2 l/m. Multiplico por y_scale para que ocupe mas pantalla. + x=VCO*x_scale+x_offset; // para aumentar el span (eje x) + if (interpolated==2){ + lcd.circle(x,y,5); + } + else{ + lcd.SetTextCursor(x,y); + lcd.printf("*"); + } + lcd.SetTextCursor(VCO*x_scale+x_offset+10,y_offset-s*y_scale); + lcd.printf("%f l/m",s); + lcd.SetTextCursor(VCO*x_scale+x_offset+10,y_offset-s*y_scale+20); + lcd.printf("VCO: %f kn",s); + } else{ lcd.SetTextCursor(40,60); lcd.printf("No hay datos suficientes para obtener la VCO"); - //lcd.printf("%d",VCO); + lcd.printf("%d",VCO);//DEBUG } lcd.foreground(RGB(255,255,0)); lcd.background(Black); + } - - + + /* Funcion build_test_Mtrx: Carga los datos (consumo/milla) del vector LAST_NAV_DATA de los objetos NAVDATA de VCODATA para testing.*/ -void build_test_Mtrx(VCODATA Test_Matrix_VCO){ +void build_test_Mtrx(VCODATA &Test_Matrix_VCO){ + NAVDATA TestNDO; + + TestNDO.LAST_NAV_DATA[cons_interpolated]=-1; - TestNDO.LAST_NAV_DATA[cons_mile_p]=3; + TestNDO.LAST_NAV_DATA[cons_mile_p]=0.3; TestNDO.LAST_NAV_DATA[speed_p]=15; Test_Matrix_VCO.store_data(TestNDO); Test_Matrix_VCO.store_data(TestNDO); - TestNDO.LAST_NAV_DATA[cons_mile_p]=1; + TestNDO.LAST_NAV_DATA[cons_mile_p]=0.2; + TestNDO.LAST_NAV_DATA[speed_p]=16; + Test_Matrix_VCO.store_data(TestNDO); + Test_Matrix_VCO.store_data(TestNDO); + TestNDO.LAST_NAV_DATA[cons_mile_p]=0.35; + TestNDO.LAST_NAV_DATA[speed_p]=17; + Test_Matrix_VCO.store_data(TestNDO); + Test_Matrix_VCO.store_data(TestNDO); + TestNDO.LAST_NAV_DATA[cons_mile_p]=0.1; TestNDO.LAST_NAV_DATA[speed_p]=30; Test_Matrix_VCO.store_data(TestNDO); Test_Matrix_VCO.store_data(TestNDO); - TestNDO.LAST_NAV_DATA[cons_mile_p]=2.5; - TestNDO.LAST_NAV_DATA[speed_p]=Test_Matrix_VCO.vel_max-1; + TestNDO.LAST_NAV_DATA[cons_mile_p]=0.15; + TestNDO.LAST_NAV_DATA[speed_p]=32; + Test_Matrix_VCO.store_data(TestNDO); + Test_Matrix_VCO.store_data(TestNDO); + TestNDO.LAST_NAV_DATA[cons_mile_p]=0.12; + TestNDO.LAST_NAV_DATA[speed_p]=34; + Test_Matrix_VCO.store_data(TestNDO); + Test_Matrix_VCO.store_data(TestNDO); + TestNDO.LAST_NAV_DATA[cons_mile_p]=0.25; + TestNDO.LAST_NAV_DATA[speed_p]=(Test_Matrix_VCO.vel_max)-1; Test_Matrix_VCO.store_data(TestNDO); Test_Matrix_VCO.store_data(TestNDO); Test_Matrix_VCO.interpolate(); @@ -229,6 +276,7 @@ if(gps.sample()) { // Si es exitosa la obtencion de datos del gps. + poll_init=1; lcd.cls(); lcd.SetTextCursor(0,0); // Pongo cursor en posicion lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n"); @@ -298,12 +346,14 @@ lcd.printf("Flujo Mtrx: %f Litros/Hora\r\n", NAVIGATION_TABLE.LAST_NAV_DATA[cons_hour_p]); lcd.printf("Flujo Counter: %f Litros\r\n", LCounter); - //build_test_Mtrx(NAVIGATION_VMATRIX); //DEBUG + //if (poll_init==0) build_test_Mtrx(NAVIGATION_VMATRIX); //DEBUG } + //lcd.puts(425-90, 22, "ANTES DEL FOR");// DEBUG for (int i=0;i<200;i++) { + point_t p; lcd.fillrect(PrintScreenRect, Green); lcd.foreground(Blue); @@ -320,28 +370,25 @@ if (Intersect(PrintScreenRect, p)) { lcd.foreground(Red); lcd.puts(400-38, 20, "GET CURVE"); - //build_test_Mtrx(NAVIGATION_VMATRIX); // DEBUG Curve - print_VCO_curve(NAVIGATION_VMATRIX,0); - //lcd.foreground(RGB(255,255,0)); - wait(5); - print_VCO_curve(NAVIGATION_VMATRIX,1); - wait(5); + build_test_Mtrx(NAVIGATION_VMATRIX); // DEBUG Curve + NAVIGATION_V_SMOOTH_MTRX.smooth(3, NAVIGATION_VMATRIX); + //lcd.puts(425-120, 22, "ANTES de PRINT"); //DEBUG + print_VCO_curve(NAVIGATION_VMATRIX,0); // Valores recolectados + wait(2); + print_VCO_curve(NAVIGATION_VMATRIX,1); // Interpolados (puntos) + wait(3); + print_VCO_curve(NAVIGATION_V_SMOOTH_MTRX,1); // Suavizado (puntos) + wait(3); + + print_VCO_curve(NAVIGATION_VMATRIX,2); // Interpolados (lineas) + wait(3); + print_VCO_curve(NAVIGATION_V_SMOOTH_MTRX,2); // Suavizados (lineas) + wait(3); break; //GetScreenCapture(); } - /*for (int i=0; i<3; i++) { - if (Intersect(RGBList[i], p)) { - uint8_t mag = (255 * (p.x - RGBList[i].p1.x)) / (RGBList[i].p2.x - RGBList[i].p1.x); - rgbVal[i] = mag; - lcd.SetTextCursor(380, 15); - lcd.foreground(Blue); - //lcd.printf("(%02X,%02X,%02X)", rgbVal[0], rgbVal[1], rgbVal[2]); - //rgb = RGB(rgbVal[0], rgbVal[1], rgbVal[2]); - //lcd.fillrect(RGBList[3], rgb); - break; - }*/ - } + } lcd.foreground(RGB(255,255,0)); } }