• Recent
  • Tags
  • Popular
  • Home
  • Docs
  • Register
  • Login
RetroPie forum home
  • Recent
  • Tags
  • Popular
  • Home
  • Docs
  • Register
  • Login

Mausberry Shutdown Script Doesn't Save Metadata

Scheduled Pinned Locked Moved ControlBlock, PowerBlock & Co.
mausberry
251 Posts 10 Posters 95.2k 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.
  • L
    lostless @meleu
    last edited by 28 Jul 2017, 05:42

    @meleu location is /etc/switch.sh

    1 Reply Last reply Reply Quote 0
    • L
      lostless @meleu
      last edited by lostless 28 Jul 2017, 06:01

      @meleu My frankenstein script is working. Thank you so much for giving me insight. I know i didnt contribute anything to the code, but I feel like a kid in the 80/90s, discovering computers before they were made easy to use.
      i found you need to give time for retroarch to quit and emulation station to reload before you try quit emulation station. i gave it 12 seconds. 5 was not enough, by the time the emulator quit, emulation station was not fully loaded back in.

      here is what i came up with

      #!/bin/bash
      #this is the GPIO pin connected to the lead on switch labeled OUT
      GPIOpin1=23
      #this is the GPIO pin connected to the lead on switch labeled IN
      GPIOpin2=24
      echo "$GPIOpin1" > /sys/class/gpio/export
      echo "in" > /sys/class/gpio/gpio$GPIOpin1/direction
      echo "$GPIOpin2" > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio$GPIOpin2/direction
      echo "1" > /sys/class/gpio/gpio$GPIOpin2/value
      while [ 1 = 1 ]; do
      power=$(cat /sys/class/gpio/gpio$GPIOpin1/value)
      if [ $power = 0 ]; then
      sleep 1
      else
      # End Emulationstation if condition of running binary is true
      # v1.0 07/21/17 by cyperghost - Inital run
      # v1.1 07/22/17 - Added chown command to set right user permission for creating es-shutdown
      # v1.2 07/23/17 - Some small improvments, easier to maintain, removed echo, removed else branch
      # v1.works 7/27/17 (are we even trying to number this) @lostless figured it out. More time to quit emulator and reload emulation station before shutdown. @cyperghost thank you for initial run. @meleu thank you for your insight
      emu_command="$(sed -n 4p /dev/shm/runcommand.info)"
      [[ -n "$emu_command" ]] && pkill -f "${emu_command%% *}" && sleep 12
      espid=$( pgrep -f "/opt/retropie/supplementary/.*/emulationstation([^.]|$)" ) # detect PID of ES binary only
      if [ "$espid" ]; then
      touch /tmp/es-shutdown && chown pi:pi /tmp/es-shutdown
      kill $espid
      exit
      fi
      # End Emulationstation if condition of running binary is true
      sudo poweroff
      fi
      done

      @cyperghost Thank you for the first script up to 1.2.
      @hansolo77 give this a try. its working for me quite well.

      M 1 Reply Last reply 28 Jul 2017, 06:21 Reply Quote 0
      • M
        meleu @lostless
        last edited by meleu 28 Jul 2017, 06:21

        @lostless can you try this one:

        #!/bin/bash
        #this is the GPIO pin connected to the lead on switch labeled OUT
        GPIOpin1=23
        #this is the GPIO pin connected to the lead on switch labeled IN
        GPIOpin2=24
        echo "$GPIOpin1" > /sys/class/gpio/export
        echo "in" > /sys/class/gpio/gpio$GPIOpin1/direction
        echo "$GPIOpin2" > /sys/class/gpio/export
        echo "out" > /sys/class/gpio/gpio$GPIOpin2/direction
        echo "1" > /sys/class/gpio/gpio$GPIOpin2/value
        while [ 1 = 1 ]; do
        power=$(cat /sys/class/gpio/gpio$GPIOpin1/value)
        if [ $power = 0 ]; then
        sleep 1
        else
        emu_command="$(sed -n 4p /dev/shm/runcommand.info)"
        [[ -n "$emu_command" ]] && pkill -f "${emu_command%% *}" && sleep 12
        espid=$( pgrep -f "/opt/retropie/supplementary/.*/emulationstation([^.]|$)" )
        if [ "$espid" ]; then
        touch /tmp/es-shutdown && chown pi:pi /tmp/es-shutdown
        kill $espid
        exit
        fi
        sudo poweroff
        fi
        done

        It's exactly the same script as your Frankenstein, but with a nice indentation. If it works I will try one step further...
        I really would like to avoid that loop every single second!

        • Useful topics
        • joystick-selection tool
        • rpie-art tool
        • achievements I made
        1 Reply Last reply Reply Quote 0
        • C
          cyperghost @hansolo77
          last edited by cyperghost 28 Jul 2017, 10:54

          @hansolo77 said in Mausberry Shutdown Script Doesn't Save Metadata:

          Testing v1.5 from here now....

          Take away - Looks like the script is properly closing out of the game I'm playing and returning to ES for a shutdown, but it's not saving the metadata when it shuts that down. I wonder if it's getting hung up in the if functions, not finding a valid true and going to the bottom of the script to the original poweroff without exiting ES first...

          You are 100% right.... made a small mistake - I forget to add exit command to break loop! Thank you

          So quick question... anybody know how to make a profile in Putty so it can automatically log in (username/password) so I don't have to keep typing it every time I try one of these tests? :)

          @lostless - version 1.5 should work now!
          Sorry... I forget to exit the loop thanks to @hansolo77 he helped me to detect the bug.

          Please mates try again with v1.5 of exit script (with working exit command now)

          I give you 100% working guarantee on this ;) You maybe have to extend timer.
          I would prefer this to @meleu solution because the sleep timer isn't used if there is no emulator running and the PID is detected and stored as $espid and $emupid This script can be extended to play and/or control backgroundmusic for ex. because it extracts PID

          @meleu Do you think you can break the endless 1 second loop?

          M 1 Reply Last reply 28 Jul 2017, 17:34 Reply Quote 0
          • M
            meleu @cyperghost
            last edited by 28 Jul 2017, 17:34

            @cyperghost said in Mausberry Shutdown Script Doesn't Save Metadata:

            @meleu Do you think you can break the endless 1 second loop?

            yes.

            I googled about how this device works and I think I found a solution. This is my last atempt...

            Some notes about what I found:

            • this script is called at boot (/etc/rc.local)

            • After changing the script the user needs to reboot to check if it will work.

            Some notes about the script below, v1.6 (OK, let's put a version to avoid confusion):

            • I think that at the time of calling the file we are monitoring doesn't exist (that's why I'm putting a sleep before monitoring the file.

            • I'm not getting why the f&$%k that exit after killing ES is needed. It makes the script stop at the exit, and then the sudo poweroff won't be executed. The strange thing is that the exit is present on v1.2 and @lostless says that it's working...

            • before this script needs the inotify-tools installed.

            #!/bin/bash
            # Before using this script you need to install inotify-tools:
            #
            # sudo apt-get install inotify-tools
            #
            # I'm just trying to help with the script logic here.
            # I DON'T HAVE A MAUSEBERRY AND DIDN'T TEST THE GPIO STUFF HERE!
            #
            #########################################################
            # U S E I T A T Y O U R O W N R I S K ! ! ! #
            #########################################################
            #
            # meleu - July/2017
            # kudos for @cyperghost , who is very persistent in help you guys! :-)
            #this is the GPIO pin connected to the lead on switch labeled OUT
            GPIOpin1=23
            #this is the GPIO pin connected to the lead on switch labeled IN
            GPIOpin2=24
            echo "$GPIOpin1" > /sys/class/gpio/export
            echo "in" > /sys/class/gpio/gpio$GPIOpin1/direction
            echo "$GPIOpin2" > /sys/class/gpio/export
            echo "out" > /sys/class/gpio/gpio$GPIOpin2/direction
            echo "1" > /sys/class/gpio/gpio$GPIOpin2/value
            file="/sys/class/gpio/gpio$GPIOpin1/value"
            # up to here this code is executed at booting (/etc/rc.local)
            # let's wait for the creation of the "/sys/class/gpio/gpio$GPIOpin1/value"
            sleep 30 # not sure if 30 seconds is a good value...
            while inotifywait -qq -e modify "$file" ; do
            power="$(cat "$file")"
            [[ "$power" == 0 ]] && continue
            emu_command="$(sed -n 4p /dev/shm/runcommand.info)"
            [[ -n "$emu_command" ]] && pkill -f "${emu_command%% *}" && sleep 12 # the value of 12 was suggested by @lostless
            espid=$(pgrep -f "/opt/retropie/supplementary/.*/emulationstation([^.]|$)")
            if [[ "$espid" ]]; then
            touch /tmp/es-shutdown && chown pi:pi /tmp/es-shutdown
            kill "$espid"
            # I'm not getting why the heck this exit is necessary, it makes
            # the "sudo poweroff" not be executed if the logic reaches this point
            exit
            fi
            sudo poweroff
            done
            • Useful topics
            • joystick-selection tool
            • rpie-art tool
            • achievements I made
            C 1 Reply Last reply 28 Jul 2017, 17:42 Reply Quote 0
            • C
              cyperghost @meleu
              last edited by cyperghost 28 Jul 2017, 17:42

              @meleu That's easy....
              The exit is needed becasue it ends the mausberry GPIO script and gives control to emulationstation.sh for proper exit

              Can you please exchange your lines

              emu_command="$(sed -n 4p /dev/shm/runcommand.info)"
              [[ -n "$emu_command" ]] && pkill -f "${emu_command%% *}" && sleep 12 # the value of 12 was suggested by @lostless

              with this one?

              emupid="$(sed -n 4p /dev/shm/runcommand.info)" #v1.5 @meleu readout 4th line command.info
              emupid="$(pgrep -f "${emupid%% *}")" #v1.5 optain PID emucall by runcommand.sh
              if [ "$emupid" ]; then #v1.5 check correct PID > avoid sleeptimer if shutdown from ES
              kill $emupid && sleep 10
              fi

              It is really the better way. Because you check value of command.info ... this value will also be active if you are back in ES so your [[ -n "$emu_command" ]] is always true and the sleep timer will used in every situation. Even if an emulator is not active. So this would be the last version called 1.6 release :)

              This is my last atempt...

              Haha ... we will see my friend :)

              M 1 Reply Last reply 28 Jul 2017, 17:50 Reply Quote 1
              • M
                meleu @cyperghost
                last edited by 28 Jul 2017, 17:50

                @cyperghost said in Mausberry Shutdown Script Doesn't Save Metadata:

                The exit is needed becasue it ends the mausberry GPIO script and gives control to emulationstation.sh for proper exit

                You're right. Good catch!

                The nerdy stuff we can discuss on our other thread ;-)

                • Useful topics
                • joystick-selection tool
                • rpie-art tool
                • achievements I made
                C 1 Reply Last reply 28 Jul 2017, 18:36 Reply Quote 1
                • C
                  cyperghost @meleu
                  last edited by cyperghost 28 Jul 2017, 18:36

                  @meleu @hansolo77 @lostless

                  This is also my last posting on this theme!

                  We have three working versions now!

                  meleus version 1.6 which got all features of v1.5 but gots faster GPIO response (breaks 1 second loop, use inotify tool - it's not finished now so WIP)

                  cyperghosts + meleus version 1.56 which will end ES and all emulators called by runcommand.sh

                  cyperghosts version 1.2 which just ends ES

                  M 2 Replies Last reply 28 Jul 2017, 19:18 Reply Quote 0
                  • M
                    meleu @cyperghost
                    last edited by 28 Jul 2017, 19:18

                    @cyperghost the credit for v1.6 is not meleu's only! :)
                    By the way, are you sure it really works?

                    • Useful topics
                    • joystick-selection tool
                    • rpie-art tool
                    • achievements I made
                    C L 2 Replies Last reply 28 Jul 2017, 19:40 Reply Quote 0
                    • C
                      cyperghost @meleu
                      last edited by cyperghost 28 Jul 2017, 19:40

                      @meleu Yes it should work. I tested it via SSH only but I also took investigation into the python ESC-script. There is a sleep timer of 10 seconds... so 10 seconds should be a good value :)

                       for pid in pids:
                              try:
                                  commandpath = open(os.path.join('/proc', pid, 'cmdline'), 'rb').read()
                                  if commandpath[0:24] == '/opt/retropie/emulators/':
                                      os.system('kill -QUIT %s' % pid)
                                      print('kill -QUIT %s' % pid)
                              except IOError:
                                  continue
                      

                      It uses kill PIDcommand to end emulators in path with path /opt/retropie/emulators/

                      Your RegEx sniplets matches better :) So it works - to 100% I guarantee (tested with N64Glide and zdoom) ... there the python script would fail :)

                      for v1.6 the GPIO tuning part is 100% yours. So you created it! The others part are nearly same as 1.5 so it should also work.
                      Finetunig is not included like setting sleeptimers and notify - Do you agree?

                      You also invested much time and you improved my commands and coding style as I explaind you the need of f%&/! exit command or introduced the second % in pkill -f "${emu_command%% *}" for example. But it is nothing against the && explaination and your RegEx magic, the magic of the testing command, the sed-command, the investigation of the runcommand.info-file ....

                      So thank you :)

                      1 Reply Last reply Reply Quote 0
                      • L
                        lostless @meleu
                        last edited by 28 Jul 2017, 20:55

                        @meleu 1.6 does not work. It acts as if the switch is not working. The inotify i don't think is being triggered.

                        C M 2 Replies Last reply 28 Jul 2017, 21:00 Reply Quote 0
                        • C
                          cyperghost @lostless
                          last edited by cyperghost 28 Jul 2017, 21:00

                          @lostless How about 1.5? Did you check if the script is loaded? Are the permissions are right setted?

                          L 1 Reply Last reply 28 Jul 2017, 21:04 Reply Quote 0
                          • L
                            lostless @cyperghost
                            last edited by 28 Jul 2017, 21:04

                            @cyperghost 1.5 works. which script are we talking about? the one we've been working on? I'm assuming so because it works when not trying to use inotify.

                            1 Reply Last reply Reply Quote 0
                            • M
                              meleu @lostless
                              last edited by 28 Jul 2017, 21:14

                              @lostless said in Mausberry Shutdown Script Doesn't Save Metadata:

                              @meleu 1.6 does not work.

                              WTF?!!!!

                              It's now a matter of honor!

                              Let me just put the kids to sleep (4-6 hours) and I'll get this achievement make it work!

                              (By the way, my first try will be to use the full path to inotifywait. If you know how to do it, please try it in advance.)

                              • Useful topics
                              • joystick-selection tool
                              • rpie-art tool
                              • achievements I made
                              1 Reply Last reply Reply Quote 0
                              • C
                                cyperghost
                                last edited by cyperghost 28 Jul 2017, 21:15

                                @lostless Okay good news!
                                I'm a bit unaware of the inotify thing but I see no error in the script.
                                So I think you've three choices

                                1. Use 1.5 it will work with PowerOff in ES and emulator screen and will properly save metadata (easiest approch, because it's ready setted)
                                2. Investigate to 1.6... I see no errors in the script, it may be a file permission error or inotify works wrong
                                3. Create new script and touch control ...
                                  3.1 I was able to get in touch with gpio-watch and it worked really fine with some scripts I made and it debounces switches relativly good. All in all it's also a lightweight
                                  3.2 Use wiringPi (overloaded) and use it's posibilty for IRQ
                                  3.3 There are tons of other GPIO libaries ...

                                It's now a matter of honor!

                                Surly!
                                @meleu I already said, you're not finished with that :)
                                But I'm glad that you made detection via file change ... So I hope you'll get it to run.

                                I just checked v1.6 there seems to be no typing mistake or mistake in GPIO numbering!


                                For maintainig ... If you are finished with 1.6
                                Can you please transform 1.5 in same way (coding style and layout) as 1.6? But withouth the inotify-thing?
                                So we have 2 versions

                                1. Version 1.5 that just works without installing anything
                                2. Version 1.6 with improved GPIO handling, but needs a new package
                                L 1 Reply Last reply 28 Jul 2017, 21:35 Reply Quote 0
                                • L
                                  lostless @cyperghost
                                  last edited by lostless 28 Jul 2017, 21:35

                                  @cyperghost @meleu Thanks to you both. The 1.5 is fine for me. I know @meleu, you are definitely obsessed with making the switch work without the mauseberry loop. But i've been using my pi for almost a year with that loop and it working just fine. At least we've reached a point were the mauseberry runs perfect for a retropie setup. I won't lose meta data anymore.

                                  C 1 Reply Last reply 28 Jul 2017, 21:37 Reply Quote 2
                                  • C
                                    cyperghost @lostless
                                    last edited by cyperghost 28 Jul 2017, 21:37

                                    @lostless Is the sleeptimer of 9 seconds not to long?
                                    I took the value out of the python script (they used 10 seconds) but I assume it was written for an Pi 1. So I think 5-6 seconds should also work.

                                    No .. it's not obsession it's passion!
                                    But I'm also interested in the inotify thing

                                    L 2 Replies Last reply 28 Jul 2017, 21:39 Reply Quote 0
                                    • L
                                      lostless @cyperghost
                                      last edited by 28 Jul 2017, 21:39

                                      @cyperghost I can experiment, 9 seems good enough. i can try lower, but as long as it shuts down, it doesn't matter much.

                                      C 1 Reply Last reply 28 Jul 2017, 21:40 Reply Quote 0
                                      • C
                                        cyperghost @lostless
                                        last edited by cyperghost 28 Jul 2017, 21:40

                                        @lostless The 9 seconds are only triggered if an emulator is running! And it's important for saving metadata after the emu is closed.

                                        L 1 Reply Last reply 28 Jul 2017, 21:43 Reply Quote 0
                                        • L
                                          lostless @cyperghost
                                          last edited by 28 Jul 2017, 21:42

                                          @cyperghost said in Mausberry Shutdown Script Doesn't Save Metadata:

                                          No .. it's not obsession it's passion!

                                          Is there a difference. Its all a matter of perspective LOL

                                          1 Reply Last reply Reply Quote 0
                                          136 out of 251
                                          • First post
                                            136/251
                                            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.

                                            This community forum collects and processes your personal information.
                                            consent.not_received