Para Juan
Dependencies: NAVDATA RA8875 mbed VCODATA
main.cpp
- Committer:
- gstedile
- Date:
- 2017-04-17
- Revision:
- 9:fe7de0e11862
- Parent:
- 8:941a76c2d300
- Child:
- 10:be7bcb936dcd
File content as of revision 9:fe7de0e11862:
#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" #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 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 $ LocalFileSystem local("local"); // Because I want <PrintScreen> Serial pc(USBTX, USBRX); // And a little feedback RA8875 lcd(p5, p6, p7, p12, NC, "tft"); // MOSI, MISO, SCK, /ChipSelect, /reset, name //>>>>>>>>>>>>>>>>>> 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)*/ 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 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.fillroundrect(10,30, 465,264, 5,3, Green); lcd.background(Green); lcd.foreground(Blue); lcd.SetTextCursor(12,32); lcd.puts("Consumo(l/m)\r\n"); lcd.SetTextCursor(240,240); lcd.puts("Velocidad(kn)\r\n"); 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("."); } 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); } else{ lcd.SetTextCursor(40,60); lcd.printf("No hay datos suficientes para obtener la VCO"); //lcd.printf("%d",VCO); } 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){ NAVDATA TestNDO; 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); } 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}; // ************************** //RunTestSet(lcd, pc); // If the library was compiled for test mode... 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.puts("BPG_Arial63x63"); GPS gps(p9, p10); // Agrego para comunicacion con el GPS //---------------------------------------------------- // Sensor de flujo: //----------------------------------------------------- InterruptIn pulse_sensor(p11); // Defino pulse_sensor como una entrada de interrupción en p11. 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) while(1) { lcd.SetTextCursor(0,0); // Pongo cursor en posicion lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n"); //----------------------------------------------------- //lcd.SetTextCursor(0,20); //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. lcd.cls(); 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("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_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,1); } else { lcd.puts("Periodo no valido!\r\n"); int i=int(NAVIGATION_TABLE.LAST_NAV_DATA[speed_p]); 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 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]; // DEBUG lcd.printf("Algunos datos guardados en la Matriz: \r\n"); // DEBUG lcd.printf("INDICE_Mtrx: %d (Parte entera de speed)\r\n",i); // DEBUG lcd.printf("Speed_f_Mtrx(%d): %f kn.\r\n",i, speed_p_Mtrx); // DEBUG lcd.printf("Time_f_Mtrx(%d): %f Hours.\r\n",i, timetick_f_Mtrx); // DEBUG lcd.printf("Distance_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 } } else { lcd.cls(); lcd.SetTextCursor(0,0); // Pongo cursor en posicion lcd.puts(">>>>>>>>>>>>>< Proyecto SNOCC ><<<<<<<<<<<<<<\r\n"); lcd.SetTextCursor(0,100); 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); //build_test_Mtrx(NAVIGATION_VMATRIX); //DEBUG } for (int i=0;i<200;i++) { 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_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); 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)); } } }