From 77a93683070295d16df2f7fae817ab30a57750f3 Mon Sep 17 00:00:00 2001 From: Paul Dino Jones Date: Thu, 6 Jun 2024 21:42:08 +0000 Subject: [PATCH] Refactor implementation of CSL Elite V3 Pedals --- src/monocoque/devices/CMakeLists.txt | 2 + src/monocoque/devices/usb/cslelitev3.c | 85 +++++++++++++++++++++++++ src/monocoque/devices/usb/cslelitev3.h | 8 +++ src/monocoque/devices/usbhapticdevice.c | 31 +++++---- src/monocoque/devices/usbhapticdevice.h | 4 +- 5 files changed, 116 insertions(+), 14 deletions(-) create mode 100644 src/monocoque/devices/usb/cslelitev3.c create mode 100644 src/monocoque/devices/usb/cslelitev3.h diff --git a/src/monocoque/devices/CMakeLists.txt b/src/monocoque/devices/CMakeLists.txt index 60451cd..e4ca55f 100644 --- a/src/monocoque/devices/CMakeLists.txt +++ b/src/monocoque/devices/CMakeLists.txt @@ -17,6 +17,8 @@ set(devices_source_files sound.c usb/revburner.h usb/revburner.c + usb/cslelitev3.h + usb/cslelitev3.c sound/usb_generic_shaker.h sound/usb_generic_shaker.c sound/usb_generic_shaker_pulse.c diff --git a/src/monocoque/devices/usb/cslelitev3.c b/src/monocoque/devices/usb/cslelitev3.c new file mode 100644 index 0000000..c660577 --- /dev/null +++ b/src/monocoque/devices/usb/cslelitev3.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include + +#include "usbhapticdevice.h" + +#include "../slog/slog.h" + + + +int cslelitev3_update(USBGenericHapticDevice* usbhapticdevice, int value) +{ + + int res = 0; + + fprintf(usbhapticdevice->handle, "%i\n", value); + fflush(usbhapticdevice->handle); + + return res; +} + +int cslelitev3_free(USBGenericHapticDevice* usbhapticdevice) +{ + int res = 0; + + free(usbhapticdevice->dev); + + fflush(usbhapticdevice->handle); + fclose(usbhapticdevice->handle); + + return res; +} + +int cslelitev3_init(USBGenericHapticDevice* usbhapticdevice) +{ + slogi("initializing CSL Elite V3 Pedals..."); + + int res = 0; + + + glob_t globlist; + int i = 0; + if (glob("/sys/module/hid_fanatec/drivers/hid:fanatec/0003:0EB7:0005.*/rumble", GLOB_PERIOD, NULL, &globlist) == GLOB_NOSPACE || glob("/sys/module/hid_fanatec/drivers/hid:fanatec/0003:0EB7:0005.*/rumble", GLOB_PERIOD, NULL, &globlist) == GLOB_NOMATCH) + { + res = 1; + } + if (glob("/sys/module/hid_fanatec/drivers/hid:fanatec/0003:0EB7:0005.*/rumble", GLOB_PERIOD, NULL, &globlist) == GLOB_ABORTED) + { + res = 2; + } + if (res == 0) + { + while (globlist.gl_pathv[i]) + { + if (i == 0) + { + usbhapticdevice->dev = strdup(globlist.gl_pathv[i]); + } + i++; + } + } + globfree(&globlist); + + if (res == 1) { + sloge("Could not find attach Club Sport Elite V3 Pedals"); + return res; + } + if (res == 2) { + sloge("Permissions issue finding Club Sport Elite V3 Pedals"); + return res; + } + + usbhapticdevice->handle = fopen(usbhapticdevice->dev, "w"); + + if (!usbhapticdevice->handle) + { + sloge("Could not open pedal device..."); + return res; + } + + slogd("CSL Elite V3 Pedals Successfully initialized..."); + + return res; +} diff --git a/src/monocoque/devices/usb/cslelitev3.h b/src/monocoque/devices/usb/cslelitev3.h new file mode 100644 index 0000000..5744ac2 --- /dev/null +++ b/src/monocoque/devices/usb/cslelitev3.h @@ -0,0 +1,8 @@ +#ifndef _CSLELITEV3_H +#define _CSLELITEV3_H + +int cslelitev3_update(USBGenericHapticDevice* usbhapticdevice, int value); +int cslelitev3_init(USBGenericHapticDevice* usbhapticdevice); +int cslelitev3_free(USBGenericHapticDevice* usbhapticdevice); + +#endif diff --git a/src/monocoque/devices/usbhapticdevice.c b/src/monocoque/devices/usbhapticdevice.c index a0aba4f..d368a48 100644 --- a/src/monocoque/devices/usbhapticdevice.c +++ b/src/monocoque/devices/usbhapticdevice.c @@ -5,6 +5,7 @@ #include "usbhapticdevice.h" #include "hapticeffect.h" +#include "usb/cslelitev3.h" #include "../../helper/confighelper.h" #include "../../simulatorapi/simapi/simapi/simdata.h" #include "../../slog/slog.h" @@ -14,20 +15,16 @@ int usbhapticdev_update(USBGenericHapticDevice* usbhapticdevice, SimData* simdat { int play = slipeffect(simdata, usbhapticdevice->effecttype, usbhapticdevice->tyre, usbhapticdevice->threshold); - if (play != usbhapticdevice->state) { if(play > 0) { - fprintf(usbhapticdevice->handle, "%i\n", usbhapticdevice->value1); - fflush(usbhapticdevice->handle); + cslelitev3_update(usbhapticdevice, usbhapticdevice->value1); } else { - fprintf(usbhapticdevice->handle, "%i\n", usbhapticdevice->value0); - fflush(usbhapticdevice->handle); - + cslelitev3_update(usbhapticdevice, usbhapticdevice->value0); } usbhapticdevice->state = play; } @@ -37,9 +34,7 @@ int usbhapticdev_update(USBGenericHapticDevice* usbhapticdevice, SimData* simdat int usbhapticdev_free(USBGenericHapticDevice* usbhapticdevice) { slogt("closing usb haptic device"); - fflush(usbhapticdevice->handle); - fclose(usbhapticdevice->handle); - free(usbhapticdevice->dev); + cslelitev3_free(usbhapticdevice); return 0; } @@ -47,7 +42,6 @@ int usbhapticdev_init(USBGenericHapticDevice* usbhapticdevice, DeviceSettings* d { 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; @@ -55,14 +49,27 @@ int usbhapticdev_init(USBGenericHapticDevice* usbhapticdevice, DeviceSettings* d usbhapticdevice->effecttype = ds->effect_type; usbhapticdevice->threshold = ds->threshold; - usbhapticdevice->handle = fopen(usbhapticdevice->dev, "w"); + if(ds->effect_type == EFFECT_TYRESLIP) + { + usbhapticdevice->effecttype = EFFECT_TYRESLIP; + } + if(ds->effect_type == EFFECT_TYRELOCK) + { + usbhapticdevice->effecttype = EFFECT_TYRELOCK; + } + + slogi("initializing standalone usb haptic device..."); + // detection of usb device model + usbhapticdevice->type = HAPTIC_UNKNOWN; + usbhapticdevice->type = HAPTIC_CSLELITEV3; + error = cslelitev3_init(usbhapticdevice); + 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; diff --git a/src/monocoque/devices/usbhapticdevice.h b/src/monocoque/devices/usbhapticdevice.h index f86b43d..eb2cfc8 100644 --- a/src/monocoque/devices/usbhapticdevice.h +++ b/src/monocoque/devices/usbhapticdevice.h @@ -8,8 +8,8 @@ typedef enum { - HAPTIC_UNKNOWN = 0, - HAPTIC_GENERIC = 1 + HAPTIC_UNKNOWN = 0, + HAPTIC_CSLELITEV3 = 1 } HapticType;