Projects/WACCA

Uit Hackerspace Bitlair
Project: WACCA
Beschrijving Bouwen van een WACCA kast
Start 2024-03-01
Contact BlackDragon
Status Beta

Introductie

In Augustus van het mooie jaar 2023 had ik een museum in Zoetermeer bezocht waar een overvloed aan importkasten van Japanse origine staat. Waaronder bekendere spellen zoals Dance Dance Revolution, maar ook minder bekendere spellen zoals maimai, Chunithm en Sound Voltex. Tussen alle spellen, stonden ook twee WACCA-kasten. En die hadden me voor de rest van de middag in de greep. Zo leuk vond ik het. Nadat ik 2 uur nonstop WACCA zat te spelen werd ik het pand werd uitgeschopt; het personeel van het museum wou immers ook naar huis ;). Na die eerste ervaring wou ik dit spel vaker kunnen spelen... Er was alleen het probleem dat een van de weinige WACCA-kasten van Nederland (dat zijn er ondertussen al iets meer geworden) in Zoetermeer staat. Eventjes heen en weer rijden naar Zoetermeer kan natuurlijk niet met een druk school/werkleven. Maar op een bewogen dag hoorde ik ineens van iemand in een arcadehal in Den Bosch dat het mogelijk is arcadeonderdelen te importeren vanuit Japan en hier naartoe te verschepen. En toen ik dat hoorde had ik ineens een idee... :)

Het idee

Nadat ik hoorde dat het mogelijk is om onderdelen online te importeren was ik meteen gaan zoeken op ZenExpress en kwam ik een listing tegen van een complete "ring", bestaande uit 12 "wedges"

Foto van een wedge, bron: redive.world[1]

. Nadat ik 60000 yen had overgemaakt aan de verkoper en 33000 yen had overgemaakt aan UPS kwam mijn pakket, wat in totaal 18kg weegde, in Nederland aan. Met de onderdelen in huis werd mijn idee realiteit. Het idee was om een zogenaamde "controller" te maken, wat niet een volledige arcadekast is, maar enkel de bare essentials om het spel te kunnen spelen.

Uitvoering

Leds

In totaal beschikt de complete ring over 480 leds. Deze zijn opverdeeld over 60 pcb's, waarvan elke wedge over 5 PCB's beschikt. Deze PCB's zijn eenvoudig zelf te produceren[2] en te vervangen[3].

Elke wedge is voorzien van een 5v aansluiting op de wiring harness, vanuit waar de andere pcb's op de wedge ook stroom krijgen. De led-PCB's zijn met de klok mee doorgelust. De WS2812 worden met een FT232H aangestuurd vanuit een dll in het spel genaamd USBIntLED.dll. Van deze DLL heb ik een "dummy" gemaakt die de led data over UDP kan versturen naar een ESP32 met WLED, deze recreatie is hier[4]te vinden. Aanvullend heb ik een visualisatieprogramma gemaakt die de UDP invoer als invoer gebruikt en dit toont in een schermpje op je computer, deze valt hier[5] te vinden.

Screenshot van het visualisatieprogramma

Mijn ring kwamen initieel met 3 kapotte led pcb's. De pcb's hebben een fabricagefout, waarschijnlijk doordat de WS2812 ledjes niet gedroogd zijn na solderen, waardoor de WS2812 ledjes vrij snel en regelmatig kapot gaan. Ik heb op een paar van de pcb's de ledjes geswapt maar heb uiteindelijk toch gekozen om een paar vervangende pcb's te plaatsen. Voor de aansturing in de controller heb ik gekozen om in plaats van een FT232H over USB een ESP32 te plaatsen met WLED om over realtime UDP de led data te versturen. Deze upgrade heb ik gedaan zodat ik led effecten op de ring kan afspelen terwijl het spel/de computer uitstaat. Hiernaast kan ik met deze oplossing ook Hyperion naar de ring streamen, wat erg vet is.

Display

Invoer

Hardware

Communicatie tussen de computer, genaamd de ALLS, en 12 wedges wordt mogelijk gemaakt door een zogenaamde sync board. De ALLS communiceert met 12 wedges via twee syncboards. Elk syncboard pollt zes unitboards via RS485 voor invoergegevens en stuurt dit via RS232 door naar de ALLS, met een polling-frequentie van 125 Hz. De PCB's van de sync boards en unit boards zijn identiek. ...

De unit boards zitten aan de wedges zelf vast, deze had ik dus al. Alleen zijn er geen syncboards meegeleverd, die zitten namelijk op een zogenaamd "IO board", wat een houten plaat is met een 5v voeding, 12v voeding, amplifiers voor de geluid, een zogenaamd IO4 PCB board (837-15257-01), een led controller board (de beruchte FT232H), en ten slotte de syncboards. De meerderheid van deze componenten zijn vrij generiek en vervangbaar. Voor de voeding valt bijvoorbeeld een standaard ATX voeding te gebruiken. De amplifiers zijn ook goed beschikbaar, en de IO4 functionaliteit, wat verantwoordelijk is voor knoppen en een paar ledjes op de kast, wordt al grotendeels met segatools geemuleerd. Nu blijven alleen de twee syncboards over. De syncboards maken gebruik van een proprietair protocol wat nog grotendeels ongedocumenteerd was.

