From 6c7c3231a739d99cf6f78aa4312a3dd2d2072d0b Mon Sep 17 00:00:00 2001 From: Paul Dino Jones Date: Tue, 6 Jan 2026 21:14:10 -0500 Subject: [PATCH] Adding support for Logitech G29 Wheel --- src/monocoque/devices/CMakeLists.txt | 2 + .../devices/usb/wheels/logitechg29.c | 98 +++++++++++++++++++ .../devices/usb/wheels/logitechg29.h | 10 ++ src/monocoque/devices/wheeldevice.c | 13 +++ src/monocoque/devices/wheeldevice.h | 3 +- src/monocoque/helper/confighelper.c | 5 + src/monocoque/helper/confighelper.h | 3 +- 7 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 src/monocoque/devices/usb/wheels/logitechg29.c create mode 100644 src/monocoque/devices/usb/wheels/logitechg29.h diff --git a/src/monocoque/devices/CMakeLists.txt b/src/monocoque/devices/CMakeLists.txt index 26e1d69..4375490 100644 --- a/src/monocoque/devices/CMakeLists.txt +++ b/src/monocoque/devices/CMakeLists.txt @@ -25,6 +25,8 @@ set(devices_source_files usb/cslelitev3.c usb/simagicp1000.h usb/simagicp1000.c + usb/wheels/logitechg29.h + usb/wheels/logitechg29.c usb/wheels/cammusc5.h usb/wheels/cammusc5.c usb/wheels/cammusc12.h diff --git a/src/monocoque/devices/usb/wheels/logitechg29.c b/src/monocoque/devices/usb/wheels/logitechg29.c new file mode 100644 index 0000000..79ab95d --- /dev/null +++ b/src/monocoque/devices/usb/wheels/logitechg29.c @@ -0,0 +1,98 @@ +#include +#include + +#include + +#include "logitechg29.h" +#include "../../../slog/slog.h" + +const int logitechg29_hidupdate_buf_size = 7; + +int logitechg29_update(USBDevice* usbdevice, int maxrpm, int rpm, int gear, int velocity) +{ + + int res = 0; + + uint8_t leds = 0; + + float percent = 0; + if(maxrpm > 0) + { + percent = (float) rpm / (float) maxrpm; + + if (percent > .84) + { + leds = 0b11111; + } + else if (percent > .69) + { + leds = 0b1111; + } + else if (percent > .39) + { + leds = 0b111; + } + else if (percent > .19) + { + leds = 0b11; + } + else if (percent > .4) + { + leds = 0b1; + } + else + { + leds = 0b0; + } + } + uint8_t bytes[7] = { + 0xF8, + 0x12, + leds, + 0x00, + 0x00, + 0x00, + 0x01 + }; + + slogt("writing bytes x%02xx%02xx%02xx%02xx%02x from rpm %i", bytes[0], bytes[1], bytes[2], bytes[3], bytes[6], rpm); + if (usbdevice->handle) + { + res = hid_write(usbdevice->handle, bytes, logitechg29_hidupdate_buf_size); + } + else + { + slogd("no handle"); + } + + return res; +} + +int logitechg29_free(USBDevice* usbdevice) +{ + int res = 0; + + hid_close(usbdevice->handle); + res = hid_exit(); + + return res; +} + +int logitechg29_init(USBDevice* usbdevice) +{ + slogi("initializing Logitech G29 wheel..."); + + int res = 0; + + res = hid_init(); + usbdevice->handle = hid_open(0x046D, 0xC24F, NULL); + + if (!usbdevice->handle) + { + sloge("Could not find attached Logitech G29 Wheel"); + res = hid_exit(); + return 1; + } + slogd("Found Logitech G29 Wheel..."); + return res; +} diff --git a/src/monocoque/devices/usb/wheels/logitechg29.h b/src/monocoque/devices/usb/wheels/logitechg29.h new file mode 100644 index 0000000..898b764 --- /dev/null +++ b/src/monocoque/devices/usb/wheels/logitechg29.h @@ -0,0 +1,10 @@ +#ifndef _LOGITECHG29_H +#define _LOGITECHG29_H + +#include "../../simdevice.h" + +int logitechg29_update(USBDevice* wheeldevice, int maxrpm, int rpm, int gear, int velocity); +int logitechg29_init(USBDevice* wheeldevice); +int logitechg29_free(USBDevice* wheeldevice); + +#endif diff --git a/src/monocoque/devices/wheeldevice.c b/src/monocoque/devices/wheeldevice.c index bdeddd8..6f328ee 100644 --- a/src/monocoque/devices/wheeldevice.c +++ b/src/monocoque/devices/wheeldevice.c @@ -2,6 +2,7 @@ #include #include +#include "usb/wheels/logitechg29.h" #include "usb/wheels/cammusc5.h" #include "usb/wheels/cammusc12.h" #include "usb/wheels/gtneo.h" @@ -21,6 +22,9 @@ int wheeldev_update(USBDevice* usbdevice, SimData* simdata) case WHEELDEV_CAMMUSC5 : cammusc5_update(usbdevice, simdata->maxrpm, simdata->rpms, simdata->gear, simdata->velocity); break; + case WHEELDEV_LOGITECHG29 : + logitechg29_update(usbdevice, simdata->maxrpm, simdata->rpms, simdata->gear, simdata->velocity); + break; case WHEELDEV_CAMMUSC12 : if(usbdevice->u.wheeldevice.useLua == true) { @@ -57,6 +61,10 @@ int wheeldev_free(USBDevice* usbdevice) cammusc5_update(usbdevice, 0, 0, 0, 0); cammusc5_free(usbdevice); break; + case WHEELDEV_LOGITECHG29 : + logitechg29_update(usbdevice, 0, 0, 0, 0); + logitechg29_free(usbdevice); + break; case WHEELDEV_CAMMUSC12 : cammusc12_free(usbdevice); if(wheeldevice->useLua == true) @@ -82,6 +90,11 @@ int wheeldev_init(USBDevice* usbdevice, DeviceSettings* ds) slogi("Attempting to initialize cammus C5"); error = cammusc5_init(usbdevice); break; + case SIMDEVSUBTYPE_LOGITECH_G29: + wheeldevice->type = WHEELDEV_LOGITECHG29; + slogi("Attempting to initialize Logitech G29"); + error = logitechg29_init(usbdevice); + break; case SIMDEVSUBTYPE_CAMMUSC12: wheeldevice->type = WHEELDEV_CAMMUSC12; slogi("Attempting to initialize cammus C12"); diff --git a/src/monocoque/devices/wheeldevice.h b/src/monocoque/devices/wheeldevice.h index 7b636b4..182f71f 100644 --- a/src/monocoque/devices/wheeldevice.h +++ b/src/monocoque/devices/wheeldevice.h @@ -12,7 +12,8 @@ typedef enum WHEELDEV_CAMMUSC5 = 1, WHEELDEV_CAMMUSC12 = 2, WHEELDEV_MOZAR5 = 3, - WHEELDEV_SIMAGICGTNEO = 4 + WHEELDEV_SIMAGICGTNEO = 4, + WHEELDEV_LOGITECHG29 = 5 } WheelType; diff --git a/src/monocoque/helper/confighelper.c b/src/monocoque/helper/confighelper.c index 54885d0..3891040 100644 --- a/src/monocoque/helper/confighelper.c +++ b/src/monocoque/helper/confighelper.c @@ -103,6 +103,11 @@ int strtodevsubsubtype(const char* device_subsubtype, DeviceSettings* ds) ds->dev_subsubtype = SIMDEVSUBTYPE_MOZAR5; devfound = true; } + if (strcicmp(device_subsubtype, "LogitechG29") == 0) + { + ds->dev_subsubtype = SIMDEVSUBTYPE_LOGITECH_G29; + devfound = true; + } if (strcicmp(device_subsubtype, "MozaR8") == 0) { ds->dev_subsubtype = SIMDEVSUBTYPE_MOZAR5; diff --git a/src/monocoque/helper/confighelper.h b/src/monocoque/helper/confighelper.h index e041d2d..4555b79 100644 --- a/src/monocoque/helper/confighelper.h +++ b/src/monocoque/helper/confighelper.h @@ -44,7 +44,8 @@ typedef enum SIMDEVSUBTYPE_CSLELITEV3PEDALS = 4, SIMDEVSUBTYPE_SIMAGICP1000PEDALS = 5, SIMDEVSUBTYPE_SIMAGICGTNEO = 6, - SIMDEVSUBTYPE_MOZA_NEW = 7 + SIMDEVSUBTYPE_MOZA_NEW = 7, + SIMDEVSUBTYPE_LOGITECH_G29 = 8 } DeviceSubSubType;