Code to read in config for browse mode
This commit is contained in:
parent
e0cc9de18f
commit
4772e759d4
|
|
@ -1,6 +1,8 @@
|
||||||
set(gameloop_source_files
|
set(gameloop_source_files
|
||||||
gameloop.c
|
gameloop.c
|
||||||
gameloop.h
|
gameloop.h
|
||||||
|
browseloop.c
|
||||||
|
browseloop.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,8 @@
|
||||||
#include <hoel.h>
|
#include <hoel.h>
|
||||||
#include <jansson.h>
|
#include <jansson.h>
|
||||||
|
|
||||||
|
#include <byteswap.h>
|
||||||
|
|
||||||
#include "session.h"
|
#include "session.h"
|
||||||
#include "gameloop.h"
|
#include "gameloop.h"
|
||||||
#include "../helper/parameters.h"
|
#include "../helper/parameters.h"
|
||||||
|
|
@ -31,26 +33,28 @@
|
||||||
#define STINTS_SCREEN 2
|
#define STINTS_SCREEN 2
|
||||||
#define LAPS_SCREEN 3
|
#define LAPS_SCREEN 3
|
||||||
|
|
||||||
char datestring[30];
|
|
||||||
|
|
||||||
WINDOW* win1;
|
WINDOW* bwin1;
|
||||||
WINDOW* win2;
|
WINDOW* bwin2;
|
||||||
WINDOW* win3;
|
WINDOW* bwin3;
|
||||||
WINDOW* win4;
|
WINDOW* bwin4;
|
||||||
|
|
||||||
int winx, winy;
|
int bwinx, bwiny;
|
||||||
|
|
||||||
int win23y, win23x;
|
char blanks[100];
|
||||||
|
|
||||||
|
void set_spaces(int spaces)
|
||||||
|
{
|
||||||
|
blanks[spaces] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
void b_handle_winch(int sig)
|
||||||
void handle_winch(int sig)
|
|
||||||
{
|
{
|
||||||
endwin();
|
endwin();
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
clear();
|
clear();
|
||||||
getmaxyx(stdscr, winx, winy);
|
getmaxyx(stdscr, bwinx, bwiny);
|
||||||
//win23y = winy/3;
|
//win23y = winy/3;
|
||||||
//win23x = winx/3;
|
//win23x = winx/3;
|
||||||
//win1 = newwin(winx,winy,0,0);
|
//win1 = newwin(winx,winy,0,0);
|
||||||
|
|
@ -60,20 +64,21 @@ void handle_winch(int sig)
|
||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void rectangle(int y1, int x1, int y2, int x2)
|
//void rectangle(int y1, int x1, int y2, int x2)
|
||||||
{
|
//{
|
||||||
mvhline(y1, x1, 0, x2-x1);
|
// mvhline(y1, x1, 0, x2-x1);
|
||||||
mvhline(y2, x1, 0, x2-x1);
|
// mvhline(y2, x1, 0, x2-x1);
|
||||||
mvvline(y1, x1, 0, y2-y1);
|
// mvvline(y1, x1, 0, y2-y1);
|
||||||
mvvline(y1, x2, 0, y2-y1);
|
// mvvline(y1, x2, 0, y2-y1);
|
||||||
mvaddch(y1, x1, ACS_ULCORNER);
|
// mvaddch(y1, x1, ACS_ULCORNER);
|
||||||
mvaddch(y2, x1, ACS_LLCORNER);
|
// mvaddch(y2, x1, ACS_LLCORNER);
|
||||||
mvaddch(y1, x2, ACS_URCORNER);
|
// mvaddch(y1, x2, ACS_URCORNER);
|
||||||
mvaddch(y2, x2, ACS_LRCORNER);
|
// mvaddch(y2, x2, ACS_LRCORNER);
|
||||||
}
|
//}
|
||||||
|
|
||||||
int curses_init()
|
int b_curses_init()
|
||||||
{
|
{
|
||||||
|
memset(blanks,' ',sizeof(blanks));
|
||||||
initscr();
|
initscr();
|
||||||
start_color();
|
start_color();
|
||||||
|
|
||||||
|
|
@ -82,89 +87,160 @@ int curses_init()
|
||||||
init_pair(3,COLOR_MAGENTA,0);
|
init_pair(3,COLOR_MAGENTA,0);
|
||||||
init_pair(4,COLOR_WHITE,0);
|
init_pair(4,COLOR_WHITE,0);
|
||||||
|
|
||||||
getmaxyx(stdscr, winx, winy);
|
getmaxyx(stdscr, bwinx, bwiny);
|
||||||
win1 = newwin(winx,winy,0,0);
|
slogt("windowx %i, windowy %i", bwinx, bwiny);
|
||||||
|
bwin1 = newwin(bwinx,bwiny,0,0);
|
||||||
//win23y = winy/3;
|
//win23y = winy/3;
|
||||||
//win23x = winx/3;
|
//win23x = winx/3;
|
||||||
//win2 = newwin(win23x,win23y,1,win23y-1);
|
//win2 = newwin(win23x,win23y,1,win23y-1);
|
||||||
//win3 = newwin(win23x,win23y,1,win23y*2-1);
|
//win3 = newwin(win23x,win23y,1,win23y*2-1);
|
||||||
//win4 = newwin(winx-win23x-2,winy-win23y,win23x+1,win23y-1);
|
//win4 = newwin(winx-win23x-2,winy-win23y,win23x+1,win23y-1);
|
||||||
|
|
||||||
wbkgd(win1,COLOR_PAIR(1));
|
wbkgd(bwin1,COLOR_PAIR(1));
|
||||||
wbkgd(win2,COLOR_PAIR(1));
|
wbkgd(bwin2,COLOR_PAIR(1));
|
||||||
wbkgd(win3,COLOR_PAIR(1));
|
wbkgd(bwin3,COLOR_PAIR(1));
|
||||||
wbkgd(win4,COLOR_PAIR(1));
|
wbkgd(bwin4,COLOR_PAIR(1));
|
||||||
|
|
||||||
signal(SIGWINCH, handle_winch);
|
signal(SIGWINCH, b_handle_winch);
|
||||||
cbreak();
|
cbreak();
|
||||||
noecho();
|
noecho();
|
||||||
|
|
||||||
box(win1, 0, 0);
|
box(bwin1, 0, 0);
|
||||||
box(win2, 0, 0);
|
box(bwin2, 0, 0);
|
||||||
box(win3, 0, 0);
|
box(bwin3, 0, 0);
|
||||||
box(win4, 0, 0);
|
box(bwin4, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
char * removeSpacesFromStr(char *string)
|
|
||||||
{
|
|
||||||
int non_space_count = 0;
|
|
||||||
|
|
||||||
for (int i = 0; string[i] != '\0'; i++)
|
int telem_result(struct _h_result result, int doublefields, int intfields, int* intarrays, double* doublearrays) {
|
||||||
{
|
|
||||||
if (string[i] != ' ')
|
|
||||||
{
|
|
||||||
string[non_space_count] = string[i];
|
|
||||||
non_space_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
string[non_space_count] = '\0';
|
|
||||||
return string;
|
|
||||||
}
|
|
||||||
|
|
||||||
void update_date()
|
|
||||||
{
|
|
||||||
time_t rawtime;
|
|
||||||
struct tm * timeinfo;
|
|
||||||
time ( &rawtime );
|
|
||||||
timeinfo = localtime ( &rawtime );
|
|
||||||
sprintf(datestring, "%.24s", asctime (timeinfo));
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_result(struct _h_result result) {
|
|
||||||
int col, row, i;
|
int col, row, i;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
slogi("rows: %d, col: %d", result.nb_rows, result.nb_columns);
|
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; row<result.nb_rows; row++) {
|
for (row = 0; row<result.nb_rows; row++) {
|
||||||
for (col=0; col<result.nb_columns; col++) {
|
for (col=0; col<result.nb_columns; col++) {
|
||||||
switch(result.data[row][col].type) {
|
switch(result.data[row][col].type) {
|
||||||
case HOEL_COL_TYPE_INT:
|
case HOEL_COL_TYPE_INT:
|
||||||
printf("| %d ", ((struct _h_type_int *)result.data[row][col].t_data)->value);
|
int cc = ((struct _h_type_int *)result.data[row][col].t_data)->value;
|
||||||
|
if (col == 1)
|
||||||
|
{
|
||||||
|
points = cc;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case HOEL_COL_TYPE_DOUBLE:
|
case HOEL_COL_TYPE_DOUBLE:
|
||||||
printf("| %f ", ((struct _h_type_double *)result.data[row][col].t_data)->value);
|
//intarrays = malloc((sizeof(int)*1736)*3);
|
||||||
break;
|
break;
|
||||||
case HOEL_COL_TYPE_TEXT:
|
case HOEL_COL_TYPE_TEXT:
|
||||||
printf("| %s ", ((struct _h_type_text *)result.data[row][col].t_data)->value);
|
slogi("| %s ", ((struct _h_type_text *)result.data[row][col].t_data)->value);
|
||||||
break;
|
break;
|
||||||
case HOEL_COL_TYPE_BLOB:
|
case HOEL_COL_TYPE_BLOB:
|
||||||
for (i=0; i<((struct _h_type_blob *)result.data[row][col].t_data)->length; i++) {
|
int offset2 = 0;
|
||||||
printf("%c", *((char*)(((struct _h_type_blob *)result.data[row][col].t_data)->value+i)));
|
|
||||||
if (i%80 == 0 && i>0) {
|
int j = 0;
|
||||||
printf("\n");
|
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;
|
break;
|
||||||
case HOEL_COL_TYPE_DATE:
|
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);
|
strftime(buf, 64, "%Y-%m-%d %H:%M:%S", &((struct _h_type_datetime *)result.data[row][col].t_data)->value);
|
||||||
printf("| %s ", buf);
|
printf("| %s ", buf);
|
||||||
case HOEL_COL_TYPE_NULL:
|
case HOEL_COL_TYPE_NULL:
|
||||||
printf("| [null] ");
|
slogi("| [null] ");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("|\n");
|
printf("|\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return points;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_row_results(struct _h_result result, DBField* fields, void* rows, size_t rowsize) {
|
void get_row_results(struct _h_result result, DBField* fields, void* rows, size_t rowsize) {
|
||||||
|
|
@ -214,7 +290,7 @@ void get_row_results(struct _h_result result, DBField* fields, void* rows, size_
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int getsessions(struct _h_connection* conn, const char* sessionname, SessionDbo* sess)
|
int getsessions(struct _h_connection* conn, int* err, const char* sessionname, SessionDbo* sess)
|
||||||
{
|
{
|
||||||
struct _h_result result;
|
struct _h_result result;
|
||||||
struct _h_data * data;
|
struct _h_data * data;
|
||||||
|
|
@ -222,14 +298,19 @@ int getsessions(struct _h_connection* conn, const char* sessionname, SessionDbo*
|
||||||
slogt("Performing query");
|
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, 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", "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) {
|
if (h_query_select(conn, query, &result) == H_OK) {
|
||||||
sess->rows = malloc(sizeof(SessionRowData) * result.nb_rows);
|
sess->rows = malloc(sizeof(SessionRowData) * result.nb_rows);
|
||||||
get_row_results(result, sess->fields, sess->rows, sizeof(SessionRowData));
|
get_row_results(result, sess->fields, sess->rows, sizeof(SessionRowData));
|
||||||
//get_session_result(result, sess);
|
//get_session_result(result, sess);
|
||||||
h_clean_result(&result);
|
h_clean_result(&result);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
printf("Error executing query\n");
|
printf("Error executing query\n");
|
||||||
|
*err = E_DB_QUERY_FAIL;;
|
||||||
|
free(query);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
free(query);
|
free(query);
|
||||||
|
|
||||||
|
|
@ -245,6 +326,7 @@ int getstints(struct _h_connection* conn, const char* sessionname, StintDbo* sti
|
||||||
|
|
||||||
|
|
||||||
sprintf(query, "select stint_id, driver_id, team_member_id, session_id, car_id, game_car_id, laps, valid_laps, best_lap_id FROM %s WHERE session_id=%i", "Stints", use_id);
|
sprintf(query, "select stint_id, driver_id, team_member_id, session_id, car_id, game_car_id, laps, valid_laps, best_lap_id FROM %s WHERE session_id=%i", "Stints", use_id);
|
||||||
|
slogt("execute query %s", query);
|
||||||
if (h_query_select(conn, query, &result) == H_OK) {
|
if (h_query_select(conn, query, &result) == H_OK) {
|
||||||
stint->rows = malloc(sizeof(StintRowData) * result.nb_rows);
|
stint->rows = malloc(sizeof(StintRowData) * result.nb_rows);
|
||||||
get_row_results(result, stint->fields, stint->rows, sizeof(StintRowData));
|
get_row_results(result, stint->fields, stint->rows, sizeof(StintRowData));
|
||||||
|
|
@ -266,10 +348,11 @@ int getlaps(struct _h_connection* conn, const char* sessionname, LapDbo* laps, i
|
||||||
slogt("Performing query laps");
|
slogt("Performing query laps");
|
||||||
|
|
||||||
|
|
||||||
sprintf(query, "select * FROM %s WHERE stint_id=%i", "Laps", use_id);
|
sprintf(query, "select * FROM %s WHERE %s=%i", "Laps", "stint_id", use_id);
|
||||||
if (h_query_select(conn, query, &result) == H_OK) {
|
if (h_query_select(conn, query, &result) == H_OK) {
|
||||||
laps->rows = malloc(sizeof(LapRowData) * result.nb_rows);
|
laps->rows = malloc(sizeof(LapRowData) * result.nb_rows);
|
||||||
get_row_results(result, laps->fields, laps->rows, sizeof(LapRowData));
|
get_row_results(result, laps->fields, laps->rows, sizeof(LapRowData));
|
||||||
|
//print_result(result);
|
||||||
//get_stint_result(result, stint);
|
//get_stint_result(result, stint);
|
||||||
h_clean_result(&result);
|
h_clean_result(&result);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -280,6 +363,89 @@ int getlaps(struct _h_connection* conn, const char* sessionname, LapDbo* laps, i
|
||||||
return result.nb_rows;
|
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<points; i++)
|
||||||
|
{
|
||||||
|
fprintf(out, "%i %i %i %i %f %f %f", i+1, intarrays1[i], intarrays1[i+points], intarrays1[i+(points*2)], doublearrays1[i], doublearrays1[i+points], doublearrays1[i+(points*2)]);
|
||||||
|
fprintf(out, "%i %i %i %i %f %f %f\n", i+1, intarrays2[i], intarrays2[i+points], intarrays2[i+(points*2)], doublearrays2[i], doublearrays2[i+points], doublearrays2[i+(points*2)]);
|
||||||
|
}
|
||||||
|
fclose(out);
|
||||||
|
|
||||||
|
free(intarrays1);
|
||||||
|
free(intarrays2);
|
||||||
|
free(doublearrays1);
|
||||||
|
free(doublearrays2);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
//int getsessions(struct _h_connection* conn, const char* carname)
|
//int getsessions(struct _h_connection* conn, const char* carname)
|
||||||
//{
|
//{
|
||||||
// json_t *j_result;
|
// json_t *j_result;
|
||||||
|
|
@ -330,16 +496,22 @@ int getlaps(struct _h_connection* conn, const char* sessionname, LapDbo* laps, i
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void* browseloop(Parameters* p)
|
void* browseloop(Parameters* p, char* datadir)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct _h_result result;
|
struct _h_result result;
|
||||||
struct _h_connection * conn;
|
struct _h_connection * conn;
|
||||||
char* connectionstring = "host=zorak.brak dbname=gilles user=test password=thisisatest";
|
conn = h_connect_pgsql(p->db_conn);
|
||||||
conn = h_connect_pgsql(connectionstring);
|
|
||||||
|
if (conn == NULL)
|
||||||
|
{
|
||||||
|
slogf("Unable to connect to configured Gilles database. Are the parameters in the config correct? Is the user allowed to access from this address?");
|
||||||
|
p->err = E_FAILED_DB_CONN;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
slogt("Starting analyzer");
|
slogt("Starting analyzer");
|
||||||
curses_init();
|
b_curses_init();
|
||||||
|
|
||||||
timeout(DEFAULT_UPDATE_RATE);
|
timeout(DEFAULT_UPDATE_RATE);
|
||||||
|
|
||||||
|
|
@ -459,6 +631,30 @@ void* browseloop(Parameters* p)
|
||||||
DBField avgspeed;
|
DBField avgspeed;
|
||||||
avgspeed.type = HOEL_COL_TYPE_INT;
|
avgspeed.type = HOEL_COL_TYPE_INT;
|
||||||
avgspeed.offset = offsetof(LapRowData, avg_speed);
|
avgspeed.offset = offsetof(LapRowData, avg_speed);
|
||||||
|
DBField f_tyre_temp;
|
||||||
|
f_tyre_temp.type = HOEL_COL_TYPE_DOUBLE;
|
||||||
|
f_tyre_temp.offset = offsetof(LapRowData, f_tyre_temp);
|
||||||
|
DBField r_tyre_temp;
|
||||||
|
r_tyre_temp.type = HOEL_COL_TYPE_DOUBLE;
|
||||||
|
r_tyre_temp.offset = offsetof(LapRowData, r_tyre_temp);
|
||||||
|
DBField f_tyre_wear;
|
||||||
|
f_tyre_wear.type = HOEL_COL_TYPE_DOUBLE;
|
||||||
|
f_tyre_wear.offset = offsetof(LapRowData, f_tyre_wear);
|
||||||
|
DBField r_tyre_wear;
|
||||||
|
r_tyre_wear.type = HOEL_COL_TYPE_DOUBLE;
|
||||||
|
r_tyre_wear.offset = offsetof(LapRowData, r_tyre_wear);
|
||||||
|
DBField f_tyre_press;
|
||||||
|
f_tyre_press.type = HOEL_COL_TYPE_DOUBLE;
|
||||||
|
f_tyre_press.offset = offsetof(LapRowData, f_tyre_press);
|
||||||
|
DBField r_tyre_press;
|
||||||
|
r_tyre_press.type = HOEL_COL_TYPE_DOUBLE;
|
||||||
|
r_tyre_press.offset = offsetof(LapRowData, r_tyre_press);
|
||||||
|
DBField f_brake_temp;
|
||||||
|
f_brake_temp.type = HOEL_COL_TYPE_DOUBLE;
|
||||||
|
f_brake_temp.offset = offsetof(LapRowData, f_brake_temp);
|
||||||
|
DBField r_brake_temp;
|
||||||
|
r_brake_temp.type = HOEL_COL_TYPE_DOUBLE;
|
||||||
|
r_brake_temp.offset = offsetof(LapRowData, r_brake_temp);
|
||||||
DBField lapsdbfinishedat;
|
DBField lapsdbfinishedat;
|
||||||
lapsdbfinishedat.type = HOEL_COL_TYPE_DATE;
|
lapsdbfinishedat.type = HOEL_COL_TYPE_DATE;
|
||||||
lapsdbfinishedat.offset = offsetof(LapRowData, finished_at);
|
lapsdbfinishedat.offset = offsetof(LapRowData, finished_at);
|
||||||
|
|
@ -477,6 +673,14 @@ void* browseloop(Parameters* p)
|
||||||
lapsdb.fields[10] = maxspeed;
|
lapsdb.fields[10] = maxspeed;
|
||||||
lapsdb.fields[11] = avgspeed;
|
lapsdb.fields[11] = avgspeed;
|
||||||
lapsdb.fields[12] = lapsdbfinishedat;
|
lapsdb.fields[12] = lapsdbfinishedat;
|
||||||
|
lapsdb.fields[13] = f_tyre_temp;
|
||||||
|
lapsdb.fields[14] = r_tyre_temp;
|
||||||
|
lapsdb.fields[15] = f_tyre_wear;
|
||||||
|
lapsdb.fields[16] = r_tyre_wear;
|
||||||
|
lapsdb.fields[17] = f_tyre_press;
|
||||||
|
lapsdb.fields[18] = r_tyre_press;
|
||||||
|
lapsdb.fields[19] = f_brake_temp;
|
||||||
|
lapsdb.fields[20] = r_brake_temp;
|
||||||
|
|
||||||
//slogt("sessions has %i rows", sess.numrows);
|
//slogt("sessions has %i rows", sess.numrows);
|
||||||
|
|
||||||
|
|
@ -488,9 +692,10 @@ void* browseloop(Parameters* p)
|
||||||
|
|
||||||
int screen = SESSIONS_SCREEN;
|
int screen = SESSIONS_SCREEN;
|
||||||
char ch;
|
char ch;
|
||||||
box(win1, 0, 0);
|
box(bwin1, 0, 0);
|
||||||
wrefresh(win1);
|
wrefresh(bwin1);
|
||||||
int useid = 0;
|
int stint_useid = 0;
|
||||||
|
int lap_useid = 0;
|
||||||
while (go == true)
|
while (go == true)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -503,30 +708,38 @@ void* browseloop(Parameters* p)
|
||||||
if (action == 2)
|
if (action == 2)
|
||||||
{
|
{
|
||||||
slogt("going to perform an action");
|
slogt("going to perform an action");
|
||||||
sessions = getsessions(conn, "Sessions", &sess);
|
int err = 0;
|
||||||
|
sessions = getsessions(conn, &err, "Sessions", &sess);
|
||||||
|
if (err != E_NO_ERROR)
|
||||||
|
{
|
||||||
|
go = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
curresults = sessions;
|
curresults = sessions;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (action == 3)
|
if (action == 3)
|
||||||
{
|
{
|
||||||
slogt("going to perform an action");
|
slogt("going to perform an action");
|
||||||
|
|
||||||
stintsid = getstints(conn, "Stints", &stints, useid);
|
stintsid = getstints(conn, "Stints", &stints, stint_useid);
|
||||||
curresults = stintsid;
|
curresults = stintsid;
|
||||||
}
|
}
|
||||||
if (action == 4)
|
if (action == 4)
|
||||||
{
|
{
|
||||||
slogt("going to perform an action");
|
slogt("going to perform an action");
|
||||||
|
|
||||||
lapsresults = getlaps(conn, "laps", &lapsdb, useid);
|
lapsresults = getlaps(conn, "laps", &lapsdb, lap_useid);
|
||||||
curresults = lapsresults;
|
curresults = lapsresults;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action > 0)
|
if (action > 0)
|
||||||
{
|
{
|
||||||
wclear(win1);
|
wclear(bwin1);
|
||||||
|
|
||||||
wprintw(win1, "\n");
|
wprintw(bwin1, "\n");
|
||||||
switch(screen) {
|
switch(screen) {
|
||||||
case SESSIONS_SCREEN:
|
case SESSIONS_SCREEN:
|
||||||
for(int i=0; i<sessions+1; i++)
|
for(int i=0; i<sessions+1; i++)
|
||||||
|
|
@ -534,60 +747,91 @@ void* browseloop(Parameters* p)
|
||||||
|
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
char spacer[4];
|
wattrset(bwin1, COLOR_PAIR(2));
|
||||||
sprintf(spacer, "\n");
|
attron(A_BOLD);
|
||||||
waddstr(win1, spacer);
|
set_spaces(bwiny/2);
|
||||||
|
waddstr(bwin1, blanks);
|
||||||
|
|
||||||
|
char sessions_title[9];
|
||||||
|
sprintf(sessions_title, "Sessions");
|
||||||
|
waddstr(bwin1, sessions_title);
|
||||||
|
wprintw(bwin1, "\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
wprintw(bwin1, "\n");
|
||||||
|
|
||||||
char selectind[4];
|
char selectind[4];
|
||||||
|
|
||||||
|
set_spaces(bwiny/4);
|
||||||
|
waddstr(bwin1, blanks);
|
||||||
|
|
||||||
|
char idx[6];
|
||||||
|
sprintf(idx, " idx ");
|
||||||
|
waddstr(bwin1, idx);
|
||||||
|
|
||||||
|
set_spaces(bwiny/6);
|
||||||
|
waddstr(bwin1, blanks);
|
||||||
|
|
||||||
char clastlap[26];
|
char clastlap[26];
|
||||||
sprintf(clastlap, " session name ");
|
sprintf(clastlap, " session name ");
|
||||||
waddstr(win1, clastlap);
|
waddstr(bwin1, clastlap);
|
||||||
|
|
||||||
wprintw(win1, " ");
|
set_spaces(bwiny/6);
|
||||||
|
waddstr(bwin1, blanks);
|
||||||
|
|
||||||
char cbestlap[14];
|
char cbestlap[14];
|
||||||
sprintf(cbestlap, " laps ");
|
sprintf(cbestlap, " laps ");
|
||||||
waddstr(win1, cbestlap);
|
waddstr(bwin1, cbestlap);
|
||||||
|
|
||||||
wprintw(win1, "\n");
|
wprintw(bwin1, "\n");
|
||||||
|
for (int j = 0; j < bwiny-1; ++j)
|
||||||
|
waddch(bwin1, ACS_HLINE);
|
||||||
|
|
||||||
|
//mvhline(5, 5, 0, bwiny-1);
|
||||||
|
//mvwhline(bwin1, 20, 20, ACS_HLINE, bwiny+1);
|
||||||
|
//whline(bwin1, ACS_HLINE, 0);
|
||||||
|
|
||||||
|
wprintw(bwin1, "\n");
|
||||||
|
|
||||||
|
attroff(A_BOLD);
|
||||||
|
wattrset(bwin1, COLOR_PAIR(1));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
char spacer[4];
|
char spacer[4];
|
||||||
sprintf(spacer, "\n");
|
sprintf(spacer, "\n");
|
||||||
waddstr(win1, spacer);
|
waddstr(bwin1, spacer);
|
||||||
|
|
||||||
char selectind[6];
|
char selectind[6];
|
||||||
|
|
||||||
if ( i == selection )
|
if ( i == selection )
|
||||||
{
|
{
|
||||||
useid = sess.rows[i-1].session_id;
|
stint_useid = sess.rows[i-1].session_id;
|
||||||
sprintf(selectind, "_*_");
|
sprintf(selectind, "_*_");
|
||||||
waddstr(win1, selectind);
|
waddstr(bwin1, selectind);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(selectind, "___");
|
sprintf(selectind, "___");
|
||||||
waddstr(win1, selectind);
|
waddstr(bwin1, selectind);
|
||||||
}
|
}
|
||||||
int maxstrlen = 20;
|
int maxstrlen = 20;
|
||||||
wprintw(win1, " %i ", sess.rows[i-1].session_id);
|
wprintw(bwin1, " %i ", sess.rows[i-1].session_id);
|
||||||
|
|
||||||
char clastlap[14];
|
char clastlap[14];
|
||||||
sprintf(clastlap, "session name");
|
sprintf(clastlap, "session name");
|
||||||
waddstr(win1, clastlap);
|
waddstr(bwin1, clastlap);
|
||||||
|
|
||||||
wprintw(win1, " ");
|
wprintw(bwin1, " ");
|
||||||
char cbestlap[14];
|
char cbestlap[14];
|
||||||
sprintf(cbestlap, "laps %i", sess.rows[i-1].laps);
|
sprintf(cbestlap, "laps %i", sess.rows[i-1].laps);
|
||||||
waddstr(win1, cbestlap);
|
waddstr(bwin1, cbestlap);
|
||||||
|
|
||||||
wprintw(win1, "\n");
|
wprintw(bwin1, "\n");
|
||||||
}
|
}
|
||||||
//box(win1, 0, 0);
|
//box(win1, 0, 0);
|
||||||
//wrefresh(win1);
|
//wrefresh(win1);
|
||||||
|
|
@ -604,22 +848,22 @@ void* browseloop(Parameters* p)
|
||||||
{
|
{
|
||||||
char spacer[4];
|
char spacer[4];
|
||||||
sprintf(spacer, "\n");
|
sprintf(spacer, "\n");
|
||||||
waddstr(win1, spacer);
|
waddstr(bwin1, spacer);
|
||||||
|
|
||||||
char selectind[4];
|
char selectind[4];
|
||||||
|
|
||||||
|
|
||||||
char clastlap[26];
|
char clastlap[26];
|
||||||
sprintf(clastlap, " stint name ");
|
sprintf(clastlap, " stint name ");
|
||||||
waddstr(win1, clastlap);
|
waddstr(bwin1, clastlap);
|
||||||
|
|
||||||
wprintw(win1, " ");
|
wprintw(bwin1, " ");
|
||||||
|
|
||||||
char cbestlap[14];
|
char cbestlap[14];
|
||||||
sprintf(cbestlap, " laps ");
|
sprintf(cbestlap, " laps ");
|
||||||
waddstr(win1, cbestlap);
|
waddstr(bwin1, cbestlap);
|
||||||
|
|
||||||
wprintw(win1, "\n");
|
wprintw(bwin1, "\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -627,35 +871,35 @@ void* browseloop(Parameters* p)
|
||||||
|
|
||||||
char spacer[4];
|
char spacer[4];
|
||||||
sprintf(spacer, "\n");
|
sprintf(spacer, "\n");
|
||||||
waddstr(win1, spacer);
|
waddstr(bwin1, spacer);
|
||||||
|
|
||||||
char selectind[4];
|
char selectind[4];
|
||||||
|
|
||||||
if ( i == selection )
|
if ( i == selection )
|
||||||
{
|
{
|
||||||
sprintf(selectind, "_*_");
|
sprintf(selectind, "_*_");
|
||||||
waddstr(win1, selectind);
|
waddstr(bwin1, selectind);
|
||||||
useid = stints.rows[i-i].stint_id;
|
lap_useid = stints.rows[i-i].stint_id;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(selectind, "___");
|
sprintf(selectind, "___");
|
||||||
waddstr(win1, selectind);
|
waddstr(bwin1, selectind);
|
||||||
}
|
}
|
||||||
int maxstrlen = 20;
|
int maxstrlen = 20;
|
||||||
wprintw(win1, " %i ", stints.rows[i-1].stint_id);
|
wprintw(bwin1, " %i ", stints.rows[i-1].stint_id);
|
||||||
|
|
||||||
char clastlap[14];
|
char clastlap[14];
|
||||||
sprintf(clastlap, "stint name");
|
sprintf(clastlap, "stint name");
|
||||||
waddstr(win1, clastlap);
|
waddstr(bwin1, clastlap);
|
||||||
|
|
||||||
wprintw(win1, " ");
|
wprintw(bwin1, " ");
|
||||||
|
|
||||||
char cbestlap[14];
|
char cbestlap[14];
|
||||||
sprintf(cbestlap, "laps %i", stints.rows[i-1].driver_id);
|
sprintf(cbestlap, "laps %i", stints.rows[i-1].laps);
|
||||||
waddstr(win1, cbestlap);
|
waddstr(bwin1, cbestlap);
|
||||||
|
|
||||||
wprintw(win1, "\n");
|
wprintw(bwin1, "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -671,22 +915,22 @@ void* browseloop(Parameters* p)
|
||||||
{
|
{
|
||||||
char spacer[4];
|
char spacer[4];
|
||||||
sprintf(spacer, "\n");
|
sprintf(spacer, "\n");
|
||||||
waddstr(win1, spacer);
|
waddstr(bwin1, spacer);
|
||||||
|
|
||||||
char selectind[4];
|
char selectind[4];
|
||||||
|
|
||||||
|
|
||||||
char clastlap[16];
|
char clastlap[16];
|
||||||
sprintf(clastlap, " lap name ");
|
sprintf(clastlap, " lap name ");
|
||||||
waddstr(win1, clastlap);
|
waddstr(bwin1, clastlap);
|
||||||
|
|
||||||
wprintw(win1, " ");
|
wprintw(bwin1, " ");
|
||||||
|
|
||||||
char cbestlap[14];
|
char cbestlap[14];
|
||||||
sprintf(cbestlap, " tyre ");
|
sprintf(cbestlap, " tyre ");
|
||||||
waddstr(win1, cbestlap);
|
waddstr(bwin1, cbestlap);
|
||||||
|
|
||||||
wprintw(win1, "\n");
|
wprintw(bwin1, "\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -694,63 +938,63 @@ void* browseloop(Parameters* p)
|
||||||
|
|
||||||
char spacer[4];
|
char spacer[4];
|
||||||
sprintf(spacer, "\n");
|
sprintf(spacer, "\n");
|
||||||
waddstr(win1, spacer);
|
waddstr(bwin1, spacer);
|
||||||
|
|
||||||
char selectind[4];
|
char selectind[4];
|
||||||
|
|
||||||
if ( i == selection )
|
if ( i == selection )
|
||||||
{
|
{
|
||||||
sprintf(selectind, "_*_");
|
sprintf(selectind, "_*_");
|
||||||
waddstr(win1, selectind);
|
waddstr(bwin1, selectind);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(selectind, "___");
|
sprintf(selectind, "___");
|
||||||
waddstr(win1, selectind);
|
waddstr(bwin1, selectind);
|
||||||
}
|
}
|
||||||
|
|
||||||
char selectind1[4];
|
char selectind1[4];
|
||||||
if ( i == selection1 )
|
if ( lapsdb.rows[i-1].lap_id == selection1 )
|
||||||
{
|
{
|
||||||
sprintf(selectind1, "_1_");
|
sprintf(selectind1, "_1_");
|
||||||
waddstr(win1, selectind1);
|
waddstr(bwin1, selectind1);
|
||||||
}
|
}
|
||||||
else if ( i == selection2 )
|
else if ( lapsdb.rows[i-1].lap_id == selection2 )
|
||||||
{
|
{
|
||||||
sprintf(selectind1, "_2_");
|
sprintf(selectind1, "_2_");
|
||||||
waddstr(win1, selectind1);
|
waddstr(bwin1, selectind1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(selectind1, "___");
|
sprintf(selectind1, "___");
|
||||||
waddstr(win1, selectind1);
|
waddstr(bwin1, selectind1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int maxstrlen = 20;
|
int maxstrlen = 20;
|
||||||
wprintw(win1, " %i ", lapsdb.rows[i-1].lap_id);
|
wprintw(bwin1, " %i ", lapsdb.rows[i-1].lap_id);
|
||||||
|
|
||||||
char clastlap[14];
|
char clastlap[14];
|
||||||
sprintf(clastlap, "lap name");
|
sprintf(clastlap, "lap name");
|
||||||
waddstr(win1, clastlap);
|
waddstr(bwin1, clastlap);
|
||||||
|
|
||||||
wprintw(win1, " ");
|
wprintw(bwin1, " ");
|
||||||
|
|
||||||
char cbestlap[14];
|
char cbestlap[14];
|
||||||
sprintf(cbestlap, "laps %i", lapsdb.rows[i-1].max_speed);
|
sprintf(cbestlap, "laps %i", lapsdb.rows[i-1].max_speed);
|
||||||
waddstr(win1, cbestlap);
|
waddstr(bwin1, cbestlap);
|
||||||
|
|
||||||
wprintw(win1, " ");
|
wprintw(bwin1, " ");
|
||||||
char gripstr[14];
|
char gripstr[14];
|
||||||
sprintf(gripstr, "%s", lapsdb.rows[i-1].tyre);
|
sprintf(gripstr, "%s", lapsdb.rows[i-1].tyre);
|
||||||
waddstr(win1, gripstr);
|
waddstr(bwin1, gripstr);
|
||||||
|
|
||||||
wprintw(win1, " ");
|
wprintw(bwin1, " ");
|
||||||
char finstr[30];
|
char finstr[29];
|
||||||
sprintf(finstr, " %s ", lapsdb.rows[i-1].finished_at);
|
sprintf(finstr, " %s ", lapsdb.rows[i-1].finished_at);
|
||||||
waddstr(win1, finstr);
|
waddstr(bwin1, finstr);
|
||||||
|
|
||||||
|
|
||||||
wprintw(win1, "\n");
|
wprintw(bwin1, "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -758,12 +1002,12 @@ void* browseloop(Parameters* p)
|
||||||
}
|
}
|
||||||
action = 0;
|
action = 0;
|
||||||
}
|
}
|
||||||
box(win1, 0, 0);
|
box(bwin1, 0, 0);
|
||||||
//box(win2, 0, 0);
|
//box(win2, 0, 0);
|
||||||
//box(win3, 0, 0);
|
//box(win3, 0, 0);
|
||||||
//box(win4, 0, 0);
|
//box(win4, 0, 0);
|
||||||
|
|
||||||
wrefresh(win1);
|
wrefresh(bwin1);
|
||||||
//wrefresh(win2);
|
//wrefresh(win2);
|
||||||
//wrefresh(win3);
|
//wrefresh(win3);
|
||||||
//wrefresh(win4);
|
//wrefresh(win4);
|
||||||
|
|
@ -810,6 +1054,29 @@ void* browseloop(Parameters* p)
|
||||||
selection = 1;
|
selection = 1;
|
||||||
lastselection = 1;
|
lastselection = 1;
|
||||||
}
|
}
|
||||||
|
if (ch == 'g')
|
||||||
|
{
|
||||||
|
selection1 = 363;
|
||||||
|
selection2 = 362;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
action = 4;
|
||||||
|
}
|
||||||
if (ch == 'B')
|
if (ch == 'B')
|
||||||
{
|
{
|
||||||
selection++;
|
selection++;
|
||||||
|
|
@ -828,12 +1095,12 @@ void* browseloop(Parameters* p)
|
||||||
}
|
}
|
||||||
if (ch == '1')
|
if (ch == '1')
|
||||||
{
|
{
|
||||||
selection1 = selection;
|
selection1 = lapsdb.rows[selection-1].lap_id;
|
||||||
action = 1;
|
action = 1;
|
||||||
}
|
}
|
||||||
if (ch == '2')
|
if (ch == '2')
|
||||||
{
|
{
|
||||||
selection2 = selection;
|
selection2 = lapsdb.rows[selection-1].lap_id;
|
||||||
action = 1;
|
action = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -841,20 +1108,20 @@ void* browseloop(Parameters* p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
wrefresh(win4);
|
wrefresh(bwin4);
|
||||||
delwin(win4);
|
delwin(bwin4);
|
||||||
endwin();
|
endwin();
|
||||||
|
|
||||||
wrefresh(win3);
|
wrefresh(bwin3);
|
||||||
delwin(win3);
|
delwin(bwin3);
|
||||||
endwin();
|
endwin();
|
||||||
|
|
||||||
wrefresh(win2);
|
wrefresh(bwin2);
|
||||||
delwin(win2);
|
delwin(bwin2);
|
||||||
endwin();
|
endwin();
|
||||||
|
|
||||||
wrefresh(win1);
|
wrefresh(bwin1);
|
||||||
delwin(win1);
|
delwin(bwin1);
|
||||||
endwin();
|
endwin();
|
||||||
|
|
||||||
h_close_db(conn);
|
h_close_db(conn);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#include "../helper/parameters.h"
|
#include "../helper/parameters.h"
|
||||||
#include "../helper/confighelper.h"
|
#include "../helper/confighelper.h"
|
||||||
|
|
||||||
int browseloop(Parameters* p);
|
int browseloop(Parameters* p, char* datadir);
|
||||||
|
|
|
||||||
|
|
@ -308,7 +308,7 @@ void* looper(void* thargs)
|
||||||
|
|
||||||
int go = true;
|
int go = true;
|
||||||
char lastsimstatus = false;
|
char lastsimstatus = false;
|
||||||
while (go == true)
|
while (go == true && simdata->simstatus > 1)
|
||||||
{
|
{
|
||||||
simdatamap(simdata, simmap, p->sim);
|
simdatamap(simdata, simmap, p->sim);
|
||||||
|
|
||||||
|
|
@ -907,7 +907,7 @@ int closestint(struct _h_connection* conn, int stintid, int stintlaps, int valid
|
||||||
return res1;
|
return res1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int closelap(struct _h_connection* conn, int lapid, int sector1, int sector2, int sector3, int cuts, int crashes, int maxspeed, int avgspeed,
|
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)
|
double fbraketemp, double rbraketemp, double ftyrewear, double rtyrewear, double ftyretemp, double rtyretemp, double ftyrepress, double rtyrepress)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -932,6 +932,20 @@ int closelap(struct _h_connection* conn, int lapid, int sector1, int sector2, in
|
||||||
return res1;
|
return res1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int addstintlap(struct _h_connection* conn, int stintid)
|
int addstintlap(struct _h_connection* conn, int stintid)
|
||||||
{
|
{
|
||||||
|
|
@ -1162,6 +1176,20 @@ void print_bytes(void *ptr, int size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int updatetelemetrydata(struct _h_connection* conn, int tracksamples, int telemid, int lapid,
|
||||||
|
int* speeddata, int* rpmdata, int* geardata,
|
||||||
|
double* steerdata, double* acceldata, double* brakedata)
|
||||||
|
{
|
||||||
|
int b = 0;
|
||||||
|
b = updatetelemetry(conn, telemid, tracksamples*sizeof(double), "steer", steerdata);
|
||||||
|
b = updatetelemetry(conn, telemid, tracksamples*sizeof(double), "accel", acceldata);
|
||||||
|
b = updatetelemetry(conn, telemid, tracksamples*sizeof(double), "brake", brakedata);
|
||||||
|
b = updatetelemetry(conn, telemid, tracksamples*sizeof(int), "rpms", rpmdata);
|
||||||
|
b = updatetelemetry(conn, telemid, tracksamples*sizeof(int), "gear", geardata);
|
||||||
|
b = updatetelemetry(conn, telemid, tracksamples*sizeof(int), "speed", speeddata);
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
void* simviewmysql(void* thargs)
|
void* simviewmysql(void* thargs)
|
||||||
{
|
{
|
||||||
|
|
@ -1171,7 +1199,7 @@ void* simviewmysql(void* thargs)
|
||||||
|
|
||||||
struct _h_result result;
|
struct _h_result result;
|
||||||
struct _h_connection * conn;
|
struct _h_connection * conn;
|
||||||
char* connectionstring = "host=zorak.brak dbname=gilles user=test password=thisisatest";
|
char* connectionstring = "host=zorak.brak dbname=gilles user=gilles password=MyRandomPasswordIsGood";
|
||||||
conn = h_connect_pgsql(connectionstring);
|
conn = h_connect_pgsql(connectionstring);
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1214,7 +1242,7 @@ void* simviewmysql(void* thargs)
|
||||||
int track_samples = simdata->trackspline / TRACK_SAMPLE_RATE;
|
int track_samples = simdata->trackspline / TRACK_SAMPLE_RATE;
|
||||||
slogt("track samples %i", track_samples);
|
slogt("track samples %i", track_samples);
|
||||||
|
|
||||||
int stintlaps = 0;
|
int stintlaps = 1;
|
||||||
int validstintlaps = 0;
|
int validstintlaps = 0;
|
||||||
bool validind = true;
|
bool validind = true;
|
||||||
|
|
||||||
|
|
@ -1225,18 +1253,6 @@ void* simviewmysql(void* thargs)
|
||||||
double* acceldata = malloc(track_samples * sizeof(simdata->gas));
|
double* acceldata = malloc(track_samples * sizeof(simdata->gas));
|
||||||
double* brakedata = malloc(track_samples * sizeof(simdata->brake));
|
double* brakedata = malloc(track_samples * sizeof(simdata->brake));
|
||||||
|
|
||||||
//double* tyretemp0 = malloc(track_samples * sizeof(simdata->tyretemp[0]));
|
|
||||||
//double* tyretemp1 = malloc(track_samples * sizeof(simdata->tyretemp[0]));
|
|
||||||
//double* tyretemp2 = malloc(track_samples * sizeof(simdata->tyretemp[0]));
|
|
||||||
//double* tyretemp3 = malloc(track_samples * sizeof(simdata->tyretemp[0]));
|
|
||||||
//double* tyrepressure0 = malloc(track_samples * sizeof(simdata->tyrepressure[0]));
|
|
||||||
//double* tyrepressure1 = malloc(track_samples * sizeof(simdata->tyrepressure[0]));
|
|
||||||
//double* tyrepressure2 = malloc(track_samples * sizeof(simdata->tyrepressure[0]));
|
|
||||||
//double* tyrepressure3 = malloc(track_samples * sizeof(simdata->tyrepressure[0]));
|
|
||||||
//double* braketemp0 = malloc(track_samples * sizeof(simdata->braketemp[0]));
|
|
||||||
//double* braketemp1 = malloc(track_samples * sizeof(simdata->braketemp[0]));
|
|
||||||
//double* braketemp2 = malloc(track_samples * sizeof(simdata->braketemp[0]));
|
|
||||||
//double* braketemp3 = malloc(track_samples * sizeof(simdata->braketemp[0]));
|
|
||||||
int sectortimes[4];
|
int sectortimes[4];
|
||||||
|
|
||||||
if (p->program_state < 0)
|
if (p->program_state < 0)
|
||||||
|
|
@ -1259,19 +1275,6 @@ void* simviewmysql(void* thargs)
|
||||||
geardata[pos] = simdata->gear;
|
geardata[pos] = simdata->gear;
|
||||||
|
|
||||||
|
|
||||||
//tyretemp0[pos] = simdata->tyretemp[0];
|
|
||||||
//tyretemp1[pos] = simdata->tyretemp[1];
|
|
||||||
//tyretemp2[pos] = simdata->tyretemp[2];
|
|
||||||
//tyretemp3[pos] = simdata->tyretemp[3];
|
|
||||||
//tyrepressure0[pos] = simdata->tyrepressure[0];
|
|
||||||
//tyrepressure1[pos] = simdata->tyrepressure[1];
|
|
||||||
//tyrepressure2[pos] = simdata->tyrepressure[2];
|
|
||||||
//tyrepressure3[pos] = simdata->tyrepressure[3];
|
|
||||||
//braketemp0[pos] = simdata->braketemp[0];
|
|
||||||
//braketemp1[pos] = simdata->braketemp[1];
|
|
||||||
//braketemp2[pos] = simdata->braketemp[2];
|
|
||||||
//braketemp3[pos] = simdata->braketemp[3];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sessionstatus = simdata->session;
|
sessionstatus = simdata->session;
|
||||||
|
|
@ -1292,7 +1295,7 @@ void* simviewmysql(void* thargs)
|
||||||
}
|
}
|
||||||
|
|
||||||
//pitstatus = 1;
|
//pitstatus = 1;
|
||||||
stintlaps = 0;
|
stintlaps = 1;
|
||||||
validstintlaps = 0;
|
validstintlaps = 0;
|
||||||
}
|
}
|
||||||
pitstatus = simdata->inpit;
|
pitstatus = simdata->inpit;
|
||||||
|
|
@ -1306,7 +1309,7 @@ void* simviewmysql(void* thargs)
|
||||||
|
|
||||||
closestint(conn, stintid, stintlaps, validstintlaps);
|
closestint(conn, stintid, stintlaps, validstintlaps);
|
||||||
stintid = addstint(conn, sessionid, driverid, carid);
|
stintid = addstint(conn, sessionid, driverid, carid);
|
||||||
stintlaps = 0;
|
stintlaps = 1;
|
||||||
validstintlaps = 0;
|
validstintlaps = 0;
|
||||||
}
|
}
|
||||||
if (lap != lastlap)
|
if (lap != lastlap)
|
||||||
|
|
@ -1318,26 +1321,11 @@ void* simviewmysql(void* thargs)
|
||||||
validstintlaps++;
|
validstintlaps++;
|
||||||
}
|
}
|
||||||
|
|
||||||
double fbraketemp = (simdata->braketemp[0] + simdata->braketemp[1])/2;
|
closelap(conn, simdata, stintlapid, sectortimes[1], sectortimes[2], simdata->lastsectorinms, 0, 0, 0, 0);
|
||||||
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;
|
|
||||||
|
|
||||||
closelap(conn, stintlapid, sectortimes[1], sectortimes[2], simdata->lastsectorinms, 0, 0, 0, 0, fbraketemp, rbraketemp, ftyrewear, rtyrewear, ftyretemp, rtyretemp, ftyrepress, rtyrepress);
|
|
||||||
|
|
||||||
stintlapid = addstintlap(conn, stintid);
|
stintlapid = addstintlap(conn, stintid);
|
||||||
int telemid = addtelemetry(conn, track_samples, stintlapid);
|
int telemid = addtelemetry(conn, track_samples, stintlapid);
|
||||||
int b = updatetelemetry(conn, telemid, track_samples*sizeof(double), "steer", steerdata);
|
int b = updatetelemetrydata(conn, track_samples, telemid, stintlapid, speeddata, geardata, rpmdata, steerdata, acceldata, brakedata);
|
||||||
b = updatetelemetry(conn, telemid, track_samples*sizeof(double), "accel", acceldata);
|
|
||||||
b = updatetelemetry(conn, telemid, track_samples*sizeof(double), "brake", brakedata);
|
|
||||||
b = updatetelemetry(conn, telemid, track_samples*sizeof(int), "rpms", rpmdata);
|
|
||||||
b = updatetelemetry(conn, telemid, track_samples*sizeof(int), "gear", geardata);
|
|
||||||
b = updatetelemetry(conn, telemid, track_samples*sizeof(int), "speed", speeddata);
|
|
||||||
|
|
||||||
tick = 0;
|
tick = 0;
|
||||||
// assume lap is valid until it isn't
|
// assume lap is valid until it isn't
|
||||||
validind = true;
|
validind = true;
|
||||||
|
|
@ -1354,6 +1342,9 @@ void* simviewmysql(void* thargs)
|
||||||
|
|
||||||
if (p->program_state < 0)
|
if (p->program_state < 0)
|
||||||
{
|
{
|
||||||
|
int telemid = addtelemetry(conn, track_samples, stintlapid);
|
||||||
|
int b = updatetelemetrydata(conn, track_samples, telemid, stintlapid, speeddata, geardata, rpmdata, steerdata, acceldata, brakedata);
|
||||||
|
closelap(conn, simdata, stintlapid, sectortimes[1], sectortimes[2], simdata->lastsectorinms, 0, 0, 0, 0);
|
||||||
closestint(conn, stintid, stintlaps, validstintlaps);
|
closestint(conn, stintid, stintlaps, validstintlaps);
|
||||||
closesession(conn, sessionid);
|
closesession(conn, sessionid);
|
||||||
go = false;
|
go = false;
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ typedef struct DBField DBField;
|
||||||
typedef struct SessionFieldsData SessionFieldsData;
|
typedef struct SessionFieldsData SessionFieldsData;
|
||||||
typedef struct SessionFields SessionFields;
|
typedef struct SessionFields SessionFields;
|
||||||
typedef struct Session Session;
|
typedef struct Session Session;
|
||||||
typedef unsigned char PDBTimeStamp[26];
|
typedef unsigned char PDBTimeStamp[27];
|
||||||
|
|
||||||
struct DBField
|
struct DBField
|
||||||
{
|
{
|
||||||
|
|
@ -85,6 +85,7 @@ typedef struct LapRowData
|
||||||
int crashes;
|
int crashes;
|
||||||
int max_speed;
|
int max_speed;
|
||||||
int avg_speed;
|
int avg_speed;
|
||||||
|
PDBTimeStamp finished_at;
|
||||||
double f_tyre_temp;
|
double f_tyre_temp;
|
||||||
double r_tyre_temp;
|
double r_tyre_temp;
|
||||||
double f_tyre_wear;
|
double f_tyre_wear;
|
||||||
|
|
@ -93,7 +94,6 @@ typedef struct LapRowData
|
||||||
double r_tyre_press;
|
double r_tyre_press;
|
||||||
double f_brake_temp;
|
double f_brake_temp;
|
||||||
double r_brake_temp;
|
double r_brake_temp;
|
||||||
PDBTimeStamp finished_at;
|
|
||||||
}
|
}
|
||||||
LapRowData;
|
LapRowData;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,45 +9,13 @@
|
||||||
#include <basedir_fs.h>
|
#include <basedir_fs.h>
|
||||||
|
|
||||||
#include "gameloop/gameloop.h"
|
#include "gameloop/gameloop.h"
|
||||||
|
#include "gameloop/browseloop.h"
|
||||||
#include "helper/parameters.h"
|
#include "helper/parameters.h"
|
||||||
#include "helper/dirhelper.h"
|
#include "helper/dirhelper.h"
|
||||||
#include "helper/confighelper.h"
|
#include "helper/confighelper.h"
|
||||||
#include "slog/slog.h"
|
#include "slog/slog.h"
|
||||||
|
|
||||||
int create_dir(char* dir)
|
#define PROGRAM_NAME "gilles"
|
||||||
{
|
|
||||||
struct stat st = {0};
|
|
||||||
if (stat(dir, &st) == -1)
|
|
||||||
{
|
|
||||||
mkdir(dir, 0700);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char* create_user_dir(const char* dirtype)
|
|
||||||
{
|
|
||||||
char* config_dir_str = ( char* ) malloc(1 + strlen(dirtype) + strlen("/gilles"));
|
|
||||||
strcpy(config_dir_str, dirtype);
|
|
||||||
strcat(config_dir_str, "/gilles");
|
|
||||||
|
|
||||||
create_dir(config_dir_str);
|
|
||||||
free(config_dir_str);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* get_config_file(const char* confpath, xdgHandle* xdg)
|
|
||||||
{
|
|
||||||
if(strcmp(confpath, "") != 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "no config path specified");
|
|
||||||
return strdup(confpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* relpath = "gilles/gilles.config";
|
|
||||||
const char* confpath1 = xdgConfigFind(relpath, xdg);
|
|
||||||
slogi("path is %s", confpath1);
|
|
||||||
return strdup(confpath1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
|
@ -63,18 +31,15 @@ int main(int argc, char** argv)
|
||||||
p->program_state = 1;
|
p->program_state = 1;
|
||||||
|
|
||||||
char* home_dir_str = gethome();
|
char* home_dir_str = gethome();
|
||||||
create_user_dir("/.config/");
|
|
||||||
create_user_dir("/.cache/");
|
char* cachedir = create_user_dir(home_dir_str, ".cache", PROGRAM_NAME);
|
||||||
char* cache_dir_str = ( char* ) malloc(1 + strlen(home_dir_str) + strlen("/.cache/gilles/"));
|
|
||||||
strcpy(cache_dir_str, home_dir_str);
|
|
||||||
strcat(cache_dir_str, "/.cache/gilles/");
|
|
||||||
|
|
||||||
slog_config_t slgCfg;
|
slog_config_t slgCfg;
|
||||||
slog_config_get(&slgCfg);
|
slog_config_get(&slgCfg);
|
||||||
slgCfg.eColorFormat = SLOG_COLORING_TAG;
|
slgCfg.eColorFormat = SLOG_COLORING_TAG;
|
||||||
slgCfg.eDateControl = SLOG_TIME_ONLY;
|
slgCfg.eDateControl = SLOG_TIME_ONLY;
|
||||||
strcpy(slgCfg.sFileName, "gilles.log");
|
strcpy(slgCfg.sFileName, "gilles.log");
|
||||||
strcpy(slgCfg.sFilePath, cache_dir_str);
|
strcpy(slgCfg.sFilePath, cachedir);
|
||||||
slgCfg.nTraceTid = 0;
|
slgCfg.nTraceTid = 0;
|
||||||
slgCfg.nToScreen = 1;
|
slgCfg.nToScreen = 1;
|
||||||
slgCfg.nUseHeap = 0;
|
slgCfg.nUseHeap = 0;
|
||||||
|
|
@ -91,25 +56,37 @@ int main(int argc, char** argv)
|
||||||
slog_disable(SLOG_DEBUG);
|
slog_disable(SLOG_DEBUG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* configdir = create_user_dir(home_dir_str, ".config", PROGRAM_NAME);
|
||||||
|
char* datadir = create_user_dir(home_dir_str, ".local/share", PROGRAM_NAME);
|
||||||
|
|
||||||
|
|
||||||
xdgHandle xdg;
|
xdgHandle xdg;
|
||||||
if(!xdgInitHandle(&xdg))
|
if(!xdgInitHandle(&xdg))
|
||||||
{
|
{
|
||||||
slogf("Function xdgInitHandle() failed, is $HOME unset?");
|
slogf("Function xdgInitHandle() failed, is $HOME unset?");
|
||||||
}
|
}
|
||||||
char* config_file_str = get_config_file("/home/paul/.config/gilles/gilles.config", &xdg);
|
|
||||||
|
|
||||||
loadconfig(config_file_str, p);
|
char* config_file_str = get_config_file(p->config_path, &xdg);
|
||||||
//slogi("mysql user is %s", p->mysql_user);
|
int err = loadconfig(config_file_str, p);
|
||||||
|
|
||||||
free(config_file_str);
|
free(config_file_str);
|
||||||
free(cache_dir_str);
|
|
||||||
xdgWipeHandle(&xdg);
|
xdgWipeHandle(&xdg);
|
||||||
|
|
||||||
|
if (err == E_NO_ERROR)
|
||||||
|
{
|
||||||
|
if (p->program_action == A_PLAY)
|
||||||
|
{
|
||||||
mainloop(p);
|
mainloop(p);
|
||||||
//free(config_file_str);
|
}
|
||||||
//free(cache_dir_str);
|
else
|
||||||
//free(simmap);
|
{
|
||||||
//free(simdata);
|
browseloop(p, datadir);
|
||||||
|
}
|
||||||
|
if (p->err != E_NO_ERROR)
|
||||||
|
{
|
||||||
|
sloge("Error occured during execution.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
configcleanup:
|
configcleanup:
|
||||||
|
|
@ -119,7 +96,11 @@ cleanup_final:
|
||||||
freeparams(p);
|
freeparams(p);
|
||||||
free(gs);
|
free(gs);
|
||||||
free(p);
|
free(p);
|
||||||
|
|
||||||
|
free(configdir);
|
||||||
|
free(datadir);
|
||||||
|
free(cachedir);
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
#include "confighelper.h"
|
#include "confighelper.h"
|
||||||
|
|
||||||
#include "../slog/slog.h"
|
#include "../slog/slog.h"
|
||||||
|
#include "parameters.h"
|
||||||
|
|
||||||
//int strtogame(const char* game, GillesSettings* gs)
|
//int strtogame(const char* game, GillesSettings* gs)
|
||||||
//{
|
//{
|
||||||
|
|
@ -30,21 +31,34 @@
|
||||||
// return GILLES_ERROR_NONE;
|
// return GILLES_ERROR_NONE;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
int loadmysql(config_t* cfg, Parameters* p)
|
int loaddbconfig(config_t* cfg, Parameters* p)
|
||||||
{
|
{
|
||||||
config_setting_t* config_mysql_array = NULL;
|
config_setting_t* config_db_array = NULL;
|
||||||
config_mysql_array = config_lookup(cfg, "mysql");
|
config_db_array = config_lookup(cfg, "db");
|
||||||
|
|
||||||
config_setting_t* config_mysql = NULL;
|
config_setting_t* config_db = NULL;
|
||||||
config_mysql = config_setting_get_elem(config_mysql_array, 0);
|
config_db = config_setting_get_elem(config_db_array, 0);
|
||||||
|
|
||||||
if (config_mysql == NULL) {
|
if (config_db == NULL) {
|
||||||
slogi("found no mysql settings");
|
slogi("found no db settings");
|
||||||
|
return E_BAD_CONFIG;
|
||||||
}
|
}
|
||||||
const char* temp;
|
const char* temp;
|
||||||
config_setting_lookup_string(config_mysql, "user", &temp);
|
config_setting_lookup_string(config_db, "user", &temp);
|
||||||
p->mysql_user = strdup(temp);
|
p->db_user = strdup(temp);
|
||||||
return 0;
|
config_setting_lookup_string(config_db, "password", &temp);
|
||||||
|
p->db_pass = strdup(temp);
|
||||||
|
config_setting_lookup_string(config_db, "server", &temp);
|
||||||
|
p->db_serv = strdup(temp);
|
||||||
|
config_setting_lookup_string(config_db, "database", &temp);
|
||||||
|
p->db_dbnm = strdup(temp);
|
||||||
|
|
||||||
|
size_t strsize = strlen(p->db_user) + strlen(p->db_pass) + strlen(p->db_serv) + strlen(p->db_dbnm) + 29 + 1;
|
||||||
|
p->db_conn = malloc(strsize);
|
||||||
|
|
||||||
|
snprintf(p->db_conn, strsize, "host=%s dbname=%s user=%s password=%s", p->db_serv, p->db_dbnm, p->db_user, p->db_pass);
|
||||||
|
|
||||||
|
return E_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int loadconfig(const char* config_file_str, Parameters* p)
|
int loadconfig(const char* config_file_str, Parameters* p)
|
||||||
|
|
@ -58,9 +72,32 @@ int loadconfig(const char* config_file_str, Parameters* p)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
slogi("Parsing config file");
|
slogi("Parsing config file");
|
||||||
if (p->mysql == true)
|
|
||||||
|
if (p->program_action == A_BROWSE)
|
||||||
{
|
{
|
||||||
loadmysql(&cfg, p);
|
config_setting_t* config_graph_array = NULL;
|
||||||
|
config_graph_array = config_lookup(&cfg, "graph");
|
||||||
|
|
||||||
|
config_setting_t* config_graph = NULL;
|
||||||
|
config_graph = config_setting_get_elem(config_graph_array, 0);
|
||||||
|
|
||||||
|
if (config_graph == NULL) {
|
||||||
|
slogi("found no graph settings");
|
||||||
|
return E_BAD_CONFIG;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p->mysql == true || p->program_action == A_BROWSE)
|
||||||
|
{
|
||||||
|
int err = loaddbconfig(&cfg, p);
|
||||||
|
if (err != E_NO_ERROR)
|
||||||
|
{
|
||||||
|
return err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,15 +18,6 @@ typedef enum
|
||||||
}
|
}
|
||||||
SimulatorUpdate;
|
SimulatorUpdate;
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
GILLES_ERROR_NONE = 0,
|
|
||||||
GILLES_ERROR_UNKNOWN = 1,
|
|
||||||
GILLES_ERROR_INVALID_SIM = 2,
|
|
||||||
GILLES_ERROR_NODATA = 4,
|
|
||||||
}
|
|
||||||
GillesError;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
ProgramAction program_action;
|
ProgramAction program_action;
|
||||||
|
|
|
||||||
|
|
@ -3,22 +3,72 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
#include "../slog/slog.h"
|
||||||
#if defined(OS_WIN)
|
|
||||||
#include <windows.h>
|
|
||||||
#else
|
|
||||||
#include <dirent.h> // for *Nix directory access
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
#define CONFIG_FILE "gilles/gilles.config"
|
||||||
|
|
||||||
|
void create_dir(char* dir)
|
||||||
|
{
|
||||||
|
struct stat st = {0};
|
||||||
|
if (stat(dir, &st) == -1)
|
||||||
|
{
|
||||||
|
mkdir(dir, 0700);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char* create_user_dir(char* home_dir_str, const char* dirtype, const char* programname)
|
||||||
|
{
|
||||||
|
// +3 for slashes
|
||||||
|
size_t ss = (4 + strlen(home_dir_str) + strlen(dirtype) + strlen(programname));
|
||||||
|
char* config_dir_str = malloc(ss);
|
||||||
|
|
||||||
|
snprintf (config_dir_str, ss, "%s/%s/%s/", home_dir_str, dirtype, programname);
|
||||||
|
|
||||||
|
slogt("creating dir for %s if necessary", config_dir_str);
|
||||||
|
create_dir(config_dir_str);
|
||||||
|
return config_dir_str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char* get_config_file(const char* confpath, xdgHandle* xdg)
|
||||||
|
{
|
||||||
|
if ((confpath != NULL) && (strcmp(confpath, "") != 0))
|
||||||
|
{
|
||||||
|
slogw("Using custom config path %s", confpath);
|
||||||
|
return strdup(confpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* relpath = CONFIG_FILE;
|
||||||
|
char* confpath1 = xdgConfigFind(relpath, xdg);
|
||||||
|
slogi("config path is %s", confpath1);
|
||||||
|
return confpath1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char* get_dir_with_default(const char* dirpath, char* defaultpath)
|
||||||
|
{
|
||||||
|
if ((dirpath != NULL) && (strcmp(dirpath, "") != 0))
|
||||||
|
{
|
||||||
|
slogw("Using custom config path %s", dirpath);
|
||||||
|
return strdup(dirpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultpath;
|
||||||
|
}
|
||||||
|
|
||||||
char* gethome()
|
char* gethome()
|
||||||
{
|
{
|
||||||
|
|
@ -207,47 +257,3 @@ bool does_directory_exist(char* path, char* dirname)
|
||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool file_exists(const char* file)
|
|
||||||
{
|
|
||||||
if (file == NULL) { return false; }
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
#if defined(WIN_API)
|
|
||||||
// if you want the WinAPI, versus CRT
|
|
||||||
if (strnlen(file, MAX_PATH+1) > MAX_PATH) {
|
|
||||||
// ... throw error here or ...
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
DWORD res = GetFileAttributesA(file);
|
|
||||||
return (res != INVALID_FILE_ATTRIBUTES &&
|
|
||||||
!(res & FILE_ATTRIBUTE_DIRECTORY));
|
|
||||||
#else
|
|
||||||
// Use Win CRT
|
|
||||||
struct stat fi;
|
|
||||||
if (_stat(file, &fi) == 0) {
|
|
||||||
#if defined(S_ISSOCK)
|
|
||||||
// sockets come back as a 'file' on some systems
|
|
||||||
// so make sure it's not a socket or directory
|
|
||||||
// (in other words, make sure it's an actual file)
|
|
||||||
return !(S_ISDIR(fi.st_mode)) &&
|
|
||||||
!(S_ISSOCK(fi.st_mode));
|
|
||||||
#else
|
|
||||||
return !(S_ISDIR(fi.st_mode));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
struct stat fi;
|
|
||||||
if (stat(file, &fi) == 0) {
|
|
||||||
#if defined(S_ISSOCK)
|
|
||||||
return !(S_ISDIR(fi.st_mode)) &&
|
|
||||||
!(S_ISSOCK(fi.st_mode));
|
|
||||||
#else
|
|
||||||
return !(S_ISDIR(fi.st_mode));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,16 @@
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include <basedir_fs.h>
|
||||||
|
|
||||||
|
void create_dir(char* dir);
|
||||||
|
char* create_user_dir(char* home_dir_str, const char* dirtype, const char* programpath);
|
||||||
char* gethome();
|
char* gethome();
|
||||||
char* str2md5(const char* str, int length);
|
char* str2md5(const char* str, int length);
|
||||||
bool does_directory_exist(char* path, char* dirname);
|
bool does_directory_exist(char* path, char* dirname);
|
||||||
void restrict_folders_to_cache(char* path, int cachesize);
|
void restrict_folders_to_cache(char* path, int cachesize);
|
||||||
void delete_dir(char* path);
|
void delete_dir(char* path);
|
||||||
bool file_exists(const char* file);
|
char* get_config_file(const char* confpath, xdgHandle* xdg);
|
||||||
|
char* get_dir_with_default(const char* dirpath, char* defaultpath);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -14,12 +14,20 @@ int freeparams(Parameters* p)
|
||||||
{
|
{
|
||||||
free(p->sim_string);
|
free(p->sim_string);
|
||||||
}
|
}
|
||||||
if (p->mysql == true)
|
if (p->mysql == true || p->program_action == A_BROWSE)
|
||||||
{
|
{
|
||||||
if(p->mysql_user != NULL)
|
if(p->db_user != NULL)
|
||||||
{
|
{
|
||||||
free(p->mysql_user);
|
free(p->db_user);
|
||||||
}
|
}
|
||||||
|
if(p->db_conn != NULL)
|
||||||
|
{
|
||||||
|
free(p->db_conn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p->config_path != NULL)
|
||||||
|
{
|
||||||
|
free(p->config_path);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -45,6 +53,7 @@ ConfigError getParameters(int argc, char** argv, Parameters* p)
|
||||||
|
|
||||||
struct arg_rex* cmd1 = arg_rex1(NULL, NULL, "play", NULL, REG_ICASE, NULL);
|
struct arg_rex* cmd1 = arg_rex1(NULL, NULL, "play", NULL, REG_ICASE, NULL);
|
||||||
struct arg_rex* cmd2 = arg_rex1(NULL, NULL, "browse", NULL, REG_ICASE, NULL);
|
struct arg_rex* cmd2 = arg_rex1(NULL, NULL, "browse", NULL, REG_ICASE, NULL);
|
||||||
|
struct arg_str* arg_cpath = arg_strn("f", "configpath", "<path of config>", 0, 1, NULL);
|
||||||
struct arg_str* arg_sim = arg_strn("s", "sim", "<gamename>", 0, 1, NULL);
|
struct arg_str* arg_sim = arg_strn("s", "sim", "<gamename>", 0, 1, NULL);
|
||||||
struct arg_lit* arg_cli = arg_lit0("c", "textui", "text only ui");
|
struct arg_lit* arg_cli = arg_lit0("c", "textui", "text only ui");
|
||||||
struct arg_lit* arg_mqtt = arg_lit0("Q", "mqtt", "send data to local mqtt server with connection settings speciifed in config");
|
struct arg_lit* arg_mqtt = arg_lit0("Q", "mqtt", "send data to local mqtt server with connection settings speciifed in config");
|
||||||
|
|
@ -93,9 +102,14 @@ ConfigError getParameters(int argc, char** argv, Parameters* p)
|
||||||
{
|
{
|
||||||
p->mysql = true;
|
p->mysql = true;
|
||||||
}
|
}
|
||||||
|
if (arg_cpath->sval[0] != NULL)
|
||||||
|
{
|
||||||
|
p->config_path = strdup(arg_cpath->sval[0]);
|
||||||
|
}
|
||||||
exitcode = E_SUCCESS_AND_DO;
|
exitcode = E_SUCCESS_AND_DO;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (nerrors1==0)
|
if (nerrors1==0)
|
||||||
{
|
{
|
||||||
p->program_action = A_BROWSE;
|
p->program_action = A_BROWSE;
|
||||||
|
|
@ -103,7 +117,7 @@ ConfigError getParameters(int argc, char** argv, Parameters* p)
|
||||||
p->verbosity_count = arg_verbosity1->count;
|
p->verbosity_count = arg_verbosity1->count;
|
||||||
exitcode = E_SUCCESS_AND_DO;
|
exitcode = E_SUCCESS_AND_DO;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// interpret some special cases before we go through trouble of reading the config file
|
// interpret some special cases before we go through trouble of reading the config file
|
||||||
if (help0->count > 0)
|
if (help0->count > 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -12,17 +12,21 @@ typedef struct
|
||||||
char* sim_string;
|
char* sim_string;
|
||||||
int program_action;
|
int program_action;
|
||||||
int program_state;
|
int program_state;
|
||||||
|
char* config_path;
|
||||||
|
char* gnuplot_file;
|
||||||
|
|
||||||
bool cli;
|
bool cli;
|
||||||
bool mqtt;
|
bool mqtt;
|
||||||
bool mysql;
|
bool mysql;
|
||||||
bool simon;
|
bool simon;
|
||||||
int verbosity_count;
|
int verbosity_count;
|
||||||
|
int err;
|
||||||
|
|
||||||
char* mysql_user;
|
char* db_user;
|
||||||
char* mysql_serv;
|
char* db_serv;
|
||||||
char* mysql_dbnm;
|
char* db_dbnm;
|
||||||
char* mysql_pass;
|
char* db_pass;
|
||||||
|
char* db_conn;
|
||||||
|
|
||||||
Simulator sim;
|
Simulator sim;
|
||||||
SimData* simdata;
|
SimData* simdata;
|
||||||
|
|
@ -33,7 +37,7 @@ Parameters;
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
A_PLAY = 0,
|
A_PLAY = 0,
|
||||||
A_BROWSE = 0
|
A_BROWSE = 1,
|
||||||
}
|
}
|
||||||
ProgramAction;
|
ProgramAction;
|
||||||
|
|
||||||
|
|
@ -45,6 +49,15 @@ typedef enum
|
||||||
}
|
}
|
||||||
ConfigError;
|
ConfigError;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
E_NO_ERROR = 0,
|
||||||
|
E_BAD_CONFIG = 1,
|
||||||
|
E_FAILED_DB_CONN = 2,
|
||||||
|
E_DB_QUERY_FAIL = 3,
|
||||||
|
}
|
||||||
|
GillesError;
|
||||||
|
|
||||||
ConfigError getParameters(int argc, char** argv, Parameters* p);
|
ConfigError getParameters(int argc, char** argv, Parameters* p);
|
||||||
int freeparams(Parameters* p);
|
int freeparams(Parameters* p);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue