u
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user