diff --git a/src/monocoque/devices/simdevice.c b/src/monocoque/devices/simdevice.c index c365a5d..a1b40b8 100644 --- a/src/monocoque/devices/simdevice.c +++ b/src/monocoque/devices/simdevice.c @@ -40,6 +40,7 @@ int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, Monocoque simdevices[j] = sim->m; simdevices[j].initialized = true; simdevices[j].type = SIMDEV_USB; + simdevices[j].fps = ds[j].fps; devices++; } else @@ -57,6 +58,7 @@ int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, Monocoque simdevices[j] = sim->m; simdevices[j].initialized = true; simdevices[j].type = SIMDEV_SOUND; + simdevices[j].fps = ds[j].fps; devices++; } else @@ -73,6 +75,7 @@ int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, Monocoque simdevices[j] = sim->m; simdevices[j].initialized = true; simdevices[j].type = SIMDEV_SERIAL; + simdevices[j].fps = ds[j].fps; devices++; } diff --git a/src/monocoque/devices/simdevice.h b/src/monocoque/devices/simdevice.h index c0551b1..57e66ec 100644 --- a/src/monocoque/devices/simdevice.h +++ b/src/monocoque/devices/simdevice.h @@ -23,6 +23,7 @@ struct SimDevice int (*free)(SimDevice*); void* derived; int id; + int fps; bool initialized; DeviceType type; HapticEffect hapticeffect; diff --git a/src/monocoque/gameloop/gameloop.c b/src/monocoque/gameloop/gameloop.c index 805a7ba..286b325 100644 --- a/src/monocoque/gameloop/gameloop.c +++ b/src/monocoque/gameloop/gameloop.c @@ -202,6 +202,22 @@ void simapilib_logtrace(char* message) slog_display(SLOG_TRACE, 1, message); } +void on_timer_close_complete(uv_handle_t* handle) +{ + free(handle); +} + + +void devicetimercallback(uv_timer_t* handle) +{ + void* b = uv_handle_get_data((uv_handle_t*) handle); + device_loop_data* f = (device_loop_data*) b; + SimData* simdata = f->simdata; + SimDevice* device = f->simdevice; + device->update(device, simdata); + +} + void looprun(MonocoqueSettings* ms, loop_data* f, SimData* simdata) { @@ -226,20 +242,42 @@ void looprun(MonocoqueSettings* ms, loop_data* f, SimData* simdata) } free(ds); doui = false; - } - else - { - showstats(simdata); - SimDevice* devices = f->simdevices; + + int numdevices = f->numdevices; + SimDevice* devices = f->simdevices; + f->device_timers = (malloc(uv_handle_size(UV_TIMER) * numdevices)); + f->device_batons = (malloc(sizeof(device_loop_data) * numdevices)); + for (int x = 0; x < numdevices; x++) { if (devices[x].initialized == true) { - devices[x].update(&devices[x], simdata); + device_loop_data* dld = f->device_batons + (sizeof(device_loop_data) * x); + dld->simdevice = &devices[x]; + dld->simdata = simdata; + uv_timer_t* dt = (f->device_timers + (uv_handle_size(UV_TIMER) * x)); + uv_timer_init(uv_default_loop(), dt); + uv_handle_set_data((uv_handle_t*) dt, (void*) dld); + int interval = 1000/devices[x].fps; + uv_timer_start(dt, devicetimercallback, 0, interval); + slogi("starting device at %i fps (%i ms ticks)", devices[x].fps, interval); } } } + 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) @@ -270,6 +308,21 @@ void shmdatamapcallback(uv_timer_t* handle) // help things spin down simdata->rpms = 0; simdata->velocity = 0; + + for (int x = 0; x < numdevices; x++) + { + if (devices[x].initialized == true) + { + uv_timer_t* dt = (uv_timer_t*) f->device_timers + (uv_handle_size(UV_TIMER) * x); + slogt("attempting device timer stop and release"); + slogt("timer active status %i", uv_is_active((uv_handle_t*) dt)); + uv_timer_stop(dt); + //uv_close((uv_handle_t*) dt, on_timer_close_complete); + } + } + free(f->device_batons); + free(f->device_timers); + slogt("stopped device timers"); for (int x = 0; x < numdevices; x++) { if (devices[x].initialized == true) diff --git a/src/monocoque/gameloop/loopdata.h b/src/monocoque/gameloop/loopdata.h index 768f7ab..d2d37ce 100644 --- a/src/monocoque/gameloop/loopdata.h +++ b/src/monocoque/gameloop/loopdata.h @@ -8,6 +8,12 @@ #include "../simulatorapi/simapi/simapi/simdata.h" #include "../simulatorapi/simapi/simapi/simmapper.h" +typedef struct device_loop_data +{ + uv_work_t req; + SimData* simdata; + SimDevice* simdevice; +} device_loop_data; typedef struct loop_data { @@ -23,6 +29,10 @@ typedef struct loop_data SimData* simdata; SimMap* simmap; SimDevice* simdevices; + uv_timer_t* device_timers; + device_loop_data* device_batons; } loop_data; + + #endif diff --git a/src/monocoque/helper/confighelper.c b/src/monocoque/helper/confighelper.c index 49b31cb..29b991a 100644 --- a/src/monocoque/helper/confighelper.c +++ b/src/monocoque/helper/confighelper.c @@ -465,6 +465,8 @@ int devsetup(const char* device_type, const char* device_subtype, const char* co } + ds->fps = 60; + config_setting_lookup_int(device_settings, "fps", &ds->fps); if (ds->dev_subtype == SIMDEVTYPE_TACHOMETER) { diff --git a/src/monocoque/helper/confighelper.h b/src/monocoque/helper/confighelper.h index b93f19b..30c7d4e 100644 --- a/src/monocoque/helper/confighelper.h +++ b/src/monocoque/helper/confighelper.h @@ -178,6 +178,7 @@ USBDeviceSettings; typedef struct { bool is_valid; + int fps; DeviceType dev_type; DeviceSubType dev_subtype; DeviceSubSubType dev_subsubtype;