UDP support and upgrade to latest simapi for udp and logging support
This commit is contained in:
parent
558b298a78
commit
2a897d930a
|
|
@ -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,17 +187,23 @@ int showstats(SimData* simdata)
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void shmdatamapcallback(uv_timer_t* handle)
|
void simapilib_loginfo(char* message)
|
||||||
{
|
{
|
||||||
void* b = uv_handle_get_data((uv_handle_t*) handle);
|
slogi(message);
|
||||||
loop_data* f = (loop_data*) b;
|
}
|
||||||
SimData* simdata = f->simdata;
|
|
||||||
SimMap* simmap = f->simmap;
|
void simapilib_logdebug(char* message)
|
||||||
MonocoqueSettings* ms = f->ms;
|
{
|
||||||
//appstate = 2;
|
slogd(message);
|
||||||
if (appstate == 2)
|
}
|
||||||
|
|
||||||
|
void simapilib_logtrace(char* message)
|
||||||
|
{
|
||||||
|
slog_display(SLOG_TRACE, 1, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void looprun(MonocoqueSettings* ms, loop_data* f, SimData* simdata)
|
||||||
{
|
{
|
||||||
simdatamap(simdata, simmap, f->sim);
|
|
||||||
|
|
||||||
if (doui == true)
|
if (doui == true)
|
||||||
{
|
{
|
||||||
|
|
@ -235,6 +242,20 @@ void shmdatamapcallback(uv_timer_t* handle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void shmdatamapcallback(uv_timer_t* handle)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
//appstate = 2;
|
||||||
|
if (appstate == 2)
|
||||||
|
{
|
||||||
|
simdatamap(simdata, simmap, f->sim, false, NULL);
|
||||||
|
looprun(ms, f, simdata);
|
||||||
|
}
|
||||||
|
|
||||||
if (f->simstate == false || simdata->simstatus <= 1 || appstate <= 1)
|
if (f->simstate == false || simdata->simstatus <= 1 || appstate <= 1)
|
||||||
{
|
{
|
||||||
if(f->releasing == false)
|
if(f->releasing == false)
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
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_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))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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]);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue