Refactor diameter save file into libconfig to save a dependency.

This commit is contained in:
Paul Dino Jones 2024-06-11 16:42:29 -04:00
parent dd23468593
commit 8f4729c77a
3 changed files with 212 additions and 113 deletions

View File

@ -37,10 +37,10 @@ add_executable(monocoque src/monocoque/monocoque.c)
if(USE_PULSEAUDIO)
message("Using pulseaudio backend...")
add_compile_definitions(USE_PULSEAUDIO=true)
target_link_libraries(monocoque m ${LIBUSB_LIBRARY} hidapi-libusb pulse serialport xml2 argtable2 jansson config gameloop helper devices slog simulatorapi)
target_link_libraries(monocoque m ${LIBUSB_LIBRARY} hidapi-libusb pulse serialport xml2 argtable2 config gameloop helper devices slog simulatorapi)
else()
message("Using portaudio backend...")
target_link_libraries(monocoque m ${LIBUSB_LIBRARY} hidapi-libusb portaudio serialport xml2 argtable2 jansson config gameloop helper devices slog simulatorapi)
target_link_libraries(monocoque m ${LIBUSB_LIBRARY} hidapi-libusb portaudio serialport xml2 argtable2 config gameloop helper devices slog simulatorapi)
endif()
target_include_directories(monocoque PUBLIC config ${LIBUSB_INCLUDE_DIR} ${LIBXML_INCLUDE_DIR})

View File

