From 1bfe8c94ac37347d5fbab70effc0a9bd9d77bc59 Mon Sep 17 00:00:00 2001 From: Paul Dino Jones Date: Mon, 3 Jun 2024 18:42:16 -0400 Subject: [PATCH] Refactored tyre slip calculations --- src/monocoque/devices/sounddevice.c | 98 ++++++++-------- src/monocoque/devices/usbhapticdevice.c | 147 ++++++++++++++++++------ src/monocoque/gameloop/gameloop.c | 53 +-------- 3 files changed, 166 insertions(+), 132 deletions(-) diff --git a/src/monocoque/devices/sounddevice.c b/src/monocoque/devices/sounddevice.c index 3b8bfb7..74a3ae4 100644 --- a/src/monocoque/devices/sounddevice.c +++ b/src/monocoque/devices/sounddevice.c @@ -43,22 +43,22 @@ int sounddev_tyreslip_update(SimDevice* this, SimData* simdata) SoundDevice* sounddevice = (void *) this->derived; double play = 0; - if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR) - { - play += (1.0 - simdata->wheelslip[0]); - } - if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR) - { - play += (1.0 - simdata->wheelslip[1]); - } - if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR) - { - play += (1.0 - simdata->wheelslip[2]); - } - if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR) - { - play += (1.0 - simdata->wheelslip[3]); - } + //if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR) + //{ + // play += (1.0 - simdata->wheelslip[0]); + //} + //if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR) + //{ + // play += (1.0 - simdata->wheelslip[1]); + //} + //if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR) + //{ + // play += (1.0 - simdata->wheelslip[2]); + //} + //if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR) + //{ + // play += (1.0 - simdata->wheelslip[3]); + //} if (play > .40) { sounddevice->sounddata.curr_frequency = sounddevice->sounddata.frequency * play; @@ -76,39 +76,39 @@ int sounddev_tyrelock_update(SimDevice* this, SimData* simdata) SoundDevice* sounddevice = (void *) this->derived; double play = 0; - if (simdata->velocity > 0) - { - if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR) - { - if(simdata->wheelspeed[0]) - { - play++; - } - } - if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR) - { - if(simdata->wheelspeed[1]) - { - play++; - } - play += simdata->wheelspeed[1]; - } - if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR) - { - if(simdata->wheelspeed[2]) - { - play++; - } - play += simdata->wheelspeed[2]; - } - if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR) - { - if(simdata->wheelspeed[3]) - { - play++; - } - } - } + //if (simdata->velocity > 0) + //{ + // if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR) + // { + // if(simdata->wheelspeed[0]) + // { + // play++; + // } + // } + // if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR) + // { + // if(simdata->wheelspeed[1]) + // { + // play++; + // } + // play += simdata->wheelspeed[1]; + // } + // if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR) + // { + // if(simdata->wheelspeed[2]) + // { + // play++; + // } + // play += simdata->wheelspeed[2]; + // } + // if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR) + // { + // if(simdata->wheelspeed[3]) + // { + // play++; + // } + // } + //} if (play > 0) { diff --git a/src/monocoque/devices/usbhapticdevice.c b/src/monocoque/devices/usbhapticdevice.c index 04dcb26..04415f3 100644 --- a/src/monocoque/devices/usbhapticdevice.c +++ b/src/monocoque/devices/usbhapticdevice.c @@ -8,67 +8,144 @@ #include "../../simulatorapi/simapi/simapi/simdata.h" #include "../../slog/slog.h" +bool hasTyreDiameter(SimData* simdata) +{ + if (simdata->tyrediameter[0] == -1 || simdata->tyrediameter[1] == -1 || simdata->tyrediameter[2] == -1 || simdata->tyrediameter[3] == -1) + { + return false; + } + return true; +} + +void getTyreDiameter(SimData* simdata) +{ + if(simdata->velocity > 50 && simdata->brake <= 0 && simdata->gas <= 0) + { + if (simdata->velocityX/simdata->velocity < 0.001) + { + double Speedms = 0.277778 * simdata->velocity; + for(int i = 0; i < 4; i++) + { + simdata->tyrediameter[i] = Speedms / simdata->tyreRPS[i] * 2; + } + slogi("Successfully set tyre diameters for wheel slip effects."); + } + + } +} + + int usbhapticdev_update(USBGenericHapticDevice* usbhapticdevice, SimData* simdata) { double play = 0; double playthreshhold = 0; + double wheelslip[4]; + wheelslip[0] = 0; + wheelslip[1] = 0; + wheelslip[2] = 0; + wheelslip[3] = 0; + + switch (usbhapticdevice->effecttype) { case (EFFECT_TYRESLIP): - playthreshhold = .4; + case (EFFECT_TYRELOCK): + case (EFFECT_ABSBRAKES): + + if(hasTyreDiameter(simdata)==false) + { + getTyreDiameter(simdata); + } + if(hasTyreDiameter(simdata)==true) + { + double Speedms = 0.277778 * simdata->velocity; + if (Speedms > 0.5) + { + for(int i = 0; i < 4; i++) + { + wheelslip[i] = (Speedms - simdata->tyrediameter[i] * simdata->tyreRPS[i] / 2) / Speedms; + } + } + else + { + for(int i = 0; i < 4; i++) + { + wheelslip[i] = 0; + } + } + + } + break; + } + + switch (usbhapticdevice->effecttype) + { + case (EFFECT_TYRESLIP): + + if (usbhapticdevice->tyre == FRONTLEFT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR) { - play += (1.0 - simdata->wheelslip[0]); + if(wheelslip[0] < -.5) + { + play++; + } } if (usbhapticdevice->tyre == FRONTRIGHT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR) { - play += (1.0 - simdata->wheelslip[1]); + if(wheelslip[1] < -.5) + { + play++; + } } if (usbhapticdevice->tyre == REARLEFT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR) { - play += (1.0 - simdata->wheelslip[2]); + if(wheelslip[2] < -.5) + { + play++; + } } if (usbhapticdevice->tyre == REARRIGHT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR) { - play += (1.0 - simdata->wheelslip[3]); + if(wheelslip[3] < -.5) + { + play++; + } } + + break; case (EFFECT_TYRELOCK): - - if (simdata->velocity > 0) + if (usbhapticdevice->tyre == FRONTLEFT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR) { - if (usbhapticdevice->tyre == FRONTLEFT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR) + if(wheelslip[0] > .75) { - if(simdata->wheelspeed[0]) - { - play++; - } - } - if (usbhapticdevice->tyre == FRONTRIGHT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR) - { - if(simdata->wheelspeed[1]) - { - play++; - } - } - if (usbhapticdevice->tyre == REARLEFT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR) - { - if(simdata->wheelspeed[2]) - { - play++; - } - } - if (usbhapticdevice->tyre == REARRIGHT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR) - { - if(simdata->wheelspeed[3]) - { - play++; - } + play++; } } + if (usbhapticdevice->tyre == FRONTRIGHT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR) + { + if(wheelslip[1] > .75) + { + play++; + } + } + if (usbhapticdevice->tyre == REARLEFT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR) + { + if(wheelslip[2] > .75) + { + play++; + } + } + if (usbhapticdevice->tyre == REARRIGHT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR) + { + if(wheelslip[3] > .75) + { + play++; + } + } + break; case (EFFECT_ABSBRAKES): - play += simdata->abs; break; } @@ -76,7 +153,7 @@ int usbhapticdev_update(USBGenericHapticDevice* usbhapticdevice, SimData* simdat { if(play > playthreshhold) { - fprintf(usbhapticdevice->handle, "%i\n", usbhapticdevice->value1); + fprintf(usbhapticdevice->handle, "%i\n", usbhapticdevice->value1); fflush(usbhapticdevice->handle); } else diff --git a/src/monocoque/gameloop/gameloop.c b/src/monocoque/gameloop/gameloop.c index 50c6d5d..b726ea1 100644 --- a/src/monocoque/gameloop/gameloop.c +++ b/src/monocoque/gameloop/gameloop.c @@ -200,6 +200,7 @@ int clilooper(SimDevice* devices, int numdevices, Parameters* p, SimData* simdat { simdata->rpms=100; } + for (int x = 0; x < numdevices; x++) { devices[x].update(&devices[x], simdata); @@ -238,6 +239,10 @@ int looper(SimDevice* devices, int numdevices, Parameters* p) SimData* simdata = malloc(sizeof(SimData)); SimMap* simmap = malloc(sizeof(SimMap)); + simdata->tyrediameter[0] = -1; + simdata->tyrediameter[1] = -1; + simdata->tyrediameter[2] = -1; + simdata->tyrediameter[3] = -1; struct termios newsettings, canonicalmode; tcgetattr(0, &canonicalmode); @@ -324,14 +329,6 @@ int tester(SimDevice* devices, int numdevices) simdata->rpms = 100; simdata->maxrpm = 8000; simdata->abs = 0; - simdata->wheelslip[0] = 1; - simdata->wheelslip[1] = 1; - simdata->wheelslip[2] = 1; - simdata->wheelslip[3] = 1; - simdata->wheelspeed[0] = 100; - simdata->wheelspeed[1] = 100; - simdata->wheelspeed[2] = 100; - simdata->wheelspeed[3] = 100; sleep(3); fprintf(stdout, "Setting rpms to 1000\n"); @@ -342,30 +339,6 @@ int tester(SimDevice* devices, int numdevices) } sleep(3); - fprintf(stdout, "Setting ABS to 1\n"); - simdata->abs = 1; - for (int x = 0; x < numdevices; x++) - { - devices[x].update(&devices[x], simdata); - } - sleep(3); - simdata->abs = 0; - - fprintf(stdout, "Setting Wheelslip to 0, no traction\n"); - simdata->wheelslip[0] = 0; - simdata->wheelslip[1] = 0; - simdata->wheelslip[2] = 0; - simdata->wheelslip[3] = 0; - for (int x = 0; x < numdevices; x++) - { - devices[x].update(&devices[x], simdata); - } - sleep(3); - simdata->wheelslip[0] = 1; - simdata->wheelslip[1] = 1; - simdata->wheelslip[2] = 1; - simdata->wheelslip[3] = 1; - fprintf(stdout, "Shifting into first gear\n"); simdata->gear = 2; for (int x = 0; x < numdevices; x++) @@ -398,22 +371,6 @@ int tester(SimDevice* devices, int numdevices) } sleep(3); - fprintf(stdout, "Setting Wheelspeed to 0, wheels locked at speed.\n"); - simdata->wheelspeed[0] = 0; - simdata->wheelspeed[1] = 0; - simdata->wheelspeed[2] = 0; - simdata->wheelspeed[3] = 0; - for (int x = 0; x < numdevices; x++) - { - devices[x].update(&devices[x], simdata); - } - sleep(3); - simdata->wheelspeed[0] = 100; - simdata->wheelspeed[1] = 100; - simdata->wheelspeed[2] = 100; - simdata->wheelspeed[3] = 100; - - fprintf(stdout, "Shifting into third gear\n"); simdata->gear = 4; for (int x = 0; x < numdevices; x++)