diff --git a/.github/workflows/generate-web-controller-preview.yml b/.github/workflows/generate-web-controller-preview.yml new file mode 100644 index 0000000..4e2bb40 --- /dev/null +++ b/.github/workflows/generate-web-controller-preview.yml @@ -0,0 +1,113 @@ +name: Generate Web Controller Preview + +on: + workflow_dispatch: + push: + paths: + - 'LifeTrac-v25/raspberry_pi_web_controller/static/**' + - 'LifeTrac-v25/raspberry_pi_web_controller/templates/**' + - 'LifeTrac-v25/raspberry_pi_web_controller/preview/**' + - '.github/workflows/generate-web-controller-preview.yml' + +jobs: + generate-screenshot: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install Playwright + run: | + npm init -y + npm install --save-dev @playwright/test + npx playwright install --with-deps chromium + + - name: Start HTTP server + run: | + cd LifeTrac-v25/raspberry_pi_web_controller/preview + python3 -m http.server 8080 & + echo "HTTP_SERVER_PID=$!" >> $GITHUB_ENV + sleep 2 + + - name: Create screenshot script + run: | + cat > screenshot.js << 'EOF' + const { chromium } = require('@playwright/test'); + + (async () => { + const browser = await chromium.launch(); + const context = await browser.newContext({ + viewport: { width: 1920, height: 1080 } + }); + const page = await context.newPage(); + + console.log('Navigating to page...'); + await page.goto('http://localhost:8080/standalone.html'); + + console.log('Waiting for page to be ready...'); + await page.waitForSelector('[data-ready="true"]', { timeout: 10000 }); + + // Wait a bit more for joysticks to fully render + await page.waitForTimeout(2000); + + console.log('Taking screenshot...'); + await page.screenshot({ + path: 'web-controller-preview.png', + fullPage: false + }); + + console.log('Screenshot saved!'); + await browser.close(); + })(); + EOF + + - name: Generate screenshot + run: node screenshot.js + + - name: Verify screenshot was created + run: | + if [ -f "web-controller-preview.png" ]; then + echo "Screenshot created successfully" + ls -lh web-controller-preview.png + else + echo "ERROR: Screenshot was not created" + exit 1 + fi + + - name: Move screenshot to preview directory + run: | + mv web-controller-preview.png LifeTrac-v25/raspberry_pi_web_controller/preview/ + + - name: Upload screenshot as artifact + uses: actions/upload-artifact@v4 + with: + name: web-controller-preview + path: LifeTrac-v25/raspberry_pi_web_controller/preview/web-controller-preview.png + retention-days: 90 + + - name: Commit and push screenshot + run: | + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git add LifeTrac-v25/raspberry_pi_web_controller/preview/web-controller-preview.png + if ! git diff --staged --quiet; then + git commit -m "Update web controller preview screenshot [skip ci]" + git push --force-with-lease origin HEAD || { echo "ERROR: git push failed. Please check for conflicts or permission issues."; exit 1; } + else + echo "No changes to commit." + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Stop HTTP server + if: always() + run: | + if [ ! -z "$HTTP_SERVER_PID" ]; then + kill $HTTP_SERVER_PID || true + fi diff --git a/LifeTrac-v25/README.md b/LifeTrac-v25/README.md index 92c3c85..aea3892 100644 --- a/LifeTrac-v25/README.md +++ b/LifeTrac-v25/README.md @@ -74,6 +74,9 @@ LifeTrac v25 features a comprehensive remote control system with multiple contro - WebSocket for real-time communication - See [raspberry_pi_web_controller/README.md](raspberry_pi_web_controller/README.md) for setup +![Web Controller Preview](raspberry_pi_web_controller/preview/web-controller-preview.png) +*Browser-based control interface with live camera feed and on-screen joysticks* + ## ROS2 Integration - **ros2_bridge/**: ROS2 packages for BeagleBone control via MQTT - **lifetrac_msgs/**: Custom ROS2 message definitions diff --git a/LifeTrac-v25/raspberry_pi_web_controller/preview/.gitignore b/LifeTrac-v25/raspberry_pi_web_controller/preview/.gitignore new file mode 100644 index 0000000..c0d7ca7 --- /dev/null +++ b/LifeTrac-v25/raspberry_pi_web_controller/preview/.gitignore @@ -0,0 +1,11 @@ +# Node modules (if testing locally) +node_modules/ +package.json +package-lock.json + +# Temporary files +*.tmp +*.log + +# Keep the generated screenshot +!web-controller-preview.png diff --git a/LifeTrac-v25/raspberry_pi_web_controller/preview/README.md b/LifeTrac-v25/raspberry_pi_web_controller/preview/README.md new file mode 100644 index 0000000..2d8d088 --- /dev/null +++ b/LifeTrac-v25/raspberry_pi_web_controller/preview/README.md @@ -0,0 +1,73 @@ +# Web Controller Preview Assets + +This directory contains assets for generating preview screenshots of the LifeTrac v25 web controller interface. + +## Files + +### camera-placeholder.svg +An SVG placeholder image that simulates a camera feed view. Used in the standalone HTML to provide a realistic preview without requiring an actual camera connection. + +### standalone.html +A self-contained HTML page that includes: +- Complete web controller interface styling (embedded CSS) +- Joystick initialization code (embedded JavaScript) +- No Flask backend dependencies +- Uses the camera placeholder image + +This page is used by the GitHub Actions workflow to generate screenshots automatically. + +### web-controller-preview.png +Auto-generated screenshot of the web controller interface showing: +- Header with status indicators +- Camera feed area with placeholder +- Left joystick (Tank Steering - green) +- Right joystick (Hydraulics - orange) +- Emergency stop button +- Keyboard shortcuts reference + +## Usage + +### Manual Screenshot Generation + +To generate a screenshot locally: + +1. Install Playwright: +```bash +npm init -y +npm install --save-dev @playwright/test +npx playwright install --with-deps chromium +``` + +2. Start a local HTTP server: +```bash +cd preview +python3 -m http.server 8080 +``` + +3. Run the screenshot script: +```bash +node screenshot.js +``` + +### Automated Screenshot Generation + +The GitHub Actions workflow (`.github/workflows/generate-web-controller-preview.yml`) automatically: +- Triggers on changes to web controller files +- Generates a fresh screenshot +- Uploads it as an artifact +- Commits it back to the repository + +You can also manually trigger the workflow from the GitHub Actions tab. + +## Customization + +To customize the preview appearance: +1. Edit `standalone.html` to change the UI layout or styling +2. Edit `camera-placeholder.svg` to change the placeholder image +3. Run the screenshot generation process to create a new preview + +## Integration + +The preview image is referenced in: +- `LifeTrac-v25/README.md` - Main documentation +- GitHub repository preview for the web controller feature diff --git a/LifeTrac-v25/raspberry_pi_web_controller/preview/camera-placeholder.svg b/LifeTrac-v25/raspberry_pi_web_controller/preview/camera-placeholder.svg new file mode 100644 index 0000000..163510c --- /dev/null +++ b/LifeTrac-v25/raspberry_pi_web_controller/preview/camera-placeholder.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LifeTrac v25 Camera Feed + + + Live view from Arducam IMX335 + + diff --git a/LifeTrac-v25/raspberry_pi_web_controller/preview/standalone.html b/LifeTrac-v25/raspberry_pi_web_controller/preview/standalone.html new file mode 100644 index 0000000..682c751 --- /dev/null +++ b/LifeTrac-v25/raspberry_pi_web_controller/preview/standalone.html @@ -0,0 +1,422 @@ + + + + + + LifeTrac v25 Control - Preview + + + + +
+ + + + +
+ Camera Feed +
+ + +
+ +
+

Tank Steering

+
+
+ X: 0.00 + Y: 0.00 +
+
+
↑ Forward / ↓ Backward
+
← Left Turn / → Right Turn
+
+
+ + +
+ +
+ Keyboard Shortcuts:
+ WASD: Tank Steering
+ IJKL: Hydraulics
+ Space: Emergency Stop +
+
+ + +
+

Hydraulics

+
+
+ X: 0.00 + Y: 0.00 +
+
+
↑ Arms Up / ↓ Arms Down
+
← Bucket Down / → Bucket Up
+
+
+
+ + +
+ + +
+
+ + + + diff --git a/LifeTrac-v25/raspberry_pi_web_controller/preview/web-controller-preview.png b/LifeTrac-v25/raspberry_pi_web_controller/preview/web-controller-preview.png new file mode 100644 index 0000000..c72b52d Binary files /dev/null and b/LifeTrac-v25/raspberry_pi_web_controller/preview/web-controller-preview.png differ