From 42d63ffe899b3b1d3a0ed1f144ddfcfd60d4b579 Mon Sep 17 00:00:00 2001 From: Paul Dino Jones Date: Fri, 12 Jul 2024 20:42:55 -0400 Subject: [PATCH] Fix issues with data not being correctly sent to motors for sim haptic. --- src/arduino/simhaptic/simhaptic.h | 10 +++- src/arduino/simhaptic/simhaptic.ino | 44 +++++++++++----- src/monocoque/devices/serialdevice.c | 29 +++++++++-- src/monocoque/gameloop/gameloop.c | 75 +++++++++++++++------------- 4 files changed, 106 insertions(+), 52 deletions(-) diff --git a/src/arduino/simhaptic/simhaptic.h b/src/arduino/simhaptic/simhaptic.h index d5a393f..a993d77 100755 --- a/src/arduino/simhaptic/simhaptic.h +++ b/src/arduino/simhaptic/simhaptic.h @@ -6,8 +6,14 @@ typedef struct { - int motor; - int effect; + uint32_t motor1; + uint32_t effect1; + uint32_t motor2; + uint32_t effect2; + uint32_t motor3; + uint32_t effect3; + uint32_t motor4; + uint32_t effect4; } SimHapticData; diff --git a/src/arduino/simhaptic/simhaptic.ino b/src/arduino/simhaptic/simhaptic.ino index 89ec2ea..894a786 100644 --- a/src/arduino/simhaptic/simhaptic.ino +++ b/src/arduino/simhaptic/simhaptic.ino @@ -12,8 +12,14 @@ Adafruit_DCMotor *myMotor3 = AFMS.getMotor(3); //Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4); SimHapticData sd; -int effect = 0; -int motor = 15; +int motor1 = 0; +int motor2 = 0; +int motor3 = 0; +int motor4 = 0; +int effect1 = 0; +int effect2 = 0; +int effect3 = 0; +int effect4 = 0; void setup() { Serial.begin(9600); @@ -21,8 +27,10 @@ void setup() { Serial.println("Could not find Motor Shield. Check wiring."); while (1); } - sd.effect = 0; - sd.motor = 15; + sd.motor1 = 0; + sd.motor2 = 0; + sd.motor3 = 0; + sd.motor4 = 0; myMotor1->setSpeed(0); myMotor1->run(FORWARD); @@ -44,24 +52,36 @@ void loop() { { Serial.readBytes(buff, BYTE_SIZE); memcpy(&sd, &buff, BYTE_SIZE); - effect = sd.effect; - motor = sd.motor; + motor1 = sd.motor1; + motor2 = sd.motor2; + motor3 = sd.motor3; + motor4 = sd.motor4; + effect1 = sd.effect1; + effect2 = sd.effect2; + effect3 = sd.effect3; + effect4 = sd.effect4; } - if (motor == 0 || motor == 4 || motor == 7 || motor == 8 || motor == 10 || motor == 11 || motor == 13 || motor == 14) + //if (motor == 0 || motor == 4 || motor == 7 || motor == 8 || motor == 10 || motor == 11 || motor == 13 || motor == 14) + //{ + if (motor1 >= 1) { - myMotor1->setSpeed(effect); + myMotor1->setSpeed(effect1); } + //} //if (motor == 1 || motor == 5 || motor == 7 || motor == 9 || motor == 10 || motor == 11 || motor == 12 || motor == 13) //{ - // myMotor2->setSpeed(v*POWER); + // myMotor2->setSpeed(motor2); //} - if (motor == 2 || motor == 6 || motor == 8 || motor == 9 || motor == 10 || motor == 11 || motor == 12 || motor == 14) + //if (motor == 2 || motor == 6 || motor == 8 || motor == 9 || motor == 10 || motor == 11 || motor == 12 || motor == 14) + //{ + if (motor3 >= 1) { - myMotor3->setSpeed(effect); + myMotor3->setSpeed(effect3); } + //} //if (motor == 3 || motor == 4 || motor == 5 || motor == 6 || motor == 10 || motor == 12 || motor == 13 || motor == 14) //{ - // myMotor4->setSpeed(v*POWER); + // myMotor4->setSpeed(motor4); //} } diff --git a/src/monocoque/devices/serialdevice.c b/src/monocoque/devices/serialdevice.c index 7ecb0d3..4aae379 100644 --- a/src/monocoque/devices/serialdevice.c +++ b/src/monocoque/devices/serialdevice.c @@ -65,15 +65,28 @@ int arduino_simhaptic_update(SimDevice* this, SimData* simdata) double play = slipeffect(simdata, this->hapticeffect.effecttype, this->hapticeffect.tyre, this->hapticeffect.threshold, this->hapticeffect.useconfig, this->hapticeffect.configcheck, this->hapticeffect.tyrediameterconfig); + double rplay = play; if(play > 1.0) { play = 1.0; } - int effectspeed = ceil( 255 * play ); - serialdevice->u.simhapticdata.motor = serialdevice->motorsposition; - serialdevice->u.simhapticdata.effect = effectspeed; - slogt("Updating arduino haptic device speed %i motor code %i", serialdevice->u.simhapticdata.effect, serialdevice->u.simhapticdata.motor); + + int motor = serialdevice->motorsposition; + + if (motor == 0 || motor == 4 || motor == 7 || motor == 8 || motor == 10 || motor == 11 || motor == 13 || motor == 14) + { + serialdevice->u.simhapticdata.effect1 = effectspeed; + serialdevice->u.simhapticdata.motor1 = 1; + slogt("Updating arduino haptic device speed motor speed %i on motor %i from original effect %f", serialdevice->u.simhapticdata.effect1, serialdevice->motorsposition, rplay); + } + if (motor == 2 || motor == 6 || motor == 8 || motor == 9 || motor == 10 || motor == 11 || motor == 12 || motor == 14) + { + serialdevice->u.simhapticdata.effect3 = effectspeed; + serialdevice->u.simhapticdata.motor3 = 1; + slogt("Updating arduino haptic device speed motor speed %i on motor %i from original effect %f", serialdevice->u.simhapticdata.effect3, serialdevice->motorsposition, rplay); + } + size_t size = sizeof(SimHapticData); arduino_update(serialdevice, &serialdevice->u.simhapticdata, size); @@ -135,6 +148,14 @@ SerialDevice* new_serial_device(DeviceSettings* ds, MonocoqueSettings* ms) { case (SIMDEVTYPE_SERIALHAPTIC): this->devicetype = ARDUINODEV__HAPTIC; this->m.vtable = &arduino_simhaptic_vtable; + this->u.simhapticdata.motor1 = 0; + this->u.simhapticdata.motor2 = 0; + this->u.simhapticdata.motor3 = 0; + this->u.simhapticdata.motor4 = 0; + this->u.simhapticdata.effect1 = 0; + this->u.simhapticdata.effect2 = 0; + this->u.simhapticdata.effect3 = 0; + this->u.simhapticdata.effect4 = 0; slogi("Initializing arduino device for haptic effects."); break; } diff --git a/src/monocoque/gameloop/gameloop.c b/src/monocoque/gameloop/gameloop.c index 21729db..a6dc481 100644 --- a/src/monocoque/gameloop/gameloop.c +++ b/src/monocoque/gameloop/gameloop.c @@ -339,10 +339,7 @@ int tester(SimDevice* devices, int numdevices) simdata->tyrediameter[1] = -1; simdata->tyrediameter[2] = -1; simdata->tyrediameter[3] = -1; - simdata->tyrediameter[0] = 0.638636385206394; - simdata->tyrediameter[1] = 0.633384434597093; - simdata->tyrediameter[2] = 0.710475735564615; - simdata->tyrediameter[3] = 0.710475735564615; + sleep(3); fprintf(stdout, "Setting rpms to 1000\n"); @@ -367,22 +364,6 @@ int tester(SimDevice* devices, int numdevices) } sleep(3); - fprintf(stdout, "Testing wheel spin\n"); - simdata->velocity = 20; - simdata->tyreRPS[0] = 133; - simdata->tyreRPS[1] = 133; - simdata->tyreRPS[2] = 133; - simdata->tyreRPS[3] = 133; - simdata->velocity = 100; - for (int x = 0; x < numdevices; x++) - { - if (devices[x].initialized == true) - { - devices[x].update(&devices[x], simdata); - } - } - sleep(3); - fprintf(stdout, "Setting speed to 100\n"); simdata->velocity = 100; for (int x = 0; x < numdevices; x++) @@ -394,22 +375,48 @@ int tester(SimDevice* devices, int numdevices) } sleep(3); - //fprintf(stdout, "Testing wheel spin\n"); - //simdata->tyreRPS[0] = 8000; - //simdata->tyreRPS[1] = 8000; - //simdata->tyreRPS[2] = 8000; - //simdata->tyreRPS[3] = 8000; - //simdata->velocity = 100; - //for (int x = 0; x < numdevices; x++) - //{ - // if (devices[x].initialized == true) - // { - // devices[x].update(&devices[x], simdata); - // } - //} - //sleep(3); + fprintf(stdout, "testing wheel spin\n"); + simdata->tyrediameter[0] = 0.638636385206394; + simdata->tyrediameter[1] = 0.633384434597093; + simdata->tyrediameter[2] = 0.710475735564615; + simdata->tyrediameter[3] = 0.710475735564615; + simdata->tyreRPS[0] = 103; + simdata->tyreRPS[1] = 103; + simdata->tyreRPS[2] = 103; + simdata->tyreRPS[3] = 103; + for (int x = 0; x < numdevices; x++) + { + if (devices[x].initialized == true) + { + devices[x].update(&devices[x], simdata); + } + } + sleep(3); + + fprintf(stdout, "Testing wheel Lock\n"); + simdata->tyreRPS[0] = 50; + simdata->tyreRPS[1] = 50; + simdata->tyreRPS[2] = 50; + simdata->tyreRPS[3] = 50; + simdata->velocity = 100; + for (int x = 0; x < numdevices; x++) + { + if (devices[x].initialized == true) + { + devices[x].update(&devices[x], simdata); + } + } + sleep(3); fprintf(stdout, "Shifting into second gear\n"); + simdata->tyreRPS[0] = 0; + simdata->tyreRPS[1] = 0; + simdata->tyreRPS[2] = 0; + simdata->tyreRPS[3] = 0; + simdata->tyrediameter[0] = -1; + simdata->tyrediameter[1] = -1; + simdata->tyrediameter[2] = -1; + simdata->tyrediameter[3] = -1; simdata->gear = 3; for (int x = 0; x < numdevices; x++) {