Adding additional events into ES
-
Hi all,
@folly recommended I post this here and look for feedback.
I've just installed a PixelCade into my custom arcade bartop. Integrating it with ES required a custom version of ES which traps when a user changes systems or changes games so it then call REST services exposed by the PixelCade listener in the ES code to update the marquee.
While this approach works, it's not very flexible if you want to change the behavior of the PixelCade or do something totally different, so I re-implemented this capability as events:
system-select - when a system is first displayed or changed. %system_name% %event type% where event type is "gotostart" or "input"
game-select - when a game is selected after going to the system. %system_name% %rom name% %game name%
screensaver-game-select - when playing game videos. %system_name% %rom name% %game name%So now I've written bash scripts that perform the integration to the Pixelcade and dropped them in the respective folders.
This was my user story but it's very flexible. I've seen some message threads where people were asking for a startup event other than autostart.sh because that is executed BEFORE ES is started.
Does anyone else find this functionality useful?
RussellB
-
Here's an example of what you can do with scripting the game-select, game-start and game-end events.
https://www.dropbox.com/s/u46mfyii2gm1yud/20210514_085432.mp4?dl=0
-
That is very cool indeed !
-
@folly So how do I add my changes into the main branch?
-
@RussellB this is really cool! To add your changes to ES, you will need to create a pull request against https://github.com/RetroPie/EmulationStation. So, if you haven't worked with Github before, these are the basic steps you need to follow:
- Fork ES repository in your Github user space.
- Clone ES repo in your system.
- Create a new branch naming it as you wish, e.g.:
game-system-select-events
- Apply changes in your cloned ES repository.
- Commit your changes and push them to Github
- Open a new pull request from the branch in your fork against
retropie:Master
, explaining what you did in the description and following whatever guidelines Retropie has. - Wait for your changes to be approved/merged. Be ready to do whatever changes are required until your code is considered fit for merging.
I know most of what I said here will make no sense if you haven't worked with git and gitHub before, in that case it is better to read something like https://product.hubspot.com/blog/git-and-github-tutorial-for-beginners before diving in.
Good luck!
-
(@svera, nice explanation on the how to ! )
Making these pull requests is very difficult, if you never done this before !
Even I have still trouble understanding it and doing this.
Before going though the process of a pull request, I think, it better to share you code first and make a tutorial for this.
That way more people can look at it and test it and get out the flaws or add ideas to it.
Otherwise you will stuck in doing multiple pull request on all changes you will be making.
My advice, just let it evolve until you are really satisfied, then make a pull request.
As I understand before, you didn't change things on Emulationstation, am I correct ?
So if you want to do a pull request you have to do a pull request to the part you want to integrate it to.If you are planning to do a pull request, it would be nice if you explain the whole process in this thread so everybody can learn from this.
I think @svera can be of more help with this, than I can. -
@folly I just cloned from here: https://github.com/RetroPie/EmulationStation.
I ended up changing six files. I'll post the changes here specifically shortly.
-
@russellb said in Adding additional events into ES:
@folly I just cloned from here: https://github.com/RetroPie/EmulationStation.
I ended up changing six files. I'll post the changes here specifically shortly.
Ok, modified the following files:
Scripting.h :
int fireEvent(const std::string& eventName, const std::string& arg1="", const std::string& arg2="", const std::string& arg3="");
Added a third string variable so I can send "system", "rom name", "game name" as unique parameters. I made it optional so as to not have to change every occurrence.
Scripting.cpp:
if (arg1.length() > 0) { script += " \"" + arg1 + "\""; if (arg2.length() > 0) { script += " \"" + arg2 + "\""; if (arg3.length() > 0) { script += " \"" + arg3 + "\""; } } }
Added putting the third parameter onto the call to the script.
ISimpleGameListView.cpp
#include "Scripting.h" . . . FileData* cursor = getCursor(); SystemData* system = this->mRoot->getSystem(); if (system != NULL) { Scripting::fireEvent("game-select", system->getName(), cursor->getFileName(), cursor->getName()); }
This is at the end of the ::input function to fire the "game-select" event
SystemView.cpp:
#include "Scripting.h" . . . if(config->isMappedLike("left", input) || config->isMappedLike("right", input) || config->isMappedLike("up", input) || config->isMappedLike("down", input)) listInput(0); Scripting::fireEvent("system-select", this->IList::getSelected()->getName(), "input"); if(!UIModeController::getInstance()->isUIModeKid() && config->isMappedTo("select", input) && Settings::getInstance()->getBool("ScreenSaverControls")) { mWindow->startScreenSaver(); mWindow->renderScreenSaver(); return true; }
This is at the end of the ::input function to fire the "system-select" event
ViewController.cpp:
#include "Scripting.h" . . . void ViewController::goToStart() { // If specific system is requested, go directly to the game list auto requestedSystem = Settings::getInstance()->getString("StartupSystem"); if("" != requestedSystem && "retropie" != requestedSystem) { for(auto it = SystemData::sSystemVector.cbegin(); it != SystemData::sSystemVector.cend(); it++){ if ((*it)->getName() == requestedSystem) { goToGameList(*it); Scripting::fireEvent("system-select", requestedSystem, "requestedsystem"); return; } } // Requested system doesn't exist Settings::getInstance()->setString("StartupSystem", ""); } goToSystemView(SystemData::sSystemVector.at(0)); Scripting::fireEvent("system-select", SystemData::sSystemVector.at(0)->getName(), "gotostart"); }
This is the "system-select" event of selecting a system at startup
SystemScreenSaver.cpp:
#include "Scripting.h" . . . void SystemScreenSaver::startScreenSaver() . . . 3 points to call the event "screensaver-game-select"
I didn't want to put all the code here.
Please let me know if you have any questions.
RussellB
-
@russellb the best way to get feedback for your changes is by opening a pull request.
Don't clone from https://github.com/RetroPie/EmulationStation but from your fork, that should be https://github.com/<your github user name>/EmulationStation. Create a branch, make your changes there and push that branch back to https://github.com/<your github user name>/EmulationStation. Once that is done, go to https://github.com/RetroPie/EmulationStation/pulls and open a pull request of the branch in your fork against Retropie's master branch. Refer to my previous post if you need more details.
When you have created the pull request, the changes you made will be reviewed by Retropie's repository maintainers, and if there's something that can be improved they will drop you a comment in the pull request page. Once everything is fine, your changes will be merged against master.
-
-
@folly Ok! Will do.
-
"Like the sauce... it's in there!"
https://edgewatertech.wordpress.com/2008/08/25/web-20-like-prego-spaghetti-sauce-its-in-there/
RussellB (EnsignRutherford)
-
Yes I read your link.
Bottom line everything can be confusing some times.
Did I summarize correct ? ;-)If we can, we will help.
-
@folly, @svera - The pull request is now pending so let's see what happens.
While doing more testing I found a 'bug', at least what I think is a bug:
In ViewController.cpp if there is a startup system specified the event fires for that system. When the bash script gets the event it sets the marquee to the system, e.g. Atari Classics.
The problem here is the user interface shows the "Atari Classics" marquee, NOT "720 Degrees" which is the first game selected.
I'm missing the "game-select" event for when a startup system is specified. For my purposes, it's a bug and I need to figure out how to get the "current game" in ViewController.cpp or where the first game is set during startup.
It's not REALLY a bug as everything works as was designed. I just want to find the spot to fire that event so the bash scripts can capture it too. The bash script can decide to either show the game marquee or the system marquee. I'd rather it there than in the C++ code.
-
@folly, @svera Ok I figured it out. Need to add another parameter to game-select and specify "requestedgame". This gives the bash scripts an option to either display the requested game logo or the system logo when a startup system is specified.
I'm going to have to redo my pull request.
@svera, Can I just cancel it and redo it?
-
Done!
-
I am following what you are doing in the pull.
Curious how it goes. -
@russellb you don't need to close and reopen the pull request every time you do changes in the code, just commit and push those changes and the pull request will be updated automatically.
-
-
@svera @RussellB do you know if this one ever made it, specifically the new game-select and system-select event scripts. I did just try the latest 4.8 RetroPie on a Pi 4 but no luck. game-start works fine as it did before , just not these two new ones. They would be super helpful to have for the integration of Pixelcade arcade marquees with RetroPie .
The two events are listed also in the docs https://retropie.org.uk/docs/EmulationStation/#scripting
Thanks!
Al
-
Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.
Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.