Add support for per device fps settings.

This commit is contained in:
Paul Dino Jones 2025-01-13 15:16:57 -05:00
parent 317adf2187
commit def2bfbb89
6 changed files with 76 additions and 6 deletions

View File

@ -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++;
}

View File

@ -23,6 +23,7 @@ struct SimDevice
int (*free)(SimDevice*);
void* derived;
int id;
int fps;
bool initialized;
DeviceType type;
HapticEffect hapticeffect;

View File

@ -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)

View File

@ -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

View File

@ -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)
{

View File

@ -178,6 +178,7 @@ USBDeviceSettings;
typedef struct
{
bool is_valid;
int fps;
DeviceType dev_type;
DeviceSubType dev_subtype;
DeviceSubSubType dev_subsubtype;