0
0
Fork 0
mirror of https://github.com/MarlinFirmware/Marlin.git synced 2025-03-23 06:36:34 +00:00

Merge branch 'bugfix-2.1.x' into pr/26662

This commit is contained in:
Scott Lahteine 2024-07-29 13:51:33 -05:00
commit a1dd48a67b
123 changed files with 840 additions and 475 deletions

View file

@ -43,6 +43,7 @@ jobs:
# Native # Native
- linux_native - linux_native
- simulator_linux_release
# AVR # AVR
- mega2560 - mega2560
@ -105,9 +106,9 @@ jobs:
# STM32F4 # STM32F4
- ARMED - ARMED
- BIGTREE_BTT002 - BTT_BTT002
- BIGTREE_GTR_V1_0 - BTT_GTR_V1_0
- BIGTREE_SKR_PRO - BTT_SKR_PRO
- FLYF407ZG - FLYF407ZG
- FYSETC_S6 - FYSETC_S6
- LERDGEK - LERDGEK
@ -182,6 +183,13 @@ jobs:
pio upgrade --dev pio upgrade --dev
pio pkg update --global pio pkg update --global
- name: Install Simulator dependencies
run: |
sudo apt-get install build-essential
sudo apt-get install libsdl2-dev
sudo apt-get install libsdl2-net-dev
sudo apt-get install libglm-dev
- name: Run ${{ matrix.test-platform }} Tests - name: Run ${{ matrix.test-platform }} Tests
run: | run: |
make tests-single-ci TEST_TARGET=${{ matrix.test-platform }} make tests-single-ci TEST_TARGET=${{ matrix.test-platform }}

View file

@ -50,7 +50,7 @@
* *
* Calibration Guides: https://reprap.org/wiki/Calibration * Calibration Guides: https://reprap.org/wiki/Calibration
* https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide * https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide
* https://web.archive.org/web/20220907014303/https://sites.google.com/site/repraplogphase/calibration-of-your-reprap * https://web.archive.org/web/20220907014303/sites.google.com/site/repraplogphase/calibration-of-your-reprap
* https://youtu.be/wAL9d7FgInk * https://youtu.be/wAL9d7FgInk
* https://teachingtechyt.github.io/calibration.html * https://teachingtechyt.github.io/calibration.html
* *
@ -1723,6 +1723,8 @@
#define PROBING_BED_TEMP 50 #define PROBING_BED_TEMP 50
#endif #endif
// @section stepper drivers
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
// :{ 0:'Low', 1:'High' } // :{ 0:'Low', 1:'High' }
#define X_ENABLE_ON 0 #define X_ENABLE_ON 0
@ -1896,6 +1898,8 @@
#endif #endif
/** /**
* @section filament runout sensors
*
* Filament Runout Sensors * Filament Runout Sensors
* Mechanical or opto endstops are used to check for the presence of filament. * Mechanical or opto endstops are used to check for the presence of filament.
* *
@ -2418,9 +2422,9 @@
#define PREHEAT_2_TEMP_CHAMBER 35 #define PREHEAT_2_TEMP_CHAMBER 35
#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 #define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255
// @section motion
/** /**
* @section nozzle park
*
* Nozzle Park * Nozzle Park
* *
* Park the nozzle at the given XYZ position on idle or G27. * Park the nozzle at the given XYZ position on idle or G27.
@ -2443,6 +2447,8 @@
#endif #endif
/** /**
* @section nozzle clean
*
* Clean Nozzle Feature * Clean Nozzle Feature
* *
* Adds the G12 command to perform a nozzle cleaning process. * Adds the G12 command to perform a nozzle cleaning process.
@ -2603,9 +2609,24 @@
//#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE //#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE
#endif #endif
//============================================================================= // @section media
//============================= LCD and SD support ============================
//============================================================================= /**
* SD CARD
*
* SD Card support is disabled by default. If your controller has an SD slot,
* you must uncomment the following option or it won't work.
*/
//#define SDSUPPORT
/**
* SD CARD: ENABLE CRC
*
* Use CRC checks and retries on the SD communication.
*/
#if ENABLED(SDSUPPORT)
//#define SD_CHECK_AND_RETRY
#endif
// @section interface // @section interface
@ -2652,21 +2673,6 @@
*/ */
#define LCD_INFO_SCREEN_STYLE 0 #define LCD_INFO_SCREEN_STYLE 0
/**
* SD CARD
*
* SD Card support is disabled by default. If your controller has an SD slot,
* you must uncomment the following option or it won't work.
*/
//#define SDSUPPORT
/**
* SD CARD: ENABLE CRC
*
* Use CRC checks and retries on the SD communication.
*/
//#define SD_CHECK_AND_RETRY
/** /**
* LCD Menu Items * LCD Menu Items
* *
@ -2795,7 +2801,7 @@
// //
// Original RADDS LCD Display+Encoder+SDCardReader // Original RADDS LCD Display+Encoder+SDCardReader
// https://web.archive.org/web/20200719145306/http://doku.radds.org/dokumentation/lcd-display/ // https://web.archive.org/web/20200719145306/doku.radds.org/dokumentation/lcd-display/
// //
//#define RADDS_DISPLAY //#define RADDS_DISPLAY
@ -2861,7 +2867,7 @@
// //
// Elefu RA Board Control Panel // Elefu RA Board Control Panel
// https://web.archive.org/web/20140823033947/http://www.elefu.com/index.php?route=product/product&product_id=53 // https://web.archive.org/web/20140823033947/www.elefu.com/index.php?route=product/product&product_id=53
// //
//#define RA_CONTROL_PANEL //#define RA_CONTROL_PANEL
@ -2993,7 +2999,7 @@
// //
// Cartesio UI // Cartesio UI
// https://web.archive.org/web/20180605050442/http://mauk.cc/webshop/cartesio-shop/electronics/user-interface // https://web.archive.org/web/20180605050442/mauk.cc/webshop/cartesio-shop/electronics/user-interface
// //
//#define CARTESIO_UI //#define CARTESIO_UI

View file

@ -3443,7 +3443,7 @@
/** /**
* Step on both rising and falling edge signals (as with a square wave). * Step on both rising and falling edge signals (as with a square wave).
*/ */
//#define EDGE_STEPPING #define EDGE_STEPPING
/** /**
* Enable M122 debugging command for TMC stepper drivers. * Enable M122 debugging command for TMC stepper drivers.
@ -3525,7 +3525,7 @@
//#define PHOTOGRAPH_PIN 23 //#define PHOTOGRAPH_PIN 23
// Canon Hack Development Kit // Canon Hack Development Kit
// https://web.archive.org/web/20200920094805/https://captain-slow.dk/2014/03/09/3d-printing-timelapses/ // https://web.archive.org/web/20200920094805/captain-slow.dk/2014/03/09/3d-printing-timelapses/
//#define CHDK_PIN 4 //#define CHDK_PIN 4
// Optional second move with delay to trigger the camera shutter // Optional second move with delay to trigger the camera shutter

View file

@ -41,7 +41,7 @@
* here we define this default string as the date where the latest release * here we define this default string as the date where the latest release
* version was tagged. * version was tagged.
*/ */
//#define STRING_DISTRIBUTION_DATE "2024-07-16" //#define STRING_DISTRIBUTION_DATE "2024-07-29"
/** /**
* Defines a generic printer name to be output to the LCD after booting Marlin. * Defines a generic printer name to be output to the LCD after booting Marlin.

View file

@ -26,7 +26,7 @@
* *
* Logical Pin: 28 29 30 31 32 33 34 35 20 21 22 23 24 25 26 27 10 11 12 13 14 15 16 17 00 01 02 03 04 05 06 07 08 09(46*47)36 37 18 19 38 39 40 41 42 43 44 45 * Logical Pin: 28 29 30 31 32 33 34 35 20 21 22 23 24 25 26 27 10 11 12 13 14 15 16 17 00 01 02 03 04 05 06 07 08 09(46*47)36 37 18 19 38 39 40 41 42 43 44 45
* Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 * Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7
* The logical pins 46 and 47 are not supported by Teensyduino, but are supported below as E2 and E3 * Logical pins 46-47 aren't supported by Teensyduino, but are supported below as E2 and E3
*/ */
#include "../fastio.h" #include "../fastio.h"

View file

@ -117,19 +117,16 @@
#define analogInputToDigitalPin(p) pin_t(p) #define analogInputToDigitalPin(p) pin_t(p)
#endif #endif
#define CRITICAL_SECTION_START \ #define CRITICAL_SECTION_START() \
uint32_t primask = __get_PRIMASK(); \ const bool irqon = !__get_PRIMASK(); \
(void)__iCliRetVal() __disable_irq(); \
__DSB();
#define CRITICAL_SECTION_END() \
__DSB(); \
if (irqon) __enable_irq();
#define CRITICAL_SECTION_END \ #define cli() __disable_irq()
if (!primask) \ #define sei() __enable_irq()
(void)__iSeiRetVal()
// Disable interrupts
#define cli() noInterrupts()
// Enable interrupts
#define sei() interrupts()
// bss_end alias // bss_end alias
#define __bss_end __bss_end__ #define __bss_end __bss_end__

View file

@ -81,4 +81,4 @@ void eeprom_write_byte(uint8_t *pos, uint8_t value) {
} }
#endif // USE_SHARED_EEPROM #endif // USE_SHARED_EEPROM
#endif // I2C_EEPROM #endif // SPI_EEPROM

View file

@ -162,8 +162,8 @@
#define STR_SOFT_MIN " Min: " #define STR_SOFT_MIN " Min: "
#define STR_SOFT_MAX " Max: " #define STR_SOFT_MAX " Max: "
#define STR_SAVED_POS "Position saved" #define STR_SAVED_POSITION "Saved position #"
#define STR_RESTORING_POS "Restoring position" #define STR_RESTORING_POSITION "Restoring position #"
#define STR_INVALID_POS_SLOT "Invalid slot. Total: " #define STR_INVALID_POS_SLOT "Invalid slot. Total: "
#define STR_DONE "Done." #define STR_DONE "Done."

View file

@ -64,7 +64,7 @@
// Macros for bit masks // Macros for bit masks
#undef _BV #undef _BV
#define _BV(n) (1<<(n)) #define _BV(b) (1 << (b))
#define TEST(n,b) (!!((n)&_BV(b))) #define TEST(n,b) (!!((n)&_BV(b)))
#define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0) #define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0)
#ifndef SBI #ifndef SBI

View file

