Compare commits

...
6 Commits
Author SHA1 Message Date
MrDavid5465 bd2235dace publish test mode simdata to SIMAPI.DAT shared memory
`monocoque test` used to only drive locally-initialized devices directly,
so external tools that read SIMAPI.DAT the same way a real running sim
populates it (dashboards, telemetry viewers) saw nothing during a test
run. Opens the shared memory segment at the start of tester() and mirrors
each simdata update into it via a new update_devices() helper, which also
replaces the ~20 duplicated inline device-update loops throughout tester()
with a single call site.

On exit the segment is reset to an inactive frame (simon=false,
SIMAPI_STATUS_OFF) rather than left at whatever the last active-play frame
was - otherwise external readers see the test run as a sim that's still
actively driving forever, since nothing writes to SIMAPI.DAT again until
the next test/play run.
2026-08-24 14:52:28 -04:00
Paul Dino Jones 1cd36de5d5 add dependencies required by nappgui to README 2026-08-21 18:27:13 -04:00
Paul Dino Jones 2431113131 update dependencies in debian control file 2026-08-21 18:26:01 -04:00
Paul Dino Jones 722cc4eb4e add curl and glew dependencies 2026-08-21 15:45:43 -04:00
Paul Dino Jones 48baedf202 add glu dependency 2026-08-21 15:26:52 -04:00
Paul Dino Jones fdbae6198b temporarily add libcurl as dependency 2026-08-21 15:19:33 -04:00
7 changed files with 81 additions and 138 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ jobs:
- name: Update apt - name: Update apt
run: sudo apt update run: sudo apt update
- name: Install Dependencies - name: Install Dependencies
run: sudo apt install -y libgtk-3-dev libuv1-dev libargtable2-dev libserialport-dev libconfig-dev libhidapi-dev liblua5.4-dev libxdg-basedir-dev libxml2-dev libpulse-dev libproc2-dev run: sudo apt install -y libgtk-3-dev libuv1-dev libargtable2-dev libserialport-dev libconfig-dev libhidapi-dev liblua5.4-dev libxdg-basedir-dev libxml2-dev libpulse-dev libproc2-dev libcurl4-openssl-dev libglu1-mesa-dev
- name: Set build dir - name: Set build dir
id: strings id: strings
shell: bash shell: bash
+3
View File
@@ -81,6 +81,9 @@ for installation instructions***
- xdg-basedir - xdg-basedir
- lua - lua
- libproc2 - libproc2
- libcurl4
- libgtk3
- libglu1-mesa
- [simapi](https://github.com/spacefreak18/simapi) - [simapi](https://github.com/spacefreak18/simapi)
- [slog](https://github.com/kala13x/slog) (static) - [slog](https://github.com/kala13x/slog) (static)
- [nappgui](https://github.com/frang75/nappgui_src) (static) (for GUI) - [nappgui](https://github.com/frang75/nappgui_src) (static) (for GUI)
+73 -133
View File
@@ -4,6 +4,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/mman.h>
#include <poll.h> #include <poll.h>
#include <termios.h> #include <termios.h>
#include <signal.h> #include <signal.h>
@@ -16,6 +17,7 @@
#include "../devices/hapticeffect.h" #include "../devices/hapticeffect.h"
#include "../simulatorapi/simapi/simapi/simdata.h" #include "../simulatorapi/simapi/simapi/simdata.h"
#include "../simulatorapi/simapi/simapi/simmapper.h" #include "../simulatorapi/simapi/simapi/simmapper.h"
#include "../simulatorapi/simapi/simapi/simmap.h"
#include "../slog/slog.h" #include "../slog/slog.h"
#define DEFAULT_UPDATE_RATE 240.0 #define DEFAULT_UPDATE_RATE 240.0
@@ -998,11 +1000,45 @@ void set_wheel_lock_simdata(SimData* simdata)
simdata->tyrediameter[3] = 0.710475735564615; simdata->tyrediameter[3] = 0.710475735564615;
} }
// Drives every initialized device with the current test simdata, then
// mirrors that same simdata into the SIMAPI.DAT shared memory segment (if
// available) so external tools - dashboards, telemetry viewers, anything
// that reads SIMAPI.DAT the same way a real running sim would populate it -
// can follow monocoque's own test sequence instead of seeing nothing.
static void update_devices(SimDevice* devices, int numdevices, SimData* simdata, SimMap* testsimmap)
{
for (int x = 0; x < numdevices; x++)
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
if (testsimmap != NULL && testsimmap->addr != NULL)
{
simdata->mtick++;
memcpy(testsimmap->addr, simdata, sizeof(SimData));
}
}
int tester(SimDevice* devices, int numdevices) int tester(SimDevice* devices, int numdevices)
{ {
slogi("preparing test with %i devices...", numdevices); slogi("preparing test with %i devices...", numdevices);
SimData* simdata = malloc(sizeof(SimData)); SimData* simdata = malloc(sizeof(SimData));
memset(simdata, 0, sizeof(SimData));
simdata->simon = true;
simdata->simstatus = SIMAPI_STATUS_ACTIVEPLAY;
SimMap* testsimmap = malloc(sizeof(SimMap));
memset(testsimmap, 0, sizeof(SimMap));
int shmerr = simapi_universalmap_open(testsimmap, simdata);
if (shmerr != SIMAPI_ERROR_NONE)
{
slog_warn("Could not open shared telemetry memory for test mode (error %i) - test sequence will still drive local devices, but external tools won't see it", shmerr);
free(testsimmap);
testsimmap = NULL;
}
struct termios newsettings, canonicalmode; struct termios newsettings, canonicalmode;
tcgetattr(0, &canonicalmode); tcgetattr(0, &canonicalmode);
@@ -1044,38 +1080,20 @@ int tester(SimDevice* devices, int numdevices)
for (int r = 0; r < 8000; r += 3) for (int r = 0; r < 8000; r += 3)
{ {
simdata->rpms = 1000 + r; simdata->rpms = 1000 + r;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
usleep(1000); usleep(1000);
} }
for (int r = 0; r < 8000; r += 3) for (int r = 0; r < 8000; r += 3)
{ {
simdata->rpms = 9000 - r; simdata->rpms = 9000 - r;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
usleep(1000); usleep(1000);
} }
fprintf(stdout, "Setting rpms to 1000\n"); fprintf(stdout, "Setting rpms to 1000\n");
simdata->rpms = 1000; simdata->rpms = 1000;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Green Flag!\n"); fprintf(stdout, "Green Flag!\n");
@@ -1084,24 +1102,12 @@ int tester(SimDevice* devices, int numdevices)
fprintf(stdout, "Shifting into first gear\n"); fprintf(stdout, "Shifting into first gear\n");
simdata->gear = SIMAPI_GEAR_FIRST; simdata->gear = SIMAPI_GEAR_FIRST;
simdata->gearc[0] = 0x31; simdata->gearc[0] = 0x31;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Setting speed to 100\n"); fprintf(stdout, "Setting speed to 100\n");
simdata->velocity = 100; simdata->velocity = 100;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "testing wheel spin\n"); fprintf(stdout, "testing wheel spin\n");
@@ -1114,13 +1120,7 @@ int tester(SimDevice* devices, int numdevices)
simdata->tyrediameter[1] = 0.633384434597093; simdata->tyrediameter[1] = 0.633384434597093;
simdata->tyrediameter[2] = 0.710475735564615; simdata->tyrediameter[2] = 0.710475735564615;
simdata->tyrediameter[3] = 0.710475735564615; simdata->tyrediameter[3] = 0.710475735564615;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Testing wheel Lock\n"); fprintf(stdout, "Testing wheel Lock\n");
@@ -1129,13 +1129,7 @@ int tester(SimDevice* devices, int numdevices)
simdata->tyreRPS[2] = 25; simdata->tyreRPS[2] = 25;
simdata->tyreRPS[3] = 25; simdata->tyreRPS[3] = 25;
simdata->velocity = 150; simdata->velocity = 150;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Shifting into second gear\n"); fprintf(stdout, "Shifting into second gear\n");
@@ -1150,13 +1144,7 @@ int tester(SimDevice* devices, int numdevices)
simdata->abs = 0; simdata->abs = 0;
simdata->gear = SIMAPI_GEAR_SECOND; simdata->gear = SIMAPI_GEAR_SECOND;
simdata->gearc[0] = 0x32; simdata->gearc[0] = 0x32;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Testing abs brake lock Lock\n"); fprintf(stdout, "Testing abs brake lock Lock\n");
@@ -1169,13 +1157,7 @@ int tester(SimDevice* devices, int numdevices)
simdata->tyrediameter[2] = 0.710475735564615; simdata->tyrediameter[2] = 0.710475735564615;
simdata->tyrediameter[3] = 0.710475735564615; simdata->tyrediameter[3] = 0.710475735564615;
simdata->abs = .11; simdata->abs = .11;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Setting speed to 200\n"); fprintf(stdout, "Setting speed to 200\n");
@@ -1189,13 +1171,7 @@ int tester(SimDevice* devices, int numdevices)
simdata->tyrediameter[3] = -1; simdata->tyrediameter[3] = -1;
simdata->abs = 0; simdata->abs = 0;
simdata->velocity = 200; simdata->velocity = 200;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Yellow Flag!\n"); fprintf(stdout, "Yellow Flag!\n");
@@ -1204,24 +1180,12 @@ int tester(SimDevice* devices, int numdevices)
fprintf(stdout, "Shifting into third gear\n"); fprintf(stdout, "Shifting into third gear\n");
simdata->gear = SIMAPI_GEAR_THIRD; simdata->gear = SIMAPI_GEAR_THIRD;
simdata->gearc[0] = 0x33; simdata->gearc[0] = 0x33;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Setting rpms to 2000\n"); fprintf(stdout, "Setting rpms to 2000\n");
simdata->rpms = 2000; simdata->rpms = 2000;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Blue Flag!\n"); fprintf(stdout, "Blue Flag!\n");
@@ -1229,47 +1193,23 @@ int tester(SimDevice* devices, int numdevices)
fprintf(stdout, "Setting rpms to 4000\n"); fprintf(stdout, "Setting rpms to 4000\n");
simdata->rpms = 4000; simdata->rpms = 4000;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Shifting into fourth gear\n"); fprintf(stdout, "Shifting into fourth gear\n");
simdata->gear = SIMAPI_GEAR_FOURTH; simdata->gear = SIMAPI_GEAR_FOURTH;
simdata->gearc[0] = 0x34; simdata->gearc[0] = 0x34;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Setting speed to 300\n"); fprintf(stdout, "Setting speed to 300\n");
simdata->velocity = 300; simdata->velocity = 300;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Setting rpms to 7000\n"); fprintf(stdout, "Setting rpms to 7000\n");
simdata->rpms = 7000; simdata->rpms = 7000;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(3); sleep(3);
fprintf(stdout, "Red Flag!\n"); fprintf(stdout, "Red Flag!\n");
@@ -1277,22 +1217,10 @@ int tester(SimDevice* devices, int numdevices)
fprintf(stdout, "Setting rpms to 8000\n"); fprintf(stdout, "Setting rpms to 8000\n");
simdata->rpms = 8000; simdata->rpms = 8000;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
for(int x = 0; x < 100; x++) for(int x = 0; x < 100; x++)
{ {
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
} }
sleep(3); sleep(3);
@@ -1300,18 +1228,30 @@ int tester(SimDevice* devices, int numdevices)
simdata->rpms = 100; simdata->rpms = 100;
simdata->gear = SIMAPI_GEAR_NEUTRAL; simdata->gear = SIMAPI_GEAR_NEUTRAL;
simdata->gearc[0] = 0x4e; simdata->gearc[0] = 0x4e;
for (int x = 0; x < numdevices; x++) update_devices(devices, numdevices, simdata, testsimmap);
{
if (devices[x].initialized == true)
{
devices[x].update(&devices[x], simdata);
}
}
sleep(1); sleep(1);
fflush(stdout); fflush(stdout);
tcsetattr(0, TCSANOW, &canonicalmode); tcsetattr(0, TCSANOW, &canonicalmode);
// Not shm_unlink()'d - the segment itself stays behind, the same way a
// real sim's shared memory file stays around after that sim exits - but
// its *contents* are reset to an inactive frame first. Leaving the last
// active-play frame in place made every external reader (e.g.
// typiql-tauri) see this test run as a sim that's still actively
// driving forever, since nothing else ever writes to SIMAPI.DAT again
// until the next `monocoque test`/`monocoque play`.
if (testsimmap != NULL)
{
simdata->simon = false;
simdata->simstatus = SIMAPI_STATUS_OFF;
update_devices(devices, numdevices, simdata, testsimmap);
munmap(testsimmap->addr, sizeof(SimData));
close(testsimmap->fd);
free(testsimmap);
}
free(simdata); free(simdata);
return 0; return 0;
@@ -5,4 +5,4 @@ Priority: optional
Architecture: amd64 Architecture: amd64
Maintainer: Paul Jones <paul@spacefreak18.xyz> Maintainer: Paul Jones <paul@spacefreak18.xyz>
Description: Racing Simulator Device Manager Description: Racing Simulator Device Manager
Depends: libpulse0,libconfig11,libargtable2-0,liblua5.4-0,libuv1t64,libserialport0,libxml2,libxdg-basedir1,libhidapi-hidraw0 Depends: libpulse0,libconfig11,libargtable2-0,liblua5.4-0,libuv1t64,libserialport0,libxml2,libxdg-basedir1,libhidapi-hidraw0,libgtk-3-0t64,libcurl4t64,libglu1-mesa
@@ -5,4 +5,4 @@ Priority: optional
Architecture: amd64 Architecture: amd64
Maintainer: Paul Jones <paul@spacefreak18.xyz> Maintainer: Paul Jones <paul@spacefreak18.xyz>
Description: Racing Simulator Device Manager Description: Racing Simulator Device Manager
Depends: libpulse0,libconfig11,libargtable2-0,liblua5.4-0,libuv1t64,libserialport0,libxml2,libxdg-basedir1,libhidapi-hidraw0 Depends: libpulse0,libconfig11,libargtable2-0,liblua5.4-0,libuv1t64,libserialport0,libxml2,libxdg-basedir1,libhidapi-hidraw0,libgtk-3-0t64,libglu1-mesa,libcurl4t64
@@ -5,4 +5,4 @@ Priority: optional
Architecture: amd64 Architecture: amd64
Maintainer: Paul Jones <paul@spacefreak18.xyz> Maintainer: Paul Jones <paul@spacefreak18.xyz>
Description: Racing Simulator Device Manager Description: Racing Simulator Device Manager
Depends: libpulse0,libconfig9,libargtable2-0,liblua5.4-0,libuv1t64,libserialport0,libxml2,libxdg-basedir1,libhidapi-hidraw0 Depends: libpulse0,libconfig9,libargtable2-0,liblua5.4-0,libuv1,libserialport0,libxml2,libxdg-basedir1,libhidapi-hidraw0,libglu1-mesa,libcurl4,libgtk-3-0
+1 -1
View File
@@ -10,7 +10,7 @@ URL: https://spacefreak18.github.io/simapi
Distribution: Fedora Linux Distribution: Fedora Linux
Vendor: spacefreak18 Vendor: spacefreak18
Packager: Paul Jones <paul@spacefreak18.xyz> Packager: Paul Jones <paul@spacefreak18.xyz>
Requires: pulseaudio-libs argtable libconfig hidapi libserialport libuv libxdg-basedir lua-libs libxml2 procps-ng gtk3 Requires: pulseaudio-libs argtable libconfig hidapi libserialport libuv libxdg-basedir lua-libs libxml2 procps-ng gtk3 libcurl mesa-libGL
%description %description
A device manager for Racing sims A device manager for Racing sims