From 2a897d930a6322245197feea1e675e5d110ea447 Mon Sep 17 00:00:00 2001 From: Paul Dino Jones Date: Tue, 1 Oct 2024 12:46:31 -0400 Subject: [PATCH] UDP support and upgrade to latest simapi for udp and logging support --- src/monocoque/gameloop/gameloop.c | 226 +++++++++++++++++++++++----- src/monocoque/gameloop/loopdata.h | 3 +- src/monocoque/helper/confighelper.h | 3 +- src/monocoque/helper/parameters.c | 9 +- src/monocoque/helper/parameters.h | 3 +- src/monocoque/simulatorapi/simapi | 2 +- 6 files changed, 202 insertions(+), 44 deletions(-) diff --git a/src/monocoque/gameloop/gameloop.c b/src/monocoque/gameloop/gameloop.c index e640f06..ee21457 100644 --- a/src/monocoque/gameloop/gameloop.c +++ b/src/monocoque/gameloop/gameloop.c @@ -29,6 +29,7 @@ struct sigaction act; uv_idle_t idler; uv_timer_t datachecktimer; uv_timer_t datamaptimer; +uv_udp_t recv_socket; bool doui = false; int appstate = 0; @@ -186,6 +187,61 @@ int showstats(SimData* simdata) fflush(stdout); } +void simapilib_loginfo(char* message) +{ + slogi(message); +} + +void simapilib_logdebug(char* message) +{ + slogd(message); +} + +void simapilib_logtrace(char* message) +{ + slog_display(SLOG_TRACE, 1, message); +} + +void looprun(MonocoqueSettings* ms, loop_data* f, SimData* simdata) +{ + + if (doui == true) + { + slogi("looking for ui config %s", ms->config_str); + int confignum = getconfigtouse(ms->config_str, simdata->car, f->sim); + int configureddevices; + configcheck(ms->config_str, confignum, &configureddevices); + + DeviceSettings* ds = malloc(configureddevices * sizeof(DeviceSettings)); + slogd("loading confignum %i, with %i devices.", confignum, configureddevices); + + f->numdevices = uiloadconfig(ms->config_str, confignum, configureddevices, ms, ds); + + f->simdevices = malloc(f->numdevices * sizeof(SimDevice)); + int initdevices = devinit(f->simdevices, configureddevices, ds, ms); + int i = 0; + for( i = 0; i < configureddevices; i++) + { + settingsfree(ds[i]); + } + free(ds); + doui = false; + } + else + { + showstats(simdata); + SimDevice* devices = f->simdevices; + int numdevices = f->numdevices; + for (int x = 0; x < numdevices; x++) + { + if (devices[x].initialized == true) + { + devices[x].update(&devices[x], simdata); + } + } + } +} + void shmdatamapcallback(uv_timer_t* handle) { void* b = uv_handle_get_data((uv_handle_t*) handle); @@ -196,43 +252,8 @@ void shmdatamapcallback(uv_timer_t* handle) //appstate = 2; if (appstate == 2) { - simdatamap(simdata, simmap, f->sim); - - if (doui == true) - { - slogi("looking for ui config %s", ms->config_str); - int confignum = getconfigtouse(ms->config_str, simdata->car, f->sim); - int configureddevices; - configcheck(ms->config_str, confignum, &configureddevices); - - DeviceSettings* ds = malloc(configureddevices * sizeof(DeviceSettings)); - slogd("loading confignum %i, with %i devices.", confignum, configureddevices); - - f->numdevices = uiloadconfig(ms->config_str, confignum, configureddevices, ms, ds); - - f->simdevices = malloc(f->numdevices * sizeof(SimDevice)); - int initdevices = devinit(f->simdevices, configureddevices, ds, ms); - int i = 0; - for( i = 0; i < configureddevices; i++) - { - settingsfree(ds[i]); - } - free(ds); - doui = false; - } - else - { - showstats(simdata); - SimDevice* devices = f->simdevices; - int numdevices = f->numdevices; - for (int x = 0; x < numdevices; x++) - { - if (devices[x].initialized == true) - { - devices[x].update(&devices[x], simdata); - } - } - } + simdatamap(simdata, simmap, f->sim, false, NULL); + looprun(ms, f, simdata); } if (f->simstate == false || simdata->simstatus <= 1 || appstate <= 1) @@ -284,6 +305,108 @@ void shmdatamapcallback(uv_timer_t* handle) } } +void on_alloc(uv_handle_t* client, size_t suggested_size, uv_buf_t* buf) { + buf->base = malloc(suggested_size); + buf->len = suggested_size; + bzero(buf->base, suggested_size); + slogt("udp malloc:%lu %p\n",buf->len,buf->base); +} + +static void on_udp_recv(uv_udp_t* handle, ssize_t nread, const uv_buf_t* rcvbuf, const struct sockaddr* addr, unsigned flags) { + if (nread > 0) { + slogt("udp data received"); + } + + char* a; + a = rcvbuf->base; + + void* b = uv_handle_get_data((uv_handle_t*) handle); + loop_data* f = (loop_data*) b; + SimData* simdata = f->simdata; + SimMap* simmap = f->simmap; + MonocoqueSettings* ms = f->ms; + + if (appstate == 2) + { + simdatamap(simdata, simmap, f->sim, true, a); + looprun(ms, f, simdata); + } + + if (f->simstate == false || simdata->simstatus <= 1 || appstate <= 1) + { + if(f->releasing == false) + { + f->releasing = true; + uv_udp_recv_stop(handle); + slogi("releasing devices, please wait"); + f->uion = false; + SimDevice* devices = f->simdevices; + int numdevices = f->numdevices; + + // help things spin down + simdata->rpms = 0; + simdata->velocity = 0; + for (int x = 0; x < numdevices; x++) + { + if (devices[x].initialized == true) + { + devices[x].update(&devices[x], simdata); + } + } + for (int x = 0; x < numdevices; x++) + { + if (devices[x].initialized == true) + { + devices[x].free(&devices[x]); + } + } + free(devices); + int r = simfree(simdata, simmap, f->sim); + slogd("simfree returned %i", r); + f->numdevices = 0; + slogi("stopped mapping data, press q again to quit"); + //stopui(ms->ui_type, f); + // free loop data + + if(appstate > 0) + { + uv_timer_start(&datachecktimer, datacheckcallback, 3000, 1000); + } + f->releasing = false; + if(appstate > 1) + { + appstate = 1; + } + } + } + + slogt("udp free :%lu %p\n",rcvbuf->len,rcvbuf->base); + free(rcvbuf->base); +} + +int startudp(int port) +{ + uv_udp_init(uv_default_loop(), &recv_socket); + struct sockaddr_in recv_addr; + uv_ip4_addr("0.0.0.0", port, &recv_addr); + int err = uv_udp_bind(&recv_socket, (const struct sockaddr *) &recv_addr, UV_UDP_REUSEADDR); + + slogt("initial udp error is %i", err); + return err; +} + +void udpstart(MonocoqueSettings* sms, loop_data* f, SimData* simdata, SimMap* simmap) +{ + if (appstate == 2) + { + simdatamap(simdata, simmap, f->sim, true, NULL); + if (doui == true) + { + looprun(sms, f, simdata); + } + } +} + void datacheckcallback(uv_timer_t* handle) { void* b = uv_handle_get_data((uv_handle_t*) handle); @@ -293,7 +416,16 @@ void datacheckcallback(uv_timer_t* handle) if ( appstate == 1 ) { - getSim(simdata, simmap, &f->simstate, &f->sim); + SimInfo si = getSim(simdata, simmap, f->ms->force_udp_mode, startudp); + //TODO: move all this to a siminfo struct in loop_data + f->simstate = si.isSimOn; + f->sim = si.simulatorapi; + f->use_udp = si.SimUsesUDP; + + if(f->ms->force_udp_mode == true) + { + f->use_udp = true; + } } if (f->simstate == true && simdata->simstatus >= 2) { @@ -305,7 +437,18 @@ void datacheckcallback(uv_timer_t* handle) simdata->tyrediameter[1] = -1; simdata->tyrediameter[2] = -1; simdata->tyrediameter[3] = -1; - uv_timer_start(&datamaptimer, shmdatamapcallback, 2000, 16); + + if(f->use_udp == true) + { + slogt("starting udp receive loop"); + udpstart(f->ms, f, simdata, simmap); + uv_udp_recv_start(&recv_socket, on_alloc, on_udp_recv); + slogt("udp receive loop started"); + } + else + { + uv_timer_start(&datamaptimer, shmdatamapcallback, 2000, 16); + } uv_timer_stop(handle); } } @@ -373,6 +516,7 @@ int monocoque_mainloop(MonocoqueSettings* ms) baton->req.data = (void*) baton; uv_handle_set_data((uv_handle_t*) &datachecktimer, (void*) baton); uv_handle_set_data((uv_handle_t*) &datamaptimer, (void*) baton); + uv_handle_set_data((uv_handle_t*) &recv_socket, (void*) baton); uv_handle_set_data((uv_handle_t*) poll, (void*) baton); appstate = 1; slogd("setting initial app state"); @@ -380,6 +524,10 @@ int monocoque_mainloop(MonocoqueSettings* ms) fprintf(stdout, "Searching for sim data... Press q to quit...\n"); uv_timer_start(&datachecktimer, datacheckcallback, 1000, 1000); + set_simapi_log_info(simapilib_loginfo); + set_simapi_log_debug(simapilib_logdebug); + set_simapi_log_trace(simapilib_logtrace); + if (0 != uv_poll_init(uv_default_loop(), poll, 0)) { diff --git a/src/monocoque/gameloop/loopdata.h b/src/monocoque/gameloop/loopdata.h index 4c5b230..e24d93e 100644 --- a/src/monocoque/gameloop/loopdata.h +++ b/src/monocoque/gameloop/loopdata.h @@ -12,7 +12,8 @@ typedef struct loop_data { uv_work_t req; - Simulator sim; + SimulatorAPI sim; + bool use_udp; bool simstate; bool uion; bool releasing; diff --git a/src/monocoque/helper/confighelper.h b/src/monocoque/helper/confighelper.h index 5201297..b93f19b 100644 --- a/src/monocoque/helper/confighelper.h +++ b/src/monocoque/helper/confighelper.h @@ -123,10 +123,11 @@ MonocoqueTyreIdentifier; typedef struct { ProgramAction program_action; - Simulator sim_name; + SimulatorAPI sim_name; int configcheck; int useconfig; int verbosity_count; + bool force_udp_mode; char* tyre_diameter_config; char* config_str; char* log_filename_str; diff --git a/src/monocoque/helper/parameters.c b/src/monocoque/helper/parameters.c index 7edeb47..96a3b72 100644 --- a/src/monocoque/helper/parameters.c +++ b/src/monocoque/helper/parameters.c @@ -45,6 +45,8 @@ ConfigError getParameters(int argc, char** argv, Parameters* p) p->max_revs = 0; p->verbosity_count = 0; + p->udp = false; + p->user_specified_config_file = false; p->user_specified_log_file = false; p->user_specified_config_dir = false; @@ -57,13 +59,14 @@ ConfigError getParameters(int argc, char** argv, Parameters* p) struct arg_lit* arg_verbosity3 = arg_litn("v","verbose", 0, 2, "increase logging verbosity"); struct arg_rex* cmd1 = arg_rex1(NULL, NULL, "play", NULL, REG_ICASE, NULL); + struct arg_lit* arg_udp = arg_lit0("d", "udp", "force udp mode for sims which support it"); struct arg_file* arg_conf = arg_filen(NULL, "uiconf", "", 0, 1, NULL); struct arg_file* arg_log = arg_filen("l", "log", "", 0, 1, NULL); struct arg_str* arg_confdir = arg_strn(NULL, "configdir", "config_dir>", 0, 1, NULL); struct arg_lit* help = arg_litn(NULL,"help", 0, 1, "print this help and exit"); struct arg_lit* vers = arg_litn(NULL,"version", 0, 1, "print version information and exit"); struct arg_end* end1 = arg_end(20); - void* argtable1[] = {cmd1,arg_log,arg_conf,arg_verbosity1,help,vers,end1}; + void* argtable1[] = {cmd1,arg_log,arg_conf,arg_udp,arg_verbosity1,help,vers,end1}; int nerrors1; struct arg_rex* cmd2a = arg_rex1(NULL, NULL, "config", NULL, REG_ICASE, NULL); @@ -123,6 +126,10 @@ ConfigError getParameters(int argc, char** argv, Parameters* p) p->config_filepath = strdup(arg_conf->filename[0]); p->user_specified_config_file = true; } + if (arg_udp->count > 0) + { + p->udp = true; + } if(arg_log->count > 0) { char* filename = strdup(arg_log->filename[0]); diff --git a/src/monocoque/helper/parameters.h b/src/monocoque/helper/parameters.h index dfe6faa..2b95384 100644 --- a/src/monocoque/helper/parameters.h +++ b/src/monocoque/helper/parameters.h @@ -13,8 +13,9 @@ typedef struct int granularity; int verbosity_count; - Simulator sim; + SimulatorAPI sim; bool simon; + bool udp; char* config_filepath; char* config_dirpath; diff --git a/src/monocoque/simulatorapi/simapi b/src/monocoque/simulatorapi/simapi index 55be4de..cdf1962 160000 --- a/src/monocoque/simulatorapi/simapi +++ b/src/monocoque/simulatorapi/simapi @@ -1 +1 @@ -Subproject commit 55be4de2cd294d4d0b8f90be521a27d204857f96 +Subproject commit cdf196257874d9db3f19f5ce81781736d6425ea3