@ -159,36 +159,90 @@ template <class L, class R> struct IF<true, L, R> { typedef L type; };
#define FI FORCE_INLINE #define FI FORCE_INLINE
// Define types based on largest bit width stored value required // Define types based on largest bit width stored value required
#define bits_t(W) typename IF<((W)> 16), uint32_t, typename IF<((W)> 8), uint16_t, uint8_t>::type>::type #define bits_t(W) typename IF<((W)> 32), uint64_t, typename IF<((W)> 16), uint32_t, typename IF<((W)>8), uint16_t, uint8_t>::type>::type>::type
#define uvalue_t(V) typename IF<((V)>65535), uint32_t, typename IF<((V)>255), uint16_t, uint8_t>::type>::type #define uvalue_t(V) typename IF<((V)>65535), uint32_t, typename IF<((V)>255), uint16_t, uint8_t>::type>::type
#define value_t(V) typename IF<((V)>32767), int32_t, typename IF<((V)>127), int16_t, int8_t>::type>::type #define value_t(V) typename IF<((V)>32767), int32_t, typename IF<((V)>127), int16_t, int8_t>::type>::type
// General Flags for some number of states // Define a template for a bit field of N bits, using the smallest type that can hold N bits
template<size_t N, bool UseArray = (N > 64)>
struct Flags;
// Flag bits for <= 64 states
template<size_t N> template<size_t N>
struct Flags { struct Flags<N, false> {
typedef bits_t(N) flagbits_t; typedef bits_t(N) flagbits_t;
typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; } N8;
typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1, b8:1, b9:1, b10:1, b11:1, b12:1, b13:1, b14:1, b15:1; } N16;
typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1, b8:1, b9:1, b10:1, b11:1, b12:1, b13:1, b14:1, b15:1,
b16:1, b17:1, b18:1, b19:1, b20:1, b21:1, b22:1, b23:1, b24:1, b25:1, b26:1, b27:1, b28:1, b29:1, b30:1, b31:1; } N32;
union {
flagbits_t b; flagbits_t b;
typename IF<(N>16), N32, typename IF<(N>8), N16, N8>::type>::type flag;
class BitProxy {
public:
BitProxy(flagbits_t& data, int bit) : data_(data), bit_(bit) {}
BitProxy& operator=(const bool value) {
if (value)
data_ |= (flagbits_t(1) << bit_);
else
data_ &= ~(flagbits_t(1) << bit_);
return *this;
}
operator bool() const { return bool(data_ & (flagbits_t(1) << bit_)); }
private:
flagbits_t& data_;
uint8_t bit_;
}; };
FI void reset() { b = 0; } FI void reset() { b = 0; }
FI void set(const int n, const bool onoff) { onoff ? set(n) : clear(n); } FI void set(const int n, const bool onoff) { onoff ? set(n) : clear(n); }
FI void set(const int n) { b |= (flagbits_t)_BV(n); } FI void set(const int n) { b |= (flagbits_t(1) << n); }
FI void clear(const int n) { b &= ~(flagbits_t)_BV(n); } FI void clear(const int n) { b &= ~(flagbits_t(1) << n); }
FI bool test(const int n) const { return TEST(b, n); } FI bool test(const int n) const { return bool(b & (flagbits_t(1) << n)); }
FI bool operator[](const int n) { return test(n); } FI BitProxy operator[](const int n) { return BitProxy(b, n); }
FI bool operator[](const int n) const { return test(n); } FI bool operator[](const int n) const { return test(n); }
FI int size() const { return sizeof(b); } FI int size() const { return sizeof(b); }
FI operator bool() const { return b; } FI operator bool() const { return b != 0; }
};
// Flag bits for more than 64 states
template<size_t N>
struct Flags<N, true> {
uint8_t bitmask[(N+7)>>3];
// Proxy class for handling bit assignment
class BitProxy {
public:
BitProxy(uint8_t data[], int n) : data_(data[n >> 3]), bit_(n & 7) {}
// Assignment operator
BitProxy& operator=(const bool value) {
if (value)
data_ |= _BV(bit_);
else
data_ &= ~_BV(bit_);
return *this;
}
// Conversion operator to bool
operator bool() const { return TEST(data_, bit_); }
private:
uint8_t& data_;
uint8_t bit_;
};
FI void reset() { for (uint8_t b = 0; b < sizeof(bitmask); ++b) bitmask[b] = 0; }
FI void set(const int n, const bool onoff) { onoff ? set(n) : clear(n); }
FI void set(const int n) { bitmask[n >> 3] |= _BV(n & 7); }
FI void clear(const int n) { bitmask[n >> 3] &= ~_BV(n & 7); }
FI bool test(const int n) const { return TEST(bitmask[n >> 3], n & 7); }
FI BitProxy operator[](const int n) { return BitProxy(bitmask, n); }
FI bool operator[](const int n) const { return test(n); }
FI int size() const { return sizeof(bitmask); }
FI operator bool() const { for (uint8_t b : bitmask) if (b) return true; return false; }
}; };
// Specialization for a single bool flag // Specialization for a single bool flag
template<> template<>
struct Flags<1> { struct Flags<1, false> {
bool b; bool b;
FI void reset() { b = false; } FI void reset() { b = false; }
FI void set(const int n, const bool onoff) { onoff ? set(n) : clear(n); } FI void set(const int n, const bool onoff) { onoff ? set(n) : clear(n); }
@ -218,7 +272,7 @@ typedef struct {
FI bool operator[](const int n) { return flags[n]; } FI bool operator[](const int n) { return flags[n]; }
FI bool operator[](const int n) const { return flags[n]; } FI bool operator[](const int n) const { return flags[n]; }
FI int size() const { return sizeof(flags); } FI int size() const { return sizeof(flags); }
FI operator bool() const { return flags; } FI operator bool() const { return (bool)flags; }
} AxisFlags; } AxisFlags;
// //

View file

@ -146,9 +146,9 @@ public:
transfer_timeout = millis() + TIMEOUT; transfer_timeout = millis() + TIMEOUT;
switch (static_cast<FileTransfer>(packet_type)) { switch (static_cast<FileTransfer>(packet_type)) {
case FileTransfer::QUERY: case FileTransfer::QUERY:
SERIAL_ECHOPGM("PFT:version:", VERSION_MAJOR, ".", VERSION_MINOR, ".", VERSION_PATCH); SERIAL_ECHO(F("PFT:version:"), VERSION_MAJOR, C('.'), VERSION_MINOR, C('.'), VERSION_PATCH);
#if ENABLED(BINARY_STREAM_COMPRESSION) #if ENABLED(BINARY_STREAM_COMPRESSION)
SERIAL_ECHOLNPGM(":compression:heatshrink,", HEATSHRINK_STATIC_WINDOW_BITS, ",", HEATSHRINK_STATIC_LOOKAHEAD_BITS); SERIAL_ECHOLN(F(":compression:heatshrink,"), HEATSHRINK_STATIC_WINDOW_BITS, C(','), HEATSHRINK_STATIC_LOOKAHEAD_BITS);
#else #else
SERIAL_ECHOLNPGM(":compression:none"); SERIAL_ECHOLNPGM(":compression:none");
#endif #endif
@ -322,7 +322,7 @@ public:
if (packet.header.checksum == packet.header_checksum) { if (packet.header.checksum == packet.header_checksum) {
// The SYNC control packet is a special case in that it doesn't require the stream sync to be correct // The SYNC control packet is a special case in that it doesn't require the stream sync to be correct
if (static_cast<Protocol>(packet.header.protocol()) == Protocol::CONTROL && static_cast<ProtocolControl>(packet.header.type()) == ProtocolControl::SYNC) { if (static_cast<Protocol>(packet.header.protocol()) == Protocol::CONTROL && static_cast<ProtocolControl>(packet.header.type()) == ProtocolControl::SYNC) {
SERIAL_ECHOLNPGM("ss", sync, ",", buffer_size, ",", VERSION_MAJOR, ".", VERSION_MINOR, ".", VERSION_PATCH); SERIAL_ECHOLN(F("ss"), sync, C(','), buffer_size, C(','), VERSION_MAJOR, C('.'), VERSION_MINOR, C('.'), VERSION_PATCH);
stream_state = StreamState::PACKET_RESET; stream_state = StreamState::PACKET_RESET;
break; break;
} }

View file

@ -58,10 +58,10 @@
* *
* L # Layer Layer height. (Height of nozzle above bed) If not specified .20mm will be used. * L # Layer Layer height. (Height of nozzle above bed) If not specified .20mm will be used.
* *
* O # Ooooze How much your nozzle will Ooooze filament while getting in position to print. This * O # Ooze How much your nozzle will Ooooze filament while getting in position to print. If not
* is over kill, but using this parameter will let you get the very first 'circle' perfect * specified, a filament length of .3mm is assumed. This might be overkill, but this
* so you have a trophy to peel off of the bed and hang up to show how perfectly you have your * parameter ensures the very first 'circle' is perfect (providing an ideal trophy to hang
* Mesh calibrated. If not specified, a filament length of .3mm is assumed. * up to show off your perfectly calibrated Mesh).
* *
* P # Prime Prime the nozzle with specified length of filament. If this parameter is not * P # Prime Prime the nozzle with specified length of filament. If this parameter is not
* given, no prime action will take place. If the parameter specifies an amount, that much * given, no prime action will take place. If the parameter specifies an amount, that much

View file

@ -37,7 +37,7 @@
* F<feedrate> : Feedrate in mm/min * F<feedrate> : Feedrate in mm/min
* I<index> : X axis point index * I<index> : X axis point index
* J<index> : Y axis point index * J<index> : Y axis point index
* P<bool> : Flag to put the prove at the given point * P : Flag to put the probe at the given point
*/ */
void GcodeSuite::G42() { void GcodeSuite::G42() {
if (MOTION_CONDITIONS) { if (MOTION_CONDITIONS) {
@ -58,7 +58,7 @@ void GcodeSuite::G42() {
if (hasJ) destination.y = bedlevel.get_mesh_y(iy); if (hasJ) destination.y = bedlevel.get_mesh_y(iy);
#if HAS_PROBE_XY_OFFSET #if HAS_PROBE_XY_OFFSET
if (parser.boolval('P')) { if (parser.seen_test('P')) {
if (hasI) destination.x -= probe.offset_xy.x; if (hasI) destination.x -= probe.offset_xy.x;
if (hasJ) destination.y -= probe.offset_xy.y; if (hasJ) destination.y -= probe.offset_xy.y;
} }

View file

@ -30,28 +30,12 @@
#define DEBUG_OUT ENABLED(SAVED_POSITIONS_DEBUG) #define DEBUG_OUT ENABLED(SAVED_POSITIONS_DEBUG)
#include "../../../core/debug_out.h" #include "../../../core/debug_out.h"
/** bool report_stored_position(const uint8_t slot) {
* G60: Save current position if (!did_save_position[slot]) return false;
*
* S<slot> - Memory slot # (0-based) to save into (default 0)
*/
void GcodeSuite::G60() {
const uint8_t slot = parser.byteval('S');
if (slot >= SAVED_POSITIONS) {
SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS));
return;
}
stored_position[slot] = current_position;
SBI(saved_slots[slot >> 3], slot & 0x07);
#if ENABLED(SAVED_POSITIONS_DEBUG)
{
const xyze_pos_t &pos = stored_position[slot]; const xyze_pos_t &pos = stored_position[slot];
DEBUG_ECHOPGM(STR_SAVED_POS " S", slot, " :"); SERIAL_ECHO(STR_SAVED_POSITION, slot, C(':'));
#if NUM_AXES #if NUM_AXES
DEBUG_ECHOPGM_P( SERIAL_ECHOPGM_P(
LIST_N(DOUBLE(NUM_AXES), LIST_N(DOUBLE(NUM_AXES),
SP_X_LBL, pos.x, SP_Y_LBL, pos.y, SP_Z_LBL, pos.z, SP_X_LBL, pos.x, SP_Y_LBL, pos.y, SP_Z_LBL, pos.z,
SP_I_LBL, pos.i, SP_J_LBL, pos.j, SP_K_LBL, pos.k, SP_I_LBL, pos.i, SP_J_LBL, pos.j, SP_K_LBL, pos.k,
@ -60,11 +44,64 @@ void GcodeSuite::G60() {
); );
#endif #endif
#if HAS_EXTRUDERS #if HAS_EXTRUDERS
DEBUG_ECHOPGM_P(SP_E_LBL, pos.e); SERIAL_ECHOPGM_P(SP_E_LBL, pos.e);
#endif #endif
DEBUG_EOL(); SERIAL_EOL();
return true;
} }
#endif
/**
* G60: Saved Positions
*
* S<slot> - Save to a memory slot. (default 0)
* Q<slot> - Restore from a memory slot. (default 0)
* D<slot> - Delete a memory slot. With no number, delete all.
*/
void GcodeSuite::G60() {
// With no parameters report any saved positions
if (!parser.seen_any()) {
uint8_t count = 0;
for (uint8_t s = 0; s < SAVED_POSITIONS; ++s)
if (report_stored_position(s)) ++count;
if (!count) SERIAL_ECHOLNPGM("No Saved Positions");
return;
}
// Only one of these parameters is permitted
const uint8_t seenD = parser.seen_test('D'),
seenQ = parser.seen_test('Q'),
seenS = parser.seen_test('S');
if (seenD + seenQ + seenS > 1) return;
// G60 D : Delete all saved positions
if (seenD && !parser.seenval('D')) {
did_save_position.reset();
return;
}
// G60 Dn / Q / S : Get the slot value
const uint8_t slot = parser.byteval(seenD ? 'D' : seenQ ? 'Q' : 'S');
// G60 Q : Redirect to G61(slot)
if (seenQ) return G61(slot);
// Valid slot number?
if (SAVED_POSITIONS < 256 && slot >= SAVED_POSITIONS) {
SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS));
return;
}
// G60 Dn
if (seenD) {
SERIAL_ECHOLNPGM(STR_SAVED_POSITION, slot, ": DELETED");
did_save_position.clear(slot);
return;
}
// G60 S
stored_position[slot] = current_position;
did_save_position.set(slot);
report_stored_position(slot);
} }
#endif // SAVED_POSITIONS #endif // SAVED_POSITIONS

View file

@ -54,52 +54,64 @@
* *
* If no axes are specified then all axes are restored. * If no axes are specified then all axes are restored.
*/ */
void GcodeSuite::G61() { void GcodeSuite::G61(int8_t slot/*=-1*/) {
const uint8_t slot = parser.byteval('S'); if (slot < 0) slot = parser.byteval('S');
#define SYNC_E(POINT) TERN_(HAS_EXTRUDERS, planner.set_e_position_mm((destination.e = current_position.e = (POINT)))) #define SYNC_E(E) planner.set_e_position_mm(current_position.e = (E))
#if SAVED_POSITIONS < 256 if (SAVED_POSITIONS < 256 && slot >= SAVED_POSITIONS) {
if (slot >= SAVED_POSITIONS) {
SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS)); SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS));
return; return;
} }
#endif
// No saved position? No axes being restored? // No saved position? No axes being restored?
if (!TEST(saved_slots[slot >> 3], slot & 0x07)) return; if (!did_save_position[slot]) return;
// Apply any given feedrate over 0.0 // Apply any given feedrate over 0.0
REMEMBER(saved, feedrate_mm_s); REMEMBER(saved, feedrate_mm_s);
const float fr = parser.linearval('F'); const float fr = parser.linearval('F');
if (fr > 0.0) feedrate_mm_s = MMM_TO_MMS(fr); if (fr > 0.0) feedrate_mm_s = MMM_TO_MMS(fr);
// No XYZ...E parameters, move to stored position
float epos = stored_position[slot].e;
if (!parser.seen_axis()) { if (!parser.seen_axis()) {
DEBUG_ECHOLNPGM("Default position restore"); DEBUG_ECHOLNPGM(STR_RESTORING_POSITION, slot, " (all axes)");
// Move to the saved position, all axes except E
do_blocking_move_to(stored_position[slot], feedrate_mm_s); do_blocking_move_to(stored_position[slot], feedrate_mm_s);
SYNC_E(stored_position[slot].e); // Just set E to the saved position without moving it
TERN_(HAS_EXTRUDERS, SYNC_E(stored_position[slot].e));
report_current_position();
return;
} }
else {
// With XYZ...E return specified axes + optional offset
DEBUG_ECHOPGM(STR_RESTORING_POSITION " S", slot);
if (parser.seen(STR_AXES_MAIN)) { if (parser.seen(STR_AXES_MAIN)) {
DEBUG_ECHOPGM(STR_RESTORING_POS " S", slot); destination = current_position;
LOOP_NUM_AXES(i) { LOOP_NUM_AXES(i) {
destination[i] = parser.seen(AXIS_CHAR(i)) if (parser.seen(AXIS_CHAR(i))) {
? stored_position[slot][i] + parser.value_axis_units((AxisEnum)i) destination[i] = stored_position[slot][i] + parser.value_axis_units((AxisEnum)i);
: current_position[i];
DEBUG_ECHO(C(' '), C(AXIS_CHAR(i)), p_float_t(destination[i], 2)); DEBUG_ECHO(C(' '), C(AXIS_CHAR(i)), p_float_t(destination[i], 2));
} }
DEBUG_EOL(); }
// Move to the saved position
prepare_line_to_destination(); prepare_line_to_destination();
} }
#if HAS_EXTRUDERS #if HAS_EXTRUDERS
if (parser.seen_test('E')) { if (parser.seen('E')) {
DEBUG_ECHOLNPGM(STR_RESTORING_POS " S", slot, " E", current_position.e, "=>", stored_position[slot].e); epos += parser.value_axis_units(E_AXIS);
SYNC_E(stored_position[slot].e); DEBUG_ECHOPGM(" E", epos);
SYNC_E(epos);
} }
#endif #endif
}
DEBUG_EOL();
report_current_position();
} }
#endif // SAVED_POSITIONS #endif // SAVED_POSITIONS

View file

@ -606,7 +606,7 @@ private:
#if SAVED_POSITIONS #if SAVED_POSITIONS
static void G60(); static void G60();
static void G61(); static void G61(int8_t slot=-1);
#endif #endif
#if ENABLED(GCODE_MOTION_MODES) #if ENABLED(GCODE_MOTION_MODES)

View file

@ -42,7 +42,7 @@
* version was tagged. * version was tagged.
*/ */
#ifndef STRING_DISTRIBUTION_DATE #ifndef STRING_DISTRIBUTION_DATE
#define STRING_DISTRIBUTION_DATE "2024-07-16" #define STRING_DISTRIBUTION_DATE "2024-07-29"
#endif #endif
/** /**

View file

@ -694,6 +694,10 @@
#error "Z_SAFE_HOMING is recommended when homing with a probe. (Enable Z_SAFE_HOMING or define NO_Z_SAFE_HOMING_WARNING to suppress this warning.)" #error "Z_SAFE_HOMING is recommended when homing with a probe. (Enable Z_SAFE_HOMING or define NO_Z_SAFE_HOMING_WARNING to suppress this warning.)"
#endif #endif
#if HAS_TRINAMIC_CONFIG && NONE(EDGE_STEPPING, NO_EDGE_STEPPING_WARNING)
#error "EDGE_STEPPING is strongly recommended with Trinamic stepper drivers. (Enable EDGE_STEPPING or define NO_EDGE_STEPPING_WARNING to suppress this warning.)"
#endif
#if ENABLED(BIQU_MICROPROBE_V2) && NONE(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, NO_MICROPROBE_WARNING) #if ENABLED(BIQU_MICROPROBE_V2) && NONE(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, NO_MICROPROBE_WARNING)
#warning "BIQU MicroProbe V2 detect signal requires a strong pull-up. Some processors have weak internal pull-up capabilities, so we recommended connecting MicroProbe SIGNAL / GND to Z-MIN / Z-STOP instead of the dedicated PROBE port. (Define NO_MICROPROBE_WARNING to suppress this warning.)" #warning "BIQU MicroProbe V2 detect signal requires a strong pull-up. Some processors have weak internal pull-up capabilities, so we recommended connecting MicroProbe SIGNAL / GND to Z-MIN / Z-STOP instead of the dedicated PROBE port. (Define NO_MICROPROBE_WARNING to suppress this warning.)"
#endif #endif

View file

@ -794,15 +794,7 @@ namespace LanguageNarrow_it {
LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Appianamento"); LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Appianamento");
LSTR MSG_FIXED_TIME_MOTION = _UxGT("Movimento a Tempo-Fisso"); LSTR MSG_FIXED_TIME_MOTION = _UxGT("Movimento a Tempo-Fisso");
LSTR MSG_FTM_MODE = _UxGT("Modo Movimento:"); LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Modo Comp:");
//LSTR MSG_FTM_ZV = _UxGT("ZV");
//LSTR MSG_FTM_ZVD = _UxGT("ZVD");
//LSTR MSG_FTM_ZVDD = _UxGT("ZVDD");
//LSTR MSG_FTM_ZVDDD = _UxGT("ZVDDD");
//LSTR MSG_FTM_EI = _UxGT("EI");
//LSTR MSG_FTM_2HEI = _UxGT("2HEI");
//LSTR MSG_FTM_3HEI = _UxGT("3HEI");
//LSTR MSG_FTM_MZV = _UxGT("MZV");
LSTR MSG_FTM_DYN_MODE = _UxGT("Modo DF:"); LSTR MSG_FTM_DYN_MODE = _UxGT("Modo DF:");
LSTR MSG_FTM_Z_BASED = _UxGT("Base-Z"); LSTR MSG_FTM_Z_BASED = _UxGT("Base-Z");
LSTR MSG_FTM_MASS_BASED = _UxGT("Base-Massa"); LSTR MSG_FTM_MASS_BASED = _UxGT("Base-Massa");

View file

@ -805,8 +805,8 @@ namespace LanguageNarrow_ru {
LSTR MSG_HOST_SHUTDOWN = _UxGT("Выключить хост"); LSTR MSG_HOST_SHUTDOWN = _UxGT("Выключить хост");
// did not translate as there is no local terms/slang yet // did not translate as there is no local terms/slang yet
LSTR MSG_FIXED_TIME_MOTION = _UxGT("Fixed-Time Motion"); LSTR MSG_FIXED_TIME_MOTION = _UxGT("FT Motion");
LSTR MSG_FTM_MODE = _UxGT("Motion Mode:"); LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Режим комп.:");
LSTR MSG_FTM_ZV = _UxGT("ZV"); LSTR MSG_FTM_ZV = _UxGT("ZV");
LSTR MSG_FTM_ZVD = _UxGT("ZVD"); LSTR MSG_FTM_ZVD = _UxGT("ZVD");
LSTR MSG_FTM_EI = _UxGT("EI"); LSTR MSG_FTM_EI = _UxGT("EI");

View file

@ -792,7 +792,7 @@ namespace LanguageNarrow_tr {
LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Yumuşatma"); LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Yumuşatma");
LSTR MSG_FIXED_TIME_MOTION = _UxGT("Sabit Zamanlı Hareket"); LSTR MSG_FIXED_TIME_MOTION = _UxGT("Sabit Zamanlı Hareket");
LSTR MSG_FTM_MODE = _UxGT("Hareket Modu:"); LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Telafi Modu:");
LSTR MSG_FTM_ZV = _UxGT("ZV"); LSTR MSG_FTM_ZV = _UxGT("ZV");
LSTR MSG_FTM_ZVD = _UxGT("ZVD"); LSTR MSG_FTM_ZVD = _UxGT("ZVD");
LSTR MSG_FTM_ZVDD = _UxGT("ZVDD"); LSTR MSG_FTM_ZVDD = _UxGT("ZVDD");

View file

@ -95,96 +95,114 @@
// //
// About Printer > Thermistors // About Printer > Thermistors
// //
#if HAS_TEMP_SENSOR
void menu_info_thermistors() { void menu_info_thermistors() {
if (ui.use_click()) return ui.go_back(); if (ui.use_click()) return ui.go_back();
START_SCREEN(); START_SCREEN();
#define THERM_ITEM_NAME(LBL) \
STATIC_ITEM_F(F(LBL ": " THERMISTOR_NAME), SS_INVERT);
#define THERM_ITEMS(LBL,HTR,WAT) \ #define THERM_ITEMS(LBL,HTR,WAT) \
STATIC_ITEM_F(F(LBL ": " THERMISTOR_NAME), SS_INVERT); \ THERM_ITEM_NAME(LBL) \
PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HTR##_MINTEMP), SS_FULL); \ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HTR##_MINTEMP), SS_FULL); \
PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HTR##_MAXTEMP), SS_FULL); \ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HTR##_MAXTEMP), SS_FULL); \
STATIC_ITEM(TERN(WAT, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_FULL) \ STATIC_ITEM(TERN(WAT, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_FULL) \
#if HAS_EXTRUDERS #if TEMP_SENSOR_0 != 0
#define THERMISTOR_ID TEMP_SENSOR_0 #define THERMISTOR_ID TEMP_SENSOR_0
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS(STR_E0, HEATER_0, WATCH_HOTENDS); THERM_ITEMS(STR_E0, HEATER_0, WATCH_HOTENDS);
#endif #endif
#if TEMP_SENSOR_1 != 0 #if TEMP_SENSOR_1 != 0
#define THERMISTOR_ID TEMP_SENSOR_1 #define THERMISTOR_ID TEMP_SENSOR_1
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS(STR_E1, HEATER_1, WATCH_HOTENDS); THERM_ITEMS(STR_E1, HEATER_1, WATCH_HOTENDS);
#endif #endif
#if TEMP_SENSOR_2 != 0 #if TEMP_SENSOR_2 != 0
#define THERMISTOR_ID TEMP_SENSOR_2 #define THERMISTOR_ID TEMP_SENSOR_2
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS(STR_E2, HEATER_2, WATCH_HOTENDS); THERM_ITEMS(STR_E2, HEATER_2, WATCH_HOTENDS);
#endif #endif
#if TEMP_SENSOR_3 != 0 #if TEMP_SENSOR_3 != 0
#define THERMISTOR_ID TEMP_SENSOR_3 #define THERMISTOR_ID TEMP_SENSOR_3
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS(STR_E3, HEATER_3, WATCH_HOTENDS); THERM_ITEMS(STR_E3, HEATER_3, WATCH_HOTENDS);
#endif #endif
#if TEMP_SENSOR_4 != 0 #if TEMP_SENSOR_4 != 0
#define THERMISTOR_ID TEMP_SENSOR_4 #define THERMISTOR_ID TEMP_SENSOR_4
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS(STR_E4, HEATER_4, WATCH_HOTENDS); THERM_ITEMS(STR_E4, HEATER_4, WATCH_HOTENDS);
#endif #endif
#if TEMP_SENSOR_5 != 0 #if TEMP_SENSOR_5 != 0
#define THERMISTOR_ID TEMP_SENSOR_5 #define THERMISTOR_ID TEMP_SENSOR_5
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS(STR_E5, HEATER_5, WATCH_HOTENDS); THERM_ITEMS(STR_E5, HEATER_5, WATCH_HOTENDS);
#endif #endif
#if TEMP_SENSOR_6 != 0 #if TEMP_SENSOR_6 != 0
#define THERMISTOR_ID TEMP_SENSOR_6 #define THERMISTOR_ID TEMP_SENSOR_6
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS(STR_E6, HEATER_6, WATCH_HOTENDS); THERM_ITEMS(STR_E6, HEATER_6, WATCH_HOTENDS);
#endif #endif
#if TEMP_SENSOR_7 != 0 #if TEMP_SENSOR_7 != 0
#define THERMISTOR_ID TEMP_SENSOR_7 #define THERMISTOR_ID TEMP_SENSOR_7
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS(STR_E7, HEATER_7, WATCH_HOTENDS); THERM_ITEMS(STR_E7, HEATER_7, WATCH_HOTENDS);
#endif #endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
#define THERMISTOR_ID TEMP_SENSOR_BED #define THERMISTOR_ID TEMP_SENSOR_BED
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS("BED", BED, WATCH_BED); THERM_ITEMS("BED", BED, WATCH_BED);
#endif #endif
#if HAS_HEATED_CHAMBER #if HAS_HEATED_CHAMBER
#define THERMISTOR_ID TEMP_SENSOR_CHAMBER #define THERMISTOR_ID TEMP_SENSOR_CHAMBER
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS("CHAM", CHAMBER, WATCH_CHAMBER); THERM_ITEMS("CHAM", CHAMBER, WATCH_CHAMBER);
#endif #endif
#if HAS_COOLER #if HAS_COOLER
#define THERMISTOR_ID TEMP_SENSOR_COOLER #define THERMISTOR_ID TEMP_SENSOR_COOLER
#include "../thermistornames.h" #include "../thermistornames.h"
#undef THERMISTOR_ID
THERM_ITEMS("COOL", COOLER, WATCH_COOLER); THERM_ITEMS("COOL", COOLER, WATCH_COOLER);
#endif #endif
#if TEMP_SENSOR_PROBE != 0
#define THERMISTOR_ID TEMP_SENSOR_PROBE
#include "../thermistornames.h"
THERM_ITEM_NAME("PROBE");
#endif
#if TEMP_SENSOR_BOARD != 0
#define THERMISTOR_ID TEMP_SENSOR_BOARD
#include "../thermistornames.h"
THERM_ITEM_NAME("BOARD");
#endif
#if TEMP_SENSOR_SOC != 0
#define THERMISTOR_ID TEMP_SENSOR_SOC
#include "../thermistornames.h"
THERM_ITEM_NAME("SOC");
#endif
#if TEMP_SENSOR_REDUNDANT != 0
#define THERMISTOR_ID TEMP_SENSOR_REDUNDANT
#include "../thermistornames.h"
THERM_ITEM_NAME("REDUNDANT");
#endif
END_SCREEN(); END_SCREEN();
} }
#endif // HAS_TEMP_SENSOR
// //
// About Printer > Board Info // About Printer > Board Info
@ -256,7 +274,7 @@ void menu_info() {
#else #else
SUBMENU(MSG_INFO_PRINTER_MENU, menu_info_printer); // Printer Info > SUBMENU(MSG_INFO_PRINTER_MENU, menu_info_printer); // Printer Info >
SUBMENU(MSG_INFO_BOARD_MENU, menu_info_board); // Board Info > SUBMENU(MSG_INFO_BOARD_MENU, menu_info_board); // Board Info >
#if HAS_EXTRUDERS #if HAS_TEMP_SENSOR
SUBMENU(MSG_INFO_THERMISTOR_MENU, menu_info_thermistors); // Thermistors > SUBMENU(MSG_INFO_THERMISTOR_MENU, menu_info_thermistors); // Thermistors >
#endif #endif
#endif #endif

View file

@ -325,6 +325,32 @@ void menu_move() {
#include "../../module/ft_motion.h" #include "../../module/ft_motion.h"
#include "../../gcode/gcode.h" #include "../../gcode/gcode.h"
FSTR_P get_shaper_name(const AxisEnum axis=X_AXIS) {
switch (ftMotion.cfg.shaper[axis]) {
default: return nullptr;
case ftMotionShaper_NONE: return GET_TEXT_F(MSG_LCD_OFF);
case ftMotionShaper_ZV: return GET_TEXT_F(MSG_FTM_ZV);
case ftMotionShaper_ZVD: return GET_TEXT_F(MSG_FTM_ZVD);
case ftMotionShaper_ZVDD: return GET_TEXT_F(MSG_FTM_ZVDD);
case ftMotionShaper_ZVDDD: return GET_TEXT_F(MSG_FTM_ZVDDD);
case ftMotionShaper_EI: return GET_TEXT_F(MSG_FTM_EI);
case ftMotionShaper_2HEI: return GET_TEXT_F(MSG_FTM_2HEI);
case ftMotionShaper_3HEI: return GET_TEXT_F(MSG_FTM_3HEI);
case ftMotionShaper_MZV: return GET_TEXT_F(MSG_FTM_MZV);
}
}
#if HAS_DYNAMIC_FREQ
FSTR_P get_dyn_freq_mode_name() {
switch (ftMotion.cfg.dynFreqMode) {
default:
case dynFreqMode_DISABLED: return GET_TEXT_F(MSG_LCD_OFF);
case dynFreqMode_Z_BASED: return GET_TEXT_F(MSG_FTM_Z_BASED);
case dynFreqMode_MASS_BASED: return GET_TEXT_F(MSG_FTM_MASS_BASED);
}
}
#endif
void ftm_menu_set_cmpn(const AxisEnum axis, const ftMotionShaper_t s) { void ftm_menu_set_cmpn(const AxisEnum axis, const ftMotionShaper_t s) {
ftMotion.cfg.shaper[axis] = s; ftMotion.cfg.shaper[axis] = s;
ftMotion.update_shaping_params(); ftMotion.update_shaping_params();
@ -389,35 +415,17 @@ void menu_move() {
#endif // HAS_DYNAMIC_FREQ #endif // HAS_DYNAMIC_FREQ
void menu_ft_motion() { void menu_ft_motion() {
ft_config_t &c = ftMotion.cfg; // Define stuff ahead of the menu loop
MString<20> shaper_name[1 + ENABLED(HAS_Y_AXIS)] {};
FSTR_P ftshaper[1 + ENABLED(HAS_Y_AXIS)] {};
#if HAS_X_AXIS #if HAS_X_AXIS
for (uint_fast8_t a = X_AXIS; a <= TERN(HAS_Y_AXIS, Y_AXIS, X_AXIS); ++a) { for (uint_fast8_t a = X_AXIS; a <= TERN(HAS_Y_AXIS, Y_AXIS, X_AXIS); ++a)
switch (c.shaper[a]) { shaper_name[a] = get_shaper_name(AxisEnum(a));
case ftMotionShaper_NONE: ftshaper[a] = GET_TEXT_F(MSG_LCD_OFF); break; #endif
case ftMotionShaper_ZV: ftshaper[a] = GET_TEXT_F(MSG_FTM_ZV); break; #if HAS_DYNAMIC_FREQ
case ftMotionShaper_ZVD: ftshaper[a] = GET_TEXT_F(MSG_FTM_ZVD); break; MString<20> dmode = get_dyn_freq_mode_name();
case ftMotionShaper_ZVDD: ftshaper[a] = GET_TEXT_F(MSG_FTM_ZVDD); break;
case ftMotionShaper_ZVDDD: ftshaper[a] = GET_TEXT_F(MSG_FTM_ZVDDD);break;
case ftMotionShaper_EI: ftshaper[a] = GET_TEXT_F(MSG_FTM_EI); break;
case ftMotionShaper_2HEI: ftshaper[a] = GET_TEXT_F(MSG_FTM_2HEI); break;
case ftMotionShaper_3HEI: ftshaper[a] = GET_TEXT_F(MSG_FTM_3HEI); break;
case ftMotionShaper_MZV: ftshaper[a] = GET_TEXT_F(MSG_FTM_MZV); break;
}
}
#endif #endif
#if HAS_DYNAMIC_FREQ ft_config_t &c = ftMotion.cfg;
FSTR_P dmode;
switch (c.dynFreqMode) {
default:
case dynFreqMode_DISABLED: dmode = GET_TEXT_F(MSG_LCD_OFF); break;
case dynFreqMode_Z_BASED: dmode = GET_TEXT_F(MSG_FTM_Z_BASED); break;
case dynFreqMode_MASS_BASED: dmode = GET_TEXT_F(MSG_FTM_MASS_BASED); break;
}
#endif
START_MENU(); START_MENU();
BACK_ITEM(MSG_MOTION); BACK_ITEM(MSG_MOTION);
@ -431,7 +439,7 @@ void menu_move() {
if (c.active) { if (c.active) {
#if HAS_X_AXIS #if HAS_X_AXIS
SUBMENU_N(X_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_cmpn_x); SUBMENU_N(X_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_cmpn_x);
MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(ftshaper[X_AXIS]); MENU_ITEM_ADDON_END(); MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[X_AXIS]); MENU_ITEM_ADDON_END();
if (CMPNSTR_HAS_SHAPER(X_AXIS)) { if (CMPNSTR_HAS_SHAPER(X_AXIS)) {
EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq[X_AXIS], FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params); EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq[X_AXIS], FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params);
@ -442,7 +450,7 @@ void menu_move() {
#endif #endif
#if HAS_Y_AXIS #if HAS_Y_AXIS
SUBMENU_N(Y_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_cmpn_y); SUBMENU_N(Y_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_cmpn_y);
MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(ftshaper[Y_AXIS]); MENU_ITEM_ADDON_END(); MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[Y_AXIS]); MENU_ITEM_ADDON_END();
if (CMPNSTR_HAS_SHAPER(Y_AXIS)) { if (CMPNSTR_HAS_SHAPER(Y_AXIS)) {
EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq[Y_AXIS], FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params); EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq[Y_AXIS], FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params);
@ -473,14 +481,46 @@ void menu_move() {
END_MENU(); END_MENU();
} }
void menu_tune_ft_motion() {
// Define stuff ahead of the menu loop
MString<20> shaper_name[1 + ENABLED(HAS_Y_AXIS)] {};
#if HAS_X_AXIS
for (uint_fast8_t a = X_AXIS; a <= TERN(HAS_Y_AXIS, Y_AXIS, X_AXIS); ++a)
shaper_name[a] = get_shaper_name(AxisEnum(a));
#endif
#if HAS_DYNAMIC_FREQ
MString<20> dmode = get_dyn_freq_mode_name();
#endif
ft_config_t &c = ftMotion.cfg;
START_MENU();
#if HAS_X_AXIS
SUBMENU_N(X_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_cmpn_x);
MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[X_AXIS]); MENU_ITEM_ADDON_END();
#endif
#if HAS_Y_AXIS
SUBMENU_N(Y_AXIS, MSG_FTM_CMPN_MODE, menu_ftm_cmpn_y);
MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(shaper_name[Y_AXIS]); MENU_ITEM_ADDON_END();
#endif
#if HAS_DYNAMIC_FREQ
SUBMENU(MSG_FTM_DYN_MODE, menu_ftm_dyn_mode);
MENU_ITEM_ADDON_START_RJ(dmode.length()); lcd_put_u8str(dmode); MENU_ITEM_ADDON_END();
#endif
#if HAS_EXTRUDERS
EDIT_ITEM(bool, MSG_LINEAR_ADVANCE, &ftMotion.cfg.linearAdvEna);
#endif
END_MENU();
}
#endif // FT_MOTION_MENU #endif // FT_MOTION_MENU
void menu_motion() { void menu_motion() {
#if ENABLED(FT_MOTION_MENU)
const bool is_busy = printer_busy();
#endif
START_MENU(); START_MENU();
// //
@ -510,7 +550,7 @@ void menu_motion() {
// M493 - Fixed-Time Motion // M493 - Fixed-Time Motion
// //
#if ENABLED(FT_MOTION_MENU) #if ENABLED(FT_MOTION_MENU)
if (!is_busy) SUBMENU(MSG_FIXED_TIME_MOTION, menu_ft_motion); SUBMENU(MSG_FIXED_TIME_MOTION, menu_ft_motion);
#endif #endif
// //

View file

@ -190,6 +190,14 @@ void menu_tune() {
#endif // HAS_FAN #endif // HAS_FAN
//
// FT_MOTION
//
#if ENABLED(FT_MOTION_MENU)
void menu_tune_ft_motion();
SUBMENU(MSG_FIXED_TIME_MOTION, menu_tune_ft_motion);
#endif
// //
// Flow: // Flow:
// //

View file

@ -171,4 +171,10 @@
#elif THERMISTOR_ID == 1000 #elif THERMISTOR_ID == 1000
#define THERMISTOR_NAME "Custom" #define THERMISTOR_NAME "Custom"
// SOC thermistor`
#elif THERMISTOR_ID == 100
#define THERMISTOR_NAME "SOC"
#endif // THERMISTOR_ID #endif // THERMISTOR_ID
#undef THERMISTOR_ID

View file

@ -51,7 +51,7 @@ class CircularQueue {
* of item this queue will handle and N defines the maximum number of * of item this queue will handle and N defines the maximum number of
* items that can be stored on the queue. * items that can be stored on the queue.
*/ */
CircularQueue<T, N>() { CircularQueue() {
buffer.size = N; buffer.size = N;
buffer.count = buffer.head = buffer.tail = 0; buffer.count = buffer.head = buffer.tail = 0;
} }

View file

@ -104,7 +104,7 @@ xyze_pos_t destination; // {0}
// G60/G61 Position Save and Return // G60/G61 Position Save and Return
#if SAVED_POSITIONS #if SAVED_POSITIONS
uint8_t saved_slots[(SAVED_POSITIONS + 7) >> 3]; Flags<SAVED_POSITIONS> did_save_position;
xyze_pos_t stored_position[SAVED_POSITIONS]; xyze_pos_t stored_position[SAVED_POSITIONS];
#endif #endif

View file

@ -50,7 +50,7 @@ extern xyze_pos_t current_position, // High-level current tool position
// G60/G61 Position Save and Return // G60/G61 Position Save and Return
#if SAVED_POSITIONS #if SAVED_POSITIONS
extern uint8_t saved_slots[(SAVED_POSITIONS + 7) >> 3]; // TODO: Add support for HAS_I_AXIS extern Flags<SAVED_POSITIONS> did_save_position;
extern xyze_pos_t stored_position[SAVED_POSITIONS]; extern xyze_pos_t stored_position[SAVED_POSITIONS];
#endif #endif

View file

@ -3153,6 +3153,14 @@ void Planner::set_machine_position_mm(const abce_pos_t &abce) {
} }
} }
/**
* Set the machine positions in millimeters (soon) given the native position.
* Synchonized with the planner queue.
*
* - Modifiers are applied for skew, leveling, retract, etc.
* - Kinematics are applied to remap cartesian positions to stepper positions.
* - The resulting stepper positions are synchronized at the end of the planner queue.
*/
void Planner::set_position_mm(const xyze_pos_t &xyze) { void Planner::set_position_mm(const xyze_pos_t &xyze) {
xyze_pos_t machine = xyze; xyze_pos_t machine = xyze;
TERN_(HAS_POSITION_MODIFIERS, apply_modifiers(machine, true)); TERN_(HAS_POSITION_MODIFIERS, apply_modifiers(machine, true));
@ -3169,12 +3177,13 @@ void Planner::set_position_mm(const xyze_pos_t &xyze) {
#if HAS_EXTRUDERS #if HAS_EXTRUDERS
/** /**
* Setters for planner position (also setting stepper position). * Special setter for planner E position (also setting E stepper position).
*/ */
void Planner::set_e_position_mm(const_float_t e) { void Planner::set_e_position_mm(const_float_t e) {
const uint8_t axis_index = E_AXIS_N(active_extruder); const uint8_t axis_index = E_AXIS_N(active_extruder);
TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder); TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder);
// Unapply the current retraction before (immediately) setting the planner position
const float e_new = DIFF_TERN(FWRETRACT, e, fwretract.current_retract[active_extruder]); const float e_new = DIFF_TERN(FWRETRACT, e, fwretract.current_retract[active_extruder]);
position.e = LROUND(settings.axis_steps_per_mm[axis_index] * e_new); position.e = LROUND(settings.axis_steps_per_mm[axis_index] * e_new);
TERN_(HAS_POSITION_FLOAT, position_float.e = e_new); TERN_(HAS_POSITION_FLOAT, position_float.e = e_new);
@ -3183,12 +3192,14 @@ void Planner::set_position_mm(const xyze_pos_t &xyze) {
if (has_blocks_queued()) if (has_blocks_queued())
buffer_sync_block(BLOCK_BIT_SYNC_POSITION); buffer_sync_block(BLOCK_BIT_SYNC_POSITION);
else else
stepper.set_axis_position(E_AXIS, position.e); stepper.set_e_position(position.e);
} }
#endif #endif // HAS_EXTRUDERS
// Recalculate the steps/s^2 acceleration rates, based on the mm/s^2 /**
* Recalculate steps/s^2 acceleration rates based on mm/s^2 acceleration rates
*/
void Planner::refresh_acceleration_rates() { void Planner::refresh_acceleration_rates() {
uint32_t highest_rate = 1; uint32_t highest_rate = 1;
LOOP_DISTINCT_AXES(i) { LOOP_DISTINCT_AXES(i) {

View file

@ -3361,40 +3361,40 @@ void Stepper::_set_position(const abce_long_t &spos) {
#endif #endif
} }
// AVR requires guards to ensure any atomic memory operation greater than 8 bits
#define ATOMIC_SECTION_START() const bool was_enabled = suspend()
#define ATOMIC_SECTION_END() if (was_enabled) wake_up()
#define AVR_ATOMIC_SECTION_START() TERN_(__AVR__, ATOMIC_SECTION_START())
#define AVR_ATOMIC_SECTION_END() TERN_(__AVR__, ATOMIC_SECTION_END())
/** /**
* Get a stepper's position in steps. * Get a stepper's position in steps.
*/ */
int32_t Stepper::position(const AxisEnum axis) { int32_t Stepper::position(const AxisEnum axis) {
#ifdef __AVR__ AVR_ATOMIC_SECTION_START();
// Protect the access to the position. Only required for AVR, as
// any 32bit CPU offers atomic access to 32bit variables
const bool was_enabled = suspend();
#endif
const int32_t v = count_position[axis]; const int32_t v = count_position[axis];
AVR_ATOMIC_SECTION_END();
#ifdef __AVR__
// Reenable Stepper ISR
if (was_enabled) wake_up();
#endif
return v; return v;
} }
// Set the current position in steps /**
* Set all axis stepper positions in steps
*/
void Stepper::set_position(const xyze_long_t &spos) { void Stepper::set_position(const xyze_long_t &spos) {
planner.synchronize(); planner.synchronize();
const bool was_enabled = suspend(); ATOMIC_SECTION_START();
_set_position(spos); _set_position(spos);
if (was_enabled) wake_up(); ATOMIC_SECTION_END();
} }
/**
* Set a single axis stepper position in steps
*/
void Stepper::set_axis_position(const AxisEnum a, const int32_t &v) { void Stepper::set_axis_position(const AxisEnum a, const int32_t &v) {
planner.synchronize(); planner.synchronize();
#ifdef __AVR__ #if ANY(__AVR__, INPUT_SHAPING_X, INPUT_SHAPING_Y, INPUT_SHAPING_Z)
// Protect the access to the position. Only required for AVR, as ATOMIC_SECTION_START();
// any 32bit CPU offers atomic access to 32bit variables
const bool was_enabled = suspend();
#endif #endif
count_position[a] = v; count_position[a] = v;
@ -3402,43 +3402,47 @@ void Stepper::set_axis_position(const AxisEnum a, const int32_t &v) {
TERN_(INPUT_SHAPING_Y, if (a == Y_AXIS) shaping_y.last_block_end_pos = v); TERN_(INPUT_SHAPING_Y, if (a == Y_AXIS) shaping_y.last_block_end_pos = v);
TERN_(INPUT_SHAPING_Z, if (a == Z_AXIS) shaping_z.last_block_end_pos = v); TERN_(INPUT_SHAPING_Z, if (a == Z_AXIS) shaping_z.last_block_end_pos = v);
#ifdef __AVR__ #if ANY(__AVR__, INPUT_SHAPING_X, INPUT_SHAPING_Y, INPUT_SHAPING_Z)
// Reenable Stepper ISR ATOMIC_SECTION_END();
if (was_enabled) wake_up();
#endif #endif
} }
#if HAS_EXTRUDERS
void Stepper::set_e_position(const int32_t &v) {
planner.synchronize();
AVR_ATOMIC_SECTION_START();
count_position.e = v;
AVR_ATOMIC_SECTION_END();
}
#endif // HAS_EXTRUDERS
#if ENABLED(FT_MOTION) #if ENABLED(FT_MOTION)
void Stepper::ftMotion_syncPosition() { void Stepper::ftMotion_syncPosition() {
//planner.synchronize(); planner already synchronized in M493 //planner.synchronize(); planner already synchronized in M493
#ifdef __AVR__
// Protect the access to the position. Only required for AVR, as
// any 32bit CPU offers atomic access to 32bit variables
const bool was_enabled = suspend();
#endif
// Update stepper positions from the planner // Update stepper positions from the planner
AVR_ATOMIC_SECTION_START();
count_position = planner.position; count_position = planner.position;
AVR_ATOMIC_SECTION_END();
#ifdef __AVR__
// Reenable Stepper ISR
if (was_enabled) wake_up();
#endif
} }
#endif // FT_MOTION #endif // FT_MOTION
// Signal endstops were triggered - This function can be called from /**
// an ISR context (Temperature, Stepper or limits ISR), so we must * Record stepper positions and discard the rest of the current block
// be very careful here. If the interrupt being preempted was the *
// Stepper ISR (this CAN happen with the endstop limits ISR) then * WARNING! This function may be called from ISR context!
// when the stepper ISR resumes, we must be very sure that the movement * If the Stepper ISR is preempted (e.g., by the endstop ISR) we
// is properly canceled * must ensure the move is properly canceled before the ISR resumes.
*/
void Stepper::endstop_triggered(const AxisEnum axis) { void Stepper::endstop_triggered(const AxisEnum axis) {
const bool was_enabled = suspend(); ATOMIC_SECTION_START(); // Suspend the Stepper ISR on all platforms
endstops_trigsteps[axis] = ( endstops_trigsteps[axis] = (
#if IS_CORE #if IS_CORE
(axis == CORE_AXIS_2 (axis == CORE_AXIS_2
@ -3461,23 +3465,14 @@ void Stepper::endstop_triggered(const AxisEnum axis) {
// Discard the rest of the move if there is a current block // Discard the rest of the move if there is a current block
quick_stop(); quick_stop();
if (was_enabled) wake_up(); ATOMIC_SECTION_END(); // Suspend the Stepper ISR on all platforms
} }
// Return the "triggered" position for an axis (that hit an endstop)
int32_t Stepper::triggered_position(const AxisEnum axis) { int32_t Stepper::triggered_position(const AxisEnum axis) {
#ifdef __AVR__ AVR_ATOMIC_SECTION_START();
// Protect the access to the position. Only required for AVR, as
// any 32bit CPU offers atomic access to 32bit variables
const bool was_enabled = suspend();
#endif
const int32_t v = endstops_trigsteps[axis]; const int32_t v = endstops_trigsteps[axis];
AVR_ATOMIC_SECTION_END();
#ifdef __AVR__
// Reenable Stepper ISR
if (was_enabled) wake_up();
#endif
return v; return v;
} }
@ -3506,18 +3501,9 @@ void Stepper::report_a_position(const xyz_long_t &pos) {
} }
void Stepper::report_positions() { void Stepper::report_positions() {
AVR_ATOMIC_SECTION_START();
#ifdef __AVR__
// Protect the access to the position.
const bool was_enabled = suspend();
#endif
const xyz_long_t pos = count_position; const xyz_long_t pos = count_position;
AVR_ATOMIC_SECTION_END();
#ifdef __AVR__
if (was_enabled) wake_up();
#endif
report_a_position(pos); report_a_position(pos);
} }

View file

@ -540,6 +540,11 @@ class Stepper {
static void set_position(const xyze_long_t &spos); static void set_position(const xyze_long_t &spos);
static void set_axis_position(const AxisEnum a, const int32_t &v); static void set_axis_position(const AxisEnum a, const int32_t &v);
#if HAS_EXTRUDERS
// Save a little when E is the only one used
static void set_e_position(const int32_t &v);
#endif
// Report the positions of the steppers, in steps // Report the positions of the steppers, in steps
static void report_a_position(const xyz_long_t &pos); static void report_a_position(const xyz_long_t &pos);
static void report_positions(); static void report_positions();

View file

@ -23,13 +23,13 @@
/** /**
* Smoothieware Smoothieboard pin assignments * Smoothieware Smoothieboard pin assignments
* Schematic: http://smoothieware.org/_media///external/http.i.imgur.com.oj4zqs3.png * See https://smoothieware.github.io/Webif-pack/documentation/web/html/smoothieboard.html
*/ */
#include "env_validate.h" #include "env_validate.h"
#define BOARD_INFO_NAME "Smoothieboard" #define BOARD_INFO_NAME "Smoothieboard"
#define BOARD_WEBSITE_URL "smoothieware.org/smoothieboard" #define BOARD_WEBSITE_URL "smoothieware.github.io"
// //
// Servos // Servos
@ -131,12 +131,7 @@
/** /**
* The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either * The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either
* a custom cable with breakouts to the pins indicated below or the RRD GLCD Adapter board * a custom cable with breakouts to the pins indicated below or the RRD GLCD Adapter board.
* found at http://smoothieware.org/rrdglcdadapter
*
* Other links to information about setting up a display panel with Smoothieboard
* http://chibidibidiwah.wdfiles.com/local--files/panel/smoothieboard2sd.jpg
* http://smoothieware.org/panel
*/ */
#if IS_RRD_FG_SC #if IS_RRD_FG_SC
// EXP1 Pins // EXP1 Pins

View file

@ -25,7 +25,7 @@
* Cheaptronic v2.0 pin assignments * Cheaptronic v2.0 pin assignments
* Built and sold by Michal Dyntar - RRO * Built and sold by Michal Dyntar - RRO
* www.reprapobchod.cz (DOES NOT EXIST ANYMORE) * www.reprapobchod.cz (DOES NOT EXIST ANYMORE)
* https://web.archive.org/web/20190306201523/http://reprapobchod.cz/ * https://web.archive.org/web/20190306201523/reprapobchod.cz
* ATmega2560 * ATmega2560
*/ */

View file

@ -24,7 +24,7 @@
/** /**
* CartesioV11 pin assignments * CartesioV11 pin assignments
* Comes with an Arduino Mega, see * Comes with an Arduino Mega, see
* https://web.archive.org/web/20171024190029/http://mauk.cc/mediawiki/index.php/Electronical_assembly * https://web.archive.org/web/20171024190029/mauk.cc/mediawiki/index.php/Electronical_assembly
* ATmega2560, ATmega1280 * ATmega2560, ATmega1280
*/ */

View file

@ -24,7 +24,7 @@
/** /**
* CartesioV12 pin assignments * CartesioV12 pin assignments
* Comes with an Arduino Mega, see * Comes with an Arduino Mega, see
* https://web.archive.org/web/20171024190029/http://mauk.cc/mediawiki/index.php/Electronical_assembly * https://web.archive.org/web/20171024190029/mauk.cc/mediawiki/index.php/Electronical_assembly
* ATmega2560, ATmega1280 * ATmega2560, ATmega1280
*/ */

View file

@ -604,6 +604,7 @@
#define BTN_ENC 32 #define BTN_ENC 32
#define LCD_SDSS SDSS #define LCD_SDSS SDSS
#define KILL_PIN 41 #define KILL_PIN 41
#undef LCD_PINS_EN // not used, causes false pin conflict report
#elif ENABLED(LCD_I2C_VIKI) #elif ENABLED(LCD_I2C_VIKI)

View file

@ -745,21 +745,21 @@
#elif MB(BLACK_STM32F407VE) #elif MB(BLACK_STM32F407VE)
#include "stm32f4/pins_BLACK_STM32F407VE.h" // STM32F4 env:STM32F407VE_black #include "stm32f4/pins_BLACK_STM32F407VE.h" // STM32F4 env:STM32F407VE_black
#elif MB(BTT_SKR_PRO_V1_1) #elif MB(BTT_SKR_PRO_V1_1)
#include "stm32f4/pins_BTT_SKR_PRO_V1_1.h" // STM32F4 env:BIGTREE_SKR_PRO env:BIGTREE_SKR_PRO_usb_flash_drive #include "stm32f4/pins_BTT_SKR_PRO_V1_1.h" // STM32F4 env:BTT_SKR_PRO env:BTT_SKR_PRO_usb_flash_drive
#elif MB(BTT_SKR_PRO_V1_2) #elif MB(BTT_SKR_PRO_V1_2)
#include "stm32f4/pins_BTT_SKR_PRO_V1_2.h" // STM32F4 env:BIGTREE_SKR_PRO env:BIGTREE_SKR_PRO_usb_flash_drive #include "stm32f4/pins_BTT_SKR_PRO_V1_2.h" // STM32F4 env:BTT_SKR_PRO env:BTT_SKR_PRO_usb_flash_drive
#elif MB(BTT_GTR_V1_0) #elif MB(BTT_GTR_V1_0)
#include "stm32f4/pins_BTT_GTR_V1_0.h" // STM32F4 env:BIGTREE_GTR_V1_0 env:BIGTREE_GTR_V1_0_usb_flash_drive #include "stm32f4/pins_BTT_GTR_V1_0.h" // STM32F4 env:BTT_GTR_V1_0 env:BTT_GTR_V1_0_usb_flash_drive
#elif MB(BTT_BTT002_V1_0) #elif MB(BTT_BTT002_V1_0)
#include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BIGTREE_BTT002 env:BIGTREE_BTT002_VET6 #include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BTT_BTT002 env:BTT_BTT002_VET6
#elif MB(BTT_E3_RRF) #elif MB(BTT_E3_RRF)
#include "stm32f4/pins_BTT_E3_RRF.h" // STM32F4 env:BIGTREE_E3_RRF #include "stm32f4/pins_BTT_E3_RRF.h" // STM32F4 env:BTT_E3_RRF
#elif MB(BTT_SKR_MINI_E3_V3_0_1) #elif MB(BTT_SKR_MINI_E3_V3_0_1)
#include "stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h" // STM32F4 env:STM32F401RC_btt env:STM32F401RC_btt_xfer #include "stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h" // STM32F4 env:STM32F401RC_btt env:STM32F401RC_btt_xfer
#elif MB(BTT_SKR_V2_0_REV_A) #elif MB(BTT_SKR_V2_0_REV_A)
#include "stm32f4/pins_BTT_SKR_V2_0_REV_A.h" // STM32F4 env:BIGTREE_SKR_2 env:BIGTREE_SKR_2_USB env:BIGTREE_SKR_2_USB_debug #include "stm32f4/pins_BTT_SKR_V2_0_REV_A.h" // STM32F4 env:STM32F407VG_btt env:STM32F407VG_btt_USB env:STM32F407VG_btt_USB_debug
#elif MB(BTT_SKR_V2_0_REV_B) #elif MB(BTT_SKR_V2_0_REV_B)
#include "stm32f4/pins_BTT_SKR_V2_0_REV_B.h" // STM32F4 env:BIGTREE_SKR_2 env:BIGTREE_SKR_2_USB env:BIGTREE_SKR_2_USB_debug env:BIGTREE_SKR_2_F429 env:BIGTREE_SKR_2_F429_USB env:BIGTREE_SKR_2_F429_USB_debug #include "stm32f4/pins_BTT_SKR_V2_0_REV_B.h" // STM32F4 env:STM32F407VG_btt env:STM32F407VG_btt_USB env:STM32F407VG_btt_USB_debug env:STM32F429VG_btt env:STM32F429VG_btt_USB env:STM32F429VG_btt_USB_debug
#elif MB(BTT_OCTOPUS_V1_0) #elif MB(BTT_OCTOPUS_V1_0)
#include "stm32f4/pins_BTT_OCTOPUS_V1_0.h" // STM32F4 env:STM32F446ZE_btt env:STM32F446ZE_btt_usb_flash_drive #include "stm32f4/pins_BTT_OCTOPUS_V1_0.h" // STM32F4 env:STM32F446ZE_btt env:STM32F446ZE_btt_usb_flash_drive
#elif MB(BTT_OCTOPUS_V1_1) #elif MB(BTT_OCTOPUS_V1_1)

View file

@ -23,7 +23,7 @@
/** /**
* BAM&DICE Due (Arduino Mega) pin assignments * BAM&DICE Due (Arduino Mega) pin assignments
* Schematic: http://www.2printbeta.de/download/2PRINTBETA-BAM&DICE-DUE-V1.1-sch.pdf * Schematic: http://www.2printbeta.de/de/download/2PRINTBETA-BAM&DICE-DUE-V1.1-sch.pdf
* ATmega2560, ATmega1280 * ATmega2560, ATmega1280
*/ */

View file

@ -23,7 +23,7 @@
/** /**
* Velleman K8800 (Vertex) * Velleman K8800 (Vertex)
* Schematic: https://www.velleman.eu/downloads/files/vertex-delta/schematics/K8800-schematic-V1.4.pdf * Schematic: https://cdn.velleman.eu/downloads/files/vertex-delta/schematics/K8800-schematic-V1.4.pdf
* ATmega2560, ATmega1280 * ATmega2560, ATmega1280
*/ */

View file

@ -742,6 +742,7 @@
#define BTN_ENC AUX4_03 #define BTN_ENC AUX4_03
#define LCD_SDSS SDSS #define LCD_SDSS SDSS
#define KILL_PIN EXP2_08_PIN #define KILL_PIN EXP2_08_PIN
#undef LCD_PINS_EN // not used, causes false pin conflict report
#elif ENABLED(LCD_I2C_VIKI) #elif ENABLED(LCD_I2C_VIKI)

View file

@ -430,6 +430,7 @@
#define BTN_ENC 32 #define BTN_ENC 32
#define LCD_SDSS EXP2_04_PIN #define LCD_SDSS EXP2_04_PIN
//#define KILL_PIN 41 //#define KILL_PIN 41
#undef LCD_PINS_EN // not used, causes false pin conflict report
#elif ENABLED(LCD_I2C_VIKI) #elif ENABLED(LCD_I2C_VIKI)

View file

@ -31,7 +31,7 @@
* - https://github.com/Ultimaker/Ultimaker2/blob/master/1546%20ultimainboard%20V2.1.4/schema4.SchDoc * - https://github.com/Ultimaker/Ultimaker2/blob/master/1546%20ultimainboard%20V2.1.4/schema4.SchDoc
* - https://github.com/Ultimaker/Ultimaker2/blob/master/1546%20ultimainboard%20V2.1.4/schema5.SchDoc * - https://github.com/Ultimaker/Ultimaker2/blob/master/1546%20ultimainboard%20V2.1.4/schema5.SchDoc
* Schematics (Original+): * Schematics (Original+):
* Schematic (Original+): https://github.com/Ultimaker/Ultimaker-Original-Plus/blob/master/1091_Main_board_v2.1.1_(x1)/Ultimainboard%20rev.%202.1.1%20altium.zip * Schematic (Original+): https://github.com/Ultimaker/Ultimaker-Original-Plus/blob/master/1091_Main_board_v2.1.1_%28x1%29/Ultimainboard%20rev.%202.1.1%20altium.zip
* ATmega2560 * ATmega2560
*/ */

View file

@ -111,7 +111,7 @@
/** /**
* RADDS Extension Board V2 / V3 * RADDS Extension Board V2 / V3
* http://doku.radds.org/dokumentation/extension-board * https://web.archive.org/web/20210627142010/doku.radds.org/dokumentation/extension-board/
*/ */
//#define RADDS_EXTENSION 2 //#define RADDS_EXTENSION 2
#if RADDS_EXTENSION >= 2 #if RADDS_EXTENSION >= 2

View file

@ -271,7 +271,7 @@
#elif ENABLED(SPARK_FULL_GRAPHICS) #elif ENABLED(SPARK_FULL_GRAPHICS)
//http://doku.radds.org/dokumentation/other-electronics/sparklcd/ // https://sparklab-shop.de/elektronik/40/sparklcd-adapter
#error "Oops! SPARK_FULL_GRAPHICS not supported with RURAMPS4D." #error "Oops! SPARK_FULL_GRAPHICS not supported with RURAMPS4D."
//#define LCD_PINS_D4 29 //? //#define LCD_PINS_D4 29 //?
//#define LCD_PINS_EN 27 //? //#define LCD_PINS_EN 27 //?

View file

@ -361,6 +361,7 @@
//#define BTN_ENC 32 //#define BTN_ENC 32
//#define LCD_SDSS SDSS //#define LCD_SDSS SDSS
//#define KILL_PIN EXP1_01_PIN //#define KILL_PIN EXP1_01_PIN
//#undef LCD_PINS_EN // not used, causes false pin conflict report
#elif ENABLED(LCD_I2C_VIKI) #elif ENABLED(LCD_I2C_VIKI)

View file

@ -413,6 +413,7 @@
//#define BTN_ENC 32 //#define BTN_ENC 32
//#define LCD_SDSS SDSS //#define LCD_SDSS SDSS
//#define KILL_PIN EXP1_01_PIN //#define KILL_PIN EXP1_01_PIN
//#undef LCD_PINS_EN // not used, causes false pin conflict report
#elif ENABLED(LCD_I2C_VIKI) #elif ENABLED(LCD_I2C_VIKI)

View file

@ -308,6 +308,7 @@
//#define BTN_ENC 32 //#define BTN_ENC 32
//#define LCD_SDSS SDSS //#define LCD_SDSS SDSS
//#define KILL_PIN EXP1_01_PIN //#define KILL_PIN EXP1_01_PIN
//#undef LCD_PINS_EN // not used, causes false pin conflict report
#elif ENABLED(LCD_I2C_VIKI) #elif ENABLED(LCD_I2C_VIKI)

View file

@ -564,6 +564,7 @@
#define BTN_ENC AUX4_03 #define BTN_ENC AUX4_03
#define LCD_SDSS SDSS #define LCD_SDSS SDSS
#define KILL_PIN AUX4_07 #define KILL_PIN AUX4_07
#undef LCD_PINS_EN // not used, causes false pin conflict report
#elif ENABLED(LCD_I2C_VIKI) #elif ENABLED(LCD_I2C_VIKI)

View file

@ -206,7 +206,7 @@
#elif IS_RRD_FG_SC #elif IS_RRD_FG_SC
// Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics // Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics
// display using an adapter board. See https://go.aisler.net/benlye/anet-lcd-adapter/pcb // display using an adapter board. See https://aisler.net/benlye/anet-lcd-adapter/pcb
// See below for alternative pin definitions for use with https://www.thingiverse.com/thing:2103748 // See below for alternative pin definitions for use with https://www.thingiverse.com/thing:2103748
#if ENABLED(CTC_A10S_A13) #if ENABLED(CTC_A10S_A13)
@ -305,8 +305,8 @@
* ==================================================================== * ====================================================================
* *
* Anet V1.0 controller | ZONESTAR_LCD | ANET_FULL_ | RepRapDiscount Full | Thingiverse RepRap wiring * Anet V1.0 controller | ZONESTAR_LCD | ANET_FULL_ | RepRapDiscount Full | Thingiverse RepRap wiring
* physical logical alt | | GRAPHICS_LCD | Graphics Display Wiring | https://www.thingiverse * physical logical alt | | GRAPHICS_LCD | Graphics Display Wiring | https://www.thingiverse.com/thing:2103748
* pin pin functions | | | | .com/thing:2103748 * pin pin functions | | | |
*-------------------------------------------------------------------------------------------------------------------- *--------------------------------------------------------------------------------------------------------------------
* ANET-J3.1 8 *** | N/A | J3_TX *** | | * ANET-J3.1 8 *** | N/A | J3_TX *** | |
* ANET-J3.2 9 *** | N/A | J3_RX *** | | * ANET-J3.2 9 *** | N/A | J3_RX *** | |

View file

@ -69,7 +69,7 @@
* *
* When installing select 1.0.2 * When installing select 1.0.2
* *
* Installation instructions can be found at http://learn.sparkfun.com/pages/CustomBoardsArduino * Installation instructions can be found at https://learn.sparkfun.com:443/pages/CustomBoardsArduino
* Just use the above JSON URL instead of Sparkfun's JSON. * Just use the above JSON URL instead of Sparkfun's JSON.
* *
* Once installed select the Sanguino board and then select the CPU. * Once installed select the Sanguino board and then select the CPU.

View file

@ -263,6 +263,7 @@
#else #else
#define BTN_ENC AUX1_07 #define BTN_ENC AUX1_07
#endif #endif
#undef LCD_PINS_EN // not used, causes false pin conflict report
#else // !LCD_FOR_MELZI && !ZONESTAR_LCD && !LCD_I2C_PANELOLU2 #else // !LCD_FOR_MELZI && !ZONESTAR_LCD && !LCD_I2C_PANELOLU2

View file

@ -308,7 +308,7 @@
#define FORCE_SOFT_SPI #define FORCE_SOFT_SPI
#else #else
#error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, FYSETC_MINI_12864_2_1 and MKS_LCD12864A/B are currently supported on the BIGTREE_SKR_E3_DIP." #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, FYSETC_MINI_12864_2_1 and MKS_LCD12864A/B are currently supported on the SKR E3 DIP."
#endif #endif
#endif // HAS_WIRED_LCD #endif // HAS_WIRED_LCD

View file

@ -348,7 +348,7 @@
#define FORCE_SOFT_SPI #define FORCE_SOFT_SPI
#else #else
#error "Only CR10_STOCKDISPLAY, LCD_FOR_MELZI, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, TFTGLCD_PANEL_(SPI|I2C), FYSETC_MINI_12864_2_1, MKS_MINI_12864_V3, and BTT_MINI_12864 are currently supported on the BIGTREE_SKR_MINI_E3." #error "Only CR10_STOCKDISPLAY, LCD_FOR_MELZI, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, TFTGLCD_PANEL_(SPI|I2C), FYSETC_MINI_12864_2_1, MKS_MINI_12864_V3, and BTT_MINI_12864 are currently supported on the SKR Mini E3."
#endif #endif
#endif // HAS_WIRED_LCD #endif // HAS_WIRED_LCD

View file

@ -161,6 +161,7 @@
#define LCD_SDSS PD5 // 53 #define LCD_SDSS PD5 // 53
#define SD_DETECT_PIN -1 #define SD_DETECT_PIN -1
#define KILL_PIN PC9 // 41 #define KILL_PIN PC9 // 41
#undef LCD_PINS_EN // not used, causes false pin conflict report
#elif ENABLED(LCD_I2C_VIKI) #elif ENABLED(LCD_I2C_VIKI)

View file

@ -282,7 +282,7 @@
#endif #endif
#else #else
#error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and TFTGLCD_PANEL_(SPI|I2C) are currently supported on the BIGTREE_SKR_MINI_E3." #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and TFTGLCD_PANEL_(SPI|I2C) are currently supported on the SKR Mini E3."
#endif #endif
#endif // HAS_WIRED_LCD #endif // HAS_WIRED_LCD

View file

@ -24,7 +24,7 @@
/** /**
* Pin assignments for the RUMBA32 * Pin assignments for the RUMBA32
* *
* https://aus3d.com.au/rumba32 * https://aus3d.com.au/products/rumba32-control-board
* https://github.com/Aus3D/RUMBA32 * https://github.com/Aus3D/RUMBA32
*/ */

View file

@ -247,7 +247,7 @@
#define LCD_BACKLIGHT_PIN -1 #define LCD_BACKLIGHT_PIN -1
#define NEOPIXEL_PIN EXP1_02_PIN #define NEOPIXEL_PIN EXP1_02_PIN
#else #else
#error "Only FYSETC_MINI_12864_2_1 / MKS_MINI_12864_V3 / BTT_MINI_12864 / BEEZ_MINI_12864 are currently supported on the BIGTREE_SKR_MINI_E3 with SKR_MINI_SCREEN_ADAPTER." #error "Only FYSETC_MINI_12864_2_1 / MKS_MINI_12864_V3 / BTT_MINI_12864 / BEEZ_MINI_12864 are currently supported on the SKR Mini E3 with SKR_MINI_SCREEN_ADAPTER."
#endif #endif
#else #else
@ -374,7 +374,7 @@
#define LCD_BACKLIGHT_PIN -1 #define LCD_BACKLIGHT_PIN -1
#else #else
#error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, FYSETC_MINI_12864_2_1, and TFTGLCD_PANEL_(SPI|I2C) are currently supported on the BIGTREE_SKR_MINI_E3." #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, FYSETC_MINI_12864_2_1, and TFTGLCD_PANEL_(SPI|I2C) are currently supported on the SKR Mini E3."
#endif #endif
#endif // SKR_MINI_SCREEN_ADAPTER #endif // SKR_MINI_SCREEN_ADAPTER

View file

@ -442,7 +442,7 @@
#define NEOPIXEL_PIN EXP1_06_PIN #define NEOPIXEL_PIN EXP1_06_PIN
#elif HAS_WIRED_LCD #elif HAS_WIRED_LCD
#error "Only BTT_MINI_12864 (BTT Mini 12864 V2.0 with FPC cable) is currently supported on the BIGTREE_OCTOPUS_MAX_EZ." #error "Only BTT_MINI_12864 (BTT Mini 12864 V2.0 with FPC cable) is currently supported on the Octopus Max EZ."
#endif #endif
// //

View file

@ -160,6 +160,7 @@
#define BTN_ENC 41 // F3 JP2-4 #define BTN_ENC 41 // F3 JP2-4
#define SDSS 38 // F0 B-THERM connector - use SD card on Panelolu2 #define SDSS 38 // F0 B-THERM connector - use SD card on Panelolu2
#undef LCD_PINS_EN // not used, causes false pin conflict report
#else #else

View file

@ -532,6 +532,59 @@ MARLIN_TEST(types, Flags_32) {
TEST_ASSERT_EQUAL(4, flags.size()); TEST_ASSERT_EQUAL(4, flags.size());
} }
MARLIN_TEST(types, Flags_64) {
Flags<64> flags;
flags.reset();
TEST_ASSERT_EQUAL(0, flags.b);
flags.set(0, true);
flags.set(63, true);
TEST_ASSERT_EQUAL(9223372036854775809ULL, flags.b);
flags.clear(0);
flags.clear(63);
TEST_ASSERT_EQUAL(0, flags.b);
flags.set(0, true);
flags.set(63, true);
TEST_ASSERT_EQUAL(true, flags.test(0));
TEST_ASSERT_EQUAL(true, flags.test(63));
TEST_ASSERT_EQUAL(false, flags.test(1));
TEST_ASSERT_EQUAL(false, flags.test(62));
TEST_ASSERT_EQUAL(true, flags[0]);
TEST_ASSERT_EQUAL(true, flags[63]);
TEST_ASSERT_EQUAL(false, flags[1]);
TEST_ASSERT_EQUAL(false, flags[62]);
TEST_ASSERT_EQUAL(8, flags.size());
}
MARLIN_TEST(types, Flags_302) {
Flags<302> flags;
flags.reset();
TEST_ASSERT_EQUAL(false, (bool)flags);
flags.set(0, true);
flags.set(301, true);
TEST_ASSERT_EQUAL(true, (bool)flags);
TEST_ASSERT_EQUAL(true, flags.test(0));
TEST_ASSERT_EQUAL(true, flags.test(301));
TEST_ASSERT_EQUAL(false, flags.test(1));
TEST_ASSERT_EQUAL(false, flags.test(300));
TEST_ASSERT_EQUAL(true, flags[0]);
TEST_ASSERT_EQUAL(true, flags[301]);
TEST_ASSERT_EQUAL(false, flags[1]);
TEST_ASSERT_EQUAL(false, flags[300]);
TEST_ASSERT_EQUAL(38, flags.size());
}
MARLIN_TEST(types, AxisFlags_const_as_bools) { MARLIN_TEST(types, AxisFlags_const_as_bools) {
const AxisFlags axis_flags_const_false = {0}; const AxisFlags axis_flags_const_false = {0};
TEST_ASSERT_FALSE(axis_flags_const_false); TEST_ASSERT_FALSE(axis_flags_const_false);

View file

@ -15,7 +15,7 @@
] ]
], ],
"mcu": "stm32f407vgt6", "mcu": "stm32f407vgt6",
"variant": "MARLIN_BIGTREE_BTT002" "variant": "MARLIN_BTT_BTT002"
}, },
"debug": { "debug": {
"jlink_device": "STM32F407VG", "jlink_device": "STM32F407VG",

View file

@ -15,7 +15,7 @@
] ]
], ],
"mcu": "stm32f407vet6", "mcu": "stm32f407vet6",
"variant": "MARLIN_BIGTREE_BTT002" "variant": "MARLIN_BTT_BTT002"
}, },
"debug": { "debug": {
"jlink_device": "STM32F407VE", "jlink_device": "STM32F407VE",

View file

@ -15,7 +15,7 @@
] ]
], ],
"mcu": "stm32f407zgt6", "mcu": "stm32f407zgt6",
"variant": "MARLIN_BIGTREE_GTR_V1" "variant": "MARLIN_BTT_GTR_V1"
}, },
"debug": { "debug": {
"jlink_device": "STM32F407ZG", "jlink_device": "STM32F407ZG",

View file

@ -5,7 +5,7 @@
"f_cpu": "168000000L", "f_cpu": "168000000L",
"mcu": "stm32f429zgt6", "mcu": "stm32f429zgt6",
"product_line": "STM32F429xx", "product_line": "STM32F429xx",
"variant": "MARLIN_BIGTREE_OCTOPUS_PRO_V1_F429" "variant": "MARLIN_BTT_OCTOPUS_PRO_V1_F429"
}, },
"connectivity": [ "connectivity": [
"can" "can"

View file

@ -4,7 +4,7 @@
"extra_flags": "-DSTM32F446xx", "extra_flags": "-DSTM32F446xx",
"f_cpu": "180000000L", "f_cpu": "180000000L",
"mcu": "stm32f446zet6", "mcu": "stm32f446zet6",
"variant": "MARLIN_BIGTREE_OCTOPUS_V1" "variant": "MARLIN_BTT_OCTOPUS_V1"
}, },
"connectivity": [ "connectivity": [
"can" "can"

View file

@ -15,7 +15,7 @@
] ]
], ],
"mcu": "stm32f407zgt6", "mcu": "stm32f407zgt6",
"variant": "MARLIN_BIGTREE_SKR_PRO_11" "variant": "MARLIN_BTT_SKR_PRO_11"
}, },
"debug": { "debug": {
"jlink_device": "STM32F407ZG", "jlink_device": "STM32F407ZG",

View file

@ -20,7 +20,7 @@
"showDevDebugOutput": false, "showDevDebugOutput": false,
"configFiles": [ "interface/stlink.cfg", "target/stm32f4x.cfg" ], "configFiles": [ "interface/stlink.cfg", "target/stm32f4x.cfg" ],
"device": "stlink", "device": "stlink",
"executable": "${workspaceRoot}/.pio/build/BIGTREE_SKR_2_USB_debug/firmware.elf", "executable": "${workspaceRoot}/.pio/build/STM32F407VG_btt_USB_debug/firmware.elf",
"openOCDLaunchCommands": [ "init", "reset init" ], "openOCDLaunchCommands": [ "init", "reset init" ],
"svdFile": "${env:HOME}/.platformio/platforms/ststm32@12.1.1/misc/svd/STM32F40x.svd", "svdFile": "${env:HOME}/.platformio/platforms/ststm32@12.1.1/misc/svd/STM32F40x.svd",
}, },

