UDP support and upgrade to latest simapi for udp and logging support

This commit is contained in:
Paul Dino Jones 2024-10-01 12:46:31 -04:00
parent 558b298a78
commit 2a897d930a
6 changed files with 202 additions and 44 deletions

View File

@ -29,6 +29,7 @@ struct sigaction act;
uv_idle_t idler; uv_idle_t idler;
uv_timer_t datachecktimer; uv_timer_t datachecktimer;
uv_timer_t datamaptimer; uv_timer_t datamaptimer;
uv_udp_t recv_socket;
bool doui = false; bool doui = false;
int appstate = 0; int appstate = 0;
@ -186,6 +187,61 @@ int showstats(SimData* simdata)
fflush(stdout); 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 shmdatamapcallback(uv_timer_t* handle)
{ {
void* b = uv_handle_get_data((uv_handle_t*) handle); void* b = uv_handle_get_data((uv_handle_t*) handle);
@ -196,43 +252,8 @@ void shmdatamapcallback(uv_timer_t* handle)
//appstate = 2; //appstate = 2;
if (appstate == 2) if (appstate == 2)
{ {
simdatamap(simdata, simmap, f->sim); simdatamap(simdata, simmap, f->sim, false, NULL);
looprun(ms, f, 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);
}
}
}
} }
if (f->simstate == false || simdata->simstatus <= 1 || appstate <= 1) 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 datacheckcallback(uv_timer_t* handle)
{ {
void* b = uv_handle_get_data((uv_handle_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 ) 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) if (f->simstate == true && simdata->simstatus >= 2)
{ {
@ -305,7 +437,18 @@ void datacheckcallback(uv_timer_t* handle)
simdata->tyrediameter[1] = -1; simdata->tyrediameter[1] = -1;
simdata->tyrediameter[2] = -1; simdata->tyrediameter[2] = -1;
simdata->tyrediameter[3] = -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); uv_timer_stop(handle);
} }
} }
@ -373,6 +516,7 @@ int monocoque_mainloop(MonocoqueSettings* ms)
baton->req.data = (void*) baton; baton->req.data = (void*) baton;
uv_handle_set_data((uv_handle_t*) &datachecktimer, (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*) &datamaptimer, (void*) baton);
uv_handle_set_data((uv_handle_t*) &recv_socket, (void*) baton);
uv_handle_set_data((uv_handle_t*) poll, (void*) baton); uv_handle_set_data((uv_handle_t*) poll, (void*) baton);
appstate = 1; appstate = 1;
slogd("setting initial app state"); 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"); fprintf(stdout, "Searching for sim data... Press q to quit...\n");
uv_timer_start(&datachecktimer, datacheckcallback, 1000, 1000); 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)) if (0 != uv_poll_init(uv_default_loop(), poll, 0))
{ {

View File

@ -12,7 +12,8 @@
typedef struct loop_data typedef struct loop_data
{ {
uv_work_t req; uv_work_t req;
Simulator sim; SimulatorAPI sim;
bool use_udp;
bool simstate; bool simstate;
bool uion; bool uion;
bool releasing; bool releasing;

View File

@ -123,10 +123,11 @@ MonocoqueTyreIdentifier;
typedef struct typedef struct
{ {
ProgramAction program_action; ProgramAction program_action;
Simulator sim_name; SimulatorAPI sim_name;
int configcheck; int configcheck;
int useconfig; int useconfig;
int verbosity_count; int verbosity_count;
bool force_udp_mode;
char* tyre_diameter_config; char* tyre_diameter_config;
char* config_str; char* config_str;
char* log_filename_str; char* log_filename_str;

View File

@ -45,6 +45,8 @@ ConfigError getParameters(int argc, char** argv, Parameters* p)
p->max_revs = 0; p->max_revs = 0;
p->verbosity_count = 0; p->verbosity_count = 0;
p->udp = false;
p->user_specified_config_file = false; p->user_specified_config_file = false;
p->user_specified_log_file = false; p->user_specified_log_file = false;
p->user_specified_config_dir = 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_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_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", "<config_file>", 0, 1, NULL); struct arg_file* arg_conf = arg_filen(NULL, "uiconf", "<config_file>", 0, 1, NULL);
struct arg_file* arg_log = arg_filen("l", "log", "<log_file>", 0, 1, NULL); struct arg_file* arg_log = arg_filen("l", "log", "<log_file>", 0, 1, NULL);
struct arg_str* arg_confdir = arg_strn(NULL, "configdir", "config_dir>", 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* 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_lit* vers = arg_litn(NULL,"version", 0, 1, "print version information and exit");
struct arg_end* end1 = arg_end(20); 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; int nerrors1;
struct arg_rex* cmd2a = arg_rex1(NULL, NULL, "config", NULL, REG_ICASE, NULL); 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->config_filepath = strdup(arg_conf->filename[0]);
p->user_specified_config_file = true; p->user_specified_config_file = true;
} }
if (arg_udp->count > 0)
{
p->udp = true;
}
if(arg_log->count > 0) if(arg_log->count > 0)
{ {
char* filename = strdup(arg_log->filename[0]); char* filename = strdup(arg_log->filename[0]);

View File

@ -13,8 +13,9 @@ typedef struct
int granularity; int granularity;
int verbosity_count; int verbosity_count;
Simulator sim; SimulatorAPI sim;
bool simon; bool simon;
bool udp;
char* config_filepath; char* config_filepath;
char* config_dirpath; char* config_dirpath;

@ -1 +1 @@
Subproject commit 55be4de2cd294d4d0b8f90be521a27d204857f96 Subproject commit cdf196257874d9db3f19f5ce81781736d6425ea3