From 61ef52f967365b229efeca1b4524627001981635 Mon Sep 17 00:00:00 2001
From: "Mark A. Yoder" <Mark.A.Yoder@Rose-Hulman.edu>
Date: Fri, 20 Sep 2024 09:18:31 -0400
Subject: [PATCH] Cleaned up beagle101 button events

---
 intro/beagle101/blinkLED.rst              | 263 ++++++++++++++--------
 intro/beagle101/code/blinkInternalLED.sh  |  10 +
 intro/beagle101/{ => code}/buttonEvent.sh |   0
 intro/beagle101/{ => code}/buttonLED.sh   |   0
 intro/beagle101/code/seqLEDs.py           |  21 ++
 5 files changed, 195 insertions(+), 99 deletions(-)
 create mode 100755 intro/beagle101/code/blinkInternalLED.sh
 rename intro/beagle101/{ => code}/buttonEvent.sh (100%)
 rename intro/beagle101/{ => code}/buttonLED.sh (100%)
 create mode 100755 intro/beagle101/code/seqLEDs.py

diff --git a/intro/beagle101/blinkLED.rst b/intro/beagle101/blinkLED.rst
index eb0f0b97..be04d6f3 100644
--- a/intro/beagle101/blinkLED.rst
+++ b/intro/beagle101/blinkLED.rst
@@ -16,91 +16,93 @@ Here we'll show you how to do just that in three simple steps.
 These steps will work for any of the Beagles.
 
 Plug in the Beagle
-*******************
+------------------
 
 For this step you need to get a USB cable and attach your Beagle 
 to your host computer with it.  Where you attached the cable 
 depends on which Beagle you have.  Click on the tab for your board.
 
-.. tab-set::
+.. tabs::
 
-    .. tab-item:: Black
+    .. group-tab:: Black
 
         .. figure:: figures/image8.jpg
             :width: 632px
+            :height: 166px
             :align: center
             :alt: Tethered Configuration
 
-            Tethered Configuration
+        Tethered Configuration
 
         .. figure:: figures/image9.jpg
             :width: 451px
+            :height: 206px
             :align: center
             :alt: USB Connection to the Board
         
-            Mini USB Connection to the Board as seen from the bottom.
+        Mini USB Connection to the Board as seen from the bottom.
 
         For more details see: :ref:`beagleboneblack-connectivity`
 
-    .. tab-item:: Blue
+    .. group-tab:: Blue
 
         .. figure:: figures/blueconnect.jpg
             :width: 451px
             :align: center
             :alt: USB Connection to the Blue
 
-            Micro USB Connection to the Blue
+        Micro USB Connection to the Blue
 
-    .. tab-item:: AI-64
+    .. group-tab:: AI-64
 
         .. figure:: figures/usb-tethering.jpg
             :width: 400px
             :align: center 
             :alt: Tethered Configuration
 
-            Tethered Configuration  
+        Tethered Configuration  
 
         .. figure:: figures/usb-c-connection.jpg
             :width: 400px
             :align: center 
             :alt: USB Connection to the Board
 
-            USB-c Connection to the Board
+        USB-c Connection to the Board
             
         .. figure:: figures/usb-a-connection.jpg
             :width: 400px
             :align: center 
             :alt: USB Connection to the PC/Laptop
 
-            USB Connection to the PC/Laptop
+        USB Connection to the PC/Laptop
 
         .. figure:: figures/power-led.jpg
             :width: 400px
             :align: center 
             :alt: Board Power LED
 
-            Board Power LED
+        Board Power LED
 
-        For more details see: :ref:`bbai64-quick-start`
+        For more details see: :ref:`connecting-up-your-beaglebone-ai-64`
 
-    .. tab-item:: Play
+    .. group-tab:: Play
 
         .. figure:: figures/tethered-connection.jpg
             :width: 1400
             :align: center
             :alt: Tethering BeaglePlay to PC
 
-            Tethering BeaglePlay to PC
+        Tethering BeaglePlay to PC
 
         For more details see: :ref:`beagleplay-quick-start`
             