View file

@ -62,6 +62,28 @@ if pioutil.is_pio_build():
if 'MARLIN_FEATURES' not in env: if 'MARLIN_FEATURES' not in env:
raise SystemExit("Error: this script should be used after common Marlin scripts.") raise SystemExit("Error: this script should be used after common Marlin scripts.")
# Useful values
project_dir = Path(env['PROJECT_DIR'])
config_files = ("Configuration.h", "Configuration_adv.h")
#
# Update old macros BOTH and EITHER in configuration files
#
conf_modified = False
for f in config_files:
conf_path = project_dir / "Marlin" / f
if conf_path.is_file():
with open(conf_path, 'r', encoding="utf8") as file:
text = file.read()
modified_text = text.replace("BOTH(", "ALL(").replace("EITHER(", "ANY(")
if text != modified_text:
conf_modified = True
with open(conf_path, 'w') as file:
file.write(modified_text)
if conf_modified:
raise SystemExit('WARNING: Configuration files needed an update to remove incompatible items. Try the build again to use the updated files.')
if len(env['MARLIN_FEATURES']) == 0: if len(env['MARLIN_FEATURES']) == 0:
raise SystemExit("Error: Failed to parse Marlin features. See previous error messages.") raise SystemExit("Error: Failed to parse Marlin features. See previous error messages.")
@ -78,10 +100,6 @@ if pioutil.is_pio_build():
( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) )
raise SystemExit(err) raise SystemExit(err)
# Useful values
project_dir = Path(env['PROJECT_DIR'])
config_files = ("Configuration.h", "Configuration_adv.h")
# #
# Check for Config files in two common incorrect places # Check for Config files in two common incorrect places
# #
@ -140,22 +158,5 @@ if pioutil.is_pio_build():
err = "ERROR: FILAMENT_RUNOUT_SCRIPT needs a %c parameter (e.g., \"M600 T%c\") when NUM_RUNOUT_SENSORS is > 1" err = "ERROR: FILAMENT_RUNOUT_SCRIPT needs a %c parameter (e.g., \"M600 T%c\") when NUM_RUNOUT_SENSORS is > 1"
raise SystemExit(err) raise SystemExit(err)
#
# Update old macros BOTH and EITHER in configuration files
#
conf_modified = False
for f in config_files:
conf_path = project_dir / "Marlin" / f
if conf_path.is_file():
with open(conf_path, 'r', encoding="utf8") as file:
text = file.read()
modified_text = text.replace("BOTH(", "ALL(").replace("EITHER(", "ANY(")
if text != modified_text:
conf_modified = True
with open(conf_path, 'w') as file:
file.write(modified_text)
if conf_modified:
raise SystemExit('WARNING: Configuration files needed an update to remove incompatible items. Try the build again to use the updated files.')
sanity_check_target() sanity_check_target()

View file

@ -31,7 +31,6 @@ def enabled_defines(filepath):
our crude scraping method and the actual compiler output. our crude scraping method and the actual compiler output.
We end up with the actual configured state, We end up with the actual configured state,
better than what the config files say. You can then use the better than what the config files say. You can then use the
a decent reflection of all enabled options that (probably) came from
resulting config.ini to produce more exact configuration files. resulting config.ini to produce more exact configuration files.
''' '''
outdict = {} outdict = {}
@ -188,7 +187,7 @@ def compute_build_signature(env):
ini_fmt = '{0:40} = {1}' ini_fmt = '{0:40} = {1}'
ext_fmt = '{0:40} {1}' ext_fmt = '{0:40} {1}'
ignore = ('CONFIGURATION_H_VERSION', 'CONFIGURATION_ADV_H_VERSION', 'CONFIG_EXPORT') ignore = ('CONFIGURATION_H_VERSION', 'CONFIGURATION_ADV_H_VERSION', 'CONFIG_EXAMPLES_DIR', 'CONFIG_EXPORT')
if extended_dump: if extended_dump:
# Extended export will dump config options by section # Extended export will dump config options by section

Some files were not shown because too many files have changed in this diff Show more