Apply loop shorthand macros (#17159)

2.0.x
Scott Lahteine 5 years ago committed by GitHub
parent a96be32fae
commit 118bd2f8b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -197,7 +197,7 @@ void spiBegin() {
// output pin high - like sending 0xFF // output pin high - like sending 0xFF
WRITE(MOSI_PIN, HIGH); WRITE(MOSI_PIN, HIGH);
for (uint8_t i = 0; i < 8; i++) { LOOP_L_N(i, 8) {
WRITE(SCK_PIN, HIGH); WRITE(SCK_PIN, HIGH);
nop; // adjust so SCK is nice nop; // adjust so SCK is nice
@ -224,7 +224,7 @@ void spiBegin() {
void spiSend(uint8_t data) { void spiSend(uint8_t data) {
// no interrupts during byte send - about 8µs // no interrupts during byte send - about 8µs
cli(); cli();
for (uint8_t i = 0; i < 8; i++) { LOOP_L_N(i, 8) {
WRITE(SCK_PIN, LOW); WRITE(SCK_PIN, LOW);
WRITE(MOSI_PIN, data & 0x80); WRITE(MOSI_PIN, data & 0x80);
data <<= 1; data <<= 1;

@ -682,7 +682,7 @@
// Round correctly so that print(1.999, 2) prints as "2.00" // Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5; double rounding = 0.5;
for (uint8_t i = 0; i < digits; ++i) rounding *= 0.1; LOOP_L_N(i, digits) rounding *= 0.1;
number += rounding; number += rounding;
// Extract the integer part of the number and print it // Extract the integer part of the number and print it

@ -167,7 +167,7 @@ void set_pwm_frequency(const pin_t pin, int f_desired) {
uint16_t prescaler[] = { 0, 1, 8, /*TIMER2 ONLY*/32, 64, /*TIMER2 ONLY*/128, 256, 1024 }; uint16_t prescaler[] = { 0, 1, 8, /*TIMER2 ONLY*/32, 64, /*TIMER2 ONLY*/128, 256, 1024 };
// loop over prescaler values // loop over prescaler values
for (uint8_t i = 1; i < 8; i++) { LOOP_S_L_N(i, 1, 8) {
uint16_t res_temp_fast = 255, res_temp_phase_correct = 255; uint16_t res_temp_fast = 255, res_temp_phase_correct = 255;
if (timer.n == 2) { if (timer.n == 2) {
// No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP

@ -70,12 +70,12 @@
void PRINT_ARRAY_NAME(uint8_t x) { void PRINT_ARRAY_NAME(uint8_t x) {
char *name_mem_pointer = (char*)pgm_read_ptr(&pin_array[x].name); char *name_mem_pointer = (char*)pgm_read_ptr(&pin_array[x].name);
for (uint8_t y = 0; y < MAX_NAME_LENGTH; y++) { LOOP_L_N(y, MAX_NAME_LENGTH) {
char temp_char = pgm_read_byte(name_mem_pointer + y); char temp_char = pgm_read_byte(name_mem_pointer + y);
if (temp_char != 0) if (temp_char != 0)
SERIAL_CHAR(temp_char); SERIAL_CHAR(temp_char);
else { else {
for (uint8_t i = 0; i < MAX_NAME_LENGTH - y; i++) SERIAL_CHAR(' '); LOOP_L_N(i, MAX_NAME_LENGTH - y) SERIAL_CHAR(' ');
break; break;
} }
} }

@ -88,7 +88,7 @@ void u8g_spiSend_sw_AVR_mode_0(uint8_t val) {
volatile uint8_t *outData = u8g_outData, volatile uint8_t *outData = u8g_outData,
*outClock = u8g_outClock; *outClock = u8g_outClock;
U8G_ATOMIC_START(); U8G_ATOMIC_START();
for (uint8_t i = 0; i < 8; i++) { LOOP_L_N(i, 8) {
if (val & 0x80) if (val & 0x80)
*outData |= bitData; *outData |= bitData;
else else
@ -108,7 +108,7 @@ void u8g_spiSend_sw_AVR_mode_3(uint8_t val) {
volatile uint8_t *outData = u8g_outData, volatile uint8_t *outData = u8g_outData,
*outClock = u8g_outClock; *outClock = u8g_outClock;
U8G_ATOMIC_START(); U8G_ATOMIC_START();
for (uint8_t i = 0; i < 8; i++) { LOOP_L_N(i, 8) {
*outClock &= bitNotClock; *outClock &= bitNotClock;
if (val & 0x80) if (val & 0x80)
*outData |= bitData; *outData |= bitData;

@ -606,7 +606,7 @@ void MarlinSerial<Cfg>::printFloat(double number, uint8_t digits) {
// Round correctly so that print(1.999, 2) prints as "2.00" // Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5; double rounding = 0.5;
for (uint8_t i = 0; i < digits; ++i) rounding *= 0.1; LOOP_L_N(i, digits) rounding *= 0.1;
number += rounding; number += rounding;
// Extract the integer part of the number and print it // Extract the integer part of the number and print it

@ -259,7 +259,7 @@ void MarlinSerialUSB::printFloat(double number, uint8_t digits) {
// Round correctly so that print(1.999, 2) prints as "2.00" // Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5; double rounding = 0.5;
for (uint8_t i = 0; i < digits; ++i) LOOP_L_N(i, digits)
rounding *= 0.1; rounding *= 0.1;
number += rounding; number += rounding;

@ -80,7 +80,7 @@ Pio *SCK_pPio, *MOSI_pPio;
uint32_t SCK_dwMask, MOSI_dwMask; uint32_t SCK_dwMask, MOSI_dwMask;
void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz
for (uint8_t i = 0; i < 8; i++) { LOOP_L_N(i, 8) {
if (val & 0x80) if (val & 0x80)
MOSI_pPio->PIO_SODR = MOSI_dwMask; MOSI_pPio->PIO_SODR = MOSI_dwMask;
else else
@ -94,7 +94,7 @@ void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz
} }
void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz
for (uint8_t i = 0; i < 8; i++) { LOOP_L_N(i, 8) {
SCK_pPio->PIO_CODR = SCK_dwMask; SCK_pPio->PIO_CODR = SCK_dwMask;
DELAY_NS(50); DELAY_NS(50);
if (val & 0x80) if (val & 0x80)

@ -63,7 +63,7 @@ extern PWM_map ISR_table[NUM_PWMS];
extern uint32_t motor_current_setting[3]; extern uint32_t motor_current_setting[3];
#define IR_BIT(p) (WITHIN(p, 0, 3) ? (p) : (p) + 4) #define IR_BIT(p) (WITHIN(p, 0, 3) ? (p) : (p) + 4)
#define COPY_ACTIVE_TABLE() do{ for (uint8_t i = 0; i < 6 ; i++) work_table[i] = active_table[i]; }while(0) #define COPY_ACTIVE_TABLE() do{ LOOP_L_N(i, 6) work_table[i] = active_table[i]; }while(0)
#define PWM_MR0 19999 // base repetition rate minus one count - 20mS #define PWM_MR0 19999 // base repetition rate minus one count - 20mS
#define PWM_PR 24 // prescaler value - prescaler divide by 24 + 1 - 1 MHz output #define PWM_PR 24 // prescaler value - prescaler divide by 24 + 1 - 1 MHz output

@ -67,7 +67,7 @@ void HAL_init() {
#endif #endif
// Flash status LED 3 times to indicate Marlin has started booting // Flash status LED 3 times to indicate Marlin has started booting
for (uint8_t i = 0; i < 6; ++i) { LOOP_L_N(i, 6) {
TOGGLE(LED_PIN); TOGGLE(LED_PIN);
delay(100); delay(100);
} }

@ -73,7 +73,7 @@
uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) { uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) {
for (uint8_t i = 0; i < 8; i++) { LOOP_L_N(i, 8) {
if (spi_speed == 0) { if (spi_speed == 0) {
LPC176x::gpio_set(mosi_pin, !!(b & 0x80)); LPC176x::gpio_set(mosi_pin, !!(b & 0x80));
LPC176x::gpio_set(sck_pin, HIGH); LPC176x::gpio_set(sck_pin, HIGH);
@ -83,16 +83,16 @@ uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck
} }
else { else {
const uint8_t state = (b & 0x80) ? HIGH : LOW; const uint8_t state = (b & 0x80) ? HIGH : LOW;
for (uint8_t j = 0; j < spi_speed; j++) LOOP_L_N(j, spi_speed)
LPC176x::gpio_set(mosi_pin, state); LPC176x::gpio_set(mosi_pin, state);
for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++) LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1))
LPC176x::gpio_set(sck_pin, HIGH); LPC176x::gpio_set(sck_pin, HIGH);
b <<= 1; b <<= 1;
if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1; if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1;
for (uint8_t j = 0; j < spi_speed; j++) LOOP_L_N(j, spi_speed)
LPC176x::gpio_set(sck_pin, LOW); LPC176x::gpio_set(sck_pin, LOW);
} }
} }
@ -102,7 +102,7 @@ uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck
uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) { uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) {
for (uint8_t i = 0; i < 8; i++) { LOOP_L_N(i, 8) {
const uint8_t state = (b & 0x80) ? HIGH : LOW; const uint8_t state = (b & 0x80) ? HIGH : LOW;
if (spi_speed == 0) { if (spi_speed == 0) {
LPC176x::gpio_set(sck_pin, LOW); LPC176x::gpio_set(sck_pin, LOW);
@ -111,13 +111,13 @@ uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck
LPC176x::gpio_set(sck_pin, HIGH); LPC176x::gpio_set(sck_pin, HIGH);
} }
else { else {
for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++) LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1))
LPC176x::gpio_set(sck_pin, LOW); LPC176x::gpio_set(sck_pin, LOW);
for (uint8_t j = 0; j < spi_speed; j++) LOOP_L_N(j, spi_speed)
LPC176x::gpio_set(mosi_pin, state); LPC176x::gpio_set(mosi_pin, state);
for (uint8_t j = 0; j < spi_speed; j++) LOOP_L_N(j, spi_speed)
LPC176x::gpio_set(sck_pin, HIGH); LPC176x::gpio_set(sck_pin, HIGH);
} }
b <<= 1; b <<= 1;

@ -478,10 +478,10 @@ void HAL_adc_init() {
#if ADC_IS_REQUIRED #if ADC_IS_REQUIRED
memset(HAL_adc_results, 0xFF, sizeof(HAL_adc_results)); // Fill result with invalid values memset(HAL_adc_results, 0xFF, sizeof(HAL_adc_results)); // Fill result with invalid values
for (uint8_t pi = 0; pi < COUNT(adc_pins); ++pi) LOOP_L_N(pi, COUNT(adc_pins))
pinPeripheral(adc_pins[pi], PIO_ANALOG); pinPeripheral(adc_pins[pi], PIO_ANALOG);
for (uint8_t ai = FIRST_ADC; ai <= LAST_ADC; ++ai) { LOOP_S_LE_N(ai, FIRST_ADC, LAST_ADC) {
Adc* adc = ((Adc*[])ADC_INSTS)[ai]; Adc* adc = ((Adc*[])ADC_INSTS)[ai];
// ADC clock setup // ADC clock setup
@ -513,7 +513,7 @@ void HAL_adc_init() {
void HAL_adc_start_conversion(const uint8_t adc_pin) { void HAL_adc_start_conversion(const uint8_t adc_pin) {
#if ADC_IS_REQUIRED #if ADC_IS_REQUIRED
for (uint8_t pi = 0; pi < COUNT(adc_pins); ++pi) { LOOP_L_N(pi, COUNT(adc_pins)) {
if (adc_pin == adc_pins[pi]) { if (adc_pin == adc_pins[pi]) {
HAL_adc_result = HAL_adc_results[pi]; HAL_adc_result = HAL_adc_results[pi];
return; return;

@ -27,7 +27,7 @@
GPIO_TypeDef* FastIOPortMap[LastPort + 1]; GPIO_TypeDef* FastIOPortMap[LastPort + 1];
void FastIO_init() { void FastIO_init() {
for (uint8_t i = 0; i < NUM_DIGITAL_PINS; i++) LOOP_L_N(i, NUM_DIGITAL_PINS)
FastIOPortMap[STM_PORT(digitalPin[i])] = get_GPIO_Port(STM_PORT(digitalPin[i])); FastIOPortMap[STM_PORT(digitalPin[i])] = get_GPIO_Port(STM_PORT(digitalPin[i]));
} }

@ -32,7 +32,7 @@
static uint8_t SPI_speed = SPI_SPEED; static uint8_t SPI_speed = SPI_SPEED;
static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) { static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) {
for (uint8_t i = 0; i < 8; i++) { LOOP_L_N(i, 8) {
if (spi_speed == 0) { if (spi_speed == 0) {
WRITE(DOGLCD_MOSI, !!(b & 0x80)); WRITE(DOGLCD_MOSI, !!(b & 0x80));
WRITE(DOGLCD_SCK, HIGH); WRITE(DOGLCD_SCK, HIGH);
@ -42,16 +42,16 @@ static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, c
} }
else { else {
const uint8_t state = (b & 0x80) ? HIGH : LOW; const uint8_t state = (b & 0x80) ? HIGH : LOW;
for (uint8_t j = 0; j < spi_speed; j++) LOOP_L_N(j, spi_speed)
WRITE(DOGLCD_MOSI, state); WRITE(DOGLCD_MOSI, state);
for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++) LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1))
WRITE(DOGLCD_SCK, HIGH); WRITE(DOGLCD_SCK, HIGH);
b <<= 1; b <<= 1;
if (miso_pin >= 0 && READ(miso_pin)) b |= 1; if (miso_pin >= 0 && READ(miso_pin)) b |= 1;
for (uint8_t j = 0; j < spi_speed; j++) LOOP_L_N(j, spi_speed)
WRITE(DOGLCD_SCK, LOW); WRITE(DOGLCD_SCK, LOW);
} }
} }
@ -59,7 +59,7 @@ static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, c
} }
static inline uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) { static inline uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) {
for (uint8_t i = 0; i < 8; i++) { LOOP_L_N(i, 8) {
const uint8_t state = (b & 0x80) ? HIGH : LOW; const uint8_t state = (b & 0x80) ? HIGH : LOW;
if (spi_speed == 0) { if (spi_speed == 0) {
WRITE(DOGLCD_SCK, LOW); WRITE(DOGLCD_SCK, LOW);
@ -68,13 +68,13 @@ static inline uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, c
WRITE(DOGLCD_SCK, HIGH); WRITE(DOGLCD_SCK, HIGH);
} }
else { else {
for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++) LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1))
WRITE(DOGLCD_SCK, LOW); WRITE(DOGLCD_SCK, LOW);
for (uint8_t j = 0; j < spi_speed; j++) LOOP_L_N(j, spi_speed)
WRITE(DOGLCD_MOSI, state); WRITE(DOGLCD_MOSI, state);
for (uint8_t j = 0; j < spi_speed; j++) LOOP_L_N(j, spi_speed)
WRITE(DOGLCD_SCK, HIGH); WRITE(DOGLCD_SCK, HIGH);
} }
b <<= 1; b <<= 1;

@ -102,7 +102,7 @@ void eeprom_read_block(void *__dst, const void *__src, size_t __n) {
uint16_t data = 0xFF; uint16_t data = 0xFF;
uint16_t eeprom_address = unsigned(__src); uint16_t eeprom_address = unsigned(__src);
for (uint8_t c = 0; c < __n; c++) { LOOP_L_N(c, __n) {
EE_ReadVariable(eeprom_address+c, &data); EE_ReadVariable(eeprom_address+c, &data);
*((uint8_t*)__dst + c) = data; *((uint8_t*)__dst + c) = data;
} }

@ -68,7 +68,7 @@ uint8_t ServoCount = 0; // the total number of attached
static boolean isTimerActive(timer16_Sequence_t timer) { static boolean isTimerActive(timer16_Sequence_t timer) {
// returns true if any servo is active on this timer // returns true if any servo is active on this timer
for (uint8_t channel = 0; channel < SERVOS_PER_TIMER; channel++) { LOOP_L_N(channel, SERVOS_PER_TIMER) {
if (SERVO(timer, channel).Pin.isActive) if (SERVO(timer, channel).Pin.isActive)
return true; return true;
} }

@ -274,7 +274,7 @@ void setup_powerhold() {
bool pin_is_protected(const pin_t pin) { bool pin_is_protected(const pin_t pin) {
static const pin_t sensitive_pins[] PROGMEM = SENSITIVE_PINS; static const pin_t sensitive_pins[] PROGMEM = SENSITIVE_PINS;
for (uint8_t i = 0; i < COUNT(sensitive_pins); i++) { LOOP_L_N(i, COUNT(sensitive_pins)) {
pin_t sensitive_pin; pin_t sensitive_pin;
memcpy_P(&sensitive_pin, &sensitive_pins[i], sizeof(pin_t)); memcpy_P(&sensitive_pin, &sensitive_pins[i], sizeof(pin_t));
if (pin == sensitive_pin) return true; if (pin == sensitive_pin) return true;

@ -248,6 +248,11 @@
#define _JOIN_1(O) (O) #define _JOIN_1(O) (O)
#define JOIN_N(N,C,V...) (DO(JOIN,C,LIST_N(N,V))) #define JOIN_N(N,C,V...) (DO(JOIN,C,LIST_N(N,V)))
#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=(S); VAR<=(N); VAR++)
#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=(S); VAR<(N); VAR++)
#define LOOP_LE_N(VAR, N) LOOP_S_LE_N(VAR, 0, N)
#define LOOP_L_N(VAR, N) LOOP_S_L_N(VAR, 0, N)
#define NOOP (void(0)) #define NOOP (void(0))
#define CEILING(x,y) (((x) + (y) - 1) / (y)) #define CEILING(x,y) (((x) + (y) - 1) / (y))

@ -50,12 +50,6 @@ enum AxisEnum : uint8_t {
// //
// Loop over XYZE axes // Loop over XYZE axes
// //
#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=(S); VAR<=(N); VAR++)
#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=(S); VAR<(N); VAR++)
#define LOOP_LE_N(VAR, N) LOOP_S_LE_N(VAR, 0, N)
#define LOOP_L_N(VAR, N) LOOP_S_L_N(VAR, 0, N)
#define LOOP_XYZ(VAR) LOOP_S_LE_N(VAR, X_AXIS, Z_AXIS) #define LOOP_XYZ(VAR) LOOP_S_LE_N(VAR, X_AXIS, Z_AXIS)
#define LOOP_XYZE(VAR) LOOP_S_LE_N(VAR, X_AXIS, E_AXIS) #define LOOP_XYZE(VAR) LOOP_S_LE_N(VAR, X_AXIS, E_AXIS)
#define LOOP_XYZE_N(VAR) LOOP_S_L_N(VAR, X_AXIS, XYZE_N) #define LOOP_XYZE_N(VAR) LOOP_S_L_N(VAR, X_AXIS, XYZE_N)

@ -115,8 +115,8 @@ void extrapolate_unprobed_bed_level() {
ylen = ctry1; ylen = ctry1;
#endif #endif
for (uint8_t xo = 0; xo <= xlen; xo++) LOOP_LE_N(xo, xlen)
for (uint8_t yo = 0; yo <= ylen; yo++) { LOOP_LE_N(yo, ylen) {
uint8_t x2 = ctrx2 + xo, y2 = ctry2 + yo; uint8_t x2 = ctrx2 + xo, y2 = ctry2 + yo;
#ifndef HALF_IN_X #ifndef HALF_IN_X
const uint8_t x1 = ctrx1 - xo; const uint8_t x1 = ctrx1 - xo;
@ -209,8 +209,8 @@ void print_bilinear_leveling_grid() {
static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const float &tx, const float &ty) { static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const float &tx, const float &ty) {
float row[4], column[4]; float row[4], column[4];
for (uint8_t i = 0; i < 4; i++) { LOOP_L_N(i, 4) {
for (uint8_t j = 0; j < 4; j++) { LOOP_L_N(j, 4) {
column[j] = bed_level_virt_coord(i + x - 1, j + y - 1); column[j] = bed_level_virt_coord(i + x - 1, j + y - 1);
} }
row[i] = bed_level_virt_cmr(column, 1, ty); row[i] = bed_level_virt_cmr(column, 1, ty);
@ -221,11 +221,11 @@ void print_bilinear_leveling_grid() {
void bed_level_virt_interpolate() { void bed_level_virt_interpolate() {
bilinear_grid_spacing_virt = bilinear_grid_spacing / (BILINEAR_SUBDIVISIONS); bilinear_grid_spacing_virt = bilinear_grid_spacing / (BILINEAR_SUBDIVISIONS);
bilinear_grid_factor_virt = bilinear_grid_spacing_virt.reciprocal(); bilinear_grid_factor_virt = bilinear_grid_spacing_virt.reciprocal();
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) LOOP_L_N(y, GRID_MAX_POINTS_Y)
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) LOOP_L_N(x, GRID_MAX_POINTS_X)
for (uint8_t ty = 0; ty < BILINEAR_SUBDIVISIONS; ty++) LOOP_L_N(ty, BILINEAR_SUBDIVISIONS)
for (uint8_t tx = 0; tx < BILINEAR_SUBDIVISIONS; tx++) { LOOP_L_N(tx, BILINEAR_SUBDIVISIONS) {
if ((ty && y == GRID_MAX_POINTS_Y - 1) || (tx && x == GRID_MAX_POINTS_X - 1)) if ((ty && y == (GRID_MAX_POINTS_Y) - 1) || (tx && x == (GRID_MAX_POINTS_X) - 1))
continue; continue;
z_values_virt[x * (BILINEAR_SUBDIVISIONS) + tx][y * (BILINEAR_SUBDIVISIONS) + ty] = z_values_virt[x * (BILINEAR_SUBDIVISIONS) + tx][y * (BILINEAR_SUBDIVISIONS) + ty] =
bed_level_virt_2cmr( bed_level_virt_2cmr(

@ -143,8 +143,7 @@ void reset_bed_level() {
#elif ENABLED(AUTO_BED_LEVELING_BILINEAR) #elif ENABLED(AUTO_BED_LEVELING_BILINEAR)
bilinear_start.reset(); bilinear_start.reset();
bilinear_grid_spacing.reset(); bilinear_grid_spacing.reset();
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y) {
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) {
z_values[x][y] = NAN; z_values[x][y] = NAN;
#if ENABLED(EXTENSIBLE_UI) #if ENABLED(EXTENSIBLE_UI)
ExtUI::onMeshUpdate(x, y, 0); ExtUI::onMeshUpdate(x, y, 0);
@ -173,7 +172,7 @@ void reset_bed_level() {
*/ */
void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, element_2d_fn fn) { void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, element_2d_fn fn) {
#ifndef SCAD_MESH_OUTPUT #ifndef SCAD_MESH_OUTPUT
for (uint8_t x = 0; x < sx; x++) { LOOP_L_N(x, sx) {
serial_spaces(precision + (x < 10 ? 3 : 2)); serial_spaces(precision + (x < 10 ? 3 : 2));
SERIAL_ECHO(int(x)); SERIAL_ECHO(int(x));
} }
@ -182,14 +181,14 @@ void reset_bed_level() {
#ifdef SCAD_MESH_OUTPUT #ifdef SCAD_MESH_OUTPUT
SERIAL_ECHOLNPGM("measured_z = ["); // open 2D array SERIAL_ECHOLNPGM("measured_z = ["); // open 2D array
#endif #endif
for (uint8_t y = 0; y < sy; y++) { LOOP_L_N(y, sy) {
#ifdef SCAD_MESH_OUTPUT #ifdef SCAD_MESH_OUTPUT
SERIAL_ECHOPGM(" ["); // open sub-array SERIAL_ECHOPGM(" ["); // open sub-array
#else #else
if (y < 10) SERIAL_CHAR(' '); if (y < 10) SERIAL_CHAR(' ');
SERIAL_ECHO(int(y)); SERIAL_ECHO(int(y));
#endif #endif
for (uint8_t x = 0; x < sx; x++) { LOOP_L_N(x, sx) {
SERIAL_CHAR(' '); SERIAL_CHAR(' ');
const float offset = fn(x, y); const float offset = fn(x, y);
if (!isnan(offset)) { if (!isnan(offset)) {
@ -202,7 +201,7 @@ void reset_bed_level() {
SERIAL_CHAR(' '); SERIAL_CHAR(' ');
SERIAL_ECHOPGM("NAN"); SERIAL_ECHOPGM("NAN");
#else #else
for (uint8_t i = 0; i < precision + 3; i++) LOOP_L_N(i, precision + 3)
SERIAL_CHAR(i ? '=' : ' '); SERIAL_CHAR(i ? '=' : ' ');
#endif #endif
} }

@ -40,9 +40,9 @@
mesh_bed_leveling::index_to_ypos[GRID_MAX_POINTS_Y]; mesh_bed_leveling::index_to_ypos[GRID_MAX_POINTS_Y];
mesh_bed_leveling::mesh_bed_leveling() { mesh_bed_leveling::mesh_bed_leveling() {
for (uint8_t i = 0; i < GRID_MAX_POINTS_X; ++i) LOOP_L_N(i, GRID_MAX_POINTS_X)
index_to_xpos[i] = MESH_MIN_X + i * (MESH_X_DIST); index_to_xpos[i] = MESH_MIN_X + i * (MESH_X_DIST);
for (uint8_t i = 0; i < GRID_MAX_POINTS_Y; ++i) LOOP_L_N(i, GRID_MAX_POINTS_Y)
index_to_ypos[i] = MESH_MIN_Y + i * (MESH_Y_DIST); index_to_ypos[i] = MESH_MIN_Y + i * (MESH_Y_DIST);
reset(); reset();
} }
@ -51,9 +51,7 @@
z_offset = 0; z_offset = 0;
ZERO(z_values); ZERO(z_values);
#if ENABLED(EXTENSIBLE_UI) #if ENABLED(EXTENSIBLE_UI)
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y) ExtUI::onMeshUpdate(x, y, 0);
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
ExtUI::onMeshUpdate(x, y, 0);
#endif #endif
} }

@ -52,9 +52,7 @@ public:
static void reset(); static void reset();
FORCE_INLINE static bool has_mesh() { FORCE_INLINE static bool has_mesh() {
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y) if (z_values[x][y]) return true;
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
if (z_values[x][y]) return true;
return false; return false;
} }

@ -49,7 +49,7 @@
void unified_bed_leveling::report_current_mesh() { void unified_bed_leveling::report_current_mesh() {
if (!leveling_is_valid()) return; if (!leveling_is_valid()) return;
SERIAL_ECHO_MSG(" G29 I99"); SERIAL_ECHO_MSG(" G29 I99");
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) LOOP_L_N(x, GRID_MAX_POINTS_X)
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
if (!isnan(z_values[x][y])) { if (!isnan(z_values[x][y])) {
SERIAL_ECHO_START(); SERIAL_ECHO_START();
@ -101,9 +101,7 @@
storage_slot = -1; storage_slot = -1;
ZERO(z_values); ZERO(z_values);
#if ENABLED(EXTENSIBLE_UI) #if ENABLED(EXTENSIBLE_UI)
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y) ExtUI::onMeshUpdate(x, y, 0);
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
ExtUI::onMeshUpdate(x, y, 0);
#endif #endif
if (was_enabled) report_current_position(); if (was_enabled) report_current_position();
} }
@ -114,15 +112,13 @@
} }
void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { void unified_bed_leveling::set_all_mesh_points_to_value(const float value) {
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) { GRID_LOOP(x, y) {
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) {
z_values[x][y] = value; z_values[x][y] = value;
#if ENABLED(EXTENSIBLE_UI) #if ENABLED(EXTENSIBLE_UI)
ExtUI::onMeshUpdate(x, y, value); ExtUI::onMeshUpdate(x, y, value);
#endif #endif
} }
} }
}
static void serial_echo_xy(const uint8_t sp, const int16_t x, const int16_t y) { static void serial_echo_xy(const uint8_t sp, const int16_t x, const int16_t y) {
SERIAL_ECHO_SP(sp); SERIAL_ECHO_SP(sp);
@ -190,7 +186,7 @@
} }
// Row Values (I indexes) // Row Values (I indexes)
for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { LOOP_L_N(i, GRID_MAX_POINTS_X) {
// Opening Brace or Space // Opening Brace or Space
const bool is_current = i == curr.x && j == curr.y; const bool is_current = i == curr.x && j == curr.y;

@ -298,9 +298,7 @@ class unified_bed_leveling {
#endif #endif
static inline bool mesh_is_valid() { static inline bool mesh_is_valid() {
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y) if (isnan(z_values[x][y])) return false;
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
if (isnan(z_values[x][y])) return false;
return true; return true;
} }

@ -365,8 +365,7 @@
#endif #endif
case 0: case 0:
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) { // Create a bowl shape - similar to GRID_LOOP(x, y) { // Create a bowl shape similar to a poorly-calibrated Delta
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) { // a poorly calibrated Delta.
const float p1 = 0.5f * (GRID_MAX_POINTS_X) - x, const float p1 = 0.5f * (GRID_MAX_POINTS_X) - x,
p2 = 0.5f * (GRID_MAX_POINTS_Y) - y; p2 = 0.5f * (GRID_MAX_POINTS_Y) - y;
z_values[x][y] += 2.0f * HYPOT(p1, p2); z_values[x][y] += 2.0f * HYPOT(p1, p2);
@ -374,16 +373,15 @@
ExtUI::onMeshUpdate(x, y, z_values[x][y]); ExtUI::onMeshUpdate(x, y, z_values[x][y]);
#endif #endif
} }
}
break; break;
case 1: case 1:
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) { // Create a diagonal line several Mesh cells thick that is raised LOOP_L_N(x, GRID_MAX_POINTS_X) { // Create a diagonal line several Mesh cells thick that is raised
z_values[x][x] += 9.999f; z_values[x][x] += 9.999f;
z_values[x][x + (x < GRID_MAX_POINTS_Y - 1) ? 1 : -1] += 9.999f; // We want the altered line several mesh points thick z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1] += 9.999f; // We want the altered line several mesh points thick
#if ENABLED(EXTENSIBLE_UI) #if ENABLED(EXTENSIBLE_UI)
ExtUI::onMeshUpdate(x, x, z_values[x][x]); ExtUI::onMeshUpdate(x, x, z_values[x][x]);
ExtUI::onMeshUpdate(x, (x + (x < GRID_MAX_POINTS_Y - 1) ? 1 : -1), z_values[x][x + (x < GRID_MAX_POINTS_Y - 1) ? 1 : -1]); ExtUI::onMeshUpdate(x, (x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1), z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1]);
#endif #endif
} }
@ -467,7 +465,7 @@
// //
// Manually Probe Mesh in areas that can't be reached by the probe // Manually Probe Mesh in areas that can't be reached by the probe
// //
SERIAL_ECHOLNPGM("Manually probing unreachable mesh locations."); SERIAL_ECHOLNPGM("Manually probing unreachable points.");
do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES);
if (parser.seen('C') && !xy_seen) { if (parser.seen('C') && !xy_seen) {
@ -537,9 +535,7 @@
if (cpos.x < 0) { if (cpos.x < 0) {
// No more REAL INVALID mesh points to populate, so we ASSUME // No more REAL INVALID mesh points to populate, so we ASSUME
// user meant to populate ALL INVALID mesh points to value // user meant to populate ALL INVALID mesh points to value
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = g29_constant;
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
if (isnan(z_values[x][y])) z_values[x][y] = g29_constant;
break; // No more invalid Mesh Points to populate break; // No more invalid Mesh Points to populate
} }
else { else {
@ -696,8 +692,7 @@
void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float value) { void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float value) {
float sum = 0; float sum = 0;
int n = 0; int n = 0;
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y)
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
if (!isnan(z_values[x][y])) { if (!isnan(z_values[x][y])) {
sum += z_values[x][y]; sum += z_values[x][y];
n++; n++;
@ -709,8 +704,7 @@
// Sum the squares of difference from mean // Sum the squares of difference from mean
// //
float sum_of_diff_squared = 0; float sum_of_diff_squared = 0;
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y)
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
if (!isnan(z_values[x][y])) if (!isnan(z_values[x][y]))
sum_of_diff_squared += sq(z_values[x][y] - mean); sum_of_diff_squared += sq(z_values[x][y] - mean);
@ -721,8 +715,7 @@
SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6);
if (cflag) if (cflag)
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y)
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
if (!isnan(z_values[x][y])) { if (!isnan(z_values[x][y])) {
z_values[x][y] -= mean + value; z_values[x][y] -= mean + value;
#if ENABLED(EXTENSIBLE_UI) #if ENABLED(EXTENSIBLE_UI)
@ -732,8 +725,7 @@
} }
void unified_bed_leveling::shift_mesh_height() { void unified_bed_leveling::shift_mesh_height() {
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y)
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++)
if (!isnan(z_values[x][y])) { if (!isnan(z_values[x][y])) {
z_values[x][y] += g29_constant; z_values[x][y] += g29_constant;
#if ENABLED(EXTENSIBLE_UI) #if ENABLED(EXTENSIBLE_UI)
@ -1243,12 +1235,10 @@
mesh_index_pair farthest { -1, -1, -99999.99 }; mesh_index_pair farthest { -1, -1, -99999.99 };
for (int8_t i = 0; i < GRID_MAX_POINTS_X; i++) { GRID_LOOP(i, j) {
for (int8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { if (!isnan(z_values[i][j])) continue; // Skip valid mesh points
if (isnan(z_values[i][j])) { // Invalid mesh point?
// Skip points the probe can't reach // Skip unreachable points
if (!probe.can_reach(mesh_index_to_xpos(i), mesh_index_to_ypos(j))) if (!probe.can_reach(mesh_index_to_xpos(i), mesh_index_to_ypos(j)))
continue; continue;
@ -1256,9 +1246,9 @@
xy_int8_t near { -1, -1 }; xy_int8_t near { -1, -1 };
float d1, d2 = 99999.9f; float d1, d2 = 99999.9f;
for (int8_t k = 0; k < GRID_MAX_POINTS_X; k++) { GRID_LOOP(k, l) {
for (int8_t l = 0; l < GRID_MAX_POINTS_Y; l++) { if (isnan(z_values[k][l])) continue;
if (!isnan(z_values[k][l])) {
found_a_real = true; found_a_real = true;
// Add in a random weighting factor that scrambles the probing of the // Add in a random weighting factor that scrambles the probing of the
@ -1272,8 +1262,6 @@
near.set(i, j); near.set(i, j);
} }
} }
}
}
// //
// At this point d2 should have the near defined mesh point to invalid mesh point (i,j) // At this point d2 should have the near defined mesh point to invalid mesh point (i,j)
@ -1283,12 +1271,10 @@
farthest.pos = near; // Found an invalid location farther from the defined mesh point farthest.pos = near; // Found an invalid location farther from the defined mesh point
farthest.distance = d2; farthest.distance = d2;
} }
} } // GRID_LOOP
} // for j
} // for i
if (!found_a_real && found_a_NAN) { // if the mesh is totally unpopulated, start the probing if (!found_a_real && found_a_NAN) { // if the mesh is totally unpopulated, start the probing
farthest.pos.set(GRID_MAX_POINTS_X / 2, GRID_MAX_POINTS_Y / 2); farthest.pos.set((GRID_MAX_POINTS_X) / 2, (GRID_MAX_POINTS_Y) / 2);
farthest.distance = 1; farthest.distance = 1;
} }
return farthest; return farthest;
@ -1304,8 +1290,7 @@
float best_so_far = 99999.99f; float best_so_far = 99999.99f;
for (int8_t i = 0; i < GRID_MAX_POINTS_X; i++) { GRID_LOOP(i, j) {
for (int8_t j = 0; j < GRID_MAX_POINTS_Y; j++) {
if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL))
|| (type == SET_IN_BITMAP && !done_flags->marked(i, j)) || (type == SET_IN_BITMAP && !done_flags->marked(i, j))
) { ) {
@ -1332,8 +1317,7 @@
closest.distance = best_so_far; closest.distance = best_so_far;
} }
} }
} // for j } // GRID_LOOP
} // for i
return closest; return closest;
} }
@ -1373,7 +1357,7 @@
info3 PROGMEM = { GRID_MAX_POINTS_X - 1, 0, 0, GRID_MAX_POINTS_Y, true }; // Right side of the mesh looking left info3 PROGMEM = { GRID_MAX_POINTS_X - 1, 0, 0, GRID_MAX_POINTS_Y, true }; // Right side of the mesh looking left
static const smart_fill_info * const info[] PROGMEM = { &info0, &info1, &info2, &info3 }; static const smart_fill_info * const info[] PROGMEM = { &info0, &info1, &info2, &info3 };
for (uint8_t i = 0; i < COUNT(info); ++i) { LOOP_L_N(i, COUNT(info)) {
const smart_fill_info *f = (smart_fill_info*)pgm_read_ptr(&info[i]); const smart_fill_info *f = (smart_fill_info*)pgm_read_ptr(&info[i]);
const int8_t sx = pgm_read_byte(&f->sx), sy = pgm_read_byte(&f->sy), const int8_t sx = pgm_read_byte(&f->sx), sy = pgm_read_byte(&f->sy),
ex = pgm_read_byte(&f->ex), ey = pgm_read_byte(&f->ey); ex = pgm_read_byte(&f->ex), ey = pgm_read_byte(&f->ey);
@ -1496,12 +1480,13 @@
bool zig_zag = false; bool zig_zag = false;
uint16_t total_points = g29_grid_size * g29_grid_size, point_num = 1; const uint16_t total_points = sq(g29_grid_size);
uint16_t point_num = 1;
xy_pos_t rpos; xy_pos_t rpos;
for (uint8_t ix = 0; ix < g29_grid_size; ix++) { LOOP_L_N(ix, g29_grid_size) {
rpos.x = x_min + ix * dx; rpos.x = x_min + ix * dx;
for (int8_t iy = 0; iy < g29_grid_size; iy++) { LOOP_L_N(iy, g29_grid_size) {
rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy);
if (!abort_flag) { if (!abort_flag) {
@ -1569,8 +1554,7 @@
matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1)); matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1));
for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { GRID_LOOP(i, j) {
for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) {
float mx = mesh_index_to_xpos(i), float mx = mesh_index_to_xpos(i),
my = mesh_index_to_ypos(j), my = mesh_index_to_ypos(j),
mz = z_values[i][j]; mz = z_values[i][j];
@ -1602,7 +1586,6 @@
ExtUI::onMeshUpdate(i, j, z_values[i][j]); ExtUI::onMeshUpdate(i, j, z_values[i][j]);
#endif #endif
} }
}
if (DEBUGGING(LEVELING)) { if (DEBUGGING(LEVELING)) {
rotation.debug(PSTR("rotation matrix:\n")); rotation.debug(PSTR("rotation matrix:\n"));
@ -1661,7 +1644,7 @@
// being extrapolated so that nearby points will have greater influence on // being extrapolated so that nearby points will have greater influence on
// the point being extrapolated. Then extrapolate the mesh point from WLSF. // the point being extrapolated. Then extrapolate the mesh point from WLSF.
static_assert(GRID_MAX_POINTS_Y <= 16, "GRID_MAX_POINTS_Y too big"); static_assert((GRID_MAX_POINTS_Y) <= 16, "GRID_MAX_POINTS_Y too big");
uint16_t bitmap[GRID_MAX_POINTS_X] = { 0 }; uint16_t bitmap[GRID_MAX_POINTS_X] = { 0 };
struct linear_fit_data lsf_results; struct linear_fit_data lsf_results;
@ -1669,23 +1652,20 @@
const float weight_scaled = weight_factor * _MAX(MESH_X_DIST, MESH_Y_DIST); const float weight_scaled = weight_factor * _MAX(MESH_X_DIST, MESH_Y_DIST);
for (uint8_t jx = 0; jx < GRID_MAX_POINTS_X; jx++) GRID_LOOP(jx, jy) if (!isnan(z_values[jx][jy])) SBI(bitmap[jx], jy);
for (uint8_t jy = 0; jy < GRID_MAX_POINTS_Y; jy++)
if (!isnan(z_values[jx][jy]))
SBI(bitmap[jx], jy);
xy_pos_t ppos; xy_pos_t ppos;
for (uint8_t ix = 0; ix < GRID_MAX_POINTS_X; ix++) { LOOP_L_N(ix, GRID_MAX_POINTS_X) {
ppos.x = mesh_index_to_xpos(ix); ppos.x = mesh_index_to_xpos(ix);
for (uint8_t iy = 0; iy < GRID_MAX_POINTS_Y; iy++) { LOOP_L_N(iy, GRID_MAX_POINTS_Y) {
ppos.y = mesh_index_to_ypos(iy); ppos.y = mesh_index_to_ypos(iy);
if (isnan(z_values[ix][iy])) { if (isnan(z_values[ix][iy])) {
// undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points. // undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points.
incremental_LSF_reset(&lsf_results); incremental_LSF_reset(&lsf_results);
xy_pos_t rpos; xy_pos_t rpos;
for (uint8_t jx = 0; jx < GRID_MAX_POINTS_X; jx++) { LOOP_L_N(jx, GRID_MAX_POINTS_X) {
rpos.x = mesh_index_to_xpos(jx); rpos.x = mesh_index_to_xpos(jx);
for (uint8_t jy = 0; jy < GRID_MAX_POINTS_Y; jy++) { LOOP_L_N(jy, GRID_MAX_POINTS_Y) {
if (TEST(bitmap[jx], jy)) { if (TEST(bitmap[jx], jy)) {
rpos.y = mesh_index_to_ypos(jy); rpos.y = mesh_index_to_ypos(jy);
const float rz = z_values[jx][jy], const float rz = z_values[jx][jy],
@ -1747,7 +1727,7 @@
SERIAL_ECHOLNPAIR("MESH_Y_DIST ", MESH_Y_DIST); serial_delay(50); SERIAL_ECHOLNPAIR("MESH_Y_DIST ", MESH_Y_DIST); serial_delay(50);
SERIAL_ECHOPGM("X-Axis Mesh Points at: "); SERIAL_ECHOPGM("X-Axis Mesh Points at: ");
for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { LOOP_L_N(i, GRID_MAX_POINTS_X) {
SERIAL_ECHO_F(LOGICAL_X_POSITION(mesh_index_to_xpos(i)), 3); SERIAL_ECHO_F(LOGICAL_X_POSITION(mesh_index_to_xpos(i)), 3);
SERIAL_ECHOPGM(" "); SERIAL_ECHOPGM(" ");
serial_delay(25); serial_delay(25);
@ -1755,7 +1735,7 @@
SERIAL_EOL(); SERIAL_EOL();
SERIAL_ECHOPGM("Y-Axis Mesh Points at: "); SERIAL_ECHOPGM("Y-Axis Mesh Points at: ");
for (uint8_t i = 0; i < GRID_MAX_POINTS_Y; i++) { LOOP_L_N(i, GRID_MAX_POINTS_Y) {
SERIAL_ECHO_F(LOGICAL_Y_POSITION(mesh_index_to_ypos(i)), 3); SERIAL_ECHO_F(LOGICAL_Y_POSITION(mesh_index_to_ypos(i)), 3);
SERIAL_ECHOPGM(" "); SERIAL_ECHOPGM(" ");
serial_delay(25); serial_delay(25);
@ -1840,8 +1820,7 @@
SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", g29_storage_slot, " from current mesh."); SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", g29_storage_slot, " from current mesh.");
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y) {
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) {
z_values[x][y] -= tmp_z_values[x][y]; z_values[x][y] -= tmp_z_values[x][y];
#if ENABLED(EXTENSIBLE_UI) #if ENABLED(EXTENSIBLE_UI)
ExtUI::onMeshUpdate(x, y, z_values[x][y]); ExtUI::onMeshUpdate(x, y, z_values[x][y]);

@ -92,11 +92,11 @@ void digipot_i2c_set_current(const uint8_t channel, const float current) {
void digipot_i2c_init() { void digipot_i2c_init() {
static const float digipot_motor_current[] PROGMEM = DIGIPOT_I2C_MOTOR_CURRENTS; static const float digipot_motor_current[] PROGMEM = DIGIPOT_I2C_MOTOR_CURRENTS;
for (uint8_t i = 0; i < DIGIPOT_I2C_NUM_CHANNELS; i++) LOOP_L_N(i, DIGIPOT_I2C_NUM_CHANNELS)
pots[i].i2c_init(); pots[i].i2c_init();
// setup initial currents as defined in Configuration_adv.h // setup initial currents as defined in Configuration_adv.h
for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) LOOP_L_N(i, COUNT(digipot_motor_current))
digipot_i2c_set_current(i, pgm_read_float(&digipot_motor_current[i])); digipot_i2c_set_current(i, pgm_read_float(&digipot_motor_current[i]));
} }

@ -83,7 +83,7 @@ void digipot_i2c_init() {
#endif #endif
// setup initial currents as defined in Configuration_adv.h // setup initial currents as defined in Configuration_adv.h
static const float digipot_motor_current[] PROGMEM = DIGIPOT_I2C_MOTOR_CURRENTS; static const float digipot_motor_current[] PROGMEM = DIGIPOT_I2C_MOTOR_CURRENTS;
for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) LOOP_L_N(i, COUNT(digipot_motor_current))
digipot_i2c_set_current(i, pgm_read_float(&digipot_motor_current[i])); digipot_i2c_set_current(i, pgm_read_float(&digipot_motor_current[i]));
} }

@ -42,7 +42,7 @@ int8_t FilamentWidthSensor::ratios[MAX_MEASUREMENT_DELAY + 1], // Ring
void FilamentWidthSensor::init() { void FilamentWidthSensor::init() {
const int8_t ratio = sample_to_size_ratio(); const int8_t ratio = sample_to_size_ratio();
for (uint8_t i = 0; i < COUNT(ratios); ++i) ratios[i] = ratio; LOOP_L_N(i, COUNT(ratios)) ratios[i] = ratio;
index_r = index_w = 0; index_r = index_w = 0;
} }

@ -73,7 +73,7 @@ void FWRetract::reset() {
settings.swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP; settings.swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP;
current_hop = 0.0; current_hop = 0.0;
for (uint8_t i = 0; i < EXTRUDERS; ++i) { LOOP_L_N(i, EXTRUDERS) {
retracted[i] = false; retracted[i] = false;
#if EXTRUDERS > 1 #if EXTRUDERS > 1
retracted_swap[i] = false; retracted_swap[i] = false;
@ -117,7 +117,7 @@ void FWRetract::retract(const bool retracting
" swapping ", swapping, " swapping ", swapping,
" active extruder ", active_extruder " active extruder ", active_extruder
); );
for (uint8_t i = 0; i < EXTRUDERS; ++i) { LOOP_L_N(i, EXTRUDERS) {
SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]); SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]);
#if EXTRUDERS > 1 #if EXTRUDERS > 1
SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]);
@ -201,7 +201,7 @@ void FWRetract::retract(const bool retracting
SERIAL_ECHOLNPAIR("retracting ", retracting); SERIAL_ECHOLNPAIR("retracting ", retracting);
SERIAL_ECHOLNPAIR("swapping ", swapping); SERIAL_ECHOLNPAIR("swapping ", swapping);
SERIAL_ECHOLNPAIR("active_extruder ", active_extruder); SERIAL_ECHOLNPAIR("active_extruder ", active_extruder);
for (uint8_t i = 0; i < EXTRUDERS; ++i) { LOOP_L_N(i, EXTRUDERS) {
SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]); SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]);
#if EXTRUDERS > 1 #if EXTRUDERS > 1
SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]);

@ -147,7 +147,7 @@ void Max7219::error(const char * const func, const int32_t v1, const int32_t v2/
*/ */
inline uint32_t flipped(const uint32_t bits, const uint8_t n_bytes) { inline uint32_t flipped(const uint32_t bits, const uint8_t n_bytes) {
uint32_t mask = 1, outbits = 0; uint32_t mask = 1, outbits = 0;
for (uint8_t b = 0; b < n_bytes * 8; b++) { LOOP_L_N(b, n_bytes * 8) {
outbits <<= 1; outbits <<= 1;
if (bits & mask) outbits |= 1; if (bits & mask) outbits |= 1;
mask <<= 1; mask <<= 1;
@ -329,13 +329,13 @@ void Max7219::fill() {
void Max7219::clear_row(const uint8_t row) { void Max7219::clear_row(const uint8_t row) {
if (row >= MAX7219_Y_LEDS) return error(PSTR("clear_row"), row); if (row >= MAX7219_Y_LEDS) return error(PSTR("clear_row"), row);
for (uint8_t x = 0; x < MAX7219_X_LEDS; x++) CLR_7219(x, row); LOOP_L_N(x, MAX7219_X_LEDS) CLR_7219(x, row);
send_row(row); send_row(row);
} }
void Max7219::clear_column(const uint8_t col) { void Max7219::clear_column(const uint8_t col) {
if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col); if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col);
for (uint8_t y = 0; y < MAX7219_Y_LEDS; y++) CLR_7219(col, y); LOOP_L_N(y, MAX7219_Y_LEDS) CLR_7219(col, y);
send_column(col); send_column(col);
} }
@ -347,7 +347,7 @@ void Max7219::clear_column(const uint8_t col) {
void Max7219::set_row(const uint8_t row, const uint32_t val) { void Max7219::set_row(const uint8_t row, const uint32_t val) {
if (row >= MAX7219_Y_LEDS) return error(PSTR("set_row"), row); if (row >= MAX7219_Y_LEDS) return error(PSTR("set_row"), row);
uint32_t mask = _BV32(MAX7219_X_LEDS - 1); uint32_t mask = _BV32(MAX7219_X_LEDS - 1);
for (uint8_t x = 0; x < MAX7219_X_LEDS; x++) { LOOP_L_N(x, MAX7219_X_LEDS) {
if (val & mask) SET_7219(x, row); else CLR_7219(x, row); if (val & mask) SET_7219(x, row); else CLR_7219(x, row);
mask >>= 1; mask >>= 1;
} }
@ -362,7 +362,7 @@ void Max7219::set_row(const uint8_t row, const uint32_t val) {
void Max7219::set_column(const uint8_t col, const uint32_t val) { void Max7219::set_column(const uint8_t col, const uint32_t val) {
if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col); if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col);
uint32_t mask = _BV32(MAX7219_Y_LEDS - 1); uint32_t mask = _BV32(MAX7219_Y_LEDS - 1);
for (uint8_t y = 0; y < MAX7219_Y_LEDS; y++) { LOOP_L_N(y, MAX7219_Y_LEDS) {
if (val & mask) SET_7219(col, y); else CLR_7219(col, y); if (val & mask) SET_7219(col, y); else CLR_7219(col, y);
mask >>= 1; mask >>= 1;
} }
@ -427,23 +427,23 @@ void Max7219::set_columns_32bits(const uint8_t x, uint32_t val) {
// Initialize the Max7219 // Initialize the Max7219
void Max7219::register_setup() { void Max7219::register_setup() {
for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; i++) LOOP_L_N(i, MAX7219_NUMBER_UNITS)
send(max7219_reg_scanLimit, 0x07); send(max7219_reg_scanLimit, 0x07);
pulse_load(); // Tell the chips to load the clocked out data pulse_load(); // Tell the chips to load the clocked out data
for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; i++) LOOP_L_N(i, MAX7219_NUMBER_UNITS)
send(max7219_reg_decodeMode, 0x00); // Using an led matrix (not digits) send(max7219_reg_decodeMode, 0x00); // Using an led matrix (not digits)
pulse_load(); // Tell the chips to load the clocked out data pulse_load(); // Tell the chips to load the clocked out data
for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; i++) LOOP_L_N(i, MAX7219_NUMBER_UNITS)
send(max7219_reg_shutdown, 0x01); // Not in shutdown mode send(max7219_reg_shutdown, 0x01); // Not in shutdown mode
pulse_load(); // Tell the chips to load the clocked out data pulse_load(); // Tell the chips to load the clocked out data
for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; i++) LOOP_L_N(i, MAX7219_NUMBER_UNITS)
send(max7219_reg_displayTest, 0x00); // No display test send(max7219_reg_displayTest, 0x00); // No display test
pulse_load(); // Tell the chips to load the clocked out data pulse_load(); // Tell the chips to load the clocked out data
for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; i++) LOOP_L_N(i, MAX7219_NUMBER_UNITS)
send(max7219_reg_intensity, 0x01 & 0x0F); // The first 0x0F is the value you can set send(max7219_reg_intensity, 0x01 & 0x0F); // The first 0x0F is the value you can set
// Range: 0x00 to 0x0F // Range: 0x00 to 0x0F
pulse_load(); // Tell the chips to load the clocked out data pulse_load(); // Tell the chips to load the clocked out data
@ -537,7 +537,7 @@ void Max7219::init() {
register_setup(); register_setup();
for (uint8_t i = 0; i <= 7; i++) { // Empty registers to turn all LEDs off LOOP_LE_N(i, 7) { // Empty registers to turn all LEDs off
led_line[i] = 0x00; led_line[i] = 0x00;
send(max7219_reg_digit0 + i, 0); send(max7219_reg_digit0 + i, 0);
pulse_load(); // Tell the chips to load the clocked out data pulse_load(); // Tell the chips to load the clocked out data

@ -98,13 +98,13 @@ void Mixer::normalize(const uint8_t tool_index) {
void Mixer::reset_vtools() { void Mixer::reset_vtools() {
// Virtual Tools 0, 1, 2, 3 = Filament 1, 2, 3, 4, etc. // Virtual Tools 0, 1, 2, 3 = Filament 1, 2, 3, 4, etc.
// Every virtual tool gets a pure filament // Every virtual tool gets a pure filament
for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS && t < MIXING_STEPPERS; t++) LOOP_L_N(t, MIXING_VIRTUAL_TOOLS && t < MIXING_STEPPERS)
MIXER_STEPPER_LOOP(i) MIXER_STEPPER_LOOP(i)
color[t][i] = (t == i) ? COLOR_A_MASK : 0; color[t][i] = (t == i) ? COLOR_A_MASK : 0;
// Remaining virtual tools are 100% filament 1 // Remaining virtual tools are 100% filament 1
#if MIXING_VIRTUAL_TOOLS > MIXING_STEPPERS #if MIXING_VIRTUAL_TOOLS > MIXING_STEPPERS
for (uint8_t t = MIXING_STEPPERS; t < MIXING_VIRTUAL_TOOLS; t++) LOOP_S_L_N(t, MIXING_STEPPERS, MIXING_VIRTUAL_TOOLS)
MIXER_STEPPER_LOOP(i) MIXER_STEPPER_LOOP(i)
color[t][i] = (i == 0) ? COLOR_A_MASK : 0; color[t][i] = (i == 0) ? COLOR_A_MASK : 0;
#endif #endif

@ -381,7 +381,7 @@ bool MMU2::rx_str_P(const char* str) {
void MMU2::tx_str_P(const char* str) { void MMU2::tx_str_P(const char* str) {
clear_rx_buffer(); clear_rx_buffer();
uint8_t len = strlen_P(str); uint8_t len = strlen_P(str);
for (uint8_t i = 0; i < len; i++) mmuSerial.write(pgm_read_byte(str++)); LOOP_L_N(i, len) mmuSerial.write(pgm_read_byte(str++));
rx_buffer[0] = '\0'; rx_buffer[0] = '\0';
last_request = millis(); last_request = millis();
} }
@ -392,7 +392,7 @@ void MMU2::tx_str_P(const char* str) {
void MMU2::tx_printf_P(const char* format, int argument = -1) { void MMU2::tx_printf_P(const char* format, int argument = -1) {
clear_rx_buffer(); clear_rx_buffer();
uint8_t len = sprintf_P(tx_buffer, format, argument); uint8_t len = sprintf_P(tx_buffer, format, argument);
for (uint8_t i = 0; i < len; i++) mmuSerial.write(tx_buffer[i]); LOOP_L_N(i, len) mmuSerial.write(tx_buffer[i]);
rx_buffer[0] = '\0'; rx_buffer[0] = '\0';
last_request = millis(); last_request = millis();
} }
@ -403,7 +403,7 @@ void MMU2::tx_printf_P(const char* format, int argument = -1) {
void MMU2::tx_printf_P(const char* format, int argument1, int argument2) { void MMU2::tx_printf_P(const char* format, int argument1, int argument2) {
clear_rx_buffer(); clear_rx_buffer();
uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2); uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2);
for (uint8_t i = 0; i < len; i++) mmuSerial.write(tx_buffer[i]); LOOP_L_N(i, len) mmuSerial.write(tx_buffer[i]);
rx_buffer[0] = '\0'; rx_buffer[0] = '\0';
last_request = millis(); last_request = millis();
} }
@ -780,7 +780,7 @@ void MMU2::filament_runout() {
const E_Step* step = sequence; const E_Step* step = sequence;
for (uint8_t i = 0; i < steps; i++) { LOOP_L_N(i, steps) {
const float es = pgm_read_float(&(step->extrude)); const float es = pgm_read_float(&(step->extrude));
const feedRate_t fr_mm_m = pgm_read_float(&(step->feedRate)); const feedRate_t fr_mm_m = pgm_read_float(&(step->feedRate));

@ -391,7 +391,7 @@ void PrintJobRecovery::resume() {
// Restore retract and hop state // Restore retract and hop state
#if ENABLED(FWRETRACT) #if ENABLED(FWRETRACT)
for (uint8_t e = 0; e < EXTRUDERS; e++) { LOOP_L_N(e, EXTRUDERS) {
if (info.retract[e] != 0.0) { if (info.retract[e] != 0.0) {
fwretract.current_retract[e] = info.retract[e]; fwretract.current_retract[e] = info.retract[e];
fwretract.retracted[e] = true; fwretract.retracted[e] = true;

@ -54,7 +54,7 @@ uint8_t ProbeTempComp::calib_idx; // = 0
float ProbeTempComp::init_measurement; // = 0.0 float ProbeTempComp::init_measurement; // = 0.0
void ProbeTempComp::clear_offsets(const TempSensorID tsi) { void ProbeTempComp::clear_offsets(const TempSensorID tsi) {
for (uint8_t i = 0; i < cali_info[tsi].measurements; ++i) LOOP_L_N(i, cali_info[tsi].measurements)
sensor_z_offsets[tsi][i] = 0; sensor_z_offsets[tsi][i] = 0;
calib_idx = 0; calib_idx = 0;
} }
@ -66,7 +66,7 @@ bool ProbeTempComp::set_offset(const TempSensorID tsi, const uint8_t idx, const
} }
void ProbeTempComp::print_offsets() { void ProbeTempComp::print_offsets() {
for (uint8_t s = 0; s < TSI_COUNT; s++) { LOOP_L_N(s, TSI_COUNT) {
float temp = cali_info[s].start_temp; float temp = cali_info[s].start_temp;
for (int16_t i = -1; i < cali_info[s].measurements; ++i) { for (int16_t i = -1; i < cali_info[s].measurements; ++i) {
serialprintPGM(s == TSI_BED ? PSTR("Bed") : serialprintPGM(s == TSI_BED ? PSTR("Bed") :
@ -198,7 +198,7 @@ bool ProbeTempComp::linear_regression(const TempSensorID tsi, float &k, float &d
sum_x2 = sq(start_temp), sum_x2 = sq(start_temp),
sum_xy = 0, sum_y = 0; sum_xy = 0, sum_y = 0;
for (uint8_t i = 0; i < calib_idx; ++i) { LOOP_L_N(i, calib_idx) {
const float xi = start_temp + (i + 1) * res_temp, const float xi = start_temp + (i + 1) * res_temp,
yi = static_cast<float>(data[i]); yi = static_cast<float>(data[i]);
sum_x += xi; sum_x += xi;

@ -184,7 +184,7 @@ class FilamentSensorBase {
#ifdef FILAMENT_RUNOUT_SENSOR_DEBUG #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG
if (change) { if (change) {
SERIAL_ECHOPGM("Motion detected:"); SERIAL_ECHOPGM("Motion detected:");
for (uint8_t e = 0; e < NUM_RUNOUT_SENSORS; e++) LOOP_L_N(e, NUM_RUNOUT_SENSORS)
if (TEST(change, e)) SERIAL_CHAR(' ', '0' + e); if (TEST(change, e)) SERIAL_CHAR(' ', '0' + e);
SERIAL_EOL(); SERIAL_EOL();
} }

@ -104,7 +104,7 @@ void TWIBus::echodata(uint8_t bytes, const char prefix[], uint8_t adr) {
void TWIBus::echobuffer(const char prefix[], uint8_t adr) { void TWIBus::echobuffer(const char prefix[], uint8_t adr) {
echoprefix(buffer_s, prefix, adr); echoprefix(buffer_s, prefix, adr);
for (uint8_t i = 0; i < buffer_s; i++) SERIAL_CHAR(buffer[i]); LOOP_L_N(i, buffer_s) SERIAL_CHAR(buffer[i]);
SERIAL_EOL(); SERIAL_EOL();
} }

@ -157,7 +157,7 @@ float g26_extrusion_multiplier,
g26_layer_height, g26_layer_height,
g26_prime_length; g26_prime_length;
xy_pos_t g26_pos; // = { 0, 0 } xy_pos_t g26_xy_pos; // = { 0, 0 }
int16_t g26_bed_temp, int16_t g26_bed_temp,
g26_hotend_temp; g26_hotend_temp;
@ -187,8 +187,7 @@ mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) {
out_point.pos = -1; out_point.pos = -1;
for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { GRID_LOOP(i, j) {
for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) {
if (!circle_flags.marked(i, j)) { if (!circle_flags.marked(i, j)) {
// We found a circle that needs to be printed // We found a circle that needs to be printed
const xy_pos_t m = { _GET_MESH_X(i), _GET_MESH_Y(j) }; const xy_pos_t m = { _GET_MESH_X(i), _GET_MESH_Y(j) };
@ -200,7 +199,7 @@ mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) {
// to let us find the closest circle to the start position. // to let us find the closest circle to the start position.
// But if this is not the case, add a small weighting to the // But if this is not the case, add a small weighting to the
// distance calculation to help it choose a better place to continue. // distance calculation to help it choose a better place to continue.
f += (g26_pos - m).magnitude() / 15.0f; f += (g26_xy_pos - m).magnitude() / 15.0f;
// Add the specified amount of Random Noise to our search // Add the specified amount of Random Noise to our search
if (random_deviation > 1.0) f += random(0.0, random_deviation); if (random_deviation > 1.0) f += random(0.0, random_deviation);
@ -212,7 +211,6 @@ mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) {
} }
} }
} }
}
circle_flags.mark(out_point); // Mark this location as done. circle_flags.mark(out_point); // Mark this location as done.
return out_point; return out_point;
} }
@ -308,14 +306,13 @@ inline bool look_for_lines_to_connect() {
xyz_pos_t s, e; xyz_pos_t s, e;
s.z = e.z = g26_layer_height; s.z = e.z = g26_layer_height;
for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { GRID_LOOP(i, j) {
for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) {
#if HAS_LCD_MENU #if HAS_LCD_MENU
if (user_canceled()) return true; if (user_canceled()) return true;
#endif #endif
if (i < GRID_MAX_POINTS_X) { // Can't connect to anything farther to the right than GRID_MAX_POINTS_X. if (i < (GRID_MAX_POINTS_X)) { // Can't connect to anything farther to the right than GRID_MAX_POINTS_X.
// Already a half circle at the edge of the bed. // Already a half circle at the edge of the bed.
if (circle_flags.marked(i, j) && circle_flags.marked(i + 1, j)) { // Test whether a leftward line can be done if (circle_flags.marked(i, j) && circle_flags.marked(i + 1, j)) { // Test whether a leftward line can be done
@ -335,7 +332,7 @@ inline bool look_for_lines_to_connect() {
} }
} }
if (j < GRID_MAX_POINTS_Y) { // Can't connect to anything further back than GRID_MAX_POINTS_Y. if (j < (GRID_MAX_POINTS_Y)) { // Can't connect to anything further back than GRID_MAX_POINTS_Y.
// Already a half circle at the edge of the bed. // Already a half circle at the edge of the bed.
if (circle_flags.marked(i, j) && circle_flags.marked(i, j + 1)) { // Test whether a downward line can be done if (circle_flags.marked(i, j) && circle_flags.marked(i, j + 1)) { // Test whether a downward line can be done
@ -357,7 +354,6 @@ inline bool look_for_lines_to_connect() {
} }
} }
} }
}
return false; return false;
} }
@ -628,9 +624,9 @@ void GcodeSuite::G26() {
return; return;
} }
g26_pos.set(parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position.x, g26_xy_pos.set(parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position.x,
parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position.y); parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position.y);
if (!position_is_reachable(g26_pos.x, g26_pos.y)) { if (!position_is_reachable(g26_xy_pos)) {
SERIAL_ECHOLNPGM("?Specified X,Y coordinate out of bounds."); SERIAL_ECHOLNPGM("?Specified X,Y coordinate out of bounds.");
return; return;
} }
@ -695,7 +691,7 @@ void GcodeSuite::G26() {
#error "A_CNT must be a positive value. Please change A_INT." #error "A_CNT must be a positive value. Please change A_INT."
#endif #endif
float trig_table[A_CNT]; float trig_table[A_CNT];
for (uint8_t i = 0; i < A_CNT; i++) LOOP_L_N(i, A_CNT)
trig_table[i] = INTERSECTION_CIRCLE_RADIUS * cos(RADIANS(i * A_INT)); trig_table[i] = INTERSECTION_CIRCLE_RADIUS * cos(RADIANS(i * A_INT));
#endif // !ARC_SUPPORT #endif // !ARC_SUPPORT
@ -703,7 +699,7 @@ void GcodeSuite::G26() {
mesh_index_pair location; mesh_index_pair location;
do { do {
// Find the nearest confluence // Find the nearest confluence
location = find_closest_circle_to_print(g26_continue_with_closest ? xy_pos_t(current_position) : g26_pos); location = find_closest_circle_to_print(g26_continue_with_closest ? xy_pos_t(current_position) : g26_xy_pos);
if (location.valid()) { if (location.valid()) {
const xy_pos_t circle = _GET_MESH_POS(location.pos); const xy_pos_t circle = _GET_MESH_POS(location.pos);
@ -834,12 +830,9 @@ void GcodeSuite::G26() {
retract_filament(destination); retract_filament(destination);
destination.z = Z_CLEARANCE_BETWEEN_PROBES; destination.z = Z_CLEARANCE_BETWEEN_PROBES;
move_to(destination, 0); // Raise the nozzle move_to(destination, 0); // Raise the nozzle
destination.set(g26_pos.x, g26_pos.y); // Move back to the starting position destination = g26_xy_pos; // Move back to the starting XY position
//destination.z = Z_CLEARANCE_BETWEEN_PROBES; // Keep the nozzle where it is
move_to(destination, 0); // Move back to the starting position move_to(destination, 0); // Move back to the starting position
#if DISABLED(NO_VOLUMETRICS) #if DISABLED(NO_VOLUMETRICS)

@ -71,8 +71,7 @@ void GcodeSuite::M420() {
bilinear_grid_spacing.set((x_max - x_min) / (GRID_MAX_POINTS_X - 1), bilinear_grid_spacing.set((x_max - x_min) / (GRID_MAX_POINTS_X - 1),
(y_max - y_min) / (GRID_MAX_POINTS_Y - 1)); (y_max - y_min) / (GRID_MAX_POINTS_Y - 1));
#endif #endif
for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) GRID_LOOP(x, y) {
for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) {
Z_VALUES(x, y) = 0.001 * random(-200, 200); Z_VALUES(x, y) = 0.001 * random(-200, 200);
#if ENABLED(EXTENSIBLE_UI) #if ENABLED(EXTENSIBLE_UI)
ExtUI::onMeshUpdate(x, y, Z_VALUES(x, y)); ExtUI::onMeshUpdate(x, y, Z_VALUES(x, y));

@ -746,7 +746,7 @@ G29_TYPE GcodeSuite::G29() {
// Probe at 3 arbitrary points // Probe at 3 arbitrary points
for (uint8_t i = 0; i < 3; ++i) { LOOP_L_N(i, 3) {
if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", int(i), "/3."); if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", int(i), "/3.");
#if HAS_DISPLAY #if HAS_DISPLAY
ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i)); ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i));
@ -861,7 +861,7 @@ G29_TYPE GcodeSuite::G29() {
auto print_topo_map = [&](PGM_P const title, const bool get_min) { auto print_topo_map = [&](PGM_P const title, const bool get_min) {
serialprintPGM(title); serialprintPGM(title);
for (int8_t yy = abl_grid_points.y - 1; yy >= 0; yy--) { for (int8_t yy = abl_grid_points.y - 1; yy >= 0; yy--) {
for (uint8_t xx = 0; xx < abl_grid_points.x; xx++) { LOOP_L_N(xx, abl_grid_points.x) {
const int ind = indexIntoAB[xx][yy]; const int ind = indexIntoAB[xx][yy];
xyz_float_t tmp = { eqnAMatrix[ind + 0 * abl_points], xyz_float_t tmp = { eqnAMatrix[ind + 0 * abl_points],
eqnAMatrix[ind + 1 * abl_points], 0 }; eqnAMatrix[ind + 1 * abl_points], 0 };

@ -124,7 +124,7 @@ inline void park_above_object(measurements_t &m, const float uncertainty) {
#if HAS_HOTEND_OFFSET #if HAS_HOTEND_OFFSET
inline void normalize_hotend_offsets() { inline void normalize_hotend_offsets() {
for (uint8_t e = 1; e < HOTENDS; e++) LOOP_S_L_N(e, 1, HOTENDS)
hotend_offset[e] -= hotend_offset[0]; hotend_offset[e] -= hotend_offset[0];
hotend_offset[0].reset(); hotend_offset[0].reset();
} }
@ -393,7 +393,7 @@ inline void probe_sides(measurements_t &m, const float uncertainty) {
// This function requires normalize_hotend_offsets() to be called // This function requires normalize_hotend_offsets() to be called
// //
inline void report_hotend_offsets() { inline void report_hotend_offsets() {
for (uint8_t e = 1; e < HOTENDS; e++) LOOP_S_L_N(e, 1, HOTENDS)
SERIAL_ECHOLNPAIR_P(PSTR("T"), int(e), PSTR(" Hotend Offset X"), hotend_offset[e].x, SP_Y_STR, hotend_offset[e].y, SP_Z_STR, hotend_offset[e].z); SERIAL_ECHOLNPAIR_P(PSTR("T"), int(e), PSTR(" Hotend Offset X"), hotend_offset[e].x, SP_Y_STR, hotend_offset[e].y, SP_Z_STR, hotend_offset[e].z);
} }
#endif #endif

@ -158,14 +158,14 @@ inline int32_t count_test_bytes(const char * const start_free_memory) {
while (start_free_memory < end_free_memory) { while (start_free_memory < end_free_memory) {
print_hex_address(start_free_memory); // Print the address print_hex_address(start_free_memory); // Print the address
SERIAL_CHAR(':'); SERIAL_CHAR(':');
for (uint8_t i = 0; i < 16; i++) { // and 16 data bytes LOOP_L_N(i, 16) { // and 16 data bytes
if (i == 8) SERIAL_CHAR('-'); if (i == 8) SERIAL_CHAR('-');
print_hex_byte(start_free_memory[i]); print_hex_byte(start_free_memory[i]);
SERIAL_CHAR(' '); SERIAL_CHAR(' ');
} }
serial_delay(25); serial_delay(25);
SERIAL_CHAR('|'); // Point out non test bytes SERIAL_CHAR('|'); // Point out non test bytes
for (uint8_t i = 0; i < 16; i++) { LOOP_L_N(i, 16) {
char ccc = (char)start_free_memory[i]; // cast to char before automatically casting to char on assignment, in case the compiler is broken char ccc = (char)start_free_memory[i]; // cast to char before automatically casting to char on assignment, in case the compiler is broken
ccc = (ccc == TEST_BYTE) ? ' ' : '?'; ccc = (ccc == TEST_BYTE) ? ' ' : '?';
SERIAL_CHAR(ccc); SERIAL_CHAR(ccc);

@ -126,7 +126,7 @@ void GcodeSuite::M48() {
if (probing_good) { if (probing_good) {
randomSeed(millis()); randomSeed(millis());
for (uint8_t n = 0; n < n_samples; n++) { LOOP_L_N(n, n_samples) {
#if HAS_SPI_LCD #if HAS_SPI_LCD
// Display M48 progress in the status bar // Display M48 progress in the status bar
ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples)); ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples));
@ -149,7 +149,7 @@ void GcodeSuite::M48() {
SERIAL_ECHOLNPGM("CW"); SERIAL_ECHOLNPGM("CW");
} }
for (uint8_t l = 0; l < n_legs - 1; l++) { LOOP_L_N(l, n_legs - 1) {
float delta_angle; float delta_angle;
if (schizoid_flag) { if (schizoid_flag) {
@ -204,7 +204,7 @@ void GcodeSuite::M48() {
* Get the current mean for the data points we have so far * Get the current mean for the data points we have so far
*/ */
float sum = 0.0; float sum = 0.0;
for (uint8_t j = 0; j <= n; j++) sum += sample_set[j]; LOOP_LE_N(j, n) sum += sample_set[j];
mean = sum / (n + 1); mean = sum / (n + 1);
NOMORE(min, sample_set[n]); NOMORE(min, sample_set[n]);
@ -215,7 +215,7 @@ void GcodeSuite::M48() {
* data points we have so far * data points we have so far
*/ */
sum = 0.0; sum = 0.0;
for (uint8_t j = 0; j <= n; j++) LOOP_LE_N(j, n)
sum += sq(sample_set[j] - mean); sum += sq(sample_set[j] - mean);
sigma = SQRT(sum / (n + 1)); sigma = SQRT(sum / (n + 1));

@ -71,7 +71,7 @@ void GcodeSuite::M305() {
SERIAL_ECHO_MSG("!Invalid Steinhart-Hart C coeff. (-0.01 < C < +0.01)"); SERIAL_ECHO_MSG("!Invalid Steinhart-Hart C coeff. (-0.01 < C < +0.01)");
} // If not setting then report parameters } // If not setting then report parameters
else if (t_index < 0) { // ...all user thermistors else if (t_index < 0) { // ...all user thermistors
for (uint8_t i = 0; i < USER_THERMISTORS; i++) LOOP_L_N(i, USER_THERMISTORS)
thermalManager.log_user_thermistor(i); thermalManager.log_user_thermistor(i);
} }
else // ...one user thermistor else // ...one user thermistor

@ -57,7 +57,7 @@ inline void toggle_pins() {
end = PARSED_PIN_INDEX('L', NUM_DIGITAL_PINS - 1), end = PARSED_PIN_INDEX('L', NUM_DIGITAL_PINS - 1),
wait = parser.intval('W', 500); wait = parser.intval('W', 500);
for (uint8_t i = start; i <= end; i++) { LOOP_S_LE_N(i, start, end) {
pin_t pin = GET_PIN_MAP_PIN_M43(i); pin_t pin = GET_PIN_MAP_PIN_M43(i);
if (!VALID_PIN(pin)) continue; if (!VALID_PIN(pin)) continue;
if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) { if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) {
@ -313,7 +313,7 @@ void GcodeSuite::M43() {
NOLESS(first_pin, 2); // Don't hijack the UART pins NOLESS(first_pin, 2); // Don't hijack the UART pins
#endif #endif
uint8_t pin_state[last_pin - first_pin + 1]; uint8_t pin_state[last_pin - first_pin + 1];
for (uint8_t i = first_pin; i <= last_pin; i++) { LOOP_S_LE_N(i, first_pin, last_pin) {
pin_t pin = GET_PIN_MAP_PIN_M43(i); pin_t pin = GET_PIN_MAP_PIN_M43(i);
if (!VALID_PIN(pin)) continue; if (!VALID_PIN(pin)) continue;
if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) continue; if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) continue;
@ -339,7 +339,7 @@ void GcodeSuite::M43() {
#endif #endif
for (;;) { for (;;) {
for (uint8_t i = first_pin; i <= last_pin; i++) { LOOP_S_LE_N(i, first_pin, last_pin) {
pin_t pin = GET_PIN_MAP_PIN_M43(i); pin_t pin = GET_PIN_MAP_PIN_M43(i);
if (!VALID_PIN(pin)) continue; if (!VALID_PIN(pin)) continue;
if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) continue; if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) continue;
@ -365,7 +365,7 @@ void GcodeSuite::M43() {
} }
else { else {
// Report current state of selected pin(s) // Report current state of selected pin(s)
for (uint8_t i = first_pin; i <= last_pin; i++) { LOOP_S_LE_N(i, first_pin, last_pin) {
pin_t pin = GET_PIN_MAP_PIN_M43(i); pin_t pin = GET_PIN_MAP_PIN_M43(i);
if (VALID_PIN(pin)) report_pin_state_extended(pin, ignore_protection, true); if (VALID_PIN(pin)) report_pin_state_extended(pin, ignore_protection, true);
} }

@ -62,7 +62,7 @@
// b3 b2 b1 b0 ~b0 ... lo bits, NOT last bit // b3 b2 b1 b0 ~b0 ... lo bits, NOT last bit
// //
void M672_send(uint8_t b) { // bit rate requirement: 1KHz +/- 30% void M672_send(uint8_t b) { // bit rate requirement: 1KHz +/- 30%
for (uint8_t bits = 0; bits < 14; bits++) { LOOP_L_N(bits, 14) {
switch (bits) { switch (bits) {
default: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, !!(b & 0x80)); b <<= 1; break; } // send bit, shift next into place default: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, !!(b & 0x80)); b <<= 1; break; } // send bit, shift next into place
case 7: case 7:

@ -34,7 +34,7 @@ void report_M92(const bool echo=true, const int8_t e=-1) {
SERIAL_EOL(); SERIAL_EOL();
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
for (uint8_t i = 0; i < E_STEPPERS; i++) { LOOP_L_N(i, E_STEPPERS) {
if (e >= 0 && i != e) continue; if (e >= 0 && i != e) continue;
if (echo) SERIAL_ECHO_START(); else SERIAL_CHAR(' '); if (echo) SERIAL_ECHO_START(); else SERIAL_CHAR(' ');
SERIAL_ECHOLNPAIR_P(PSTR(" M92 T"), (int)i, SERIAL_ECHOLNPAIR_P(PSTR(" M92 T"), (int)i,

@ -49,7 +49,7 @@ void GcodeSuite::M111() {
SERIAL_ECHOPGM(STR_DEBUG_PREFIX); SERIAL_ECHOPGM(STR_DEBUG_PREFIX);
if (marlin_debug_flags) { if (marlin_debug_flags) {
uint8_t comma = 0; uint8_t comma = 0;
for (uint8_t i = 0; i < COUNT(debug_strings); i++) { LOOP_L_N(i, COUNT(debug_strings)) {
if (TEST(marlin_debug_flags, i)) { if (TEST(marlin_debug_flags, i)) {
if (comma++) SERIAL_CHAR(','); if (comma++) SERIAL_CHAR(',');
serialprintPGM((char*)pgm_read_ptr(&debug_strings[i])); serialprintPGM((char*)pgm_read_ptr(&debug_strings[i]));

@ -33,7 +33,7 @@
* Warning: Steps-per-unit remains unchanged. * Warning: Steps-per-unit remains unchanged.
*/ */
void GcodeSuite::M350() { void GcodeSuite::M350() {
if (parser.seen('S')) for (uint8_t i = 0; i <= 4; i++) stepper.microstep_mode(i, parser.value_byte()); if (parser.seen('S')) LOOP_LE_N(i, 4) stepper.microstep_mode(i, parser.value_byte());
LOOP_XYZE(i) if (parser.seen(axis_codes[i])) stepper.microstep_mode(i, parser.value_byte()); LOOP_XYZE(i) if (parser.seen(axis_codes[i])) stepper.microstep_mode(i, parser.value_byte());
if (parser.seen('B')) stepper.microstep_mode(4, parser.value_byte()); if (parser.seen('B')) stepper.microstep_mode(4, parser.value_byte());
stepper.microstep_readings(); stepper.microstep_readings();

@ -90,7 +90,7 @@
inline void spin_photo_pin() { inline void spin_photo_pin() {
static constexpr uint32_t sequence[] = PHOTO_PULSES_US; static constexpr uint32_t sequence[] = PHOTO_PULSES_US;
for (uint8_t i = 0; i < COUNT(sequence); i++) LOOP_L_N(i, COUNT(sequence))
pulse_photo_pin(sequence[i], !(i & 1)); pulse_photo_pin(sequence[i], !(i & 1));
} }

@ -46,7 +46,7 @@ void GcodeSuite::M907() {
LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.digipot_current(i, parser.value_int()); LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.digipot_current(i, parser.value_int());
if (parser.seenval('B')) stepper.digipot_current(4, parser.value_int()); if (parser.seenval('B')) stepper.digipot_current(4, parser.value_int());
if (parser.seenval('S')) for (uint8_t i = 0; i <= 4; i++) stepper.digipot_current(i, parser.value_int()); if (parser.seenval('S')) LOOP_LE_N(i, 4) stepper.digipot_current(i, parser.value_int());
#elif HAS_MOTOR_CURRENT_PWM #elif HAS_MOTOR_CURRENT_PWM
@ -74,7 +74,7 @@ void GcodeSuite::M907() {
#if ENABLED(DAC_STEPPER_CURRENT) #if ENABLED(DAC_STEPPER_CURRENT)
if (parser.seenval('S')) { if (parser.seenval('S')) {
const float dac_percent = parser.value_float(); const float dac_percent = parser.value_float();
for (uint8_t i = 0; i <= 4; i++) dac_current_percent(i, dac_percent); LOOP_LE_N(i, 4) dac_current_percent(i, dac_percent);
} }
LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) dac_current_percent(i, parser.value_float()); LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) dac_current_percent(i, parser.value_float());
#endif #endif

@ -79,7 +79,7 @@ void GcodeSuite::M7219() {
} }
if (parser.seen('P')) { if (parser.seen('P')) {
for (uint8_t r = 0; r < MAX7219_LINES; r++) { LOOP_L_N(r, MAX7219_LINES) {
SERIAL_ECHOPGM("led_line["); SERIAL_ECHOPGM("led_line[");
if (r < 10) SERIAL_CHAR(' '); if (r < 10) SERIAL_CHAR(' ');
SERIAL_ECHO(int(r)); SERIAL_ECHO(int(r));

@ -36,7 +36,7 @@
void report_xyze(const xyze_pos_t &pos, const uint8_t n=XYZE, const uint8_t precision=3) { void report_xyze(const xyze_pos_t &pos, const uint8_t n=XYZE, const uint8_t precision=3) {
char str[12]; char str[12];
for (uint8_t a = 0; a < n; a++) { LOOP_L_N(a, n) {
SERIAL_CHAR(' ', axis_codes[a], ':'); SERIAL_CHAR(' ', axis_codes[a], ':');
SERIAL_ECHO(dtostrf(pos[a], 1, precision, str)); SERIAL_ECHO(dtostrf(pos[a], 1, precision, str));
} }

@ -94,7 +94,7 @@ static PGM_P injected_commands_P = nullptr;
GCodeQueue::GCodeQueue() { GCodeQueue::GCodeQueue() {
// Send "ok" after commands by default // Send "ok" after commands by default
for (uint8_t i = 0; i < COUNT(send_ok); i++) send_ok[i] = true; LOOP_L_N(i, COUNT(send_ok)) send_ok[i] = true;
} }
/** /**
@ -427,7 +427,7 @@ void GCodeQueue::get_serial_commands() {
* Loop while serial characters are incoming and the queue is not full * Loop while serial characters are incoming and the queue is not full
*/ */
while (length < BUFSIZE && serial_data_available()) { while (length < BUFSIZE && serial_data_available()) {
for (uint8_t i = 0; i < NUM_SERIAL; ++i) { LOOP_L_N(i, NUM_SERIAL) {
const int c = read_serial(i); const int c = read_serial(i);
if (c < 0) continue; if (c < 0) continue;

@ -604,8 +604,52 @@
#undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN #undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
#endif #endif
/**
* Set granular options based on the specific type of leveling
*/
#if ENABLED(AUTO_BED_LEVELING_UBL)
#undef LCD_BED_LEVELING
#if ENABLED(DELTA)
#define UBL_SEGMENTED 1
#endif
#endif
#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT)
#define ABL_PLANAR 1
#endif
#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR)
#define ABL_GRID 1
#endif
#if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_3POINT)
#define HAS_ABL_NOT_UBL 1
#endif
#if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL, MESH_BED_LEVELING)
#define HAS_MESH 1
#endif
#if EITHER(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_3POINT)
#define NEEDS_THREE_PROBE_POINTS 1
#endif
#if EITHER(HAS_ABL_NOT_UBL, AUTO_BED_LEVELING_UBL)
#define HAS_ABL_OR_UBL 1
#if DISABLED(PROBE_MANUALLY)
#define HAS_AUTOLEVEL 1
#endif
#endif
#if EITHER(HAS_ABL_OR_UBL, MESH_BED_LEVELING)
#define HAS_LEVELING 1
#if DISABLED(AUTO_BED_LEVELING_UBL)
#define PLANNER_LEVELING 1
#endif
#endif
#if EITHER(HAS_ABL_OR_UBL, Z_MIN_PROBE_REPEATABILITY_TEST)
#define HAS_PROBING_PROCEDURE 1
#endif
#if !HAS_LEVELING
#undef RESTORE_LEVELING_AFTER_G28
#endif
#ifdef GRID_MAX_POINTS_X #ifdef GRID_MAX_POINTS_X
#define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y)) #define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y))
#define GRID_LOOP(A,B) LOOP_L_N(A, GRID_MAX_POINTS_X) LOOP_L_N(B, GRID_MAX_POINTS_Y)
#endif #endif
#ifndef INVERT_X_DIR #ifndef INVERT_X_DIR

@ -83,6 +83,10 @@
#endif #endif
#endif #endif
#if ANY(FWRETRACT, HAS_LEVELING, SKEW_CORRECTION)
#define HAS_POSITION_MODIFIERS 1
#endif
#if ANY(X_DUAL_ENDSTOPS, Y_DUAL_ENDSTOPS, Z_MULTI_ENDSTOPS) #if ANY(X_DUAL_ENDSTOPS, Y_DUAL_ENDSTOPS, Z_MULTI_ENDSTOPS)
#define HAS_EXTRA_ENDSTOPS 1 #define HAS_EXTRA_ENDSTOPS 1
#endif #endif

@ -1854,53 +1854,6 @@
#endif #endif
#endif // SKEW_CORRECTION #endif // SKEW_CORRECTION
/**
* Set granular options based on the specific type of leveling
*/
#if ENABLED(AUTO_BED_LEVELING_UBL)
#undef LCD_BED_LEVELING
#if ENABLED(DELTA)
#define UBL_SEGMENTED 1
#endif
#endif
#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT)
#define ABL_PLANAR 1
#endif
#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR)
#define ABL_GRID 1
#endif
#if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_3POINT)
#define HAS_ABL_NOT_UBL 1
#endif
#if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL, MESH_BED_LEVELING)
#define HAS_MESH 1
#endif
#if EITHER(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_3POINT)
#define NEEDS_THREE_PROBE_POINTS 1
#endif
#if EITHER(HAS_ABL_NOT_UBL, AUTO_BED_LEVELING_UBL)
#define HAS_ABL_OR_UBL 1
#if DISABLED(PROBE_MANUALLY)
#define HAS_AUTOLEVEL 1
#endif
#endif
#if EITHER(HAS_ABL_OR_UBL, MESH_BED_LEVELING)
#define HAS_LEVELING 1
#if DISABLED(AUTO_BED_LEVELING_UBL)
#define PLANNER_LEVELING 1
#endif
#endif
#if EITHER(HAS_ABL_OR_UBL, Z_MIN_PROBE_REPEATABILITY_TEST)
#define HAS_PROBING_PROCEDURE 1
#endif
#if ANY(FWRETRACT, HAS_LEVELING, SKEW_CORRECTION)
#define HAS_POSITION_MODIFIERS 1
#endif
#if !HAS_LEVELING
#undef RESTORE_LEVELING_AFTER_G28
#endif
/** /**
* Heater, Fan, and Probe interactions * Heater, Fan, and Probe interactions
*/ */

@ -102,7 +102,7 @@
static void createChar_P(const char c, const byte * const ptr) { static void createChar_P(const char c, const byte * const ptr) {
byte temp[8]; byte temp[8];
for (uint8_t i = 0; i < 8; i++) LOOP_L_N(i, 8)
temp[i] = pgm_read_byte(&ptr[i]); temp[i] = pgm_read_byte(&ptr[i]);
lcd.createChar(c, temp); lcd.createChar(c, temp);
} }
@ -414,7 +414,7 @@ void MarlinUI::clear_lcd() { lcd.clear(); }
else { else {
PGM_P p = text; PGM_P p = text;
int dly = time / _MAX(slen, 1); int dly = time / _MAX(slen, 1);
for (uint8_t i = 0; i <= slen; i++) { LOOP_LE_N(i, slen) {
// Print the text at the correct place // Print the text at the correct place
lcd_put_u8str_max_P(col, line, p, len); lcd_put_u8str_max_P(col, line, p, len);

@ -564,7 +564,7 @@ void MarlinUI::draw_status_screen() {
if (PAGE_UNDER(6 + 1 + 12 + 1 + 6 + 1)) { if (PAGE_UNDER(6 + 1 + 12 + 1 + 6 + 1)) {
// Extruders // Extruders
#if DO_DRAW_HOTENDS #if DO_DRAW_HOTENDS
for (uint8_t e = 0; e < MAX_HOTEND_DRAW; ++e) LOOP_L_N(e, MAX_HOTEND_DRAW)
_draw_hotend_status((heater_ind_t)e, blink); _draw_hotend_status((heater_ind_t)e, blink);
#endif #endif

@ -209,7 +209,7 @@ void ST7920_Lite_Status_Screen::clear_ddram() {
/* This fills the entire graphics buffer with zeros */ /* This fills the entire graphics buffer with zeros */
void ST7920_Lite_Status_Screen::clear_gdram() { void ST7920_Lite_Status_Screen::clear_gdram() {
for (uint8_t y = 0; y < BUFFER_HEIGHT; y++) { LOOP_L_N(y, BUFFER_HEIGHT) {
set_gdram_address(0, y); set_gdram_address(0, y);
begin_data(); begin_data();
for (uint8_t i = (BUFFER_WIDTH) / 16; i--;) write_word(0); for (uint8_t i = (BUFFER_WIDTH) / 16; i--;) write_word(0);
@ -407,7 +407,7 @@ void ST7920_Lite_Status_Screen::draw_degree_symbol(uint8_t x, uint8_t y, const b
const uint8_t x_word = x >> 1, const uint8_t x_word = x >> 1,
y_top = degree_symbol_y_top, y_top = degree_symbol_y_top,
y_bot = y_top + COUNT(degree_symbol); y_bot = y_top + COUNT(degree_symbol);
for (uint8_t i = y_top; i < y_bot; i++) { LOOP_S_L_N(i, y_top, y_bot) {
uint8_t byte = pgm_read_byte(p_bytes++); uint8_t byte = pgm_read_byte(p_bytes++);
set_gdram_address(x_word, i + y * 16); set_gdram_address(x_word, i + y * 16);
begin_data(); begin_data();
@ -467,10 +467,10 @@ void ST7920_Lite_Status_Screen::draw_progress_bar(const uint8_t value) {
const uint8_t char_pcnt = 100 / width; // How many percent does each 16-bit word represent? const uint8_t char_pcnt = 100 / width; // How many percent does each 16-bit word represent?
// Draw the progress bar as a bitmap in CGRAM // Draw the progress bar as a bitmap in CGRAM
for (uint8_t y = top; y <= bottom; y++) { LOOP_S_LE_N(y, top, bottom) {
set_gdram_address(left, y); set_gdram_address(left, y);
begin_data(); begin_data();
for (uint8_t x = 0; x < width; x++) { LOOP_L_N(x, width) {
uint16_t gfx_word = 0x0000; uint16_t gfx_word = 0x0000;
if ((x + 1) * char_pcnt <= value) if ((x + 1) * char_pcnt <= value)
gfx_word = 0xFFFF; // Draw completely filled bytes gfx_word = 0xFFFF; // Draw completely filled bytes

@ -87,11 +87,11 @@ void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev) {
u8g_SetAddress(u8g, dev, 0); // cmd mode u8g_SetAddress(u8g, dev, 0); // cmd mode
u8g_WriteByte(u8g, dev, 0x08); //display off, cursor+blink off u8g_WriteByte(u8g, dev, 0x08); //display off, cursor+blink off
u8g_WriteByte(u8g, dev, 0x3E); //extended mode + GDRAM active u8g_WriteByte(u8g, dev, 0x3E); //extended mode + GDRAM active
for (uint8_t y = 0; y < (LCD_PIXEL_HEIGHT) / 2; y++) { //clear GDRAM LOOP_L_N(y, (LCD_PIXEL_HEIGHT) / 2) { //clear GDRAM
u8g_WriteByte(u8g, dev, 0x80 | y); //set y u8g_WriteByte(u8g, dev, 0x80 | y); //set y
u8g_WriteByte(u8g, dev, 0x80); //set x = 0 u8g_WriteByte(u8g, dev, 0x80); //set x = 0
u8g_SetAddress(u8g, dev, 1); /* data mode */ u8g_SetAddress(u8g, dev, 1); /* data mode */
for (uint8_t i = 0; i < 2 * (LCD_PIXEL_WIDTH) / 8; i++) //2x width clears both segments LOOP_L_N(i, 2 * (LCD_PIXEL_WIDTH) / 8) //2x width clears both segments
u8g_WriteByte(u8g, dev, 0); u8g_WriteByte(u8g, dev, 0);
u8g_SetAddress(u8g, dev, 0); /* cmd mode */ u8g_SetAddress(u8g, dev, 0); /* cmd mode */
} }

@ -670,7 +670,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
case U8G_DEV_MSG_PAGE_NEXT: case U8G_DEV_MSG_PAGE_NEXT:
if (++page > (HEIGHT / PAGE_HEIGHT)) return 1; if (++page > (HEIGHT / PAGE_HEIGHT)) return 1;
for (uint8_t y = 0; y < PAGE_HEIGHT; y++) { LOOP_L_N(y, PAGE_HEIGHT) {
uint32_t k = 0; uint32_t k = 0;
#ifdef LCD_USE_DMA_FSMC #ifdef LCD_USE_DMA_FSMC
buffer = (y & 1) ? bufferB : bufferA; buffer = (y & 1) ? bufferB : bufferA;

@ -237,7 +237,7 @@ public:
if (!var.memadr) return; if (!var.memadr) return;
union { unsigned char tmp[sizeof(T)]; T t; } x; union { unsigned char tmp[sizeof(T)]; T t; } x;
unsigned char *ptr = (unsigned char*)val_ptr; unsigned char *ptr = (unsigned char*)val_ptr;
for (uint8_t i = 0; i < sizeof(T); i++) x.tmp[i] = ptr[sizeof(T) - i - 1]; LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1];
*(T*)var.memadr = x.t; *(T*)var.memadr = x.t;
} }

@ -339,11 +339,11 @@
alt_fm.stride = 19; alt_fm.stride = 19;
alt_fm.width = 38; alt_fm.width = 38;
alt_fm.height = 49; alt_fm.height = 49;
for (uint8_t i = 0; i < 127; i++) LOOP_L_N(i, 127)
alt_fm.char_widths[i] = 0; alt_fm.char_widths[i] = 0;
// For special characters, copy the character widths from the char tables // For special characters, copy the character widths from the char tables
for (uint8_t i = 0; i < NUM_ELEMENTS(char_recipe); i++) { LOOP_L_N(i, NUM_ELEMENTS(char_recipe)) {
uint8_t std_char, alt_char, alt_data; uint8_t std_char, alt_char, alt_data;
get_char_data(i, std_char, alt_char, alt_data); get_char_data(i, std_char, alt_char, alt_data);
if (std_char == 0) if (std_char == 0)

@ -36,7 +36,7 @@ void MoveAxisScreen::onEntry() {
// ourselves. The relative distances are reset to zero whenever this // ourselves. The relative distances are reset to zero whenever this
// screen is entered. // screen is entered.
for (uint8_t i = 0; i < ExtUI::extruderCount; i++) { LOOP_L_N(i, ExtUI::extruderCount) {
screen_data.MoveAxisScreen.e_rel[i] = 0; screen_data.MoveAxisScreen.e_rel[i] = 0;
} }
BaseNumericAdjustmentScreen::onEntry(); BaseNumericAdjustmentScreen::onEntry();

@ -81,7 +81,7 @@ void write_to_lcd_P(PGM_P const message) {
char encoded_message[MAX_CURLY_COMMAND]; char encoded_message[MAX_CURLY_COMMAND];
uint8_t message_length = _MIN(strlen_P(message), sizeof(encoded_message)); uint8_t message_length = _MIN(strlen_P(message), sizeof(encoded_message));
for (uint8_t i = 0; i < message_length; i++) LOOP_L_N(i, message_length)
encoded_message[i] = pgm_read_byte(&message[i]) | 0x80; encoded_message[i] = pgm_read_byte(&message[i]) | 0x80;
LCD_SERIAL.Print::write(encoded_message, message_length); LCD_SERIAL.Print::write(encoded_message, message_length);
@ -91,7 +91,7 @@ void write_to_lcd(const char * const message) {
char encoded_message[MAX_CURLY_COMMAND]; char encoded_message[MAX_CURLY_COMMAND];
const uint8_t message_length = _MIN(strlen(message), sizeof(encoded_message)); const uint8_t message_length = _MIN(strlen(message), sizeof(encoded_message));
for (uint8_t i = 0; i < message_length; i++) LOOP_L_N(i, message_length)
encoded_message[i] = message[i] | 0x80; encoded_message[i] = message[i] | 0x80;
LCD_SERIAL.Print::write(encoded_message, message_length); LCD_SERIAL.Print::write(encoded_message, message_length);

@ -140,13 +140,13 @@ void BrickoutGame::game_screen() {
// Draw bricks // Draw bricks
if (PAGE_CONTAINS(BRICK_TOP, BRICK_BOT)) { if (PAGE_CONTAINS(BRICK_TOP, BRICK_BOT)) {
for (uint8_t y = 0; y < BRICK_ROWS; ++y) { LOOP_L_N(y, BRICK_ROWS) {
const uint8_t yy = y * BRICK_H + BRICK_TOP; const uint8_t yy = y * BRICK_H + BRICK_TOP;
if (PAGE_CONTAINS(yy, yy + BRICK_H - 1)) { if (PAGE_CONTAINS(yy, yy + BRICK_H - 1)) {
for (uint8_t x = 0; x < BRICK_COLS; ++x) { LOOP_L_N(x, BRICK_COLS) {
if (TEST(bdat.bricks[y], x)) { if (TEST(bdat.bricks[y], x)) {
const uint8_t xx = x * BRICK_W; const uint8_t xx = x * BRICK_W;
for (uint8_t v = 0; v < BRICK_H - 1; ++v) LOOP_L_N(v, BRICK_H - 1)
if (PAGE_CONTAINS(yy + v, yy + v)) if (PAGE_CONTAINS(yy + v, yy + v))
u8g.drawHLine(xx, yy + v, BRICK_W - 1); u8g.drawHLine(xx, yy + v, BRICK_W - 1);
} }

@ -170,7 +170,7 @@ inline void update_invader_data() {
uint8_t m = idat.bugs[y]; uint8_t m = idat.bugs[y];
if (m) idat.botmost = y + 1; if (m) idat.botmost = y + 1;
inv_mask |= m; inv_mask |= m;
for (uint8_t x = 0; x < INVADER_COLS; ++x) LOOP_L_N(x, INVADER_COLS)
if (TEST(m, x)) idat.shooters[sc++] = (y << 4) | x; if (TEST(m, x)) idat.shooters[sc++] = (y << 4) | x;
} }
idat.leftmost = 0; idat.leftmost = 0;
@ -371,11 +371,11 @@ void InvadersGame::game_screen() {
// Draw invaders // Draw invaders
if (PAGE_CONTAINS(idat.pos.y, idat.pos.y + idat.botmost * (INVADER_ROW_H) - 2 - 1)) { if (PAGE_CONTAINS(idat.pos.y, idat.pos.y + idat.botmost * (INVADER_ROW_H) - 2 - 1)) {
int8_t yy = idat.pos.y; int8_t yy = idat.pos.y;
for (uint8_t y = 0; y < INVADER_ROWS; ++y) { LOOP_L_N(y, INVADER_ROWS) {
const uint8_t type = inv_type[y]; const uint8_t type = inv_type[y];
if (PAGE_CONTAINS(yy, yy + INVADER_H - 1)) { if (PAGE_CONTAINS(yy, yy + INVADER_H - 1)) {
int8_t xx = idat.pos.x; int8_t xx = idat.pos.x;
for (uint8_t x = 0; x < INVADER_COLS; ++x) { LOOP_L_N(x, INVADER_COLS) {
if (TEST(idat.bugs[y], x)) if (TEST(idat.bugs[y], x))
u8g.drawBitmapP(xx, yy, 2, INVADER_H, invader[type][idat.game_blink]); u8g.drawBitmapP(xx, yy, 2, INVADER_H, invader[type][idat.game_blink]);
xx += INVADER_COL_W; xx += INVADER_COL_W;

@ -83,7 +83,7 @@ void MazeGame::game_screen() {
if (PAGE_UNDER(HEADER_H)) lcd_put_int(0, HEADER_H - 1, score); if (PAGE_UNDER(HEADER_H)) lcd_put_int(0, HEADER_H - 1, score);
// Draw the maze // Draw the maze
// for (uint8_t n = 0; n < head_ind; ++n) { // LOOP_L_N(n, head_ind) {
// const pos_t &p = maze_walls[n], &q = maze_walls[n + 1]; // const pos_t &p = maze_walls[n], &q = maze_walls[n + 1];
// if (p.x == q.x) { // if (p.x == q.x) {
// const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); // const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y));

@ -84,14 +84,14 @@ void shorten_tail() {
} }
if (shift) { if (shift) {
sdat.head_ind--; sdat.head_ind--;
for (uint8_t i = 0; i <= sdat.head_ind; ++i) LOOP_LE_N(i, sdat.head_ind)
sdat.snake_tail[i] = sdat.snake_tail[i + 1]; sdat.snake_tail[i] = sdat.snake_tail[i + 1];
} }
} }
// The food is on a line // The food is on a line
inline bool food_on_line() { inline bool food_on_line() {
for (uint8_t n = 0; n < sdat.head_ind; ++n) { LOOP_L_N(n, sdat.head_ind) {
pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
if (p.x == q.x) { if (p.x == q.x) {
if ((sdat.foodx == p.x - 1 || sdat.foodx == p.x) && WITHIN(sdat.foody, _MIN(p.y, q.y), _MAX(p.y, q.y))) if ((sdat.foodx == p.x - 1 || sdat.foodx == p.x) && WITHIN(sdat.foody, _MIN(p.y, q.y), _MAX(p.y, q.y)))
@ -151,7 +151,7 @@ bool snake_overlap() {
// VERTICAL head segment? // VERTICAL head segment?
if (h1.x == h2.x) { if (h1.x == h2.x) {
// Loop from oldest to segment two away from head // Loop from oldest to segment two away from head
for (uint8_t n = 0; n < sdat.head_ind - 2; ++n) { LOOP_L_N(n, sdat.head_ind - 2) {
// Segment p to q // Segment p to q
const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
if (p.x != q.x) { if (p.x != q.x) {
@ -163,7 +163,7 @@ bool snake_overlap() {
} }
else { else {
// Loop from oldest to segment two away from head // Loop from oldest to segment two away from head
for (uint8_t n = 0; n < sdat.head_ind - 2; ++n) { LOOP_L_N(n, sdat.head_ind - 2) {
// Segment p to q // Segment p to q
const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
if (p.y != q.y) { if (p.y != q.y) {
@ -240,7 +240,7 @@ void SnakeGame::game_screen() {
#if SNAKE_WH < 2 #if SNAKE_WH < 2
// At this scale just draw a line // At this scale just draw a line
for (uint8_t n = 0; n < sdat.head_ind; ++n) { LOOP_L_N(n, sdat.head_ind) {
const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
if (p.x == q.x) { if (p.x == q.x) {
const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y));
@ -256,7 +256,7 @@ void SnakeGame::game_screen() {
#elif SNAKE_WH == 2 #elif SNAKE_WH == 2
// At this scale draw two lines // At this scale draw two lines
for (uint8_t n = 0; n < sdat.head_ind; ++n) { LOOP_L_N(n, sdat.head_ind) {
const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
if (p.x == q.x) { if (p.x == q.x) {
const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y));
@ -275,7 +275,7 @@ void SnakeGame::game_screen() {
#else #else
// Draw a series of boxes // Draw a series of boxes
for (uint8_t n = 0; n < sdat.head_ind; ++n) { LOOP_L_N(n, sdat.head_ind) {
const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
if (p.x == q.x) { if (p.x == q.x) {
const int8_t y1 = _MIN(p.y, q.y), y2 = _MAX(p.y, q.y); const int8_t y1 = _MIN(p.y, q.y), y2 = _MAX(p.y, q.y);

@ -114,7 +114,7 @@ void menu_cancelobject();
#if EXTRUDERS == 1 #if EXTRUDERS == 1
EDIT_ITEM(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); EDIT_ITEM(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999);
#elif EXTRUDERS > 1 #elif EXTRUDERS > 1
for (uint8_t n = 0; n < EXTRUDERS; n++) LOOP_L_N(n, EXTRUDERS)
EDIT_ITEM_N(float52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); EDIT_ITEM_N(float52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999);
#endif #endif
#endif #endif
@ -125,7 +125,7 @@ void menu_cancelobject();
if (parser.volumetric_enabled) { if (parser.volumetric_enabled) {
EDIT_ITEM_FAST(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); EDIT_ITEM_FAST(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
#if EXTRUDERS > 1 #if EXTRUDERS > 1
for (uint8_t n = 0; n < EXTRUDERS; n++) LOOP_L_N(n, EXTRUDERS)
EDIT_ITEM_FAST_N(float43, n, MSG_FILAMENT_DIAM_E, &planner.filament_size[n], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); EDIT_ITEM_FAST_N(float43, n, MSG_FILAMENT_DIAM_E, &planner.filament_size[n], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
#endif #endif
} }
@ -142,13 +142,13 @@ void menu_cancelobject();
EDIT_ITEM_FAST(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength); EDIT_ITEM_FAST(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength);
#if EXTRUDERS > 1 #if EXTRUDERS > 1
for (uint8_t n = 0; n < EXTRUDERS; n++) LOOP_L_N(n, EXTRUDERS)
EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTUNLOAD_E, &fc_settings[n].unload_length, 0, extrude_maxlength); EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTUNLOAD_E, &fc_settings[n].unload_length, 0, extrude_maxlength);
#endif #endif
EDIT_ITEM_FAST(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength); EDIT_ITEM_FAST(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength);
#if EXTRUDERS > 1 #if EXTRUDERS > 1
for (uint8_t n = 0; n < EXTRUDERS; n++) LOOP_L_N(n, EXTRUDERS)
EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTLOAD_E, &fc_settings[n].load_length, 0, extrude_maxlength); EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTLOAD_E, &fc_settings[n].load_length, 0, extrude_maxlength);
#endif #endif
#endif #endif
@ -358,7 +358,7 @@ void menu_cancelobject();
EDIT_ITEM_FAST(float3, MSG_VMAX_E, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e); EDIT_ITEM_FAST(float3, MSG_VMAX_E, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e);
#endif #endif
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
for (uint8_t n = 0; n < E_STEPPERS; n++) LOOP_L_N(n, E_STEPPERS)
EDIT_ITEM_FAST_N(float3, n, MSG_VMAX_EN, &planner.settings.max_feedrate_mm_s[E_AXIS_N(n)], 1, max_fr_edit_scaled.e); EDIT_ITEM_FAST_N(float3, n, MSG_VMAX_EN, &planner.settings.max_feedrate_mm_s[E_AXIS_N(n)], 1, max_fr_edit_scaled.e);
#endif #endif
@ -409,7 +409,7 @@ void menu_cancelobject();
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)], 100, max_accel_edit_scaled.e, []{ planner.reset_acceleration_rates(); }); EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)], 100, max_accel_edit_scaled.e, []{ planner.reset_acceleration_rates(); });
for (uint8_t n = 0; n < E_STEPPERS; n++) LOOP_L_N(n, E_STEPPERS)
EDIT_ITEM_FAST_N(long5_25, n, MSG_AMAX_EN, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(n)], 100, max_accel_edit_scaled.e, []{ _reset_e_acceleration_rate(MenuItemBase::itemIndex); }); EDIT_ITEM_FAST_N(long5_25, n, MSG_AMAX_EN, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(n)], 100, max_accel_edit_scaled.e, []{ _reset_e_acceleration_rate(MenuItemBase::itemIndex); });
#elif E_STEPPERS #elif E_STEPPERS
EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, max_accel_edit_scaled.e, []{ planner.reset_acceleration_rates(); }); EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, max_accel_edit_scaled.e, []{ planner.reset_acceleration_rates(); });
@ -484,7 +484,7 @@ void menu_advanced_steps_per_mm() {
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
EDIT_ITEM_FAST(float51, MSG_E_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(active_extruder)], 5, 9999, []{ planner.refresh_positioning(); }); EDIT_ITEM_FAST(float51, MSG_E_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(active_extruder)], 5, 9999, []{ planner.refresh_positioning(); });
for (uint8_t n = 0; n < E_STEPPERS; n++) LOOP_L_N(n, E_STEPPERS)
EDIT_ITEM_FAST_N(float51, n, MSG_EN_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(n)], 5, 9999, []{ _planner_refresh_e_positioning(MenuItemBase::itemIndex); }); EDIT_ITEM_FAST_N(float51, n, MSG_EN_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(n)], 5, 9999, []{ _planner_refresh_e_positioning(MenuItemBase::itemIndex); });
#elif E_STEPPERS #elif E_STEPPERS
EDIT_ITEM_FAST(float51, MSG_E_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, []{ planner.refresh_positioning(); }); EDIT_ITEM_FAST(float51, MSG_E_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, []{ planner.refresh_positioning(); });
@ -558,7 +558,7 @@ void menu_advanced_settings() {
#if EXTRUDERS == 1 #if EXTRUDERS == 1
EDIT_ITEM(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); EDIT_ITEM(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999);
#elif EXTRUDERS > 1 #elif EXTRUDERS > 1
for (uint8_t n = 0; n < E_STEPPERS; n++) LOOP_L_N(n, E_STEPPERS)
EDIT_ITEM_N(float52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); EDIT_ITEM_N(float52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999);
#endif #endif
#endif #endif

@ -114,7 +114,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) {
GCODES_ITEM_P(msg, PSTR("M600 B0")); GCODES_ITEM_P(msg, PSTR("M600 B0"));
#else #else
PGM_P const msg = GET_TEXT(MSG_FILAMENTCHANGE_E); PGM_P const msg = GET_TEXT(MSG_FILAMENTCHANGE_E);
for (uint8_t s = 0; s < E_STEPPERS; s++) { LOOP_L_N(s, E_STEPPERS) {
if (thermalManager.targetTooColdToExtrude(s)) if (thermalManager.targetTooColdToExtrude(s))
SUBMENU_N_P(s, msg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, MenuItemBase::itemIndex); }); SUBMENU_N_P(s, msg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, MenuItemBase::itemIndex); });
else { else {
@ -138,7 +138,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) {
GCODES_ITEM_P(msg_load, PSTR("M701")); GCODES_ITEM_P(msg_load, PSTR("M701"));
#else #else
PGM_P const msg_load = GET_TEXT(MSG_FILAMENTLOAD_E); PGM_P const msg_load = GET_TEXT(MSG_FILAMENTLOAD_E);
for (uint8_t s = 0; s < E_STEPPERS; s++) { LOOP_L_N(s, E_STEPPERS) {
if (thermalManager.targetTooColdToExtrude(s)) if (thermalManager.targetTooColdToExtrude(s))
SUBMENU_N_P(s, msg_load, []{ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, MenuItemBase::itemIndex); }); SUBMENU_N_P(s, msg_load, []{ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, MenuItemBase::itemIndex); });
else { else {
@ -162,7 +162,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) {
#if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS)
{ {
bool too_cold = false; bool too_cold = false;
for (uint8_t s = 0; s < E_STEPPERS; s++) { LOOP_L_N(s, E_STEPPERS) {
if (thermalManager.targetTooColdToExtrude(s)) { if (thermalManager.targetTooColdToExtrude(s)) {
too_cold = true; break; too_cold = true; break;
} }
@ -174,7 +174,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) {
} }
#endif #endif
PGM_P const msg_unload = GET_TEXT(MSG_FILAMENTUNLOAD_E); PGM_P const msg_unload = GET_TEXT(MSG_FILAMENTUNLOAD_E);
for (uint8_t s = 0; s < E_STEPPERS; s++) { LOOP_L_N(s, E_STEPPERS) {
if (thermalManager.targetTooColdToExtrude(s)) if (thermalManager.targetTooColdToExtrude(s))
SUBMENU_N_P(s, msg_unload, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, MenuItemBase::itemIndex); }); SUBMENU_N_P(s, msg_unload, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, MenuItemBase::itemIndex); });
else { else {

@ -181,7 +181,7 @@ void lcd_mixer_mix_edit() {
#if CHANNEL_MIX_EDITING #if CHANNEL_MIX_EDITING
for (uint8_t n = 1; n <= MIXING_STEPPERS; n++) LOOP_S_LE_N(n, 1, MIXING_STEPPERS)
EDIT_ITEM_FAST_N(float52, n, MSG_MIX_COMPONENT_N, &mixer.collector[n-1], 0, 10); EDIT_ITEM_FAST_N(float52, n, MSG_MIX_COMPONENT_N, &mixer.collector[n-1], 0, 10);
ACTION_ITEM(MSG_CYCLE_MIX, _lcd_mixer_cycle_mix); ACTION_ITEM(MSG_CYCLE_MIX, _lcd_mixer_cycle_mix);

@ -54,7 +54,7 @@ void _mmu2_load_filament(uint8_t index) {
ui.reset_status(); ui.reset_status();
} }
void action_mmu2_load_all() { void action_mmu2_load_all() {
for (uint8_t i = 0; i < EXTRUDERS; i++) LOOP_L_N(i, EXTRUDERS)
_mmu2_load_filament(i); _mmu2_load_filament(i);
ui.return_to_status(); ui.return_to_status();
} }

@ -357,7 +357,7 @@ void menu_move() {
#elif E_MANUAL > 1 #elif E_MANUAL > 1
// Independent extruders with one E-stepper per hotend // Independent extruders with one E-stepper per hotend
for (uint8_t n = 0; n < E_MANUAL; n++) SUBMENU_MOVE_E(n); LOOP_L_N(n, E_MANUAL) SUBMENU_MOVE_E(n);
#endif #endif

@ -111,7 +111,7 @@ void _lcd_preheat(const int16_t endnum, const int16_t temph, const int16_t tempb
#if HAS_HEATED_BED #if HAS_HEATED_BED
_PREHEAT_ITEMS(1,0); _PREHEAT_ITEMS(1,0);
#endif #endif
for (uint8_t n = 1; n < HOTENDS; n++) PREHEAT_ITEMS(1,n); LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(1,n);
ACTION_ITEM(MSG_PREHEAT_1_ALL, []() { ACTION_ITEM(MSG_PREHEAT_1_ALL, []() {
#if HAS_HEATED_BED #if HAS_HEATED_BED
_preheat_bed(0); _preheat_bed(0);
@ -139,7 +139,7 @@ void _lcd_preheat(const int16_t endnum, const int16_t temph, const int16_t tempb
#if HAS_HEATED_BED #if HAS_HEATED_BED
_PREHEAT_ITEMS(2,0); _PREHEAT_ITEMS(2,0);
#endif #endif
for (uint8_t n = 1; n < HOTENDS; n++) PREHEAT_ITEMS(2,n); LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(2,n);
ACTION_ITEM(MSG_PREHEAT_2_ALL, []() { ACTION_ITEM(MSG_PREHEAT_2_ALL, []() {
#if HAS_HEATED_BED #if HAS_HEATED_BED
_preheat_bed(1); _preheat_bed(1);

@ -222,7 +222,7 @@ void menu_tune() {
EDIT_ITEM(int3, MSG_FLOW, &planner.flow_percentage[active_extruder], 10, 999, []{ planner.refresh_e_factor(active_extruder); }); EDIT_ITEM(int3, MSG_FLOW, &planner.flow_percentage[active_extruder], 10, 999, []{ planner.refresh_e_factor(active_extruder); });
// Flow En: // Flow En:
#if EXTRUDERS > 1 #if EXTRUDERS > 1
for (uint8_t n = 0; n < EXTRUDERS; n++) LOOP_L_N(n, EXTRUDERS)
EDIT_ITEM_N(int3, n, MSG_FLOW_N, &planner.flow_percentage[n], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); EDIT_ITEM_N(int3, n, MSG_FLOW_N, &planner.flow_percentage[n], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); });
#endif #endif
#endif #endif
@ -234,7 +234,7 @@ void menu_tune() {
#if EXTRUDERS == 1 #if EXTRUDERS == 1
EDIT_ITEM(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); EDIT_ITEM(float52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999);
#elif EXTRUDERS > 1 #elif EXTRUDERS > 1
for (uint8_t n = 0; n < EXTRUDERS; n++) LOOP_L_N(n, EXTRUDERS)
EDIT_ITEM_N(float52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); EDIT_ITEM_N(float52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999);
#endif #endif
#endif #endif

@ -1136,7 +1136,7 @@ void MarlinUI::update() {
thermalManager.current_ADCKey_raw = HAL_ADC_RANGE; thermalManager.current_ADCKey_raw = HAL_ADC_RANGE;
thermalManager.ADCKey_count = 0; thermalManager.ADCKey_count = 0;
if (currentkpADCValue < adc_other_button) if (currentkpADCValue < adc_other_button)
for (uint8_t i = 0; i < ADC_KEY_NUM; i++) { LOOP_L_N(i, ADC_KEY_NUM) {
const uint16_t lo = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMin), const uint16_t lo = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMin),
hi = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMax); hi = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMax);
if (WITHIN(currentkpADCValue, lo, hi)) return pgm_read_byte(&stADCKeyTable[i].ADCKeyNo); if (WITHIN(currentkpADCValue, lo, hi)) return pgm_read_byte(&stADCKeyTable[i].ADCKeyNo);

@ -508,7 +508,7 @@ uint8_t L64XX_Marlin::get_user_input(uint8_t &driver_count, L64XX_axis_t axis_in
// Work on the drivers // Work on the drivers
// //
for (uint8_t k = 0; k < driver_count; k++) { LOOP_L_N(k, driver_count) {
uint8_t not_found = true; uint8_t not_found = true;
for (j = 1; j <= L64XX::chain[0]; j++) { for (j = 1; j <= L64XX::chain[0]; j++) {
PGM_P const str = (PGM_P)pgm_read_ptr(&index_to_axis[L64XX::chain[j]]); PGM_P const str = (PGM_P)pgm_read_ptr(&index_to_axis[L64XX::chain[j]]);

@ -54,7 +54,7 @@ Nozzle nozzle;
#endif #endif
// Start the stroke pattern // Start the stroke pattern
for (uint8_t i = 0; i < (strokes >> 1); i++) { LOOP_L_N(i, strokes >> 1) {
do_blocking_move_to_xy(end); do_blocking_move_to_xy(end);
do_blocking_move_to_xy(start); do_blocking_move_to_xy(start);
} }
@ -91,7 +91,7 @@ Nozzle nozzle;
const bool horiz = ABS(diff.x) >= ABS(diff.y); // Do a horizontal wipe? const bool horiz = ABS(diff.x) >= ABS(diff.y); // Do a horizontal wipe?
const float P = (horiz ? diff.x : diff.y) / zigs; // Period of each zig / zag const float P = (horiz ? diff.x : diff.y) / zigs; // Period of each zig / zag
const xyz_pos_t *side; const xyz_pos_t *side;
for (uint8_t j = 0; j < strokes; j++) { LOOP_L_N(j, strokes) {
for (int8_t i = 0; i < zigs; i++) { for (int8_t i = 0; i < zigs; i++) {
side = (i & 1) ? &end : &start; side = (i & 1) ? &end : &start;
if (horiz) if (horiz)
@ -134,8 +134,8 @@ Nozzle nozzle;
do_blocking_move_to(start); do_blocking_move_to(start);
#endif #endif
for (uint8_t s = 0; s < strokes; s++) LOOP_L_N(s, strokes)
for (uint8_t i = 0; i < NOZZLE_CLEAN_CIRCLE_FN; i++) LOOP_L_N(i, NOZZLE_CLEAN_CIRCLE_FN)
do_blocking_move_to_xy( do_blocking_move_to_xy(
middle.x + sin((RADIANS(360) / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius, middle.x + sin((RADIANS(360) / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius,
middle.y + cos((RADIANS(360) / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius middle.y + cos((RADIANS(360) / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius

@ -96,8 +96,8 @@ void apply_rotation_xyz(const matrix_3x3 &matrix, float &_x, float &_y, float &_
// Reset to identity. No rotate or translate. // Reset to identity. No rotate or translate.
void matrix_3x3::set_to_identity() { void matrix_3x3::set_to_identity() {
for (uint8_t i = 0; i < 3; i++) LOOP_L_N(i, 3)
for (uint8_t j = 0; j < 3; j++) LOOP_L_N(j, 3)
vectors[i][j] = float(i == j); vectors[i][j] = float(i == j);
} }
@ -134,8 +134,8 @@ matrix_3x3 matrix_3x3::create_look_at(const vector_3 &target) {
// Get a transposed copy of the matrix // Get a transposed copy of the matrix
matrix_3x3 matrix_3x3::transpose(const matrix_3x3 &original) { matrix_3x3 matrix_3x3::transpose(const matrix_3x3 &original) {
matrix_3x3 new_matrix; matrix_3x3 new_matrix;
for (uint8_t i = 0; i < 3; i++) LOOP_L_N(i, 3)
for (uint8_t j = 0; j < 3; j++) LOOP_L_N(j, 3)
new_matrix.vectors[i][j] = original.vectors[j][i]; new_matrix.vectors[i][j] = original.vectors[j][i];
return new_matrix; return new_matrix;
} }
@ -145,8 +145,8 @@ void matrix_3x3::debug(PGM_P const title) {
serialprintPGM(title); serialprintPGM(title);
SERIAL_EOL(); SERIAL_EOL();
} }
for (uint8_t i = 0; i < 3; i++) { LOOP_L_N(i, 3) {
for (uint8_t j = 0; j < 3; j++) { LOOP_L_N(j, 3) {
if (vectors[i][j] >= 0.0) SERIAL_CHAR('+'); if (vectors[i][j] >= 0.0) SERIAL_CHAR('+');
SERIAL_ECHO_F(vectors[i][j], 6); SERIAL_ECHO_F(vectors[i][j], 6);
SERIAL_CHAR(' '); SERIAL_CHAR(' ');

@ -583,7 +583,7 @@ void MarlinSettings::postprocess() {
#if HAS_HOTEND_OFFSET #if HAS_HOTEND_OFFSET
// Skip hotend 0 which must be 0 // Skip hotend 0 which must be 0
for (uint8_t e = 1; e < HOTENDS; e++) LOOP_S_L_N(e, 1, HOTENDS)
EEPROM_WRITE(hotend_offset[e]); EEPROM_WRITE(hotend_offset[e]);
#endif #endif
} }
@ -1420,7 +1420,7 @@ void MarlinSettings::postprocess() {
{ {
#if HAS_HOTEND_OFFSET #if HAS_HOTEND_OFFSET
// Skip hotend 0 which must be 0 // Skip hotend 0 which must be 0
for (uint8_t e = 1; e < HOTENDS; e++) LOOP_S_L_N(e, 1, HOTENDS)
EEPROM_READ(hotend_offset[e]); EEPROM_READ(hotend_offset[e]);
#endif #endif
} }
@ -2915,7 +2915,7 @@ void MarlinSettings::reset() {
#if HAS_HOTEND_OFFSET #if HAS_HOTEND_OFFSET
CONFIG_ECHO_HEADING("Hotend offsets:"); CONFIG_ECHO_HEADING("Hotend offsets:");
CONFIG_ECHO_START(); CONFIG_ECHO_START();
for (uint8_t e = 1; e < HOTENDS; e++) { LOOP_S_L_N(e, 1, HOTENDS) {
SERIAL_ECHOPAIR_P( SERIAL_ECHOPAIR_P(
PSTR(" M218 T"), (int)e, PSTR(" M218 T"), (int)e,
SP_X_STR, LINEAR_UNIT(hotend_offset[e].x), SP_X_STR, LINEAR_UNIT(hotend_offset[e].x),

@ -481,7 +481,7 @@ void _O2 Endstops::report_states() {
print_es_state(READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_INVERTING, PSTR(STR_FILAMENT_RUNOUT_SENSOR)); print_es_state(READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_INVERTING, PSTR(STR_FILAMENT_RUNOUT_SENSOR));
#else #else
#define _CASE_RUNOUT(N) case N: pin = FIL_RUNOUT##N##_PIN; break; #define _CASE_RUNOUT(N) case N: pin = FIL_RUNOUT##N##_PIN; break;
for (uint8_t i = 1; i <= NUM_RUNOUT_SENSORS; i++) { LOOP_S_LE_N(i, 1, NUM_RUNOUT_SENSORS) {
pin_t pin; pin_t pin;
switch (i) { switch (i) {
default: continue; default: continue;

@ -1408,7 +1408,7 @@ void Planner::check_axes_activity() {
* The multiplier converts a given E value into a length. * The multiplier converts a given E value into a length.
*/ */
void Planner::calculate_volumetric_multipliers() { void Planner::calculate_volumetric_multipliers() {
for (uint8_t i = 0; i < COUNT(filament_size); i++) { LOOP_L_N(i, COUNT(filament_size)) {
volumetric_multiplier[i] = calculate_volumetric_multiplier(filament_size[i]); volumetric_multiplier[i] = calculate_volumetric_multiplier(filament_size[i]);
refresh_e_factor(i); refresh_e_factor(i);
} }
@ -1991,7 +1991,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
#if ENABLED(DISABLE_INACTIVE_EXTRUDER) // Enable only the selected extruder #if ENABLED(DISABLE_INACTIVE_EXTRUDER) // Enable only the selected extruder
for (uint8_t i = 0; i < EXTRUDERS; i++) LOOP_L_N(i, EXTRUDERS)
if (g_uc_extruder_last_move[i] > 0) g_uc_extruder_last_move[i]--; if (g_uc_extruder_last_move[i] > 0) g_uc_extruder_last_move[i]--;
#if HAS_DUPLICATION_MODE #if HAS_DUPLICATION_MODE

@ -403,7 +403,7 @@ class Planner {
FORCE_INLINE static void set_filament_size(const uint8_t e, const float &v) { FORCE_INLINE static void set_filament_size(const uint8_t e, const float &v) {
filament_size[e] = v; filament_size[e] = v;
// make sure all extruders have some sane value for the filament size // make sure all extruders have some sane value for the filament size
for (uint8_t i = 0; i < COUNT(filament_size); i++) LOOP_L_N(i, COUNT(filament_size))
if (!filament_size[i]) filament_size[i] = DEFAULT_NOMINAL_FILAMENT_DIA; if (!filament_size[i]) filament_size[i] = DEFAULT_NOMINAL_FILAMENT_DIA;
} }
@ -807,7 +807,7 @@ class Planner {
FORCE_INLINE static void recalculate_max_e_jerk() { FORCE_INLINE static void recalculate_max_e_jerk() {
#define GET_MAX_E_JERK(N) SQRT(SQRT(0.5) * junction_deviation_mm * (N) * RECIPROCAL(1.0 - SQRT(0.5))) #define GET_MAX_E_JERK(N) SQRT(SQRT(0.5) * junction_deviation_mm * (N) * RECIPROCAL(1.0 - SQRT(0.5)))
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
for (uint8_t i = 0; i < EXTRUDERS; i++) LOOP_L_N(i, EXTRUDERS)
max_e_jerk[i] = GET_MAX_E_JERK(settings.max_acceleration_mm_per_s2[E_AXIS_N(i)]); max_e_jerk[i] = GET_MAX_E_JERK(settings.max_acceleration_mm_per_s2[E_AXIS_N(i)]);
#else #else
max_e_jerk = GET_MAX_E_JERK(settings.max_acceleration_mm_per_s2[E_AXIS]); max_e_jerk = GET_MAX_E_JERK(settings.max_acceleration_mm_per_s2[E_AXIS]);

@ -624,7 +624,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) {
#if EXTRA_PROBING #if EXTRA_PROBING
// Insert Z measurement into probes[]. Keep it sorted ascending. // Insert Z measurement into probes[]. Keep it sorted ascending.
for (uint8_t i = 0; i <= p; i++) { // Iterate the saved Zs to insert the new Z LOOP_LE_N(i, p) { // Iterate the saved Zs to insert the new Z
if (i == p || probes[i] > z) { // Last index or new Z is smaller than this Z if (i == p || probes[i] > z) { // Last index or new Z is smaller than this Z
for (int8_t m = p; --m >= i;) probes[m + 1] = probes[m]; // Shift items down after the insertion point for (int8_t m = p; --m >= i;) probes[m + 1] = probes[m]; // Shift items down after the insertion point
probes[i] = z; // Insert the new Z measurement probes[i] = z; // Insert the new Z measurement
@ -662,7 +662,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) {
max_avg_idx--; else min_avg_idx++; max_avg_idx--; else min_avg_idx++;
// Return the average value of all remaining probes. // Return the average value of all remaining probes.
for (uint8_t i = min_avg_idx; i <= max_avg_idx; i++) LOOP_S_LE_N(i, min_avg_idx, max_avg_idx)
probes_z_sum += probes[i]; probes_z_sum += probes[i];
#endif #endif

@ -2116,7 +2116,7 @@ void Stepper::init() {
#if MB(ALLIGATOR) #if MB(ALLIGATOR)
const float motor_current[] = MOTOR_CURRENT; const float motor_current[] = MOTOR_CURRENT;
unsigned int digipot_motor = 0; unsigned int digipot_motor = 0;
for (uint8_t i = 0; i < 3 + EXTRUDERS; i++) { LOOP_L_N(i, 3 + EXTRUDERS) {
digipot_motor = 255 * (motor_current[i] / 2.5); digipot_motor = 255 * (motor_current[i] / 2.5);
dac084s085::setValue(i, digipot_motor); dac084s085::setValue(i, digipot_motor);
} }
@ -2756,7 +2756,7 @@ void Stepper::report_positions() {
SPI.begin(); SPI.begin();
SET_OUTPUT(DIGIPOTSS_PIN); SET_OUTPUT(DIGIPOTSS_PIN);
for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) { LOOP_L_N(i, COUNT(digipot_motor_current)) {
//digitalPotWrite(digipot_ch[i], digipot_motor_current[i]); //digitalPotWrite(digipot_ch[i], digipot_motor_current[i]);
digipot_current(i, digipot_motor_current[i]); digipot_current(i, digipot_motor_current[i]);
} }

@ -708,7 +708,7 @@ int16_t Temperature::getHeaterPower(const heater_ind_t heater_id) {
}while(0) }while(0)
uint8_t fanDone = 0; uint8_t fanDone = 0;
for (uint8_t f = 0; f < COUNT(fanBit); f++) { LOOP_L_N(f, COUNT(fanBit)) {
const uint8_t realFan = pgm_read_byte(&fanBit[f]); const uint8_t realFan = pgm_read_byte(&fanBit[f]);
if (TEST(fanDone, realFan)) continue; if (TEST(fanDone, realFan)) continue;
const bool fan_on = TEST(fanState, realFan); const bool fan_on = TEST(fanState, realFan);
@ -2422,7 +2422,7 @@ void Temperature::readings_ready() {
#endif // HOTENDS > 1 #endif // HOTENDS > 1
}; };
for (uint8_t e = 0; e < COUNT(temp_dir); e++) { LOOP_L_N(e, COUNT(temp_dir)) {
const int8_t tdir = temp_dir[e]; const int8_t tdir = temp_dir[e];
if (tdir) { if (tdir) {
const int16_t rawtemp = temp_hotend[e].raw * tdir; // normal direction, +rawtemp, else -rawtemp const int16_t rawtemp = temp_hotend[e].raw * tdir; // normal direction, +rawtemp, else -rawtemp

@ -251,7 +251,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a
#elif ENABLED(PARKING_EXTRUDER) #elif ENABLED(PARKING_EXTRUDER)
void pe_solenoid_init() { void pe_solenoid_init() {
for (uint8_t n = 0; n <= 1; ++n) LOOP_LE_N(n, 1)
#if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT)
pe_activate_solenoid(n); pe_activate_solenoid(n);
#else #else

@ -228,7 +228,7 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e
return true; return true;
}; };
for (uint8_t x = 0; x < COUNT(pin_array); x++) { // scan entire array and report all instances of this pin LOOP_L_N(x, COUNT(pin_array)) { // scan entire array and report all instances of this pin
if (GET_ARRAY_PIN(x) == pin) { if (GET_ARRAY_PIN(x) == pin) {
if (!found) { // report digital and analog pin number only on the first time through if (!found) { // report digital and analog pin number only on the first time through
if (start_string) serialprintPGM(start_string); if (start_string) serialprintPGM(start_string);

@ -74,7 +74,7 @@
#else #else
static uint8_t CRC7(const uint8_t* data, uint8_t n) { static uint8_t CRC7(const uint8_t* data, uint8_t n) {
uint8_t crc = 0; uint8_t crc = 0;
for (uint8_t i = 0; i < n; i++) { LOOP_L_N(i, n) {
uint8_t d = data[i]; uint8_t d = data[i];
d ^= crc << 1; d ^= crc << 1;
if (d & 0x80) d ^= 9; if (d & 0x80) d ^= 9;
@ -106,7 +106,7 @@ uint8_t Sd2Card::cardCommand(const uint8_t cmd, const uint32_t arg) {
d[5] = CRC7(d, 5); d[5] = CRC7(d, 5);
// Send message // Send message
for (uint8_t k = 0; k < 6; k++) spiSend(d[k]); LOOP_L_N(k, 6) spiSend(d[k]);
#else #else
// Send command // Send command
@ -246,7 +246,7 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) {
spiInit(spiRate_); spiInit(spiRate_);
// Must supply min of 74 clock cycles with CS high. // Must supply min of 74 clock cycles with CS high.
for (uint8_t i = 0; i < 10; i++) spiSend(0xFF); LOOP_L_N(i, 10) spiSend(0xFF);
watchdog_refresh(); // In case init takes too long watchdog_refresh(); // In case init takes too long
@ -272,7 +272,7 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) {
} }
// Get the last byte of r7 response // Get the last byte of r7 response
for (uint8_t i = 0; i < 4; i++) status_ = spiRec(); LOOP_L_N(i, 4) status_ = spiRec();
if (status_ == 0xAA) { if (status_ == 0xAA) {
type(SD_CARD_TYPE_SD2); type(SD_CARD_TYPE_SD2);
break; break;
@ -303,7 +303,7 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) {
} }
if ((spiRec() & 0xC0) == 0xC0) type(SD_CARD_TYPE_SDHC); if ((spiRec() & 0xC0) == 0xC0) type(SD_CARD_TYPE_SDHC);
// Discard rest of ocr - contains allowed voltage range // Discard rest of ocr - contains allowed voltage range
for (uint8_t i = 0; i < 3; i++) spiRec(); LOOP_L_N(i, 3) spiRec();
} }
chipDeselect(); chipDeselect();

@ -204,7 +204,7 @@ bool SdBaseFile::dirEntry(dir_t* dir) {
*/ */
void SdBaseFile::dirName(const dir_t& dir, char* name) { void SdBaseFile::dirName(const dir_t& dir, char* name) {
uint8_t j = 0; uint8_t j = 0;
for (uint8_t i = 0; i < 11; i++) { LOOP_L_N(i, 11) {
if (dir.name[i] == ' ')continue; if (dir.name[i] == ' ')continue;
if (i == 8) name[j++] = '.'; if (i == 8) name[j++] = '.';
name[j++] = dir.name[i]; name[j++] = dir.name[i];
@ -345,10 +345,10 @@ int8_t SdBaseFile::lsPrintNext(uint8_t flags, uint8_t indent) {
&& DIR_IS_FILE_OR_SUBDIR(&dir)) break; && DIR_IS_FILE_OR_SUBDIR(&dir)) break;
} }
// indent for dir level // indent for dir level
for (uint8_t i = 0; i < indent; i++) SERIAL_CHAR(' '); LOOP_L_N(i, indent) SERIAL_CHAR(' ');
// print name // print name
for (uint8_t i = 0; i < 11; i++) { LOOP_L_N(i, 11) {
if (dir.name[i] == ' ')continue; if (dir.name[i] == ' ')continue;
if (i == 8) { if (i == 8) {
SERIAL_CHAR('.'); SERIAL_CHAR('.');
@ -478,7 +478,7 @@ bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) {
// make entry for '.' // make entry for '.'
memcpy(&d, p, sizeof(d)); memcpy(&d, p, sizeof(d));
d.name[0] = '.'; d.name[0] = '.';
for (uint8_t i = 1; i < 11; i++) d.name[i] = ' '; LOOP_S_L_N(i, 1, 11) d.name[i] = ' ';
// cache block for '.' and '..' // cache block for '.' and '..'
block = vol_->clusterStartBlock(firstCluster_); block = vol_->clusterStartBlock(firstCluster_);
@ -1088,7 +1088,7 @@ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) {
if (WITHIN(seq, 1, MAX_VFAT_ENTRIES)) { if (WITHIN(seq, 1, MAX_VFAT_ENTRIES)) {
// TODO: Store the filename checksum to verify if a long-filename-unaware system modified the file table. // TODO: Store the filename checksum to verify if a long-filename-unaware system modified the file table.
n = (seq - 1) * (FILENAME_LENGTH); n = (seq - 1) * (FILENAME_LENGTH);
for (uint8_t i = 0; i < FILENAME_LENGTH; i++) LOOP_L_N(i, FILENAME_LENGTH)
longFilename[n + i] = (i < 5) ? VFAT->name1[i] : (i < 11) ? VFAT->name2[i - 5] : VFAT->name3[i - 11]; longFilename[n + i] = (i < 5) ? VFAT->name1[i] : (i < 11) ? VFAT->name2[i - 5] : VFAT->name3[i - 11];
// If this VFAT entry is the last one, add a NUL terminator at the end of the string // If this VFAT entry is the last one, add a NUL terminator at the end of the string
if (VFAT->sequenceNumber & 0x40) longFilename[n + FILENAME_LENGTH] = '\0'; if (VFAT->sequenceNumber & 0x40) longFilename[n + FILENAME_LENGTH] = '\0';

@ -143,7 +143,7 @@ CardReader::CardReader() {
// //
char *createFilename(char * const buffer, const dir_t &p) { char *createFilename(char * const buffer, const dir_t &p) {
char *pos = buffer; char *pos = buffer;
for (uint8_t i = 0; i < 11; i++) { LOOP_L_N(i, 11) {
if (p.name[i] == ' ') continue; if (p.name[i] == ' ') continue;
if (i == 8) *pos++ = '.'; if (i == 8) *pos++ = '.';
*pos++ = p.name[i]; *pos++ = p.name[i];
@ -435,7 +435,7 @@ void CardReader::getAbsFilename(char *dst) {
if (cnt < MAXPATHNAMELENGTH) { *dst = '/'; dst++; cnt++; } if (cnt < MAXPATHNAMELENGTH) { *dst = '/'; dst++; cnt++; }
}; };
for (uint8_t i = 0; i < workDirDepth; i++) // Loop down to current work dir LOOP_L_N(i, workDirDepth) // Loop down to current work dir
appendAtom(workDirParents[i]); appendAtom(workDirParents[i]);
if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH) - 1) { // Leave room for filename and nul if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH) - 1) { // Leave room for filename and nul
@ -1046,7 +1046,7 @@ void CardReader::cdroot() {
#if ENABLED(SDSORT_DYNAMIC_RAM) #if ENABLED(SDSORT_DYNAMIC_RAM)
delete sort_order; delete sort_order;
#if ENABLED(SDSORT_CACHE_NAMES) #if ENABLED(SDSORT_CACHE_NAMES)
for (uint8_t i = 0; i < sort_count; ++i) { LOOP_L_N(i, sort_count) {
free(sortshort[i]); // strdup free(sortshort[i]); // strdup
free(sortnames[i]); // strdup free(sortnames[i]); // strdup
} }

Loading…
Cancel
Save