From 3f1f5fd8f9350634b6c76ac2c9f075f6edc72510 Mon Sep 17 00:00:00 2001 From: jeshernandez Date: Wed, 8 Jan 2025 14:31:11 -0800 Subject: [PATCH 1/3] docs: updating readme setup and config --- .../Raspberry Pi Setup and Configuration.md | 264 +++++++++--------- .../snapshots/index_replace_name.png | Bin 0 -> 53337 bytes 2 files changed, 138 insertions(+), 126 deletions(-) create mode 100644 Documentation/snapshots/index_replace_name.png diff --git a/Documentation/Raspberry Pi Setup and Configuration.md b/Documentation/Raspberry Pi Setup and Configuration.md index c9bee5d..ff08d64 100644 --- a/Documentation/Raspberry Pi Setup and Configuration.md +++ b/Documentation/Raspberry Pi Setup and Configuration.md @@ -275,9 +275,9 @@ These instructions start with a Raspberry Pi with nothing on it, and are meant t 15. Install Boost (a set of utilities that PiTrac uses) 1. Install the current version of the boost development environment - 1. sudo apt-get install libboost1.74-all + 1. `sudo apt-get install libboost1.74-all` 2. Create a boost.pc file to tell meson how to find boost files when PiTrac is compiled - 1. sudo vi /usr/share/pkgconfig/boost.pc and in it place: + 1. `sudo vi /usr/share/pkgconfig/boost.pc` and in it place: ``` # Package Information for pkg-config # Path to where Boost is installed @@ -292,21 +292,21 @@ These instructions start with a Raspberry Pi with nothing on it, and are meant t Libs: -L${libdir} -lboost_filesystem -lboost_system -lboost_timer -lboost_log -lboost_chrono -lboost_regex -lboost_thread -lboost_program_options Cflags: -isystem ${includedir} ``` - 2. Finally, because of a problem when compiling boost under C++20 (which PiTrac uses), add “\#include \ as the last include before the line that says “name space boost” in the awaitable.hpp file at /usr/include/boost/asio/awaitable.hpp” - 1. sudo vi /usr/include/boost/asio/awaitable.hpp + 2. Finally, because of a problem when compiling boost under C++20 (which PiTrac uses), add `#include ` as the last include before the line that says “name space boost” in the awaitable.hpp file at /usr/include/boost/asio/awaitable.hpp” + 1. `sudo vi /usr/include/boost/asio/awaitable.hpp` 2. This is a hack, but works for now. #### Build and Install LGPIO 16. Install and build lgpio (this is a library to work with the GPIO pins of the Pi) - 1. cd \~/Dev + 1. `cd ~/Dev` 2. wget [http://abyz.me.uk/lg/lg.zip](http://abyz.me.uk/lg/lg.zip) - 3. unzip lg.zip - 4. cd lg - 5. make - 6. sudo make install - 7. Create a /usr/lib/pkgconfig/lgpio.pc containing the following: - ``` + 3. `unzip lg.zip` + 4. `cd lg` + 5. `make` + 6. `sudo make install` + 7. Create `sudo touch /usr/lib/pkgconfig/lgpio.pc` containing the following: + ``` bash # Package Information for pkg-config prefix=/usr/local exec_prefix=${prefix} @@ -319,7 +319,7 @@ These instructions start with a Raspberry Pi with nothing on it, and are meant t Cflags: -I${includedir} ``` 2. Enable the SPI pins on the Pi - 1. sudo raspi-config + 1. `sudo raspi-config` 2. Select 3 Interface Option 3. Select l4 SPI Enable/Disable 4. Select Yes on the next screen @@ -329,14 +329,14 @@ These instructions start with a Raspberry Pi with nothing on it, and are meant t 17. Install and build libcamera (for c++ camera control) 1. Install Prerequisites - 1. sudo apt-get install \-y libevent-dev - 2. sudo apt install \-y pybind11-dev - 3. sudo apt \-y install doxygen - 4. sudo apt install \-y python3-graphviz - 5. sudo apt install \-y python3-sphinx - 6. sudo apt install **\-y** python3-yaml python3-ply - 7. sudo apt install \-y libavdevice-dev - 8. sudo apt install \-y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5 + 1. `sudo apt-get install -y libevent-dev` + 2. `sudo apt install -y pybind11-dev` + 3. `sudo apt -y install doxygen` + 4. `sudo apt install -y python3-graphviz` + 5. `sudo apt install -y python3-sphinx` + 6. `sudo apt install -y python3-yaml python3-ply` + 7. `sudo apt install -y libavdevice-dev` + 8. `sudo apt install -y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5` 2. NEW \- MARCH 7 2024 \- Use [https://www.raspberrypi.com/documentation/computers/camera\_software.html\#building-libcamera-and-rpicam-apps](https://www.raspberrypi.com/documentation/computers/camera_software.html#build-libcamera-and-rpicam-apps) 1. BUT \- 1. Perform the git clone at \~/Dev where we’ve been building the other software @@ -367,7 +367,7 @@ These instructions start with a Raspberry Pi with nothing on it, and are meant t #### Install Java OpenJDK 19. Install recent java (for activeMQ) - 1. sudo apt install openjdk-17-jdk openjdk-17-jre + 1. `sudo apt install openjdk-17-jdk openjdk-17-jre` #### Install MsgPack @@ -377,88 +377,91 @@ These instructions start with a Raspberry Pi with nothing on it, and are meant t 3. git clone [https://github.com/msgpack/msgpack-c.git](https://github.com/msgpack/msgpack-c.git) 4. For some reason, the above does not grab all the necessary files. So, also go here: [https://github.com/msgpack/msgpack-c/tree/cpp\_master](https://github.com/msgpack/msgpack-c/tree/cpp_master) and click on “Code” and down load the zip file into the \~/Dev directory 5. unzip /mnt/PiTracShare/dev/tmp/msgpack-c-cpp\_master.zip - 6. cd msgpack-c-cpp\_master - 7. cmake \-DMSGPACK\_CXX20=ON . - 8. sudo cmake \--build . \--target install - 9. sudo /sbin/ldconfig + 6. `cd msgpack-c-cpp_master` + 7. `cmake -DMSGPACK_CXX20=ON .` + 8. `sudo cmake --build . --target install` + 9. `sudo /sbin/ldconfig` #### Install ActiveMQ C++ CMS 21. Install ActiveMQ C++ CMS messaging system (on both Pi’s) 1. This code allows PiTrac to talk to the ActiveMQ message broker 2. Pre-requisites: - 1. sudo apt \-y install libtool - 2. sudo apt-get \-y install libssl-dev - 3. sudo apt-get \-y install libapr1-dev - 4. sudo apt install \-y libcppunit-dev - 5. sudo apt-get install \-y autoconf + 1. `sudo apt -y install libtool` + 2. `sudo apt-get -y install libssl-dev` + 3. `sudo apt-get -y install libapr1-dev` + 4. `sudo apt install -y libcppunit-dev` + 5. `sudo apt-get install -y autoconf` 3. Download and unzip [activemq-cpp-library-3.9.5-src.tar.gz](http://www.apache.org/dyn/closer.lua/activemq/activemq-cpp/3.9.5/activemq-cpp-library-3.9.5-src.tar.gz) 1. This version is a little old, but we’re not aware of a newer one 2. May also able to do: 1. git clone [https://gitbox.apache.org/repos/asf/activemq-cpp.git](https://gitbox.apache.org/repos/asf/activemq-cpp.git) if the available version is new enough (3.9.5 or later) 3. ([https://activemq.apache.org/components/cms/developers/building](https://activemq.apache.org/components/cms/developers/building) has more information on the installation process, if necessary) - 2. cd \~/Dev - 3. gunzip /mnt/PiTracShare/tmp/activemq-cpp-library-3.9.5-src.tar.gz (or wherever you put the .gz zip file) - 4. cd activemq-cpp-library-3.9.5 - 5. ./autogen.sh - 6. ./configure - 7. make - 8. sudo make install + 2. `cd ~/Dev` + 3. `gunzip /mnt/PiTracShare/tmp/activemq-cpp-library-3.9.5-src.tar.gz` (or wherever you put the .gz zip file) + 4. `cd activemq-cpp-library-3.9.5` + 5. `./autogen.sh` + 6. `./configure` + 7. `make` + 8. `sudo make install` #### Install ActiveMQ Broker 22. Install ActiveMQ Broker (need only do on the Pi 2 system, as it is the only system that will be running the broker ?) 1. We will install the binary (non-source code version) 2. Get Apache Pre-Reqs (most should already have been installed) - 1. sudo apt \-y install libapr1-dev - 2. sudo apt \-y install libcppunit-dev - 3. sudo apt \-y install doxygen - 4. sudo apt \-y install e2fsprogs - 5. sudo apt \-y install maven + 1. `sudo apt -y install libapr1-dev` + 2. `sudo apt -y install libcppunit-dev` + 3. `sudo apt -y install doxygen` + 4. `sudo apt -y install e2fsprogs` + 5. `sudo apt -y install maven` 3. [https://activemq.apache.org/components/classic/download/](https://activemq.apache.org/components/classic/download/) has the source code zip file that you will want to download with the ActiveMQ Broker 1. E.g., [apache-activemq-6.1.4-bin.tar.gz](https://www.apache.org/dyn/closer.cgi?filename=/activemq/6.1.4/apache-activemq-6.1.4-bin.tar.gz&action=download) 2. Follow these instructions to install: 1. [https://activemq.apache.org/version-5-getting-started.html\#installation-procedure-for-unix](https://activemq.apache.org/version-5-getting-started.html#installation-procedure-for-unix) 2. Set the following environment variable to ensure you don’t run out of memory: - 1. export MAVEN\_OPTS=-Xmx1024M - 3. We suggest you install activemq at /opt, so… - 1. cd /opt - 2. sudo tar xvf /mnt/PiTracShare/tmp/apache\*.tar (or wherever you put the tarball file + 1. `export MAVEN_OPTS=-Xmx1024M` (ignore for RaspberryPi 5 8GB) + 3. We suggest you install activemq at `/opt`, so… + 1. `cd /opt` + 2. `sudo tar xvf /mnt/PiTracShare/tmp/apache\*.tar` (or wherever you put the tarball file 2. Test it manually once, and then we’ll start it automatically later: - 1. cd /opt/apache-activemq\* - 2. sudo ./bin/activemq start (NOTE \- must start in main directory to ensure that the files like logs get created in the correct place) + 1. `cd /opt/apache-activemq` + 2. `sudo ./bin/activemq start` (NOTE \- must start in main directory to ensure that the files like logs get created in the correct place) 3. Wait a half-minute and then check the data/activemq.log file to make sure everything is good - 4. netstat \-an|grep 61616 should then return “LISTEN” - 5. sudo ./bin/activemq stop + 4. `netstat -an|grep 61616` should then return “LISTEN” + 5. `sudo ./bin/activemq stop` 2. Setup for remote access - 1. cd conf - 2. sudo cp jetty.xml jetty.xml.ORIGINAL - 3. sudo vi jetty.xml jetty.xml - 1. Search for the line that has 127.0.0.1 and replace with whatever the IP address is for the Pi this is all running on. + 1. `cd conf` + 2. `sudo cp jetty.xml jetty.xml.ORIGINAL` + 3. `sudo vi jetty.xml jetty.xml` + 1. Search for the line that has `127.0.0.1` and replace with whatever the IP address is for the Pi this is all running on. 2. Search for the line that begins with “ Enable this connector if you wish to use https with web console” 3. Uncomment the next section by removing the \!-- and → at the beginning and end of the bean - 4. cd .. ; sudo ./bin/activemq start + 4. `cd .. && sudo ./bin/activemq start` 5. Log into the broker console from another machine by: http://\:8161/admin 1. If this works, the broker is setup correctly 2. Setup ActiveMQ to run automatically on startup - 1. sudo vi /etc/systemd/system/activemq.service and add: - 1. \[Unit\] - 2. Description=ActiveMQ - 3. After=network.target - 4. \[Service\] - 5. User=root - 6. Type=forking - 7. ExecStart=/opt/apache-activemq-6.1.4/bin/activemq start - 8. ExecStop=/opt/apache-activemq-6.1.4/bin/activemq stop - 9. KillSignal=SIGCONT - 10. \[Install\] - 11. WantedBy=multi-user.target - 2. sudo systemctl daemon-reload - 3. sudo systemctl start activemq - 4. sudo systemctl enable activemq - 5. sudo reboot now (to test the auto-start) + 1. `sudo vi /etc/systemd/system/activemq.service` and add: + ```bash + # Verify your version in the directory path name + [Unit] + Description=ActiveMQ + After=network.target + [Service] + User=root + Type=forking + ExecStart=/opt/apache-activemq/bin/activemq start + ExecStop=/opt/apache-activemq/bin/activemq stop + KillSignal=SIGCONT + [Install] + WantedBy=multi-user.target + ``` + 2. `sudo systemctl daemon-reload` + 3. `sudo systemctl start activemq` + 4. `sudo systemctl enable activemq` + 5. `sudo reboot now` (to test the auto-start) 6. After the system comes back, do the following to verify it’s working: - 1. sudo /opt/apache-activemq-6.1.4/bin/activemq status (should say it’s running) + 1. `sudo /opt/apache-activemq-6.1.4/bin/activemq status` (should say it’s running) 2. And from a browser, check #### Install Maven @@ -536,12 +539,13 @@ WantedBy=multi-user.target 1. `sudo tail -f /opt/tomee/logs/catalina.out` 6. Next login from a web console: http://\:8080/manager/html 1. user-name/pwd is by default tomcat/tomcat. Change if not in a private network. + 7. Warning: On Mac Chrome may not allow you to connect from outside the hosted Raspberry Pi. Safari should work. #### Install Launch Monitor Dependencies 25. Install other Launch Monitor dependencies 1. Formatting library because the currently-packaged gcc12.2 in Debian unix doesn’t have the c++20 format capability yet - 1. **`sudo apt`** `-y install libfmt-dev` + 1. `sudo apt -y install libfmt-dev` #### Build Launch Monitor @@ -549,41 +553,45 @@ WantedBy=multi-user.target 1. Download the PiTrac repository, including the source code under the “Software” subdirectory if you haven’t already 1. We usually use a subdirectory called \~/Dev under the home directory of the PiTrac user to house any cloned repositories such as PiTrac. 2. You can do the copy by going to github and downloading the .zip file, or from the command-line on the Pi using something like: - 1. cd \~/Dev - 2. git clone https://github.com/jamespilgrim/PiTrac.git + 1. `cd ~/Dev` + 2. `git clone https://github.com/jamespilgrim/PiTrac.git` 3. NOTE \- If you do you plan to do any code changes, you may want to create a fork from the main repository and then clone that into your Pi. 2. Install Remaining Prerequisites and Setup Environment: - 1. Setup the PITRAC\_ROOT environment variable to point to the “Software/LMSourceCode” directory of the PiTrac build. That is one directory “up” from the “ImageProcessing” directory that contains the main PiTrac meson.build file. + 1. Setup the `PITRAC_ROOT` environment variable to point to the “Software/LMSourceCode” directory of the PiTrac build. That is one directory “up” from the “ImageProcessing” directory that contains the main PiTrac meson.build file. 1. E.g., include in your .zshrc or .bashrc or whatever shell you use: - 1. export PITRAC\_ROOT=/Dev/PiTrac/Software/LMSourceCode - 2. sudo apt-get \-y install libraspberrypi-dev raspberrypi-kernel-headers - 3. Add extended timeout to rpi\_apps.yaml file so that even if an external trigger doesn’t fire for a really long time, the libcamera library won’t time-out: - 1. (**NOTE** for Pi 5, use /usr/share/libcamera/pipeline/rpi/pisp instead of /usr/share/libcamera/pipeline/rpi/vc4, below) - 2. cd /usr/share/libcamera/pipeline/rpi/vc4 - 3. sudo cp rpi\_apps.yaml rpi\_apps.yaml.ORIGINAL - 4. In both /usr/local/share/libcamera/pipeline/rpi/vc4/rpi\_apps.yaml and /usr/share/libcamera/pipeline/rpi/vc4/rpi\_apps.yaml, at the end of the pipeline section, add the following (including the last comma\!) - 1. \# Custom timeout value (in ms) for camera to use. This overrides - 2. \# the value computed by the pipeline handler based on frame - 3. \# durations. - 4. \# - 5. \# Set this value to 0 to use the pipeline handler computed - 6. \# timeout value. - 7. \# - 8. "camera\_timeout\_value\_ms": 1000000, + 1. `export PITRAC_ROOT=/Dev/PiTrac/Software/LMSourceCode` + 2. `sudo apt-get -y install libraspberrypi-dev raspberrypi-kernel-headers` + 3. Add extended timeout to `rpi_apps.yaml` file so that even if an external trigger doesn’t fire for a really long time, the libcamera library won’t time-out: + 1. (**NOTE** for Pi 5, use `/usr/share/libcamera/pipeline/rpi/pisp` instead of `/usr/share/libcamera/pipeline/rpi/vc4`, below) + 2. `cd /usr/share/libcamera/pipeline/rpi/vc4` + 3. `sudo cp rpi_apps.yaml rpi_apps.yaml.ORIGINAL` + 4. In both `/usr/local/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml` and `usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml`, at the end of the pipeline section, add the following (including the last comma\!) + Warning: If running `libcamera-vid -t 0` results in a blank screen. Something went wrong in this step, causing the camera to timeout. + As a result, use `ps -aux | grep libcamera` to kill the pid `sudo kill -9 `. This will also cause other errors/issues while attemping to use `pitrac_lm`. + ``` bash + # Custom timeout value (in ms) for camera to use. This overrides + # the value computed by the pipeline handler based on frame + # durations. + # + # Set this value to 0 to use the pipeline handler computed + # timeout value. + # + "camera_timeout_value_ms": 1000000, + ``` 5. The first file deals with the local file from the libcamera build, and the second one is the for libcamera that is installed with the O/S. We will set both, just in case. - 2. Get the latest imx296\_noir.json into /usr/share/libcamera/ipa/rpi/pisp + 2. Get the latest `imx296_noir.json` into `/usr/share/libcamera/ipa/rpi/pisp` (located inside ImageProcessing folder) 1. For the Pi 4: - 1. sudo cp imx296\_noir.json /usr/share/libcamera/ipa/rpi/vc4 + 1. `sudo cp imx296_noir.json /usr/share/libcamera/ipa/rpi/vc4` 2. For the Pi 5: - 1. sudo cp imx296\_noir.json /usr/share/libcamera/ipa/rpi/pisp - 2. Go to the directory called ImageProcessing below whatever PITRAC\_ROOT directory path you will be using to compile. E.g., - 1. cd $PITRAC\_ROOT/ImageProcessing - 3. chmod \+x create\_closed\_source\_objects.sh - 4. meson setup build + 1. `sudo cp imx296_noir.json /usr/share/libcamera/ipa/rpi/pisp` + 2. Go to the directory called ImageProcessing below whatever `PITRAC_ROOT` directory path you will be using to compile. E.g., + 1. `cd $PITRAC_ROOT/ImageProcessing` + 3. `chmod +x create_closed_source_objects.sh` + 4. `meson setup build` 1. If there are any missing libraries, ensure that the pre-requisites were all successfully built and installed and that any corresponding pkgconfig files were created correctly per the steps above. - 5. ninja \-C build (add \-j 2 if compiling in 4GB or less) + 5. `ninja -C build` (add \-j 2 if compiling in 4GB or less) 6. If the build completes successfully, try a quick sanity check to ensure that any shared libraries are correctly linked at that the PiTrac application can at least run: - 1. build/pitrac\_lm –help + 1. `build/pitrac_lm --help` 2. (that’s two ‘-’ characters before help) 3. The app should return the available command-line options @@ -594,44 +602,48 @@ WantedBy=multi-user.target 27. Setup the PiTrac-specific code package for the PiTrac GUI on the Tomee server 1. Log into the Pi 2 computer where the Tomee instance is running 2. Make sure Tomee is running: - 1. sudo systemctl status tomee (hit ‘q’ to exit) - 3. cd \~/Dev (or whatever the root of your development environment is) - 4. mkdir WebAppDev - 5. cd WebAppDev - 6. vi refresh\_from\_dev.sh (a new file) and put this in it: - 1. \# After running this script, then do a "mvn package" to compile and then - 2. \# /opt/tomee/bin/restart.sh - 3. mkdir \-p src/main/{webapp/WEB-INF,java/com/verdanttechs/jakarta/ee9} - 4. cp $PITRAC\_ROOT/ImageProcessing/golfsim\_tomee\_webapp/src/main/java/com/verdanttechs/jakarta/ee9/MonitorServlet.java ./src/main/java/com/verdanttechs/jakarta/ee9/ - 5. cp $PITRAC\_ROOT//ImageProcessing/golfsim\_tomee\_webapp/src/main/webapp/WEB-INF/\*.jsp ./src/main/webapp/WEB-INF - 6. cp $PITRAC\_ROOT//ImageProcessing/golfsim\_tomee\_webapp/src/main/webapp/\*.html ./src/main/webapp - 7. cp $PITRAC\_ROOT//ImageProcessing/golfsim\_tomee\_webapp/pom.xml . - 8. \# Also pull over the current .json configuration file to make sure that the webapp is looking at the correct version. - 9. cp $PITRAC\_ROOT//ImageProcessing/golf\_sim\_config.json \~/LM\_Shares/WebShare/ + 1. `sudo systemctl status tomee` (hit ‘q’ to exit) + 3. `cd ~/Dev` (or whatever the root of your development environment is) + 4. `mkdir WebAppDev` + 5. `cd WebAppDe`v + 6. `vi refresh_from_dev.sh` (a new file) and put this in it: + Note: Update your Broker IP address located in `MonitorServlet.java` class before creating the file below. Will be improved in the future. + ``` bash + # After running this script, then do a "mvn package" to compile and then + # /opt/tomee/bin/restart.sh + mkdir -p src/main/{webapp/WEB-INF,java/com/verdanttechs/jakarta/ee9} + cp $PITRAC_ROOT/ImageProcessing/golfsim_tomee_webapp/src/main/java/com/verdanttechs/jakarta/ee9/MonitorServlet.java ./src/main/java/com/verdanttechs/jakarta/ee9/ + cp $PITRAC_ROOT/ImageProcessing/golfsim_tomee_webapp/src/main/webapp/WEB-INF/*.jsp ./src/main/webapp/WEB-INF + cp $PITRAC_ROOT/ImageProcessing/golfsim_tomee_webapp/src/main/webapp/*.html ./src/main/webapp + cp $PITRAC_ROOT/ImageProcessing/golfsim_tomee_webapp/pom.xml . + # Also pull over the current .json configuration file to make sure that the webapp is looking at the correct version. + cp $PITRAC_ROOT/ImageProcessing/golf_sim_config.json ~/LM_Shares/WebShare/ + ``` 2. Run the new script to bring over the java and other web-based GUI files: - 1. . ./refresh\_from\_dev.sh + 1. `./refresh_from_dev.sh` 2. NOTE that the above script will also move a copy of the golf\_sim\_config.json file into the shared directory that the GUI can access in order to get information about its run-time environment. 3. Tell the MonitorServlet where to find its configuration file - 1. vi ./src/main/webapp/index.html - 2. Change the FPITRAC\_USERNAME to be whatever the PiTrac user’s name is on the system. That line in the index.html file tells the java servlet where to find the json configuration file. - 1. Alternatively, you can just create a browser bookmark to point to the servlet with the correct filename + 1. `vi ./src/main/webapp/index.html` + 2. Change the `FPITRAC_USERNAME` to be whatever the PiTrac user’s name is on the system. That line in the index.html file tells the java servlet where to find the json configuration file. + 1. Alternatively, you can just create a browser bookmark to point to the servlet with the correct filename + ![](snapshots/index_replace_name.png) 2. Create the “.war” package for Tomee - 1. mvn package + 1. `mvn package` 2. NOTE: The first time this is performed, it will take a few minutes to gather up all the required packages from the internet - 3. This process will create a “golfsim.war” file in the “target” directory. That file will then have to be “deployed” into tomee by using the manager console at http://\:8080/manager/html + 3. This process will create a “golfsim.war” file in the “target” directory. That file will then have to be “deployed” into tomee by using the manager console at `http://:8080/manager/html` 4. Your browser should have a window titled “Tomcat Web Application Manager”. You may have to use the default login of tomcat/tomcat 5. Copy the .war file to a place that is visible on the computer from where your browser is logged into the tomee console. 6. Select “Choose File” in the section in the Tomee manager console labeled “WAR file to deploy”. Select the .war file and then wait a moment until it’s name is displayed. Then push the “Deploy” button. 7. In a moment, the “golfsim” app should show up on the list. Click it. 8. If you get a “HTTP Status 404 – Not Found” error, try: - 1. cd /opt/tomee/webapps - 2. sudo chmod \-R 777 golfsim - 3. sudo systemctl restart tomee (the first error will ‘stick’ otherwise) + 1. `cd /opt/tomee/webapps` + 2. `sudo chmod -R 777 golfsim` + 3. `sudo systemctl restart tomee` (the first error will ‘stick’ otherwise) 9. Alternatively, you can just manually move the .war file into place and Tomee should pick it up. Wait 30 seconds or so after doing this to give Tomee a moment to see the new war file and deploy it. - 1. cd /opt/tomee/webapps - 2. sudo cp \~/Dev/WebAppDev/target/golfsim.war . + 1. `cd /opt/tomee/webapps` + 2. `sudo cp ~/Dev/WebAppDev/target/golfsim.war .` 10. Confirm you can see the PiTrac GUI by entering the following into your browser: - 1. http://\:8080/golfsim/monitor?config\_filename=%2Fhome%2Fmleary%2FLM\_Shares/%2FWebShare%2Fgolf\_sim\_config.json + 1. `http://:8080/golfsim/monitor?config_filename=%2Fhome%2Fmleary%2FLM_Shares%2FWebShare%2Fgolf_sim_config.json` 11. You should see the PiTrac GUI **CONGRATULATIONS\!** \- At this point, you’ve (hopefully) built the PiTrac software. Please see the [Startup Documentation](https://github.com/jamespilgrim/PiTrac/blob/main/Documentation/PiTrac%20Start-Up%20Documentation.md) for how to get PiTrac working\! diff --git a/Documentation/snapshots/index_replace_name.png b/Documentation/snapshots/index_replace_name.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcad3e272b2a09f1a70104965e87a61916abe0a GIT binary patch literal 53337 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 Date: Wed, 8 Jan 2025 14:33:54 -0800 Subject: [PATCH 2/3] docs: adding myself as a user in cla --- .github/workflows/cla.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index d39a259..7fdf4af 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -30,7 +30,7 @@ jobs: path-to-document: 'https://gist.github.com/jamespilgrim/e6996a438adc0919ebbe70561efbb600#file-verdant-contributor-license-agreement-md' # e.g. a CLA or a DCO document # branch should not be protected branch: 'main' - allowlist: bot* + allowlist: jeshernandez,bot* # the followings are the optional inputs - If the optional inputs are not given, then default values will be taken #remote-organization-name: enter the remote organization name where the signatures should be stored (Default is storing the signatures in the same repository) From 0556af6057ee7e2983d41107f88f392112bd1526 Mon Sep 17 00:00:00 2001 From: jeshernandez Date: Wed, 8 Jan 2025 14:42:51 -0800 Subject: [PATCH 3/3] docs: rolling back cla user, adding json manually --- .github/workflows/cla.yml | 2 +- signatures/version1/cla.json | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 7fdf4af..d39a259 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -30,7 +30,7 @@ jobs: path-to-document: 'https://gist.github.com/jamespilgrim/e6996a438adc0919ebbe70561efbb600#file-verdant-contributor-license-agreement-md' # e.g. a CLA or a DCO document # branch should not be protected branch: 'main' - allowlist: jeshernandez,bot* + allowlist: bot* # the followings are the optional inputs - If the optional inputs are not given, then default values will be taken #remote-organization-name: enter the remote organization name where the signatures should be stored (Default is storing the signatures in the same repository) diff --git a/signatures/version1/cla.json b/signatures/version1/cla.json index 16f8f26..e3bec6b 100644 --- a/signatures/version1/cla.json +++ b/signatures/version1/cla.json @@ -7,6 +7,14 @@ "created_at": "2024-12-23T17:06:26Z", "repoId": 904805584, "pullRequestNo": 2 + }, + { + "name": "jeshernandez", + "id": 5488698, + "comment_id": 2578806304, + "created_at": "2025-01-08T14:43:26Z", + "repoId": 904805584, + "pullRequestNo": 50 } ] } \ No newline at end of file