Merge branch 'bugfix-2.0.x' of https://github.com/MarlinFirmware/Marlin into bugfix-2.0.x

This commit is contained in:
Bob-the-Kuhn 2019-04-25 12:06:01 -05:00
commit 73726d56b3
154 changed files with 1156 additions and 525 deletions

View file

@ -1910,6 +1910,12 @@
// https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8
//
//#define FYSETC_MINI_12864
#ifdef FYSETC_MINI_12864
#define FYSETC_MINI_12864_REV_1_2 // types C, D, E & F back light is monochrome (always on) - discrete RGB signals
//#define FYSETC_MINI_12864_REV_2_0 // types A & B back light is RGB - requires LED_USER_PRESET_STARTUP - discrete RGB signals
//#define FYSETC_MINI_12864_REV_2_1 // types A & B back light is RGB - requires LED_USER_PRESET_STARTUP - RGB
//#define FYSETC_MINI_12864_REV_2_1 // types A & B back light is RGB - requires LED_USER_PRESET_STARTUP - Neopixel
#endif
//
// Factory display for Creality CR-10
@ -2013,6 +2019,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -53,7 +53,7 @@
// Public functions
// --------------------------------------------------------------------------
#if ENABLED(DUE_SOFTWARE_SPI)
#if EITHER(DUE_SOFTWARE_SPI, FORCE_SOFT_SPI)
// --------------------------------------------------------------------------
// software SPI
@ -739,7 +739,42 @@
#define SPI_MODE_2_DUE_HW 0
#define SPI_MODE_3_DUE_HW 1
/**
* The DUE SPI controller is set up so the upper word of the longword
* written to the transmit data register selects which SPI Chip Select
* Register is used. This allows different streams to have different SPI
* settings.
*
* In practice it's spooky. Some combinations hang the system, while others
* upset the peripheral device.
*
* SPI mode should be the same for all streams. The FYSETC_MINI_12864 gets
* upset if the clock phase changes after chip select goes active.
*
* SPI_CSR_CSAAT should be set for all streams. If not the WHILE_TX(0)
* macro returns immediately which can result in the SPI chip select going
* inactive before all the data has been sent.
*
* The TMC2130 library uses SPI0->SPI_CSR[3].
*
* The U8G hardware SPI uses SPI0->SPI_CSR[0]. The system hangs and/or the
* FYSETC_MINI_12864 gets upset if lower baud rates are used and the SD card
* is inserted or removed.
*
* The SD card uses SPI0->SPI_CSR[3]. Efforts were made to use [1] and [2]
* but they all resulted in hangs or garbage on the LCD.
*
* The SPI controlled chip selects are NOT enabled in the GPIO controller.
* The application must control the chip select.
*
* All of the above can be avoided by defining FORCE_SOFT_SPI to force the
* display to use software SPI.
*
*/
void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified)
// Also sets U8G SPI rate to 4MHz and the SPI mode to 3
// 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz
constexpr int spiDivider[] = { 10, 21, 42, 84, 168, 255, 255 };
if (spiRate > 6) spiRate = 1;
@ -760,15 +795,16 @@
// TMC2103 compatible setup
// Master mode, no fault detection, PCS bits in data written to TDR select CSR register
SPI0->SPI_MR = SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS;
// SPI mode 0, 8 Bit data transfer, baud rate
SPI0->SPI_CSR[3] = SPI_CSR_SCBR(spiDivider[spiRate]) | SPI_CSR_CSAAT | SPI_MODE_0_DUE_HW; // use same CSR as TMC2130
// SPI mode 3, 8 Bit data transfer, baud rate
SPI0->SPI_CSR[3] = SPI_CSR_SCBR(spiDivider[spiRate]) | SPI_CSR_CSAAT | SPI_MODE_3_DUE_HW; // use same CSR as TMC2130
SPI0->SPI_CSR[0] = SPI_CSR_SCBR(spiDivider[1]) | SPI_CSR_CSAAT | SPI_MODE_3_DUE_HW; // U8G default to 4MHz
}
void spiBegin() { spiInit(); }
static uint8_t spiTransfer(uint8_t data) {
WHILE_TX(0);
SPI0->SPI_TDR = (uint32_t)data | 0x00070000UL; // Add TMC2130 PCS bits to every byte
SPI0->SPI_TDR = (uint32_t)data | 0x00070000UL; // Add TMC2130 PCS bits to every byte (use SPI0->SPI_CSR[3])
WHILE_TX(0);
WHILE_RX(0);
return SPI0->SPI_RDR;

View file

@ -99,7 +99,7 @@ static void u8g_com_DUE_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) {
spiSend_sw_DUE(rs ? 0x0FA : 0x0F8); // Command or Data
DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe
}
spiSend_sw_DUE(val & 0x0F0);
spiSend_sw_DUE(val & 0xF0);
spiSend_sw_DUE(val << 4);
}
@ -168,6 +168,42 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
return 1;
}
#endif // HAS_GRAPHICAL_LCD
#if ENABLED(LIGHTWEIGHT_UI)
#include "../../lcd/ultralcd.h"
#include "../shared/HAL_ST7920.h"
#define ST7920_CS_PIN LCD_PINS_RS
#if DOGM_SPI_DELAY_US > 0
#define U8G_DELAY() DELAY_US(DOGM_SPI_DELAY_US)
#else
#define U8G_DELAY() DELAY_US(10)
#endif
void ST7920_cs() {
WRITE(ST7920_CS_PIN, HIGH);
U8G_DELAY();
}
void ST7920_ncs() {
WRITE(ST7920_CS_PIN, LOW);
}
void ST7920_set_cmd() {
spiSend_sw_DUE(0xF8);
DELAY_US(40);
}
void ST7920_set_dat() {
spiSend_sw_DUE(0xFA);
DELAY_US(40);
}
void ST7920_write_byte(const uint8_t val) {
spiSend_sw_DUE(val & 0xF0);
spiSend_sw_DUE(val << 4);
}
#endif // LIGHTWEIGHT_UI
#endif // HAS_GRAPHICAL_LCD
#endif // ARDUINO_ARCH_SAM

View file