-    .. tab-item:: Pocket
+    .. group-tab:: Pocket
 
         .. figure:: figures/11fig-PB-microUSBattach1.jpg
             :align: center
             :alt: Tethered Configuration
 
-            Micro USB Connection
+        Micro USB Connection
 
         For more details see: :REF:`connecting_up_pocketbeagle`
             
@@ -110,75 +112,81 @@ heart beat.
 
 The Beagle is now up and running, but you didn't have to 
 load up Linux.  This is because all Beagles 
-(except PocketBeagle, see :ref:`flash-latest-image` 
-to install an image on the Pocket) have built-in flash memory 
+have built-in flash memory 
 that has the Debian distribution of Linux preinstalled.
 
-.. _intro-using-vs-code:
-
-Using VS Code
-**************
-
-.. important:: If VS code is not installed on your board please skip this section and refer 
-               to next section on how to login and run the code via command line.
+.. note:: 
+    The one exception is the PocketBeagle which has no built-in 
+    flash memory.  See :ref:`flash-latest-image` 
+    to install an image on the Pocket
+
+Login
+-----
+
+Next you login to the Beagle from your host computer. 
+Here you have a choice.  If you want a graphical approach, 
+choose the ``VS Code`` tab.  If you want a command line 
+and your host is a Mac, take the ``ssh (Mac)`` tab. If you
+are running Linux on your host, 
+take the ``ssh (Linux)`` tab.  Finally take the 
+``putty (Windows)`` tab for command line from Windows.
 
