- C 42.1%
- Rust 35.9%
- Makefile 15.6%
- C++ 6.4%
| desktop | [vwr] version bump | |
| nx | [ovl][sys] update ver, fix build | |
| .clang-format | sysmodule that connects and sends with sockets | |
| .gitignore | makefile for whole repo, add lib for common stuff | |
| .gitmodules | repo setup w/templates | |
| LICENSE | readme/license | |
| Makefile | makefile for whole repo, add lib for common stuff | |
| README.md | fix factual accuracy | |
periscope
homebrew solution for nintendo switch input display
simple installation
you can just get prebuilt stuff from the releases page. if you want to build it yourself then read on.
troubleshooting
usually, you can fix the problem by restarting the sysmodule (which you can do from the overlay). if not, feel free to open an issue, contact me on matrix or ask in #periscope in my discord.
current features
- switch sysmodule that grabs inputs
- desktop viewer program that connects to the switch and pulls inputs from the sysmodule
- capture up to 8 players simultaneously (pro controller, dual joy-con, or single joy-con (i think))
- custom skin support
- tesla overlay that shows switch's IP address and allows configuration of which controllers to capture
building
To build this, you will need devkitA64 installed (instructions here) as well as rust and cargo (either from your system package manager or follow instructions here).
if you have devkitA64 and cargo installed properly, you should be able to simply run make in the root of this repository to build the sysmodule, overlay, and desktop viewer.
the viewer binary will be in desktop/target/release/periscope or desktop/target/debug/periscope depending on whether you build a release or debug executable.
the overlay binary will be at nx/overlay/periscope-overlay.ovl. put this in /switch/.overlays/ on your switch SD card. you'll need tesla and ovlloader installed for
it. to open tesla, the default keybinding is L + Dpad Down + RS. from there you can select the option labeled periscope to open periscope's overlay.
the sysmodule will be at nx/sysmodule/sys-scope.nsp. put this file onto your switch SD card at /atmosphere/contents/420000000005C09E/exefs.nsp and put toolbox.json in the same folder. you can start it with ovlSysmodules (another Tesla overlay)
or from inside the periscope overlay itself, which has options to start and restart sys-scope.
running
once you have everything installed on your switch, you can open tesla with L + Dpad down + RS, and then open the periscope overlay. this can be used to start the sysmodule (if it's not already running) as well as to get the IP address of your switch. You can also start the sysmodule with other tools, and figure out your IP from the wifi settings on the switch.
you can download a skin zip file from the releases page, and place it into the configuration directory mentioned in the release page for your platform, or in a folder named skins directly adjacent to the executable.
the config file structure should look like this
< platform config directory >
|-- config.toml (automatically created if missing)
|-- default
| |-- skin.toml
| |-- < images for the skin >
|-- some_other_skin
| |-- skin.toml
| |-- < images for the skin >
when you start periscope on your computer, you will be greeted with a configuration window. type the ip into the box that asks for it, and select your skin, and then click the button to connect to your switch and start capturing inputs.
while capturing inputs, you can press C (default) to return to the config screen, or R (default) to reconnect the viewer to the switch.
configuration can be directly edited in config.toml without the config ui if you wish.
skin configuration
each skin lives in its own directory in the config folder (e.g. ~/.config/periscope/ on linux,
C:\Users\YourUser\AppData\Roaming\periwinkle\periscope\config on windows, /Users/YourUser/Library/Application Support/periwinkle.periscope on mac).
skin directories can also live in a folder named skins that is in the same folder as the executable.
inside this directory is a skin.toml file and every image you need for the skin. you need at least a background image and one other, to use for buttons and joysticks.
each button and joystick can be a different image, if you want. each button/stick has a pos, which is where on the screen it will be displayed. the position refers
to the top left corner of the image. x increases to the right and y towards the bottom, starting at the top left of the window. joysticks also have a range, which is the radius of the circle that the joystick
can travel in on the viewer.
the list of buttons is:
a, b, x, y, plus, minus, zl, zr, l, r, up, down, left, right, ls, rs, lsl, lsr, rsl, rsr
which should be fairly self-explanatory except the last few, which are left and right joycons' SL and SR buttons.
skin.toml looks like this:
background = "bg.png" # file bg.png in the same directory as this file
stick_mode = "stick_on_top" # draw the joysticks above the joystick buttons
# alternatives are "button_on_top" for button above the joystick, and "unified" to draw the button directly over the joystick in position
[player1]
buttons.a = {image = "button.png", pos = {x = 50, y = 50}}
buttons.b = {image = "button.png", pos = {x = 40, y = 60}}
# repeat for each button ...
# unspecified buttons will not be rendered
ls = {image = "stick.png", pos = {x = 100, y = 100}, range = 50}
# repeat for right stick...
# unspecified players will not be rendered
[player2]
# ...
if you leave a button, joystick, or player unconfigured, it simply will not be rendered.