diff --git a/src/monocoque/devices/CMakeLists.txt b/src/monocoque/devices/CMakeLists.txt index 2522e24..6032d9d 100644 --- a/src/monocoque/devices/CMakeLists.txt +++ b/src/monocoque/devices/CMakeLists.txt @@ -30,6 +30,8 @@ set(devices_source_files sound/usb_generic_shaker_pulse.c serial/arduino.h serial/arduino.c + serial/moza.h + serial/moza.c ) include_directories("." "usb" "sound" "serial") diff --git a/src/monocoque/devices/serial/moza.c b/src/monocoque/devices/serial/moza.c index d172362..690e375 100644 --- a/src/monocoque/devices/serial/moza.c +++ b/src/monocoque/devices/serial/moza.c @@ -1,5 +1,7 @@ #include +#include #include +#include #include @@ -7,10 +9,10 @@ #include "../../slog/slog.h" #define MOZA_TIMEOUT 1000 -#define MOZA_SERIAL_TEMPLATE = {0x7e, 0x06, 0x41, 0x17, 0xfd, 0xde, 0x0, 0x0, 0x0, 0x0, 0x0} -#define MOZA_NUM_AVAILABLE_LEDS = 10 -#define MOZA_BLINKING_BIT = 7 -#define MOZA_MAGIC_VALUE = 0x0d +#define MOZA_SERIAL_TEMPLATE {0x7e, 0x06, 0x41, 0x17, 0xfd, 0xde, 0x0, 0x0, 0x0, 0x0, 0x0} +#define MOZA_NUM_AVAILABLE_LEDS 10 +#define MOZA_BLINKING_BIT 7 +#define MOZA_MAGIC_VALUE 0x0d #define BIT(nr) (1UL << (nr)) unsigned char moza_checksum(unsigned char *data) @@ -24,10 +26,10 @@ unsigned char moza_checksum(unsigned char *data) return 0; } -int moza_update(WheelDevice* wheeldevice, unsigned short maxrpm, unsigned short rpm) +int moza_update(SerialDevice* serialdevice, unsigned short maxrpm, unsigned short rpm) { unsigned char bytes[] = MOZA_SERIAL_TEMPLATE; - int size = sizeof(bytes)/sizeof(bytes[0]) + int size = sizeof(bytes)/sizeof(bytes[0]); if (rpm/maxrpm >= 0.8) bytes[9] |= BIT(0); @@ -69,7 +71,7 @@ int moza_update(WheelDevice* wheeldevice, unsigned short maxrpm, unsigned short if (serialdevice->port) { slogt("copying %i bytes to moza device", size); - result = check(sp_blocking_write(serialdevice->port, bytes, size, MOZA_TIMEOUT)); + result = moza_serial_check(sp_blocking_write(serialdevice->port, bytes, size, MOZA_TIMEOUT)); } return result; @@ -82,34 +84,35 @@ int moza_init(SerialDevice* serialdevice, const char* portdev) char* port_name = strdup(portdev); slogd("Looking for port %s.\n", port_name); - error = check(sp_get_port_by_name(port_name, &serialdevice->port)); + error = moza_serial_check(sp_get_port_by_name(port_name, &serialdevice->port)); if (error != 0) { return error; } slogd("Opening port.\n"); - check(sp_open(serialdevice->port, SP_MODE_READ_WRITE)); + moza_serial_check(sp_open(serialdevice->port, SP_MODE_READ_WRITE)); slogd("Setting port to 115200 8N1, no flow control.\n"); - check(sp_set_baudrate(serialdevice->port, 115200)); - check(sp_set_bits(serialdevice->port, 8)); - check(sp_set_parity(serialdevice->port, SP_PARITY_NONE)); - check(sp_set_stopbits(serialdevice->port, 1)); - check(sp_set_flowcontrol(serialdevice->port, SP_FLOWCONTROL_NONE)); + moza_serial_check(sp_set_baudrate(serialdevice->port, 115200)); + moza_serial_check(sp_set_bits(serialdevice->port, 8)); + moza_serial_check(sp_set_parity(serialdevice->port, SP_PARITY_NONE)); + moza_serial_check(sp_set_stopbits(serialdevice->port, 1)); + moza_serial_check(sp_set_flowcontrol(serialdevice->port, SP_FLOWCONTROL_NONE)); free(port_name); slogd("Successfully setup moza serial device..."); return 0; } -int moza_free(WheelDevice* wheeldevice) +int moza_free(SerialDevice* serialdevice) { - check(sp_close(serialdevice->port)); + moza_serial_check(sp_close(serialdevice->port)); sp_free_port(serialdevice->port); } -int check(enum sp_return result) +// i have to move this some place common +int moza_serial_check(enum sp_return result) { /* For this example we'll just exit on any error by calling abort(). */ char* error_message; @@ -128,10 +131,10 @@ int check(enum sp_return result) //abort(); case SP_ERR_SUPP: printf("Error: Not supported.\n"); - abort(); + //abort(); case SP_ERR_MEM: printf("Error: Couldn't allocate memory.\n"); - abort(); + //abort(); case SP_OK: default: return result; diff --git a/src/monocoque/devices/serial/moza.h b/src/monocoque/devices/serial/moza.h index 3557a4a..e483ac5 100644 --- a/src/monocoque/devices/serial/moza.h +++ b/src/monocoque/devices/serial/moza.h @@ -2,10 +2,12 @@ #define _MOZA_H #include "../serialdevice.h" +#include "../simdevice.h" int moza_update(SerialDevice* serialdevice, unsigned short maxrpm, unsigned short rpm); int moza_init(SerialDevice* serialdevice, const char* portdev); int moza_free(SerialDevice* serialdevice); +int moza_serial_check(enum sp_return result); #endif diff --git a/src/monocoque/devices/serialdevice.c b/src/monocoque/devices/serialdevice.c index 50eefc6..6cf3e13 100644 --- a/src/monocoque/devices/serialdevice.c +++ b/src/monocoque/devices/serialdevice.c @@ -19,15 +19,7 @@ int serialdev_update(SimDevice* this, SimData* simdata) { SerialDevice* serialdevice = (void *) this->derived; - switch (serialdevice->type) - { - case SERIALDEV_MOZA: - moza_update(serialdevice, simdata->maxrpm, simdata->rpms); - break; - - default: - arduino_update(serialdevice, simdata, sizeof(SimData)); - } + arduino_update(serialdevice, simdata, sizeof(SimData)); return 0; } @@ -126,7 +118,6 @@ int arduino_simhaptic_update(SimDevice* this, SimData* simdata) size_t size = sizeof(SimHapticData); arduino_update(serialdevice, &serialdevice->u.simhapticdata, size); - return result; } @@ -134,42 +125,35 @@ int serialdev_free(SimDevice* this) { SerialDevice* serialdevice = (void *) this->derived; - switch (serialdevice->type) - { - case SERIALDEV_MOZA: - moza_free(serialdevice); - break; - - default: - arduino_free(serialdevice); - } - + arduino_free(serialdevice); free(serialdevice); return 0; } -int serialdev_init(SerialDevice* serialdevice, const char* portdev, int motorsposition, int baud) +int serialdev_init(SerialDevice* serialdevice, DeviceSettings* ds) { slogi("initializing serial device..."); int error = 0; - serialdevice->type = SERIALDEV_UNKNOWN; - serialdevice->type = SERIALDEV_ARDUINO; - serialdevice->motorsposition = motorsposition; + serialdevice->motorsposition = ds->serialdevsettings.motorsposition; + serialdevice->baudrate = ds->serialdevsettings.baud; serialdevice->baud = baud; error = arduino_init(serialdevice, portdev); switch (serialdevice->type) { - case SERIALDEV_MOZA: - error = moza_init(serialdevice, portdev); + case SERIALDEV_WHEEL: + + // the wheel stuff assumed it was a usb + //error = wheeldev_init(&serialdevice->u.wheeldevice, ds); + error = moza_init(serialdevice, ds->serialdevsettings.portdev); break; default: - error = arduino_init(serialdevice, portdev, baud); + error = arduino_init(serialdevice, ds->serialdevsettings.portdev, ds->serialdevsettings.baud); } @@ -189,6 +173,7 @@ SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms) { this->m.free = &simdevfree; this->m.derived = this; this->m.vtable = &serial_simdevice_vtable; + this->type = SERIALDEV_ARDUINO; slogt("Attempting to configure arduino device with subtype: %i", ds->dev_subtype); switch (ds->dev_subtype) { @@ -217,6 +202,17 @@ SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms) { this->ampfactor = ds->serialdevsettings.ampfactor; slogi("Initializing arduino device for haptic effects."); break; + case (SIMDEVTYPE_SERIALWHEEL): + this->type = SERIALDEV_WHEEL; + + switch (ds->dev_subsubtype) { + + case SIMDEVSUBTYPE_MOZAR5: + default: + //move this stuff to wheeldevice or it's own serial wheel device module + this->devicetype = SERIALDEV__MOZAR5; + break; + } } if(this->devicetype == ARDUINODEV__HAPTIC) @@ -230,7 +226,7 @@ SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms) { this->m.hapticeffect.tyrediameterconfig = ms->tyre_diameter_config; } - int error = serialdev_init(this, ds->serialdevsettings.portdev, ds->serialdevsettings.motorsposition, ds->serialdevsettings.baud); + int error = serialdev_init(this, ds); if (error != 0) { diff --git a/src/monocoque/devices/serialdevice.h b/src/monocoque/devices/serialdevice.h index a58c85b..af7cbe1 100644 --- a/src/monocoque/devices/serialdevice.h +++ b/src/monocoque/devices/serialdevice.h @@ -2,13 +2,14 @@ #define _SERIALDEVICE_H #include +#include "wheeldevice.h" typedef enum { ARDUINODEV__SHIFTLIGHTS = 0, ARDUINODEV__SIMWIND = 1, ARDUINODEV__HAPTIC = 2, - MOZADEV = 3, + SERIALDEV__MOZAR5 = 3, } SerialDeviceType; diff --git a/src/monocoque/devices/simdevice.h b/src/monocoque/devices/simdevice.h index b6955c4..a545491 100644 --- a/src/monocoque/devices/simdevice.h +++ b/src/monocoque/devices/simdevice.h @@ -38,7 +38,7 @@ typedef enum { SERIALDEV_UNKNOWN = 0, SERIALDEV_ARDUINO = 1, - SERIALDEV_MOZA = 2, + SERIALDEV_WHEEL = 2, } SerialType; @@ -52,6 +52,7 @@ typedef struct SerialDeviceType devicetype; // move these two they only apply to the haptic device int motorsposition; + int baudrate; double ampfactor; double state; union @@ -59,6 +60,7 @@ typedef struct SimWindData simwinddata; SimHapticData simhapticdata; ShiftLightsData shiftlightsdata; + WheelDevice wheeldevice; } u; } SerialDevice; diff --git a/src/monocoque/devices/wheeldevice.c b/src/monocoque/devices/wheeldevice.c index de2e8ee..1bdb1c3 100644 --- a/src/monocoque/devices/wheeldevice.c +++ b/src/monocoque/devices/wheeldevice.c @@ -4,6 +4,7 @@ #include "usb/wheels/cammusc5.h" #include "usb/wheels/cammusc12.h" +#include "serial/moza.h" #include "wheeldevice.h" #include "../helper/confighelper.h" #include "../simulatorapi/simapi/simapi/simdata.h" diff --git a/src/monocoque/devices/wheeldevice.h b/src/monocoque/devices/wheeldevice.h index e6f69d4..f9769d9 100644 --- a/src/monocoque/devices/wheeldevice.h +++ b/src/monocoque/devices/wheeldevice.h @@ -11,7 +11,8 @@ typedef enum { WHEELDEV_UNKNOWN = 0, WHEELDEV_CAMMUSC5 = 1, - WHEELDEV_CAMMUSC12 = 2 + WHEELDEV_CAMMUSC12 = 2, + WHEELDEV_MOZAR5 = 3 } WheelType; @@ -20,6 +21,7 @@ typedef struct int id; WheelType type; hid_device* handle; + char* port; } WheelDevice; diff --git a/src/monocoque/helper/confighelper.c b/src/monocoque/helper/confighelper.c index fbe6298..22122dd 100644 --- a/src/monocoque/helper/confighelper.c +++ b/src/monocoque/helper/confighelper.c @@ -107,6 +107,10 @@ int strtodevsubsubtype(const char* device_subsubtype, DeviceSettings* ds) { ds->dev_subsubtype = SIMDEVSUBTYPE_CAMMUSC12; } + if (strcicmp(device_subsubtype, "MozaR8") == 0) + { + ds->dev_subsubtype = SIMDEVSUBTYPE_MOZAR5; + } return MONOCOQUE_ERROR_NONE; } @@ -149,6 +153,11 @@ int strtodevsubtype(const char* device_subtype, DeviceSettings* ds, int simdev) ds->dev_subtype = SIMDEVTYPE_SERIALHAPTIC; break; } + if (strcicmp(device_subtype, "Wheel") == 0) + { + ds->dev_subtype = SIMDEVTYPE_SERIALWHEEL; + break; + } case SIMDEV_SOUND: ds->is_valid = true; break; diff --git a/src/monocoque/helper/confighelper.h b/src/monocoque/helper/confighelper.h index fb0c6d9..5201297 100644 --- a/src/monocoque/helper/confighelper.h +++ b/src/monocoque/helper/confighelper.h @@ -26,7 +26,8 @@ typedef enum SIMDEVTYPE_SHIFTLIGHTS = 3, SIMDEVTYPE_SIMWIND = 4, SIMDEVTYPE_SERIALHAPTIC = 5, - SIMDEVTYPE_USBWHEEL = 6 + SIMDEVTYPE_USBWHEEL = 6, + SIMDEVTYPE_SERIALWHEEL = 7 } DeviceSubType; @@ -35,6 +36,7 @@ typedef enum SIMDEVSUBTYPE_UNKNOWN = 0, SIMDEVSUBTYPE_CAMMUSC5 = 1, SIMDEVSUBTYPE_CAMMUSC12 = 2, + SIMDEVSUBTYPE_MOZAR5 = 3, } DeviceSubSubType;