@ -27,145 +27,243 @@ bool hasTyreDiameter(SimData* simdata)
return true;
}
void loadtyreconfig(SimData* simdata, char* configfile)
int loadtyreconfig(SimData* simdata, char* configfile)
{
json_t *root;
json_error_t error;
config_t cfg;
config_init(&cfg);
config_setting_t* config_cars = NULL;
root = json_load_file(configfile, 0, NULL);
if(!root)
if (!config_read_file(&cfg, configfile))
{
slogw("could not open config file for tyre diameters");
return;
slogw("Could not open diameters save file.");
config_destroy(&cfg);
return 1;
}
if(!json_is_object(root))
config_cars = config_lookup(&cfg, "cars");
int cars = config_setting_length(config_cars);
int i = 0;
while (i<cars)
{
slogw("Malformed content (1) in tyre diameters config");
json_decref(root);
return;
}
DeviceSettings settings;
json_t* cararray = json_object_get(root, "cars");
if(!json_is_array(cararray))
{
slogw("Malformed content (2) in tyre diameters config");
json_decref(root);
json_decref(cararray);
return;
}
for(int i = 0; i < json_array_size(cararray); i++)
{
json_t *data, *sha, *commit, *message;
const char *message_text;
data = json_array_get(cararray, i);
if(!json_is_object(data))
{
slogw("Malformed content (3) in tyre diameters config");
break;
}
json_t* jcar = json_object_get(data, "car");
if(!json_is_string(jcar))
{
slogw("Malformed content (4) in tyre diameters config");
json_decref(data);
json_decref(jcar);
break;
}
const char* car = json_string_value(jcar);
json_t* jtyre0 = json_object_get(data, "tyre0");
json_t* jtyre1 = json_object_get(data, "tyre1");
json_t* jtyre2 = json_object_get(data, "tyre2");
json_t* jtyre3 = json_object_get(data, "tyre3");
double diameter0 = json_real_value(jtyre0);
double diameter1 = json_real_value(jtyre1);
double diameter2 = json_real_value(jtyre2);
double diameter3 = json_real_value(jtyre3);
slogt("car is: %s", car);
slogt("diameter 0 is %f", diameter0);
slogt("diameter 1 is %f", diameter1);
slogt("diameter 2 is %f", diameter2);
slogt("diameter 3 is %f", diameter3);
json_decref(data);
json_decref(jcar);
json_decref(jtyre0);
json_decref(jtyre1);
json_decref(jtyre2);
json_decref(jtyre3);
config_setting_t* config_car = config_setting_get_elem(config_cars, i);
const char* car;
double tyre0;
double tyre1;
double tyre2;
double tyre3;
config_setting_lookup_string(config_car, "car", &car);
config_setting_lookup_float(config_car, "tyre0", &tyre0);
config_setting_lookup_float(config_car, "tyre1", &tyre1);
config_setting_lookup_float(config_car, "tyre2", &tyre2);
config_setting_lookup_float(config_car, "tyre3", &tyre3);
if(simdata->car != NULL)
{
if (strcicmp(car, simdata->car) == 0)
{
simdata->tyrediameter[0] = diameter0;
simdata->tyrediameter[1] = diameter1;
simdata->tyrediameter[2] = diameter2;
simdata->tyrediameter[3] = diameter3;
simdata->tyrediameter[0] = tyre0;
simdata->tyrediameter[1] = tyre1;
simdata->tyrediameter[2] = tyre2;
simdata->tyrediameter[3] = tyre3;
break;
}
}
i++;
}
json_decref(root);
json_decref(cararray);
config_destroy(&cfg);
return 0;
}
//void loadtyreconfig(SimData* simdata, char* configfile)
//{
// json_t *root;
// json_error_t error;
//
// root = json_load_file(configfile, 0, NULL);
//
// if(!root)
// {
// slogw("could not open config file for tyre diameters");
// return;
// }
//
// if(!json_is_object(root))
// {
// slogw("Malformed content (1) in tyre diameters config");
// json_decref(root);
// return;
// }
//
// json_t* cararray = json_object_get(root, "cars");
// if(!json_is_array(cararray))
// {
// slogw("Malformed content (2) in tyre diameters config");
// json_decref(root);
// json_decref(cararray);
// return;
// }
//
// for(int i = 0; i < json_array_size(cararray); i++)
// {
// json_t *data, *sha, *commit, *message;
// const char *message_text;
//
// data = json_array_get(cararray, i);
// if(!json_is_object(data))
// {
// slogw("Malformed content (3) in tyre diameters config");
// break;
// }
// json_t* jcar = json_object_get(data, "car");
//
// if(!json_is_string(jcar))
// {
// slogw("Malformed content (4) in tyre diameters config");
//
// json_decref(data);
// json_decref(jcar);
// break;
// }
// const char* car = json_string_value(jcar);
//
// json_t* jtyre0 = json_object_get(data, "tyre0");
// json_t* jtyre1 = json_object_get(data, "tyre1");
// json_t* jtyre2 = json_object_get(data, "tyre2");
// json_t* jtyre3 = json_object_get(data, "tyre3");
//
// double diameter0 = json_real_value(jtyre0);
// double diameter1 = json_real_value(jtyre1);
// double diameter2 = json_real_value(jtyre2);
// double diameter3 = json_real_value(jtyre3);
//
// slogt("car is: %s", car);
// slogt("diameter 0 is %f", diameter0);
// slogt("diameter 1 is %f", diameter1);
// slogt("diameter 2 is %f", diameter2);
// slogt("diameter 3 is %f", diameter3);
//
// json_decref(data);
// json_decref(jcar);
// json_decref(jtyre0);
// json_decref(jtyre1);
// json_decref(jtyre2);
// json_decref(jtyre3);
//
// if(simdata->car != NULL)
// {
// if (strcicmp(car, simdata->car) == 0)
// {
// simdata->tyrediameter[0] = diameter0;
// simdata->tyrediameter[1] = diameter1;
// simdata->tyrediameter[2] = diameter2;
// simdata->tyrediameter[3] = diameter3;
// break;
// }
// }
// }
//
// json_decref(root);
// json_decref(cararray);
//}
void savetyreconfig(SimData* simdata, char* configfile)
{
config_t cfg;
config_setting_t* root;
config_setting_t* array;
config_setting_t* carobject;
config_setting_t* setting;
json_t* object = json_object();
json_t* array = json_array();
json_t* car = json_string(simdata->car);
json_t* tyre0 = json_real(simdata->tyrediameter[0]);
json_t* tyre1 = json_real(simdata->tyrediameter[1]);
json_t* tyre2 = json_real(simdata->tyrediameter[2]);
json_t* tyre3 = json_real(simdata->tyrediameter[3]);
json_object_set_new(object, "car", car);
json_object_set_new(object, "tyre0", tyre0);
json_object_set_new(object, "tyre1", tyre1);
json_object_set_new(object, "tyre2", tyre2);
json_object_set_new(object, "tyre3", tyre3);
json_array_append(array, object);
json_t* file = json_load_file(configfile, 0, NULL);
if(!file)
config_init(&cfg);
if (!config_read_file(&cfg, configfile))
{
slogw("could not open config file for tyre diameters");
return;
}
if(!json_is_object(file))
{
json_object_set_new(file, "cars", array);
slogw("Could not open diameters save file, creating new.");
root = config_root_setting(&cfg);
array = config_setting_add(root, "cars", CONFIG_TYPE_LIST);
}
else
{
json_t* cararray = json_object_get(file, "cars");
json_array_append(cararray, array);
array = config_lookup(&cfg, "cars");
}
json_dump_file(file, configfile, 0);
carobject = config_setting_add(array, "cars", CONFIG_TYPE_GROUP);
json_decref(tyre0);
json_decref(tyre1);
json_decref(tyre2);
json_decref(tyre3);
json_decref(car);
json_decref(object);
json_decref(array);
setting = config_setting_add(carobject, "car", CONFIG_TYPE_STRING);
config_setting_set_string(setting, simdata->car);
setting = config_setting_add(carobject, "tyre0", CONFIG_TYPE_FLOAT);
config_setting_set_float(setting, simdata->tyrediameter[0]);
setting = config_setting_add(carobject, "tyre1", CONFIG_TYPE_FLOAT);
config_setting_set_float(setting, simdata->tyrediameter[1]);
setting = config_setting_add(carobject, "tyre2", CONFIG_TYPE_FLOAT);
config_setting_set_float(setting, simdata->tyrediameter[2]);
setting = config_setting_add(carobject, "tyre3", CONFIG_TYPE_FLOAT);
config_setting_set_float(setting, simdata->tyrediameter[3]);
/* Write out the new configuration. */
if(! config_write_file(&cfg, configfile))
{
slogi("Error while writing file.");
config_destroy(&cfg);
}
slogi("New configuration successfully written to: %s\n", configfile);
config_destroy(&cfg);
}
//void savetyreconfig(SimData* simdata, char* configfile)
//{
//
// json_t* object = json_object();
// json_t* array = json_array();
// json_t* car = json_string(simdata->car);
// json_t* tyre0 = json_real(simdata->tyrediameter[0]);
// json_t* tyre1 = json_real(simdata->tyrediameter[1]);
// json_t* tyre2 = json_real(simdata->tyrediameter[2]);
// json_t* tyre3 = json_real(simdata->tyrediameter[3]);
// json_object_set_new(object, "car", car);
// json_object_set_new(object, "tyre0", tyre0);
// json_object_set_new(object, "tyre1", tyre1);
// json_object_set_new(object, "tyre2", tyre2);
// json_object_set_new(object, "tyre3", tyre3);
//
// json_array_append(array, object);
//
// json_t* file = json_load_file(configfile, 0, NULL);
//
// if(!file)
// {
// slogw("could not open config file for tyre diameters");
// return;
// }
//
// if(!json_is_object(file))
// {
// json_object_set_new(file, "cars", array);
// }
// else
// {
// json_t* cararray = json_object_get(file, "cars");
// json_array_append(cararray, array);
// }
//
// json_dump_file(file, configfile, 0);
//
// json_decref(tyre0);
// json_decref(tyre1);
// json_decref(tyre2);
// json_decref(tyre3);
// json_decref(car);
// json_decref(object);
// json_decref(array);
//}
void getTyreDiameter(SimData* simdata)
{
if(simdata->velocity > minvelocity && simdata->brake <= maxbrake && simdata->gas <= maxthrottle)
@ -207,15 +305,16 @@ int slipeffect(SimData* simdata, int effecttype, int tyre, double threshold, int
// avoid many opens of the same file
if(useconfig == 1 && configfile != NULL && *configcheck == 0)
{
loadtyreconfig(simdata, configfile);
int error = loadtyreconfig(simdata, configfile);
*configcheck = 1;
}
if(hasTyreDiameter(simdata)==false)
{
getTyreDiameter(simdata);
if(useconfig == 1)
if(useconfig == 1 && hasTyreDiameter(simdata)==true)
{
savetyreconfig(simdata, configfile);
}
}
}

View File

@ -63,9 +63,9 @@ int main(int argc, char** argv)
create_user_dir("/.config/");
create_user_dir("/.cache/");
char* config_file_str = ( char* ) malloc(1 + strlen(home_dir_str) + strlen("/.config/") + strlen("monocoque/monocoque.config"));
size_t diameters_file_sz = 1 + strlen(home_dir_str) + strlen("/.config/") + strlen("monocoque/diameters.json");
size_t diameters_file_sz = 1 + strlen(home_dir_str) + strlen("/.config/") + strlen("monocoque/diameters.config");
char* diameters_file_str = ( char* ) malloc(1 + strlen(home_dir_str) + strlen("/.config/") + strlen("monocoque/diameters.json"));
snprintf(diameters_file_str, diameters_file_sz, "%s/.config/monocoque/diameters.json", home_dir_str);
snprintf(diameters_file_str, diameters_file_sz, "%s/.config/monocoque/diameters.config", home_dir_str);
char* cache_dir_str = ( char* ) malloc(1 + strlen(home_dir_str) + strlen("/.cache/monocoque/"));
strcpy(config_file_str, home_dir_str);