From 86e17bff7113c5a8abe38ff35b975975caf6c9a5 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 22 Dec 2019 18:03:40 -0600 Subject: [PATCH 01/26] Add V1 workflows --- .github/workflows/v1-builds.yml | 131 ++++++++++++++++++ .github/workflows/v1-pull.yml | 70 ++++++++++ v1-scripts/branch-exists | 3 + v1-scripts/build-for-machine | 13 ++ v1-scripts/configs/MP3DP/MRambo_16T_aero | 13 ++ v1-scripts/configs/MP3DP/Ramps_16T_MK | 18 +++ v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD | 21 +++ .../MPCNC/Archim1_T8_16T_LCD_DualEndstop | 17 +++ .../configs/MPCNC/Archim2_T8_16T_LCD_16step | 32 +++++ v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD | 17 +++ v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD | 11 ++ .../MPCNC/Rambo_T8_16T_LCD_DualEndstop | 15 ++ .../configs/MPCNC/Ramps_T8_16T_LCD_32step | 13 ++ .../MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop | 13 ++ v1-scripts/configs/ZenXY/MiniRambo_16T | 11 ++ v1-scripts/configs/ZenXY/Ramps_16T_LCD_32 | 11 ++ v1-scripts/configs/_Bootscreen.h | 74 ++++++++++ v1-scripts/configs/avr-lcd-timings | 2 + v1-scripts/configs/base-3dp-config | 33 +++++ v1-scripts/configs/base-cnc-config | 31 +++++ v1-scripts/configs/base-zenxy-config | 34 +++++ v1-scripts/configs/board-archim1 | 11 ++ v1-scripts/configs/board-rambo | 3 + v1-scripts/configs/build-settings.py | 23 +++ v1-scripts/configs/drv8825 | 14 ++ v1-scripts/configs/dual-endstops | 7 + v1-scripts/configs/no-dual-endstops | 5 + v1-scripts/diff-branches | 3 + v1-scripts/fetch-branch | 11 ++ v1-scripts/generate-build-branch | 33 +++++ v1-scripts/generate-configs | 22 +++ v1-scripts/prepare-release | 16 +++ v1-scripts/pull-from-upstream | 35 +++++ v1-scripts/test-build-all-machines | 15 ++ 34 files changed, 781 insertions(+) create mode 100644 .github/workflows/v1-builds.yml create mode 100644 .github/workflows/v1-pull.yml create mode 100755 v1-scripts/branch-exists create mode 100755 v1-scripts/build-for-machine create mode 100755 v1-scripts/configs/MP3DP/MRambo_16T_aero create mode 100755 v1-scripts/configs/MP3DP/Ramps_16T_MK create mode 100755 v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD create mode 100755 v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop create mode 100755 v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step create mode 100755 v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD create mode 100755 v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD create mode 100755 v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop create mode 100755 v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step create mode 100755 v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop create mode 100755 v1-scripts/configs/ZenXY/MiniRambo_16T create mode 100755 v1-scripts/configs/ZenXY/Ramps_16T_LCD_32 create mode 100644 v1-scripts/configs/_Bootscreen.h create mode 100755 v1-scripts/configs/avr-lcd-timings create mode 100755 v1-scripts/configs/base-3dp-config create mode 100755 v1-scripts/configs/base-cnc-config create mode 100755 v1-scripts/configs/base-zenxy-config create mode 100644 v1-scripts/configs/board-archim1 create mode 100644 v1-scripts/configs/board-rambo create mode 100755 v1-scripts/configs/build-settings.py create mode 100644 v1-scripts/configs/drv8825 create mode 100755 v1-scripts/configs/dual-endstops create mode 100755 v1-scripts/configs/no-dual-endstops create mode 100755 v1-scripts/diff-branches create mode 100755 v1-scripts/fetch-branch create mode 100755 v1-scripts/generate-build-branch create mode 100755 v1-scripts/generate-configs create mode 100755 v1-scripts/prepare-release create mode 100755 v1-scripts/pull-from-upstream create mode 100755 v1-scripts/test-build-all-machines diff --git a/.github/workflows/v1-builds.yml b/.github/workflows/v1-builds.yml new file mode 100644 index 000000000000..a9430156dd3e --- /dev/null +++ b/.github/workflows/v1-builds.yml @@ -0,0 +1,131 @@ +name: V1 Builds + +on: + schedule: + # On 45-th minute, every 6 hours + - cron: '45 */6 * * *' + + push: + branches: + - 'v1-**' + paths-ignore: + - data/** + - docs/** + - '**/*.md' +# pull_request: +# branches: +# - 'v1-**' +# paths-ignore: +# - data/** +# - docs/** +# - '**/*.md' + +jobs: + generate: + name: Generate v1-bugfix-2.0.x + runs-on: ubuntu-latest + + env: + MIRROR_BRANCH: bugfix-2.0.x + BUILD_BRANCH: v1-bugfix-2.0.x + + steps: + - name: Check out the code + uses: actions/checkout@v2 + + # Based on .github/workflows/test-builds.yml + - name: Select Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: '3.7' # Version range or exact version of a Python version to use, using semvers version range syntax. + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install PlatformIO + run: | + pip install -U https://github.com/platformio/platformio-core/archive/master.zip + platformio update + + - name: Set git identity + run: | + git config --global user.email "actions@github.com" + git config --global user.name "GitHub Actions" + git config --global advice.detachedHead false + + - name: Generate + run: | + v1-scripts/fetch-branch "origin/$BUILD_BRANCH" + git fetch --prune origin "$MIRROR_BRANCH" # We need full history of the mirror branch + git branch $MIRROR_BRANCH origin/$MIRROR_BRANCH + v1-scripts/generate-build-branch + + - name: Check + run: | + v1-scripts/diff-branches "$BUILD_BRANCH" "origin/$BUILD_BRANCH" && exit 0 # No changes + v1-scripts/build-for-machine MPCNC/Rambo_T8_16T_LCD_DualEndstop + + - name: Push + if: github.event_name != 'pull_request' + run: | + git push origin "$BUILD_BRANCH:refs/heads/$BUILD_BRANCH" --force + + build: + + name: ${{ matrix.machine }} + runs-on: ubuntu-latest + needs: generate + + strategy: + fail-fast: false # Allow all machines to finish building + matrix: + machine: + - MP3DP/MRambo_16T_aero + - MP3DP/Ramps_16T_MK + #- MPCNC/Archim1_T8_16T_LCD + #- MPCNC/Archim1_T8_16T_LCD_DualEndstop + #- MPCNC/Archim2_T8_16T_LCD_16step + - MPCNC/MRambo_T8_16T_LCD + - MPCNC/Rambo_T8_16T_LCD + - MPCNC/Rambo_T8_16T_LCD_DualEndstop + - MPCNC/Ramps_T8_16T_LCD_32step + - MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop + - ZenXY/MiniRambo_16T + - ZenXY/Ramps_16T_LCD_32 + + steps: + - name: Check out the code + uses: actions/checkout@v2 + with: + ref: v1-bugfix-2.0.x + + # Based on .github/workflows/test-builds.yml + - name: Select Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: '3.7' # Version range or exact version of a Python version to use, using semvers version range syntax. + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install PlatformIO + run: | + pip install -U https://github.com/platformio/platformio-core/archive/master.zip + platformio update + + - name: Build ${{ matrix.machine.cfg }} + run: | + chmod +x buildroot/bin/* + chmod +x buildroot/share/tests/* + v1-scripts/build-for-machine ${{ matrix.machine }} + v1-scripts/prepare-release ${{ matrix.machine }} + + - name: Release + uses: ncipollo/release-action@v1 + with: + artifacts: ".zip/*.zip,.bin/*" + #bodyFile: "body.md" + token: ${{ secrets.GITHUB_TOKEN }} + prerelease: true + name: unstable + # FIXME: This needs to be dynamic and possibly use a different action + # e.g. https://github.com/actions/create-release/pull/12 + tag: v1-bugfix-2.0.x-auto + commit: ${{ github.ref }} + allowUpdates: true diff --git a/.github/workflows/v1-pull.yml b/.github/workflows/v1-pull.yml new file mode 100644 index 000000000000..021a60f92007 --- /dev/null +++ b/.github/workflows/v1-pull.yml @@ -0,0 +1,70 @@ +name: V1 pull from MarlinFirmware + +on: + schedule: + # On 15-th minute, every 6 hours + - cron: '15 */6 * * *' + + push: + branches: + - 'v1-machines**' + paths: + - '.github/workflows/v1-pull.yml' + - 'v1-scripts/**' + - '!v1-scripts/config/**' + + pull_request: + branches: + - 'v1-machines**' + paths: + - '.github/workflows/v1-pull.yml' + - 'v1-scripts/**' + - '!v1-scripts/config/**' + +jobs: + + pull: + name: Pull from bugfix-2.0.x + runs-on: ubuntu-latest + + env: + UPSTREAM_BRANCH: bugfix-2.0.x + MIRROR_BRANCH: bugfix-2.0.x + + steps: + - name: Check out the code + uses: actions/checkout@v2 + + # Based on .github/workflows/test-builds.yml + - name: Select Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: '3.7' # Version range or exact version of a Python version to use, using semvers version range syntax. + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install PlatformIO + run: | + pip install -U https://github.com/platformio/platformio-core/archive/master.zip + platformio update + + - name: Set git identity + run: | + git config --global user.email "actions@github.com" + git config --global user.name "GitHub Actions" + git config --global advice.detachedHead false + + - name: Pull + run: | + v1-scripts/fetch-branch "origin/$MIRROR_BRANCH" + v1-scripts/pull-from-upstream + + - name: Check + run: | + v1-scripts/diff-branches "$MIRROR_BRANCH" "origin/$MIRROR_BRANCH" && exit 0 # No changes + v1-scripts/generate-build-branch + v1-scripts/build-for-machine MPCNC/Rambo_T8_16T_LCD_DualEndstop + + - name: Push + if: github.event_name != 'pull_request' + run: | + git push origin "$MIRROR_BRANCH:refs/heads/$MIRROR_BRANCH" --force diff --git a/v1-scripts/branch-exists b/v1-scripts/branch-exists new file mode 100755 index 000000000000..5a30f0c4a7bb --- /dev/null +++ b/v1-scripts/branch-exists @@ -0,0 +1,3 @@ +#!/bin/bash + +git show-ref --quiet --verify "refs/heads/$1" diff --git a/v1-scripts/build-for-machine b/v1-scripts/build-for-machine new file mode 100755 index 000000000000..bb3180b5353a --- /dev/null +++ b/v1-scripts/build-for-machine @@ -0,0 +1,13 @@ +#!/bin/bash + +machine=$1 +shift + +export PATH=$PATH:buildroot/bin + +set -ex + +eval $(v1-scripts/configs/build-settings.py "$machine") + +use_example_configs $machine +build_marlin_pio . -e "$env" "$@" diff --git a/v1-scripts/configs/MP3DP/MRambo_16T_aero b/v1-scripts/configs/MP3DP/MRambo_16T_aero new file mode 100755 index 000000000000..4ba54318d960 --- /dev/null +++ b/v1-scripts/configs/MP3DP/MRambo_16T_aero @@ -0,0 +1,13 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +restore_configs + +. $incdir/base-3dp-config +. $incdir/avr-lcd-timings + +opt_set MOTHERBOARD "BOARD_MINIRAMBO" +opt_set PWM_MOTOR_CURRENT "{ 750, 750, 950 }" +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 100, 100, 400, 837 }" +opt_set E0_AUTO_FAN_PIN "6" diff --git a/v1-scripts/configs/MP3DP/Ramps_16T_MK b/v1-scripts/configs/MP3DP/Ramps_16T_MK new file mode 100755 index 000000000000..9e576aaaeb08 --- /dev/null +++ b/v1-scripts/configs/MP3DP/Ramps_16T_MK @@ -0,0 +1,18 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +restore_configs + +. $incdir/base-3dp-config +. $incdir/avr-lcd-timings +. $incdir/drv8825 + +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" +opt_enable REVERSE_ENCODER_DIRECTION + +# Why? +opt_set TEMP_SENSOR_0 "11" + +opt_set PWM_MOTOR_CURRENT "{ 800, 900, 950 }" +opt_disable PWM_MOTOR_CURRENT diff --git a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD new file mode 100755 index 000000000000..29fd6434aefa --- /dev/null +++ b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD @@ -0,0 +1,21 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +use_example_configs CNC/MPCNC +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/board-archim1 +. $incdir/no-dual-endstops +. $incdir/drv8825 + +opt_set MINIMUM_STEPPER_PULSE "2" + +# Why? +opt_set DEFAULT_MAX_FEEDRATE "{ 120, 120, 30, 25 }" +opt_set Z3_DRIVER_TYPE "DRV8825" +opt_set E3_DRIVER_TYPE "DRV8825" +opt_set E4_DRIVER_TYPE "DRV8825" +opt_set E5_DRIVER_TYPE "DRV8825" +opt_disable SHOW_CUSTOM_BOOTSCREEN CUSTOM_USER_MENUS +opt_disable Z3_DRIVER_TYPE E3_DRIVER_TYPE E4_DRIVER_TYPE E5_DRIVER_TYPE diff --git a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop new file mode 100755 index 000000000000..327d9289e775 --- /dev/null +++ b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop @@ -0,0 +1,17 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +use_example_configs CNC/MPCNC +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/board-archim1 +. $incdir/dual-endstops +. $incdir/drv8825 + +opt_set MINIMUM_STEPPER_PULSE "3" + +# Why? +opt_set DEFAULT_MAX_FEEDRATE "{ 120, 120, 30, 120 }" +opt_disable SHOW_CUSTOM_BOOTSCREEN CUSTOM_USER_MENUS SOFT_ENDSTOPS_MENU_ITEM MIN_SOFTWARE_ENDSTOPS \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER diff --git a/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step b/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step new file mode 100755 index 000000000000..61d4b284fe0f --- /dev/null +++ b/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step @@ -0,0 +1,32 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +use_example_configs CNC/MPCNC +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/no-dual-endstops + +opt_set SERIAL_PORT "-1" +opt_set MOTHERBOARD "BOARD_ARCHIM2" +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 100, 100, 400, 100 }" +opt_set SPI_SPEED "SPI_HALF_SPEED" +opt_set MICROSTEP1 "LOW,LOW,LOW" +opt_set MICROSTEP2 "HIGH,LOW,LOW" +opt_set MICROSTEP4 "LOW,HIGH,LOW" +opt_set MICROSTEP8 "HIGH,HIGH,LOW" +opt_set MICROSTEP16 "LOW,LOW,HIGH" +opt_set MICROSTEP32 "HIGH,LOW,HIGH" +opt_set MICROSTEP_MODES "{ 16, 16, 16, 16, 16 }" +opt_set PWM_MOTOR_CURRENT "{ 1200, 1200, 1200 }" +opt_set MAXIMUM_STEPPER_RATE "400000" +opt_enable EEPROM_SETTINGS + +# Why? +opt_set JUNCTION_DEVIATION_MM "0.005" +opt_set MANUAL_FEEDRATE "{30*60, 30*60, 3*60, 60}" +opt_set MM_PER_ARC_SEGMENT ".15" +opt_set X_MAX_ENDSTOP_INVERTING "true" +opt_set Y_MAX_ENDSTOP_INVERTING "true" +opt_set Z_MAX_ENDSTOP_INVERTING "true" +opt_enable BABYSTEP_ALWAYS_AVAILABLE diff --git a/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD b/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD new file mode 100755 index 000000000000..4cf08ab9b30e --- /dev/null +++ b/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD @@ -0,0 +1,17 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +use_example_configs CNC/MPCNC +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/no-dual-endstops +. $incdir/avr-lcd-timings + +opt_set MOTHERBOARD "BOARD_MINIRAMBO" +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 100, 100, 400, 100 }" +opt_set PWM_MOTOR_CURRENT "{ 900, 900, 900 }" + +# Why? +opt_set DIGIPOT_MOTOR_CURRENT "{ 95, 95, 95, 95, 95 }" +opt_disable DIGIPOT_MOTOR_CURRENT diff --git a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD new file mode 100755 index 000000000000..ec1043acf046 --- /dev/null +++ b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD @@ -0,0 +1,11 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +use_example_configs CNC/MPCNC +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/board-rambo +. $incdir/no-dual-endstops + +opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop new file mode 100755 index 000000000000..4de25112f31b --- /dev/null +++ b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop @@ -0,0 +1,15 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +use_example_configs CNC/MPCNC +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/board-rambo +. $incdir/dual-endstops + +opt_enable REVERSE_ENCODER_DIRECTION + +# Why? +opt_enable USE_ZMAX_PLUG +opt_disable SOFT_ENDSTOPS_MENU_ITEM diff --git a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step new file mode 100755 index 000000000000..3e7dfb85efa5 --- /dev/null +++ b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step @@ -0,0 +1,13 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +use_example_configs CNC/MPCNC +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/drv8825 +. $incdir/avr-lcd-timings +. $incdir/no-dual-endstops + +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" +opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop new file mode 100755 index 000000000000..6e195cc28597 --- /dev/null +++ b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop @@ -0,0 +1,13 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +use_example_configs CNC/MPCNC +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/drv8825 +. $incdir/avr-lcd-timings +. $incdir/dual-endstops + +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" +opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/ZenXY/MiniRambo_16T b/v1-scripts/configs/ZenXY/MiniRambo_16T new file mode 100755 index 000000000000..1209e8d88966 --- /dev/null +++ b/v1-scripts/configs/ZenXY/MiniRambo_16T @@ -0,0 +1,11 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +restore_configs + +. $incdir/base-zenxy-config + +opt_set MOTHERBOARD "BOARD_MINIRAMBO" +opt_set PWM_MOTOR_CURRENT "{ 750, 750, 750 }" +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 100, 100, 400, 200 }" diff --git a/v1-scripts/configs/ZenXY/Ramps_16T_LCD_32 b/v1-scripts/configs/ZenXY/Ramps_16T_LCD_32 new file mode 100755 index 000000000000..3cebb9b8aa40 --- /dev/null +++ b/v1-scripts/configs/ZenXY/Ramps_16T_LCD_32 @@ -0,0 +1,11 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +restore_configs + +. $incdir/base-zenxy-config +. $incdir/drv8825 + +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" +opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/_Bootscreen.h b/v1-scripts/configs/_Bootscreen.h new file mode 100644 index 000000000000..fa72bc8b4a93 --- /dev/null +++ b/v1-scripts/configs/_Bootscreen.h @@ -0,0 +1,74 @@ +/** + * Made with Marlin Bitmap Converter + * http://marlinfw.org/tools/u8glib/converter.html + * + * This bitmap from the file '120 Square.bmp' + */ +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 +#define CUSTOM_BOOTSCREEN_BMPHEIGHT 64 +const unsigned char custom_start_bmp[] PROGMEM = { + 0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC1,0x83,0xFF,0xC0,0x00, // ...............###########################################################################.....##.....############.............. + 0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0xE1,0xFF,0xE0,0x00, // .............############################################################################....######....############............. + 0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xF0,0x7F,0xF0,0x00, // ............############################################################################....########.....###########............ + 0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFC,0x3F,0xF0,0x00, // ............###............................................................................###########....##########............ + 0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFE,0x00,0x38,0x00, // ...........###............................................................................#############...........###........... + 0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0x80,0x38,0x00, // ...........###...........................................................................################.........###........... + 0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0x1F,0xC0,0x38,0x00, // ...........###.........................................................................#########...#######........###........... + 0x00,0x1C,0x3C,0x00,0x00,0x78,0x0F,0x80,0x00,0x00,0x03,0xFE,0x0F,0xC0,0x38,0x00, // ...........###....####...................####.......#####.............................#########.....######........###........... + 0x00,0x1C,0x3C,0x00,0x00,0x78,0x3F,0x80,0x00,0x00,0x0F,0xFC,0x07,0xC0,0x38,0x00, // ...........###....####...................####.....#######...........................##########.......#####........###........... + 0x00,0x1C,0x3C,0x00,0x00,0xF8,0xFF,0x80,0x00,0x00,0x1F,0xFC,0x0F,0xC0,0x38,0x00, // ...........###....####..................#####...#########..........................###########......######........###........... + 0x00,0x1C,0x3E,0x00,0x00,0xF8,0xFF,0x80,0x00,0x00,0x7F,0xF8,0x0F,0x80,0x38,0x00, // ...........###....#####.................#####...#########........................############.......#####.........###........... + 0x00,0x1C,0x1E,0x00,0x00,0xF0,0xF7,0x80,0x00,0x01,0xFF,0xF8,0x1F,0x80,0x38,0x00, // ...........###.....####.................####....####.####......................##############......######.........###........... + 0x00,0x1C,0x1F,0x00,0x01,0xF0,0x07,0x80,0x00,0x07,0xFF,0xF0,0x1F,0x80,0x38,0x00, // ...........###.....#####...............#####.........####....................###############.......######.........###........... + 0x00,0x1C,0x1F,0x00,0x01,0xE0,0x07,0x80,0x00,0x1F,0xFF,0xF0,0x3F,0x80,0x38,0x00, // ...........###.....#####...............####..........####..................#################......#######.........###........... + 0x00,0x1C,0x0F,0x00,0x03,0xE0,0x07,0x80,0x00,0x7F,0xFF,0xE0,0x7F,0x80,0x38,0x00, // ...........###......####..............#####..........####................##################......########.........###........... + 0x00,0x1C,0x0F,0x80,0x03,0xE0,0x07,0x80,0x03,0xFF,0xFF,0xC0,0x7F,0x80,0x38,0x00, // ...........###......#####.............#####..........####.............####################.......########.........###........... + 0x00,0x1C,0x07,0x80,0x03,0xC0,0x07,0x80,0x1F,0xFF,0xFE,0x00,0xFF,0x80,0x38,0x00, // ...........###.......####.............####...........####..........####################.........#########.........###........... + 0x00,0x1C,0x07,0x80,0x07,0xC0,0x07,0x80,0x3F,0xFF,0xF8,0x00,0xFF,0x80,0x38,0x00, // ...........###.......####............#####...........####.........###################...........#########.........###........... + 0x00,0x1C,0x07,0xC0,0x07,0x80,0x07,0x80,0x7F,0xFF,0xE0,0x01,0xFF,0x00,0x38,0x00, // ...........###.......#####...........####............####........##################............#########..........###........... + 0x00,0x1C,0x03,0xC0,0x07,0x80,0x07,0x80,0x7F,0xFF,0xE0,0x01,0xFF,0x00,0x38,0x00, // ...........###........####...........####............####........##################............#########..........###........... + 0x00,0x1C,0x03,0xE0,0x0F,0x80,0x07,0x80,0x7F,0xFF,0xC0,0x00,0xFF,0x00,0x38,0x00, // ...........###........#####.........#####............####........#################..............########..........###........... + 0x00,0x1C,0x01,0xE0,0x0F,0x00,0x07,0x80,0x78,0x00,0x00,0x00,0xFF,0x00,0x38,0x00, // ...........###.........####.........####.............####........####...........................########..........###........... + 0x00,0x1C,0x01,0xE0,0x1F,0x00,0x07,0x80,0x78,0x00,0x00,0x00,0xFF,0x00,0x38,0x00, // ...........###.........####........#####.............####........####...........................########..........###........... + 0x00,0x1C,0x01,0xF0,0x1E,0x00,0x07,0x80,0x78,0x00,0x00,0x00,0xFF,0x00,0x38,0x00, // ...........###.........#####.......####..............####........####...........................########..........###........... + 0x00,0x1C,0x00,0xF0,0x1E,0x00,0x07,0x80,0x78,0x00,0x00,0x00,0xFF,0x00,0x38,0x00, // ...........###..........####.......####..............####........####...........................########..........###........... + 0x00,0x1C,0x00,0xF8,0x3E,0x00,0x07,0x80,0x78,0x00,0x00,0x00,0xFF,0x00,0x38,0x00, // ...........###..........#####.....#####..............####........####...........................########..........###........... + 0x00,0x1C,0x00,0xF8,0x3C,0x00,0x07,0x80,0x7F,0xFF,0xC0,0x00,0xFF,0x00,0x38,0x00, // ...........###..........#####.....####...............####........#################..............########..........###........... + 0x00,0x1C,0x00,0x78,0x7C,0x00,0x07,0x80,0x7F,0xFF,0xE0,0x01,0xFF,0x00,0x38,0x00, // ...........###...........####....#####...............####........##################............#########..........###........... + 0x00,0x1C,0x00,0x7C,0x7C,0x00,0x07,0x80,0x7F,0xFF,0xE0,0x01,0xFF,0x00,0x38,0x00, // ...........###...........#####...#####...............####........##################............#########..........###........... + 0x00,0x1C,0x00,0x3C,0x78,0x00,0x07,0x80,0x7F,0xFF,0xF0,0x01,0xFF,0x00,0x38,0x00, // ...........###............####...####................####........###################...........#########..........###........... + 0x00,0x1C,0x00,0x3E,0xF8,0x00,0x07,0x80,0x3F,0xFF,0xFC,0x00,0xFF,0x80,0x38,0x00, // ...........###............#####.#####................####.........####################..........#########.........###........... + 0x00,0x1C,0x00,0x3E,0xF0,0x00,0x07,0x80,0x07,0xFF,0xFF,0xC0,0x7F,0x80,0x38,0x00, // ...........###............#####.####.................####............#####################.......########.........###........... + 0x00,0x1C,0x00,0x1F,0xF0,0x00,0x07,0x80,0x00,0xFF,0xFF,0xE0,0x7F,0x80,0x38,0x00, // ...........###.............#########.................####...............###################......########.........###........... + 0x00,0x1C,0x00,0x1F,0xF0,0x00,0x07,0x80,0x00,0x1F,0xFF,0xE0,0x3F,0x80,0x38,0x00, // ...........###.............#########.................####..................################.......#######.........###........... + 0x00,0x1C,0x00,0x0F,0xE0,0x00,0x07,0x80,0x00,0x07,0xFF,0xF0,0x3F,0x80,0x38,0x00, // ...........###..............#######..................####....................###############......#######.........###........... + 0x00,0x1C,0x00,0x0F,0xE0,0x00,0x07,0x80,0x00,0x01,0xFF,0xF8,0x1F,0x80,0x38,0x00, // ...........###..............#######..................####......................##############......######.........###........... + 0x00,0x1C,0x00,0x0F,0xC0,0x00,0x07,0x80,0x00,0x00,0x7F,0xF8,0x0F,0x80,0x38,0x00, // ...........###..............######...................####........................############.......#####.........###........... + 0x00,0x1C,0x00,0x07,0xC0,0x00,0x07,0x80,0x00,0x00,0x3F,0xFC,0x0F,0xC0,0x38,0x00, // ...........###...............#####...................####.........................############......######........###........... + 0x00,0x1C,0x00,0x07,0xC0,0x00,0x07,0x80,0x00,0x00,0x0F,0xFC,0x07,0xC0,0x38,0x00, // ...........###...............#####...................####...........................##########.......#####........###........... + 0x00,0x1C,0x00,0x03,0x80,0x00,0x07,0x80,0x00,0x00,0x07,0xFE,0x07,0xC0,0x38,0x00, // ...........###................###....................####............................##########......#####........###........... + 0x00,0x1C,0x00,0x03,0x80,0x00,0x03,0x00,0x00,0x00,0x01,0xFE,0x0F,0xC0,0x38,0x00, // ...........###................###.....................##...............................########.....######........###........... + 0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x3F,0x80,0x38,0x00, // ...........###..........................................................................########..#######.........###........... + 0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0x00,0x38,0x00, // ...........###...........................................................................###############..........###........... + 0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFC,0x00,0x78,0x00, // ............###............................................................................###########...........####........... + 0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xF0,0x3F,0xF8,0x00, // ............############################################################################....########......###########........... + 0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0xE0,0xFF,0xF0,0x00, // .............############################################################################....######.....############............ + 0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0x83,0xFF,0xE0,0x00, // ..............############################################################################....###.....#############............. + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................ + 0x00,0x0F,0xF4,0x03,0x07,0xC2,0x80,0x67,0xF9,0xFF,0x3E,0x0A,0x01,0x83,0xE0,0x00, // ............########.#........##.....#####....#.#........##..########..#########..#####.....#.#........##.....#####............. + 0x00,0x1F,0xF6,0x03,0x1F,0xE6,0xC0,0x6F,0xFB,0xFF,0x7F,0x1B,0x01,0x8F,0xF0,0x00, // ...........#########.##.......##...########..##.##.......##.#########.##########.#######...##.##.......##...########............ + 0x00,0x18,0x07,0x03,0x38,0x76,0xE0,0x6C,0x03,0x00,0x63,0x1B,0x81,0x9C,0x18,0x00, // ...........##........###......##..###....###.##.###......##.##........##.........##...##...##.###......##..###.....##........... + 0x00,0x18,0x07,0x83,0x30,0x06,0xF0,0x6C,0x03,0x00,0x61,0x9B,0xC1,0x98,0x00,0x00, // ...........##........####.....##..##.........##.####.....##.##........##.........##....##..##.####.....##..##................... + 0x00,0x18,0x07,0xC3,0x60,0x06,0xF8,0x6C,0x03,0x00,0x61,0x9B,0xE1,0xB0,0x00,0x00, // ...........##........#####....##.##..........##.#####....##.##........##.........##....##..##.#####....##.##.................... + 0x00,0x18,0x06,0xE3,0x60,0x06,0xDC,0x6C,0x03,0x00,0x63,0x9B,0x71,0xB0,0x00,0x00, // ...........##........##.###...##.##..........##.##.###...##.##........##.........##...###..##.##.###...##.##.................... + 0x00,0x1F,0xE6,0x73,0x61,0xE6,0xCE,0x6F,0xF3,0xFC,0x7F,0x1B,0x39,0xB0,0xF0,0x00, // ...........########..##..###..##.##....####..##.##..###..##.########..########...#######...##.##..###..##.##....####............ + 0x00,0x18,0x06,0x3B,0x61,0xF6,0xC7,0x6C,0x03,0x00,0x7E,0x1B,0x1D,0xB0,0xF8,0x00, // ...........##........##...###.##.##....#####.##.##...###.##.##........##.........######....##.##...###.##.##....#####........... + 0x00,0x18,0x06,0x1F,0x60,0x36,0xC3,0xEC,0x03,0x00,0x67,0x1B,0x0F,0xB0,0x18,0x00, // ...........##........##....#####.##.......##.##.##....#####.##........##.........##..###...##.##....#####.##.......##........... + 0x00,0x18,0x06,0x0F,0x30,0x36,0xC1,0xEC,0x03,0x00,0x63,0x9B,0x07,0x98,0x18,0x00, // ...........##........##.....####..##......##.##.##.....####.##........##.........##...###..##.##.....####..##......##........... + 0x00,0x18,0x06,0x07,0x18,0x76,0xC0,0xEC,0x03,0x00,0x61,0x9B,0x03,0x8C,0x38,0x00, // ...........##........##......###...##....###.##.##......###.##........##.........##....##..##.##......###...##....###........... + 0x00,0x1F,0xF6,0x03,0x0F,0xE6,0xC0,0x6F,0xFB,0xFE,0x60,0xDB,0x01,0x87,0xF0,0x00, // ...........#########.##.......##....#######..##.##.......##.#########.#########..##.....##.##.##.......##....#######............ + 0x00,0x0F,0xF6,0x01,0x07,0xC6,0xC0,0x27,0xF9,0xFE,0x60,0xDB,0x00,0x83,0xE0,0x00 // ............########.##........#.....#####...##.##........#..########..########..##.....##.##.##........#.....#####............. +}; diff --git a/v1-scripts/configs/avr-lcd-timings b/v1-scripts/configs/avr-lcd-timings new file mode 100755 index 000000000000..363ada34f046 --- /dev/null +++ b/v1-scripts/configs/avr-lcd-timings @@ -0,0 +1,2 @@ +opt_add ST7920_DELAY_2 "DELAY_NS(250)" +opt_add ST7920_DELAY_3 "DELAY_NS(250)" diff --git a/v1-scripts/configs/base-3dp-config b/v1-scripts/configs/base-3dp-config new file mode 100755 index 000000000000..4953b54e3340 --- /dev/null +++ b/v1-scripts/configs/base-3dp-config @@ -0,0 +1,33 @@ +opt_set STRING_CONFIG_H_AUTHOR "\"(V1 Engineering, Ryan)\"" +opt_set CUSTOM_MACHINE_NAME "\"MP3DP\"" +opt_set DEFAULT_NOMINAL_FILAMENT_DIA "1.75" +opt_set TEMP_SENSOR_0 "5" +opt_set TEMP_SENSOR_BED "11" +opt_set DEFAULT_Kp "17.98" +opt_set DEFAULT_Ki ".98" +opt_set DEFAULT_Kd "83.62" +opt_set Z_MIN_PROBE_ENDSTOP_INVERTING "true" +opt_set DEFAULT_MAX_FEEDRATE "{ 150, 150, 15, 24 }" +opt_set DEFAULT_MAX_ACCELERATION "{ 2000, 2000, 100, 3000 }" +opt_set DEFAULT_ACCELERATION "2000" +opt_set DEFAULT_TRAVEL_ACCELERATION "2000" +opt_set DEFAULT_XJERK "5.0" +opt_set DEFAULT_YJERK "5.0" +opt_set DEFAULT_ZJERK "0.15" +opt_set DEFAULT_EJERK "3.0" +opt_set XY_PROBE_SPEED "6000" +opt_set HOMING_FEEDRATE_XY "(40*60)" +opt_set HOMING_FEEDRATE_Z "(3*60)" +opt_set PREHEAT_1_TEMP_HOTEND "196" +opt_set PREHEAT_1_TEMP_BED "62" +opt_set EXTRUDER_AUTO_FAN_SPEED "250" +opt_set X_HOME_BUMP_MM "7" +opt_set Y_HOME_BUMP_MM "7" +opt_set Z_HOME_BUMP_MM "3" +opt_set HOMING_BUMP_DIVISOR "{ 3, 3, 5 }" +opt_set DEFAULT_STEPPER_DEACTIVE_TIME "1200" +opt_set LCD_TIMEOUT_TO_STATUS "45000" +opt_set MM_PER_ARC_SEGMENT ".3" +opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS SDSUPPORT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ + ADAPTIVE_STEP_SMOOTHING GCODE_MOTION_MODES CUSTOM_VERSION_FILE SHOW_CUSTOM_BOOTSCREEN +opt_disable MIN_SOFTWARE_ENDSTOPS MAX_SOFTWARE_ENDSTOPS diff --git a/v1-scripts/configs/base-cnc-config b/v1-scripts/configs/base-cnc-config new file mode 100755 index 000000000000..5afb363c641f --- /dev/null +++ b/v1-scripts/configs/base-cnc-config @@ -0,0 +1,31 @@ +opt_set STRING_CONFIG_H_AUTHOR "\"(V1 Engineering, Ryan)\"" +opt_set CUSTOM_MACHINE_NAME "\"V1 E CNC\"" +opt_set EXTRUDERS "0" +opt_set Z_MIN_ENDSTOP_INVERTING "true" +opt_set Z_MAX_ENDSTOP_INVERTING "false" +opt_set Z_MIN_PROBE_ENDSTOP_INVERTING "true" +opt_set DEFAULT_MAX_FEEDRATE "{ 120, 120, 30, 25 }" +opt_set DEFAULT_MAX_ACCELERATION "{ 400, 400, 100, 2000 }" +opt_set DEFAULT_ACCELERATION "400" +opt_set DEFAULT_TRAVEL_ACCELERATION "400" +opt_set JUNCTION_DEVIATION_MM "0.1" +opt_set HOMING_FEEDRATE_XY "(30*60)" +opt_set HOMING_FEEDRATE_Z "(3*60)" +opt_set X_HOME_BUMP_MM "7" +opt_set Y_HOME_BUMP_MM "7" +opt_set Z_HOME_BUMP_MM "3" +opt_set HOMING_BUMP_DIVISOR "{ 4, 4, 5 }" +opt_set DEFAULT_STEPPER_DEACTIVE_TIME "1200" +opt_set LCD_TIMEOUT_TO_STATUS "45000" +opt_set SD_FINISHED_STEPPERRELEASE "false" +opt_set MM_PER_ARC_SEGMENT ".3" +opt_set CUSTOM_USER_MENU_TITLE "\"Custom Commands\"" +opt_set USER_DESC_1 "\"Reset All Coordinates\"" +opt_set USER_GCODE_1 "\"G92 X0 Y0 Z0\"" +opt_set USER_DESC_2 "\"Home Z Axis\"" +opt_set USER_GCODE_2 "\"G28 Z\"" +opt_set USER_DESC_3 "\"Home X\&Y\"" +opt_set USER_GCODE_3 "\"G28 X Y\"" +opt_enable S_CURVE_ACCELERATION SDSUPPORT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_STEP_SMOOTHING \ + CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES CUSTOM_USER_MENUS CUSTOM_VERSION_FILE SHOW_CUSTOM_BOOTSCREEN +opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS EVENT_GCODE_SD_STOP USER_DESC_4 USER_GCODE_4 USER_DESC_5 USER_GCODE_5 diff --git a/v1-scripts/configs/base-zenxy-config b/v1-scripts/configs/base-zenxy-config new file mode 100755 index 000000000000..39faf989419a --- /dev/null +++ b/v1-scripts/configs/base-zenxy-config @@ -0,0 +1,34 @@ +opt_set STRING_CONFIG_H_AUTHOR "\"(V1 Engineering, Ryan)\"" +opt_set CUSTOM_MACHINE_NAME "\"ZenXY\"" +opt_set EXTRUDERS "0" +opt_set DEFAULT_MAX_FEEDRATE "{ 120, 120, 30, 25 }" +opt_set DEFAULT_MAX_ACCELERATION "{ 400, 400, 100, 2000 }" +opt_set DEFAULT_ACCELERATION "400" +opt_set DEFAULT_TRAVEL_ACCELERATION "400" +opt_set JUNCTION_DEVIATION_MM "0.005" +opt_set DISABLE_Z "true" +opt_set DISABLE_E "true" +opt_set INVERT_Y_DIR "false" +opt_set X_BED_SIZE "670" +opt_set Y_BED_SIZE "670" +opt_set HOMING_FEEDRATE_XY "(30*60)" +opt_set HOMING_FEEDRATE_Z "(3*60)" +opt_set X_HOME_BUMP_MM "7" +opt_set Y_HOME_BUMP_MM "7" +opt_set Z_HOME_BUMP_MM "3" +opt_set HOMING_BUMP_DIVISOR "{ 4, 4, 5 }" +opt_set DEFAULT_STEPPER_DEACTIVE_TIME "1200" +opt_set MANUAL_FEEDRATE "{30*60, 30*60, 3*60, 60}" +opt_set LCD_TIMEOUT_TO_STATUS "45000" +opt_set MM_PER_ARC_SEGMENT ".15" +opt_set CUSTOM_USER_MENU_TITLE "\"Custom Commands\"" +opt_set USER_DESC_1 "\"Reset All Coordinates\"" +opt_set USER_GCODE_1 "\"G92 X0 Y0 Z0\"" +opt_set USER_DESC_2 "\"Home Z Axis\"" +opt_set USER_GCODE_2 "\"G28 Z\"" +opt_set USER_DESC_3 "\"Home X\&Y\"" +opt_set USER_GCODE_3 "\"G28 X Y\"" +opt_enable COREXY JUNCTION_DEVIATION S_CURVE_ACCELERATION SOFT_ENDSTOPS_MENU_ITEM EEPROM_SETTINGS SDSUPPORT \ + INDIVIDUAL_AXIS_HOMING_MENU REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING \ + ADAPTIVE_STEP_SMOOTHING BABYSTEP_ALWAYS_AVAILABLE CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES CUSTOM_VERSION_FILE +opt_disable EVENT_GCODE_SD_STOP USER_DESC_4 USER_GCODE_4 USER_DESC_5 USER_GCODE_5 diff --git a/v1-scripts/configs/board-archim1 b/v1-scripts/configs/board-archim1 new file mode 100644 index 000000000000..c8404bbbbdfe --- /dev/null +++ b/v1-scripts/configs/board-archim1 @@ -0,0 +1,11 @@ +opt_set SERIAL_PORT "-1" +opt_set MOTHERBOARD "BOARD_ARCHIM1" +opt_set SPI_SPEED "SPI_HALF_SPEED" +opt_set MICROSTEP1 "LOW,LOW,LOW" +opt_set MICROSTEP2 "HIGH,LOW,LOW" +opt_set MICROSTEP4 "LOW,HIGH,LOW" +opt_set MICROSTEP8 "HIGH,HIGH,LOW" +opt_set MICROSTEP16 "LOW,LOW,HIGH" +opt_set MICROSTEP32 "HIGH,LOW,HIGH" +opt_set MICROSTEP_MODES "{ 32, 32, 32, 32, 32, 32 }" +opt_set PWM_MOTOR_CURRENT "{ 1200, 1200, 1200 }" diff --git a/v1-scripts/configs/board-rambo b/v1-scripts/configs/board-rambo new file mode 100644 index 000000000000..e374e1b6e571 --- /dev/null +++ b/v1-scripts/configs/board-rambo @@ -0,0 +1,3 @@ +opt_set MOTHERBOARD "BOARD_RAMBO" +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 100, 100, 400, 100 }" +opt_set DIGIPOT_MOTOR_CURRENT "{ 120, 120, 120, 120, 120 }" diff --git a/v1-scripts/configs/build-settings.py b/v1-scripts/configs/build-settings.py new file mode 100755 index 000000000000..4547ca27952c --- /dev/null +++ b/v1-scripts/configs/build-settings.py @@ -0,0 +1,23 @@ +#!/usr/bin/python + +# Bash 4.0 has associative arrays, but if it's available everywhere so Python it is + +MACHINES = { + 'MPCNC/Archim1_T8_16T_LCD': { 'env': 'DUE', 'out': 'firmware.bin' }, + 'MPCNC/Archim1_T8_16T_LCD_DualEndstop': { 'env': 'DUE', 'out': 'firmware.bin' }, + 'MPCNC/Archim2_T8_16T_LCD_16step': { 'env': 'DUE', 'out': 'firmware.bin' }, + 'MPCNC/Rambo_T8_16T_LCD': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MPCNC/Rambo_T8_16T_LCD_DualEndstop': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MPCNC/Ramps_T8_16T_LCD_32step': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MPCNC/MRambo_T8_16T_LCD': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MP3DP/Ramps_16T_MK': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MP3DP/MRambo_16T_aero': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'ZenXY/Ramps_16T_LCD_32': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'ZenXY/MiniRambo_16T': { 'env': 'megaatmega2560', 'out': 'firmware.hex' } +} + +import sys + +machine = sys.argv[1] +print 'env="{env}"\nout="{out}"'.format(**MACHINES[machine]) diff --git a/v1-scripts/configs/drv8825 b/v1-scripts/configs/drv8825 new file mode 100644 index 000000000000..66e20599a129 --- /dev/null +++ b/v1-scripts/configs/drv8825 @@ -0,0 +1,14 @@ +opt_set X_DRIVER_TYPE "DRV8825" +opt_set Y_DRIVER_TYPE "DRV8825" +opt_set Z_DRIVER_TYPE "DRV8825" +opt_set X2_DRIVER_TYPE "DRV8825" +opt_set Y2_DRIVER_TYPE "DRV8825" +opt_set Z2_DRIVER_TYPE "DRV8825" +opt_set Z3_DRIVER_TYPE "DRV8825" +opt_set E0_DRIVER_TYPE "DRV8825" +opt_set E1_DRIVER_TYPE "DRV8825" +opt_set E2_DRIVER_TYPE "DRV8825" +opt_set E3_DRIVER_TYPE "DRV8825" +opt_set E4_DRIVER_TYPE "DRV8825" +opt_set E5_DRIVER_TYPE "DRV8825" +opt_disable Z3_DRIVER_TYPE E2_DRIVER_TYPE E3_DRIVER_TYPE E4_DRIVER_TYPE E5_DRIVER_TYPE diff --git a/v1-scripts/configs/dual-endstops b/v1-scripts/configs/dual-endstops new file mode 100755 index 000000000000..3a48e8844348 --- /dev/null +++ b/v1-scripts/configs/dual-endstops @@ -0,0 +1,7 @@ +opt_set X_MIN_ENDSTOP_INVERTING "false" +opt_set Y_MIN_ENDSTOP_INVERTING "false" +opt_set X_MAX_ENDSTOP_INVERTING "false" +opt_set Y_MAX_ENDSTOP_INVERTING "false" + +opt_enable MIN_SOFTWARE_ENDSTOPS SOFT_ENDSTOPS_MENU_ITEM USE_XMAX_PLUG USE_YMAX_PLUG \ + X_DUAL_STEPPER_DRIVERS X_DUAL_ENDSTOPS Y_DUAL_STEPPER_DRIVERS Y_DUAL_ENDSTOPS diff --git a/v1-scripts/configs/no-dual-endstops b/v1-scripts/configs/no-dual-endstops new file mode 100755 index 000000000000..587b20903514 --- /dev/null +++ b/v1-scripts/configs/no-dual-endstops @@ -0,0 +1,5 @@ +opt_set X_MIN_ENDSTOP_INVERTING "true" +opt_set Y_MIN_ENDSTOP_INVERTING "true" + +opt_disable MIN_SOFTWARE_ENDSTOPS SOFT_ENDSTOPS_MENU_ITEM USE_XMAX_PLUG USE_YMAX_PLUG \ + X_DUAL_STEPPER_DRIVERS X_DUAL_ENDSTOPS Y_DUAL_STEPPER_DRIVERS Y_DUAL_ENDSTOPS diff --git a/v1-scripts/diff-branches b/v1-scripts/diff-branches new file mode 100755 index 000000000000..b4cde003a077 --- /dev/null +++ b/v1-scripts/diff-branches @@ -0,0 +1,3 @@ +#!/bin/bash + +git diff --exit-code --quiet "$1..$2" diff --git a/v1-scripts/fetch-branch b/v1-scripts/fetch-branch new file mode 100755 index 000000000000..a61c08f8c609 --- /dev/null +++ b/v1-scripts/fetch-branch @@ -0,0 +1,11 @@ +#!/bin/bash + +set -ex + +# Inspired by https://github.com/actions/checkout#Fetch-all-branches + +for b in "$@"; do + o=$(dirname "$b") + l=$(basename "$b") + git fetch --no-tags --prune --depth=1 "$o" "+refs/heads/$l*:refs/remotes/$b*" +done diff --git a/v1-scripts/generate-build-branch b/v1-scripts/generate-build-branch new file mode 100755 index 000000000000..b137d36eac87 --- /dev/null +++ b/v1-scripts/generate-build-branch @@ -0,0 +1,33 @@ +#!/bin/bash + +ORIGIN_REMOTE_NAME="${ORIGIN_REMOTE_NAME:-origin}" +MIRROR_BRANCH="${MIRROR_BRANCH:-bugfix-2.0.x}" +MACHINES_BRANCH="${MACHINES_BRANCH:-HEAD}" +BUILD_BRANCH="${BUILD_BRANCH:-v1-$MIRROR_BRANCH}" +ADD_BRANCHES="${ADD_BRANCHES:-v1-base-config}" + +set -xe + +# Combine v1-machines and Marlin, this ensures v1-scripts are available for builds +# NB! we must detach the head here to make sure we don't destroy a local v1-machines branch +machines_ref=$(git rev-parse "$MACHINES_BRANCH") +git rebase $MIRROR_BRANCH $machines_ref + +# Merge branches that are not yet ready to be submitted to upstream +for branch in $ADD_BRANCHES; do + git fetch "$ORIGIN_REMOTE_NAME" "$branch" + git merge --no-stat --no-ff --no-edit "$ORIGIN_REMOTE_NAME/$branch" +done + +# Generate and commit configs +v1-scripts/generate-configs +git add config/examples +git commit -m 'Add configuratons for V1 machines' + +# Helpful message to user when running locally +old_ref=$(git rev-parse --verify "$BUILD_BRANCH" 2> /dev/null) && \ + echo "Overwriting $BUILD_BRANCH branch. Use git checkout -b new-name $old_ref to get it back" + +# Store results to local branch +git branch -f "$BUILD_BRANCH" +git branch -u "$ORIGIN_REMOTE_NAME/$BUILD_BRANCH" "$BUILD_BRANCH" || true # OK to fail diff --git a/v1-scripts/generate-configs b/v1-scripts/generate-configs new file mode 100755 index 000000000000..fd5ea1adf0ee --- /dev/null +++ b/v1-scripts/generate-configs @@ -0,0 +1,22 @@ +#!/bin/bash + +SCRIPTDIR="v1-scripts/configs" +CONFIGDIR="config/examples" + +set -e + +PATH=$PATH:buildroot/bin +export PATH + +for script in "$SCRIPTDIR"/{MPCNC,MP3DP,ZenXY}/*; do + machine=${script#$SCRIPTDIR/} + cfgdir=$CONFIGDIR/$machine + + echo "Generating config for $machine" + $script + + mkdir -p "$cfgdir" + cp Marlin/Configuration{.h,_adv.h} "$SCRIPTDIR"/_Bootscreen.h "$cfgdir" +done + +restore_configs diff --git a/v1-scripts/prepare-release b/v1-scripts/prepare-release new file mode 100755 index 000000000000..279c28c7d1ab --- /dev/null +++ b/v1-scripts/prepare-release @@ -0,0 +1,16 @@ +#!/bin/bash + +set -ex + +cfg=$1 +eval $(v1-scripts/configs/build-settings.py "$cfg") + +flatname=$(echo "$cfg" | sed 's@/@_@g') +dirname="$flatname" + +mkdir -p .bin +cp ".pio/build/$env/$out" ".bin/$flatname.$out" + +mkdir -p .zip +ln -sf ".." ".zip/$dirname-src" +(cd ".zip" && zip -prq "$flatname-src.zip" "$dirname-src"/*) diff --git a/v1-scripts/pull-from-upstream b/v1-scripts/pull-from-upstream new file mode 100755 index 000000000000..b7285ff8be70 --- /dev/null +++ b/v1-scripts/pull-from-upstream @@ -0,0 +1,35 @@ +#!/bin/bash + +UPSTREAM_REPOSITORY="${UPSTREAM_REPOSITORY:-https://github.com/MarlinFirmware/Marlin.git}" +UPSTREAM_REMOTE_NAME="${UPSTREAM_REMOTE_NAME:-upstream}" +UPSTREAM_BRANCH="${UPSTREAM_BRANCH:-$UPSTREAM_REMOTE_NAME/bugfix-2.0.x}" +MIRROR_BRANCH="${MIRROR_BRANCH:-$UPSTREAM_BRANCH}" +ORIGIN_REMOTE_NAME="${ORIGIN_REMOTE_NAME:-origin}" + +PULL_REQUESTS="${PULL_REQUESTS:-16108 16229}" + +set -xe + +git remote add -f -t "$UPSTREAM_BRANCH" $UPSTREAM_REMOTE_NAME "$UPSTREAM_REPOSITORY" +trap "git remote remove $UPSTREAM_REMOTE_NAME" EXIT + +# Start with vanilla upstream code +git checkout "$UPSTREAM_REMOTE_NAME/$UPSTREAM_BRANCH" + +# Fetch and merge upstream pull requests we deem necessary to carry in our version +# See: https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/checking-out-pull-requests-locally +for pr in $PULL_REQUESTS; do + git fetch $UPSTREAM_REMOTE_NAME "pull/$pr/head" + git merge --no-stat --no-ff --no-edit FETCH_HEAD +done + +# Helpful message to user when running locally +old_ref=$(git rev-parse --verify "$MIRROR_BRANCH" 2> /dev/null) && \ + echo "Overwriting $MIRROR_BRANCH branch. Use git checkout -b new-name $old_ref to get it back" + +# Store results in a local branch +git branch -f "$MIRROR_BRANCH" +git branch -u "$ORIGIN_REMOTE_NAME/$MIRROR_BRANCH" "$MIRROR_BRANCH" || true # OK to fail + +# Go back to where I started from +git checkout - diff --git a/v1-scripts/test-build-all-machines b/v1-scripts/test-build-all-machines new file mode 100755 index 000000000000..6eeae30889e9 --- /dev/null +++ b/v1-scripts/test-build-all-machines @@ -0,0 +1,15 @@ +#!/bin/sh + +set -e +v1-scripts/build-for-machine MP3DP/MRambo_16T_aero +v1-scripts/build-for-machine MP3DP/Ramps_16T_MK +v1-scripts/build-for-machine ZenXY/MiniRambo_16T +v1-scripts/build-for-machine ZenXY/Ramps_16T_LCD_32 +v1-scripts/build-for-machine MPCNC/MRambo_T8_16T_LCD +v1-scripts/build-for-machine MPCNC/Rambo_T8_16T_LCD +v1-scripts/build-for-machine MPCNC/Rambo_T8_16T_LCD_DualEndstop +v1-scripts/build-for-machine MPCNC/Ramps_T8_16T_LCD_32step +v1-scripts/build-for-machine MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop +v1-scripts/build-for-machine MPCNC/Archim1_T8_16T_LCD +v1-scripts/build-for-machine MPCNC/Archim1_T8_16T_LCD_DualEndstop +v1-scripts/build-for-machine MPCNC/Archim2_T8_16T_LCD_16step From fee18c70de3e3629f7074109fee9aa69c9d6d179 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Tue, 24 Dec 2019 05:14:02 -0600 Subject: [PATCH 02/26] Add SKR 1.3 dual endstop version --- .github/workflows/v1-builds.yml | 1 + .../MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop | 15 +++++++++++++++ v1-scripts/configs/build-settings.py | 1 + 3 files changed, 17 insertions(+) create mode 100755 v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop diff --git a/.github/workflows/v1-builds.yml b/.github/workflows/v1-builds.yml index a9430156dd3e..ee08f95a41fc 100644 --- a/.github/workflows/v1-builds.yml +++ b/.github/workflows/v1-builds.yml @@ -88,6 +88,7 @@ jobs: - MPCNC/Rambo_T8_16T_LCD_DualEndstop - MPCNC/Ramps_T8_16T_LCD_32step - MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop + - MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop - ZenXY/MiniRambo_16T - ZenXY/Ramps_16T_LCD_32 diff --git a/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop new file mode 100755 index 000000000000..d2b148adea97 --- /dev/null +++ b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop @@ -0,0 +1,15 @@ +#!/bin/bash + +incdir=$(dirname $0)/.. + +use_example_configs CNC/MPCNC +opt_enable SHOW_CUSTOM_BOOTSCREEN + +opt_set MOTHERBOARD BOARD_BIGTREE_SKR_V1_3 +opt_set SERIAL_PORT "-1" + +. $incdir/drv8825 +. $incdir/dual-endstops + +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" +opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/build-settings.py b/v1-scripts/configs/build-settings.py index 4547ca27952c..ab227edd1319 100755 --- a/v1-scripts/configs/build-settings.py +++ b/v1-scripts/configs/build-settings.py @@ -13,6 +13,7 @@ 'MPCNC/MRambo_T8_16T_LCD': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, 'MP3DP/Ramps_16T_MK': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, 'MP3DP/MRambo_16T_aero': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop': { 'env': 'LPC1768', 'out': 'firmware.bin' }, 'ZenXY/Ramps_16T_LCD_32': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, 'ZenXY/MiniRambo_16T': { 'env': 'megaatmega2560', 'out': 'firmware.hex' } } From 891eef065600b04b8a4a4ecc6bca41a71f1429d8 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Tue, 24 Dec 2019 13:04:19 -0600 Subject: [PATCH 03/26] Make config generation errors fatal --- v1-scripts/configs/MP3DP/MRambo_16T_aero | 2 ++ v1-scripts/configs/MP3DP/Ramps_16T_MK | 2 ++ v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD | 2 ++ v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop | 2 ++ v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step | 2 ++ v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD | 2 ++ v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD | 2 ++ v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop | 2 ++ v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step | 2 ++ .../configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop | 2 ++ .../configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop | 2 ++ v1-scripts/configs/ZenXY/MiniRambo_16T | 2 ++ v1-scripts/configs/ZenXY/Ramps_16T_LCD_32 | 2 ++ v1-scripts/configs/base-zenxy-config | 6 +++--- 14 files changed, 29 insertions(+), 3 deletions(-) diff --git a/v1-scripts/configs/MP3DP/MRambo_16T_aero b/v1-scripts/configs/MP3DP/MRambo_16T_aero index 4ba54318d960..e39b325691e6 100755 --- a/v1-scripts/configs/MP3DP/MRambo_16T_aero +++ b/v1-scripts/configs/MP3DP/MRambo_16T_aero @@ -1,4 +1,6 @@ #!/bin/bash + +set -e incdir=$(dirname $0)/.. diff --git a/v1-scripts/configs/MP3DP/Ramps_16T_MK b/v1-scripts/configs/MP3DP/Ramps_16T_MK index 9e576aaaeb08..d699ee77b412 100755 --- a/v1-scripts/configs/MP3DP/Ramps_16T_MK +++ b/v1-scripts/configs/MP3DP/Ramps_16T_MK @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. restore_configs diff --git a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD index 29fd6434aefa..3e7ddc257247 100755 --- a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD +++ b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. use_example_configs CNC/MPCNC diff --git a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop index 327d9289e775..cfe506102558 100755 --- a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop +++ b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. use_example_configs CNC/MPCNC diff --git a/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step b/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step index 61d4b284fe0f..206f3facc039 100755 --- a/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step +++ b/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. use_example_configs CNC/MPCNC diff --git a/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD b/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD index 4cf08ab9b30e..3ea57076066c 100755 --- a/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD +++ b/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. use_example_configs CNC/MPCNC diff --git a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD index ec1043acf046..c50d717e784a 100755 --- a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD +++ b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. use_example_configs CNC/MPCNC diff --git a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop index 4de25112f31b..4a30fa0dc473 100755 --- a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop +++ b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. use_example_configs CNC/MPCNC diff --git a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step index 3e7dfb85efa5..2ab719d0a3cf 100755 --- a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step +++ b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. use_example_configs CNC/MPCNC diff --git a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop index 6e195cc28597..7d2cc45718c5 100755 --- a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop +++ b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. use_example_configs CNC/MPCNC diff --git a/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop index d2b148adea97..fd81aacbe115 100755 --- a/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop +++ b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. use_example_configs CNC/MPCNC diff --git a/v1-scripts/configs/ZenXY/MiniRambo_16T b/v1-scripts/configs/ZenXY/MiniRambo_16T index 1209e8d88966..c46c83ecf8da 100755 --- a/v1-scripts/configs/ZenXY/MiniRambo_16T +++ b/v1-scripts/configs/ZenXY/MiniRambo_16T @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. restore_configs diff --git a/v1-scripts/configs/ZenXY/Ramps_16T_LCD_32 b/v1-scripts/configs/ZenXY/Ramps_16T_LCD_32 index 3cebb9b8aa40..bf72c70e2cdc 100755 --- a/v1-scripts/configs/ZenXY/Ramps_16T_LCD_32 +++ b/v1-scripts/configs/ZenXY/Ramps_16T_LCD_32 @@ -1,5 +1,7 @@ #!/bin/bash +set -e + incdir=$(dirname $0)/.. restore_configs diff --git a/v1-scripts/configs/base-zenxy-config b/v1-scripts/configs/base-zenxy-config index 39faf989419a..10395686b9c4 100755 --- a/v1-scripts/configs/base-zenxy-config +++ b/v1-scripts/configs/base-zenxy-config @@ -28,7 +28,7 @@ opt_set USER_DESC_2 "\"Home Z Axis\"" opt_set USER_GCODE_2 "\"G28 Z\"" opt_set USER_DESC_3 "\"Home X\&Y\"" opt_set USER_GCODE_3 "\"G28 X Y\"" -opt_enable COREXY JUNCTION_DEVIATION S_CURVE_ACCELERATION SOFT_ENDSTOPS_MENU_ITEM EEPROM_SETTINGS SDSUPPORT \ - INDIVIDUAL_AXIS_HOMING_MENU REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING \ - ADAPTIVE_STEP_SMOOTHING BABYSTEP_ALWAYS_AVAILABLE CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES CUSTOM_VERSION_FILE +opt_enable COREXY S_CURVE_ACCELERATION SOFT_ENDSTOPS_MENU_ITEM EEPROM_SETTINGS SDSUPPORT INDIVIDUAL_AXIS_HOMING_MENU \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING ADAPTIVE_STEP_SMOOTHING \ + BABYSTEP_ALWAYS_AVAILABLE CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES CUSTOM_VERSION_FILE opt_disable EVENT_GCODE_SD_STOP USER_DESC_4 USER_GCODE_4 USER_DESC_5 USER_GCODE_5 From a33b58dd500fd7518672de56b01739ddd1dda0ca Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Tue, 24 Dec 2019 13:25:24 -0600 Subject: [PATCH 04/26] Fix local usage of v1-scripts/pull-from-upstream --- v1-scripts/pull-from-upstream | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v1-scripts/pull-from-upstream b/v1-scripts/pull-from-upstream index b7285ff8be70..3b7fd358b1f4 100755 --- a/v1-scripts/pull-from-upstream +++ b/v1-scripts/pull-from-upstream @@ -2,7 +2,7 @@ UPSTREAM_REPOSITORY="${UPSTREAM_REPOSITORY:-https://github.com/MarlinFirmware/Marlin.git}" UPSTREAM_REMOTE_NAME="${UPSTREAM_REMOTE_NAME:-upstream}" -UPSTREAM_BRANCH="${UPSTREAM_BRANCH:-$UPSTREAM_REMOTE_NAME/bugfix-2.0.x}" +UPSTREAM_BRANCH="${UPSTREAM_BRANCH:-bugfix-2.0.x}" MIRROR_BRANCH="${MIRROR_BRANCH:-$UPSTREAM_BRANCH}" ORIGIN_REMOTE_NAME="${ORIGIN_REMOTE_NAME:-origin}" From eadd73abf05a3b7a89fef00a583e0736a7cfade3 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Tue, 24 Dec 2019 15:06:17 -0600 Subject: [PATCH 05/26] Fix PIO environment for Rambo boards --- v1-scripts/configs/build-settings.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/v1-scripts/configs/build-settings.py b/v1-scripts/configs/build-settings.py index ab227edd1319..d2fac05da09f 100755 --- a/v1-scripts/configs/build-settings.py +++ b/v1-scripts/configs/build-settings.py @@ -6,16 +6,16 @@ 'MPCNC/Archim1_T8_16T_LCD': { 'env': 'DUE', 'out': 'firmware.bin' }, 'MPCNC/Archim1_T8_16T_LCD_DualEndstop': { 'env': 'DUE', 'out': 'firmware.bin' }, 'MPCNC/Archim2_T8_16T_LCD_16step': { 'env': 'DUE', 'out': 'firmware.bin' }, - 'MPCNC/Rambo_T8_16T_LCD': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, - 'MPCNC/Rambo_T8_16T_LCD_DualEndstop': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MPCNC/Rambo_T8_16T_LCD': { 'env': 'rambo', 'out': 'firmware.hex' }, + 'MPCNC/Rambo_T8_16T_LCD_DualEndstop': { 'env': 'rambo', 'out': 'firmware.hex' }, 'MPCNC/Ramps_T8_16T_LCD_32step': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, 'MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, - 'MPCNC/MRambo_T8_16T_LCD': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MPCNC/MRambo_T8_16T_LCD': { 'env': 'rambo', 'out': 'firmware.hex' }, 'MP3DP/Ramps_16T_MK': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, - 'MP3DP/MRambo_16T_aero': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MP3DP/MRambo_16T_aero': { 'env': 'rambo', 'out': 'firmware.hex' }, 'MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop': { 'env': 'LPC1768', 'out': 'firmware.bin' }, 'ZenXY/Ramps_16T_LCD_32': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, - 'ZenXY/MiniRambo_16T': { 'env': 'megaatmega2560', 'out': 'firmware.hex' } + 'ZenXY/MiniRambo_16T': { 'env': 'rambo', 'out': 'firmware.hex' } } import sys From 6c23395f58c6026563687d067c25896a748f4123 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Thu, 26 Dec 2019 13:15:45 -0600 Subject: [PATCH 06/26] Move Marlin to a git sub-module --- .github/scripts/configure-git | 11 +++++ .github/workflows/v1-builds.yml | 54 +++++++++++++------------ .github/workflows/v1-pull.yml | 35 ++++++++-------- .gitignore | 2 + .gitmodules | 4 ++ MarlinFirmware | 1 + v1-scripts/build-for-machine | 11 +++-- v1-scripts/build-zips | 21 ++++++++++ v1-scripts/commit-configs | 9 +++++ v1-scripts/configs/patches/bugfix-2.0.x | 5 +++ v1-scripts/env | 8 ++++ v1-scripts/generate-build-branch | 33 --------------- v1-scripts/generate-configs | 19 +++++---- v1-scripts/prepare-release | 16 -------- v1-scripts/pull-from-upstream | 40 +++++++++++++----- v1-scripts/reset-to-manifest | 8 ++++ 16 files changed, 164 insertions(+), 113 deletions(-) create mode 100755 .github/scripts/configure-git create mode 100644 .gitignore create mode 100644 .gitmodules create mode 160000 MarlinFirmware create mode 100755 v1-scripts/build-zips create mode 100755 v1-scripts/commit-configs create mode 100644 v1-scripts/configs/patches/bugfix-2.0.x create mode 100755 v1-scripts/env delete mode 100755 v1-scripts/generate-build-branch delete mode 100755 v1-scripts/prepare-release create mode 100755 v1-scripts/reset-to-manifest diff --git a/.github/scripts/configure-git b/.github/scripts/configure-git new file mode 100755 index 000000000000..7f3651971cfa --- /dev/null +++ b/.github/scripts/configure-git @@ -0,0 +1,11 @@ +# Magic from https://github.com/actions/checkout#Checkout-submodules +auth_header="$(git config --local --get http.https://github.com/.extraheader)" +git config --global protocol.version 2 +git config --global http.extraheader "$auth_header" + +# Commit identity +git config --global user.email "actions@github.com" +git config --global user.name "GitHub Actions" + +# Other settings +git config --global advice.detachedHead false diff --git a/.github/workflows/v1-builds.yml b/.github/workflows/v1-builds.yml index ee08f95a41fc..2da097a0949e 100644 --- a/.github/workflows/v1-builds.yml +++ b/.github/workflows/v1-builds.yml @@ -26,12 +26,22 @@ jobs: runs-on: ubuntu-latest env: - MIRROR_BRANCH: bugfix-2.0.x BUILD_BRANCH: v1-bugfix-2.0.x steps: - - name: Check out the code - uses: actions/checkout@v2 + - uses: actions/checkout@v2 + - run: .github/scripts/configure-git + - name: Check out submodules + run: | + (cd MarlinFirmware && ../v1-scripts/fetch-branch "origin/$BUILD_BRANCH") + git submodule sync --recursive + git submodule update --init --force --recursive --remote + + - name: Generate + run: | + v1-scripts/reset-to-manifest + v1-scripts/generate-configs + v1-scripts/commit-configs # Based on .github/workflows/test-builds.yml - name: Select Python 3.7 @@ -45,28 +55,16 @@ jobs: pip install -U https://github.com/platformio/platformio-core/archive/master.zip platformio update - - name: Set git identity - run: | - git config --global user.email "actions@github.com" - git config --global user.name "GitHub Actions" - git config --global advice.detachedHead false - - - name: Generate - run: | - v1-scripts/fetch-branch "origin/$BUILD_BRANCH" - git fetch --prune origin "$MIRROR_BRANCH" # We need full history of the mirror branch - git branch $MIRROR_BRANCH origin/$MIRROR_BRANCH - v1-scripts/generate-build-branch - - name: Check run: | - v1-scripts/diff-branches "$BUILD_BRANCH" "origin/$BUILD_BRANCH" && exit 0 # No changes + #v1-scripts/diff-branches "$BUILD_BRANCH" "origin/$BUILD_BRANCH" && exit 0 # No changes v1-scripts/build-for-machine MPCNC/Rambo_T8_16T_LCD_DualEndstop - name: Push if: github.event_name != 'pull_request' run: | - git push origin "$BUILD_BRANCH:refs/heads/$BUILD_BRANCH" --force + cd MarlinFirmware + git push origin "HEAD:refs/heads/$BUILD_BRANCH" --force build: @@ -74,6 +72,9 @@ jobs: runs-on: ubuntu-latest needs: generate + env: + BUILD_BRANCH: v1-bugfix-2.0.x + strategy: fail-fast: false # Allow all machines to finish building matrix: @@ -93,10 +94,13 @@ jobs: - ZenXY/Ramps_16T_LCD_32 steps: - - name: Check out the code - uses: actions/checkout@v2 - with: - ref: v1-bugfix-2.0.x + - uses: actions/checkout@v2 + - run: .github/scripts/configure-git + - name: Check out submodules + run: | + (cd MarlinFirmware && ../v1-scripts/fetch-branch "origin/$BUILD_BRANCH") + git submodule sync --recursive + git submodule update --init --force --recursive --remote # Based on .github/workflows/test-builds.yml - name: Select Python 3.7 @@ -110,12 +114,10 @@ jobs: pip install -U https://github.com/platformio/platformio-core/archive/master.zip platformio update - - name: Build ${{ matrix.machine.cfg }} + - name: Build run: | - chmod +x buildroot/bin/* - chmod +x buildroot/share/tests/* v1-scripts/build-for-machine ${{ matrix.machine }} - v1-scripts/prepare-release ${{ matrix.machine }} + v1-scripts/build-zips ${{ matrix.machine }} - name: Release uses: ncipollo/release-action@v1 diff --git a/.github/workflows/v1-pull.yml b/.github/workflows/v1-pull.yml index 021a60f92007..6939bbfe84c4 100644 --- a/.github/workflows/v1-pull.yml +++ b/.github/workflows/v1-pull.yml @@ -10,7 +10,9 @@ on: - 'v1-machines**' paths: - '.github/workflows/v1-pull.yml' + - '.github/scripts' - 'v1-scripts/**' + - 'MarlinFirmware' - '!v1-scripts/config/**' pull_request: @@ -18,7 +20,9 @@ on: - 'v1-machines**' paths: - '.github/workflows/v1-pull.yml' + - '.github/scripts' - 'v1-scripts/**' + - 'MarlinFirmware' - '!v1-scripts/config/**' jobs: @@ -29,11 +33,19 @@ jobs: env: UPSTREAM_BRANCH: bugfix-2.0.x - MIRROR_BRANCH: bugfix-2.0.x steps: - - name: Check out the code - uses: actions/checkout@v2 + - uses: actions/checkout@v2 + - run: .github/scripts/configure-git + - name: Check out submodules + run: | + git submodule sync --recursive + git submodule update --init --force --recursive --depth=1 + + - name: Pull + run: | + v1-scripts/fetch-branch "origin/v1-$UPSTREAM_BRANCH" + v1-scripts/pull-from-upstream # Based on .github/workflows/test-builds.yml - name: Select Python 3.7 @@ -47,24 +59,13 @@ jobs: pip install -U https://github.com/platformio/platformio-core/archive/master.zip platformio update - - name: Set git identity - run: | - git config --global user.email "actions@github.com" - git config --global user.name "GitHub Actions" - git config --global advice.detachedHead false - - - name: Pull - run: | - v1-scripts/fetch-branch "origin/$MIRROR_BRANCH" - v1-scripts/pull-from-upstream - - name: Check run: | - v1-scripts/diff-branches "$MIRROR_BRANCH" "origin/$MIRROR_BRANCH" && exit 0 # No changes - v1-scripts/generate-build-branch + #v1-scripts/diff-branches ... "origin/v1-$UPSTREAM_BRANCH" && exit 0 # No changes v1-scripts/build-for-machine MPCNC/Rambo_T8_16T_LCD_DualEndstop - name: Push if: github.event_name != 'pull_request' run: | - git push origin "$MIRROR_BRANCH:refs/heads/$MIRROR_BRANCH" --force + cd MarlinFirmware + git push origin "HEAD:refs/heads/v1-$UPSTREAM_BRANCH" --force diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..fa3235dbbcd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.bin +/.zip diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000000..ece59852ffb3 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "MarlinFirmware"] + path = MarlinFirmware + url = ./ + branch = v1-bugfix-2.0.x diff --git a/MarlinFirmware b/MarlinFirmware new file mode 160000 index 000000000000..14ab8caee48d --- /dev/null +++ b/MarlinFirmware @@ -0,0 +1 @@ +Subproject commit 14ab8caee48d9dd6df68bfce0d4f385b04372865 diff --git a/v1-scripts/build-for-machine b/v1-scripts/build-for-machine index bb3180b5353a..cc5f047daf5a 100755 --- a/v1-scripts/build-for-machine +++ b/v1-scripts/build-for-machine @@ -1,13 +1,18 @@ #!/bin/bash +set -ex + +. $(dirname "$0")/env + machine=$1 shift -export PATH=$PATH:buildroot/bin +[ "$machine" ] || exit 2 -set -ex +eval $($V1_ROOT/$CFGDIR/build-settings.py "$machine") -eval $(v1-scripts/configs/build-settings.py "$machine") +cd "$V1_ROOT/$MARLINDIR" +export PATH=$PATH:buildroot/bin use_example_configs $machine build_marlin_pio . -e "$env" "$@" diff --git a/v1-scripts/build-zips b/v1-scripts/build-zips new file mode 100755 index 000000000000..fa5880f4bce0 --- /dev/null +++ b/v1-scripts/build-zips @@ -0,0 +1,21 @@ +#!/bin/bash + +set -ex + +. $(dirname "$0")/env + +machine=$1 +[ "$machine" ] || exit 2 +eval $($V1_ROOT/$CFGDIR/build-settings.py "$machine") + +flatname=$(echo "$machine" | sed 's@/@_@g') +dirname="$flatname" + +cd "$V1_ROOT" + +mkdir -p .bin +cp "$MARLINDIR/.pio/build/$env/$out" ".bin/$flatname.$out" + +mkdir -p .zip +ln -sf "$V1_ROOT/$MARLINDIR" ".zip/$dirname-src" +(cd ".zip" && zip -prq "$flatname-src.zip" "$dirname-src"/*) diff --git a/v1-scripts/commit-configs b/v1-scripts/commit-configs new file mode 100755 index 000000000000..174a1d23c435 --- /dev/null +++ b/v1-scripts/commit-configs @@ -0,0 +1,9 @@ +#!/bin/bash + +set -ex + +. $(dirname "$0")/env + +cd "$V1_ROOT/$MARLINDIR" +git add config/examples +git commit -m 'Add configuratons for V1 machines' diff --git a/v1-scripts/configs/patches/bugfix-2.0.x b/v1-scripts/configs/patches/bugfix-2.0.x new file mode 100644 index 000000000000..c03e3da2e77b --- /dev/null +++ b/v1-scripts/configs/patches/bugfix-2.0.x @@ -0,0 +1,5 @@ +# +# Changes to be applied on top of MarlinFirmware/Marlin/bugfix-2.0.x +# +PULL_REQUESTS="${PULL_REQUESTS:-16108 16229}" +ADD_BRANCHES="${ADD_BRANCHES:-v1-base-config}" diff --git a/v1-scripts/env b/v1-scripts/env new file mode 100755 index 000000000000..67dede969fe5 --- /dev/null +++ b/v1-scripts/env @@ -0,0 +1,8 @@ +V1_ROOT=${V1_ROOT:-$(cd "$(dirname "$0")/.."; pwd)} +SCRIPTDIR="${SCRIPTDIR:-v1-scripts}" +CFGDIR="${CFGDIR:-$SCRIPTDIR/configs}" +MARLINDIR="${MARLINDIR:-MarlinFirmware}" + +PATH="$PATH:$V1_ROOT/$SCRIPTDIR" + +export V1_ROOT SCRIPTDIR CFGDIR MARLINDIR PATH diff --git a/v1-scripts/generate-build-branch b/v1-scripts/generate-build-branch deleted file mode 100755 index b137d36eac87..000000000000 --- a/v1-scripts/generate-build-branch +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -ORIGIN_REMOTE_NAME="${ORIGIN_REMOTE_NAME:-origin}" -MIRROR_BRANCH="${MIRROR_BRANCH:-bugfix-2.0.x}" -MACHINES_BRANCH="${MACHINES_BRANCH:-HEAD}" -BUILD_BRANCH="${BUILD_BRANCH:-v1-$MIRROR_BRANCH}" -ADD_BRANCHES="${ADD_BRANCHES:-v1-base-config}" - -set -xe - -# Combine v1-machines and Marlin, this ensures v1-scripts are available for builds -# NB! we must detach the head here to make sure we don't destroy a local v1-machines branch -machines_ref=$(git rev-parse "$MACHINES_BRANCH") -git rebase $MIRROR_BRANCH $machines_ref - -# Merge branches that are not yet ready to be submitted to upstream -for branch in $ADD_BRANCHES; do - git fetch "$ORIGIN_REMOTE_NAME" "$branch" - git merge --no-stat --no-ff --no-edit "$ORIGIN_REMOTE_NAME/$branch" -done - -# Generate and commit configs -v1-scripts/generate-configs -git add config/examples -git commit -m 'Add configuratons for V1 machines' - -# Helpful message to user when running locally -old_ref=$(git rev-parse --verify "$BUILD_BRANCH" 2> /dev/null) && \ - echo "Overwriting $BUILD_BRANCH branch. Use git checkout -b new-name $old_ref to get it back" - -# Store results to local branch -git branch -f "$BUILD_BRANCH" -git branch -u "$ORIGIN_REMOTE_NAME/$BUILD_BRANCH" "$BUILD_BRANCH" || true # OK to fail diff --git a/v1-scripts/generate-configs b/v1-scripts/generate-configs index fd5ea1adf0ee..1c77dae067b8 100755 --- a/v1-scripts/generate-configs +++ b/v1-scripts/generate-configs @@ -1,22 +1,27 @@ #!/bin/bash -SCRIPTDIR="v1-scripts/configs" -CONFIGDIR="config/examples" - set -e +. $(dirname "$0")/env + +CONFIG_DIR="$V1_ROOT/$CFGDIR" +MARLIN_CONFIG_DIR="${MARLIN_CONFIG_DIR:-config/examples}" + +cd "$V1_ROOT/$MARLINDIR" + PATH=$PATH:buildroot/bin export PATH -for script in "$SCRIPTDIR"/{MPCNC,MP3DP,ZenXY}/*; do - machine=${script#$SCRIPTDIR/} - cfgdir=$CONFIGDIR/$machine +for script in "$CONFIG_DIR"/{MPCNC,MP3DP,ZenXY}/*; do + machine=${script#$CONFIG_DIR/} + cfgdir=$MARLIN_CONFIG_DIR/$machine echo "Generating config for $machine" $script mkdir -p "$cfgdir" - cp Marlin/Configuration{.h,_adv.h} "$SCRIPTDIR"/_Bootscreen.h "$cfgdir" + cp Marlin/Configuration{.h,_adv.h} "$CONFIG_DIR"/_Bootscreen.h "$cfgdir" done restore_configs +git checkout Marlin/Configuration{.h,_adv.h} || exit 0 # OK to fail diff --git a/v1-scripts/prepare-release b/v1-scripts/prepare-release deleted file mode 100755 index 279c28c7d1ab..000000000000 --- a/v1-scripts/prepare-release +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -ex - -cfg=$1 -eval $(v1-scripts/configs/build-settings.py "$cfg") - -flatname=$(echo "$cfg" | sed 's@/@_@g') -dirname="$flatname" - -mkdir -p .bin -cp ".pio/build/$env/$out" ".bin/$flatname.$out" - -mkdir -p .zip -ln -sf ".." ".zip/$dirname-src" -(cd ".zip" && zip -prq "$flatname-src.zip" "$dirname-src"/*) diff --git a/v1-scripts/pull-from-upstream b/v1-scripts/pull-from-upstream index 3b7fd358b1f4..6b39304fff17 100755 --- a/v1-scripts/pull-from-upstream +++ b/v1-scripts/pull-from-upstream @@ -1,35 +1,53 @@ #!/bin/bash +set -xe + +. $(dirname "$0")/env + UPSTREAM_REPOSITORY="${UPSTREAM_REPOSITORY:-https://github.com/MarlinFirmware/Marlin.git}" UPSTREAM_REMOTE_NAME="${UPSTREAM_REMOTE_NAME:-upstream}" -UPSTREAM_BRANCH="${UPSTREAM_BRANCH:-bugfix-2.0.x}" -MIRROR_BRANCH="${MIRROR_BRANCH:-$UPSTREAM_BRANCH}" ORIGIN_REMOTE_NAME="${ORIGIN_REMOTE_NAME:-origin}" +UPSTREAM_BRANCH="${UPSTREAM_BRANCH:-bugfix-2.0.x}" +BUILD_BRANCH="${BUILD_BRANCH:-v1-$UPSTREAM_BRANCH}" -PULL_REQUESTS="${PULL_REQUESTS:-16108 16229}" +# Pull requests and other patches to be applied on top of the upsteam branch +. $V1_ROOT/$CFGDIR/patches/$UPSTREAM_BRANCH -set -xe +cd "$V1_ROOT/$MARLINDIR" git remote add -f -t "$UPSTREAM_BRANCH" $UPSTREAM_REMOTE_NAME "$UPSTREAM_REPOSITORY" trap "git remote remove $UPSTREAM_REMOTE_NAME" EXIT # Start with vanilla upstream code git checkout "$UPSTREAM_REMOTE_NAME/$UPSTREAM_BRANCH" +git show-ref --verify "refs/remotes/$UPSTREAM_REMOTE_NAME/$UPSTREAM_BRANCH" > v1-manifest # Fetch and merge upstream pull requests we deem necessary to carry in our version # See: https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/checking-out-pull-requests-locally for pr in $PULL_REQUESTS; do git fetch $UPSTREAM_REMOTE_NAME "pull/$pr/head" + echo "$(git rev-parse FETCH_HEAD) refs/remotes/$UPSTREAM_REMOTE_NAME/pull/$pr/head" >> v1-manifest git merge --no-stat --no-ff --no-edit FETCH_HEAD done +for branch in $ADD_BRANCHES; do + git fetch "$ORIGIN_REMOTE_NAME" "$branch" + echo "$(git rev-parse FETCH_HEAD) refs/remotes/$ORIGIN_REMOTE_NAME/$branch" >> v1-manifest + git merge --no-stat --no-ff --no-edit FETCH_HEAD +done + +# Store manifest +git add v1-manifest +git commit -m 'manifest' + +# Generate and commit configs +generate-configs +commit-configs + # Helpful message to user when running locally -old_ref=$(git rev-parse --verify "$MIRROR_BRANCH" 2> /dev/null) && \ - echo "Overwriting $MIRROR_BRANCH branch. Use git checkout -b new-name $old_ref to get it back" +old_ref=$(git rev-parse --verify "$BUILD_BRANCH" 2> /dev/null) && \ + echo "Overwriting $BUILD_BRANCH branch. Use git checkout -b new-name $old_ref to get it back" # Store results in a local branch -git branch -f "$MIRROR_BRANCH" -git branch -u "$ORIGIN_REMOTE_NAME/$MIRROR_BRANCH" "$MIRROR_BRANCH" || true # OK to fail - -# Go back to where I started from -git checkout - +git branch -f "$BUILD_BRANCH" +git branch -u "$ORIGIN_REMOTE_NAME/$BUILD_BRANCH" "$BUILD_BRANCH" || true # OK to fail diff --git a/v1-scripts/reset-to-manifest b/v1-scripts/reset-to-manifest new file mode 100755 index 000000000000..ab5b2ebcdf06 --- /dev/null +++ b/v1-scripts/reset-to-manifest @@ -0,0 +1,8 @@ +#!/bin/bash + +set -ex + +. $(dirname "$0")/env + +cd "$V1_ROOT/$MARLINDIR" +git checkout $(git log -n 1 --pretty="%H" v1-manifest) From db6541f5f540692f5f596888a5cd12de04f3f58d Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 29 Dec 2019 00:23:26 -0600 Subject: [PATCH 07/26] Add a dual endstop config for SKR Pro 1.1 --- .github/workflows/v1-builds.yml | 1 + .../SKRPro1.1_T8_16T_LCD_32step_DualEndstop | 18 ++++++++++++++++++ v1-scripts/configs/build-settings.py | 1 + 3 files changed, 20 insertions(+) create mode 100755 v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop diff --git a/.github/workflows/v1-builds.yml b/.github/workflows/v1-builds.yml index 2da097a0949e..6a818f9c4518 100644 --- a/.github/workflows/v1-builds.yml +++ b/.github/workflows/v1-builds.yml @@ -90,6 +90,7 @@ jobs: - MPCNC/Ramps_T8_16T_LCD_32step - MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop - MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop + - MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop - ZenXY/MiniRambo_16T - ZenXY/Ramps_16T_LCD_32 diff --git a/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop new file mode 100755 index 000000000000..45b9e57d8dd8 --- /dev/null +++ b/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e + +incdir=$(dirname $0)/.. + +use_example_configs CNC/MPCNC +opt_enable SHOW_CUSTOM_BOOTSCREEN + +opt_set MOTHERBOARD BOARD_BIGTREE_SKR_PRO_V1_1 +opt_set SERIAL_PORT "-1" +opt_set EXTRUDERS "1" + +. $incdir/drv8825 +. $incdir/dual-endstops + +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" +opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/build-settings.py b/v1-scripts/configs/build-settings.py index d2fac05da09f..23b2b458f833 100755 --- a/v1-scripts/configs/build-settings.py +++ b/v1-scripts/configs/build-settings.py @@ -14,6 +14,7 @@ 'MP3DP/Ramps_16T_MK': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, 'MP3DP/MRambo_16T_aero': { 'env': 'rambo', 'out': 'firmware.hex' }, 'MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop': { 'env': 'LPC1768', 'out': 'firmware.bin' }, + 'MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop': { 'env': 'BIGTREE_SKR_PRO', 'out': 'firmware.bin' }, 'ZenXY/Ramps_16T_LCD_32': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, 'ZenXY/MiniRambo_16T': { 'env': 'rambo', 'out': 'firmware.hex' } } From a18338d4a5c12e29a25cd2d375bbaa16fa2959f4 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 29 Dec 2019 00:24:29 -0600 Subject: [PATCH 08/26] Add configs for 2.0.x and dev-2.1.x branches --- v1-scripts/configs/patches/2.0.x | 5 +++++ v1-scripts/configs/patches/dev-2.1.x | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 v1-scripts/configs/patches/2.0.x create mode 100644 v1-scripts/configs/patches/dev-2.1.x diff --git a/v1-scripts/configs/patches/2.0.x b/v1-scripts/configs/patches/2.0.x new file mode 100644 index 000000000000..498535b5f3d5 --- /dev/null +++ b/v1-scripts/configs/patches/2.0.x @@ -0,0 +1,5 @@ +# +# Changes to be applied on top of MarlinFirmware/Marlin/bugfix-2.0.x +# +PULL_REQUESTS="${PULL_REQUESTS:-}" +ADD_BRANCHES="${ADD_BRANCHES:-v1-base-config-2.0.x}" diff --git a/v1-scripts/configs/patches/dev-2.1.x b/v1-scripts/configs/patches/dev-2.1.x new file mode 100644 index 000000000000..46655e38ebb2 --- /dev/null +++ b/v1-scripts/configs/patches/dev-2.1.x @@ -0,0 +1,5 @@ +# +# Changes to be applied on top of MarlinFirmware/Marlin/dev-2.1.x +# +PULL_REQUESTS="${PULL_REQUESTS:-}" +ADD_BRANCHES="${ADD_BRANCHES:-v1-base-config}" From 3870c5dde73b5a0e353e742163539cd817e71ee3 Mon Sep 17 00:00:00 2001 From: Daniel Olfelt Date: Sun, 5 Jan 2020 13:24:38 -0600 Subject: [PATCH 09/26] Add readme and provide double check in script --- README.md | 35 +++++++++++++++++++++++++++++++++++ v1-scripts/pull-from-upstream | 3 +++ 2 files changed, 38 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000000..fa5f0c142aa3 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# V1 Engineering Preconfigured Marlin + +This repository provides a preconfigured version of Marlin that is optimized for CNC and milling purposes. + +## Getting started + +TODO: Possibly links to download pre-built firmware. + +## Building V1 Marlin + +These scripts require the PlatformIO CLI and GNU `sed` + +[Install PlatformIO](https://docs.platformio.org/en/latest/installation.html) + +In order to generate the configuration you must first pull the Marlin submodule + +``` +git submodule update --init --recursive +``` + +Then generate the example configuration using the following script + +``` +UPSTREAM_BRANCH=2.0.x ./v1-scripts/pull-from-upstream +``` + +Then generate a firmware file by running + +``` +./v1-scripts/build-for-machine machine-name +``` + +Machine names are based on the folder and filename within `v1-scripts/configs`. For example, for the Archim board you would use `MPCNC/Archim1_T8_16T_LCD`. + +The firmware file will be located in the `MarlinFirmware/.pio` directory. diff --git a/v1-scripts/pull-from-upstream b/v1-scripts/pull-from-upstream index 6b39304fff17..25ac2c858d48 100755 --- a/v1-scripts/pull-from-upstream +++ b/v1-scripts/pull-from-upstream @@ -15,6 +15,9 @@ BUILD_BRANCH="${BUILD_BRANCH:-v1-$UPSTREAM_BRANCH}" cd "$V1_ROOT/$MARLINDIR" +# Check to see if the submodule has been initialized +[[ -f .git ]] || (echo -e "\n\033[0;31mMissing git submodule, make sure to run\ngit submodule update --init --recursive\033[0m"; exit 1) + git remote add -f -t "$UPSTREAM_BRANCH" $UPSTREAM_REMOTE_NAME "$UPSTREAM_REPOSITORY" trap "git remote remove $UPSTREAM_REMOTE_NAME" EXIT From 3c477d5d91bec10c3f48684770b7ac21049aea23 Mon Sep 17 00:00:00 2001 From: Ryan V1 <55478432+V1EngineeringInc@users.noreply.github.com> Date: Sun, 26 Jan 2020 10:46:03 -0800 Subject: [PATCH 10/26] My current Base config I have no idea if I did this right but I am getting closer to finishing up all the new firmware and these are the settings I am using. Trying to keep my note in a public place, work in progress https://docs.google.com/spreadsheets/d/1vqvdtS2TFGz9YddYO6rAU1w7-0tvp0B9ObIfAOfCKvs/edit?usp=sharing --- v1-scripts/configs/base-cnc-config | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/v1-scripts/configs/base-cnc-config b/v1-scripts/configs/base-cnc-config index 5afb363c641f..693c0b1b2d09 100755 --- a/v1-scripts/configs/base-cnc-config +++ b/v1-scripts/configs/base-cnc-config @@ -1,14 +1,14 @@ opt_set STRING_CONFIG_H_AUTHOR "\"(V1 Engineering, Ryan)\"" -opt_set CUSTOM_MACHINE_NAME "\"V1 E CNC\"" +opt_set CUSTOM_MACHINE_NAME "\"V1 CNC\"" opt_set EXTRUDERS "0" opt_set Z_MIN_ENDSTOP_INVERTING "true" opt_set Z_MAX_ENDSTOP_INVERTING "false" opt_set Z_MIN_PROBE_ENDSTOP_INVERTING "true" -opt_set DEFAULT_MAX_FEEDRATE "{ 120, 120, 30, 25 }" -opt_set DEFAULT_MAX_ACCELERATION "{ 400, 400, 100, 2000 }" -opt_set DEFAULT_ACCELERATION "400" -opt_set DEFAULT_TRAVEL_ACCELERATION "400" -opt_set JUNCTION_DEVIATION_MM "0.1" +opt_set DEFAULT_MAX_FEEDRATE "{ 50, 50, 15, 50 }" +opt_set DEFAULT_MAX_ACCELERATION "{ 180, 180, 80, 180 }" +opt_set DEFAULT_ACCELERATION "180" +opt_set DEFAULT_TRAVEL_ACCELERATION "180" +opt_set JUNCTION_DEVIATION_MM "0.04" opt_set HOMING_FEEDRATE_XY "(30*60)" opt_set HOMING_FEEDRATE_Z "(3*60)" opt_set X_HOME_BUMP_MM "7" @@ -18,7 +18,8 @@ opt_set HOMING_BUMP_DIVISOR "{ 4, 4, 5 }" opt_set DEFAULT_STEPPER_DEACTIVE_TIME "1200" opt_set LCD_TIMEOUT_TO_STATUS "45000" opt_set SD_FINISHED_STEPPERRELEASE "false" -opt_set MM_PER_ARC_SEGMENT ".3" +opt_set MM_PER_ARC_SEGMENT ".2" +opt_set ARC_SEGMENTS_PER_R "1" opt_set CUSTOM_USER_MENU_TITLE "\"Custom Commands\"" opt_set USER_DESC_1 "\"Reset All Coordinates\"" opt_set USER_GCODE_1 "\"G92 X0 Y0 Z0\"" @@ -26,6 +27,6 @@ opt_set USER_DESC_2 "\"Home Z Axis\"" opt_set USER_GCODE_2 "\"G28 Z\"" opt_set USER_DESC_3 "\"Home X\&Y\"" opt_set USER_GCODE_3 "\"G28 X Y\"" -opt_enable S_CURVE_ACCELERATION SDSUPPORT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_STEP_SMOOTHING \ +opt_enable S_CURVE_ACCELERATION SDSUPPORT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ARC_SUPPORT ARC_SEGMENTS_PER_R ADAPTIVE_STEP_SMOOTHING \ CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES CUSTOM_USER_MENUS CUSTOM_VERSION_FILE SHOW_CUSTOM_BOOTSCREEN -opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS EVENT_GCODE_SD_STOP USER_DESC_4 USER_GCODE_4 USER_DESC_5 USER_GCODE_5 +opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS MIN_ARC_SEGMENTS EVENT_GCODE_SD_STOP USER_DESC_4 USER_GCODE_4 USER_DESC_5 USER_GCODE_5 From 7c6e8974e873a195866f00e28099b6c9f66d6931 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 19 Jan 2020 21:29:48 -0600 Subject: [PATCH 11/26] Enable helical plunge with arcs (P circles) and CNC workplanes --- v1-scripts/configs/base-cnc-config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/v1-scripts/configs/base-cnc-config b/v1-scripts/configs/base-cnc-config index 693c0b1b2d09..301b30768a91 100755 --- a/v1-scripts/configs/base-cnc-config +++ b/v1-scripts/configs/base-cnc-config @@ -27,6 +27,7 @@ opt_set USER_DESC_2 "\"Home Z Axis\"" opt_set USER_GCODE_2 "\"G28 Z\"" opt_set USER_DESC_3 "\"Home X\&Y\"" opt_set USER_GCODE_3 "\"G28 X Y\"" -opt_enable S_CURVE_ACCELERATION SDSUPPORT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ARC_SUPPORT ARC_SEGMENTS_PER_R ADAPTIVE_STEP_SMOOTHING \ - CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES CUSTOM_USER_MENUS CUSTOM_VERSION_FILE SHOW_CUSTOM_BOOTSCREEN +opt_enable S_CURVE_ACCELERATION SDSUPPORT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ARC_SUPPORT ARC_SEGMENTS_PER_R \ + ARC_P_CIRCLES ADAPTIVE_STEP_SMOOTHING CNC_COORDINATE_SYSTEMS CNC_WORKSPACE_PLANES GCODE_MOTION_MODES CUSTOM_USER_MENUS \ + CUSTOM_VERSION_FILE SHOW_CUSTOM_BOOTSCREEN opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS MIN_ARC_SEGMENTS EVENT_GCODE_SD_STOP USER_DESC_4 USER_GCODE_4 USER_DESC_5 USER_GCODE_5 From 9a1671287c0484bdba35ca73e24fab50bb777136 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 9 Feb 2020 19:55:15 -0600 Subject: [PATCH 12/26] Remove already merged PRs from bugfix-2.0.x build --- v1-scripts/configs/patches/bugfix-2.0.x | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v1-scripts/configs/patches/bugfix-2.0.x b/v1-scripts/configs/patches/bugfix-2.0.x index c03e3da2e77b..104aad95785f 100644 --- a/v1-scripts/configs/patches/bugfix-2.0.x +++ b/v1-scripts/configs/patches/bugfix-2.0.x @@ -1,5 +1,5 @@ # # Changes to be applied on top of MarlinFirmware/Marlin/bugfix-2.0.x # -PULL_REQUESTS="${PULL_REQUESTS:-16108 16229}" +PULL_REQUESTS="${PULL_REQUESTS:-}" ADD_BRANCHES="${ADD_BRANCHES:-v1-base-config}" From 1f37638752139c01b37272cde741d80e6bf40ac3 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 9 Feb 2020 20:02:42 -0600 Subject: [PATCH 13/26] Ditch the hand-edited base config and switch to 100% generated --- v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD | 3 ++- v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop | 3 ++- v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step | 3 ++- v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD | 3 ++- v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD | 3 ++- v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop | 3 ++- v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step | 3 ++- .../configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop | 3 ++- .../configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop | 9 +++++---- .../MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop | 9 +++++---- v1-scripts/configs/patches/2.0.x | 2 +- v1-scripts/configs/patches/bugfix-2.0.x | 2 +- v1-scripts/configs/patches/dev-2.1.x | 2 +- 13 files changed, 29 insertions(+), 19 deletions(-) diff --git a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD index 3e7ddc257247..106b60e6ce50 100755 --- a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD +++ b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD @@ -4,9 +4,10 @@ set -e incdir=$(dirname $0)/.. -use_example_configs CNC/MPCNC +restore_configs opt_enable SHOW_CUSTOM_BOOTSCREEN +. $incdir/base-cnc-config . $incdir/board-archim1 . $incdir/no-dual-endstops . $incdir/drv8825 diff --git a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop index cfe506102558..9560f57918d0 100755 --- a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop +++ b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop @@ -4,9 +4,10 @@ set -e incdir=$(dirname $0)/.. -use_example_configs CNC/MPCNC +restore_configs opt_enable SHOW_CUSTOM_BOOTSCREEN +. $incdir/base-cnc-config . $incdir/board-archim1 . $incdir/dual-endstops . $incdir/drv8825 diff --git a/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step b/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step index 206f3facc039..14943d62593a 100755 --- a/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step +++ b/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step @@ -4,9 +4,10 @@ set -e incdir=$(dirname $0)/.. -use_example_configs CNC/MPCNC +restore_configs opt_enable SHOW_CUSTOM_BOOTSCREEN +. $incdir/base-cnc-config . $incdir/no-dual-endstops opt_set SERIAL_PORT "-1" diff --git a/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD b/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD index 3ea57076066c..1531ca46d8fd 100755 --- a/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD +++ b/v1-scripts/configs/MPCNC/MRambo_T8_16T_LCD @@ -4,9 +4,10 @@ set -e incdir=$(dirname $0)/.. -use_example_configs CNC/MPCNC +restore_configs opt_enable SHOW_CUSTOM_BOOTSCREEN +. $incdir/base-cnc-config . $incdir/no-dual-endstops . $incdir/avr-lcd-timings diff --git a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD index c50d717e784a..99bf28910454 100755 --- a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD +++ b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD @@ -4,9 +4,10 @@ set -e incdir=$(dirname $0)/.. -use_example_configs CNC/MPCNC +restore_configs opt_enable SHOW_CUSTOM_BOOTSCREEN +. $incdir/base-cnc-config . $incdir/board-rambo . $incdir/no-dual-endstops diff --git a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop index 4a30fa0dc473..c9e1cf1a6c45 100755 --- a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop +++ b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop @@ -4,9 +4,10 @@ set -e incdir=$(dirname $0)/.. -use_example_configs CNC/MPCNC +restore_configs opt_enable SHOW_CUSTOM_BOOTSCREEN +. $incdir/base-cnc-config . $incdir/board-rambo . $incdir/dual-endstops diff --git a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step index 2ab719d0a3cf..8cc13a0d3c21 100755 --- a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step +++ b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step @@ -4,9 +4,10 @@ set -e incdir=$(dirname $0)/.. -use_example_configs CNC/MPCNC +restore_configs opt_enable SHOW_CUSTOM_BOOTSCREEN +. $incdir/base-cnc-config . $incdir/drv8825 . $incdir/avr-lcd-timings . $incdir/no-dual-endstops diff --git a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop index 7d2cc45718c5..84e46610ef49 100755 --- a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop +++ b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop @@ -4,9 +4,10 @@ set -e incdir=$(dirname $0)/.. -use_example_configs CNC/MPCNC +restore_configs opt_enable SHOW_CUSTOM_BOOTSCREEN +. $incdir/base-cnc-config . $incdir/drv8825 . $incdir/avr-lcd-timings . $incdir/dual-endstops diff --git a/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop index fd81aacbe115..4ba0e981032f 100755 --- a/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop +++ b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop @@ -4,14 +4,15 @@ set -e incdir=$(dirname $0)/.. -use_example_configs CNC/MPCNC +restore_configs opt_enable SHOW_CUSTOM_BOOTSCREEN -opt_set MOTHERBOARD BOARD_BIGTREE_SKR_V1_3 -opt_set SERIAL_PORT "-1" - +. $incdir/base-cnc-config . $incdir/drv8825 . $incdir/dual-endstops +opt_set MOTHERBOARD BOARD_BIGTREE_SKR_V1_3 +opt_set SERIAL_PORT "-1" + opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop index 45b9e57d8dd8..8719b5de6fb3 100755 --- a/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop +++ b/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop @@ -4,15 +4,16 @@ set -e incdir=$(dirname $0)/.. -use_example_configs CNC/MPCNC +restore_configs opt_enable SHOW_CUSTOM_BOOTSCREEN +. $incdir/base-cnc-config +. $incdir/drv8825 +. $incdir/dual-endstops + opt_set MOTHERBOARD BOARD_BIGTREE_SKR_PRO_V1_1 opt_set SERIAL_PORT "-1" opt_set EXTRUDERS "1" -. $incdir/drv8825 -. $incdir/dual-endstops - opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/patches/2.0.x b/v1-scripts/configs/patches/2.0.x index 498535b5f3d5..d912985671d1 100644 --- a/v1-scripts/configs/patches/2.0.x +++ b/v1-scripts/configs/patches/2.0.x @@ -2,4 +2,4 @@ # Changes to be applied on top of MarlinFirmware/Marlin/bugfix-2.0.x # PULL_REQUESTS="${PULL_REQUESTS:-}" -ADD_BRANCHES="${ADD_BRANCHES:-v1-base-config-2.0.x}" +ADD_BRANCHES="${ADD_BRANCHES:-}" diff --git a/v1-scripts/configs/patches/bugfix-2.0.x b/v1-scripts/configs/patches/bugfix-2.0.x index 104aad95785f..d912985671d1 100644 --- a/v1-scripts/configs/patches/bugfix-2.0.x +++ b/v1-scripts/configs/patches/bugfix-2.0.x @@ -2,4 +2,4 @@ # Changes to be applied on top of MarlinFirmware/Marlin/bugfix-2.0.x # PULL_REQUESTS="${PULL_REQUESTS:-}" -ADD_BRANCHES="${ADD_BRANCHES:-v1-base-config}" +ADD_BRANCHES="${ADD_BRANCHES:-}" diff --git a/v1-scripts/configs/patches/dev-2.1.x b/v1-scripts/configs/patches/dev-2.1.x index 46655e38ebb2..2c3773377066 100644 --- a/v1-scripts/configs/patches/dev-2.1.x +++ b/v1-scripts/configs/patches/dev-2.1.x @@ -2,4 +2,4 @@ # Changes to be applied on top of MarlinFirmware/Marlin/dev-2.1.x # PULL_REQUESTS="${PULL_REQUESTS:-}" -ADD_BRANCHES="${ADD_BRANCHES:-v1-base-config}" +ADD_BRANCHES="${ADD_BRANCHES:-}" From 68d904e52ab5f04d1753d484f5233aefcfaf75e3 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 19 Jan 2020 21:30:18 -0600 Subject: [PATCH 14/26] Correct stepper type for Archim2 board --- v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step b/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step index 14943d62593a..0370cb4e7939 100755 --- a/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step +++ b/v1-scripts/configs/MPCNC/Archim2_T8_16T_LCD_16step @@ -13,6 +13,16 @@ opt_enable SHOW_CUSTOM_BOOTSCREEN opt_set SERIAL_PORT "-1" opt_set MOTHERBOARD "BOARD_ARCHIM2" opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 100, 100, 400, 100 }" + +opt_set X_DRIVER_TYPE TMC2130 +opt_set Y_DRIVER_TYPE TMC2130 +opt_set Z_DRIVER_TYPE TMC2130 +opt_set X2_DRIVER_TYPE TMC2130 +opt_set Y2_DRIVER_TYPE TMC2130 +opt_set Z2_DRIVER_TYPE TMC2130 +opt_set E0_DRIVER_TYPE TMC2130 +opt_set E1_DRIVER_TYPE TMC2130 + opt_set SPI_SPEED "SPI_HALF_SPEED" opt_set MICROSTEP1 "LOW,LOW,LOW" opt_set MICROSTEP2 "HIGH,LOW,LOW" @@ -23,7 +33,8 @@ opt_set MICROSTEP32 "HIGH,LOW,HIGH" opt_set MICROSTEP_MODES "{ 16, 16, 16, 16, 16 }" opt_set PWM_MOTOR_CURRENT "{ 1200, 1200, 1200 }" opt_set MAXIMUM_STEPPER_RATE "400000" -opt_enable EEPROM_SETTINGS + +opt_enable EEPROM_SETTINGS TMC_USE_SW_SPI # Why? opt_set JUNCTION_DEVIATION_MM "0.005" From f95f99846bb7f9a5dfd9db5e8b118b38303d6d63 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 9 Feb 2020 20:34:17 -0600 Subject: [PATCH 15/26] Fix build error with latest upstream (build_marlin_pio script was removed) --- v1-scripts/build-for-machine | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v1-scripts/build-for-machine b/v1-scripts/build-for-machine index cc5f047daf5a..75f065b7aad3 100755 --- a/v1-scripts/build-for-machine +++ b/v1-scripts/build-for-machine @@ -15,4 +15,4 @@ cd "$V1_ROOT/$MARLINDIR" export PATH=$PATH:buildroot/bin use_example_configs $machine -build_marlin_pio . -e "$env" "$@" +platformio run --project-dir . -e "$env" --silent "$@" From 42ccd276b302ecdce03c86c6d4a1d8472c92f42a Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 9 Feb 2020 20:42:23 -0600 Subject: [PATCH 16/26] Delete upstream workflows on pull Github doesn't allow automated pushes when workflows are present. ! [remote rejected] HEAD -> v1-bugfix-2.0.x (refusing to allow a bot to create or update workflow `.github/workflows/test-builds.yml`) --- .github/workflows/v1-builds.yml | 2 ++ .github/workflows/v1-pull.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/v1-builds.yml b/.github/workflows/v1-builds.yml index 6a818f9c4518..5d69077c6ce6 100644 --- a/.github/workflows/v1-builds.yml +++ b/.github/workflows/v1-builds.yml @@ -64,6 +64,8 @@ jobs: if: github.event_name != 'pull_request' run: | cd MarlinFirmware + git rm .github/workflows/* + git commit -m 'Delete github workflows' git push origin "HEAD:refs/heads/$BUILD_BRANCH" --force build: diff --git a/.github/workflows/v1-pull.yml b/.github/workflows/v1-pull.yml index 6939bbfe84c4..4a413cb66af0 100644 --- a/.github/workflows/v1-pull.yml +++ b/.github/workflows/v1-pull.yml @@ -68,4 +68,6 @@ jobs: if: github.event_name != 'pull_request' run: | cd MarlinFirmware + git rm .github/workflows/* + git commit -m 'Delete github workflows' git push origin "HEAD:refs/heads/v1-$UPSTREAM_BRANCH" --force From bba1ac860f9cb9bf69c4ab3a72fa55e9eea54154 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 9 Feb 2020 21:22:24 -0600 Subject: [PATCH 17/26] Handle fallout from upstream's config repository split --- v1-scripts/build-for-machine | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/v1-scripts/build-for-machine b/v1-scripts/build-for-machine index 75f065b7aad3..0d52a932ae65 100755 --- a/v1-scripts/build-for-machine +++ b/v1-scripts/build-for-machine @@ -14,5 +14,10 @@ eval $($V1_ROOT/$CFGDIR/build-settings.py "$machine") cd "$V1_ROOT/$MARLINDIR" export PATH=$PATH:buildroot/bin -use_example_configs $machine +restore_configs + +for f in config/examples/$machine/{Configuration.h,Configuration_adv.h,_Bootscreen.h,_Statusscreen.h}; do + [ -f "$f" ] && cp "$f" Marlin/ +done + platformio run --project-dir . -e "$env" --silent "$@" From 8c744ccaa7c1bba97efa39458243a53cf74a6313 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 9 Feb 2020 20:53:54 -0600 Subject: [PATCH 18/26] Rename dual-endstops to dual-drivers-on-xy --- v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop | 2 +- v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop | 2 +- v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop | 2 +- v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop | 2 +- .../configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop | 2 +- v1-scripts/configs/{dual-endstops => dual-drivers-on-xy} | 0 6 files changed, 5 insertions(+), 5 deletions(-) rename v1-scripts/configs/{dual-endstops => dual-drivers-on-xy} (100%) diff --git a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop index 9560f57918d0..a4d37ec48d65 100755 --- a/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop +++ b/v1-scripts/configs/MPCNC/Archim1_T8_16T_LCD_DualEndstop @@ -9,7 +9,7 @@ opt_enable SHOW_CUSTOM_BOOTSCREEN . $incdir/base-cnc-config . $incdir/board-archim1 -. $incdir/dual-endstops +. $incdir/dual-drivers-on-xy . $incdir/drv8825 opt_set MINIMUM_STEPPER_PULSE "3" diff --git a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop index c9e1cf1a6c45..d8215d44e68f 100755 --- a/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop +++ b/v1-scripts/configs/MPCNC/Rambo_T8_16T_LCD_DualEndstop @@ -9,7 +9,7 @@ opt_enable SHOW_CUSTOM_BOOTSCREEN . $incdir/base-cnc-config . $incdir/board-rambo -. $incdir/dual-endstops +. $incdir/dual-drivers-on-xy opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop index 84e46610ef49..18f2c477d35e 100755 --- a/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop +++ b/v1-scripts/configs/MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop @@ -10,7 +10,7 @@ opt_enable SHOW_CUSTOM_BOOTSCREEN . $incdir/base-cnc-config . $incdir/drv8825 . $incdir/avr-lcd-timings -. $incdir/dual-endstops +. $incdir/dual-drivers-on-xy opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop index 4ba0e981032f..4ebccb037826 100755 --- a/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop +++ b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop @@ -9,7 +9,7 @@ opt_enable SHOW_CUSTOM_BOOTSCREEN . $incdir/base-cnc-config . $incdir/drv8825 -. $incdir/dual-endstops +. $incdir/dual-drivers-on-xy opt_set MOTHERBOARD BOARD_BIGTREE_SKR_V1_3 opt_set SERIAL_PORT "-1" diff --git a/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop index 8719b5de6fb3..601016d57dda 100755 --- a/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop +++ b/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop @@ -9,7 +9,7 @@ opt_enable SHOW_CUSTOM_BOOTSCREEN . $incdir/base-cnc-config . $incdir/drv8825 -. $incdir/dual-endstops +. $incdir/dual-drivers-on-xy opt_set MOTHERBOARD BOARD_BIGTREE_SKR_PRO_V1_1 opt_set SERIAL_PORT "-1" diff --git a/v1-scripts/configs/dual-endstops b/v1-scripts/configs/dual-drivers-on-xy similarity index 100% rename from v1-scripts/configs/dual-endstops rename to v1-scripts/configs/dual-drivers-on-xy From 790112de3493576bb59fd7a6ff3c7aae19c9f534 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 9 Feb 2020 21:37:14 -0600 Subject: [PATCH 19/26] Update BTT board names --- v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop | 2 +- .../configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop index 4ebccb037826..724c8df3c33f 100755 --- a/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop +++ b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop @@ -11,7 +11,7 @@ opt_enable SHOW_CUSTOM_BOOTSCREEN . $incdir/drv8825 . $incdir/dual-drivers-on-xy -opt_set MOTHERBOARD BOARD_BIGTREE_SKR_V1_3 +opt_set MOTHERBOARD BOARD_BTT_SKR_V1_3 opt_set SERIAL_PORT "-1" opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" diff --git a/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop b/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop index 601016d57dda..25cb651b75d0 100755 --- a/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop +++ b/v1-scripts/configs/MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop @@ -11,7 +11,7 @@ opt_enable SHOW_CUSTOM_BOOTSCREEN . $incdir/drv8825 . $incdir/dual-drivers-on-xy -opt_set MOTHERBOARD BOARD_BIGTREE_SKR_PRO_V1_1 +opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 opt_set SERIAL_PORT "-1" opt_set EXTRUDERS "1" From ef749ac8864e3bf2c0781af4f2e7f401614b8d09 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 9 Feb 2020 20:55:32 -0600 Subject: [PATCH 20/26] Added single-axis config for SKR1.3 --- .github/workflows/v1-builds.yml | 1 + .../configs/MPCNC/SKR1.3_T8_16T_LCD_32step | 18 ++++++++++++++++++ v1-scripts/configs/build-settings.py | 1 + 3 files changed, 20 insertions(+) create mode 100755 v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step diff --git a/.github/workflows/v1-builds.yml b/.github/workflows/v1-builds.yml index 5d69077c6ce6..c5a15f71f045 100644 --- a/.github/workflows/v1-builds.yml +++ b/.github/workflows/v1-builds.yml @@ -91,6 +91,7 @@ jobs: - MPCNC/Rambo_T8_16T_LCD_DualEndstop - MPCNC/Ramps_T8_16T_LCD_32step - MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop + - MPCNC/SKR1.3_T8_16T_LCD_32step - MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop - MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop - ZenXY/MiniRambo_16T diff --git a/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step new file mode 100755 index 000000000000..59f586a4a15d --- /dev/null +++ b/v1-scripts/configs/MPCNC/SKR1.3_T8_16T_LCD_32step @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e + +incdir=$(dirname $0)/.. + +restore_configs +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/base-cnc-config +. $incdir/drv8825 +. $incdir/no-dual-endstops + +opt_set MOTHERBOARD BOARD_BTT_SKR_V1_3 +opt_set SERIAL_PORT "-1" + +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" +opt_enable REVERSE_ENCODER_DIRECTION diff --git a/v1-scripts/configs/build-settings.py b/v1-scripts/configs/build-settings.py index 23b2b458f833..dc6cc15a0db4 100755 --- a/v1-scripts/configs/build-settings.py +++ b/v1-scripts/configs/build-settings.py @@ -13,6 +13,7 @@ 'MPCNC/MRambo_T8_16T_LCD': { 'env': 'rambo', 'out': 'firmware.hex' }, 'MP3DP/Ramps_16T_MK': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, 'MP3DP/MRambo_16T_aero': { 'env': 'rambo', 'out': 'firmware.hex' }, + 'MPCNC/SKR1.3_T8_16T_LCD_32step': { 'env': 'LPC1768', 'out': 'firmware.bin' }, 'MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop': { 'env': 'LPC1768', 'out': 'firmware.bin' }, 'MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop': { 'env': 'BIGTREE_SKR_PRO', 'out': 'firmware.bin' }, 'ZenXY/Ramps_16T_LCD_32': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, From 0badd3a92448d3d446ab40a309c746ef7c3b82c5 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Sun, 16 Feb 2020 14:54:50 -0800 Subject: [PATCH 21/26] Added SKR1.3 configuration for Lowrider dual driver setup --- .github/workflows/v1-builds.yml | 1 + .../SKR1.3_T8_16T_LCD_32step_DualDrivers | 22 +++++++++++++++++++ v1-scripts/configs/build-settings.py | 1 + v1-scripts/configs/dual-drivers-on-yz | 8 +++++++ v1-scripts/generate-configs | 2 +- 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100755 v1-scripts/configs/Lowrider/SKR1.3_T8_16T_LCD_32step_DualDrivers create mode 100755 v1-scripts/configs/dual-drivers-on-yz diff --git a/.github/workflows/v1-builds.yml b/.github/workflows/v1-builds.yml index c5a15f71f045..bdd4fcace541 100644 --- a/.github/workflows/v1-builds.yml +++ b/.github/workflows/v1-builds.yml @@ -96,6 +96,7 @@ jobs: - MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop - ZenXY/MiniRambo_16T - ZenXY/Ramps_16T_LCD_32 + - Lowrider/SKR1.3_T8_16T_LCD_32step_DualDrivers steps: - uses: actions/checkout@v2 diff --git a/v1-scripts/configs/Lowrider/SKR1.3_T8_16T_LCD_32step_DualDrivers b/v1-scripts/configs/Lowrider/SKR1.3_T8_16T_LCD_32step_DualDrivers new file mode 100755 index 000000000000..73f08126b0b3 --- /dev/null +++ b/v1-scripts/configs/Lowrider/SKR1.3_T8_16T_LCD_32step_DualDrivers @@ -0,0 +1,22 @@ +#!/bin/bash + +set -e + +incdir=$(dirname $0)/.. + +restore_configs +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/base-cnc-config +. $incdir/drv8825 +. $incdir/dual-drivers-on-yz + +opt_set MOTHERBOARD BOARD_BTT_SKR_V1_3 +opt_set SERIAL_PORT "-1" + +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" +opt_enable REVERSE_ENCODER_DIRECTION +opt_enable MIN_SOFTWARE_ENDSTOP_Z + +# Lowrider gantry will drop for sure if Z is powered off +opt_set DISABLE_INACTIVE_Z "false" diff --git a/v1-scripts/configs/build-settings.py b/v1-scripts/configs/build-settings.py index dc6cc15a0db4..d56b100bfb5a 100755 --- a/v1-scripts/configs/build-settings.py +++ b/v1-scripts/configs/build-settings.py @@ -3,6 +3,7 @@ # Bash 4.0 has associative arrays, but if it's available everywhere so Python it is MACHINES = { + 'Lowrider/SKR1.3_T8_16T_LCD_32step_DualDrivers': { 'env': 'LPC1768', 'out': 'firmware.bin' }, 'MPCNC/Archim1_T8_16T_LCD': { 'env': 'DUE', 'out': 'firmware.bin' }, 'MPCNC/Archim1_T8_16T_LCD_DualEndstop': { 'env': 'DUE', 'out': 'firmware.bin' }, 'MPCNC/Archim2_T8_16T_LCD_16step': { 'env': 'DUE', 'out': 'firmware.bin' }, diff --git a/v1-scripts/configs/dual-drivers-on-yz b/v1-scripts/configs/dual-drivers-on-yz new file mode 100755 index 000000000000..8650e59e3fe3 --- /dev/null +++ b/v1-scripts/configs/dual-drivers-on-yz @@ -0,0 +1,8 @@ +opt_set X_MIN_ENDSTOP_INVERTING "false" +opt_set Y_MIN_ENDSTOP_INVERTING "false" +opt_set X_MAX_ENDSTOP_INVERTING "false" +opt_set Y_MAX_ENDSTOP_INVERTING "false" + +opt_set NUM_Z_STEPPER_DRIVERS "2" +opt_enable MIN_SOFTWARE_ENDSTOPS SOFT_ENDSTOPS_MENU_ITEM USE_XMAX_PLUG USE_YMAX_PLUG \ + Y_DUAL_STEPPER_DRIVERS Y_DUAL_ENDSTOPS Z_MULTI_ENDSTOPS diff --git a/v1-scripts/generate-configs b/v1-scripts/generate-configs index 1c77dae067b8..9ce72f0eecd7 100755 --- a/v1-scripts/generate-configs +++ b/v1-scripts/generate-configs @@ -12,7 +12,7 @@ cd "$V1_ROOT/$MARLINDIR" PATH=$PATH:buildroot/bin export PATH -for script in "$CONFIG_DIR"/{MPCNC,MP3DP,ZenXY}/*; do +for script in "$CONFIG_DIR"/{MPCNC,MP3DP,ZenXY,Lowrider}/*; do machine=${script#$CONFIG_DIR/} cfgdir=$MARLIN_CONFIG_DIR/$machine From 8937e6dd53f9b29da5b4d2d1e6ed2adf7db32896 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Mon, 25 May 2020 11:30:56 -0500 Subject: [PATCH 22/26] Rename megaatmega2560 to mega2560 to accomodate upstream changes --- v1-scripts/configs/build-settings.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/v1-scripts/configs/build-settings.py b/v1-scripts/configs/build-settings.py index d56b100bfb5a..305f1b1897fc 100755 --- a/v1-scripts/configs/build-settings.py +++ b/v1-scripts/configs/build-settings.py @@ -9,15 +9,15 @@ 'MPCNC/Archim2_T8_16T_LCD_16step': { 'env': 'DUE', 'out': 'firmware.bin' }, 'MPCNC/Rambo_T8_16T_LCD': { 'env': 'rambo', 'out': 'firmware.hex' }, 'MPCNC/Rambo_T8_16T_LCD_DualEndstop': { 'env': 'rambo', 'out': 'firmware.hex' }, - 'MPCNC/Ramps_T8_16T_LCD_32step': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, - 'MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MPCNC/Ramps_T8_16T_LCD_32step': { 'env': 'mega2560', 'out': 'firmware.hex' }, + 'MPCNC/Ramps_T8_16T_LCD_32step_DualEndstop': { 'env': 'mega2560', 'out': 'firmware.hex' }, 'MPCNC/MRambo_T8_16T_LCD': { 'env': 'rambo', 'out': 'firmware.hex' }, - 'MP3DP/Ramps_16T_MK': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'MP3DP/Ramps_16T_MK': { 'env': 'mega2560', 'out': 'firmware.hex' }, 'MP3DP/MRambo_16T_aero': { 'env': 'rambo', 'out': 'firmware.hex' }, 'MPCNC/SKR1.3_T8_16T_LCD_32step': { 'env': 'LPC1768', 'out': 'firmware.bin' }, 'MPCNC/SKR1.3_T8_16T_LCD_32step_DualEndstop': { 'env': 'LPC1768', 'out': 'firmware.bin' }, 'MPCNC/SKRPro1.1_T8_16T_LCD_32step_DualEndstop': { 'env': 'BIGTREE_SKR_PRO', 'out': 'firmware.bin' }, - 'ZenXY/Ramps_16T_LCD_32': { 'env': 'megaatmega2560', 'out': 'firmware.hex' }, + 'ZenXY/Ramps_16T_LCD_32': { 'env': 'mega2560', 'out': 'firmware.hex' }, 'ZenXY/MiniRambo_16T': { 'env': 'rambo', 'out': 'firmware.hex' } } From 99b7df69fa3fc1064e2e360e2a6f0c7e5772416d Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Fri, 22 May 2020 21:00:48 -0500 Subject: [PATCH 23/26] Add TMC2209 support and sensorless config for SKR1.3 lowrider --- .../SKR1.3_T8_16T_LCD_32step_Sensorless | 46 +++++++++++++++++++ v1-scripts/configs/build-settings.py | 1 + v1-scripts/configs/tmc2209 | 39 ++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100755 v1-scripts/configs/Lowrider/SKR1.3_T8_16T_LCD_32step_Sensorless create mode 100644 v1-scripts/configs/tmc2209 diff --git a/v1-scripts/configs/Lowrider/SKR1.3_T8_16T_LCD_32step_Sensorless b/v1-scripts/configs/Lowrider/SKR1.3_T8_16T_LCD_32step_Sensorless new file mode 100755 index 000000000000..dab7e5ca0ef7 --- /dev/null +++ b/v1-scripts/configs/Lowrider/SKR1.3_T8_16T_LCD_32step_Sensorless @@ -0,0 +1,46 @@ +#!/bin/bash + +set -e + +incdir=$(dirname $0)/.. + +restore_configs +opt_enable SHOW_CUSTOM_BOOTSCREEN + +. $incdir/base-cnc-config +. $incdir/tmc2209 +. $incdir/dual-drivers-on-yz + +# For some weird reason TMC2209 directions are reversed on SKR1.3 boards +opt_set INVERT_X_DIR true +opt_set INVERT_Y_DIR false +opt_set INVERT_Z_DIR true + +opt_set MOTHERBOARD BOARD_BTT_SKR_V1_3 +opt_set SERIAL_PORT "-1" + +opt_set DEFAULT_AXIS_STEPS_PER_UNIT "{ 200, 200, 800, 200 }" +opt_enable REVERSE_ENCODER_DIRECTION +opt_enable MIN_SOFTWARE_ENDSTOP_Z + +# Lowrider gantry will drop for sure if Z is powered off +opt_set DISABLE_INACTIVE_Z "false" + +opt_set SENSORLESS_HOMING +#opt_set X_HOME_BUMP_MM "0" +#opt_set Y_HOME_BUMP_MM "0" +opt_set Z_HOME_BUMP_MM "0" +opt_set Z_MIN_ENDSTOP_INVERTING "false" +opt_enable IMPROVE_HOMING_RELIABILITY INDIVIDUAL_AXIS_HOMING_MENU + +# SKR 1.3 specific +opt_set Y2_USE_ENDSTOP "_XMAX_" +opt_set Z2_USE_ENDSTOP "_YMAX_" + +# Lowrider specific +opt_set Z_HOMING_HEIGHT "0" +opt_set HOMING_BACKOFF_MM "{ 20, 10, 1 }" +opt_set Z_MIN_POS "-1" +opt_set Z_MAX_POS "180" +opt_set X_BED_SIZE 1275 +opt_set Y_BED_SIZE 2540 diff --git a/v1-scripts/configs/build-settings.py b/v1-scripts/configs/build-settings.py index 305f1b1897fc..718af41528a4 100755 --- a/v1-scripts/configs/build-settings.py +++ b/v1-scripts/configs/build-settings.py @@ -4,6 +4,7 @@ MACHINES = { 'Lowrider/SKR1.3_T8_16T_LCD_32step_DualDrivers': { 'env': 'LPC1768', 'out': 'firmware.bin' }, + 'Lowrider/SKR1.3_T8_16T_LCD_32step_Sensorless': { 'env': 'LPC1768', 'out': 'firmware.bin' }, 'MPCNC/Archim1_T8_16T_LCD': { 'env': 'DUE', 'out': 'firmware.bin' }, 'MPCNC/Archim1_T8_16T_LCD_DualEndstop': { 'env': 'DUE', 'out': 'firmware.bin' }, 'MPCNC/Archim2_T8_16T_LCD_16step': { 'env': 'DUE', 'out': 'firmware.bin' }, diff --git a/v1-scripts/configs/tmc2209 b/v1-scripts/configs/tmc2209 new file mode 100644 index 000000000000..ef54b7aa3138 --- /dev/null +++ b/v1-scripts/configs/tmc2209 @@ -0,0 +1,39 @@ +opt_set X_DRIVER_TYPE "TMC2209" +opt_set Y_DRIVER_TYPE "TMC2209" +opt_set Z_DRIVER_TYPE "TMC2209" +opt_set X2_DRIVER_TYPE "TMC2209" +opt_set Y2_DRIVER_TYPE "TMC2209" +opt_set Z2_DRIVER_TYPE "TMC2209" +opt_set Z3_DRIVER_TYPE "TMC2209" +opt_set E0_DRIVER_TYPE "TMC2209" +opt_set E1_DRIVER_TYPE "TMC2209" +opt_set E2_DRIVER_TYPE "TMC2209" +opt_set E3_DRIVER_TYPE "TMC2209" +opt_set E4_DRIVER_TYPE "TMC2209" +opt_set E5_DRIVER_TYPE "TMC2209" +opt_disable Z3_DRIVER_TYPE E2_DRIVER_TYPE E3_DRIVER_TYPE E4_DRIVER_TYPE E5_DRIVER_TYPE + +opt_enable MONITOR_DRIVER_STATUS +opt_disable STEALTHCHOP_XY STEALTHCHOP_Z + +# TMC2209 sensitivity setting is 255..0, 0 being the most insentive +opt_set X_STALL_SENSITIVITY "27" +opt_set Y_STALL_SENSITIVITY "27" +opt_set Z_STALL_SENSITIVITY "40" + +opt_set X_CURRENT "1700" +opt_set Y_CURRENT "1700" +opt_set Z_CURRENT "1700" +opt_set X2_CURRENT "1700" +opt_set Y2_CURRENT "1700" +opt_set Z2_CURRENT "1700" + +# Increase hold current to 70% +opt_set HOLD_MULTIPLIER 0.7 + +opt_set X_MICROSTEPS "32" +opt_set Y_MICROSTEPS "32" +opt_set Z_MICROSTEPS "32" +opt_set X2_MICROSTEPS "32" +opt_set Y2_MICROSTEPS "32" +opt_set Z2_MICROSTEPS "32" From a2c5fed25da8ea9ff2ffe7dab386ed75b81e0a20 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Mon, 25 May 2020 11:34:04 -0500 Subject: [PATCH 24/26] Add support for TMC5160 drivers --- v1-scripts/configs/tmc-settings | 21 +++++++++++++++++++++ v1-scripts/configs/tmc2209 | 22 ++-------------------- v1-scripts/configs/tmc5160 | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 20 deletions(-) create mode 100644 v1-scripts/configs/tmc-settings create mode 100644 v1-scripts/configs/tmc5160 diff --git a/v1-scripts/configs/tmc-settings b/v1-scripts/configs/tmc-settings new file mode 100644 index 000000000000..95a068fbe9e5 --- /dev/null +++ b/v1-scripts/configs/tmc-settings @@ -0,0 +1,21 @@ +opt_enable MONITOR_DRIVER_STATUS +opt_disable STEALTHCHOP_XY STEALTHCHOP_Z + +opt_set X_CURRENT "1700" +opt_set Y_CURRENT "1700" +opt_set Z_CURRENT "1700" +opt_set X2_CURRENT "1700" +opt_set Y2_CURRENT "1700" +opt_set Z2_CURRENT "1700" + +# Increase hold current to 70% +opt_set HOLD_MULTIPLIER 0.7 + +opt_set X_MICROSTEPS "32" +opt_set Y_MICROSTEPS "32" +opt_set Z_MICROSTEPS "32" +opt_set X2_MICROSTEPS "32" +opt_set Y2_MICROSTEPS "32" +opt_set Z2_MICROSTEPS "32" + +# opt_set CHOPPER_TIMING CHOPPER_DEFAULT_12V diff --git a/v1-scripts/configs/tmc2209 b/v1-scripts/configs/tmc2209 index ef54b7aa3138..90075e8de1bd 100644 --- a/v1-scripts/configs/tmc2209 +++ b/v1-scripts/configs/tmc2209 @@ -1,3 +1,5 @@ +. $incdir/tmc-settings + opt_set X_DRIVER_TYPE "TMC2209" opt_set Y_DRIVER_TYPE "TMC2209" opt_set Z_DRIVER_TYPE "TMC2209" @@ -13,27 +15,7 @@ opt_set E4_DRIVER_TYPE "TMC2209" opt_set E5_DRIVER_TYPE "TMC2209" opt_disable Z3_DRIVER_TYPE E2_DRIVER_TYPE E3_DRIVER_TYPE E4_DRIVER_TYPE E5_DRIVER_TYPE -opt_enable MONITOR_DRIVER_STATUS -opt_disable STEALTHCHOP_XY STEALTHCHOP_Z - # TMC2209 sensitivity setting is 255..0, 0 being the most insentive opt_set X_STALL_SENSITIVITY "27" opt_set Y_STALL_SENSITIVITY "27" opt_set Z_STALL_SENSITIVITY "40" - -opt_set X_CURRENT "1700" -opt_set Y_CURRENT "1700" -opt_set Z_CURRENT "1700" -opt_set X2_CURRENT "1700" -opt_set Y2_CURRENT "1700" -opt_set Z2_CURRENT "1700" - -# Increase hold current to 70% -opt_set HOLD_MULTIPLIER 0.7 - -opt_set X_MICROSTEPS "32" -opt_set Y_MICROSTEPS "32" -opt_set Z_MICROSTEPS "32" -opt_set X2_MICROSTEPS "32" -opt_set Y2_MICROSTEPS "32" -opt_set Z2_MICROSTEPS "32" diff --git a/v1-scripts/configs/tmc5160 b/v1-scripts/configs/tmc5160 new file mode 100644 index 000000000000..e87c80397987 --- /dev/null +++ b/v1-scripts/configs/tmc5160 @@ -0,0 +1,32 @@ +. $incdir/tmc-settings + +opt_set X_DRIVER_TYPE "TMC5160" +opt_set Y_DRIVER_TYPE "TMC5160" +opt_set Z_DRIVER_TYPE "TMC5160" +opt_set X2_DRIVER_TYPE "TMC5160" +opt_set Y2_DRIVER_TYPE "TMC5160" +opt_set Z2_DRIVER_TYPE "TMC5160" +opt_set Z3_DRIVER_TYPE "TMC5160" +opt_set E0_DRIVER_TYPE "TMC5160" +opt_set E1_DRIVER_TYPE "TMC5160" +opt_set E2_DRIVER_TYPE "TMC5160" +opt_set E3_DRIVER_TYPE "TMC5160" +opt_set E4_DRIVER_TYPE "TMC5160" +opt_set E5_DRIVER_TYPE "TMC5160" +opt_disable Z3_DRIVER_TYPE E2_DRIVER_TYPE E3_DRIVER_TYPE E4_DRIVER_TYPE E5_DRIVER_TYPE + +opt_enable TMC_USE_SW_SPI + +opt_set X_RSENSE 0.075 +opt_set Y_RSENSE 0.075 +opt_set Z_RSENSE 0.075 +opt_set X2_RSENSE 0.075 +opt_set Y2_RSENSE 0.075 +opt_set Z2_RSENSE 0.075 +opt_set Z3_RSENSE 0.075 +opt_set E0_RSENSE 0.075 +opt_set E1_RSENSE 0.075 +opt_set E2_RSENSE 0.075 +opt_set E3_RSENSE 0.075 +opt_set E4_RSENSE 0.075 +opt_set E5_RSENSE 0.075 From 1ece46cc2439fbb29081adfb2cb116a0dd97d4e7 Mon Sep 17 00:00:00 2001 From: Antti Andreimann Date: Thu, 30 Jul 2020 22:06:52 -0500 Subject: [PATCH 25/26] Publish an STL for Lowrider2 sensorless Z- homing --- Lowrider2_Z_Hard_Stop_Spacer.stl | Bin 0 -> 46784 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Lowrider2_Z_Hard_Stop_Spacer.stl diff --git a/Lowrider2_Z_Hard_Stop_Spacer.stl b/Lowrider2_Z_Hard_Stop_Spacer.stl new file mode 100644 index 0000000000000000000000000000000000000000..f4e637fea1b203688ac556ff83c7e086dc423468 GIT binary patch literal 46784 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 Date: Sat, 22 Aug 2020 02:09:42 -0500 Subject: [PATCH 26/26] Publish Coupling saver STL --- Lowrider2_Coupling_Saver_D19L25.stl | Bin 0 -> 166484 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Lowrider2_Coupling_Saver_D19L25.stl diff --git a/Lowrider2_Coupling_Saver_D19L25.stl b/Lowrider2_Coupling_Saver_D19L25.stl new file mode 100644 index 0000000000000000000000000000000000000000..22d51282320bf4d2835cd7204bb1df8d8947cd8f GIT binary patch literal 166484 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%0D({J8UrHxIEjvy&w3nFgSG4ww8_ zK71!-?N@a6y46dyUl9pv(T^_s6|K~MMU;@xu0*ooyHskwqRsBPXsPxqB0(+s(Y{~N zOAhuZRS-=z05oMc15o=1T2XLbLgoJh_k`3SeRQna3ea^C_+OLQNwdi@5{fbs4_?2!_A4SmE&9>EU(pe_ zU%x{86;VP$yAsKU?_aC^iaz)DlXusCMI@+2Kf3H!v_kt8Q9?qy63K?|S*-nv_SofL zp053hNKlKOg^#rtTyVi9X@u@5A;CGk6KTI9BPb!EJ%*~Q(tbsDRV1jzIlSHZvb0l^ z-8m&Bw8v2ObmzW&l0RJ%)Z&cX-r!ukK}twyk0IG8tz_<<@AXzff?AxBTT7gamPiQ+ z?J*=9rL}9nB5Um=sKq(F{i5d54q*0+qJ)I@7?O?htDSqryZl#6f?D(dtY?@@JDFL} zKnV%$F(ezM_vz04Z|{9bP>X(o^>AJEaFmeH9z(KGdeQE^xfdltEqWH#Q+Lr*Q$k`l zc`V6B84a{wk&Ollmw z;j{3xyJL6WV}83d_I%MyU)~nAYCkINW!lL%&|apL42bL}_zp*DFH@Vh8<8a>v@4OW zs?6K9!;#I~Nl;5W-&FJVF70J%^L9!|XjdZH@OgXM%d|^-neL&zOi55nJNQ)d_Ac#Z zYV&qVNN86g*(me&?xZ|#CqXUkF;valyR?_7&D$v%5XnZFw|A3y`{Z0kXRWYZ=IveD z%hcxWl#tM_M7obMZ|~AxrZ#UUL9KX(W!~PUy-aQ1P6-L^N+cU)-mV>vY~D_ST9dYr z=k3-KwZjo510vb*dAr)JMrQq=GkQjK=>Zhq*$7HVFg`q+pcXxunxKRP{i~XwgaqT< zvk7X^Ppk<_NHAVMo1hl`T_@5ijy+vUNHFi9wn2hg^xJEK5)#axm`zZN>ksvPP(p%v zAhQW-(KoEGiV_m^^lE|<63l>^O;C%TUQJL!f|)$C32HIF$cbnrlrYnYwrATQ!Cb7_ z1htqUR$mn*%vJmIu8IV+>1JOQwdfVs1SKTs