diff --git a/src/monocoque/devices/usbhapticdevice.c b/src/monocoque/devices/usbhapticdevice.c new file mode 100644 index 0000000..b1c8713 --- /dev/null +++ b/src/monocoque/devices/usbhapticdevice.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include + +#include "usbhapticdevice.h" +#include "../../helper/confighelper.h" +#include "../../simulatorapi/simapi/simapi/simdata.h" +#include "../../slog/slog.h" + +int usbhapticdev_update(USBGenericHapticDevice* usbhapticdevice, SimData* simdata) +{ + double play = 0; + switch (usbhapticdevice->effecttype) + { + case (EFFECT_TYRESLIP): + + if (usbhapticdevice->effecttype == EFFECT_TYRESLIP) + { + if (usbhapticdevice->tyre == FRONTLEFT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR) + { + play += simdata->wheelslip[0]; + } + if (usbhapticdevice->tyre == FRONTRIGHT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR) + { + play += simdata->wheelslip[1]; + } + if (usbhapticdevice->tyre == REARLEFT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR) + { + play += simdata->wheelslip[2]; + } + if (usbhapticdevice->tyre == REARRIGHT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR) + { + play += simdata->wheelslip[3]; + } + } + break; + case (EFFECT_ABSBRAKES): + play += simdata->abs; + break; + } + + if (play != usbhapticdevice->state) + { + if(play > 0) + { + fprintf(usbhapticdevice->handle, "%i\n", usbhapticdevice->value1); + fflush(usbhapticdevice->handle); + } + else + { + fprintf(usbhapticdevice->handle, "%i\n", usbhapticdevice->value0); + fflush(usbhapticdevice->handle); + + } + usbhapticdevice->state = play; + } + return 0; +} + +int usbhapticdev_free(USBGenericHapticDevice* usbhapticdevice) +{ + slogt("closing usb haptic device"); + fflush(usbhapticdevice->handle); + fclose(usbhapticdevice->handle); + free(usbhapticdevice->dev); + return 0; +} + +int usbhapticdev_init(USBGenericHapticDevice* usbhapticdevice, DeviceSettings* ds) +{ + int error = 0; + usbhapticdevice->state = 0; + usbhapticdevice->dev = strdup(ds->usbdevsettings.dev); + usbhapticdevice->value0 = ds->usbdevsettings.value0; + usbhapticdevice->value1 = ds->usbdevsettings.value1; + usbhapticdevice->state = usbhapticdevice->value0; + usbhapticdevice->tyre = ds->tyre; + usbhapticdevice->effecttype = ds->effect_type; + + usbhapticdevice->handle = fopen(usbhapticdevice->dev, "w"); + if(usbhapticdevice->handle == 0) + { + error = MONOCOQUE_ERROR_INVALID_DEV; + return error; + } + + slogt("Initializing standalone usb haptic device"); + if(ds->effect_type == EFFECT_TYRESLIP) + { + usbhapticdevice->effecttype = EFFECT_TYRESLIP; + } + if(ds->effect_type == EFFECT_WHEELLOCK) + { + usbhapticdevice->effecttype = EFFECT_WHEELLOCK; + } + + return error; +} diff --git a/src/monocoque/devices/usbhapticdevice.h b/src/monocoque/devices/usbhapticdevice.h new file mode 100644 index 0000000..46e16f1 --- /dev/null +++ b/src/monocoque/devices/usbhapticdevice.h @@ -0,0 +1,35 @@ +#ifndef _USBHAPTICDEVICE_H +#define _USBHAPTICDEVICE_H + +#include +#include "../helper/confighelper.h" +#include "../simulatorapi/simapi/simapi/simdata.h" + + +typedef enum +{ + HAPTIC_UNKNOWN = 0, + HAPTIC_GENERIC = 1 +} +HapticType; + +typedef struct +{ + int id; + HapticType type; + double state; + int value0; + int value1; + VibrationEffectType effecttype; + MonocoqueTyreIdentifier tyre; + FILE* handle; + char* dev; +} +USBGenericHapticDevice; + + +int usbhapticdev_update(USBGenericHapticDevice* hapticdevice, SimData* simdata); +int usbhapticdev_init(USBGenericHapticDevice* hapticdevice, DeviceSettings* ds); +int usbhapticdev_free(USBGenericHapticDevice* hapticdevice); + +#endif