Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
d691619
Burn everything and start fresh
loucass003 Mar 17, 2026
e060bc7
Trying to get the basic shape of the state system out. Testing it wit…
loucass003 Mar 17, 2026
01b7b8d
basic handshake
loucass003 Mar 18, 2026
6eb63ce
Tracker data
loucass003 Mar 19, 2026
4fd4997
Logger test
loucass003 Mar 19, 2026
4c1e469
Solarxr start
loucass003 Mar 19, 2026
334be5f
Solaxr datafeed out
loucass003 Mar 20, 2026
a42ed79
Basic config system
loucass003 Mar 23, 2026
af4665e
IPC interface for linux (tested) and windows (untested) - Solarxr / d…
loucass003 Mar 24, 2026
e37a37b
Small optimisations / fixes to make sure couroutines do well and prev…
loucass003 Mar 24, 2026
2235b81
Join datafeed timers on separate coroutine
ImSapphire Mar 24, 2026
ad9bc91
Basic codestyle doc + rename stuff to match it
loucass003 Mar 24, 2026
8531556
Small design guidelines update
loucass003 Mar 25, 2026
8ffd00e
Serial + Serial Flasher
loucass003 Mar 25, 2026
d46fb01
Unit tests + Fix start datafeed behaviour
loucass003 Mar 26, 2026
86dbdbd
OTA updates + Packet processing optimisations + code cleanup
loucass003 Mar 26, 2026
1001b7f
Cleanup
loucass003 Mar 26, 2026
6c4fded
Make ota and serial check for the device status
loucass003 Mar 26, 2026
5946ca1
Better udp and feeder connection handling
loucass003 Mar 26, 2026
fc476a1
Proper handling of the reconnect on ota and serial
loucass003 Mar 26, 2026
ea92fb4
Basic HID support
loucass003 Mar 26, 2026
8168e13
VRC settings (Non tested on windows)
loucass003 Mar 27, 2026
fa1d201
Make vrc config save mute settings to config
loucass003 Mar 27, 2026
9d1e776
Re organise project
loucass003 Mar 27, 2026
38743dc
organise more stuff
loucass003 Mar 27, 2026
df4569f
Format
loucass003 Mar 27, 2026
f65f41a
User height calibration (Non tested)
loucass003 Mar 29, 2026
71b7491
Better logs and ping id sequence for udp devices
loucass003 Mar 30, 2026
e07ef04
batch dispatch together
loucass003 Mar 30, 2026
0ab8052
More position data for devices
loucass003 Mar 30, 2026
dd6c1e7
Lint
loucass003 Mar 30, 2026
17e8717
Remove some console warnings
loucass003 Mar 30, 2026
02ca403
More data for udp trackers
loucass003 Mar 30, 2026
2fc64b3
Lint
loucass003 Mar 30, 2026
2429203
Packets bundling support
loucass003 Mar 30, 2026
a171bc2
More udp tracker data
loucass003 Mar 31, 2026
ae5a8f4
Wifi provisioning V0
loucass003 Apr 8, 2026
4e69262
Wifi Provisioning - Unit tests
loucass003 Apr 8, 2026
bf3168a
Proper tps calculation
loucass003 Apr 8, 2026
5aaade2
Basic skeleton structure
ButterscotchV Apr 2, 2026
d1b96a5
Use body part map for skeleton
ButterscotchV Apr 8, 2026
6266802
Use BodyPart map to make skeleton
ButterscotchV Apr 8, 2026
9c7ca73
Fix naming
ButterscotchV Apr 8, 2026
c5d8968
Tracker tap detection - Basic
loucass003 Apr 8, 2026
ada2ee3
Skeleton experiments
loucass003 Apr 10, 2026
902ab1f
Improved structure for skeleton?
loucass003 Apr 11, 2026
ac07e65
Clenup dead code
loucass003 Apr 11, 2026
918f28d
Simple height calculation from proportions
loucass003 Apr 11, 2026
6db6668
Implement scaled proportions
loucass003 Apr 12, 2026
e2fa7c8
Remove random proportions
loucass003 Apr 12, 2026
4bf1e70
Started implementing checklist / refactored most ipc logic to have tw…
loucass003 Apr 13, 2026
2d6b250
Fix test code
loucass003 Apr 13, 2026
a43ba53
Tracker config + save
loucass003 Apr 13, 2026
b17624d
Fix tracker config not loading back properly + fligtlist checks
loucass003 Apr 13, 2026
a097c26
Implement rest calibration checklist warning
ImSapphire Apr 13, 2026
7d04273
Better readme
loucass003 Apr 13, 2026
fa46f7d
Better readme
loucass003 Apr 13, 2026
18c5d0d
Better readme
loucass003 Apr 13, 2026
db231f3
Send signal strength in datafeed
ImSapphire Apr 13, 2026
acde3a0
Get rid of all the redundant `== true`s
ImSapphire Apr 13, 2026
4113a09
Implement receiving and datafeed sending of tracker mag status
ImSapphire Apr 13, 2026
1775d54
better bootstraping
loucass003 Apr 15, 2026
94e34ca
Fix steps id
loucass003 Apr 15, 2026
984c98f
Cleanup of tests -> update readme in consequence
loucass003 Apr 15, 2026
1185825
Atempt at mag code (untested, incomplete)
loucass003 Apr 15, 2026
b7cd179
Progress on mag crap
loucass003 Apr 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ Now you can open the codebase in [IDEA](https://www.jetbrains.com/idea/download/

### Java (server)

Before contributing to the server, read [server/README.md](server/README.md) for an overview of its architecture and design guidelines.

The Java code is built with `gradle`, a CLI tool that manages java projects and their
dependencies.
- You can run the server by running `./gradlew run` in your IDE's terminal.
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ Latest setup instructions are [in our docs](https://docs.slimevr.dev/server/inde
## Building & Contributing
For information on building and contributing to the codebase, see [CONTRIBUTING.md](CONTRIBUTING.md).

For an overview of the server architecture and design guidelines, see [server/README.md](server/README.md).

## Translating

Translation is done via Pontoon at [i18n.slimevr.dev](https://i18n.slimevr.dev/). Please join our [Discord translation forum](https://discord.com/channels/817184208525983775/1050413434249949235) to coordinate.
Expand Down
8 changes: 5 additions & 3 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@

perSystem = { pkgs, ... }:
let
java = pkgs.javaPackages.compiler.temurin-bin.jdk-24;

runtimeLibs = pkgs: (with pkgs; [
jdk17
java

alsa-lib at-spi2-atk at-spi2-core cairo cups dbus expat
gdk-pixbuf glib gtk3 libdrm libgbm libglvnd libnotify
Expand All @@ -33,8 +35,8 @@
name = "slimevr-env";
targetPkgs = runtimeLibs;
profile = ''
export JAVA_HOME=${pkgs.jdk17}
export PATH="${pkgs.jdk17}/bin:$PATH"
export JAVA_HOME=${java}
export PATH="${java}/bin:$PATH"

# Tell electron-builder to use system tools instead of downloading them
export USE_SYSTEM_FPM=true
Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ buildconfigVersion=6.0.7
# We should probably stop using grgit, see:
# https://andrewoberstar.com/posts/2024-04-02-dont-commit-to-grgit/
grgitVersion=5.3.3
wireVersion=5.3.1
529 changes: 529 additions & 0 deletions server/README.md

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions server/android/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ plugins {

kotlin {
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of(17))
languageVersion.set(JavaLanguageVersion.of(24))
}
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
languageVersion.set(JavaLanguageVersion.of(24))
}
}

Expand Down Expand Up @@ -83,7 +83,7 @@ val deleteTempKeyStore = tasks.register<Delete>("deleteTempKeyStore") {

tasks.withType<KotlinCompile> {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
jvmTarget.set(JvmTarget.JVM_22)
freeCompilerArgs.set(listOf("-Xvalue-classes"))
}
}
Expand Down Expand Up @@ -217,7 +217,7 @@ android {
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_24
targetCompatibility = JavaVersion.VERSION_24
}
}
123 changes: 123 additions & 0 deletions server/architecture.dot
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
digraph module_architecture {
rankdir=TB
splines=false
nodesep=0.8
ranksep=0.8
forcelabels=true
fontname="monospace"
node [fontname="monospace", fontsize=11, style="filled,rounded", shape=box, margin="0.3,0.2"]
edge [fontname="monospace", fontsize=10]

ext [
label="external events\n(packets · messages)"
shape=ellipse fillcolor="#dae8fc" color="#6c8ebf"
]

subgraph cluster_A {
label="Module A"
style="rounded" bgcolor="#fafafa" color="#999999" penwidth=1.5

subgraph cluster_A_beh {
label="Behaviours"
style="dashed" color="#aaaaaa" bgcolor="#fffff8"

bA1 [label="BehaviourA1\n────────────────────\nobserve(receiver)\n subscribes to flows\n calls dispatch()\n────────────────────\nreduce(state, action)\n pure: State -> State"
fillcolor="#fff9db" color="#d6ae00"]

bA2 [label="BehaviourA2\n────────────────────\nobserve(receiver)\n ...\n────────────────────\nreduce(state, action)\n ..."
fillcolor="#fff9db" color="#d6ae00"]

bAmore [label="···\n────────────────────\nobserve(receiver)\n ...\n────────────────────\nreduce(state, action)\n ..."
fillcolor="#fff9db" color="#d6ae00"]
}

foldA [
label="reduce fold\n──────────────────────────────────\nstate = BehaviourA1.reduce(state, a)\nstate = BehaviourA2.reduce(state, a)\nstate = ···"
fillcolor="#d5e8d4" color="#82b366"
]

sfA [
label="StateFlow<StateA>"
shape=cylinder fillcolor="#dae8fc" color="#6c8ebf"
]

}

subgraph cluster_B {
label="Module B"
style="rounded" bgcolor="#fafafa" color="#999999" penwidth=1.5

subgraph cluster_B_beh {
label="Behaviours"
style="dashed" color="#aaaaaa" bgcolor="#fffff8"

bBmore [label="···\n────────────────────\nobserve(receiver)\n ...\n────────────────────\nreduce(state, action)\n ..."
fillcolor="#fff9db" color="#d6ae00"]
}

foldB [
label="reduce fold"
fillcolor="#d5e8d4" color="#82b366"
]

sfB [
label="StateFlow<StateB>"
shape=cylinder fillcolor="#dae8fc" color="#6c8ebf"
]
}

subgraph cluster_C {
label="Module C"
style="rounded" bgcolor="#fafafa" color="#999999" penwidth=1.5

subgraph cluster_C_beh {
label="Behaviours"
style="dashed" color="#aaaaaa" bgcolor="#fffff8"

bCmore [label="···\n────────────────────\nobserve(receiver)\n ...\n────────────────────\nreduce(state, action)\n ..."
fillcolor="#fff9db" color="#d6ae00"]
}

foldC [
label="reduce fold"
fillcolor="#d5e8d4" color="#82b366"
]

sfC [
label="StateFlow<StateC>"
shape=cylinder fillcolor="#dae8fc" color="#6c8ebf"
]

}

// ext -> all modules
ext -> bA1 [color="#6c8ebf" fontcolor="#6c8ebf" weight=1]
ext -> bA2 [color="#6c8ebf" weight=1]
ext -> bAmore [color="#6c8ebf" weight=1]
ext -> bBmore [color="#6c8ebf" weight=1]
ext -> bCmore [color="#6c8ebf" weight=1]

// Module A internal flow
bA1 -> foldA [xlabel="dispatch(action)" color="#d6ae00" fontcolor="#d6ae00"]
bA2 -> foldA [xlabel="dispatch(action)" color="#d6ae00" fontcolor="#d6ae00"]
bAmore -> foldA [xlabel="dispatch(action)" color="#d6ae00" fontcolor="#d6ae00"]
foldA -> sfA [xlabel="new state" color="#82b366" fontcolor="#82b366"]

// Module B internal flow
bBmore -> foldB [xlabel="dispatch(action)" color="#d6ae00" fontcolor="#d6ae00"]
foldB -> sfB [color="#82b366"]

// Module C internal flow
bCmore -> foldC [xlabel="dispatch(action)" color="#d6ae00" fontcolor="#d6ae00"]
foldC -> sfC [color="#82b366"]
// Within-module feedback (gray)
bA1 -> sfA [xlabel="collect()" dir=back style=dashed color="#888888" fontcolor="#888888" constraint=true]
bBmore -> sfB [xlabel="collect()" dir=back style=dashed color="#888888" fontcolor="#888888" constraint=true]
bCmore -> sfC [xlabel="collect()" dir=back style=dashed color="#888888" fontcolor="#888888" constraint=true]


// Cross-module: routed via waypoints at rank 4 — exits downward, travels below all modules
bBmore -> sfA [xlabel="collect()" dir=back style=dashed color="#FF0000" fontcolor="#FF0000" constraint=false]
bCmore -> sfA [xlabel="collect()" dir=back style=dashed color="#FF0000" fontcolor="#FF0000" constraint=false]
bCmore -> sfB [xlabel="collect()" dir=back style=dashed color="#FF0000" fontcolor="#FF0000" constraint=false]
}
Binary file added server/architecture.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading