Add support for per device fps settings.
This commit is contained in:
parent
317adf2187
commit
def2bfbb89
|
|
@ -40,6 +40,7 @@ int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, Monocoque
|
||||||
simdevices[j] = sim->m;
|
simdevices[j] = sim->m;
|
||||||
simdevices[j].initialized = true;
|
simdevices[j].initialized = true;
|
||||||
simdevices[j].type = SIMDEV_USB;
|
simdevices[j].type = SIMDEV_USB;
|
||||||
|
simdevices[j].fps = ds[j].fps;
|
||||||
devices++;
|
devices++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -57,6 +58,7 @@ int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, Monocoque
|
||||||
simdevices[j] = sim->m;
|
simdevices[j] = sim->m;
|
||||||
simdevices[j].initialized = true;
|
simdevices[j].initialized = true;
|
||||||
simdevices[j].type = SIMDEV_SOUND;
|
simdevices[j].type = SIMDEV_SOUND;
|
||||||
|
simdevices[j].fps = ds[j].fps;
|
||||||
devices++;
|
devices++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -73,6 +75,7 @@ int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, Monocoque
|
||||||
simdevices[j] = sim->m;
|
simdevices[j] = sim->m;
|
||||||
simdevices[j].initialized = true;
|
simdevices[j].initialized = true;
|
||||||
simdevices[j].type = SIMDEV_SERIAL;
|
simdevices[j].type = SIMDEV_SERIAL;
|
||||||
|
simdevices[j].fps = ds[j].fps;
|
||||||
devices++;
|
devices++;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ struct SimDevice
|
||||||
int (*free)(SimDevice*);
|
int (*free)(SimDevice*);
|
||||||
void* derived;
|
void* derived;
|
||||||
int id;
|
int id;
|
||||||
|
int fps;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
DeviceType type;
|
DeviceType type;
|
||||||
HapticEffect hapticeffect;
|
HapticEffect hapticeffect;
|
||||||
|
|
|
||||||
|
|
@ -202,6 +202,22 @@ void simapilib_logtrace(char* message)
|
||||||
slog_display(SLOG_TRACE, 1, 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)
|
void looprun(MonocoqueSettings* ms, loop_data* f, SimData* simdata)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -226,20 +242,42 @@ void looprun(MonocoqueSettings* ms, loop_data* f, SimData* simdata)
|
||||||
}
|
}
|
||||||
free(ds);
|
free(ds);
|
||||||
doui = false;
|
doui = false;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
showstats(simdata);
|
|
||||||
SimDevice* devices = f->simdevices;
|
|
||||||
int numdevices = f->numdevices;
|
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++)
|
for (int x = 0; x < numdevices; x++)
|
||||||
{
|
{
|
||||||
if (devices[x].initialized == true)
|
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)
|
void shmdatamapcallback(uv_timer_t* handle)
|
||||||
|
|
@ -270,6 +308,21 @@ void shmdatamapcallback(uv_timer_t* handle)
|
||||||
// help things spin down
|
// help things spin down
|
||||||
simdata->rpms = 0;
|
simdata->rpms = 0;
|
||||||
simdata->velocity = 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++)
|
for (int x = 0; x < numdevices; x++)
|
||||||
{
|
{
|
||||||
if (devices[x].initialized == true)
|
if (devices[x].initialized == true)
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,12 @@
|
||||||
#include "../simulatorapi/simapi/simapi/simdata.h"
|
#include "../simulatorapi/simapi/simapi/simdata.h"
|
||||||
#include "../simulatorapi/simapi/simapi/simmapper.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
|
typedef struct loop_data
|
||||||
{
|
{
|
||||||
|
|
@ -23,6 +29,10 @@ typedef struct loop_data
|
||||||
SimData* simdata;
|
SimData* simdata;
|
||||||
SimMap* simmap;
|
SimMap* simmap;
|
||||||
SimDevice* simdevices;
|
SimDevice* simdevices;
|
||||||
|
uv_timer_t* device_timers;
|
||||||
|
device_loop_data* device_batons;
|
||||||
} loop_data;
|
} loop_data;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -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)
|
if (ds->dev_subtype == SIMDEVTYPE_TACHOMETER)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -178,6 +178,7 @@ USBDeviceSettings;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
bool is_valid;
|
bool is_valid;
|
||||||
|
int fps;
|
||||||
DeviceType dev_type;
|
DeviceType dev_type;
|
||||||
DeviceSubType dev_subtype;
|
DeviceSubType dev_subtype;
|
||||||
DeviceSubSubType dev_subsubtype;
|
DeviceSubSubType dev_subsubtype;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue