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