RetroPie forum home
    • Recent
    • Tags
    • Popular
    • Home
    • Docs
    • Register
    • Login
    Please do not post a support request without first reading and following the advice in https://retropie.org.uk/forum/topic/3/read-this-first

    Is it possible to call a script by "browsing"?

    Scheduled Pinned Locked Moved Help and Support
    scriptsystem selectcall
    13 Posts 2 Posters 244 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • mituM
      mitu Global Moderator @didusee
      last edited by

      ...
      I am asking myself, if there is a way to execute the script only, if the color has not already been changed. Unfortunately, I am not getting back any status or so from the leds. So I am looking for any argument, that I could use.

      When you call the button set script can't you store the color you sent to the led in a file ? You can then read the last set color from the subsequent script calls.

      1 Reply Last reply Reply Quote 1
      • D
        didusee
        last edited by didusee

        Yes, I could, but as I am talking about changing colors of LED buttons with Plasma, that would lead to no results that could help me for what I would like to. At least nothing, that I am aware of. Plasma is not returning any values. You throw a png at it, thats it. There seem to be ways of managing things with python but unfortunately, that s not my cup of tea.

        Furthermore, calling plasmactl seems to be quiet ressource intensive. While browsing a gameslist with roms, a script in …/scripts/game-start calls it each time, hovering over (selecting) a game and becomes rather unresponsive.
        No fun.

        I suspect, it is not a good idea, to call plasmactl from a shell script with the game-start-folder-method

        1 Reply Last reply Reply Quote 0
        • D
          didusee
          last edited by didusee

          I came up with a different solution with the help of a friend, that implements a daemon and three scripts.

          1. Daemon Script
          This script monitors the status file and triggers color changes based on the current menu (Systems Menu or Gamelist Menu).
          Location: /home/pi/led_ram_daemon.sh

          #!/bin/bash
          # /home/pi/led_ram_daemon.sh
          
          # Path to the status file in RAM
          STATUS_FILE=“/dev/shm/led_ram_status.sh“
          
          # Check if the status file exists. If not, create it.
          if [ ! -f "$STATUS_FILE“ ]; then
              echo "SYSTEMSLED=OFF“ > "$STATUS_FILE“
              echo "GAMESLED=OFF“ >> "$STATUS_FILE“
          fi
          
          # Function to read the status values and apply them to the LEDs
          apply_led_status() {
              # Load the current status
              source "$STATUS_FILE“
          
              # Check if SYSTEMSLED should be turned ON
              if [ "$SYSTEMSLED“ == "ON“ ]; then
                  # Set SYSTEMSLED to the ‚systemscolor‘ pattern (no output to console)
                  plasmactl --pattern systemscolor > /dev/null 2>&1
              fi
          
              # Check if GAMESLED should be turned ON
              if [ "$GAMESLED“ == "ON“ ]; then
                  # Set GAMESLED to the ‚gamescolor‘ pattern (no output to console)
                  plasmactl --pattern gamescolor > /dev/null 2>&1
              fi
          }
          
          # Function to check for status changes
          check_status_change() {
              # Save the old status
              old_status=$(cat "$STATUS_FILE“)
          
              # Monitor status changes in a loop
              while true; do
                  # If the status has changed, apply the new LED state
                  new_status=$(cat "$STATUS_FILE“)
                  if [ "$old_status“ != "$new_status“ ]; then
                      apply_led_status  # Apply changes to the LEDs
                      old_status=$new_status  # Set the new status as the old status
                  fi
                  sleep 0.1  # Wait 100 milliseconds before checking again
              done
          }
          
          1 Reply Last reply Reply Quote 0
          • D
            didusee
            last edited by didusee

            2. Systems-LED Script
            Changes LED colors when in system-selection menu
            Location:
            /opt/retropie/configs/all/emulationstation/scripts/system-select/led_ram_systems.sh

            #!/bin/bash
            # /opt/retropie/configs/all/emulationstation/scripts/system-select/led_ram_systems.sh
            
            # Path to the status file in RAM
            STATUS_FILE=“/dev/shm/led_ram_status.sh“
            
            # Set the System-LED status to „ON“ and the Game-LED status to „OFF“
            echo "SYSTEMSLED=ON“ > "$STATUS_FILE“
            echo "GAMESLED=OFF“ >> "$STATUS_FILE“
            
            1 Reply Last reply Reply Quote 0
            • D
              didusee
              last edited by didusee

              3. Games-LED Script
              Changes LED colors when browsing roms / games
              /opt/retropie/configs/all/emulationstation/scripts/game-select/led_ram_games.sh

              #!/bin/bash
              # /opt/retropie/configs/all/emulationstation/scripts/system-select/led_ram_systems.sh
              
              # Path to the status file in RAM
              STATUS_FILE=“/dev/shm/led_ram_status.sh“
              
              # Set the System-LED status to „ON“ and the Game-LED status to „OFF“
              echo "GAMESLED=ON" > "$STATUS_FILE"
              echo "SYSTEMSLED=OFF" >> "$STATUS_FILE"
              
              1 Reply Last reply Reply Quote 0
              • D
                didusee
                last edited by didusee

                Excursion: Using a status file under /dev/shm

                Saving the status file in /dev/shm (temporary filesystem, stored in RAM) is improving performance and prevent wear on the SD card.

                • Speed: Reading from and writing to /dev/shm is faster than accessing files stored on the SD card, which is especially important if the script is running in a loop and frequently checking for status
                  changes. This improves the responsiveness of the LED color changes without putting excessive load on the system.

                • Temporary Storage: The status file only needs to exist for the duration of the session. Once the system is rebooted, the /dev/shm directory is cleared automatically, so there is no need to manage or clean up the status file manually.

                • What is Stored in the Status File?: The status file stores the current state of the LEDs (whether the
                  system is in „Systems Menu“ or „Games Menu“).

                Specifically, it holds two variables:
                SYSTEMSLED: „ON“ or „OFF“ (indicates whether the system LED colorset should be on or off).
                GAMESLED: „ON“ or „OFF“ (indicates whether the game LED colorset should be on or off).

                The file is written in a simple key-value format:

                SYSTEMSLED=ON
                GAMESLED=OFF
                

                Whenever the LED state changes, the script updates this file with the new values. The daemon then reads the file, and based on its contents, updates the LED colors accordingly.

                1 Reply Last reply Reply Quote 0
                • D
                  didusee
                  last edited by didusee

                  Excursion: Tradeoff between performance and responsiveness

                  The daemon script uses a small delay (sleep 0.1) between each check of the status file to balance performance and responsiveness.

                  • Why the Delay?
                    The delay ensures that the daemon does not overwhelm the system with constant checks, which could lead to excessive CPU usage and lagging while browsing roms / gameslists. By introducing a rather small delay of 100 milliseconds, the script remains quiet responsive enough to changes but does not use too many system resources.

                  • Adjusting the Delay:
                    One can customize the delay to fit personal preferences. To make the script more responsive (i.e., faster reaction to color changes), reduce the sleep time (e.g., sleep 0.05 for 50 milliseconds). Conversely, to improve system performance further, increase the sleep time (e.g., sleep 0.2 for 200 milliseconds). The delay is located in the check_status_change function of the daemon script (under 1.1)

                  1 Reply Last reply Reply Quote 0
                  • D
                    didusee
                    last edited by didusee

                    4. Setting up the "LED RAM Daemon"
                    The daemon should runs automatically on system startup, with the help of systemd service. This service will start the led_ram_daemon.sh script in the background.

                    Location of the systemd service file:
                    /etc/systemd/system/led_ram_daemon.service

                    [Unit]
                    Description=LED RAM Daemon Service
                    After=network.target
                    
                    [Service]
                    Type=simple
                    ExecStart=/home/pi/led_ram_daemon.sh
                    Restart=always
                    User=pi
                    Group=pi
                    
                    [Install]
                    WantedBy=multi-user.target
                    

                    Enabing the service:

                    sudo systemctl enable led_ram_daemon.service
                    

                    Starting service manually:

                    sudo systemctl start led_ram_daemon.service
                    

                    Logging

                    journalctl -u led_ram_daemon.service
                    
                    1 Reply Last reply Reply Quote 0
                    • D
                      didusee
                      last edited by

                      5. Configuring autostart.sh for EmulationStation

                      In order to make sure that the system starts the daemon on boot and manages the LEDs when starting EmulationStation, there needs to be an addition in the autostart.sh file

                      Location: /opt/retropie/configs/all/autostart.sh

                      Include before everything else

                      cp /home/pi/led_ram_daemon.sh /dev/shm/
                      /dev/shm/led_ram_daemon.sh &
                      

                      This setup copies the led_ram_daemon.sh script to /dev/shm/ (a temporary in-memory filesystem) each time the system starts. Running the script from /dev/shm/ can improve its responsiveness, as accessing files in RAM is generally faster than from disk. After copying, the daemon starts in the
                      background, and EmulationStation launches automatically.

                      1 Reply Last reply Reply Quote 0
                      • D
                        didusee
                        last edited by

                        6. Pattern Images for Plasma
                        Plasma uses png files for LED patterns with plasmactl command
                        They need to be available in /etc/plasma

                        gamespattern.png
                        systemspattern.png

                        For further infos see the docs

                        1 Reply Last reply Reply Quote 0
                        • D
                          didusee
                          last edited by

                          7. Final Steps

                          Scripts need to be executable!
                          After placing the scripts in their respective directories, this can be done by running:

                          chmod +x /home/pi/led_ram_daemon.sh
                          chmod +x /opt/retropie/configs/all/emulationstation/scripts/system-select/led_ram_systems.sh
                          chmod +x /opt/retropie/configs/all/emulationstation/scripts/game-select/led_ram_games.sh
                          

                          Rebooting Pi to ensure the daemon starts properly and the LED color patterns are correctly applied.

                          ## HAVE FUN AND ENJOY!

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          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.