diff --git a/demo/capture-upload.sh b/demo/capture-upload.sh index cbc7413..ac30d69 100755 --- a/demo/capture-upload.sh +++ b/demo/capture-upload.sh @@ -31,6 +31,7 @@ API_URL="${API_URL:-https://dev.seedheads.de/picUploadApi/upload}" CAMERA_ID="${CAMERA_ID:-rpi-webcam}" VIDEO_DEVICE="${VIDEO_DEVICE:-/dev/video0}" RESOLUTION="${RESOLUTION:-1920x1080}" +CAPTURE_METHOD="${CAPTURE_METHOD:-fswebcam}" SKIP_FRAMES="${SKIP_FRAMES:-5}" TEMP_DIR="${TEMP_DIR:-/tmp}" LOG_FILE="${LOG_FILE:-${SCRIPT_DIR}/picupper.log}" @@ -71,23 +72,41 @@ if [[ "${1:-}" == "--test" ]]; then echo "Camera ID: $CAMERA_ID" echo "Video device: $VIDEO_DEVICE" echo "Resolution: $RESOLUTION" + echo "Capture Method: $CAPTURE_METHOD" echo "" - # Check video device - if [[ ! -e "$VIDEO_DEVICE" ]]; then - echo "❌ Video device not found: $VIDEO_DEVICE" - echo " Available devices:" - ls -la /dev/video* 2>/dev/null || echo " No video devices found" + # Check video device (only if using fswebcam or if device is specified for rpicam) + if [[ "$CAPTURE_METHOD" == "fswebcam" ]]; then + if [[ ! -e "$VIDEO_DEVICE" ]]; then + echo "❌ Video device not found: $VIDEO_DEVICE" + echo " Available devices:" + ls -la /dev/video* 2>/dev/null || echo " No video devices found" + exit 1 + fi + echo "✓ Video device exists: $VIDEO_DEVICE" + + # Check fswebcam + if ! command -v fswebcam &>/dev/null; then + echo "❌ fswebcam not installed. Run: sudo apt install fswebcam" + exit 1 + fi + echo "✓ fswebcam installed" + elif [[ "$CAPTURE_METHOD" == "rpicam-still" ]] || [[ "$CAPTURE_METHOD" == "libcamera-still" ]]; then + # Check rpicam-still/libcamera-still + CMD_NAME="rpicam-still" + if ! command -v rpicam-still &>/dev/null; then + if command -v libcamera-still &>/dev/null; then + CMD_NAME="libcamera-still" + else + echo "❌ rpicam-still (or libcamera-still) not installed." + exit 1 + fi + fi + echo "✓ $CMD_NAME installed" + else + echo "❌ Unknown CAPTURE_METHOD: $CAPTURE_METHOD" exit 1 fi - echo "✓ Video device exists: $VIDEO_DEVICE" - - # Check fswebcam - if ! command -v fswebcam &>/dev/null; then - echo "❌ fswebcam not installed. Run: sudo apt install fswebcam" - exit 1 - fi - echo "✓ fswebcam installed" # Try capture # Get System Info for Overlay @@ -96,22 +115,40 @@ if [[ "${1:-}" == "--test" ]]; then echo "Capturing test image to: $TEST_FILE" - if fswebcam -d "$VIDEO_DEVICE" -r "$RESOLUTION" -S "$SKIP_FRAMES" \ - --title "$CAMERA_ID" \ - --subtitle "$SYSTEM_IP" \ - --banner-colour '#AA000000' \ - --line-colour '#FF000000' \ - --text-colour '#FFFFFF' \ - --font "sans:24" \ - --timestamp "%Y-%m-%d %H:%M:%S" \ - "$TEST_FILE" 2>/dev/null; then - FILE_SIZE=$(stat -f%z "$TEST_FILE" 2>/dev/null || stat -c%s "$TEST_FILE" 2>/dev/null) - echo "✓ Capture successful: $TEST_FILE (${FILE_SIZE} bytes)" - echo "" - echo "To view the image: gpicview $TEST_FILE" + if [[ "$CAPTURE_METHOD" == "rpicam-still" ]] || [[ "$CAPTURE_METHOD" == "libcamera-still" ]]; then + # Parse resolution + WIDTH=$(echo "$RESOLUTION" | cut -d'x' -f1) + HEIGHT=$(echo "$RESOLUTION" | cut -d'x' -f2) + + CMD="rpicam-still" + command -v libcamera-still &>/dev/null && CMD="libcamera-still" + + if $CMD -o "$TEST_FILE" --width "$WIDTH" --height "$HEIGHT" --nopreview --timeout 2000; then + FILE_SIZE=$(stat -f%z "$TEST_FILE" 2>/dev/null || stat -c%s "$TEST_FILE" 2>/dev/null) + echo "✓ Capture successful: $TEST_FILE (${FILE_SIZE} bytes)" + else + echo "❌ Capture failed." + exit 1 + fi else - echo "❌ Capture failed. Check webcam connection and permissions." - exit 1 + # fswebcam default + if fswebcam -d "$VIDEO_DEVICE" -r "$RESOLUTION" -S "$SKIP_FRAMES" \ + --title "$CAMERA_ID" \ + --subtitle "$SYSTEM_IP" \ + --banner-colour '#AA000000' \ + --line-colour '#FF000000' \ + --text-colour '#FFFFFF' \ + --font "sans:24" \ + --timestamp "%Y-%m-%d %H:%M:%S" \ + "$TEST_FILE" 2>/dev/null; then + FILE_SIZE=$(stat -f%z "$TEST_FILE" 2>/dev/null || stat -c%s "$TEST_FILE" 2>/dev/null) + echo "✓ Capture successful: $TEST_FILE (${FILE_SIZE} bytes)" + echo "" + echo "To view the image: gpicview $TEST_FILE" + else + echo "❌ Capture failed. Check webcam connection and permissions." + exit 1 + fi fi exit 0 @@ -123,10 +160,12 @@ fi TEMP_FILE="${TEMP_DIR}/picupper_${CAMERA_ID}_$(date +%s).jpg" -# Check video device -if [[ ! -e "$VIDEO_DEVICE" ]]; then - log_error "Video device not found: $VIDEO_DEVICE" - exit 1 +# Check video device (only for fswebcam) +if [[ "$CAPTURE_METHOD" == "fswebcam" ]]; then + if [[ ! -e "$VIDEO_DEVICE" ]]; then + log_error "Video device not found: $VIDEO_DEVICE" + exit 1 + fi fi # Fetch and apply camera settings from server @@ -245,28 +284,47 @@ upload_current_settings() { fi } -apply_camera_settings +# Only handle settings upload/apply for fswebcam/v4l2 for now +if [[ "$CAPTURE_METHOD" == "fswebcam" ]]; then + apply_camera_settings +fi # Capture image -log "Capturing from $VIDEO_DEVICE ($RESOLUTION)" +log "Capturing using $CAPTURE_METHOD ($RESOLUTION)" # Get System Info for Overlay SYSTEM_HOSTNAME=$(hostname) # Get first non-loopback IP SYSTEM_IP=$(hostname -I 2>/dev/null | awk '{print $1}') || SYSTEM_IP="unknown" -if ! fswebcam -d "$VIDEO_DEVICE" -r "$RESOLUTION" -S "$SKIP_FRAMES" \ - --title "$CAMERA_ID" \ - --subtitle "$SYSTEM_IP" \ - --banner-colour '#AA000000' \ - --line-colour '#FF000000' \ - --text-colour '#FFFFFF' \ - --font "sans:24" \ - --timestamp "%Y-%m-%d %H:%M:%S" \ - "$TEMP_FILE" 2>/dev/null; then - log_error "Capture failed" - exit 1 +if [[ "$CAPTURE_METHOD" == "rpicam-still" ]] || [[ "$CAPTURE_METHOD" == "libcamera-still" ]]; then + WIDTH=$(echo "$RESOLUTION" | cut -d'x' -f1) + HEIGHT=$(echo "$RESOLUTION" | cut -d'x' -f2) + + CMD="rpicam-still" + command -v libcamera-still &>/dev/null && CMD="libcamera-still" + + # Note: Text overlay on rpicam-still is not as straightforward as fswebcam (requires --post-process-file or similar), + # so we are skipping overlay for now to keep it simple, or we could use imagemagick later if requested. + if ! $CMD -o "$TEMP_FILE" --width "$WIDTH" --height "$HEIGHT" --nopreview --timeout 2000 >/dev/null 2>&1; then + log_error "Capture failed with $CMD" + exit 1 + fi +else + # fswebcam logic + if ! fswebcam -d "$VIDEO_DEVICE" -r "$RESOLUTION" -S "$SKIP_FRAMES" \ + --title "$CAMERA_ID" \ + --subtitle "$SYSTEM_IP" \ + --banner-colour '#AA000000' \ + --line-colour '#FF000000' \ + --text-colour '#FFFFFF' \ + --font "sans:24" \ + --timestamp "%Y-%m-%d %H:%M:%S" \ + "$TEMP_FILE" 2>/dev/null; then + log_error "Capture failed" + exit 1 + fi fi FILE_SIZE=$(stat -c%s "$TEMP_FILE" 2>/dev/null || echo "unknown") diff --git a/demo/picupper.conf.example b/demo/picupper.conf.example index 8f219fa..e3ac5c7 100644 --- a/demo/picupper.conf.example +++ b/demo/picupper.conf.example @@ -24,6 +24,9 @@ VIDEO_DEVICE="/dev/video0" # Capture resolution (common options: 1920x1080, 1280x720, 640x480) RESOLUTION="1920x1080" +# Capture Method: "fswebcam" (default, for USB webcams) or "rpicam-still" (for Raspberry Pi cameras) +CAPTURE_METHOD="fswebcam" + # Skip first N frames (helps camera adjust exposure, default 5) SKIP_FRAMES=5