-Recent Beagles come with the IDE Visual Studio Code (https://code.visualstudio.com/) installed and 
-running. To access it, open a web browser on your host computer and browse to: ``192.168.7.2:3000`` 
-(use ``192.168.6.2:3000`` for the Mac) and you will see something like:
+.. tabs::
 
-.. figure::  figures/vscode1.png
-    :width: 740 
-    :align: center
+    .. group-tab:: VS Code
 
-At this point you can either run the scripts via a command line within VS Code, or 
-run them by clicking the ``RUN Code`` button.
+        Recent Beagles come with the IDE Visual Studio Code 
+        (https://code.visualstudio.com/) installed and 
+        running. To access it, open a web browser on 
+        your host computer and browse to: ``192.168.7.2:3000`` 
+        (use ``192.168.6.2:3000`` for the Mac)
+        and you will see something like:
 
+        .. figure::  figures/vscode1.png
 
-Running via the command line
-============================
+        At this point you can either run the scripts via a command 
+        line within VS Code, or run them by clicking the
+        ``RUN Code`` button.
 
-Open a terminal window in VS Code by dropping down the ``Terminal`` menu and selecting ``New Terminal`` 
-(or entering ``Ctrl+```).  The terminal window appears at the bottom of the screen as shown below.
 
-.. figure:: figures/vscode3.png
-    :width: 740 
-    :align: center
+        Running via the command line
 
-You can now enter commands and see them run as shown below.
+            Open a terminal window in VS Code by dropping down the 
+            ``Terminal`` menu and selecting ``New Terminal`` (or entering 
+            ``Ctrl+Shift+```).  The terminal window appears at the 
+            bottom of the screen as shown below.
 
-.. figure:: figures/vscode4.png
-    :width: 740 
-    :align: center
-    
-Running via the ``RUN`` button
-===============================
+            .. figure:: figures/vscode3.png
 
-Use the file navigator on the left to navigate to ``examples/BeagleBone/Black/blinkInternalLED.sh`` and you will see:
+            You can now enter commands and see them run as shown below.
 
-.. figure:: figures/vscode2.png
-    :width: 740 
-    :align: center
+            .. figure:: figures/vscode4.png
 
-This code blinks one of the USR LEDs built into the board. Click on the ``RUN Code`` triangle on the upper right of the 
-screen (see red arrow) to run the code.  (You could also enter ``Ctrl+Alt+N``) The USR3 LED should now be blinking.  
+        Running via the ``RUN`` button
 
-Click on the ``Stop Code Run`` (``Ctrl+Alt+M``) square to the right of the ``Run Code`` button.
+            Use the file navigator on the left to navigate to 
+            ``examples/BeagleBone/Black/blinkInternalLED.sh`` 
+            and you will see:
 
-Time to play!  Try changing the LED number (on line 10) from 3 to something else.  Click the ``Run Code`` 
-button (no need to save the file, autosave is on by default).
+            .. figure:: figures/vscode2.png
 
-Try running ``seqLEDs.py``.
+            This code blinks one of the USR LEDs built into the board. 
+            Click on the ``RUN Code`` triangle on the upper right of 
+            the screen (see red arrow) to run the code.  (You could also enter ``Ctrl+Alt+N``) 
+            The USR3 LED should now be blinking.  
 
-Using command line
-******************
+            Click on the ``Stop Code Run`` (``Ctrl+Alt+M``) square to the right of the 
+            ``Run Code`` button.
 
-To access the command line and your host is a Mac, take the ``ssh (Mac)`` tab. If you
-are running Linux on your host, take the ``ssh (Linux)`` tab.  Finally take the 
-``putty (Windows)`` tab for command line from Windows.
+            
+            
+            Time to play!  Try changing the LED number (on line 10) from 
+            3 to something else.  Click the ``Run Code`` button (no 
+            need to save the file, autosave is on by default).
 
-.. tab-set::
+            Try running ``seqLEDs.py``.
 
-    .. tab-item:: ssh (Mac)
+    .. group-tab:: ssh (Mac)
                 
         If you are running a Mac host, open a terminal widow and run 
 
@@ -188,7 +196,7 @@ are running Linux on your host, take the ``ssh (Linux)`` tab.  Finally take the
 
         Use the password ``temppwd``.
   
-    .. tab-item:: ssh (Linux)
+    .. group-tab:: ssh (Linux)
 
         If you are running a Linux host, open a terminal widow and run 
 
@@ -198,7 +206,7 @@ are running Linux on your host, take the ``ssh (Linux)`` tab.  Finally take the
         
         Use the password ``temppwd``.
 
-    .. tab-item:: putty (Windows)
+    .. group-tab:: putty (Windows)
 
         If you are running Window you need to run an ``ssh`` client 
         to connect to the Beagle. I suggest you use ``putty``. 
@@ -212,7 +220,7 @@ are running Linux on your host, take the ``ssh (Linux)`` tab.  Finally take the
         and password ``temppwd``.  
 
 Blink an LED
-============
+------------
 
 Once logged in the rest is easy.  First:
 
@@ -233,7 +241,7 @@ internal LEDs.
 
 .. code-block:: shell-session
 
-    bone:~$ cat blinkInternalLED.py
+    bone:~$ cat blinkInternalLED.sh
     LED="3"
     
     LEDPATH='/sys/class/leds/beaglebone:green:usr'
@@ -244,14 +252,25 @@ internal LEDs.
         echo "0" > ${LEDPATH}${LED}/brightness
         sleep 0.5
     done
-    bone:~$ ./blinkInternalLED.py
+    bone:~$ ./blinkInternalLED.sh
     ^c
 
+:download:`blinkInternalLED.sh<code/blinkInternalLED.sh>`
+
 Here you see a simple bash script that turns an LED 
 on and off.  Enter Ctrl+c to stop the script.
 
+Congratulations, you've blinked an LED.
+
+Your turn
+^^^^^^^^^
+
+Now that you have an LED blinking, try blinking a different LED. 
+Or, blink more than one LED at a time. Try slowing down, or speeding up 
+the blink rate.
+
 Blinking via Python
-====================
+-------------------
 
 Here's a script that sequences the LEDs on and off.
 
@@ -273,19 +292,35 @@ Here's a script that sequences the LEDs on and off.
     while True:
         for i in range(LEDs):
             f[i].seek(0)
-            f[i].write("1")
+            f[i].write("1")     # 1 turns the LED on
             time.sleep(0.25)
         for i in range(LEDs):
             f[i].seek(0)
-            f[i].write("0")
+            f[i].write("0")     # 0 turns the LED off
             time.sleep(0.25)
     bone:~$ ./seqLEDs.py       
     ^c
-    
+
+:download:`seqLEDs.py<code/seqLEDs.py>`
+
 Again, hit Ctrl+c to stop the script.
 
+This python script is a bit more complicated that the previous bash 
+script.  Note that *LEDPATH* is the same in both scripts.  They use the 
+same interface to control the built-in LEDs.  The python script opens a 
+file for each of the LEDs and then writes a **1** to the file to turn on 
+the LED.  A **0** is writen to turn it off.  The *for* loop allows it to turn 
+on (or off) all four LEDs in sequence.
+
+Your turn
+^^^^^^^^^
+
+Try speeding up, or slowing down the sequencing by changing the *sleep* times. 
+If you have programming experience, make a single LED sequence back and forth.
+
+
 Blinking from Command Line
-==========================
+--------------------------
 
 You can control the LEDs from the command line.
 
@@ -308,18 +343,18 @@ You can blink any of them.  Let's try ``usr1``.
     bone:~$ echo 1 > brightness
     bone:~$ echo 0 > brightness
 
-When you echo 1 into ``brightness`` the LED turns on. 
-Echoing a 0 turns it off. 
+When you echo **1** into ``brightness`` the LED turns on. 
+Echoing a **0** turns it off. 
 
 Blinking other LEDs
-===================
+-------------------
 
 You can blink the other LEDs by changing in to thier 
 directories and doing the same. Let's blink the USR0 LED.
 
 .. code-block:: shell-session
     
-    bone:~$ cd ../beaglebone\:green\:usr0/
+    bone:~$ cd /sys/class/leds/beaglebone\:green\:usr0/
     bone:~$ echo 1 > brightness
     bone:~$ echo 0 > brightness
 
@@ -343,13 +378,20 @@ what triggers you can set:
     bone:~$ echo none > trigger
 
 Notice ``[heartbeat]`` is in brackets.  This shows it's the 
-current trigger.  The echo changes the trigger to ``none``.
+current trigger.  The ``echo`` changes the trigger to ``none``.
 
+Your turn 
+^^^^^^^^^
 Try experimenting with some of the other triggers and see if you 
-can figure them out.
+can figure them out. Try changing the trigger on the other LEDs. 
+
+.. note:: 
+
+    The following may not work on all Beagles since it depends on which 
+    version of Debian you are running.
 
 Another way to Blink an LED
-===========================
+---------------------------
 
 An interesting thing about Linux is there are often many ways 
 to do the same thing.  For example, I can think of at least five ways to blink 
@@ -384,21 +426,26 @@ the ``gpioset`` command.
 The first command sets chip 1, line 22 (the usr1 LED) to 1 (on) for 
 2 seconds.  The second command turns it off for 2 seconds.
 
-Try it for the other LEDs.
+Your turn 
+^^^^^^^^^
+
+Try turning on and off the other LEDs. If you have programming experience, 
+try modifying the earler *bash* script to use `gpiod` instead of `echo`.
 
 .. note:: 
 
-    This may not work on all Beagles since it depends on which 
+    The following may not work on all Beagles since it depends on which 
     version of Debian you are running.
 
-Blinking in response  to a button
-=================================
+Blinking in response to a button event
+--------------------------------------
 
-Some Beagles have a USR button that can be used  to control the LEDs. 
-You can test the USR button with ``evtest`` 
+Some Beagles have a **USR** button that can be used  to control the LEDs. 
+You can test the **USR** button with ``evtest`` 
 
 .. code-block:: shell-session
 
+    bone:~$ sudo apt install evtest
     bone:~$ evtest
     No device specified, trying to scan all of /dev/input/event*
     Not running as root, no devices may be available.
@@ -410,7 +457,7 @@ You can test the USR button with ``evtest``
 We want to use ``gpio-keys``, so enter ``1``. Press and release 
 the USR button and you'll see:
 
-.. code-block:: shell-session
+ .. code-block:: shell-session
 
     Input driver version is 1.0.1
     Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
@@ -439,23 +486,41 @@ the USR button and you'll see:
     Event: time 1692994988.641754, -------------- SYN_REPORT ------------
     Ctrl+c 
 
-The following script uses evtest to wait for the USR button to be pressed and 
-then turns on the LED.
+The value **1** means the **USR** button was pressed, the **0** means it 
+was released.  The value **2** means the button is being held.
 
-.. literalinclude:: buttonEvent.sh
-    :language: Shell
+The following script uses ``evtest`` to wait for the **USR** button to be 
+pressed and then turns on the LED.
+
+.. literalinclude:: code/buttonEvent.sh
     :caption: buttonEvent.sh
     :linenos:
 
-:download:`buttonEvent.sh<buttonEvent.sh>`
+:download:`buttonEvent.sh<code/buttonEvent.sh>`
+
+Try running it and pressing the **USR** button. 
+
+.. code-block:: shell-session
+
+    bone:~$ ./buttonEvent.sh
+    ^c
+
+The **USR3** LED should turn on when the **USR** button is pressed.
+
+Your turn
+^^^^^^^^^
+Try modifying the code to turn on a different LED.  Try blinking 2 or 3 
+LEDs when the button is pressed.  Can you toggle an LED each time the 
+button is pressed?
 
-Try running it and pressing the USR button. 
+Blinking in response to a button poll
+-------------------------------------
 
-The next script polls the USR button and toggles the LED.
+The next script polls the USR button and toggles the LED rather that waiting 
+for an event.
 
-.. literalinclude:: buttonLED.sh
-    :language: shell
+.. literalinclude:: code/buttonLED.sh
     :caption: buttonLED.sh
     :linenos:
 
-:download:`buttonLED.sh<buttonLED.sh>`
+:download:`buttonLED.sh<code/buttonLED.sh>`
diff --git a/intro/beagle101/code/blinkInternalLED.sh b/intro/beagle101/code/blinkInternalLED.sh
new file mode 100755
index 00000000..485c563d
--- /dev/null
+++ b/intro/beagle101/code/blinkInternalLED.sh
@@ -0,0 +1,10 @@
+LED="3"
+
+LEDPATH='/sys/class/leds/beaglebone:green:usr'
+
+while true ; do
+    echo "1" > ${LEDPATH}${LED}/brightness
+    sleep 0.5
+    echo "0" > ${LEDPATH}${LED}/brightness
+    sleep 0.5
+done
diff --git a/intro/beagle101/buttonEvent.sh b/intro/beagle101/code/buttonEvent.sh
similarity index 100%
rename from intro/beagle101/buttonEvent.sh
rename to intro/beagle101/code/buttonEvent.sh
diff --git a/intro/beagle101/buttonLED.sh b/intro/beagle101/code/buttonLED.sh
similarity index 100%
rename from intro/beagle101/buttonLED.sh
rename to intro/beagle101/code/buttonLED.sh
diff --git a/intro/beagle101/code/seqLEDs.py b/intro/beagle101/code/seqLEDs.py
new file mode 100755
index 00000000..40f684a9
--- /dev/null
+++ b/intro/beagle101/code/seqLEDs.py
@@ -0,0 +1,21 @@
+import time
+import os
+
+LEDs=4
+LEDPATH='/sys/class/leds/beaglebone:green:usr'
+
+Open a file for each LED
+f = []
+for i in range(LEDs):
+    f.append(open(LEDPATH+str(i)+"/brightness", "w"))
+
+Sequence
+while True:
+    for i in range(LEDs):
+        f[i].seek(0)
+        f[i].write("1")     # 1 turns the LED on
+        time.sleep(0.25)
+    for i in range(LEDs):
+        f[i].seek(0)
+        f[i].write("0")     # 0 turns the LED off
+        time.sleep(0.25)
-- 
GitLab