Refactored tyre slip calculations

This commit is contained in:
Paul Dino Jones 2024-06-03 18:42:16 -04:00
parent 01277823ba
commit 1bfe8c94ac
3 changed files with 166 additions and 132 deletions

View File

@ -43,22 +43,22 @@ int sounddev_tyreslip_update(SimDevice* this, SimData* simdata)
SoundDevice* sounddevice = (void *) this->derived; SoundDevice* sounddevice = (void *) this->derived;
double play = 0; double play = 0;
if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR) //if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR)
{ //{
play += (1.0 - simdata->wheelslip[0]); // play += (1.0 - simdata->wheelslip[0]);
} //}
if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR) //if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR)
{ //{
play += (1.0 - simdata->wheelslip[1]); // play += (1.0 - simdata->wheelslip[1]);
} //}
if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR) //if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR)
{ //{
play += (1.0 - simdata->wheelslip[2]); // play += (1.0 - simdata->wheelslip[2]);
} //}
if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR) //if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR)
{ //{
play += (1.0 - simdata->wheelslip[3]); // play += (1.0 - simdata->wheelslip[3]);
} //}
if (play > .40) if (play > .40)
{ {
sounddevice->sounddata.curr_frequency = sounddevice->sounddata.frequency * play; 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; SoundDevice* sounddevice = (void *) this->derived;
double play = 0; double play = 0;
if (simdata->velocity > 0) //if (simdata->velocity > 0)
{ //{
if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR) // if (this->tyre == FRONTLEFT || this->tyre == FRONTS || this->tyre == ALLFOUR)
{ // {
if(simdata->wheelspeed[0]) // if(simdata->wheelspeed[0])
{ // {
play++; // play++;
} // }
} // }
if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR) // if (this->tyre == FRONTRIGHT || this->tyre == FRONTS || this->tyre == ALLFOUR)
{ // {
if(simdata->wheelspeed[1]) // if(simdata->wheelspeed[1])
{ // {
play++; // play++;
} // }
play += simdata->wheelspeed[1]; // play += simdata->wheelspeed[1];
} // }
if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR) // if (this->tyre == REARLEFT || this->tyre == REARS || this->tyre == ALLFOUR)
{ // {
if(simdata->wheelspeed[2]) // if(simdata->wheelspeed[2])
{ // {
play++; // play++;
} // }
play += simdata->wheelspeed[2]; // play += simdata->wheelspeed[2];
} // }
if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR) // if (this->tyre == REARRIGHT || this->tyre == REARS || this->tyre == ALLFOUR)
{ // {
if(simdata->wheelspeed[3]) // if(simdata->wheelspeed[3])
{ // {
play++; // play++;
} // }
} // }
} //}
if (play > 0) if (play > 0)
{ {

View File

@ -8,67 +8,144 @@
#include "../../simulatorapi/simapi/simapi/simdata.h" #include "../../simulatorapi/simapi/simapi/simdata.h"
#include "../../slog/slog.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) int usbhapticdev_update(USBGenericHapticDevice* usbhapticdevice, SimData* simdata)
{ {
double play = 0; double play = 0;
double playthreshhold = 0; double playthreshhold = 0;
double wheelslip[4];
wheelslip[0] = 0;
wheelslip[1] = 0;
wheelslip[2] = 0;
wheelslip[3] = 0;
switch (usbhapticdevice->effecttype) switch (usbhapticdevice->effecttype)
{ {
case (EFFECT_TYRESLIP): 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) 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) 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) 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) if (usbhapticdevice->tyre == REARRIGHT || usbhapticdevice->tyre == REARS || usbhapticdevice->tyre == ALLFOUR)
{ {
play += (1.0 - simdata->wheelslip[3]); if(wheelslip[3] < -.5)
{
play++;
}
} }
break; break;
case (EFFECT_TYRELOCK): case (EFFECT_TYRELOCK):
if (usbhapticdevice->tyre == FRONTLEFT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR)
if (simdata->velocity > 0)
{ {
if (usbhapticdevice->tyre == FRONTLEFT || usbhapticdevice->tyre == FRONTS || usbhapticdevice->tyre == ALLFOUR) if(wheelslip[0] > .75)
{ {
if(simdata->wheelspeed[0]) play++;
{
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++;
}
} }
} }
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; break;
case (EFFECT_ABSBRAKES): case (EFFECT_ABSBRAKES):
play += simdata->abs;
break; break;
} }
@ -76,7 +153,7 @@ int usbhapticdev_update(USBGenericHapticDevice* usbhapticdevice, SimData* simdat
{ {
if(play > playthreshhold) if(play > playthreshhold)
{ {
fprintf(usbhapticdevice->handle, "%i\n", usbhapticdevice->value1); fprintf(usbhapticdevice->handle, "%i\n", usbhapticdevice->value1);
fflush(usbhapticdevice->handle); fflush(usbhapticdevice->handle);
} }
else else

View File

@ -200,6 +200,7 @@ int clilooper(SimDevice* devices, int numdevices, Parameters* p, SimData* simdat
{ {
simdata->rpms=100; simdata->rpms=100;
} }
for (int x = 0; x < numdevices; x++) for (int x = 0; x < numdevices; x++)
{ {
devices[x].update(&devices[x], simdata); devices[x].update(&devices[x], simdata);
@ -238,6 +239,10 @@ int looper(SimDevice* devices, int numdevices, Parameters* p)
SimData* simdata = malloc(sizeof(SimData)); SimData* simdata = malloc(sizeof(SimData));
SimMap* simmap = malloc(sizeof(SimMap)); 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; struct termios newsettings, canonicalmode;
tcgetattr(0, &canonicalmode); tcgetattr(0, &canonicalmode);
@ -324,14 +329,6 @@ int tester(SimDevice* devices, int numdevices)
simdata->rpms = 100; simdata->rpms = 100;
simdata->maxrpm = 8000; simdata->maxrpm = 8000;
simdata->abs = 0; 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); sleep(3);
fprintf(stdout, "Setting rpms to 1000\n"); fprintf(stdout, "Setting rpms to 1000\n");
@ -342,30 +339,6 @@ int tester(SimDevice* devices, int numdevices)
} }
sleep(3); 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"); fprintf(stdout, "Shifting into first gear\n");
simdata->gear = 2; simdata->gear = 2;
for (int x = 0; x < numdevices; x++) for (int x = 0; x < numdevices; x++)
@ -398,22 +371,6 @@ int tester(SimDevice* devices, int numdevices)
} }
sleep(3); 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"); fprintf(stdout, "Shifting into third gear\n");
simdata->gear = 4; simdata->gear = 4;
for (int x = 0; x < numdevices; x++) for (int x = 0; x < numdevices; x++)