@ -133,12 +133,16 @@ int freeMemory() {
// --------------------------------------------------------------------------
// ADC
// --------------------------------------------------------------------------
#define ADC1_CHANNEL(pin) ADC1_GPIO##pin_CHANNEL
#define ADC1_CHANNEL(pin) ADC1_GPIO ## pin ## _CHANNEL
adc1_channel_t get_channel(int pin) {
switch (pin) {
case 36: return ADC1_GPIO36_CHANNEL;
case 39: return ADC1_GPIO39_CHANNEL;
case 39: return ADC1_CHANNEL(39);
case 36: return ADC1_CHANNEL(36);
case 35: return ADC1_CHANNEL(35);
case 34: return ADC1_CHANNEL(34);
case 33: return ADC1_CHANNEL(33);
case 32: return ADC1_CHANNEL(32);
}
return ADC1_CHANNEL_MAX;
@ -147,8 +151,15 @@ adc1_channel_t get_channel(int pin) {
void HAL_adc_init() {
// Configure ADC
adc1_config_width(ADC_WIDTH_12Bit);
adc1_config_channel_atten(get_channel(36), ADC_ATTEN_11db);
adc1_config_channel_atten(get_channel(39), ADC_ATTEN_11db);
adc1_config_channel_atten(get_channel(36), ADC_ATTEN_11db);
adc1_config_channel_atten(get_channel(35), ADC_ATTEN_11db);
adc1_config_channel_atten(get_channel(34), ADC_ATTEN_11db);
adc1_config_channel_atten(get_channel(33), ADC_ATTEN_11db);
adc1_config_channel_atten(get_channel(32), ADC_ATTEN_11db);
// Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
// That's why we're not setting it up here.
// Calculate ADC characteristics i.e. gain and offset factors
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, V_REF, &characteristics);

View file

@ -30,13 +30,18 @@
#include <stdint.h>
// these are going to be re-defined in Arduino.h
#undef DISABLED
#undef M_PI
#undef _BV
#include <Arduino.h>
// revert back to the correct (old) definition
#undef DISABLED
#define DISABLED(V...) DO(DIS,&&,V)
// re-define in case Arduino.h has been skipped due to earlier inclusion (i.e. in Marlin\src\HAL\HAL_ESP32\i2s.cpp)
#define _BV(b) (1UL << (b))
#include "../shared/math_32bit.h"
#include "../shared/HAL_SPI.h"

View file

@ -27,6 +27,10 @@
* Utility functions
*/
// I2S expander pin mapping.
#define IS_I2S_EXPANDER_PIN(IO) TEST(IO, 7)
#define I2S_EXPANDER_PIN_INDEX(IO) (IO & 0x7F)
// Set pin as input
#define _SET_INPUT(IO) pinMode(IO, INPUT)
@ -37,10 +41,10 @@
#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT)
// Read a pin wrapper
#define READ(IO) digitalRead(IO)
#define READ(IO) (IS_I2S_EXPANDER_PIN(IO) ? i2s_state(I2S_EXPANDER_PIN_INDEX(IO)) : digitalRead(IO))
// Write to a pin wrapper
#define WRITE(IO, v) (TEST(IO, 7) ? i2s_write(IO & 0x7F, v) : digitalWrite(IO, v))
#define WRITE(IO, v) (IS_I2S_EXPANDER_PIN(IO) ? i2s_write(I2S_EXPANDER_PIN_INDEX(IO), v) : digitalWrite(IO, v))
// Set pin as input wrapper
#define SET_INPUT(IO) _SET_INPUT(IO)
@ -61,8 +65,9 @@
#define extDigitalRead(IO) digitalRead(IO)
#define extDigitalWrite(IO,V) digitalWrite(IO,V)
#define PWM_PIN(P) true
#define USEABLE_HARDWARE_PWM(P) PWM_PIN(P)
// PWM outputs
#define PWM_PIN(P) (P < 34) // NOTE Pins >= 34 are input only on ESP32, so they can't be used for output.
#define USEABLE_HARDWARE_PWM(P) (!IS_I2S_EXPANDER_PIN(P) && PWM_PIN(P))
// Toggle pin value
#define TOGGLE(IO) WRITE(IO, !READ(IO))

View file

@ -21,7 +21,12 @@
*/
#ifdef ARDUINO_ARCH_ESP32
#include <Arduino.h> // replace that with the proper imports
// replace that with the proper imports, then cleanup workarounds in Marlin\src\HAL\HAL_ESP32\HAL.h
#include <Arduino.h>
// revert back to the correct definition
#undef DISABLED
#define DISABLED(V...) DO(DIS,&&,V)
#include "i2s.h"
#include "../../core/macros.h"
#include "driver/periph_ctrl.h"
@ -315,6 +320,10 @@ void i2s_write(uint8_t pin, uint8_t val) {
SET_BIT_TO(i2s_port_data, pin, val);
}
uint8_t i2s_state(uint8_t pin) {
return TEST(i2s_port_data, pin);
}
void i2s_push_sample() {
dma.current[dma.rw_pos++] = i2s_port_data;
}

View file

@ -26,6 +26,8 @@ extern uint32_t i2s_port_data;
int i2s_init();
uint8_t i2s_state(uint8_t pin);
void i2s_write(uint8_t pin, uint8_t val);
void i2s_push_sample();

View file

@ -18,7 +18,7 @@
*/
#pragma once
#define SS_PIN 5
#define SS_PIN SDSS
#define SCK_PIN 18
#define MISO_PIN 19
#define MOSI_PIN 23

View file

@ -147,6 +147,9 @@ using FilteredADC = LPC176x::ADC<ADC_LOWPASS_K_VALUE, ADC_MEDIAN_FILTER_SIZE>;
#define HAL_READ_ADC() FilteredADC::get_result()
#define HAL_ADC_READY() FilteredADC::finished_conversion()
// A grace period for the ADC readings to stabilize before they start causing thermal protection errors.
#define THERMAL_PROTECTION_GRACE_PERIOD 500
// Parse a G-code word into a pin index
int16_t PARSED_PIN_INDEX(const char code, const int16_t dval);
// P0.6 thru P0.9 are for the onboard SD card

View file

@ -66,12 +66,7 @@
#endif
#endif // SPINDLE_LASER_ENABLE
#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI) \
&& (MB(RAMPS_14_RE_ARM_EFB) \
|| MB(RAMPS_14_RE_ARM_EEB) \
|| MB(RAMPS_14_RE_ARM_EFF) \
|| MB(RAMPS_14_RE_ARM_EEF) \
|| MB(RAMPS_14_RE_ARM_SF))
#if IS_RE_ARM_BOARD && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI)
#error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 require TMC_USE_SW_SPI"
#endif

View file

@ -0,0 +1,36 @@
/**
* Marlin 3D Printer Firmware
* Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#pragma once
/**
* HAL/HAL_ST7920.h
* For the HALs that provide direct access to the ST7920 display
* (bypassing U8G), it will allow the LIGHTWEIGHT_UI to operate.
*/
#if HAS_GRAPHICAL_LCD && ENABLED(LIGHTWEIGHT_UI)
void ST7920_cs();
void ST7920_ncs();
void ST7920_set_cmd();
void ST7920_set_dat();
void ST7920_write_byte(const uint8_t data);
#endif

View file

@ -26,6 +26,7 @@
// (or not) in a given .cpp file
//
#undef DEBUG_PRINT_P
#undef DEBUG_ECHO_START
#undef DEBUG_ERROR_START
#undef DEBUG_CHAR

View file

@ -344,7 +344,6 @@
#define MSG_LCD_N3 " 4"
#define MSG_LCD_N4 " 5"
#define MSG_LCD_N5 " 6"
#define MSG_E0 "E0"
#define MSG_E1 "E1"
#define MSG_E2 "E2"
#define MSG_E3 "E3"

View file

@ -126,6 +126,12 @@ void GcodeSuite::G34() {
extruder_duplication_enabled = false;
#endif
// Before moving other axes raise Z, if needed. Never lower Z.
if (current_position[Z_AXIS] < Z_CLEARANCE_BETWEEN_PROBES) {
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before moving to probe pos) to ", Z_CLEARANCE_BETWEEN_PROBES);
do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES);
}
// Remember corrections to determine errors on each iteration
float last_z_align_move[Z_STEPPER_COUNT] = ARRAY_N(Z_STEPPER_COUNT, 10000.0f, 10000.0f, 10000.0f),
z_measured[Z_STEPPER_COUNT] = { 0 };

View file

@ -25,18 +25,11 @@
#include "../../core/serial.h"
#include "../../inc/MarlinConfig.h"
#if ENABLED(EXTENSIBLE_UI)
#include "../../lcd/extensible_ui/ui_api.h"
#endif
/**
* M500: Store settings in EEPROM
*/
void GcodeSuite::M500() {
(void)settings.save();
#if ENABLED(EXTENSIBLE_UI)
ExtUI::onStoreSettings();
#endif
}
/**
@ -44,9 +37,6 @@ void GcodeSuite::M500() {
*/
void GcodeSuite::M501() {
(void)settings.load();
#if ENABLED(EXTENSIBLE_UI)
ExtUI::onLoadSettings();
#endif
}
/**
@ -54,9 +44,6 @@ void GcodeSuite::M501() {
*/
void GcodeSuite::M502() {
(void)settings.reset();
#if ENABLED(EXTENSIBLE_UI)
ExtUI::onFactoryReset();
#endif
}
#if DISABLED(DISABLE_M503)

View file

@ -29,8 +29,18 @@
#include "../../../module/stepper_indirection.h"
/**
* M906: Set motor current in milliamps using axis codes X, Y, Z, E
* Report driver currents when no axis specified
* M906: Set motor current in milliamps.
*
* Parameters:
* X[current] - Set mA current for X driver(s)
* Y[current] - Set mA current for Y driver(s)
* Z[current] - Set mA current for Z driver(s)
* E[current] - Set mA current for E driver(s)
*
* I[index] - Axis sub-index (Omit or 0 for X, Y, Z; 1 for X2, Y2, Z2; 2 for Z3.)
* T[index] - Extruder index (Zero-based. Omit for E0 only.)
*
* With no parameters report driver currents.
*/
void GcodeSuite::M906() {
#define TMC_SAY_CURRENT(Q) tmc_get_current(stepper##Q)

View file

@ -138,6 +138,8 @@
#elif ENABLED(MKS_MINI_12864)
#define MINIPANEL
#define DEFAULT_LCD_CONTRAST 150
#define LCD_CONTRAST_MAX 255
#elif ENABLED(FYSETC_MINI_12864)
@ -153,7 +155,9 @@
#if EITHER(MAKRPANEL, MINIPANEL)
#define DOGLCD
#define ULTIPANEL
#ifndef DEFAULT_LCD_CONTRAST
#define DEFAULT_LCD_CONTRAST 17
#endif
#endif
#if ENABLED(ULTI_CONTROLLER)
@ -325,7 +329,7 @@
/**
* Default LCD contrast for Graphical LCD displays
*/
#define HAS_LCD_CONTRAST HAS_GRAPHICAL_LCD && defined(DEFAULT_LCD_CONTRAST)
#define HAS_LCD_CONTRAST (HAS_GRAPHICAL_LCD && defined(DEFAULT_LCD_CONTRAST))
#if HAS_LCD_CONTRAST
#ifndef LCD_CONTRAST_MIN
#define LCD_CONTRAST_MIN 0
@ -562,3 +566,5 @@
#if ENABLED(SLIM_LCD_MENUS)
#define BOOT_MARLIN_LOGO_SMALL
#endif
#define IS_RE_ARM_BOARD (MB(RAMPS_14_RE_ARM_EFB) || MB(RAMPS_14_RE_ARM_EEB) || MB(RAMPS_14_RE_ARM_EFF) || MB(RAMPS_14_RE_ARM_EEF) || MB(RAMPS_14_RE_ARM_SF))

View file

@ -1038,9 +1038,7 @@ void MarlinUI::draw_status_screen() {
}
void draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
SETCURSOR(0, 0); lcd_put_u8str_P(pref);
if (string) wrap_string(1, string);
if (suff) lcd_put_u8str_P(suff);
ui.draw_select_screen_prompt(pref, string, suff);
SETCURSOR(0, LCD_HEIGHT - 1);
lcd_put_wchar(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd_put_wchar(yesno ? ' ' : ']');
SETCURSOR_RJ(utf8_strlen_P(yes) + 2, LCD_HEIGHT - 1);

View file

@ -94,3 +94,16 @@ public:
: U8GLIB(&u8g_dev_tft_320x240_upscale_from_128x64, cs, rs, reset)
{ }
};
extern u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, u8g_dev_uc1701_mini12864_HAL_2x_hw_spi;
class U8GLIB_MINI12864_2X_HAL : public U8GLIB {
public:
U8GLIB_MINI12864_2X_HAL(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
: U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, sck, mosi, cs, a0, reset)
{ }
U8GLIB_MINI12864_2X_HAL(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE)
: U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_hw_spi, cs, a0, reset)
{ }
};

View file

@ -158,9 +158,7 @@ void ST7920_Lite_Status_Screen::entry_mode_select(const bool ac_increase, const
// function for scroll_or_addr_select()
void ST7920_Lite_Status_Screen::_scroll_or_addr_select(const bool sa) {
extended_function_set(true);
cmd(0b00100010 |
(sa ? 0b000001 : 0)
);
cmd(0b00000010 | (sa ? 0b00000001 : 0));
current_bits.sa = sa;
}
@ -907,34 +905,6 @@ void ST7920_Lite_Status_Screen::clear_text_buffer() {
ncs();
}
#if ENABLED(U8GLIB_ST7920) && !defined(U8G_HAL_LINKS) && !defined(__SAM3X8E__)
#include "ultralcd_st7920_u8glib_rrd_AVR.h"
void ST7920_Lite_Status_Screen::cs() {
ST7920_CS();
current_bits.synced = false;
}
void ST7920_Lite_Status_Screen::ncs() {
ST7920_NCS();
current_bits.synced = false;
}
void ST7920_Lite_Status_Screen::sync_cmd() {
ST7920_SET_CMD();
}
void ST7920_Lite_Status_Screen::sync_dat() {
ST7920_SET_DAT();
}
void ST7920_Lite_Status_Screen::write_byte(const uint8_t data) {
ST7920_WRITE_BYTE(data);
}
#endif
void MarlinUI::draw_status_screen() {
ST7920_Lite_Status_Screen::update(false);
}

View file

@ -15,6 +15,8 @@
*/
#pragma once
#include "../../HAL/shared/HAL_ST7920.h"
#include "../../core/macros.h"
#include "../../libs/duration_t.h"
@ -28,11 +30,11 @@ class ST7920_Lite_Status_Screen {
uint8_t sa : 1;
} current_bits;
static void cs();
static void ncs();
static void sync_cmd();
static void sync_dat();
static void write_byte(const uint8_t w);
static void cs() { ST7920_cs(); current_bits.synced = false; }
static void ncs() { ST7920_cs(); current_bits.synced = false; }
static void sync_cmd() { ST7920_set_cmd(); }
static void sync_dat() { ST7920_set_dat(); }
static void write_byte(const uint8_t w) { ST7920_write_byte(w); }
FORCE_INLINE static void write_word(const uint16_t w) {
write_byte((w >> 8) & 0xFF);

View file

@ -87,10 +87,15 @@ static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = {
0x000, /* disable */
0x0AF, /* display on */
U8G_ESC_CS(0), /* disable chip */
U8G_ESC_DLY(100), /* delay 100 ms */
U8G_ESC_CS(1), /* enable chip */
0x0A5, /* display all points, ST7565 */
U8G_ESC_CS(0), /* disable chip */
U8G_ESC_DLY(100), /* delay 100 ms */
U8G_ESC_DLY(100), /* delay 100 ms */
U8G_ESC_CS(1), /* enable chip */
0x0A4, /* normal display */
U8G_ESC_CS(0), /* disable chip */
U8G_ESC_END /* end of sequence */

View file

@ -175,14 +175,14 @@ void MarlinUI::set_font(const MarlinFont font_nr) {
// Can the text fit to the right of the bitmap?
if (text_max_width < rspace) {
constexpr uint8_t inter = (width - text_max_width - (START_BMPWIDTH)) / 3; // Evenly distribute horizontal space
constexpr int8_t inter = (width - text_max_width - (START_BMPWIDTH)) / 3; // Evenly distribute horizontal space
offx = inter; // First the boot logo...
offy = (height - (START_BMPHEIGHT)) / 2; // ...V-aligned in the full height
txt_offx_1 = txt_offx_2 = inter + (START_BMPWIDTH) + inter; // Text right of the bitmap
txt_base = (height + MENU_FONT_ASCENT + text_total_height - (MENU_FONT_HEIGHT)) / 2; // Text vertical center
}
else {
constexpr uint8_t inter = (height - text_total_height - (START_BMPHEIGHT)) / 3; // Evenly distribute vertical space
constexpr int8_t inter = (height - text_total_height - (START_BMPHEIGHT)) / 3; // Evenly distribute vertical space
offy = inter; // V-align boot logo proportionally
offx = rspace / 2; // Center the boot logo in the whole space
txt_offx_1 = (width - text_width_1) / 2; // Text 1 centered
@ -439,9 +439,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
}
void draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
SETCURSOR(0, 0); lcd_put_u8str_P(pref);
if (string) wrap_string(1, string);
if (suff) lcd_put_u8str_P(suff);
ui.draw_select_screen_prompt(pref, string, suff);
draw_boxed_string(1, LCD_HEIGHT - 1, no, !yesno);
draw_boxed_string(LCD_WIDTH - (utf8_strlen_P(yes) + 1), LCD_HEIGHT - 1, yes, yesno);
}

View file

@ -111,8 +111,8 @@
// The MINIPanel display
//#define U8G_CLASS U8GLIB_MINI12864
//#define U8G_PARAM DOGLCD_CS, DOGLCD_A0 // 8 stripes
#define U8G_CLASS U8GLIB_MINI12864_2X
#if EITHER(FYSETC_MINI_12864, TARGET_LPC1768)
#define U8G_CLASS U8GLIB_MINI12864_2X_HAL
#if BOTH(FYSETC_MINI_12864, FORCE_SOFT_SPI)
#define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0 // 4 stripes SW-SPI
#else
#define U8G_PARAM DOGLCD_CS, DOGLCD_A0 // 4 stripes HW-SPI

View file

@ -134,4 +134,13 @@ u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = {u8g_dev_rrd_st7920_128x64_fn, &u8g
#pragma GCC reset_options
#if ENABLED(LIGHTWEIGHT_UI)
#include "../../HAL/shared/HAL_ST7920.h"
void ST7920_cs() { ST7920_CS(); }
void ST7920_ncs() { ST7920_NCS(); }
void ST7920_set_cmd() { ST7920_SET_CMD(); }
void ST7920_set_dat() { ST7920_SET_DAT(); }
void ST7920_write_byte(const uint8_t val) { ST7920_WRITE_BYTE(val); }
#endif
#endif // U8GLIB_ST7920 && !U8G_HAL_LINKS && !__SAM3X8E__

View file

@ -332,9 +332,11 @@
#define MSG_ENDSTOP_ABORT _UxGT("Endstopp Abbr.")
#define MSG_HEATING_FAILED_LCD _UxGT("HEIZEN ERFOLGLOS")
#define MSG_HEATING_FAILED_LCD_BED _UxGT("Bett heizen fehlge.")
#define MSG_HEATING_FAILED_LCD_CHAMBER _UxGT("Geh. heizen fehlge.")
#define MSG_ERR_REDUNDANT_TEMP _UxGT("REDUND. TEMP-ABWEI.")
#define MSG_THERMAL_RUNAWAY LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT")
#define MSG_THERMAL_RUNAWAY_BED _UxGT("BETT") MSG_THERMAL_RUNAWAY
#define MSG_THERMAL_RUNAWAY_CHAMBER _UxGT("GEH.") MSG_THERMAL_RUNAWAY
#define MSG_ERR_MAXTEMP LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN")
#define MSG_ERR_MINTEMP LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN")
#define MSG_ERR_MAXTEMP_BED _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN")

View file

@ -753,12 +753,27 @@
#ifndef MSG_START_PRINT
#define MSG_START_PRINT _UxGT("Start print")
#endif
#ifndef MSG_BUTTON_NEXT
#define MSG_BUTTON_NEXT _UxGT("Next")
#endif
#ifndef MSG_BUTTON_INIT
#define MSG_BUTTON_INIT _UxGT("Init")
#endif
#ifndef MSG_BUTTON_STOP
#define MSG_BUTTON_STOP _UxGT("Stop")
#endif
#ifndef MSG_BUTTON_PRINT
#define MSG_BUTTON_PRINT _UxGT("Print")
#endif
#ifndef MSG_BUTTON_RESET
#define MSG_BUTTON_RESET _UxGT("Reset")
#endif
#ifndef MSG_BUTTON_CANCEL
#define MSG_BUTTON_CANCEL _UxGT("Cancel")
#endif
#ifndef MSG_BUTTON_DONE
#define MSG_BUTTON_DONE _UxGT("Done")
#endif
#ifndef MSG_PAUSE_PRINT
#define MSG_PAUSE_PRINT _UxGT("Pause print")
#endif
@ -930,6 +945,9 @@
#ifndef MSG_HEATING_FAILED_LCD_BED
#define MSG_HEATING_FAILED_LCD_BED _UxGT("Bed heating failed")
#endif
#ifndef MSG_HEATING_FAILED_LCD_CHAMBER
#define MSG_HEATING_FAILED_LCD_CHAMBER _UxGT("Chamber heating fail")
#endif
#ifndef MSG_ERR_REDUNDANT_TEMP
#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: REDUNDANT TEMP")
#endif
@ -939,6 +957,9 @@
#ifndef MSG_THERMAL_RUNAWAY_BED
#define MSG_THERMAL_RUNAWAY_BED _UxGT("BED THERMAL RUNAWAY")
#endif
#ifndef MSG_THERMAL_RUNAWAY_CHAMBER
#define MSG_THERMAL_RUNAWAY_CHAMBER _UxGT("CHAMBER T. RUNAWAY")
#endif
#ifndef MSG_ERR_MAXTEMP
#define MSG_ERR_MAXTEMP _UxGT("Err: MAXTEMP")
#endif

View file

@ -33,19 +33,25 @@
#define CHARSIZE 2
#define WELCOME_MSG MACHINE_NAME _UxGT(" prête.")
#define MSG_YES _UxGT("Oui")
#define MSG_NO _UxGT("Non")
#define MSG_BACK _UxGT("Retour")
#define MSG_SD_INSERTED _UxGT("Carte insérée")
#define MSG_SD_REMOVED _UxGT("Carte retirée")
#define MSG_LCD_ENDSTOPS _UxGT("Butées") // Max length 8 characters
#define MSG_LCD_ENDSTOPS _UxGT("Butées")
#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Butées SW")
#define MSG_MAIN _UxGT("Menu principal")
#define MSG_AUTOSTART _UxGT("Demarrage auto")
#define MSG_ADVANCED_SETTINGS _UxGT("Config. avancée")
#define MSG_CONFIGURATION _UxGT("Configuration")
#define MSG_AUTOSTART _UxGT("Exéc. auto#.gcode")
#define MSG_DISABLE_STEPPERS _UxGT("Arrêter moteurs")
#define MSG_DEBUG_MENU _UxGT("Menu debug")
#define MSG_PROGRESS_BAR_TEST _UxGT("Test barre progress.")
#define MSG_AUTO_HOME _UxGT("Origine auto.")
#define MSG_AUTO_HOME_X _UxGT("Origine X Auto.")
#define MSG_AUTO_HOME_Y _UxGT("Origine Y Auto.")
#define MSG_AUTO_HOME_Z _UxGT("Origine Z Auto.")
#define MSG_AUTO_HOME_X _UxGT("Origine X auto.")
#define MSG_AUTO_HOME_Y _UxGT("Origine Y auto.")
#define MSG_AUTO_HOME_Z _UxGT("Origine Z auto.")
#define MSG_AUTO_Z_ALIGN _UxGT("Align. Z auto.")
#define MSG_LEVEL_BED_HOMING _UxGT("Origine XYZ")
#define MSG_LEVEL_BED_WAITING _UxGT("Clic pour commencer")
#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Point suivant")
@ -59,14 +65,20 @@
#define MSG_PREHEAT_1_ALL _UxGT("Préch. " PREHEAT_1_LABEL " Tout")
#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" buse")
#define MSG_PREHEAT_1_BEDONLY _UxGT("Préch. " PREHEAT_1_LABEL " lit")
#define MSG_PREHEAT_1_SETTINGS _UxGT("Régl. prech. " PREHEAT_1_LABEL)
#define MSG_PREHEAT_1_SETTINGS _UxGT("Régl. préch. " PREHEAT_1_LABEL)
#define MSG_PREHEAT_2 _UxGT("Préchauffage " PREHEAT_2_LABEL)
#define MSG_PREHEAT_2_N _UxGT("Préchauff. " PREHEAT_2_LABEL " ")
#define MSG_PREHEAT_2_ALL _UxGT("Préch. " PREHEAT_2_LABEL " Tout")
#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" buse")
#define MSG_PREHEAT_2_BEDONLY _UxGT("Préch. " PREHEAT_2_LABEL " lit")
#define MSG_PREHEAT_2_SETTINGS _UxGT("Régl. prech. " PREHEAT_2_LABEL)
#define MSG_PREHEAT_2_SETTINGS _UxGT("Régl. préch. " PREHEAT_2_LABEL)
#define MSG_PREHEAT_CUSTOM _UxGT("Préchauff. perso.")
#define MSG_COOLDOWN _UxGT("Refroidir")
#define MSG_LASER_MENU _UxGT("Contrôle Laser")
#define MSG_LASER_OFF _UxGT("Laser Off")
#define MSG_LASER_ON _UxGT("Laser On")
#define MSG_LASER_POWER _UxGT("Puissance")
#define MSG_SPINDLE_REVERSE _UxGT("Inverser broches")
#define MSG_SWITCH_PS_ON _UxGT("Allumer alim.")
#define MSG_SWITCH_PS_OFF _UxGT("Eteindre alim.")
#define MSG_EXTRUDE _UxGT("Extrusion")
@ -77,12 +89,24 @@
#define MSG_LEVEL_CORNERS _UxGT("Niveau coins")
#define MSG_NEXT_CORNER _UxGT("Coin suivant")
#define MSG_EDITING_STOPPED _UxGT("Arrêt édit. maillage")
#define MSG_USER_MENU _UxGT("Commandes perso")
#define MSG_MESH_X _UxGT("Index X")
#define MSG_MESH_Y _UxGT("Index Y")
#define MSG_MESH_EDIT_Z _UxGT("Valeur Z")
#define MSG_USER_MENU _UxGT("Commandes perso.")
#define MSG_UBL_DOING_G29 _UxGT("G29 en cours")
#define MSG_UBL_UNHOMED _UxGT("Origine XYZ d'abord")
#define MSG_UBL_TOOLS _UxGT("Outils UBL")
#define MSG_UBL_LEVEL_BED _UxGT("Niveau lit unifié")
#define MSG_IDEX_MENU _UxGT("Mode IDEX")
#define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-Park")
#define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplication")
#define MSG_IDEX_MODE_MIRRORED_COPY _UxGT("Copie miroir")
#define MSG_IDEX_MODE_FULL_CTRL _UxGT("Contrôle complet")
#define MSG_OFFSETS_MENU _UxGT("Offsets Outil")
#define MSG_X_OFFSET _UxGT("Buse 2 X")
#define MSG_Y_OFFSET _UxGT("Buse 2 Y")
#define MSG_Z_OFFSET _UxGT("Buse 2 Z")
#define MSG_UBL_MANUAL_MESH _UxGT("Maillage manuel")
#define MSG_UBL_BC_INSERT _UxGT("Poser câle & mesurer")
#define MSG_UBL_BC_INSERT2 _UxGT("Mesure")
@ -167,6 +191,7 @@
#define MSG_MOVE_Y _UxGT("Dépl. Y")
#define MSG_MOVE_Z _UxGT("Dépl. Z")
#define MSG_MOVE_E _UxGT("Extrudeur")
#define MSG_HOTEND_TOO_COLD _UxGT("Buse trop froide")
#define MSG_MOVE_01MM _UxGT("Dépl. 0.1mm")
#define MSG_MOVE_1MM _UxGT("Dépl. 1mm")
#define MSG_MOVE_10MM _UxGT("Dépl. 10mm")
@ -174,6 +199,7 @@
#define MSG_BED_Z _UxGT("Lit Z")
#define MSG_NOZZLE _UxGT("Buse")
#define MSG_BED _UxGT("Lit")
#define MSG_CHAMBER _UxGT("Caisson")
#define MSG_FAN_SPEED _UxGT("Vitesse ventil.")
#define MSG_EXTRA_FAN_SPEED _UxGT("Extra V ventil.")
@ -203,6 +229,7 @@
#endif
#define MSG_VE_JERK _UxGT("Ve jerk")
#define MSG_VELOCITY _UxGT("Vélocité")
#define MSG_JUNCTION_DEVIATION _UxGT("Déviat. jonct.")
#define MSG_VMAX _UxGT("Vmax ")
#define MSG_VMIN _UxGT("Vmin ")
#define MSG_VTRAV_MIN _UxGT("V dépl. min")
@ -240,19 +267,26 @@
#define MSG_LOAD_EEPROM _UxGT("Lire config")
#define MSG_RESTORE_FAILSAFE _UxGT("Restaurer défauts")
#define MSG_INIT_EEPROM _UxGT("Initialiser EEPROM")
#define MSG_SD_UPDATE _UxGT("MàJ. SD")
#define MSG_RESET_PRINTER _UxGT("RàZ. imprimante")
#define MSG_REFRESH _UxGT("Actualiser")
#define MSG_WATCH _UxGT("Surveiller")
#define MSG_PREPARE _UxGT("Préparer")
#define MSG_TUNE _UxGT("Régler")
#define MSG_START_PRINT _UxGT("Démarrer Impr.")
#define MSG_BUTTON_PRINT _UxGT("Imprimer")
#define MSG_BUTTON_CANCEL _UxGT("Annuler")
#define MSG_PAUSE_PRINT _UxGT("Interrompre impr.")
#define MSG_RESUME_PRINT _UxGT("Reprendre impr.")
#define MSG_STOP_PRINT _UxGT("Arrêter impr.")
#define MSG_OUTAGE_RECOVERY _UxGT("Récupér. coupure")
#define MSG_CARD_MENU _UxGT("Impr. depuis SD")
#define MSG_NO_CARD _UxGT("Pas de carte")
#define MSG_DWELL _UxGT("Repos...")
#define MSG_USERWAIT _UxGT("Atten. de l'util.")
#define MSG_USERWAIT _UxGT("Attente utilis.")
#define MSG_PRINT_PAUSED _UxGT("Impr. en pause")
#define MSG_PRINT_ABORTED _UxGT("Impr. Annulée")
#define MSG_PRINTING _UxGT("Impression")
#define MSG_PRINT_ABORTED _UxGT("Impr. annulée")
#define MSG_NO_MOVE _UxGT("Moteurs bloqués.")
#define MSG_KILLED _UxGT("MORT.")
#define MSG_STOPPED _UxGT("STOPPÉ.")
@ -264,34 +298,50 @@
#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Ech. Rappel mm")
#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Rappel V")
#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("Ech. Rappel V")
#define MSG_AUTORETRACT _UxGT("Retrait. Auto.")
#define MSG_AUTORETRACT _UxGT("Retrait auto.")
#define MSG_TOOL_CHANGE _UxGT("Changement outil")
#define MSG_TOOL_CHANGE_ZLIFT _UxGT("Augmenter Z")
#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Vitesse primaire")
#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Vitesse retrait")
#define MSG_NOZZLE_STANDBY _UxGT("Attente buse")
#define MSG_FILAMENT_SWAP_LENGTH _UxGT("Distance retrait")
#define MSG_FILAMENTCHANGE _UxGT("Changer filament")
#define MSG_FILAMENTLOAD _UxGT("Charger fil.")
#define MSG_FILAMENTUNLOAD _UxGT("Décharger fil.")
#define MSG_FILAMENTUNLOAD_ALL _UxGT("Décharger tout")
#define MSG_INIT_SDCARD _UxGT("Init. la carte SD")
#define MSG_CHANGE_SDCARD _UxGT("Changer de carte")
#define MSG_ZPROBE_OUT _UxGT("Z sonde hors lit")
#define MSG_ZPROBE_OUT _UxGT("Sonde Z hors lit")
#define MSG_SKEW_FACTOR _UxGT("Facteur écart")
#define MSG_BLTOUCH _UxGT("BLTouch")
#define MSG_BLTOUCH_SELFTEST _UxGT("Autotest BLTouch")
#define MSG_BLTOUCH_RESET _UxGT("RaZ BLTouch")
#define MSG_BLTOUCH_DEPLOY _UxGT("Déployer BLTouch")
#define MSG_BLTOUCH_SW_MODE _UxGT("Mode BLTouch SW")
#define MSG_BLTOUCH_5V_MODE _UxGT("Mode BLTouch 5V")
#define MSG_BLTOUCH_OD_MODE _UxGT("Mode BLTouch OD")
#define MSG_BLTOUCH_STOW _UxGT("Ranger BLTouch")
#define MSG_MANUAL_DEPLOY _UxGT("Déployer Sonde Z")
#define MSG_MANUAL_STOW _UxGT("Ranger Sonde Z")
#define MSG_HOME _UxGT("Origine") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST
#define MSG_FIRST _UxGT("Premier")
#define MSG_ZPROBE_ZOFFSET _UxGT("Décalage Z")
#define MSG_BABYSTEP_X _UxGT("Babystep X")
#define MSG_BABYSTEP_Y _UxGT("Babystep Y")
#define MSG_BABYSTEP_Z _UxGT("Babystep Z")
#define MSG_BABYSTEP_TOTAL _UxGT("Total")
#define MSG_ENDSTOP_ABORT _UxGT("Butée abandon")
#define MSG_HEATING_FAILED_LCD _UxGT("Erreur de chauffe")
#define MSG_HEATING_FAILED_LCD_BED _UxGT("Erreur de chauffe lit")
#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP. REDONDANTE")
#define MSG_THERMAL_RUNAWAY _UxGT("EMBALLEMENT THERM.")
#define MSG_THERMAL_RUNAWAY_BED _UxGT("ERREUR THERMIQUE LIT")
#define MSG_ERR_MAXTEMP _UxGT("Err: TEMP. MAX")
#define MSG_ERR_MINTEMP _UxGT("Err: TEMP. MIN")
#define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMP. MAX LIT")
#define MSG_ERR_MINTEMP_BED _UxGT("Err: TEMP. MIN LIT")
#define MSG_ERR_MAXTEMP_CHAMBER _UxGT("Err: MAXTEMP CAISSON")
#define MSG_ERR_MINTEMP_CHAMBER _UxGT("Err: MINTEMP CAISSON")
#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST
#define MSG_HALTED _UxGT("IMPR. STOPPÉE")
@ -301,7 +351,9 @@
#define MSG_SHORT_MINUTE _UxGT("m") // One character only
#define MSG_HEATING _UxGT("En chauffe...")
#define MSG_COOLING _UxGT("Refroidissement")
#define MSG_BED_HEATING _UxGT("Lit en chauffe...")
#define MSG_BED_COOLING _UxGT("Refroid. du lit...")
#define MSG_DELTA_CALIBRATE _UxGT("Calibration Delta")
#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrer X")
#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrer Y")
@ -310,6 +362,7 @@
#define MSG_DELTA_SETTINGS _UxGT("Réglages Delta")
#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Calibration Auto")
#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Hauteur Delta")
#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Delta Z sonde")
#define MSG_DELTA_DIAG_ROD _UxGT("Diagonale")
#define MSG_DELTA_HEIGHT _UxGT("Hauteur")
#define MSG_DELTA_RADIUS _UxGT("Rayon")
@ -323,9 +376,9 @@
#define MSG_MESH_LEVELING _UxGT("Niveau maillage")
#define MSG_INFO_STATS_MENU _UxGT("Stats. imprimante")
#define MSG_INFO_BOARD_MENU _UxGT("Infos carte")
#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors")
#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistances")
#define MSG_INFO_EXTRUDERS _UxGT("Extrudeurs")
#define MSG_INFO_BAUDRATE _UxGT("Baud")
#define MSG_INFO_BAUDRATE _UxGT("Bauds")
#define MSG_INFO_PROTOCOL _UxGT("Protocole")
#define MSG_CASE_LIGHT _UxGT("Lumière caisson")
#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Luminosité")
@ -358,35 +411,109 @@
#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purger encore")
#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Reprendre impr.")
#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Buse: ")
#define MSG_RUNOUT_SENSOR _UxGT("Capteur Fil.")
#define MSG_ERR_HOMING_FAILED _UxGT("Echec origine")
#define MSG_ERR_PROBING_FAILED _UxGT("Echec sonde")
#define MSG_M600_TOO_COLD _UxGT("M600: Trop froid")
#define MSG_MMU2_FILAMENT_CHANGE_HEADER _UxGT("CHANGER FILAMENT")
#define MSG_MMU2_CHOOSE_FILAMENT_HEADER _UxGT("CHOISIR FILAMENT")
#define MSG_MMU2_MENU _UxGT("MMU")
#define MSG_MMU2_WRONG_FIRMWARE _UxGT("Update MMU firmware!")
#define MSG_MMU2_NOT_RESPONDING _UxGT("MMU ne répond plus")
#define MSG_MMU2_RESUME _UxGT("Continuer impr.")
#define MSG_MMU2_RESUMING _UxGT("Reprise...")
#define MSG_MMU2_LOAD_FILAMENT _UxGT("Charger filament")
#define MSG_MMU2_LOAD_ALL _UxGT("Charger tous")
#define MSG_MMU2_LOAD_TO_NOZZLE _UxGT("Charger dans buse")
#define MSG_MMU2_EJECT_FILAMENT _UxGT("Ejecter filament")
#define MSG_MMU2_EJECT_FILAMENT0 _UxGT("Ejecter fil. 1")
#define MSG_MMU2_EJECT_FILAMENT1 _UxGT("Ejecter fil. 2")
#define MSG_MMU2_EJECT_FILAMENT2 _UxGT("Ejecter fil. 3")
#define MSG_MMU2_EJECT_FILAMENT3 _UxGT("Ejecter fil. 4")
#define MSG_MMU2_EJECT_FILAMENT4 _UxGT("Ejecter fil. 5")
#define MSG_MMU2_UNLOAD_FILAMENT _UxGT("Retrait filament")
#define MSG_MMU2_LOADING_FILAMENT _UxGT("Chargem. fil. %i...")
#define MSG_MMU2_EJECTING_FILAMENT _UxGT("Ejection fil...")
#define MSG_MMU2_UNLOADING_FILAMENT _UxGT("Retrait fil....")
#define MSG_MMU2_ALL _UxGT("Tous")
#define MSG_MMU2_FILAMENT0 _UxGT("Filament 1")
#define MSG_MMU2_FILAMENT1 _UxGT("Filament 2")
#define MSG_MMU2_FILAMENT2 _UxGT("Filament 3")
#define MSG_MMU2_FILAMENT3 _UxGT("Filament 4")
#define MSG_MMU2_FILAMENT4 _UxGT("Filament 5")
#define MSG_MMU2_RESET _UxGT("Réinit. MMU")
#define MSG_MMU2_RESETTING _UxGT("Réinit. MMU...")
#define MSG_MMU2_EJECT_RECOVER _UxGT("Retrait, click")
#define MSG_MIX _UxGT("Mix")
#define MSG_MIX_COMPONENT _UxGT("Composante")
#define MSG_MIXER _UxGT("Mixeur")
#define MSG_GRADIENT _UxGT("Dégradé")
#define MSG_FULL_GRADIENT _UxGT("Dégradé complet")
#define MSG_TOGGLE_MIX _UxGT("Toggle mix")
#define MSG_CYCLE_MIX _UxGT("Cycle mix")
#define MSG_GRADIENT_MIX _UxGT("Mix dégradé")
#define MSG_REVERSE_GRADIENT _UxGT("Inverser dégradé")
#define MSG_ACTIVE_VTOOL _UxGT("Active V-tool")
#define MSG_START_VTOOL _UxGT("Début V-tool")
#define MSG_END_VTOOL _UxGT(" Fin V-tool")
#define MSG_GRADIENT_ALIAS _UxGT("Alias V-tool")
#define MSG_RESET_VTOOLS _UxGT("Réinit. V-tools")
#define MSG_COMMIT_VTOOL _UxGT("Valider Mix V-tool")
#define MSG_VTOOLS_RESET _UxGT("V-tools réinit. ok")
#define MSG_START_Z _UxGT("Début Z")
#define MSG_END_Z _UxGT(" Fin Z")
#define MSG_BRICKOUT _UxGT("Casse-briques")
#define MSG_INVADERS _UxGT("Invaders")
#define MSG_SNAKE _UxGT("Sn4k3")
#define MSG_MAZE _UxGT("Labyrinthe")
#if LCD_HEIGHT >= 4
// Up to 3 lines allowed
#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Attente Démarrage")
#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("du filament")
#define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("changer")
#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Attente de")
#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("décharger filament")
#define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Presser bouton")
#define MSG_ADVANCED_PAUSE_WAITING_2 _UxGT("pour reprendre")
#define MSG_PAUSE_PRINT_INIT_1 _UxGT("Parking...")
#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Attente filament")
#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("pour démarrer")
#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insérer filament")
#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("et app. bouton")
#define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("pour continuer...")
#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Presser le bouton...")
#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Pr chauffer la buse")
#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("pr chauffer la buse")
#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Buse en chauffe")
#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Patientez SVP...")
#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Attente de")
#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Chargement filament")
#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Patienter SVP...")
#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Attente")
#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("retrait du filament")
#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Attente")
#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("chargement filament")
#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Attente")
#define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("Purger filament")
#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Attente impression")
#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("pour reprendre")
#define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("Purge filament")
#define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Presser pour finir")
#define MSG_FILAMENT_CHANGE_CONT_PURGE_2 _UxGT("la purge du filament")
#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Attente reprise")
#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("impression")
#else // LCD_HEIGHT < 4
// Up to 2 lines allowed
#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Patientez...")
#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejection...")
#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insérer et clic")
#define MSG_ADVANCED_PAUSE_WAITING_1 _UxGT("Presser pr continuer")
#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Patience...")
#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insérer fil.")
#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Chauffer ?")
#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Chauffage...")
#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejecting...")
#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Chargement...")
#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Purge...")
#define MSG_FILAMENT_CHANGE_CONT_PURGE_1 _UxGT("Terminer ?")
#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Reprise...")
#endif // LCD_HEIGHT < 4
#define MSG_TMC_DRIVERS _UxGT("Drivers TMC")
#define MSG_TMC_CURRENT _UxGT("Courant driver")
#define MSG_TMC_HYBRID_THRS _UxGT("Seuil hybride")
#define MSG_TMC_HOMING_THRS _UxGT("Home sans capteur")
#define MSG_TMC_STEPPING_MODE _UxGT("Mode pas à pas")
#define MSG_TMC_STEALTH_ENABLED _UxGT("StealthChop activé")
#define MSG_SERVICE_RESET _UxGT("Réinit.")
#define MSG_SERVICE_IN _UxGT(" dans:")
#define MSG_BACKLASH _UxGT("Backlash")
#define MSG_BACKLASH_CORRECTION _UxGT("Correction")
#define MSG_BACKLASH_SMOOTHING _UxGT("Lissage")

View file

@ -330,9 +330,11 @@
#define MSG_ENDSTOP_ABORT _UxGT("Finecorsa annullati")
#define MSG_HEATING_FAILED_LCD _UxGT("Riscald. Fallito")
#define MSG_HEATING_FAILED_LCD_BED _UxGT("Risc. piatto fallito")
#define MSG_HEATING_FAILED_LCD_CHAMBER _UxGT("Risc. camera fallito")
#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP RIDONDANTE")
#define MSG_THERMAL_RUNAWAY _UxGT("TEMP FUORI CONTROLLO")
#define MSG_THERMAL_RUNAWAY_BED _UxGT("TEMP PIAT.FUORI CTRL")
#define MSG_THERMAL_RUNAWAY_CHAMBER _UxGT("T.CAMERA FUORI CTRL")
#define MSG_ERR_MAXTEMP _UxGT("Err: TEMP MASSIMA")
#define MSG_ERR_MINTEMP _UxGT("Err: TEMP MINIMA")
#define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMP MAX PIATTO")

View file

@ -268,6 +268,8 @@ void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, co
#if HAS_GRAPHICAL_LCD
drawing_screen = false;
#endif
set_ui_selection(false);
}
}
@ -436,12 +438,21 @@ void _lcd_draw_homing() {
void _lcd_toggle_bed_leveling() { set_bed_leveling_enabled(!planner.leveling_active); }
#endif
void do_select_screen(PGM_P const yes, PGM_P const no, bool &yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
//
// Selection screen presents a prompt and two options
//
bool ui_selection; // = false
void set_ui_selection(const bool sel) { ui_selection = sel; }
void do_select_screen(PGM_P const yes, PGM_P const no, selectFunc_t yesFunc, selectFunc_t noFunc, PGM_P const pref, const char * const string/*=NULL*/, PGM_P const suff/*=NULL*/) {
if (ui.encoderPosition) {
yesno = int16_t(ui.encoderPosition) > 0;
ui_selection = int16_t(ui.encoderPosition) > 0;
ui.encoderPosition = 0;
}
draw_select_screen(yes, no, yesno, pref, string, suff);
const bool got_click = ui.use_click();
if (got_click || ui.should_draw()) {
draw_select_screen(yes, no, ui_selection, pref, string, suff);
if (got_click) { ui_selection ? yesFunc() : noFunc(); }
}
}
#endif // HAS_LCD_MENU

View file

@ -65,12 +65,15 @@ DECLARE_MENU_EDIT_TYPE(uint32_t, long5, ftostr5rj, 0.01f ); // 123
///////// Menu Item Draw Functions /////////
////////////////////////////////////////////
void draw_edit_screen(PGM_P const pstr, const char* const value=NULL);
typedef void (*selectFunc_t)();
void draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff);
void do_select_screen(PGM_P const yes, PGM_P const no, bool &yesno, PGM_P const pref, const char * const string=NULL, PGM_P const suff=NULL);
inline void do_select_screen_yn(bool &yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
do_select_screen(PSTR(MSG_YES), PSTR(MSG_NO), yesno, pref, string, suff);
void set_ui_selection(const bool sel);
void do_select_screen(PGM_P const yes, PGM_P const no, selectFunc_t yesFunc, selectFunc_t noFunc, PGM_P const pref, const char * const string=NULL, PGM_P const suff=NULL);
inline void do_select_screen_yn(selectFunc_t yesFunc, selectFunc_t noFunc, PGM_P const pref, const char * const string=NULL, PGM_P const suff=NULL) {
do_select_screen(PSTR(MSG_YES), PSTR(MSG_NO), yesFunc, noFunc, pref, string, suff);
}
void draw_edit_screen(PGM_P const pstr, const char* const value=NULL);
void draw_menu_item(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char);
void draw_menu_item_static(const uint8_t row, PGM_P const pstr, const bool center=true, const bool invert=false, const char *valstr=NULL);
void _draw_menu_item_edit(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm);

View file

@ -604,16 +604,13 @@ void menu_backlash();
#include "../../module/configuration_store.h"
static void lcd_init_eeprom() {
ui.completion_feedback(settings.init_eeprom());
ui.goto_previous_screen();
}
static void lcd_init_eeprom_confirm() {
START_MENU();
MENU_BACK(MSG_ADVANCED_SETTINGS);
MENU_ITEM(function, MSG_INIT_EEPROM, lcd_init_eeprom);
END_MENU();
do_select_screen(
PSTR(MSG_BUTTON_INIT), PSTR(MSG_BUTTON_CANCEL),
[]{ ui.completion_feedback(settings.init_eeprom()); },
ui.goto_previous_screen,
PSTR(MSG_INIT_EEPROM), NULL, PSTR("?")
);
}
#endif

View file

@ -50,13 +50,6 @@ static_assert(LEVEL_CORNERS_Z_HOP >= 0, "LEVEL_CORNERS_Z_HOP must be >= 0. Pleas
static bool leveling_was_active = false;
#endif
static inline void _lcd_level_bed_corners_back() {
#if HAS_LEVELING
set_bed_leveling_enabled(leveling_was_active);
#endif
ui.goto_previous_screen_no_defer();
}
/**
* Level corners, starting in the front-left corner.
*/
@ -94,17 +87,23 @@ static inline void _lcd_goto_next_corner() {
}
static inline void menu_level_bed_corners() {
START_MENU();
MENU_ITEM(function,
do_select_screen(
PSTR(MSG_BUTTON_NEXT), PSTR(MSG_BUTTON_DONE),
_lcd_goto_next_corner,
[]{
#if HAS_LEVELING
set_bed_leveling_enabled(leveling_was_active);
#endif
ui.goto_previous_screen_no_defer();
},
PSTR(
#if ENABLED(LEVEL_CENTER_TOO)
MSG_LEVEL_BED_NEXT_POINT
#else
MSG_NEXT_CORNER
#endif
, _lcd_goto_next_corner
), NULL, PSTR("?")
);
MENU_ITEM(function, MSG_BACK, _lcd_level_bed_corners_back);
END_MENU();
}
static inline void _lcd_level_bed_corners_homing() {
@ -112,6 +111,7 @@ static inline void _lcd_level_bed_corners_homing() {
if (all_axes_homed()) {
bed_corner = 0;
ui.goto_screen(menu_level_bed_corners);
set_ui_selection(true);
_lcd_goto_next_corner();
}
}

View file

@ -44,6 +44,8 @@ static void lcd_power_loss_recovery_cancel() {
ui.return_to_status();
}
// TODO: Display long filename with Cancel/Resume buttons
// Requires supporting methods in PLR class.
void menu_job_recovery() {
ui.defer_status_screen();
START_MENU();

View file

@ -101,10 +101,7 @@
}
void menu_abort_confirm() {
START_MENU();
MENU_BACK(MSG_MAIN);
MENU_ITEM(function, MSG_STOP_PRINT, lcd_abort_job);
END_MENU();
do_select_screen(PSTR(MSG_BUTTON_STOP), PSTR(MSG_BACK), lcd_abort_job, ui.goto_previous_screen, PSTR(MSG_STOP_PRINT), NULL, PSTR("?"));
}
#endif // MACHINE_CAN_STOP

View file

@ -250,17 +250,17 @@ void lcd_mixer_mix_edit() {
//
// Reset All V-Tools
//
inline void _lcd_reset_vtools() {
void menu_mixer_vtools_reset_confirm() {
do_select_screen(
PSTR(MSG_BUTTON_RESET), PSTR(MSG_BUTTON_CANCEL),
[]{
mixer.reset_vtools();
LCD_MESSAGEPGM(MSG_VTOOLS_RESET);
ui.return_to_status();
mixer.reset_vtools();
}
void menu_mixer_vtools_reset_confirm() {
START_MENU();
MENU_BACK(MSG_BACK);
MENU_ITEM(function, MSG_RESET_VTOOLS, _lcd_reset_vtools);
END_MENU();
},
ui.goto_previous_screen,
PSTR(MSG_RESET_VTOOLS), NULL, PSTR("?")
);
}
void menu_mixer() {

View file

@ -81,17 +81,12 @@ inline void sdcard_start_selected_file() {
#if ENABLED(SD_MENU_CONFIRM_START)
bool do_print_file;
void menu_sd_confirm() {
if (ui.should_draw())
do_select_screen(PSTR(MSG_BUTTON_PRINT), PSTR(MSG_BUTTON_CANCEL), do_print_file, PSTR(MSG_START_PRINT " "), card.longest_filename(), PSTR("?"));
if (ui.use_click()) {
if (do_print_file)
sdcard_start_selected_file();
else
ui.goto_previous_screen();
}
do_select_screen(
PSTR(MSG_BUTTON_PRINT), PSTR(MSG_BUTTON_CANCEL),
sdcard_start_selected_file, ui.goto_previous_screen,
PSTR(MSG_START_PRINT " "), card.longest_filename(), PSTR("?")
);
}
#endif
@ -106,7 +101,6 @@ class MenuItem_sdfile {
sd_items = screen_items;
#endif
#if ENABLED(SD_MENU_CONFIRM_START)
do_print_file = false;
MenuItem_submenu::action(menu_sd_confirm);
#else
sdcard_start_selected_file();

View file

@ -31,52 +31,32 @@
#include "menu.h"
#include "../../module/printcounter.h"
inline void _lcd_reset_service(const int index) {
inline void _menu_service(const int index, PGM_P const name) {
char sram[30];
strncpy_P(sram, name, 29);
do_select_screen(
PSTR(MSG_BUTTON_RESET), PSTR(MSG_BUTTON_CANCEL),
[]{
print_job_timer.resetServiceInterval(index);
BUZZ(200, 404);
ui.completion_feedback(true);
ui.reset_status();
ui.return_to_status();
},
ui.goto_previous_screen,
PSTR(MSG_SERVICE_RESET), sram, PSTR("?")
);
}
#if SERVICE_INTERVAL_1 > 0
void menu_action_reset_service1() { _lcd_reset_service(1); }
void menu_service1() { _menu_service(1, PSTR(SERVICE_NAME_1)); }
#endif
#if SERVICE_INTERVAL_2 > 0
void menu_action_reset_service2() { _lcd_reset_service(2); }
void menu_service2() { _menu_service(2, PSTR(SERVICE_NAME_2)); }
#endif
#if SERVICE_INTERVAL_3 > 0
void menu_action_reset_service3() { _lcd_reset_service(3); }
#endif
inline void _menu_service(const int index) {
START_MENU();
MENU_BACK(MSG_MAIN);
switch (index) {
#if SERVICE_INTERVAL_1 > 0
case 1: MENU_ITEM(function, MSG_SERVICE_RESET, menu_action_reset_service1); break;
#endif
#if SERVICE_INTERVAL_2 > 0
case 2: MENU_ITEM(function, MSG_SERVICE_RESET, menu_action_reset_service2); break;
#endif
#if SERVICE_INTERVAL_3 > 0
case 3: MENU_ITEM(function, MSG_SERVICE_RESET, menu_action_reset_service3); break;
#endif
}
END_MENU();
}
#if SERVICE_INTERVAL_1 > 0
void menu_service1() { _menu_service(1); }
#endif
#if SERVICE_INTERVAL_2 > 0
void menu_service2() { _menu_service(2); }
#endif
#if SERVICE_INTERVAL_3 > 0
void menu_service3() { _menu_service(3); }
void menu_service3() { _menu_service(3, PSTR(SERVICE_NAME_3)); }
#endif
#endif // HAS_LCD_MENU && HAS_SERVICE_INTERVALS && PRINTCOUNTER

View file

@ -32,7 +32,7 @@
#include "../../module/stepper_indirection.h"
#include "../../feature/tmc_util.h"
#define TMC_EDIT_STORED_I_RMS(ST) MENU_ITEM_EDIT_CALLBACK(uint16_4, MSG_##ST, &stepper##ST.val_mA, 100, 3000, refresh_stepper_current_##ST)
#define TMC_EDIT_STORED_I_RMS(ST,MSG) MENU_ITEM_EDIT_CALLBACK(uint16_4, MSG, &stepper##ST.val_mA, 100, 3000, refresh_stepper_current_##ST)
#if AXIS_IS_TMC(X)
void refresh_stepper_current_X() { stepperX.refresh_stepper_current(); }
@ -78,50 +78,50 @@ void menu_tmc_current() {
START_MENU();
MENU_BACK(MSG_TMC_DRIVERS);
#if AXIS_IS_TMC(X)
TMC_EDIT_STORED_I_RMS(X);
TMC_EDIT_STORED_I_RMS(X, MSG_X);
#endif
#if AXIS_IS_TMC(Y)
TMC_EDIT_STORED_I_RMS(Y);
TMC_EDIT_STORED_I_RMS(Y, MSG_Y);
#endif
#if AXIS_IS_TMC(Z)
TMC_EDIT_STORED_I_RMS(Z);
TMC_EDIT_STORED_I_RMS(Z, MSG_Z);
#endif
#if AXIS_IS_TMC(X2)
TMC_EDIT_STORED_I_RMS(X2);
TMC_EDIT_STORED_I_RMS(X2, MSG_X2);
#endif
#if AXIS_IS_TMC(Y2)
TMC_EDIT_STORED_I_RMS(Y2);
TMC_EDIT_STORED_I_RMS(Y2, MSG_Y2);
#endif
#if AXIS_IS_TMC(Z2)
TMC_EDIT_STORED_I_RMS(Z2);
TMC_EDIT_STORED_I_RMS(Z2, MSG_Z2);
#endif
#if AXIS_IS_TMC(Z3)
TMC_EDIT_STORED_I_RMS(Z3);
TMC_EDIT_STORED_I_RMS(Z3, MSG_Z3);
#endif
#if AXIS_IS_TMC(E0)
TMC_EDIT_STORED_I_RMS(E0);
TMC_EDIT_STORED_I_RMS(E0, MSG_E1);
#endif
#if AXIS_IS_TMC(E1)
TMC_EDIT_STORED_I_RMS(E1);
TMC_EDIT_STORED_I_RMS(E1, MSG_E2);
#endif
#if AXIS_IS_TMC(E2)
TMC_EDIT_STORED_I_RMS(E2);
TMC_EDIT_STORED_I_RMS(E2, MSG_E3);
#endif
#if AXIS_IS_TMC(E3)
TMC_EDIT_STORED_I_RMS(E3);
TMC_EDIT_STORED_I_RMS(E3, MSG_E4);
#endif
#if AXIS_IS_TMC(E4)
TMC_EDIT_STORED_I_RMS(E4);
TMC_EDIT_STORED_I_RMS(E4, MSG_E5);
#endif
#if AXIS_IS_TMC(E5)
TMC_EDIT_STORED_I_RMS(E5);
TMC_EDIT_STORED_I_RMS(E5, MSG_E6);
#endif
END_MENU();
}
#if ENABLED(HYBRID_THRESHOLD)
#define TMC_EDIT_STORED_HYBRID_THRS(ST) MENU_ITEM_EDIT_CALLBACK(uint8, MSG_##ST, &stepper##ST.stored.hybrid_thrs, 0, 255, refresh_hybrid_thrs_##ST);
#define TMC_EDIT_STORED_HYBRID_THRS(ST, MSG) MENU_ITEM_EDIT_CALLBACK(uint8, MSG, &stepper##ST.stored.hybrid_thrs, 0, 255, refresh_hybrid_thrs_##ST);
#if AXIS_HAS_STEALTHCHOP(X)
void refresh_hybrid_thrs_X() { stepperX.refresh_hybrid_thrs(planner.settings.axis_steps_per_mm[X_AXIS]); }
@ -167,43 +167,43 @@ void menu_tmc_current() {
START_MENU();
MENU_BACK(MSG_TMC_DRIVERS);
#if AXIS_HAS_STEALTHCHOP(X)
TMC_EDIT_STORED_HYBRID_THRS(X);
TMC_EDIT_STORED_HYBRID_THRS(X, MSG_X);
#endif
#if AXIS_HAS_STEALTHCHOP(Y)
TMC_EDIT_STORED_HYBRID_THRS(Y);
TMC_EDIT_STORED_HYBRID_THRS(Y, MSG_Y);
#endif
#if AXIS_HAS_STEALTHCHOP(Z)
TMC_EDIT_STORED_HYBRID_THRS(Z);
TMC_EDIT_STORED_HYBRID_THRS(Z, MSG_Z);
#endif
#if AXIS_HAS_STEALTHCHOP(X2)
TMC_EDIT_STORED_HYBRID_THRS(X2);
TMC_EDIT_STORED_HYBRID_THRS(X2, MSG_X2);
#endif
#if AXIS_HAS_STEALTHCHOP(Y2)
TMC_EDIT_STORED_HYBRID_THRS(Y2);
TMC_EDIT_STORED_HYBRID_THRS(Y2, MSG_Y2);
#endif
#if AXIS_HAS_STEALTHCHOP(Z2)
TMC_EDIT_STORED_HYBRID_THRS(Z2);
TMC_EDIT_STORED_HYBRID_THRS(Z2, MSG_Z2);
#endif
#if AXIS_HAS_STEALTHCHOP(Z3)
TMC_EDIT_STORED_HYBRID_THRS(Z3);
TMC_EDIT_STORED_HYBRID_THRS(Z3, MSG_Z3);
#endif
#if AXIS_HAS_STEALTHCHOP(E0)
TMC_EDIT_STORED_HYBRID_THRS(E0);
TMC_EDIT_STORED_HYBRID_THRS(E0, MSG_E1);
#endif
#if AXIS_HAS_STEALTHCHOP(E1)
TMC_EDIT_STORED_HYBRID_THRS(E1);
TMC_EDIT_STORED_HYBRID_THRS(E1, MSG_E2);
#endif
#if AXIS_HAS_STEALTHCHOP(E2)
TMC_EDIT_STORED_HYBRID_THRS(E2);
TMC_EDIT_STORED_HYBRID_THRS(E2, MSG_E3);
#endif
#if AXIS_HAS_STEALTHCHOP(E3)
TMC_EDIT_STORED_HYBRID_THRS(E3);
TMC_EDIT_STORED_HYBRID_THRS(E3, MSG_E4);
#endif
#if AXIS_HAS_STEALTHCHOP(E4)
TMC_EDIT_STORED_HYBRID_THRS(E4);
TMC_EDIT_STORED_HYBRID_THRS(E4, MSG_E5);
#endif
#if AXIS_HAS_STEALTHCHOP(E5)
TMC_EDIT_STORED_HYBRID_THRS(E5);
TMC_EDIT_STORED_HYBRID_THRS(E5, MSG_E6);
#endif
END_MENU();
}
@ -243,7 +243,7 @@ void menu_tmc_current() {
#if HAS_STEALTHCHOP
#define TMC_EDIT_STEP_MODE(ST) MENU_ITEM_EDIT_CALLBACK(bool, MSG_##ST, &stepper##ST.stored.stealthChop_enabled, refresh_stepping_mode_##ST)
#define TMC_EDIT_STEP_MODE(ST, MSG) MENU_ITEM_EDIT_CALLBACK(bool, MSG, &stepper##ST.stored.stealthChop_enabled, refresh_stepping_mode_##ST)
#if AXIS_HAS_STEALTHCHOP(X)
void refresh_stepping_mode_X() { stepperX.refresh_stepping_mode(); }
@ -290,43 +290,43 @@ void menu_tmc_current() {
STATIC_ITEM(MSG_TMC_STEALTH_ENABLED);
MENU_BACK(MSG_TMC_DRIVERS);
#if AXIS_HAS_STEALTHCHOP(X)
TMC_EDIT_STEP_MODE(X);
TMC_EDIT_STEP_MODE(X, MSG_X);
#endif
#if AXIS_HAS_STEALTHCHOP(Y)
TMC_EDIT_STEP_MODE(Y);
TMC_EDIT_STEP_MODE(Y, MSG_Y);
#endif
#if AXIS_HAS_STEALTHCHOP(Z)
TMC_EDIT_STEP_MODE(Z);
TMC_EDIT_STEP_MODE(Z, MSG_Z);
#endif
#if AXIS_HAS_STEALTHCHOP(X2)
TMC_EDIT_STEP_MODE(X2);
TMC_EDIT_STEP_MODE(X2, MSG_X2);
#endif
#if AXIS_HAS_STEALTHCHOP(Y2)
TMC_EDIT_STEP_MODE(Y2);
TMC_EDIT_STEP_MODE(Y2, MSG_Y2);
#endif
#if AXIS_HAS_STEALTHCHOP(Z2)
TMC_EDIT_STEP_MODE(Z2);
TMC_EDIT_STEP_MODE(Z2, MSG_Z2);
#endif
#if AXIS_HAS_STEALTHCHOP(Z3)
TMC_EDIT_STEP_MODE(Z3);
TMC_EDIT_STEP_MODE(Z3, MSG_Z3);
#endif
#if AXIS_HAS_STEALTHCHOP(E0)
TMC_EDIT_STEP_MODE(E0);
TMC_EDIT_STEP_MODE(E0, MSG_E1);
#endif
#if AXIS_HAS_STEALTHCHOP(E1)
TMC_EDIT_STEP_MODE(E1);
TMC_EDIT_STEP_MODE(E1, MSG_E2);
#endif
#if AXIS_HAS_STEALTHCHOP(E2)
TMC_EDIT_STEP_MODE(E2);
TMC_EDIT_STEP_MODE(E2, MSG_E3);
#endif
#if AXIS_HAS_STEALTHCHOP(E3)
TMC_EDIT_STEP_MODE(E3);
TMC_EDIT_STEP_MODE(E3, MSG_E4);
#endif
#if AXIS_HAS_STEALTHCHOP(E4)
TMC_EDIT_STEP_MODE(E4);
TMC_EDIT_STEP_MODE(E4, MSG_E5);
#endif
#if AXIS_HAS_STEALTHCHOP(E5)
TMC_EDIT_STEP_MODE(E5);
TMC_EDIT_STEP_MODE(E5, MSG_E6);
#endif
END_MENU();
}

View file

@ -615,8 +615,10 @@ void _lcd_ubl_step_by_step() {
void _lcd_ubl_level_bed() {
START_MENU();
MENU_BACK(MSG_MOTION);
MENU_ITEM(gcode, MSG_UBL_ACTIVATE_MESH, PSTR("G29 A"));
if (planner.leveling_active)
MENU_ITEM(gcode, MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D"));
else
MENU_ITEM(gcode, MSG_UBL_ACTIVATE_MESH, PSTR("G29 A"));
MENU_ITEM(submenu, MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step);
MENU_ITEM(function, MSG_UBL_MESH_EDIT, _lcd_ubl_output_map_lcd_cmd);
MENU_ITEM(submenu, MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh);

View file

@ -192,23 +192,38 @@ millis_t next_button_update_ms;
#endif
void wrap_string(uint8_t y, const char * const string) {
uint8_t x = LCD_WIDTH;
void _wrap_string(uint8_t &x, uint8_t &y, const char * const string, read_byte_cb_t cb_read_byte) {
SETCURSOR(x, y);
if (string) {
uint8_t *p = (uint8_t*)string;
for (;;) {
if (x >= LCD_WIDTH) {
x = 0;
SETCURSOR(0, y++);
}
wchar_t ch;
p = get_utf8_value_cb(p, read_byte_ram, &ch);
p = get_utf8_value_cb(p, cb_read_byte, &ch);
if (!ch) break;
lcd_put_wchar(ch);
x++;
if (x >= LCD_WIDTH) {
x = 0; y++;
SETCURSOR(0, y);
}
}
}
}
void MarlinUI::draw_select_screen_prompt(PGM_P const pref, const char * const string/*=NULL*/, PGM_P const suff/*=NULL*/) {
const uint8_t plen = utf8_strlen_P(pref), slen = suff ? utf8_strlen_P(suff) : 0;
uint8_t x = 0, y = 0;
if (!string && plen + slen <= LCD_WIDTH) {
x = (LCD_WIDTH - plen - slen) / 2;
y = LCD_HEIGHT > 3 ? 1 : 0;
}
wrap_string_P(x, y, pref);
if (string) {
if (x) { x = 0; y++; } // Move to the start of the next line
wrap_string(x, y, string);
}
if (suff) wrap_string_P(x, y, suff);
}
#endif // HAS_LCD_MENU
@ -668,6 +683,7 @@ void MarlinUI::update() {
static uint16_t max_display_update_time = 0;
static millis_t next_lcd_update_ms;
millis_t ms = millis();
#if HAS_LCD_MENU
@ -729,11 +745,12 @@ void MarlinUI::update() {
refresh();
init_lcd(); // May revive the LCD if static electricity killed it
ms = millis();
next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; // delay LCD update until after SD activity completes
}
#endif // SDSUPPORT && SD_DETECT_PIN
const millis_t ms = millis();
if (ELAPSED(ms, next_lcd_update_ms)
#if HAS_GRAPHICAL_LCD
|| drawing_screen

View file

@ -72,7 +72,11 @@
#define LCDWRITE(c) lcd_put_wchar(c)
#endif
void wrap_string(uint8_t y, const char * const string);
#include "fontutils.h"
void _wrap_string(uint8_t &x, uint8_t &y, const char * const string, read_byte_cb_t cb_read_byte);
inline void wrap_string_P(uint8_t &x, uint8_t &y, PGM_P const pstr) { _wrap_string(x, y, pstr, read_byte_rom); }
inline void wrap_string(uint8_t &x, uint8_t &y, const char * const string) { _wrap_string(x, y, string, read_byte_ram); }
#if ENABLED(SDSUPPORT)
#include "../sd/cardreader.h"
@ -457,6 +461,8 @@ public:
static void ubl_plot(const uint8_t x, const uint8_t inverted_y);
#endif
static void draw_select_screen_prompt(PGM_P const pref, const char * const string=NULL, PGM_P const suff=NULL);
#elif HAS_SPI_LCD
static constexpr bool lcd_clicked = false;

View file

@ -64,6 +64,10 @@
#include "../feature/bedlevel/bedlevel.h"
#endif
#if ENABLED(EXTENSIBLE_UI)
#include "../lcd/extensible_ui/ui_api.h"
#endif
#if HAS_SERVOS
#include "servo.h"
#endif
@ -1120,6 +1124,10 @@ void MarlinSettings::postprocess() {
store_mesh(ubl.storage_slot);
#endif
#if ENABLED(EXTENSIBLE_UI)
if (!eeprom_error) ExtUI::onStoreSettings();
#endif
return !eeprom_error;
}
@ -1874,7 +1882,13 @@ void MarlinSettings::postprocess() {
}
bool MarlinSettings::load() {
if (validate()) return _load();
if (validate()) {
const bool success = _load();
#if ENABLED(EXTENSIBLE_UI)
if (success) ExtUI::onLoadSettings();
#endif
return success;
}
reset();
return true;
}
@ -2290,6 +2304,10 @@ void MarlinSettings::reset() {
DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("Hardcoded Default Settings Loaded");
#if ENABLED(EXTENSIBLE_UI)
ExtUI::onFactoryReset();
#endif
}
#if DISABLED(DISABLE_M503)

View file

@ -86,17 +86,17 @@ Temperature thermalManager;
*/
#if HAS_HEATED_BED
#define _BED_PSTR(E) (E) == -1 ? PSTR(MSG ## _BED) :
#define _BED_PSTR(M,E) (E) == -1 ? PSTR(M) :
#else
#define _BED_PSTR(E)
#define _BED_PSTR(M,E)
#endif
#if HAS_HEATED_CHAMBER
#define _CHAMBER_PSTR(E) (E) == -2 ? PSTR(MSG ## _CHAMBER) :
#define _CHAMBER_PSTR(M,E) (E) == -2 ? PSTR(M) :
#else
#define _CHAMBER_PSTR(E)
#define _CHAMBER_PSTR(M,E)
#endif
#define _E_PSTR(M,E,N) (HOTENDS >= (N) && (E) == (N)-1) ? PSTR(MSG_E##N " " M) :
#define TEMP_ERR_PSTR(M,E) _BED_PSTR(E) _CHAMBER_PSTR(E) _E_PSTR(M,E,2) _E_PSTR(M,E,3) _E_PSTR(M,E,4) _E_PSTR(M,E,5) _E_PSTR(M,E,6) PSTR(MSG_E1 " " M)
#define _E_PSTR(M,E,N) ((HOTENDS) >= (N) && (E) == (N)-1) ? PSTR(MSG_E##N " " M) :
#define TEMP_ERR_PSTR(M,E) _BED_PSTR(M##_BED,E) _CHAMBER_PSTR(M##_CHAMBER,E) _E_PSTR(M,E,2) _E_PSTR(M,E,3) _E_PSTR(M,E,4) _E_PSTR(M,E,5) _E_PSTR(M,E,6) PSTR(MSG_E1 " " M)
// public:
@ -944,11 +944,29 @@ void Temperature::manage_heater() {
if (temp_hotend[1].current < MAX(HEATER_1_MINTEMP, HEATER_1_MAX6675_TMIN + .01)) min_temp_error(1);
#endif
#if WATCH_HOTENDS || WATCH_BED || DISABLED(PIDTEMPBED) || HAS_AUTO_FAN || HEATER_IDLE_HANDLER || WATCH_CHAMBER
#define HAS_THERMAL_PROTECTION (ENABLED(THERMAL_PROTECTION_HOTENDS) || HAS_THERMALLY_PROTECTED_BED || ENABLED(THERMAL_PROTECTION_CHAMBER))
#if HAS_THERMAL_PROTECTION || DISABLED(PIDTEMPBED) || HAS_AUTO_FAN || HEATER_IDLE_HANDLER
millis_t ms = millis();
#endif
#if HAS_THERMAL_PROTECTION
#ifndef THERMAL_PROTECTION_GRACE_PERIOD
#define THERMAL_PROTECTION_GRACE_PERIOD 0 // No grace period needed on well-behaved boards
#endif
#if THERMAL_PROTECTION_GRACE_PERIOD > 0
static millis_t grace_period = ms + THERMAL_PROTECTION_GRACE_PERIOD;
if (ELAPSED(ms, grace_period)) grace_period = 0UL;
#else
static constexpr millis_t grace_period = 0UL;
#endif
#endif
HOTEND_LOOP() {
#if ENABLED(THERMAL_PROTECTION_HOTENDS)
if (!grace_period && degHotend(e) > temp_range[e].maxtemp)
_temp_error(e, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, e));
#endif
#if HEATER_IDLE_HANDLER
hotend_idle[e].update(ms);
@ -1001,6 +1019,11 @@ void Temperature::manage_heater() {
#if HAS_HEATED_BED
#if ENABLED(THERMAL_PROTECTION_BED)
if (!grace_period && degBed() > BED_MAXTEMP)
_temp_error(-1, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, -1));
#endif
#if WATCH_BED
// Make sure temperature is increasing
if (watch_bed.elapsed(ms)) { // Time to check the bed?
@ -1071,6 +1094,11 @@ void Temperature::manage_heater() {
#if HAS_HEATED_CHAMBER
#if ENABLED(THERMAL_PROTECTION_CHAMBER)
if (!grace_period && degChamber() > CHAMBER_MAXTEMP)
_temp_error(-2, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, -2));
#endif
#if WATCH_CHAMBER
// Make sure temperature is increasing
if (watch_chamber.elapsed(ms)) { // Time to check the chamber?
@ -1602,7 +1630,7 @@ void Temperature::init() {
}
#endif
#if ENABLED(THERMAL_PROTECTION_HOTENDS) || HAS_THERMALLY_PROTECTED_BED || ENABLED(THERMAL_PROTECTION_CHAMBER)
#if HAS_THERMAL_PROTECTION
#if ENABLED(THERMAL_PROTECTION_HOTENDS)
Temperature::tr_state_machine_t Temperature::tr_state_machine[HOTENDS]; // = { { TRInactive, 0 } };
@ -1629,7 +1657,7 @@ void Temperature::init() {
else
SERIAL_ECHOPAIR(" ; Idle Timeout:", bed_idle.timed_out);
SERIAL_EOL();
*/
//*/
const int heater_index = heater_id >= 0 ? heater_id : HOTENDS;
@ -2647,7 +2675,7 @@ void Temperature::isr() {
void Temperature::set_heating_message(const uint8_t e) {
const bool heating = isHeatingHotend(e);
#if HOTENDS > 1
ui.status_printf_P(0, heating ? PSTR("E%i " MSG_HEATING) : PSTR("E%i " MSG_COOLING), int(e + 1));
ui.status_printf_P(0, heating ? PSTR("E%c " MSG_HEATING) : PSTR("E%c " MSG_COOLING), '1' + e);
#else
ui.set_status_P(heating ? PSTR("E " MSG_HEATING) : PSTR("E " MSG_COOLING));
#endif

View file

@ -280,47 +280,37 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
grabpos = parkingposx[tmp_extruder] + (tmp_extruder ? PARKING_EXTRUDER_GRAB_DISTANCE : -(PARKING_EXTRUDER_GRAB_DISTANCE)) + x_offset;
/**
* 1. Raise Z-Axis to give enough clearance
* 2. Move to park position of old extruder
* 3. Disengage magnetic field, wait for delay
* 4. Move near new extruder
* 5. Engage magnetic field for new extruder
* 6. Move to parking incl. offset of new extruder
* 7. Lower Z-Axis
* 1. Move to park position of old extruder
* 2. Disengage magnetic field, wait for delay
* 3. Move near new extruder
* 4. Engage magnetic field for new extruder
* 5. Move to parking incl. offset of new extruder
* 6. Lower Z-Axis
*/
// STEP 1
if (DEBUGGING(LEVELING)) DEBUG_POS("Start Autopark", current_position);
current_position[Z_AXIS] += toolchange_settings.z_raise;
if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position);
fast_line_to_current(Z_AXIS);
planner.synchronize();
// STEP 2
current_position[X_AXIS] = parkingposx[active_extruder] + x_offset;
if (DEBUGGING(LEVELING)) {
DEBUG_ECHOLNPAIR("(2) Park extruder ", int(active_extruder));
DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder));
DEBUG_POS("Moving ParkPos", current_position);
}
fast_line_to_current(X_AXIS);
planner.synchronize();
// STEP 3
// STEP 2
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(3) Disengage magnet ");
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(2) Disengage magnet ");
pe_deactivate_solenoid(active_extruder);
// STEP 4
// STEP 3
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(4) Move to position near new extruder");
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(3) Move to position near new extruder");
current_position[X_AXIS] += active_extruder ? -10 : 10; // move 10mm away from parked extruder
@ -329,8 +319,8 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
fast_line_to_current(X_AXIS);
planner.synchronize();
// STEP 5
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(5) Engage magnetic field");
// STEP 4
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(4) Engage magnetic field");
#if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT)
pe_activate_solenoid(active_extruder); //just save power for inverted magnets
@ -338,16 +328,16 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
pe_activate_solenoid(tmp_extruder);
// STEP 6
// STEP 5
current_position[X_AXIS] = grabpos + (tmp_extruder ? -10 : 10);
fast_line_to_current(X_AXIS);
current_position[X_AXIS] = grabpos;
if (DEBUGGING(LEVELING)) DEBUG_POS("(6) Unpark extruder", current_position);
if (DEBUGGING(LEVELING)) DEBUG_POS("(5) Unpark extruder", current_position);
planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS] * 0.5, active_extruder);
planner.synchronize();
// STEP 7
// STEP 6
current_position[X_AXIS] = midpos
#if HAS_HOTEND_OFFSET
@ -355,7 +345,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
#endif
;
if (DEBUGGING(LEVELING)) DEBUG_POS("(7) Move midway between hotends", current_position);
if (DEBUGGING(LEVELING)) DEBUG_POS("(6) Move midway between hotends", current_position);
fast_line_to_current(X_AXIS);
planner.synchronize();
@ -385,30 +375,20 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
grabxpos = toolheadposx[tmp_extruder];
/**
* 1. Raise Z to give enough clearance
* 2. Move to switch position of current toolhead
* 3. Unlock tool and drop it in the dock
* 4. Move to the new toolhead
* 5. Grab and lock the new toolhead
* 1. Move to switch position of current toolhead
* 2. Unlock tool and drop it in the dock
* 3. Move to the new toolhead
* 4. Grab and lock the new toolhead
*/
// 1. Raise Z to give enough clearance
// 1. Move to switch position of current toolhead
if (DEBUGGING(LEVELING)) DEBUG_POS("Starting Toolhead change", current_position);
current_position[Z_AXIS] += toolchange_settings.z_raise;
if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position);
fast_line_to_current(Z_AXIS);
planner.synchronize();
// 2. Move to switch position of current toolhead
current_position[X_AXIS] = placexpos;
if (DEBUGGING(LEVELING)) {
DEBUG_ECHOLNPAIR("(2) Place old tool ", int(active_extruder));
DEBUG_ECHOLNPAIR("(1) Place old tool ", int(active_extruder));
DEBUG_POS("Move X SwitchPos", current_position);
}
@ -422,9 +402,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
fast_line_to_current(Y_AXIS);
planner.synchronize();
// 3. Unlock tool and drop it in the dock
// 2. Unlock tool and drop it in the dock
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(3) Unlock and Place Toolhead");
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(2) Unlock and Place Toolhead");
MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, angles[1]);
safe_delay(500);
@ -443,9 +423,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
fast_line_to_current(Y_AXIS); // move away from docked toolhead
planner.synchronize();
// 4. Move to the new toolhead
// 3. Move to the new toolhead
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(4) Move to new toolhead position");
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(3) Move to new toolhead position");
current_position[X_AXIS] = grabxpos;
@ -460,9 +440,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
fast_line_to_current(Y_AXIS);
planner.synchronize();
// 5. Grab and lock the new toolhead
// 4. Grab and lock the new toolhead
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(5) Grab and lock new toolhead ");
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(4) Grab and lock new toolhead ");
current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS;
@ -497,30 +477,20 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
grabxpos = toolheadposx[tmp_extruder];
/**
* 1. Raise Z to give enough clearance
* 2. Move to switch position of current toolhead
* 3. Release and place toolhead in the dock
* 4. Move to the new toolhead
* 5. Grab the new toolhead and move to security position
* 1. Move to switch position of current toolhead
* 2. Release and place toolhead in the dock
* 3. Move to the new toolhead
* 4. Grab the new toolhead and move to security position
*/
if (DEBUGGING(LEVELING)) DEBUG_POS("Starting Toolhead change", current_position);
// 1. Raise Z to give enough clearance
current_position[Z_AXIS] += toolchange_settings.z_raise;
if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position);
planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder);
planner.synchronize();
// 2. Move to switch position current toolhead
// 1. Move to switch position current toolhead
current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR;
if (DEBUGGING(LEVELING)) {
SERIAL_ECHOLNPAIR("(2) Place old tool ", int(active_extruder));
SERIAL_ECHOLNPAIR("(1) Place old tool ", int(active_extruder));
DEBUG_POS("Move Y SwitchPos + Security", current_position);
}
@ -548,9 +518,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
planner.buffer_line(current_position, (planner.settings.max_feedrate_mm_s[X_AXIS] * 0.25), active_extruder);
planner.synchronize();
// 3. Release and place toolhead in the dock
// 2. Release and place toolhead in the dock
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(3) Release and Place Toolhead");
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(2) Release and Place Toolhead");
current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE;
@ -566,9 +536,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
planner.buffer_line(current_position, (planner.settings.max_feedrate_mm_s[Y_AXIS]), active_extruder);
planner.synchronize();
// 4. Move to new toolhead position
// 3. Move to new toolhead position
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(4) Move to new toolhead position");
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(3) Move to new toolhead position");
current_position[X_AXIS] = grabxpos;
@ -577,9 +547,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) {
planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder);
planner.synchronize();
// 5. Grab the new toolhead and move to security position
// 4. Grab the new toolhead and move to security position
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(5) Grab new toolhead and move to security position");
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(4) Grab new toolhead and move to security position");
current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE;
@ -732,7 +702,11 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
if (tmp_extruder >= EXTRUDERS)
return invalid_extruder_error(tmp_extruder);
if (!no_move && !all_axes_homed()) {
if (!no_move && (!all_axes_homed()
#if ENABLED(DUAL_X_CARRIAGE)
|| dual_x_carriage_mode == DXC_FULL_CONTROL_MODE
#endif
)) {
no_move = true;
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("No move on toolchange");
}
@ -785,14 +759,15 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
if (!no_move) {
#if DISABLED(SWITCHING_NOZZLE)
// Do a small lift to avoid the workpiece in the move back (below)
#if ENABLED(TOOLCHANGE_PARK)
current_position[X_AXIS] = toolchange_settings.change_point.x;
current_position[Y_AXIS] = toolchange_settings.change_point.y;
#endif
current_position[Z_AXIS] += toolchange_settings.z_raise;
#if HAS_SOFTWARE_ENDSTOPS
NOMORE(current_position[Z_AXIS], soft_endstop[Z_AXIS].max);
#endif
fast_line_to_current(Z_AXIS);
#if ENABLED(TOOLCHANGE_PARK)
current_position[X_AXIS] = toolchange_settings.change_point.x;
current_position[Y_AXIS] = toolchange_settings.change_point.y;
#endif
planner.buffer_line(current_position, feedrate_mm_s, active_extruder);
#endif
planner.synchronize();
@ -875,10 +850,10 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
#if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
if (should_swap && !too_cold) {
#if ENABLED(ADVANCED_PAUSE_FEATURE)
do_pause_e_move(toolchange_settings.swap_length + TOOLCHANGE_FIL_EXTRA_PRIME, toolchange_settings.prime_speed);
do_pause_e_move(toolchange_settings.swap_length + TOOLCHANGE_FIL_EXTRA_PRIME, MMM_TO_MMS(toolchange_settings.prime_speed));
#else
current_position[E_AXIS] += (toolchange_settings.swap_length + TOOLCHANGE_FIL_EXTRA_PRIME) / planner.e_factor[tmp_extruder];
planner.buffer_line(current_position, toolchange_settings.prime_speed, tmp_extruder);
planner.buffer_line(current_position, MMM_TO_MMS(toolchange_settings.prime_speed), tmp_extruder);
#endif
planner.synchronize();

View file

@ -190,28 +190,70 @@
#define LCD_PINS_D4 P1_21
#else
#define LCD_PINS_RS P1_19
#define BTN_EN1 P3_26 // (31) J3-2 & AUX-4
#define BTN_EN2 P3_25 // (33) J3-4 & AUX-4
#define SD_DETECT_PIN P1_31 // (49) (NOT 5V tolerant)
#define LCD_SDSS P0_16 // (16) J3-7 & AUX-4
#define LCD_PINS_ENABLE P1_18
#define LCD_PINS_D4 P1_20
#define LCD_SDSS P0_16 // (16) J3-7 & AUX-4
#define SD_DETECT_PIN P1_31 // (49) (NOT 5V tolerant)
#if ENABLED(FYSETC_MINI_12864)
#define DOGLCD_CS P1_18
#define DOGLCD_A0 P1_19
#define LCD_BACKLIGHT_PIN -1
#define LCD_RESET_PIN P1_20 // Must be high or open for LCD to operate normally.
// Seems to work best if left open.
#define FYSETC_MINI_12864_REV_1_2
//#define FYSETC_MINI_12864_REV_2_0
//#define FYSETC_MINI_12864_REV_2_1
#if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
#define RGB_LED
#ifndef RGB_LED_R_PIN
#define RGB_LED_R_PIN P1_21
#endif
#ifndef RGB_LED_G_PIN
#define RGB_LED_G_PIN P1_22
#endif
#ifndef RGB_LED_B_PIN
#define RGB_LED_B_PIN P1_23
#endif
#elif defined(FYSETC_MINI_12864_REV_2_1)
#define NEOPIXEL_LED
#define NEOPIXEL_TYPE NEO_GRB // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
#define NEOPIXEL_PIN P1_21 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
#define NEOPIXEL_PIXELS 3 // Number of LEDs in the strip
#define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
#define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255)
#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup
#else
#error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
#endif
#if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
#error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
#endif
#else // !FYSETC_MINI_12864
#if ENABLED(MKS_MINI_12864)
#define DOGLCD_CS P1_21
#define DOGLCD_A0 P1_22
#endif
#if ENABLED(ULTIPANEL)
#define LCD_PINS_D5 P1_21
#define LCD_PINS_D6 P1_22
#define LCD_PINS_D7 P1_23
#endif
#if ENABLED(MKS_MINI_12864)
#define DOGLCD_CS P1_21
#define DOGLCD_A0 P1_22
#endif
#endif // !FYSETC_MINI_12864
#endif

View file

@ -72,3 +72,6 @@
#define HEATER_0_PIN 2
#define FAN_PIN 13
#define HEATER_BED_PIN 4
// SPI
#define SDSS 5

View file

@ -181,16 +181,16 @@
// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER
//
#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
#define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 23
#define LCD_PINS_D5 25
#define LCD_PINS_D6 27
#define LCD_PINS_D7 29
#define BEEPER_PIN 37
#define BTN_EN1 31
#define BTN_EN2 33
#define BTN_ENC 35
#define SD_DETECT_PIN 49
#define KILL_PIN 41
#define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 23
#define LCD_PINS_D5 25
#define LCD_PINS_D6 27
#define LCD_PINS_D7 29
#endif

View file

@ -155,9 +155,8 @@
//
// Misc. Functions
//
#define CASE_LIGHT_PIN 8
#define SDSS 53
#ifndef ROXYs_TRex
#ifndef LED_PIN
#define LED_PIN 13 // The Formbot v 1 board has almost no unassigned pins on it. The Board's LED
#endif // is a good place to get a signal to control the Max7219 LED Matrix.
@ -168,24 +167,28 @@
#define PS_ON_PIN 12
#endif
#define CASE_LIGHT_PIN 8
//
// LCD / Controller
//
// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER
//
#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
#ifndef BEEPER_PIN
#define BEEPER_PIN 37
#endif
#define BTN_EN1 31
#define BTN_EN2 33
#define BTN_ENC 35
#define SD_DETECT_PIN 49
#ifndef KILL_PIN
#define KILL_PIN 41
#endif
#define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 23
#define LCD_PINS_D5 25
#define LCD_PINS_D6 27
#define LCD_PINS_D7 29
#define BTN_EN1 31
#define BTN_EN2 33
#define BTN_ENC 35
#define SD_DETECT_PIN 49
#ifndef ROXYs_TRex
#define KILL_PIN 41
#define BEEPER_PIN 37
#endif
#endif

View file

@ -139,7 +139,7 @@
//
#define CASE_LIGHT_PIN 5
#define SDSS 53
#ifndef ROXYs_TRex
#ifndef LED_PIN
#define LED_PIN 13
#endif
@ -165,8 +165,10 @@
#define BTN_EN2 33
#define BTN_ENC 35
#define SD_DETECT_PIN 49
#ifndef ROXYs_TRex
#ifndef KILL_PIN
#define KILL_PIN 41
#endif
#ifndef BEEPER_PIN
#define BEEPER_PIN 37
#endif
#endif

View file

@ -28,8 +28,8 @@
#error "Oops! Select 'FYSETC F6' in 'Tools > Board.'"
#endif
#ifdef SD_DETECT_INVERTED
#error "SD_DETECT_INVERTED must be disabled for the FYSETC_F6_13 board."
#if ENABLED(SD_DETECT_INVERTED)
//#error "SD_DETECT_INVERTED must be disabled for the FYSETC_F6_13 board."
#endif
#define BOARD_NAME "FYSETC F6 1.3"
@ -184,17 +184,23 @@
#define BEEPER_PIN 37
#define SD_DETECT_PIN 49
#if ENABLED(MKS_MINI_12864)
#define DOGLCD_A0 27
#define DOGLCD_CS 25
#endif
#if ENABLED(FYSETC_MINI_12864)
//
// See https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8
//
#define DOGLCD_A0 16
#define DOGLCD_CS 17
#define LCD_BACKLIGHT_PIN -1
#define KILL_PIN 41
#define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally.
// Seems to work best if left open.
#define FYSETC_MINI_12864_REV_1_2
//#define FYSETC_MINI_12864_REV_2_0
//#define FYSETC_MINI_12864_REV_2_1
#if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
#ifndef RGB_LED_R_PIN
#define RGB_LED_R_PIN 25
#endif
@ -204,6 +210,21 @@
#ifndef RGB_LED_B_PIN
#define RGB_LED_B_PIN 29
#endif
#elif defined(FYSETC_MINI_12864_REV_2_1)
#define NEOPIXEL_LED
#define NEOPIXEL_TYPE NEO_GRB // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
#define NEOPIXEL_PIN 25 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
#define NEOPIXEL_PIXELS 3 // Number of LEDs in the strip
#define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
#define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255)
#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup
#else
#error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
#endif
#if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
#error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
#endif
#elif HAS_GRAPHICAL_LCD
@ -214,6 +235,11 @@
#define LCD_PINS_D6 27
#define LCD_PINS_D7 29
#if ENABLED(MKS_MINI_12864)
#define DOGLCD_CS 25
#define DOGLCD_A0 27
#endif
#endif
#if ENABLED(NEWPANEL)
@ -222,20 +248,6 @@
#define BTN_ENC 35
#endif
#if ENABLED(FYSETC_MINI_12864)
#define LCD_BACKLIGHT_PIN -1
#define LCD_RESET_PIN 23
#define KILL_PIN 41
#ifndef RGB_LED_R_PIN
#define RGB_LED_R_PIN 25
#endif
#ifndef RGB_LED_G_PIN
#define RGB_LED_G_PIN 27
#endif
#ifndef RGB_LED_B_PIN
#define RGB_LED_B_PIN 29
#endif
#endif
#ifndef RGB_LED_R_PIN
#define RGB_LED_R_PIN 3
#endif

View file

@ -24,7 +24,7 @@
* Gen7 v1.3 pin assignments
*/
/**
/**
* Rev B 26 DEC 2016
*
* added pointer to a current Arduino IDE extension

View file

@ -436,7 +436,9 @@
#endif
#define BTN_ENC 35
#ifndef SD_DETECT_PIN
#define SD_DETECT_PIN 49
#endif
#define KILL_PIN 41
#if ENABLED(BQ_LCD_SMART_CONTROLLER)
@ -526,7 +528,6 @@
// From https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8
#define BEEPER_PIN 37
#define LCD_RESET_PIN 23
#define DOGLCD_A0 16
#define DOGLCD_CS 17
@ -537,6 +538,13 @@
#define SD_DETECT_PIN 49
#define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally.
// Seems to work best if left open.
#define FYSETC_MINI_12864_REV_1_2
//#define FYSETC_MINI_12864_REV_2_0
//#define FYSETC_MINI_12864_REV_2_1
#if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
#ifndef RGB_LED_R_PIN
#define RGB_LED_R_PIN 25
#endif
@ -546,6 +554,21 @@
#ifndef RGB_LED_B_PIN
#define RGB_LED_B_PIN 29
#endif
#elif defined(FYSETC_MINI_12864_REV_2_1)
#define NEOPIXEL_LED
#define NEOPIXEL_TYPE NEO_GRB // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
#define NEOPIXEL_PIN 25 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
#define NEOPIXEL_PIXELS 3 // Number of LEDs in the strip
#define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
#define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255)
#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup
#else
#error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
#endif
#if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
#error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
#endif
#elif ENABLED(MINIPANEL)

View file

@ -150,32 +150,71 @@
#if ENABLED(NEWPANEL)
#define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 23
#define LCD_PINS_D5 25
#define LCD_PINS_D6 27
#define LCD_PINS_D7 29
#endif
#if ENABLED(FYSETC_MINI_12864)
#define DOGLCD_CS LCD_PINS_ENABLE
#define DOGLCD_A0 LCD_PINS_RS
#elif ENABLED(MINIPANEL)
//#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes problems
#define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally.
// Seems to work best if left open.
#define FYSETC_MINI_12864_REV_1_2
//#define FYSETC_MINI_12864_REV_2_0
//#define FYSETC_MINI_12864_REV_2_1
#if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
#ifndef RGB_LED_R_PIN
#define RGB_LED_R_PIN 25
#endif
#ifndef RGB_LED_G_PIN
#define RGB_LED_G_PIN 27
#endif
#ifndef RGB_LED_B_PIN
#define RGB_LED_B_PIN 29
#endif
#elif defined(FYSETC_MINI_12864_REV_2_1)
#define NEOPIXEL_LED
#define NEOPIXEL_TYPE NEO_GRB // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
#define NEOPIXEL_PIN 25 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
#define NEOPIXEL_PIXELS 3 // Number of LEDs in the strip
#define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
#define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255)
#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup
#else
#error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
#endif
#if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
#error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
#endif
#elif ENABLED(NEWPANEL)
#define LCD_PINS_D4 23
#define LCD_PINS_D5 25
#define LCD_PINS_D6 27
#define LCD_PINS_D7 29
#if ENABLED(MINIPANEL)
#define DOGLCD_CS 25
#define DOGLCD_A0 27
#endif
#endif
#if ANY(VIKI2, miniVIKI)
#define DOGLCD_A0 16
#define KILL_PIN 51
#define STAT_LED_BLUE_PIN 29
#define STAT_LED_RED_PIN 23
#define DOGLCD_CS 17
#define DOGLCD_SCK 76 // SCK_PIN - These are required for DUE Hardware SPI
#define DOGLCD_SCK 76 // SCK_PIN - Required for DUE Hardware SPI
#define DOGLCD_MOSI 75 // MOSI_PIN
#define DOGLCD_MISO 74 // MISO_PIN
#endif
#endif // ULTRA_LCD
#if HAS_DRIVER(TMC2208)
@ -201,10 +240,8 @@
//
// M3/M4/M5 - Spindle/Laser Control
//
#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENA)
#if HOTENDS < 3
#if HOTENDS < 3 && ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENA)
#define SPINDLE_LASER_ENA_PIN 45 // Use E2 ENA
#define SPINDLE_LASER_PWM_PIN 12 // MUST BE HARDWARE PWM
#define SPINDLE_DIR_PIN 47 // Use E2 DIR
#endif
#endif

View file

@ -320,6 +320,7 @@
#define DOGLCD_MOSI P0_18
#define DOGLCD_CS P1_09 // use Ethernet connector for EXP1 cable signals
#define DOGLCD_A0 P1_14
#define FORCE_SOFT_SPI // required on a Re-ARM system
#else
#define DOGLCD_CS P0_26 // (63) J5-3 & AUX-2
#define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2

View file

@ -202,31 +202,24 @@
//
#if ENABLED(ULTRA_LCD)
#if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER)
#if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
#define BEEPER_PIN 62
#define LCD_PINS_D4 48
#define LCD_PINS_D5 50
#define LCD_PINS_D6 52
#define LCD_PINS_D7 53
#define SD_DETECT_PIN 51
#endif
#if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER)
#define LCD_PINS_RS 63
#define LCD_PINS_ENABLE 64
#define LCD_PINS_D4 48
#define LCD_PINS_D5 50
#define LCD_PINS_D6 52
#define LCD_PINS_D7 53
#define SD_DETECT_PIN 51
#elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
#define BEEPER_PIN 62
#define LCD_PINS_RS 52
#define LCD_PINS_ENABLE 53
#define LCD_PINS_D4 48
#define LCD_PINS_D5 50
#define LCD_PINS_D6 52
#define LCD_PINS_D7 53
#define SD_DETECT_PIN 51
#elif HAS_SSD1306_OLED_I2C
@ -234,16 +227,57 @@
#define LCD_SDSS 10
#define SD_DETECT_PIN 51
#elif ENABLED(FYSETC_MINI_12864)
#define BEEPER_PIN 62
#define DOGLCD_CS 64
#define DOGLCD_A0 63
//#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes problems
#define LCD_RESET_PIN 48 // Must be high or open for LCD to operate normally.
// Seems to work best if left open.
#define FYSETC_MINI_12864_REV_1_2
//#define FYSETC_MINI_12864_REV_2_0
//#define FYSETC_MINI_12864_REV_2_1
#if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
#define RGB_LED
#ifndef RGB_LED_R_PIN
#define RGB_LED_R_PIN 50 // D5
#endif
#ifndef RGB_LED_G_PIN
#define RGB_LED_G_PIN 52 // D6
#endif
#ifndef RGB_LED_B_PIN
#define RGB_LED_B_PIN 53 // D7
#endif
#elif defined(FYSETC_MINI_12864_REV_2_1)
#define NEOPIXEL_LED
#define NEOPIXEL_TYPE NEO_GRB // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
#define NEOPIXEL_PIN 50 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
#define NEOPIXEL_PIXELS 3 // Number of LEDs in the strip
#define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
#define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255)
#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup
#else
#error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
#endif
#if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
#error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
#endif
#elif ENABLED(SPARK_FULL_GRAPHICS)
//http://doku.radds.org/dokumentation/other-electronics/sparklcd/
#error "Oops! SPARK_FULL_GRAPHICS not supported with RURAMPS4D."
//#define LCD_PINS_D4 29//?
//#define LCD_PINS_ENABLE 27//?
//#define LCD_PINS_RS 25//?
//#define BTN_EN1 35//?
//#define BTN_EN2 33//?
//#define BTN_ENC 37//?
//#define LCD_PINS_D4 29 //?
//#define LCD_PINS_ENABLE 27 //?
//#define LCD_PINS_RS 25 //?
//#define BTN_EN1 35 //?
//#define BTN_EN2 33 //?
//#define BTN_ENC 37 //?
#endif // SPARK_FULL_GRAPHICS

View file

@ -188,31 +188,24 @@
//
#if ENABLED(ULTRA_LCD)
#if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER)
#if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
#define BEEPER_PIN 62
#define LCD_PINS_D4 48
#define LCD_PINS_D5 50
#define LCD_PINS_D6 52
#define LCD_PINS_D7 53
#define SD_DETECT_PIN 51
#endif
#if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER)
#define LCD_PINS_RS 63
#define LCD_PINS_ENABLE 64
#define LCD_PINS_D4 48
#define LCD_PINS_D5 50
#define LCD_PINS_D6 52
#define LCD_PINS_D7 53
#define SD_DETECT_PIN 51
#elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
#define BEEPER_PIN 62
#define LCD_PINS_RS 52
#define LCD_PINS_ENABLE 53
#define LCD_PINS_D4 48
#define LCD_PINS_D5 50
#define LCD_PINS_D6 52
#define LCD_PINS_D7 53
#define SD_DETECT_PIN 51
#elif HAS_SSD1306_OLED_I2C
@ -220,6 +213,47 @@
#define LCD_SDSS 10
#define SD_DETECT_PIN 51
#elif ENABLED(FYSETC_MINI_12864)
#define BEEPER_PIN 62
#define DOGLCD_CS 64
#define DOGLCD_A0 63
//#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes problems
#define LCD_RESET_PIN 48 // Must be high or open for LCD to operate normally.
// Seems to work best if left open.
#define FYSETC_MINI_12864_REV_1_2
//#define FYSETC_MINI_12864_REV_2_0
//#define FYSETC_MINI_12864_REV_2_1
#if EITHER(FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0)
#define RGB_LED
#ifndef RGB_LED_R_PIN
#define RGB_LED_R_PIN 50 // D5
#endif
#ifndef RGB_LED_G_PIN
#define RGB_LED_G_PIN 52 // D6
#endif
#ifndef RGB_LED_B_PIN
#define RGB_LED_B_PIN 53 // D7
#endif
#elif defined(FYSETC_MINI_12864_REV_2_1)
#define NEOPIXEL_LED
#define NEOPIXEL_TYPE NEO_GRB // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
#define NEOPIXEL_PIN 50 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba)
#define NEOPIXEL_PIXELS 3 // Number of LEDs in the strip
#define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
#define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255)
#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup
#else
#error "Either FYSETC_MINI_12864_REV_1_2, FYSETC_MINI_12864_REV_2_0 or FYSETC_MINI_12864_REV_2_1 must be defined"
#endif
#if !defined(LED_USER_PRESET_STARTUP) && EITHER(FYSETC_MINI_12864_REV_2_0, FYSETC_MINI_12864_REV_2_1)
#error "LED_USER_PRESET_STARTUP must be enabled when using FYSETC_MINI_12864 REV 2.0 and later"
#endif
#elif ENABLED(MKS_MINI_12864)
#define ORIG_BEEPER_PIN 62

View file

@ -1,7 +1,9 @@
# Marlin 3D Printer Firmware
[![Build Status](https://travis-ci.org/MarlinFirmware/Marlin.svg?branch=RCBugFix)](https://travis-ci.org/MarlinFirmware/Marlin)
[![Coverity Scan Build Status](https://scan.coverity.com/projects/2224/badge.svg)](https://scan.coverity.com/projects/2224)
[![Build Status](https://travis-ci.org/MarlinFirmware/Marlin.svg?branch=bugfix-2.0.x)](https://travis-ci.org/MarlinFirmware/Marlin)
![GitHub](https://img.shields.io/github/license/marlinfirmware/marlin.svg)
![GitHub contributors](https://img.shields.io/github/contributors/marlinfirmware/marlin.svg)
![GitHub Release Date](https://img.shields.io/github/release-date/marlinfirmware/marlin.svg)
<img align="top" width=175 src="buildroot/share/pixmaps/logo/marlin-250.png" />
@ -65,7 +67,7 @@ The current Marlin dev team consists of:
- Roxanne Neufeld [[@Roxy-3D](https://github.com/Roxy-3D)] - USA
- Bob Kuhn [[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)] - USA
- Chris Pepper [[@p3p](https://github.com/p3p)] - UK
- João Brazio [[@jbrazio](https://github.com/jbrazio)] - Brazil
- João Brazio [[@jbrazio](https://github.com/jbrazio)] - Portugal
- Erik van der Zalm [[@ErikZalm](https://github.com/ErikZalm)] - Netherlands &nbsp; [![Flattr Erik](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software)
## License

View file

@ -2013,6 +2013,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2044,6 +2044,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2033,6 +2033,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2013,6 +2013,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2024,6 +2024,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2015,6 +2015,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2015,6 +2015,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2167,6 +2167,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2028,6 +2028,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2023,6 +2023,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2014,6 +2014,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2013,6 +2013,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2013,6 +2013,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2013,6 +2013,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2001,6 +2001,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2013,6 +2013,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2001,6 +2001,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2012,6 +2012,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2023,6 +2023,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2014,6 +2014,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2016,6 +2016,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2032,6 +2032,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2023,6 +2023,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2017,6 +2017,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2017,6 +2017,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2023,6 +2023,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2019,6 +2019,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -1995,6 +1995,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -1995,6 +1995,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2004,6 +2004,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2019,6 +2019,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2118,6 +2118,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2048,6 +2048,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
@ -2159,3 +2160,9 @@
// Allow servo angle to be edited and saved to EEPROM
//#define EDITABLE_SERVO_ANGLES
#ifdef ROXYs_TRex
#define LED_PIN -1
#define BEEPER_PIN -1
#define KILL_PIN -1
#endif

View file

@ -2041,6 +2041,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
@ -2152,3 +2153,9 @@
// Allow servo angle to be edited and saved to EEPROM
//#define EDITABLE_SERVO_ANGLES
#ifdef ROXYs_TRex
#define LED_PIN -1
#define BEEPER_PIN -1
#define KILL_PIN -1
#endif

View file

@ -1998,6 +1998,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2002,6 +2002,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2028,6 +2028,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2002,6 +2002,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2020,6 +2020,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2029,6 +2029,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

View file

@ -2028,6 +2028,7 @@
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions.
// :[0,1,2,3,4,5,6,7]
#define SOFT_PWM_SCALE 0
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can

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