diff --git a/src/monocoque/gameloop/gameloop.c b/src/monocoque/gameloop/gameloop.c index 915fa92..1fea32c 100644 --- a/src/monocoque/gameloop/gameloop.c +++ b/src/monocoque/gameloop/gameloop.c @@ -115,28 +115,35 @@ int showstats(SimData* simdata) int alt = simdata->altitude; int digits = 0; - while (alt > 0) + if (alt > 0) { - int mod = alt % 10; - alt = alt / 10; - digits++; + while (alt > 0) + { + int mod = alt % 10; + alt = alt / 10; + digits++; + } + alt = simdata->altitude; + int s[digits]; + int digit = 0; + while (alt > 0) + { + int mod = alt % 10; + s[digit] = mod; + alt = alt / 10; + digit++; + } + alt = simdata->altitude; + digit = digits; + while (digit > 0) + { + fputc(s[digit-1]+'0', stdout); + digit--; + } } - alt = simdata->altitude; - int s[digits]; - int digit = 0; - while (alt > 0) + else { - int mod = alt % 10; - s[digit] = mod; - alt = alt / 10; - digit++; - } - alt = simdata->altitude; - digit = digits; - while (digit > 0) - { - fputc(s[digit-1]+'0', stdout); - digit--; + fputc('0', stdout); } fputc(' ', stdout); } diff --git a/src/monocoque/helper/confighelper.c b/src/monocoque/helper/confighelper.c index 7d51f40..82353dc 100644 --- a/src/monocoque/helper/confighelper.c +++ b/src/monocoque/helper/confighelper.c @@ -19,6 +19,11 @@ int strtogame(const char* game, MonocoqueSettings* ms) slogd("Setting simulator to Assetto Corsa"); ms->sim_name = SIMULATOR_ASSETTO_CORSA; } + else if (strcmp(game, "rf2") == 0) + { + slogd("Setting simulator to RFactor 2"); + ms->sim_name = SIMULATOR_RFACTOR2; + } else if (strcmp(game, "test") == 0) { diff --git a/src/monocoque/helper/confighelper.h b/src/monocoque/helper/confighelper.h index 0ef4910..ee1177d 100644 --- a/src/monocoque/helper/confighelper.h +++ b/src/monocoque/helper/confighelper.h @@ -29,7 +29,9 @@ DeviceSubType; typedef enum { SIMULATOR_MONOCOQUE_TEST = 0, - SIMULATOR_ASSETTO_CORSA = 1 + SIMULATOR_ASSETTO_CORSA = 1, + SIMULATOR_RFACTOR = 2, + SIMULATOR_RFACTOR2 = 3 } Simulator; diff --git a/src/monocoque/simulatorapi/rf2.h b/src/monocoque/simulatorapi/rf2.h new file mode 100644 index 0000000..583fe41 --- /dev/null +++ b/src/monocoque/simulatorapi/rf2.h @@ -0,0 +1,21 @@ +#ifndef _RF2_H +#define _RF2_H + +#include +#include "simapi/rf2data.h" + +#define RF2_TELEMETRY_FILE "rFactor2SMMP_Telemetry" +#define RF2_SCORING_FILE "rFactor2SMMP_Scoring" + +typedef struct +{ + bool has_telemetry; + bool has_scoring; + void* telemetry_map_addr; + void* scoring_map_addr; + struct rF2Telemetry rf2_telemetry; + //struct rF2Scoring rf2_scoring; +} +RF2Map; + +#endif diff --git a/src/monocoque/simulatorapi/simmapper.c b/src/monocoque/simulatorapi/simmapper.c index e451106..94d6162 100644 --- a/src/monocoque/simulatorapi/simmapper.c +++ b/src/monocoque/simulatorapi/simmapper.c @@ -2,15 +2,19 @@ #include #include #include +#include +#include #include "simmapper.h" #include "simdata.h" #include "test.h" #include "ac.h" +#include "rf2.h" #include "../helper/confighelper.h" #include "../slog/slog.h" #include "simapi/acdata.h" +#include "simapi/rf2data.h" int simdatamap(SimData* simdata, SimMap* simmap, Simulator simulator) @@ -32,9 +36,19 @@ int simdatamap(SimData* simdata, SimMap* simmap, Simulator simulator) simdata->velocity = simmap->d.ac.ac_physics.speedKmh; simdata->altitude = 1; break; + case SIMULATOR_RFACTOR2 : + memcpy(&simmap->d.rf2.rf2_telemetry, simmap->d.rf2.telemetry_map_addr, sizeof(simmap->d.rf2.rf2_telemetry)); + + simdata->velocity = abs(ceil(simmap->d.rf2.rf2_telemetry.mVehicles[0].mLocalVel.z * 3.6)); + simdata->rpms = ceil(simmap->d.rf2.rf2_telemetry.mVehicles[0].mEngineRPM); + simdata->gear = simmap->d.rf2.rf2_telemetry.mVehicles[0].mGear; + //simdata->gear = simmap->d.rf2.rf2_telemetry.mVehicles[0].mLapNumber; + simdata->maxrpm - ceil(simmap->d.rf2.rf2_telemetry.mVehicles[0].mEngineMaxRPM); + break; } } + int siminit(SimData* simdata, SimMap* simmap, Simulator simulator) { slogi("searching for simulator data..."); @@ -91,6 +105,28 @@ int siminit(SimData* simdata, SimMap* simmap, Simulator simulator) slogi("found data for Assetto Corsa..."); break; + + case SIMULATOR_RFACTOR2 : + + simmap->d.rf2.has_telemetry=false; + simmap->d.rf2.has_scoring=false; + simmap->fd = shm_open(RF2_TELEMETRY_FILE, O_RDONLY, S_IRUSR | S_IWUSR); + if (simmap->fd == -1) + { + slogd("could not open RFactor2 Telemetry engine"); + return MONOCOQUE_ERROR_NODATA; + } + simmap->d.rf2.telemetry_map_addr = mmap(NULL, sizeof(simmap->d.rf2.rf2_telemetry), PROT_READ, MAP_SHARED, simmap->fd, 0); + if (simmap->d.rf2.telemetry_map_addr == MAP_FAILED) + { + slogd("could not retrieve RFactor2 telemetry data"); + return 30; + } + simmap->d.rf2.has_telemetry=true; + + + slogi("found data for RFactor2..."); + break; } return error; diff --git a/src/monocoque/simulatorapi/simmapper.h b/src/monocoque/simulatorapi/simmapper.h index 96ba785..cc3e606 100644 --- a/src/monocoque/simulatorapi/simmapper.h +++ b/src/monocoque/simulatorapi/simmapper.h @@ -2,11 +2,13 @@ #define _SIMMAPPEE_H #include "ac.h" +#include "rf2.h" #include "simdata.h" #include "../helper/confighelper.h" #include "simapi/acdata.h" +#include "simapi/rf2data.h" typedef struct { @@ -15,6 +17,7 @@ typedef struct union { ACMap ac; + RF2Map rf2; } d; } SimMap;