Protocol

Foto van het sniffen van de communicatie tussen syncboard en ALLS

De communicatie tussen de ALLS en de syncboards was al via serial sniffing volledig gereverse-engineered voor gebruik in segatools en WACVR. Deze projecten emuleren de communicatie tussen de ALLS en de syncboards. Met behulp van Shiz en CensoredUsername is de communicatie tussen de syncboards en unitboards gesnift vanuit waar ik vervolgens het protocol kon reverse-engineeren.

Tussen de unitboards en de syncboards wordt er met een snelheid van 921600 baud gecommuniceerd. Elk datapakket heeft de volgende opbouw:

[Adres]
0xE0 + ID (Data van syncboard naar unitboard), of
0xD0 + ID (Data van unitboard richting syncboard).
Het ID komt overeen met de draaischakelaar op het unit board.
[Command ID]
ID van het command
[Variabele data]
Variabele data die bij het commando hoort
Heeft een variabele lengte
[Checksum]
Een eenvoudige XOR-berekening
[Delimiter]
Altijd 0xF0

De belangrijkste commando ID's zijn als volgt:

  • 0xA8/0xA0: (Get Version): Vraagt de firmwareversie (in ASCII) op.
  • 0x94: (Set Thresholds): Stelt de analoge On- en Off-thresholds in voor de touch-detectie.
  • 0x90: (Initialize): Initialiseert het board; het LED-lampje op de unitboard verandert van knipperend naar continu brandend. Dit is vereist om het board te kunnen pollen.
  • 0xA1: (Poll Touch State): Poll-commando voor het uitlezen van de digitale touch-status.

Implementatie

De initiële implementatie van een vervangend onderdeel voor de syncboards verliep allesbehalve soepel. In eerste instantie wilde ik het ontbrekende syncboard omzeilen door vanaf de computer direct via software met de unitboards op de wedges te communiceren.

Deze aanpak werkte wel... maar was verre van optimaal. Achteraf gezien lag dit aan een slechte signal integrity tussen de USB-RS485-transceiver in de computer en de unitboards. Hierdoor ging de helft van de datapakketten verloren, wat het onmogelijk maakte om de data op volledige snelheid binnen te halen. Het maximaal haalbare met deze directe methode was een polling-frequentie van 62,5 Hz. Gevolg hiervan was dat het spel niet consistent door de selftest heen kon komen doordat de geemuleerde syncboards er te lang over deden om te reageren en dus errorde. Deze implementatie valt hier[6] te vinden.

Software

Zonder software is de ring nutteloos. Het spel zelf is verkrijgbaar op archive.org. Hier[7] zijn de .app bestanden te vinden voor elke versie van het spel. .app is een bestandsformaat bedacht door SEGA, wat basically een differential .vhd chain is in een NTFS filesystem wat versleuteld is op een manier die door SEGA zelf is bedacht. Dit formaat valt eenvoudig uit te pakken met deze[8] tool. Maar nu we de game bestanden hebben, kunnen we het spel nog niet zomaar opstarten, spellen op het SEGA platform zijn afhankelijk van de zogenaamde amdaemon. Die natuurlijk niet op de gemiddelde computer werkt door afhankelijkheden die diep in het OS zitten van de ALLS en andere hardware afhankelijkheden zoals de keychip. Gelukkig bestaat er software, genaamd segatools, die de SEGA hardware emuleert en de perfecte omgeving nabootst waar het spel in kan draaien, wat hier[9] te vinden valt.

WACCA zelf is gemaakt in Unreal Engine 4.19. Maar is vrij onstabiel en crasht met de kleinste tegenslagen al. Verwacht dus bij het runnen van het spel dat het (vooral bij het opstarten) vrij regelmatig zal crashen. Ik heb voor het downloaden, voorbereiden van bestanden en uitvoeren van het spel de volgende bash scripts gemaakt[10]. In grote lijnen gebeurt het volgende:

  • De .app bestanden worden met aria2c gedownload vanaf archive.org
  • De .vhd's worden uitgepakt vanuit de .app bestanden met fsdecrypt
  • De "parent names" van de .vhd worden "genormalizeerd" door de waarde van een specifiek pad wat door de ALLS wordt gebruikt naar de "echte" bestandsnaam te veranderen.
  • De differential .vhd chain wordt read-only gemount met vhdimount
  • Het resulterende pad van vhdimount wordt gebruikt als lowerdir voor OverlayFS.
  • Verschillende scripts in "./patches" worden uitgevoerd. Deze scripts zijn verantwoordelijk voor verschillende dingen, zoals:
    Configureren van seriele poorten in wine/proton prefix voor communicatie naar de ring
    Toepassen van binary patches in de .exe van het spel.
    Instellen van segatools
    Engelse vertalingen toepassen op het spel
    Plaatsen van de .dll waarmee led data geredirect wordt naar WLED

Na dit proces is het mogelijk om met umu-launcher het spel te starten. Met als resultaat een werkend spel.

Frame

Upgrades

De toekomst van WACCA