From a81004418dda6e7f59cd560a546ff55adb670386 Mon Sep 17 00:00:00 2001 From: Paul Dino Jones Date: Mon, 16 Sep 2024 16:14:18 -0400 Subject: [PATCH] Support for cammus c12 --- src/monocoque/devices/CMakeLists.txt | 2 + src/monocoque/devices/usb/wheels/cammusc12.c | 86 ++++++++++++++++++++ src/monocoque/devices/usb/wheels/cammusc12.h | 10 +++ src/monocoque/devices/wheeldevice.c | 28 ++++++- src/monocoque/devices/wheeldevice.h | 3 +- src/monocoque/helper/confighelper.c | 28 +++++++ src/monocoque/helper/confighelper.h | 9 ++ 7 files changed, 162 insertions(+), 4 deletions(-) create mode 100644 src/monocoque/devices/usb/wheels/cammusc12.c create mode 100644 src/monocoque/devices/usb/wheels/cammusc12.h diff --git a/src/monocoque/devices/CMakeLists.txt b/src/monocoque/devices/CMakeLists.txt index d61ef38..2522e24 100644 --- a/src/monocoque/devices/CMakeLists.txt +++ b/src/monocoque/devices/CMakeLists.txt @@ -23,6 +23,8 @@ set(devices_source_files usb/cslelitev3.c usb/wheels/cammusc5.h usb/wheels/cammusc5.c + usb/wheels/cammusc12.h + usb/wheels/cammusc12.c sound/usb_generic_shaker.h sound/usb_generic_shaker.c sound/usb_generic_shaker_pulse.c diff --git a/src/monocoque/devices/usb/wheels/cammusc12.c b/src/monocoque/devices/usb/wheels/cammusc12.c new file mode 100644 index 0000000..31b7588 --- /dev/null +++ b/src/monocoque/devices/usb/wheels/cammusc12.c @@ -0,0 +1,86 @@ +#include +#include + +#include + +#include "cammusc12.h" +#include "../../../slog/slog.h" + +const int cammusc12_hidupdate_buf_size = 16; + +int cammusc12_update(WheelDevice* wheeldevice, int maxrpm, int rpm, int gear, int velocity) +{ + + int res = 0; + + unsigned char bytes[cammusc12_hidupdate_buf_size]; + + for (int x = 0; x < cammusc12_hidupdate_buf_size; x++) + { + bytes[x] = 0x00; + } + // byte 1 must be fc it seems + bytes[0] = 0xFA; + bytes[1] = 0xFB; + bytes[2] = 0xD4; + + int perct = 0; + if(rpm > 0 && maxrpm > 0) + { + double rpmperct = (double) rpm / (double) maxrpm; + perct = trunc(nearbyint( rpmperct * 100 )); + } + bytes[3] = perct; + + // bytes 2 and 3 are a 16 bit velocity + if ( velocity > 0 ) + { + bytes[4] = (velocity >> 8) & 0xFF; + bytes[5] = velocity & 0xFF; + } + + // byte 4 is gear + bytes[6] = gear-1; + + slogt("writing bytes x%02xx%02xx%02xx%02xx%02x%02x%02x from rpm %i velocity %i gear %i", bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], rpm, velocity, gear); + if (wheeldevice->handle) + { + res = hid_write(wheeldevice->handle, bytes, cammusc12_hidupdate_buf_size); + } + else + { + slogd("no handle"); + } + + return res; +} + +int cammusc12_free(WheelDevice* wheeldevice) +{ + int res = 0; + + hid_close(wheeldevice->handle); + res = hid_exit(); + + return res; +} + +int cammusc12_init(WheelDevice* wheeldevice) +{ + slogi("initializing cammus c12 wheel..."); + + int res = 0; + + res = hid_init(); + + wheeldevice->handle = hid_open(0x3416, 0x1023, NULL); + + if (!wheeldevice->handle) + { + sloge("Could not find attached Cammus C12 Wheel"); + res = hid_exit(); + return 1; + } + slogd("Found Cammus C12 Wheel..."); + return res; +} diff --git a/src/monocoque/devices/usb/wheels/cammusc12.h b/src/monocoque/devices/usb/wheels/cammusc12.h new file mode 100644 index 0000000..004a234 --- /dev/null +++ b/src/monocoque/devices/usb/wheels/cammusc12.h @@ -0,0 +1,10 @@ +#ifndef _CAMMUSC12_H +#define _CAMMUSC12_H + +#include "../../wheeldevice.h" + +int cammusc12_update(WheelDevice* wheeldevice, int maxrpm, int rpm, int gear, int velocity); +int cammusc12_init(WheelDevice* wheeldevice); +int cammusc12_free(WheelDevice* wheeldevice); + +#endif diff --git a/src/monocoque/devices/wheeldevice.c b/src/monocoque/devices/wheeldevice.c index 37a63f6..de2e8ee 100644 --- a/src/monocoque/devices/wheeldevice.c +++ b/src/monocoque/devices/wheeldevice.c @@ -3,6 +3,7 @@ #include #include "usb/wheels/cammusc5.h" +#include "usb/wheels/cammusc12.h" #include "wheeldevice.h" #include "../helper/confighelper.h" #include "../simulatorapi/simapi/simapi/simdata.h" @@ -16,6 +17,9 @@ int wheeldev_update(WheelDevice* wheeldevice, SimData* simdata) case WHEELDEV_CAMMUSC5 : cammusc5_update(wheeldevice, simdata->maxrpm, simdata->rpms, simdata->gear, simdata->velocity); break; + case WHEELDEV_CAMMUSC12 : + cammusc12_update(wheeldevice, simdata->maxrpm, simdata->rpms, simdata->gear, simdata->velocity); + break; } @@ -31,6 +35,10 @@ int wheeldev_free(WheelDevice* wheeldevice) cammusc5_update(wheeldevice, 0, 0, 0, 0); cammusc5_free(wheeldevice); break; + case WHEELDEV_CAMMUSC12 : + cammusc12_update(wheeldevice, 0, 0, 0, 0); + cammusc12_free(wheeldevice); + break; } return 0; @@ -41,11 +49,25 @@ int wheeldev_init(WheelDevice* wheeldevice, DeviceSettings* ds) slogi("initializing wheel device..."); int error = 0; // detection of wheel model - wheeldevice->type = WHEELDEV_UNKNOWN; - wheeldevice->type = WHEELDEV_CAMMUSC5; + switch (ds->dev_subsubtype) { - error = cammusc5_init(wheeldevice); + case SIMDEVSUBTYPE_CAMMUSC5: + wheeldevice->type = WHEELDEV_CAMMUSC5; + slogi("Attempting to initialize cammus C5"); + error = cammusc5_init(wheeldevice); + break; + case SIMDEVSUBTYPE_CAMMUSC12: + wheeldevice->type = WHEELDEV_CAMMUSC12; + slogi("Attempting to initialize cammus C12"); + error = cammusc12_init(wheeldevice); + break; + default: + wheeldevice->type = WHEELDEV_UNKNOWN; + slogw("Unknown cammus wheel detected, trying C5"); + error = cammusc5_init(wheeldevice); + break; + } return error; } diff --git a/src/monocoque/devices/wheeldevice.h b/src/monocoque/devices/wheeldevice.h index f4f75df..e6f69d4 100644 --- a/src/monocoque/devices/wheeldevice.h +++ b/src/monocoque/devices/wheeldevice.h @@ -10,7 +10,8 @@ typedef enum { WHEELDEV_UNKNOWN = 0, - WHEELDEV_CAMMUSC5 = 1 + WHEELDEV_CAMMUSC5 = 1, + WHEELDEV_CAMMUSC12 = 2 } WheelType; diff --git a/src/monocoque/helper/confighelper.c b/src/monocoque/helper/confighelper.c index b3fef37..fbe6298 100644 --- a/src/monocoque/helper/confighelper.c +++ b/src/monocoque/helper/confighelper.c @@ -95,6 +95,21 @@ int strtoeffecttype(const char* effect, DeviceSettings* ds) return MONOCOQUE_ERROR_NONE; } +int strtodevsubsubtype(const char* device_subsubtype, DeviceSettings* ds) +{ + ds->dev_subsubtype = SIMDEVSUBTYPE_UNKNOWN; + + if (strcicmp(device_subsubtype, "CammusC5") == 0) + { + ds->dev_subsubtype = SIMDEVSUBTYPE_CAMMUSC5; + } + if (strcicmp(device_subsubtype, "CammusC12") == 0) + { + ds->dev_subsubtype = SIMDEVSUBTYPE_CAMMUSC12; + } + return MONOCOQUE_ERROR_NONE; +} + int strtodevsubtype(const char* device_subtype, DeviceSettings* ds, int simdev) { ds->is_valid = false; @@ -463,6 +478,19 @@ int devsetup(const char* device_type, const char* device_subtype, const char* co // logic for different devices } + if (ds->dev_subtype == SIMDEVTYPE_USBWHEEL) + { + // logic for different devices + int b = 0; + + const char* temp; + int found = config_setting_lookup_string(device_settings, "subtype", &temp); + if(temp != NULL && found > 0) + { + b = strtodevsubsubtype(temp, ds); + } + } + if (ds->dev_subtype == SIMDEVTYPE_USBHAPTIC || ds->dev_type == SIMDEV_SOUND || ds->dev_subtype == SIMDEVTYPE_SERIALHAPTIC) { slogt("analysing haptic effect settings"); diff --git a/src/monocoque/helper/confighelper.h b/src/monocoque/helper/confighelper.h index 6ec6a8e..fb0c6d9 100644 --- a/src/monocoque/helper/confighelper.h +++ b/src/monocoque/helper/confighelper.h @@ -30,6 +30,14 @@ typedef enum } DeviceSubType; +typedef enum +{ + SIMDEVSUBTYPE_UNKNOWN = 0, + SIMDEVSUBTYPE_CAMMUSC5 = 1, + SIMDEVSUBTYPE_CAMMUSC12 = 2, +} +DeviceSubSubType; + typedef enum { @@ -169,6 +177,7 @@ typedef struct bool is_valid; DeviceType dev_type; DeviceSubType dev_subtype; + DeviceSubSubType dev_subsubtype; // to get really fancy move the effect information to it's own structure that would be a member of // any device settings member structure that can carry an effect VibrationEffectType effect_type;