Skip to content
Open
75 changes: 60 additions & 15 deletions files/camera-settings/camera-settings.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
[delayed_gcode LOAD_CAM_SETTINGS]
initial_duration: 2
gcode:
CAM_SELECT CAM_DEVICE=4
CAM_BRIGHTNESS BRIGHTNESS=0
CAM_CONTRAST CONTRAST=32
CAM_SATURATION SATURATION=56
Expand All @@ -17,7 +18,9 @@ gcode:
CAM_BACKLIGHT_COMPENSATION BACKLIGHT_COMPENSATION=1
CAM_EXPOSURE_AUTO EXPOSURE_AUTO=3
CAM_EXPOSURE_AUTO_PRIORITY EXPOSURE_AUTO_PRIORITY=0

CAM_EXPOSURE_ABSOLUTE EXPOSURE_ABSOLUTE=1000
CAM_FOCUS_AUTO FOCUS_AUTO=0
CAM_FOCUS_ABSOLUTE FOCUS_ABSOLUTE=127

[gcode_shell_command v4l2-ctl]
command: v4l2-ctl
Expand All @@ -27,82 +30,124 @@ verbose: True
[gcode_macro CAM_SETTINGS]
description: Show current camera settings
gcode:
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 -l"
{% set param = "-d /dev/video%s -l" % (printer["gcode_macro CAM_SELECT"].cam_device) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_BRIGHTNESS]
description: min=-64 / max=64
gcode:
{% set brightness = params.BRIGHTNESS|default(0) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl brightness="{brightness}
{% set param = "-d /dev/video%s --set-ctrl brightness=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, brightness) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_CONTRAST]
description: min=0 / max=64
gcode:
{% set contrast = params.CONTRAST|default(32) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl contrast="{contrast}
{% set param = "-d /dev/video%s --set-ctrl contrast=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, contrast) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_SATURATION]
description: min=0 / max=128
gcode:
{% set saturation = params.SATURATION|default(56) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl saturation="{saturation}
{% set param = "-d /dev/video%s --set-ctrl saturation=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, saturation) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_HUE]
description: min=-40 / max=40
gcode:
{% set hue = params.HUE|default(0) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl hue="{hue}
{% set param = "-d /dev/video%s --set-ctrl hue=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, hue) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_WHITE_BALANCE_TEMPERATURE_AUTO]
description: disable=0 / enable=1
gcode:
{% set white_balance_temperature_auto = params.WHITE_BALANCE_TEMPERATURE_AUTO|default(1) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl white_balance_temperature_auto="{white_balance_temperature_auto}
{% set param = "-d /dev/video%s --set-ctrl white_balance_temperature_auto=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, white_balance_temperature_auto) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_GAMMA]
description: min=72 / max=500
gcode:
{% set gamma = params.GAMMA|default(80) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl gamma="{gamma}
{% set param = "-d /dev/video%s --set-ctrl gamma=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, gamma) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_GAIN]
description: min=0 / max=100
gcode:
{% set gain = params.GAIN|default(0) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl gain="{gain}
{% set param = "-d /dev/video%s --set-ctrl gain=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, gain) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_POWER_LINE_FREQUENCY]
description: min=0 / max=2
gcode:
{% set power_line_frequency = params.POWER_LINE_FREQUENCY|default(1) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl power_line_frequency="{power_line_frequency}
{% set param = "-d /dev/video%s --set-ctrl power_line_frequency=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, power_line_frequency) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_WHITE_BALANCE_TEMPERATURE]
description: min=2800 / max=6500
gcode:
{% set white_balance_temperature = params.WHITE_BALANCE_TEMPERATURE|default(4600) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl white_balance_temperature="{white_balance_temperature}
{% set param = "-d /dev/video%s --set-ctrl white_balance_temperature=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, white_balance_temperature) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_SHARPNESS]
description: min=0 / max=6
gcode:
{% set sharpness = params.SHARPNESS|default(3) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl sharpness="{sharpness}
{% set param = "-d /dev/video%s --set-ctrl sharpness=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, sharpness) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_BACKLIGHT_COMPENSATION]
description: min=0 / max=2
gcode:
{% set backlight_compensation = params.BACKLIGHT_COMPENSATION|default(1) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl backlight_compensation="{backlight_compensation}
{% set param = "-d /dev/video%s --set-ctrl backlight_compensation=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, backlight_compensation) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_EXPOSURE_AUTO]
description: manual=1 / auto=3
gcode:
{% set exposure_auto = params.EXPOSURE_AUTO|default(3) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl exposure_auto="{exposure_auto}
{% set param = "-d /dev/video%s --set-ctrl exposure_auto=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, exposure_auto) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_EXPOSURE_AUTO_PRIORITY]
description: disable=0 / enable=1
gcode:
{% set exposure_auto_priority = params.EXPOSURE_AUTO_PRIORITY|default(0) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="-d /dev/video4 --set-ctrl exposure_auto_priority="{exposure_auto_priority}
{% set param = "-d /dev/video%s --set-ctrl exposure_auto_priority=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, exposure_auto_priority) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_EXPOSURE_ABSOLUTE]
description: min=3 / max=2047
gcode:
{% set exposure_absolute = params.EXPOSURE_ABSOLUTE|default(3) %}
{% set param = "-d /dev/video%s --set-ctrl exposure_absolute=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, exposure_absolute) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_FOCUS_AUTO]
description: disable=0 / enable=1
gcode:
{% set focus_auto = params.FOCUS_AUTO|default(0) %}
{% set param = "-d /dev/video%s --set-ctrl focus_auto=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, focus_auto) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_FOCUS_ABSOLUTE]
description: min=0 / max=250
gcode:
{% set focus_absolute = params.FOCUS_ABSOLUTE|default(127) %}
{% set param = "-d /dev/video%s --set-ctrl focus_absolute=%s" % (printer["gcode_macro CAM_SELECT"].cam_device, focus_absolute) %}
RUN_SHELL_COMMAND CMD=v4l2-ctl PARAMS="""{param}"""

[gcode_macro CAM_SELECT]
description: device=/dev/video(4|5)
variable_cam_device: 4
gcode:
SET_GCODE_VARIABLE MACRO=CAM_SELECT VARIABLE=cam_device VALUE={params.CAM_DEVICE|default(cam_device)}

Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
case "$1" in
start)
echo "Starting USB Camera..."
V4L_DEVS=$(v4l2-ctl --list-devices | grep -A1 usb | sed 's/^[[:space:]]*//g' | grep '^/dev')
CREALITY_CAMS=$(v4l2-ctl --list-devices | grep -E 'CREALITY' | wc -l)
V4L_DEVS=$(v4l2-ctl --list-devices | grep -vE 'CCX2F3298|CCX2F3299' | grep -A1 usb | sed 's/^[[:space:]]*//g' | grep '^/dev')
CREALITY_CAMS=$(v4l2-ctl --list-devices | grep -E 'CREALITY|CCX2F3298|CCX2F3298' | wc -l)
if [ "x$V4L_DEVS" = "x" -o $CREALITY_CAMS -gt 0 ]; then
/opt/bin/mjpg_streamer -b -i "/opt/lib/mjpg-streamer/input_uvc.so -d /dev/video4 -r 1280x720 -f 15" -o "/opt/lib/mjpg-streamer/output_http.so -p 8080"
/opt/bin/mjpg_streamer -b -i "/opt/lib/mjpg-streamer/input_uvc.so -d /dev/video5 -r 1280x720 -f 15" -o "/opt/lib/mjpg-streamer/output_http.so -p 8080"
/opt/bin/mjpg_streamer -b -i "/opt/lib/mjpg-streamer/input_uvc.so -d /dev/video6 -r 1280x720 -f 15" -o "/opt/lib/mjpg-streamer/output_http.so -p 8081"
else
/opt/bin/mjpg_streamer -b -i "/opt/lib/mjpg-streamer/input_uvc.so -d /dev/video4 -r 1280x720 -f 15" -o "/opt/lib/mjpg-streamer/output_http.so -p 8080"
/opt/bin/mjpg_streamer -b -i "/opt/lib/mjpg-streamer/input_uvc.so -d /dev/video5 -r 1280x720 -f 15" -o "/opt/lib/mjpg-streamer/output_http.so -p 8080"
fi
;;
stop)
Expand Down
40 changes: 40 additions & 0 deletions files/services/S50usb_camera-multi
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/bin/sh
# USB Camera Service
# Credit: destinal & Guilouz

case "$1" in
start)
echo "Starting USB Camera..."
V4L_DEVS=$(v4l2-ctl --list-devices | grep -vE 'CCX2F3298|CCX2F3299' | grep -A1 usb | sed 's/^[[:space:]]*//g' | grep '^/dev')
#CREALITY_CAMS=$(v4l2-ctl --list-devices | grep -A1 'CREALITY|CCX2F3298|CCX2F3299' | grep -v 'CREALITY|CCX2F3298|CCX2F3299' | wc -l)
CREALITY_CAMS=$(v4l2-ctl --list-devices | grep -EA1 --no-group-separator 'CREALITY|CCX2F3298|CCX2F3299' | grep -vE 'CREALITY|CCX2F3298|CCX2F3299' | cut -d '
' -f 2)
PORT=8080
if [ "x$CREALITY_CAMS" != x ]; then
echo /opt/bin/mjpg_streamer -b -i "/opt/lib/mjpg-streamer/input_uvc.so -d $CREALITY_CAMS -r 1280x720 -f 15" -o "/opt/lib/mjpg-streamer/output_http.so -p $PORT"
/opt/bin/mjpg_streamer -b -i "/opt/lib/mjpg-streamer/input_uvc.so -d $CREALITY_CAMS -r 1280x720 -f 15" -o "/opt/lib/mjpg-streamer/output_http.so -p $PORT"
PORT=`expr $PORT + 1`
#echo "Error: No third party camera found or you use a Creality camera!"
#exit 1
fi
for V4L_DEV in $V4L_DEVS; do
echo /opt/bin/mjpg_streamer -b -i "/opt/lib/mjpg-streamer/input_uvc.so -d $V4L_DEV -r 1280x720 -f 15" -o "/opt/lib/mjpg-streamer/output_http.so -p $PORT"
/opt/bin/mjpg_streamer -b -i "/opt/lib/mjpg-streamer/input_uvc.so -d $V4L_DEV -r 1280x720 -f 15" -o "/opt/lib/mjpg-streamer/output_http.so -p $PORT"
PORT=`expr $PORT + 1`
done
;;
stop)
echo "Stopping USB Camera..."
killall -q mjpg_streamer && killall -q cam_app && killall -q cx_ai_middleware
;;
restart|reload)
"$0" stop
sleep 1
"$0" start
;;
*)
echo "Usage: /etc/init.d/S50usb_camera {start|stop|restart}"
exit 1
esac

exit $?
12 changes: 6 additions & 6 deletions files/services/S50usb_camera-single
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
case "$1" in
start)
echo "Starting USB Camera..."
V4L_DEVS=$(v4l2-ctl --list-devices | grep -A1 usb | sed 's/^[[:space:]]*//g' | grep '^/dev')
CREALITY_CAMS=$(v4l2-ctl --list-devices | grep -E 'CREALITY|CCX2F3298' | wc -l)
if [ "x$V4L_DEVS" = "x" -o $CREALITY_CAMS -gt 0 ]; then
echo "Error: No third party camera found or you use a Creality camera!"
exit 1
fi
V4L_DEVS=$(v4l2-ctl --list-devices | grep -vE 'CCX2F3298|CCX2F3299' | grep -A1 usb | sed 's/^[[:space:]]*//g' | grep '^/dev')
CREALITY_CAMS=$(v4l2-ctl --list-devices | grep -E 'CREALITY|CCX2F3298|CCX2F3299' | wc -l)
# if [ "x$V4L_DEVS" = "x" -o $CREALITY_CAMS -gt 0 ]; then
# echo "Error: No third party camera found or you use a Creality camera!"
# exit 1
# fi
PORT=8080
for V4L_DEV in $V4L_DEVS; do
/opt/bin/mjpg_streamer -b -i "/opt/lib/mjpg-streamer/input_uvc.so -d $V4L_DEV -r 1280x720 -f 15" -o "/opt/lib/mjpg-streamer/output_http.so -p $PORT"
Expand Down
25 changes: 19 additions & 6 deletions scripts/menu/K1/install_menu_K1.sh
Original file line number Diff line number Diff line change
Expand Up @@ -174,12 +174,25 @@ function install_menu_k1() {
17)
if [ -f "$CAMERA_SETTINGS_FILE" ]; then
error_msg "Camera Settings Control is already installed!"
elif v4l2-ctl --list-devices | grep -q 'CCX2F3299' && [ ! -f "$INITD_FOLDER"/S50usb_camera ]; then
error_msg "This is not compatible with the new hardware version of the camera!"
elif [ ! -f "$KLIPPER_SHELL_FILE" ]; then
error_msg "Klipper Gcode Shell Command is needed, please install it first!"
else
run "install_camera_settings_control" "install_menu_ui_k1"
continue
elif v4l2-ctl --list-devices | grep -q 'CCX2F3299' && [ -f "$INITD_FOLDER"/S50usb_camera ]; then
error_msg "You have the new hardware version of the Creality AI camera and it's not compatible!"
if [ "lsusb | grep -E \"(Integrated Camera|Webcam|CVD|Video|uvcvideo)\" | wx -l | grep -q '^ [1-9]" ]; then
echo -e "\e[1A\e[K ${yellow}An additional USB webcam was detected. It may work with the camera settings, but that's not guaranteed."
echo -e "${yellow} Would you like too install anyway?"
read -p " ${white}Continue (y/n): ${yellow}" response
case "$response" in
[nN][oO]|[nN])
run "install_menu_ui_k1"
;;
*)
if [ ! -f "$KLIPPER_SHELL_FILE" ]; then
error_msg "Klipper Gcode Shell Command is needed, please install it first!"
else
run "install_camera_settings_control" "install_menu_ui_k1"
fi
esac
fi
fi;;
18)
if [ -f "$USB_CAMERA_FILE" ]; then
Expand Down
4 changes: 2 additions & 2 deletions scripts/paths.sh
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ function set_paths() {
# USB Camera Support
USB_CAMERA_FILE="${INITD_FOLDER}/S50usb_camera"
USB_CAMERA_SINGLE_URL="${HS_FILES}/services/S50usb_camera-single"
USB_CAMERA_DUAL_URL="${HS_FILES}/services/S50usb_camera-dual"
USB_CAMERA_MULTI_URL="${HS_FILES}/services/S50usb_camera-multi"

# OctoEverywhere #
OCTOEVERYWHERE_FOLDER="${USR_DATA}/octoeverywhere"
Expand Down Expand Up @@ -192,4 +192,4 @@ function set_permissions() {

chmod +x "$CURL" >/dev/null 2>&1 &

}
}
5 changes: 3 additions & 2 deletions scripts/usb_camera.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ function install_usb_camera(){
echo -e "${white}"
echo -e "Info: Copying file..."
if [ "$model" = "K1" ]; then
cp "$USB_CAMERA_DUAL_URL" "$INITD_FOLDER"/S50usb_camera
cp "$USB_CAMERA_MULTI_URL" "$INITD_FOLDER"/S50usb_camera
else
cp "$USB_CAMERA_SINGLE_URL" "$INITD_FOLDER"/S50usb_camera
cp "$USB_CAMERA_MULTI_URL" "$INITD_FOLDER"/S50usb_camera
echo
echo -e " ${darkred}Be careful with the 1080p resolution!"
echo -e " It takes more resources and timelapses are larger and take longer to convert.${white}"
Expand Down Expand Up @@ -102,3 +102,4 @@ function remove_usb_camera(){
esac
done
}