Refactor to provide siminfo to help decide if and how a device can be initialize

This commit is contained in:
Paul Dino Jones 2026-03-16 17:40:13 -04:00
parent 0a35099bd1
commit 99bb88a035
12 changed files with 164 additions and 125 deletions

View File

@ -219,7 +219,7 @@ int serial_wheel_free(SimDevice* this)
return 0; return 0;
} }
int serialdev_init(SerialDevice* serialdevice, DeviceSettings* ds) int serialdev_init(SerialDevice* serialdevice, DeviceSettings* ds, SimInfo* siminfo)
{ {
slogi("initializing serial device on port %s to %i...", ds->serialdevsettings.portdev, ds->serialdevsettings.baud); slogi("initializing serial device on port %s to %i...", ds->serialdevsettings.portdev, ds->serialdevsettings.baud);
int error = 0; int error = 0;
@ -276,7 +276,7 @@ static const vtable arduino_simwind_vtable = { &arduino_simwind_update, &seriald
static const vtable arduino_simhaptic_vtable = { &arduino_simhaptic_update, &serialdev_free }; static const vtable arduino_simhaptic_vtable = { &arduino_simhaptic_update, &serialdev_free };
static const vtable serialwheel_vtable = { &serial_wheel_update, &serial_wheel_free }; static const vtable serialwheel_vtable = { &serial_wheel_update, &serial_wheel_free };
SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms) { SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms, SimInfo* siminfo) {
SerialDevice* this = (SerialDevice*) malloc(sizeof(SerialDevice)); SerialDevice* this = (SerialDevice*) malloc(sizeof(SerialDevice));
@ -285,6 +285,7 @@ SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms) {
this->m.derived = this; this->m.derived = this;
this->m.vtable = &serial_simdevice_vtable; this->m.vtable = &serial_simdevice_vtable;
this->type = SERIALDEV_ARDUINO; this->type = SERIALDEV_ARDUINO;
int error = 0;
slogt("Attempting to configure arduino device with subtype: %i", ds->dev_subtype); slogt("Attempting to configure arduino device with subtype: %i", ds->dev_subtype);
switch (ds->dev_subtype) { switch (ds->dev_subtype) {
@ -325,6 +326,10 @@ SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms) {
slogi("Initializing custom arduino device."); slogi("Initializing custom arduino device.");
break; break;
case (SIMDEVTYPE_SERIALHAPTIC): case (SIMDEVTYPE_SERIALHAPTIC):
if(siminfo->SimSupportsHapticEffects == false)
{
error = MONOCOQUE_ERROR_UNSUPPORTED_SIM_FEATURE;
}
this->devicetype = ARDUINODEV__HAPTIC; this->devicetype = ARDUINODEV__HAPTIC;
this->m.vtable = &arduino_simhaptic_vtable; this->m.vtable = &arduino_simhaptic_vtable;
this->u.simhapticdata.motor1 = 0; this->u.simhapticdata.motor1 = 0;
@ -359,7 +364,7 @@ SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms) {
} }
} }
if(this->devicetype == ARDUINODEV__HAPTIC) if(this->devicetype == ARDUINODEV__HAPTIC && error == 0)
{ {
this->m.hapticeffect.threshold = ds->threshold; this->m.hapticeffect.threshold = ds->threshold;
this->m.hapticeffect.effecttype = ds->effect_type; this->m.hapticeffect.effecttype = ds->effect_type;
@ -370,10 +375,15 @@ SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms) {
this->m.hapticeffect.tyrediameterconfig = ms->tyre_diameter_config; this->m.hapticeffect.tyrediameterconfig = ms->tyre_diameter_config;
} }
int error = serialdev_init(this, ds); if(error == 0)
if (error < 0)
{ {
slogi("Starting serial device initialization");
error = serialdev_init(this, ds, siminfo);
}
if (error != 0)
{
slogw("Did not initialize usb device due to error code %i", error);
free(this); free(this);
return NULL; return NULL;
} }

View File

@ -24,9 +24,9 @@ int devupdate(SimDevice* this, SimData* simdata)
return 0; return 0;
} }
int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, MonocoqueSettings* ms) int devinit(SimDevice* simdevices, SimInfo* siminfo, int numdevices, DeviceSettings* ds, MonocoqueSettings* ms)
{ {
slogi("initializing simdevices..."); slogi("initializing simdevices for simapi %i...", siminfo->simulatorapi);
int devices = 0; int devices = 0;
for (int j = 0; j < numdevices; j++) for (int j = 0; j < numdevices; j++)
@ -34,7 +34,7 @@ int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, Monocoque
simdevices[j].initialized = false; simdevices[j].initialized = false;
if (ds[j].dev_type == SIMDEV_USB) { if (ds[j].dev_type == SIMDEV_USB) {
USBDevice* sim = new_usb_device(&ds[j], ms); USBDevice* sim = new_usb_device(&ds[j], ms, siminfo);
if (sim != NULL) if (sim != NULL)
{ {
simdevices[j] = sim->m; simdevices[j] = sim->m;
@ -56,7 +56,7 @@ int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, Monocoque
} }
else else
{ {
SoundDevice* sim = new_sound_device(&ds[j], ms); SoundDevice* sim = new_sound_device(&ds[j], ms, siminfo);
if (sim != NULL) if (sim != NULL)
{ {
@ -75,7 +75,7 @@ int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, Monocoque
if (ds[j].dev_type == SIMDEV_SERIAL) { if (ds[j].dev_type == SIMDEV_SERIAL) {
SerialDevice* sim = new_serial_device(&ds[j], ms); SerialDevice* sim = new_serial_device(&ds[j], ms, siminfo);
if (sim != NULL) if (sim != NULL)
{ {
simdevices[j] = sim->m; simdevices[j] = sim->m;

View File

@ -82,7 +82,7 @@ int arduino_simwind_update(SimDevice* this, SimData* simdata);
int arduino_simhaptic_update(SimDevice* this, SimData* simdata); int arduino_simhaptic_update(SimDevice* this, SimData* simdata);
int serialdev_free(SimDevice* this); int serialdev_free(SimDevice* this);
SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms); SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms, SimInfo* siminfo);
/********* USB HID Devices *****/ /********* USB HID Devices *****/
typedef enum typedef enum
@ -112,7 +112,7 @@ USBDevice;
int usbdev_update(SimDevice* this, SimData* simdata); int usbdev_update(SimDevice* this, SimData* simdata);
int usbdev_free(SimDevice* this); int usbdev_free(SimDevice* this);
USBDevice* new_usb_device(DeviceSettings* ds, MonocoqueSettings* ms); USBDevice* new_usb_device(DeviceSettings* ds, MonocoqueSettings* ms, SimInfo* siminfo);
/********* Sound Devices *****/ /********* Sound Devices *****/
@ -137,7 +137,7 @@ int sounddev_gearshift_update(SimDevice* this, SimData* simdata);
int sounddev_tyreslip_update(SimDevice* this, SimData* simdata); int sounddev_tyreslip_update(SimDevice* this, SimData* simdata);
int sounddev_free(SimDevice* this); int sounddev_free(SimDevice* this);
SoundDevice* new_sound_device(DeviceSettings* ds, MonocoqueSettings* ms); SoundDevice* new_sound_device(DeviceSettings* ds, MonocoqueSettings* ms, SimInfo* siminfo);
/***** Generic Methods *********/ /***** Generic Methods *********/
@ -145,7 +145,7 @@ int update(SimDevice* simdevice, SimData* simdata);
int devupdate(SimDevice* simdevice, SimData* simdata); int devupdate(SimDevice* simdevice, SimData* simdata);
int devinit(SimDevice* simdevices, int numdevices, DeviceSettings* ds, MonocoqueSettings* ms); int devinit(SimDevice* simdevices, SimInfo* siminfo, int numdevices, DeviceSettings* ds, MonocoqueSettings* ms);
int devfree(SimDevice* simdevices, int numdevices); int devfree(SimDevice* simdevices, int numdevices);

View File

@ -231,16 +231,36 @@ static const vtable tyrelock_sound_simdevice_vtable = { &sounddev_tyrelock_updat
static const vtable absbrakes_sound_simdevice_vtable = { &sounddev_absbrakes_update, &sounddev_free }; static const vtable absbrakes_sound_simdevice_vtable = { &sounddev_absbrakes_update, &sounddev_free };
static const vtable suspension_sound_simdevice_vtable = { &sounddev_suspension_update, &sounddev_free }; static const vtable suspension_sound_simdevice_vtable = { &sounddev_suspension_update, &sounddev_free };
SoundDevice* new_sound_device(DeviceSettings* ds, MonocoqueSettings* ms) { SoundDevice* new_sound_device(DeviceSettings* ds, MonocoqueSettings* ms, SimInfo* siminfo) {
SoundDevice* this = (SoundDevice*) malloc(sizeof(SoundDevice)); SoundDevice* this = (SoundDevice*) malloc(sizeof(SoundDevice));
this->m.update = &update; this->m.update = &update;
this->m.free = &simdevfree; this->m.free = &simdevfree;
this->m.derived = this; this->m.derived = this;
int error = 0;
switch (ds->effect_type)
{
case (EFFECT_TYRESLIP):
case (EFFECT_TYRELOCK):
case (EFFECT_ABSBRAKES):
case (EFFECT_SUSPENSION):
if(siminfo->SimSupportsHapticEffects == false)
{
slogw("Skipping sound effect setup because sim does not support haptic effects");
error = MONOCOQUE_ERROR_UNSUPPORTED_SIM_FEATURE;
}
defaut:
error = 0;
}
if(error == 0)
{
slogt("Attempting to configure sound device with subtype: %i", ds->effect_type); slogt("Attempting to configure sound device with subtype: %i", ds->effect_type);
switch (ds->effect_type) { switch (ds->effect_type)
{
case (EFFECT_ENGINERPM): case (EFFECT_ENGINERPM):
this->m.hapticeffect.effecttype = EFFECT_ENGINERPM; this->m.hapticeffect.effecttype = EFFECT_ENGINERPM;
this->m.vtable = &engine_sound_simdevice_vtable; this->m.vtable = &engine_sound_simdevice_vtable;
@ -309,10 +329,14 @@ SoundDevice* new_sound_device(DeviceSettings* ds, MonocoqueSettings* ms) {
slogi("Initializing sound device for suspension vibrations."); slogi("Initializing sound device for suspension vibrations.");
break; break;
} }
}
if(error == 0)
{
slogt("Attempting to use sound device %s", ds->sounddevsettings.dev); slogt("Attempting to use sound device %s", ds->sounddevsettings.dev);
error = sounddev_init(this, ds->sounddevsettings.dev, ds->tyre, ds->sounddevsettings);
}
int error = sounddev_init(this, ds->sounddevsettings.dev, ds->tyre, ds->sounddevsettings);
if (error != 0) if (error != 0)
{ {
free(this); free(this);

View File

@ -54,7 +54,7 @@ int usbdev_free(SimDevice* this)
return 0; return 0;
} }
int usbdev_init(USBDevice* usbdevice, DeviceSettings* ds) int usbdev_init(USBDevice* usbdevice, DeviceSettings* ds, SimInfo* siminfo)
{ {
slogi("initializing usb device..."); slogi("initializing usb device...");
int error = 0; int error = 0;
@ -70,7 +70,7 @@ int usbdev_init(USBDevice* usbdevice, DeviceSettings* ds)
error = wheeldev_init(usbdevice, ds); error = wheeldev_init(usbdevice, ds);
break; break;
case USBDEV_GENERICHAPTIC : case USBDEV_GENERICHAPTIC :
error = usbhapticdev_init(&usbdevice->u.hapticdevice, ds); error = usbhapticdev_init(&usbdevice->u.hapticdevice, ds, siminfo);
break; break;
} }
@ -79,7 +79,7 @@ int usbdev_init(USBDevice* usbdevice, DeviceSettings* ds)
static const vtable usb_simdevice_vtable = { &usbdev_update, &usbdev_free }; static const vtable usb_simdevice_vtable = { &usbdev_update, &usbdev_free };
USBDevice* new_usb_device(DeviceSettings* ds, MonocoqueSettings* ms) { USBDevice* new_usb_device(DeviceSettings* ds, MonocoqueSettings* ms, SimInfo* siminfo) {
USBDevice* this = (USBDevice*) malloc(sizeof(USBDevice)); USBDevice* this = (USBDevice*) malloc(sizeof(USBDevice));
@ -112,10 +112,11 @@ USBDevice* new_usb_device(DeviceSettings* ds, MonocoqueSettings* ms) {
this->type = USBDEV_GENERICHAPTIC; this->type = USBDEV_GENERICHAPTIC;
} }
int error = usbdev_init(this, ds); int error = usbdev_init(this, ds, siminfo);
if (error != 0) if (error != 0)
{ {
slogw("Did not initialize usb device due to error code %i", error);
free(this); free(this);
return NULL; return NULL;
} }

View File

@ -67,8 +67,14 @@ int usbhapticdev_free(USBGenericHapticDevice* usbhapticdevice)
return 0; return 0;
} }
int usbhapticdev_init(USBGenericHapticDevice* usbhapticdevice, DeviceSettings* ds) int usbhapticdev_init(USBGenericHapticDevice* usbhapticdevice, DeviceSettings* ds, SimInfo* siminfo)
{ {
if(siminfo->SimSupportsHapticEffects == false)
{
slogi("This sim does not support haptic effects");
return MONOCOQUE_ERROR_UNSUPPORTED_SIM_FEATURE;
}
int error = 0; int error = 0;
usbhapticdevice->state = 0; usbhapticdevice->state = 0;
usbhapticdevice->value0 = ds->usbdevsettings.value0; usbhapticdevice->value0 = ds->usbdevsettings.value0;

View File

@ -31,7 +31,7 @@ USBGenericHapticDevice;
int usbhapticdev_update(USBGenericHapticDevice* hapticdevice, SimData* simdata, int tyre, int useconfig, int* configcheck, char* configfile); int usbhapticdev_update(USBGenericHapticDevice* hapticdevice, SimData* simdata, int tyre, int useconfig, int* configcheck, char* configfile);
int usbhapticdev_init(USBGenericHapticDevice* hapticdevice, DeviceSettings* ds); int usbhapticdev_init(USBGenericHapticDevice* hapticdevice, DeviceSettings* ds, SimInfo* siminfo);
int usbhapticdev_free(USBGenericHapticDevice* hapticdevice); int usbhapticdev_free(USBGenericHapticDevice* hapticdevice);
#endif #endif

View File

@ -225,7 +225,6 @@ void devicetimercallback(uv_timer_t* handle)
SimData* simdata = f->simdata; SimData* simdata = f->simdata;
SimDevice* device = f->simdevice; SimDevice* device = f->simdevice;
device->update(device, simdata); device->update(device, simdata);
} }
void looprun(MonocoqueSettings* ms, loop_data* f, SimData* simdata) void looprun(MonocoqueSettings* ms, loop_data* f, SimData* simdata)
@ -233,18 +232,18 @@ void looprun(MonocoqueSettings* ms, loop_data* f, SimData* simdata)
if (doui == true) if (doui == true)
{ {
slogi("looking for ui config %s pass 1", ms->config_str); slogi("looking for ui config %s pass 1 simapi %i", ms->config_str, f->siminfo.simulatorapi);
int confignum = getconfigtouse2(ms->config_str, simdata->car, f->sim); int confignum = getconfigtouse2(ms->config_str, simdata->car, f->siminfo.simulatorapi);
slogi("first pass finished"); slogi("first pass finished");
if(confignum == -1) if(confignum == -1)
{ {
slogi("looking for ui config %s pass 2", ms->config_str); slogi("looking for ui config %s pass 2", ms->config_str);
confignum = getconfigtouse1(ms->config_str, simdata->car, f->sim); confignum = getconfigtouse1(ms->config_str, simdata->car, f->siminfo.simulatorapi);
} }
if(confignum == -1) if(confignum == -1)
{ {
slogi("looking for ui config %s pass 3", ms->config_str); slogi("looking for ui config %s pass 3", ms->config_str);
confignum = getconfigtouse(ms->config_str, simdata->car, f->sim); confignum = getconfigtouse(ms->config_str, simdata->car, f->siminfo.simulatorapi);
} }
int configureddevices; int configureddevices;
@ -259,7 +258,8 @@ void looprun(MonocoqueSettings* ms, loop_data* f, SimData* simdata)
} }
f->simdevices = malloc(f->numdevices * sizeof(SimDevice)); f->simdevices = malloc(f->numdevices * sizeof(SimDevice));
int initdevices = devinit(f->simdevices, configureddevices, ds, ms); int initdevices = devinit(f->simdevices, &f->siminfo, configureddevices, ds, ms);
slogi("initialized %i devices", initdevices);
for( int i = 0; i < configureddevices; i++) for( int i = 0; i < configureddevices; i++)
{ {
@ -446,11 +446,11 @@ void shmdatamapcallback(uv_timer_t* handle)
//appstate = 2; //appstate = 2;
if (appstate == 2) if (appstate == 2)
{ {
simapi_datamap(simdata, simmap, f->map, false, NULL); simapi_datamap(simdata, simmap, f->siminfo.mapapi, false, NULL);
looprun(ms, f, simdata); looprun(ms, f, simdata);
} }
if (f->simstate == false || simdata->simstatus <= 1 || appstate <= 1) if (f->siminfo.isSimOn == false || simdata->simstatus <= 1 || appstate <= 1)
{ {
releaseloop(f, simdata, simmap); releaseloop(f, simdata, simmap);
} }
@ -483,11 +483,11 @@ static void on_udp_recv(uv_udp_t* handle, ssize_t nread, const uv_buf_t* rcvbuf,
if (appstate == 2) if (appstate == 2)
{ {
simapi_datamap(simdata, simmap, f->map, true, a); simapi_datamap(simdata, simmap, f->siminfo.mapapi, true, a);
looprun(ms, f, simdata); looprun(ms, f, simdata);
} }
if (f->simstate == false || simdata->simstatus <= 1 || appstate <= 1) if (f->siminfo.isSimOn == false || simdata->simstatus <= 1 || appstate <= 1)
{ {
releaseloop(f, simdata, simmap); releaseloop(f, simdata, simmap);
} }
@ -511,7 +511,7 @@ void udpstart(MonocoqueSettings* sms, loop_data* f, SimData* simdata, SimMap* si
{ {
if (appstate == 2) if (appstate == 2)
{ {
simapi_datamap(simdata, simmap, f->sim, true, NULL); simapi_datamap(simdata, simmap, f->siminfo.simulatorapi, true, NULL);
if (doui == true) if (doui == true)
{ {
looprun(sms, f, simdata); looprun(sms, f, simdata);
@ -528,19 +528,14 @@ void datacheckcallback(uv_timer_t* handle)
if ( appstate == 1 ) if ( appstate == 1 )
{ {
SimInfo si = simapi_get_sim(simdata, simmap, f->ms->force_udp_mode, startudp, false); f->siminfo = simapi_get_sim(simdata, simmap, f->ms->force_udp_mode, startudp, false);
//TODO: move all this to a siminfo struct in loop_data
f->simstate = si.isSimOn;
f->sim = si.simulatorapi;
f->map = si.mapapi;
f->use_udp = si.SimUsesUDP;
if(f->ms->force_udp_mode == true) if(f->ms->force_udp_mode == true)
{ {
f->use_udp = true; f->use_udp = true;
} }
} }
if (f->simstate == true && simdata->simstatus >= 2) if (f->siminfo.isSimOn == true && simdata->simstatus >= 2)
{ {
if ( appstate == 1 ) if ( appstate == 1 )
{ {
@ -569,8 +564,8 @@ void datacheckcallback(uv_timer_t* handle)
} }
if(appstate == 2) if(appstate == 2)
{ {
SimInfo si = simapi_get_sim(simdata, simmap, f->ms->force_udp_mode, NULL, false); f->siminfo = simapi_get_sim(simdata, simmap, f->ms->force_udp_mode, NULL, false);
if(si.isSimOn == false) if(f->siminfo.isSimOn == false)
{ {
appstate = 1; appstate = 1;
releaseloop(f, simdata, simmap); releaseloop(f, simdata, simmap);
@ -638,10 +633,9 @@ int monocoque_mainloop(MonocoqueSettings* ms)
baton->simmap = simmap; baton->simmap = simmap;
baton->simdata = simdata; baton->simdata = simdata;
baton->ms = ms; baton->ms = ms;
baton->simstate = false;
baton->uion = false; baton->uion = false;
baton->releasing = false; baton->releasing = false;
baton->sim = 0; baton->use_udp = false;
baton->req.data = (void*) baton; baton->req.data = (void*) baton;
simapi_set_log_info(simapilib_loginfo); simapi_set_log_info(simapilib_loginfo);
@ -728,7 +722,7 @@ int tester(SimDevice* devices, int numdevices)
sleep(1); sleep(1);
fprintf(stdout, "Revving rpm from 1000 to 8000 and back\n"); fprintf(stdout, "Revving rpm from 1000 to 8000 and back\n");
// TODO: look into this, my serial leds make this hang
for (int r = 0; r < 8000; r += 3) for (int r = 0; r < 8000; r += 3)
{ {
simdata->rpms = 1000 + r; simdata->rpms = 1000 + r;

View File

@ -13,18 +13,17 @@ typedef struct device_loop_data
uv_work_t req; uv_work_t req;
SimData* simdata; SimData* simdata;
SimDevice* simdevice; SimDevice* simdevice;
SimInfo siminfo;
} device_loop_data; } device_loop_data;
typedef struct loop_data typedef struct loop_data
{ {
uv_work_t req; uv_work_t req;
SimulatorAPI sim;
SimulatorAPI map;
bool use_udp; bool use_udp;
bool simstate;
bool uion; bool uion;
bool releasing; bool releasing;
int numdevices; int numdevices;
SimInfo siminfo;
MonocoqueSettings* ms; MonocoqueSettings* ms;
SimData* simdata; SimData* simdata;
SimMap* simmap; SimMap* simmap;

View File

@ -114,7 +114,8 @@ typedef enum
MONOCOQUE_ERROR_INVALID_SIM = 2, MONOCOQUE_ERROR_INVALID_SIM = 2,
MONOCOQUE_ERROR_INVALID_DEV = 3, MONOCOQUE_ERROR_INVALID_DEV = 3,
MONOCOQUE_ERROR_NODATA = 4, MONOCOQUE_ERROR_NODATA = 4,
MONOCOQUE_ERROR_UNKNOWN_DEV = 5 MONOCOQUE_ERROR_UNKNOWN_DEV = 5,
MONOCOQUE_ERROR_UNSUPPORTED_SIM_FEATURE = 6,
} }
MonocoqueError; MonocoqueError;

View File

@ -193,6 +193,8 @@ int main(int argc, char** argv)
SimDevice* tachdev = malloc(sizeof(SimDevice)); SimDevice* tachdev = malloc(sizeof(SimDevice));
tachdev->initialized = false; tachdev->initialized = false;
SimData* sdata = malloc(sizeof(SimData)); SimData* sdata = malloc(sizeof(SimData));
SimInfo* siminfo = malloc(sizeof(SimInfo));
simapi_set_faux_siminfo(siminfo);
DeviceSettings* ds = malloc(sizeof(DeviceSettings)); DeviceSettings* ds = malloc(sizeof(DeviceSettings));
error = devsetup("USB", "Tachometer", "None", ms, ds, NULL); error = devsetup("USB", "Tachometer", "None", ms, ds, NULL);
@ -205,7 +207,7 @@ int main(int argc, char** argv)
{ {
int devices = 0; int devices = 0;
devices = devinit(tachdev, 1, ds, ms); devices = devinit(tachdev, siminfo, 1, ds, ms);
if(devices < 1) if(devices < 1)
{ {
error = MONOCOQUE_ERROR_INVALID_DEV; error = MONOCOQUE_ERROR_INVALID_DEV;
@ -288,7 +290,9 @@ int main(int argc, char** argv)
int numdevices = uiloadconfig(ms->config_str, confignum, configureddevices, ms, ds); int numdevices = uiloadconfig(ms->config_str, confignum, configureddevices, ms, ds);
SimDevice* simdevices = malloc(numdevices * sizeof(SimDevice)); SimDevice* simdevices = malloc(numdevices * sizeof(SimDevice));
int initdevices = devinit(simdevices, configureddevices, ds, ms); SimInfo* siminfo = malloc(sizeof(SimInfo));
simapi_set_faux_siminfo(siminfo);
int initdevices = devinit(simdevices, siminfo, configureddevices, ds, ms);
for( int i = 0; i < configureddevices; i++) for( int i = 0; i < configureddevices; i++)
{ {
settingsfree(ds[i]); settingsfree(ds[i]);

@ -1 +1 @@
Subproject commit 1617ffc8c2b26d219945a1713060e1fae0917005 Subproject commit 9f732a735d35b77aff4ce564f8f792e0ad7628d2