diff --git a/src/gilles/gameloop/CMakeLists.txt b/src/gilles/gameloop/CMakeLists.txt index 5840683..e90da09 100644 --- a/src/gilles/gameloop/CMakeLists.txt +++ b/src/gilles/gameloop/CMakeLists.txt @@ -3,6 +3,10 @@ set(gameloop_source_files gameloop.h browseloop.c browseloop.h + session.h + session.c + telemetry.h + telemetry.c ) diff --git a/src/gilles/gameloop/browseloop.c b/src/gilles/gameloop/browseloop.c index 0973b0c..07ba902 100644 --- a/src/gilles/gameloop/browseloop.c +++ b/src/gilles/gameloop/browseloop.c @@ -16,7 +16,8 @@ #include -#include "session.h" +#include "hoeldb.h" +#include "telemetry.h" #include "gameloop.h" #include "../helper/parameters.h" #include "../helper/confighelper.h" @@ -41,7 +42,7 @@ WINDOW* bwin4; int bwinx, bwiny; -char blanks[100]; +char blanks[1000]; void add_line() { @@ -73,17 +74,6 @@ void b_handle_winch(int sig) refresh(); } -//void rectangle(int y1, int x1, int y2, int x2) -//{ -// mvhline(y1, x1, 0, x2-x1); -// mvhline(y2, x1, 0, x2-x1); -// mvvline(y1, x1, 0, y2-y1); -// mvvline(y1, x2, 0, y2-y1); -// mvaddch(y1, x1, ACS_ULCORNER); -// mvaddch(y2, x1, ACS_LLCORNER); -// mvaddch(y1, x2, ACS_URCORNER); -// mvaddch(y2, x2, ACS_LRCORNER); -//} int b_curses_init() { @@ -93,6 +83,7 @@ int b_curses_init() init_pair(1,COLOR_GREEN,0); init_pair(2,COLOR_YELLOW,0); + init_pair(5,COLOR_BLACK,COLOR_YELLOW); init_pair(3,COLOR_MAGENTA,0); init_pair(4,COLOR_WHITE,0); @@ -111,220 +102,18 @@ int b_curses_init() wbkgd(bwin4,COLOR_PAIR(1)); signal(SIGWINCH, b_handle_winch); + curs_set(0); cbreak(); noecho(); box(bwin1, 0, 0); - box(bwin2, 0, 0); - box(bwin3, 0, 0); - box(bwin4, 0, 0); + //box(bwin2, 0, 0); + //box(bwin3, 0, 0); + //box(bwin4, 0, 0); } -int telem_result(struct _h_result result, int doublefields, int intfields, int* intarrays, double* doublearrays) { - int col, row, i; - char buf[64]; - slogt("rows: %d, col: %d", result.nb_rows, result.nb_columns); - //int* intarrays; - int points = 0; - //int doublefields = 3; - //int intfields = 3; - //int* intarrays; - //int* doublearrays; - //int* intarrays = malloc((sizeof(int)*1736)*3); - //double* doublearrays = malloc((sizeof(double)*1736)*3); - int intarrayoffset = 0; - int doublearrayoffset = 0; - for (row = 0; rowvalue; - if (col == 1) - { - points = cc; - } - break; - case HOEL_COL_TYPE_DOUBLE: - //intarrays = malloc((sizeof(int)*1736)*3); - break; - case HOEL_COL_TYPE_TEXT: - slogi("| %s ", ((struct _h_type_text *)result.data[row][col].t_data)->value); - break; - case HOEL_COL_TYPE_BLOB: - int offset2 = 0; - - int j = 0; - i = 2; - if (col < 5) - { - while (i<((struct _h_type_blob *)result.data[row][col].t_data)->length) - { - char sss[10]; - sss[0] = '0'; - sss[1] = 'x'; - sss[2] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+2); - sss[3] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+3); - sss[4] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+4); - sss[5] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+5); - sss[6] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+6); - sss[7] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+7); - sss[8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+8); - sss[9] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+9); - long val; - int number = (int)strtol(sss, NULL, 16); - int swapped = __bswap_32(number); - - intarrays[j+intarrayoffset] = __bswap_32(number); - offset2 = offset2 + 8; - i+=8; - j++; - } - intarrayoffset += points; - } - else - { - while (i<((struct _h_type_blob *)result.data[row][col].t_data)->length) - { - char sss[18]; - sss[0] = '0'; - sss[1] = 'x'; - sss[2] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+2); - sss[3] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+3); - sss[4] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+4); - sss[5] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+5); - sss[6] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+6); - sss[7] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+7); - sss[8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+8); - sss[9] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+9); - sss[2+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+2+8); - sss[3+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+3+8); - sss[4+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+4+8); - sss[5+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+5+8); - sss[6+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+6+8); - sss[7+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+7+8); - sss[8+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+8+8); - sss[9+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+9+8); - long val; - int64_t number = (int64_t) strtoll(sss, NULL, 16); - int64_t swapped = __bswap_64(number); - double d = *((double*)&swapped); - doublearrays[j+doublearrayoffset] = (double) d; - offset2 = offset2 + 16; - i+=16; - j++; - } - doublearrayoffset += points; - - } - //snprintf( "blob value: %.*s", ((struct _h_type_blob *)result.data[row][col].t_data)->length, ((struct _h_type_blob *)result.data[row][col].t_data)->value); - //char* b = malloc(sizeof(int)*1736); - //for (i=0; i<((struct _h_type_blob *)result.data[row][col].t_data)->length; i++) { - // //slogi("%c", *((char*)(((struct _h_type_blob *)result.data[row][col].t_data)->value+i))); - // memcpy(&b[i], ((struct _h_type_blob *)result.data[row][col].t_data)->value+1*sizeof(char), sizeof(char)); - //} -// FILE *out = fopen("memory.bin", "wb"); -// if(out != NULL) -// { -// size_t to_go = sizeof(int)*1736; -// while(to_go > 0) -// { -// const size_t wrote = fwrite(b, to_go, 1, out); -// if(wrote == 0) -// break; -// to_go -= wrote; -// } -// fclose(out); -// } - break; - case HOEL_COL_TYPE_DATE: - strftime(buf, 64, "%Y-%m-%d %H:%M:%S", &((struct _h_type_datetime *)result.data[row][col].t_data)->value); - printf("| %s ", buf); - case HOEL_COL_TYPE_NULL: - slogi("| [null] "); - break; - } - } - printf("|\n"); - } - - return points; -} - -void get_row_results(struct _h_result result, DBField* fields, void* rows, size_t rowsize) { - int col, row, i; - char buf[64]; - //sess->hasdata = true; - //sess->rows = result.nb_rows; - slogi("rows: %d, col: %d", result.nb_rows, result.nb_columns); - char* aaa = (char *) rows; - for (row = 0; rowvalue; - *(int*) a = bb; - break; - case HOEL_COL_TYPE_DOUBLE: - double cc = ((struct _h_type_double *)result.data[row][col].t_data)->value; - *(double*) a = cc; - break; - case HOEL_COL_TYPE_TEXT: - char* ddd = ((struct _h_type_text *)result.data[row][col].t_data)->value; - memcpy(a, ddd, fields[col].size); - break; - case HOEL_COL_TYPE_BLOB: - for (i=0; i<((struct _h_type_blob *)result.data[row][col].t_data)->length; i++) { - printf("%c", *((char*)(((struct _h_type_blob *)result.data[row][col].t_data)->value+i))); - if (i%80 == 0 && i>0) { - printf("\n"); - } - } - break; - case HOEL_COL_TYPE_DATE: - strftime(a, fields[col].size, "%Y-%m-%d %H:%M:%S", &((struct _h_type_datetime *)result.data[row][col].t_data)->value); - //strftime(buf, 64, "%Y-%m-%d %H:%M:%S", &((struct _h_type_datetime *)result.data[row][col].t_data)->value); - printf("| %s ", buf); - case HOEL_COL_TYPE_NULL: - printf("| [null] "); - break; - } - } - printf("|\n"); - } -} - - -int getsessions(struct _h_connection* conn, int* err, const char* sessionname, SessionDbo* sess) -{ - struct _h_result result; - struct _h_data * data; - char* query = malloc(99 * sizeof(char)); - slogt("Performing query"); - - //sprintf(query, "select session_id, event_id, event_type, duration_min, elapsed_ms, laps, air_temp, road_temp, start_grip, current_grip, is_finished, http_port from %s", "Sessions"); - sprintf(query, "select session_id, event_id, event_type, laps FROM %s ORDER BY session_id DESC LIMIT 25", "Sessions"); - if (h_query_select(conn, query, &result) == H_OK) { - sess->rows = malloc(sizeof(SessionRowData) * result.nb_rows); - get_row_results(result, sess->fields, sess->rows, sizeof(SessionRowData)); - //get_session_result(result, sess); - h_clean_result(&result); - } - else - { - printf("Error executing query\n"); - *err = E_DB_QUERY_FAIL;; - free(query); - return 0; - } - free(query); - - return result.nb_rows; -} int getstints(struct _h_connection* conn, const char* sessionname, StintDbo* stint, int use_id) { @@ -353,17 +142,17 @@ int getlaps(struct _h_connection* conn, const char* sessionname, LapDbo* laps, i { struct _h_result result; struct _h_data * data; - char* query = malloc(150 * sizeof(char)); + char* query = malloc(250 * sizeof(char)); slogt("Performing query laps"); - - sprintf(query, "select * FROM %s WHERE %s=%i", "Laps", "stint_id", use_id); + sprintf(query, "select lap_id, stint_id, sector_1, sector_2, sector_3, grip, tyre, time, cuts, crashes, max_speed, avg_speed FROM %s WHERE %s=%i", "Laps", "stint_id", use_id); if (h_query_select(conn, query, &result) == H_OK) { laps->rows = malloc(sizeof(LapRowData) * result.nb_rows); get_row_results(result, laps->fields, laps->rows, sizeof(LapRowData)); //print_result(result); //get_stint_result(result, stint); h_clean_result(&result); + slogt("lap query returned OK"); } else { printf("Error executing query\n"); } @@ -372,134 +161,6 @@ int getlaps(struct _h_connection* conn, const char* sessionname, LapDbo* laps, i return result.nb_rows; } -int dumptelemetrytofile(struct _h_connection* conn, char* datadir, int lap1id, int lap2id) -{ - - slogt("dumping telemetry to temp file"); - - int points = 0; - int intfields = 3; - int doublefields = 3; - - struct _h_result result; - struct _h_data *data; - char* query = malloc(150 * sizeof(char)); - sprintf(query, "SELECT lap_id, points FROM %s WHERE %s=%i", "telemetry", "lap_id", lap1id); - if (h_query_select(conn, query, &result) == H_OK) { - //laps->rows = malloc(sizeof(LapRowData) * result.nb_rows); - //get_row_results(result, laps->fields, laps->rows, sizeof(LapRowData)); - points = telem_result(result, 3, 3, NULL, NULL); - //get_stint_result(result, stint); - h_clean_result(&result); - } else { - printf("Error executing query\n"); - } - free(query); - - - int* intarrays1 = malloc((sizeof(int))*points*intfields); - double* doublearrays1 = malloc((sizeof(double))*points*doublefields); - int* intarrays2 = malloc((sizeof(int))*points*intfields); - double* doublearrays2 = malloc((sizeof(double))*points*doublefields); - - struct _h_result result1; - struct _h_data * data1; - char* query1 = malloc(150 * sizeof(char)); - sprintf(query1, "SELECT lap_id, points, speed, gear, rpms, brake, accel, steer FROM %s WHERE %s=%i", "telemetry", "lap_id", lap1id); - if (h_query_select(conn, query1, &result1) == H_OK) { - //laps->rows = malloc(sizeof(LapRowData) * result.nb_rows); - //get_row_results(result, laps->fields, laps->rows, sizeof(LapRowData)); - points = telem_result(result1, intfields, doublefields, intarrays1, doublearrays1); - //get_stint_result(result, stint); - h_clean_result(&result1); - } else { - printf("Error executing query\n"); - } - free(query1); - - struct _h_result result2; - struct _h_data * data2; - char* query2 = malloc(150 * sizeof(char)); - sprintf(query2, "SELECT lap_id, points, speed, gear, rpms, brake, accel, steer FROM %s WHERE %s=%i", "telemetry", "lap_id", lap2id); - if (h_query_select(conn, query2, &result2) == H_OK) { - //laps->rows = malloc(sizeof(LapRowData) * result.nb_rows); - //get_row_results(result, laps->fields, laps->rows, sizeof(LapRowData)); - points = telem_result(result2, intfields, doublefields, intarrays2, doublearrays2); - //get_stint_result(result, stint); - h_clean_result(&result2); - } else { - printf("Error executing query\n"); - } - free(query2); - - char* filename1= "data.out"; - size_t strsize = strlen(datadir) + strlen(filename1) + 1; - char* datafile = malloc(strsize); - - snprintf(datafile, strsize, "%s%s", datadir, filename1); - slogt("dumping %i points to file %s", points, datafile); - FILE *out = fopen(datafile, "w"); - fprintf(out, "%s %s %s %s %s %s %s %s %s %s %s %s %s\n", "point", "speed1", "gear1", "rpms1", "brake1", "accel1", "steer1", "speed2", "gear2", "rpms2", "brake2", "accel2", "steer2" ); - for (int i=0; i 0 && selection2 > 0) + //selection1 = 363; + //selection2 = 362; + if (p->gnuplotfound == 1) { - dumptelemetrytofile(conn, datadir, selection1, selection2); + if (selection1 > 0 && selection2 > 0) + { + dumptelemetrytofile(conn, datadir, selection1, selection2); - slogt("finished dumping data"); - size_t strsize = strlen(datadir) + strlen(p->gnuplot_file) + 1; - char* plotfile = malloc(strsize); - snprintf(plotfile, strsize, "%s%s", datadir, p->gnuplot_file); - static char* argv1[]={"gnuplot", "-p", "plotfile.gp", NULL}; - argv1[2] = plotfile; - slogi("Using gnu plot file %s", plotfile); - if(!fork()) - { - execv("/usr/bin/gnuplot", argv1); - } - //wait(NULL); + slogt("finished dumping data"); + size_t strsize = strlen(datadir) + strlen(p->gnuplot_file) + 1; + char* plotfile = malloc(strsize); + snprintf(plotfile, strsize, "%s%s", datadir, p->gnuplot_file); + static char* argv1[]={"gnuplot", "-p", "plotfile.gp", NULL}; + argv1[2] = plotfile; + slogi("Using gnu plot file %s", plotfile); + if(!fork()) + { + execv(p->gnuplot_bin, argv1); + } + } + } + else + { + sloge("No gnuplot binary found or specified"); } action = 4; } - if (ch == 'B') + if (ch == 'B' || ch == 'l') { selection++; if (selection > curresults) @@ -1092,7 +659,7 @@ void* browseloop(Parameters* p, char* datadir) selection = curresults; } } - if (ch == 'A') + if (ch == 'A' || ch == 'k') { selection--; if (selection <= 1) @@ -1115,17 +682,17 @@ void* browseloop(Parameters* p, char* datadir) } - wrefresh(bwin4); - delwin(bwin4); - endwin(); + //wrefresh(bwin4); + //delwin(bwin4); + //endwin(); - wrefresh(bwin3); - delwin(bwin3); - endwin(); + //wrefresh(bwin3); + //delwin(bwin3); + //endwin(); - wrefresh(bwin2); - delwin(bwin2); - endwin(); + //wrefresh(bwin2); + //delwin(bwin2); + //endwin(); wrefresh(bwin1); delwin(bwin1); diff --git a/src/gilles/gameloop/gameloop.c b/src/gilles/gameloop/gameloop.c index 718744e..76c2b0b 100644 --- a/src/gilles/gameloop/gameloop.c +++ b/src/gilles/gameloop/gameloop.c @@ -808,7 +808,7 @@ int addevent(struct _h_connection* conn, int track_config) return getLastInsertID(conn); } -int addsession(struct _h_connection* conn, int eventid, int eventtype, int airtemp, int tracktemp) +int addsession(struct _h_connection* conn, int eventid, int carid, int eventtype, int airtemp, int tracktemp, SimData* simdata) { // session_id | event_id | event_type | track_time | session_name @@ -822,6 +822,7 @@ int addsession(struct _h_connection* conn, int eventid, int eventtype, int airte json_t* values = json_object(); json_object_set_new(values, "event_id", json_integer(eventid)); + json_object_set_new(values, "car_id", json_integer(carid)); json_object_set_new(values, "event_type", json_integer(1)); json_object_set_new(values, "duration_min", json_integer(60)); json_object_set_new(values, "start_time", json_string("NOW()")); @@ -838,7 +839,7 @@ int addsession(struct _h_connection* conn, int eventid, int eventtype, int airte return getLastInsertID(conn); } -int addstint(struct _h_connection* conn, int sessionid, int driverid, int carid) +int addstint(struct _h_connection* conn, int sessionid, int driverid, int carid, SimData* simdata) { @@ -910,8 +911,7 @@ int closestint(struct _h_connection* conn, int stintid, int stintlaps, int valid return res1; } -int closelapquery(struct _h_connection* conn, int lapid, int sector1, int sector2, int sector3, int cuts, int crashes, int maxspeed, int avgspeed, - double fbraketemp, double rbraketemp, double ftyrewear, double rtyrewear, double ftyretemp, double rtyretemp, double ftyrepress, double rtyrepress) +int closelapquery(struct _h_connection* conn, int lapid, int sector1, int sector2, int sector3, int cuts, int crashes, int maxspeed, int avgspeed, Simdata* simdata)) { // stint laps @@ -921,10 +921,25 @@ int closelapquery(struct _h_connection* conn, int lapid, int sector1, int sector slogt("closing previous lap ", lapid); char* query = malloc((sizeof(char)*360)); - sprintf(query, "UPDATE %s SET %s=%i, %s=%i, %s=%i, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, finished_at=NOW() WHERE lap_id=%i;", - "laps", "sector_1", sector1, "sector_2", sector2, "sector_3", sector3, "front_tyre_temp", ftyretemp, "rear_tyre_temp", rtyretemp, - "front_tyre_wear", ftyrewear, "rear_tyre_wear", rtyrewear, "front_tyre_press", ftyrepress, "rear_tyre_press", rtyrepress, - "front_brake_temp", fbraketemp, "rear_brake_temp", rbraketemp, lapid); + sprintf(query, "UPDATE %s SET %s=%i, %s=%i, %s=%i, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, %s=%f, finished_at=NOW() WHERE lap_id=%i;", + "laps", "sector_1", sector1, "sector_2", sector2, "sector_3", sector3, + "right_front_tyre_temp", simdata->tyretemp[1], + "right_rear_tyre_temp", simdata->tyretemp[3], + "right_front_tyre_wear", simdata->tyrewear[1], + "right_rear_tyre_wear", simdata->tyrewear[3], + "right_front_tyre_press",simdata->tyrepressure[1], + "right_rear_tyre_press", simdata->tyrepressure[3], + "right_front_brake_temp",simdata->braketemp[1], + "right_rear_brake_temp", simdata->braketemp[3], + "left_front_tyre_temp", simdata->tyretemp[0], + "left_rear_tyre_temp", simdata->tyretemp[2], + "left_front_tyre_wear", simdata->tyrewear[0], + "left_rear_tyre_wear", simdata->tyrewear[2], + "left_front_tyre_press",simdata->tyrepressure[0], + "left_rear_tyre_press", simdata->tyrepressure[2], + "left_front_brake_temp",simdata->braketemp[0], + "left_rear_brake_temp", simdata->braketemp[2], + lapid); int res1 = h_query_update(conn, query); @@ -937,20 +952,12 @@ int closelapquery(struct _h_connection* conn, int lapid, int sector1, int sector int closelap(struct _h_connection* conn, SimData* simdata, int lapid, int sector1, int sector2, int sector3, int cuts, int crashes, int maxspeed, int avgspeed) { - double fbraketemp = (simdata->braketemp[0] + simdata->braketemp[1])/2; - double rbraketemp = (simdata->braketemp[2] + simdata->braketemp[3])/2; - double ftyrewear = (simdata->tyrewear[0] + simdata->tyrewear[1])/2; - double rtyrewear = (simdata->tyrewear[2] + simdata->tyrewear[3])/2; - double ftyretemp = (simdata->tyretemp[0] + simdata->tyretemp[1])/2; - double rtyretemp = (simdata->tyretemp[2] + simdata->tyretemp[3])/2; - double ftyrepress = (simdata->tyrepressure[0] + simdata->tyrepressure[1])/2; - double rtyrepress = (simdata->tyrepressure[2] + simdata->tyrepressure[3])/2; - closelapquery(conn, lapid, sector1, sector2, sector3, 0, 0, 0, 0, fbraketemp, rbraketemp, ftyrewear, rtyrewear, ftyretemp, rtyretemp, ftyrepress, rtyrepress); + closelapquery(conn, lapid, sector1, sector2, sector3, 0, 0, 0, 0, simdata); } -int addstintlap(struct _h_connection* conn, int stintid) +int addstintlap(struct _h_connection* conn, int stintid, SimData* simdata) { // stint laps @@ -1236,9 +1243,9 @@ void* simviewmysql(void* thargs) int stintid = 0; int stintlapid = 0; int sessionid = 0; - sessionid = addsession(conn, eventid, simdata->session, simdata->airtemp, simdata->tracktemp); - stintid = addstint(conn, sessionid, driverid, carid); - stintlapid = addstintlap(conn, stintid); + sessionid = addsession(conn, eventid, carid, simdata->session, simdata->airtemp, simdata->tracktemp, simdata); + stintid = addstint(conn, sessionid, driverid, carid, simdata); + stintlapid = addstintlap(conn, stintid, simdata); sessionstatus = simdata->session; lastsessionstatus = sessionstatus; lap = simdata->lap; @@ -1302,7 +1309,7 @@ void* simviewmysql(void* thargs) closesession(conn, sessionid); if (sessionstatus > 1) { - sessionid = addsession(conn, eventid, simdata->session, simdata->airtemp, simdata->tracktemp); + sessionid = addsession(conn, eventid, carid, simdata->session, simdata->airtemp, simdata->tracktemp, simdata); } //pitstatus = 1; @@ -1319,7 +1326,7 @@ void* simviewmysql(void* thargs) // close last stint closestint(conn, stintid, stintlaps, validstintlaps); - stintid = addstint(conn, sessionid, driverid, carid); + stintid = addstint(conn, sessionid, driverid, carid, simdata); stintlaps = 1; validstintlaps = 0; } @@ -1334,7 +1341,7 @@ void* simviewmysql(void* thargs) closelap(conn, simdata, stintlapid, sectortimes[1], sectortimes[2], simdata->lastsectorinms, 0, 0, 0, 0); - stintlapid = addstintlap(conn, stintid); + stintlapid = addstintlap(conn, stintid, simdata); int telemid = addtelemetry(conn, track_samples, stintlapid); int b = updatetelemetrydata(conn, track_samples, telemid, stintlapid, speeddata, geardata, rpmdata, steerdata, acceldata, brakedata); tick = 0; diff --git a/src/gilles/gameloop/hoeldb.c b/src/gilles/gameloop/hoeldb.c new file mode 100644 index 0000000..5ff22ca --- /dev/null +++ b/src/gilles/gameloop/hoeldb.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include + +#include +#include + +#include "hoeldb.h" +#include "../helper/confighelper.h" +#include "../slog/slog.h" + +void get_row_results(struct _h_result result, DBField* fields, void* rows, size_t rowsize) { + int col, row, i; + char buf[64]; + //sess->hasdata = true; + //sess->rows = result.nb_rows; + slogi("rows: %d, col: %d", result.nb_rows, result.nb_columns); + char* aaa = (char *) rows; + for (row = 0; rowvalue; + *(int*) a = bb; + break; + case HOEL_COL_TYPE_DOUBLE: + double cc = ((struct _h_type_double *)result.data[row][col].t_data)->value; + *(double*) a = cc; + break; + case HOEL_COL_TYPE_TEXT: + char* ddd = ((struct _h_type_text *)result.data[row][col].t_data)->value; + memcpy(a, ddd, fields[col].size); + break; + case HOEL_COL_TYPE_BLOB: + for (i=0; i<((struct _h_type_blob *)result.data[row][col].t_data)->length; i++) { + printf("%c", *((char*)(((struct _h_type_blob *)result.data[row][col].t_data)->value+i))); + if (i%80 == 0 && i>0) { + printf("\n"); + } + } + break; + case HOEL_COL_TYPE_DATE: + strftime(a, fields[col].size, "%Y-%m-%d %H:%M:%S", &((struct _h_type_datetime *)result.data[row][col].t_data)->value); + //strftime(buf, 64, "%Y-%m-%d %H:%M:%S", &((struct _h_type_datetime *)result.data[row][col].t_data)->value); + printf("| %s ", buf); + case HOEL_COL_TYPE_NULL: + printf("| [null] "); + break; + } + } + printf("|\n"); + } +} + +int getsessions(struct _h_connection* conn, int* err, const char* sessionname, SessionDbo* sess) +{ + struct _h_result result; + struct _h_data * data; + char* query = malloc(247 * sizeof(char)); + slogt("Performing query"); + + //sprintf(query, "select session_id, event_id, event_type, duration_min, elapsed_ms, laps, air_temp, road_temp, start_grip, current_grip, is_finished, http_port from %s", "Sessions"); + sprintf(query, "select session_id, events.event_id, sessions.event_type, laps, display_name FROM %s JOIN events ON sessions.event_id=events.event_id JOIN track_config ON events.track_config_id=track_config.track_config_id ORDER BY session_id DESC LIMIT 25", "Sessions"); + + int errcode = h_query_select(conn, query, &result); + if (errcode == H_OK) + { + + sess->rows = malloc(sizeof(SessionRowData) * result.nb_rows); + get_row_results(result, sess->fields, sess->rows, sizeof(SessionRowData)); + //get_session_result(result, sess); + h_clean_result(&result); + } + else + { + sloge("Error executing query %s returned %i", query, errcode); + *err = E_DB_QUERY_FAIL;; + free(query); + return 0; + } + free(query); + + return result.nb_rows; +} diff --git a/src/gilles/gameloop/session.h b/src/gilles/gameloop/hoeldb.h similarity index 75% rename from src/gilles/gameloop/session.h rename to src/gilles/gameloop/hoeldb.h index 562ca83..fd03895 100644 --- a/src/gilles/gameloop/session.h +++ b/src/gilles/gameloop/hoeldb.h @@ -1,6 +1,6 @@ -#ifndef _SESSION_H -#define _SESSION_H +#ifndef _HOELDB_H +#define _HOELDB_H #include #include @@ -38,6 +38,7 @@ typedef struct SessionRowData //int duration_min; //int elapsed_ms; int laps; + unsigned char track[20]; //char weather[100]; //double air_temp; //double road_temp; @@ -68,6 +69,7 @@ typedef struct StintRowData int laps; int valid_laps; int best_lap_id; + unsigned char tyre[10]; } StintRowData; @@ -85,15 +87,15 @@ typedef struct LapRowData int crashes; int max_speed; int avg_speed; - PDBTimeStamp finished_at; - double f_tyre_temp; - double r_tyre_temp; - double f_tyre_wear; - double r_tyre_wear; - double f_tyre_press; - double r_tyre_press; - double f_brake_temp; - double r_brake_temp; + //PDBTimeStamp finished_at; + //double f_tyre_temp; + //double r_tyre_temp; + //double f_tyre_wear; + //double r_tyre_wear; + //double f_tyre_press; + //double r_tyre_press; + //double f_brake_temp; + //double r_brake_temp; } LapRowData; @@ -102,7 +104,7 @@ typedef struct SessionDbo int numrows; bool hasdata; - DBField fields[4]; + DBField fields[5]; SessionRowData* rows; } SessionDbo; @@ -122,9 +124,13 @@ typedef struct LapDbo int numrows; bool hasdata; - DBField fields[21]; + DBField fields[12]; LapRowData* rows; } LapDbo; +void get_row_results(struct _h_result result, DBField* fields, void* rows, size_t rowsize); + +int getsessions(struct _h_connection* conn, int* err, const char* sessionname, SessionDbo* sess); + #endif diff --git a/src/gilles/gameloop/telemetry.c b/src/gilles/gameloop/telemetry.c new file mode 100644 index 0000000..fa27317 --- /dev/null +++ b/src/gilles/gameloop/telemetry.c @@ -0,0 +1,228 @@ + +#include +#include +#include +#include +#include + +#include +#include + +#include "telemetry.h" +#include "../helper/confighelper.h" +#include "../slog/slog.h" + +int telem_result(struct _h_result result, int doublefields, int intfields, int* intarrays, double* doublearrays) { + int col, row, i; + char buf[64]; + slogt("rows: %d, col: %d", result.nb_rows, result.nb_columns); + //int* intarrays; + int points = 0; + //int doublefields = 3; + //int intfields = 3; + //int* intarrays; + //int* doublearrays; + //int* intarrays = malloc((sizeof(int)*1736)*3); + //double* doublearrays = malloc((sizeof(double)*1736)*3); + int intarrayoffset = 0; + int doublearrayoffset = 0; + + for (row = 0; rowvalue; + if (col == 1) + { + points = cc; + } + break; + case HOEL_COL_TYPE_DOUBLE: + //intarrays = malloc((sizeof(int)*1736)*3); + break; + case HOEL_COL_TYPE_TEXT: + slogi("| %s ", ((struct _h_type_text *)result.data[row][col].t_data)->value); + break; + case HOEL_COL_TYPE_BLOB: + int offset2 = 0; + + int j = 0; + i = 2; + if (col < 5) + { + while (i<((struct _h_type_blob *)result.data[row][col].t_data)->length) + { + char sss[10]; + sss[0] = '0'; + sss[1] = 'x'; + sss[2] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+2); + sss[3] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+3); + sss[4] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+4); + sss[5] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+5); + sss[6] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+6); + sss[7] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+7); + sss[8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+8); + sss[9] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+9); + long val; + int number = (int)strtol(sss, NULL, 16); + int swapped = __bswap_32(number); + + intarrays[j+intarrayoffset] = __bswap_32(number); + offset2 = offset2 + 8; + i+=8; + j++; + } + intarrayoffset += points; + } + else + { + while (i<((struct _h_type_blob *)result.data[row][col].t_data)->length) + { + char sss[18]; + sss[0] = '0'; + sss[1] = 'x'; + sss[2] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+2); + sss[3] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+3); + sss[4] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+4); + sss[5] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+5); + sss[6] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+6); + sss[7] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+7); + sss[8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+8); + sss[9] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+9); + sss[2+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+2+8); + sss[3+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+3+8); + sss[4+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+4+8); + sss[5+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+5+8); + sss[6+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+6+8); + sss[7+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+7+8); + sss[8+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+8+8); + sss[9+8] = *((char*)((struct _h_type_blob *)result.data[row][col].t_data)->value+offset2+9+8); + long val; + int64_t number = (int64_t) strtoll(sss, NULL, 16); + int64_t swapped = __bswap_64(number); + double d = *((double*)&swapped); + doublearrays[j+doublearrayoffset] = (double) d; + offset2 = offset2 + 16; + i+=16; + j++; + } + doublearrayoffset += points; + + } + //snprintf( "blob value: %.*s", ((struct _h_type_blob *)result.data[row][col].t_data)->length, ((struct _h_type_blob *)result.data[row][col].t_data)->value); + //char* b = malloc(sizeof(int)*1736); + //for (i=0; i<((struct _h_type_blob *)result.data[row][col].t_data)->length; i++) { + // //slogi("%c", *((char*)(((struct _h_type_blob *)result.data[row][col].t_data)->value+i))); + // memcpy(&b[i], ((struct _h_type_blob *)result.data[row][col].t_data)->value+1*sizeof(char), sizeof(char)); + //} +// FILE *out = fopen("memory.bin", "wb"); +// if(out != NULL) +// { +// size_t to_go = sizeof(int)*1736; +// while(to_go > 0) +// { +// const size_t wrote = fwrite(b, to_go, 1, out); +// if(wrote == 0) +// break; +// to_go -= wrote; +// } +// fclose(out); +// } + break; + case HOEL_COL_TYPE_DATE: + strftime(buf, 64, "%Y-%m-%d %H:%M:%S", &((struct _h_type_datetime *)result.data[row][col].t_data)->value); + printf("| %s ", buf); + case HOEL_COL_TYPE_NULL: + slogi("| [null] "); + break; + } + } + printf("|\n"); + } + + return points; +} + +int dumptelemetrytofile(struct _h_connection* conn, char* datadir, int lap1id, int lap2id) +{ + + slogt("dumping telemetry to temp file: lap1id: %d lap2id: %d", lap1id, lap2id); + + int points = 0; + int intfields = 3; + int doublefields = 3; + + struct _h_result result; + struct _h_data *data; + char* query = malloc(150 * sizeof(char)); + sprintf(query, "SELECT lap_id, points FROM %s WHERE %s=%i", "telemetry", "lap_id", lap1id); + if (h_query_select(conn, query, &result) == H_OK) { + //laps->rows = malloc(sizeof(LapRowData) * result.nb_rows); + //get_row_results(result, laps->fields, laps->rows, sizeof(LapRowData)); + points = telem_result(result, 3, 3, NULL, NULL); + //get_stint_result(result, stint); + h_clean_result(&result); + } else { + printf("Error executing query\n"); + } + free(query); + + + int* intarrays1 = malloc((sizeof(int))*points*intfields); + double* doublearrays1 = malloc((sizeof(double))*points*doublefields); + int* intarrays2 = malloc((sizeof(int))*points*intfields); + double* doublearrays2 = malloc((sizeof(double))*points*doublefields); + + struct _h_result result1; + struct _h_data * data1; + char* query1 = malloc(150 * sizeof(char)); + sprintf(query1, "SELECT lap_id, points, speed, gear, rpms, brake, accel, steer FROM %s WHERE %s=%i", "telemetry", "lap_id", lap1id); + if (h_query_select(conn, query1, &result1) == H_OK) { + //laps->rows = malloc(sizeof(LapRowData) * result.nb_rows); + //get_row_results(result, laps->fields, laps->rows, sizeof(LapRowData)); + points = telem_result(result1, intfields, doublefields, intarrays1, doublearrays1); + //get_stint_result(result, stint); + h_clean_result(&result1); + } else { + printf("Error executing query\n"); + } + free(query1); + + struct _h_result result2; + struct _h_data * data2; + char* query2 = malloc(150 * sizeof(char)); + sprintf(query2, "SELECT lap_id, points, speed, gear, rpms, brake, accel, steer FROM %s WHERE %s=%i", "telemetry", "lap_id", lap2id); + if (h_query_select(conn, query2, &result2) == H_OK) { + //laps->rows = malloc(sizeof(LapRowData) * result.nb_rows); + //get_row_results(result, laps->fields, laps->rows, sizeof(LapRowData)); + points = telem_result(result2, intfields, doublefields, intarrays2, doublearrays2); + //get_stint_result(result, stint); + h_clean_result(&result2); + } else { + printf("Error executing query\n"); + } + free(query2); + + char* filename1 = "data.out"; + size_t strsize = strlen(datadir) + strlen(filename1) + 1; + char* datafile = malloc(strsize); + + snprintf(datafile, strsize, "%s%s", datadir, filename1); + slogt("dumping %i points to file %s", points, datafile); + FILE *out = fopen(datafile, "w"); + fprintf(out, "%s %s %s %s %s %s %s %s %s %s %s %s %s\n", "point", "speed1", "gear1", "rpms1", "brake1", "accel1", "steer1", "speed2", "gear2", "rpms2", "brake2", "accel2", "steer2" ); + for (int i=0; i #include #include +#include #include "confighelper.h" @@ -73,8 +74,10 @@ int loadconfig(const char* config_file_str, Parameters* p) { slogi("Parsing config file"); + if (p->program_action == A_BROWSE) { + char* gnuplotbin = "/usr/bin/gnuplot"; config_setting_t* config_graph_array = NULL; config_graph_array = config_lookup(&cfg, "graph"); @@ -88,7 +91,22 @@ int loadconfig(const char* config_file_str, Parameters* p) const char* temp; config_setting_lookup_string(config_graph, "gnuplotfile", &temp); p->gnuplot_file = strdup(temp); - slogi("set gnuplot config file %s", p->gnuplot_file); + slogt("set gnuplot config file %s", p->gnuplot_file); + + int found = config_setting_lookup_string(config_graph, "gnuplotbin", &temp); + if (found > 0) + { + p->gnuplot_bin = strdup(temp); + } + else + { + p->gnuplot_bin = strdup(gnuplotbin); + } + p->gnuplotfound = 0; + if (access(p->gnuplot_bin, F_OK) == 0) + { + p->gnuplotfound = 1; + } } if (p->mysql == true || p->program_action == A_BROWSE) diff --git a/src/gilles/helper/parameters.c b/src/gilles/helper/parameters.c index 86c37ff..c33a166 100644 --- a/src/gilles/helper/parameters.c +++ b/src/gilles/helper/parameters.c @@ -25,6 +25,10 @@ int freeparams(Parameters* p) free(p->db_conn); } } + if (p->program_action == A_BROWSE) + { + free(p->gnuplot_bin); + } if (p->config_path != NULL) { free(p->config_path); diff --git a/src/gilles/helper/parameters.h b/src/gilles/helper/parameters.h index b14488b..c2ba99e 100644 --- a/src/gilles/helper/parameters.h +++ b/src/gilles/helper/parameters.h @@ -14,6 +14,8 @@ typedef struct int program_state; char* config_path; char* gnuplot_file; + char* gnuplot_bin; + int gnuplotfound; bool cli; bool mqtt;