Merge branch 'Implement-M591-Configurable-Runout-Sensors' of https://github.com/InsanityAutomation/Marlin into Implement-M591-Configurable-Runout-Sensors
This commit is contained in:
@@ -113,10 +113,10 @@ jobs:
|
||||
steps:
|
||||
|
||||
- name: Check out the PR
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
@@ -124,20 +124,20 @@ jobs:
|
||||
${{ runner.os }}-pip-
|
||||
|
||||
- name: Cache PlatformIO
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.platformio
|
||||
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
||||
|
||||
- name: Select Python 3.7
|
||||
uses: actions/setup-python@v2
|
||||
uses: actions/setup-python@v3
|
||||
with:
|
||||
python-version: '3.7' # Version range or exact version of a Python version to use, using semvers version range syntax.
|
||||
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
||||
|
||||
- name: Install PlatformIO
|
||||
run: |
|
||||
pip install -U https://github.com/platformio/platformio-core/archive/develop.zip
|
||||
pip install -U https://github.com/platformio/platformio-core/archive/v5.2.5.zip
|
||||
platformio update
|
||||
|
||||
- name: Run ${{ matrix.test-platform }} Tests
|
||||
|
||||
+19
-16
@@ -811,18 +811,17 @@
|
||||
*/
|
||||
//#define DUAL_X_CARRIAGE
|
||||
#if ENABLED(DUAL_X_CARRIAGE)
|
||||
#define X1_MIN_POS X_MIN_POS // Set to X_MIN_POS
|
||||
#define X1_MAX_POS X_BED_SIZE // Set a maximum so the first X-carriage can't hit the parked second X-carriage
|
||||
#define X2_MIN_POS 80 // Set a minimum to ensure the second X-carriage can't hit the parked first X-carriage
|
||||
#define X2_MAX_POS 353 // Set this to the distance between toolheads when both heads are homed
|
||||
#define X2_HOME_DIR 1 // Set to 1. The second X-carriage always homes to the maximum endstop position
|
||||
#define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS.
|
||||
// However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software
|
||||
// override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops
|
||||
// without modifying the firmware (through the "M218 T1 X???" command).
|
||||
// Remember: you should set the second extruder x-offset to 0 in your slicer.
|
||||
#define X1_MIN_POS X_MIN_POS // Set to X_MIN_POS
|
||||
#define X1_MAX_POS X_BED_SIZE // A max coordinate so the X1 carriage can't hit the parked X2 carriage
|
||||
#define X2_MIN_POS 80 // A min coordinate so the X2 carriage can't hit the parked X1 carriage
|
||||
#define X2_MAX_POS 353 // The max position of the X2 carriage, typically also the home position
|
||||
#define X2_HOME_DIR 1 // Set to 1. The X2 carriage always homes to the max endstop position
|
||||
#define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS.
|
||||
// NOTE: For Dual X Carriage use M218 T1 Xn to override the X2_HOME_POS.
|
||||
// This allows recalibration of endstops distance without a rebuild.
|
||||
// Remember to set the second extruder's X-offset to 0 in your slicer.
|
||||
|
||||
// This is the default power-up mode which can be later using M605.
|
||||
// This is the default power-up mode which can be changed later using M605 S<mode>.
|
||||
#define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE
|
||||
|
||||
// Default x offset in duplication mode (typically set to half print bed width)
|
||||
@@ -1340,19 +1339,22 @@
|
||||
#endif
|
||||
|
||||
#if EITHER(HAS_DISPLAY, DWIN_LCD_PROUI)
|
||||
// The timeout (in ms) to return to the status screen from sub-menus
|
||||
//#define LCD_TIMEOUT_TO_STATUS 15000
|
||||
// The timeout to return to the status screen from sub-menus
|
||||
//#define LCD_TIMEOUT_TO_STATUS 15000 // (ms)
|
||||
|
||||
#if ENABLED(SHOW_BOOTSCREEN)
|
||||
#define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s)
|
||||
#define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s)
|
||||
#if EITHER(HAS_MARLINUI_U8GLIB, TFT_COLOR_UI)
|
||||
#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash)
|
||||
#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Scroll a longer status message into view
|
||||
//#define STATUS_MESSAGE_SCROLLING
|
||||
|
||||
// Apply a timeout to low-priority status messages
|
||||
//#define STATUS_MESSAGE_TIMEOUT_SEC 30 // (seconds)
|
||||
|
||||
// On the Info Screen, display XY with one decimal place when possible
|
||||
//#define LCD_DECIMAL_SMALL_XY
|
||||
|
||||
@@ -3465,7 +3467,7 @@
|
||||
#define SPINDLE_LASER_USE_PWM // Enable if your controller supports setting the speed/power
|
||||
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||
#define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower
|
||||
#define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC)
|
||||
#define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR, ESP32, and LPC)
|
||||
#endif
|
||||
|
||||
//#define AIR_EVACUATION // Cutter Vacuum / Laser Blower motor control with G-codes M10-M11
|
||||
@@ -4114,6 +4116,7 @@
|
||||
//#define FREEZE_FEATURE
|
||||
#if ENABLED(FREEZE_FEATURE)
|
||||
//#define FREEZE_PIN 41 // Override the default (KILL) pin here
|
||||
#define FREEZE_STATE LOW // State of pin indicating freeze
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -132,7 +132,7 @@ CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d\ )
|
||||
CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ )
|
||||
CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) )))
|
||||
ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1)
|
||||
@echo This version of GCC is likely broken. Enabling relocation workaround.
|
||||
$(warning This GCC version $(CC_VER) is likely broken. Enabling relocation workaround.)
|
||||
RELOC_WORKAROUND = 1
|
||||
endif
|
||||
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@
|
||||
* here we define this default string as the date where the latest release
|
||||
* version was tagged.
|
||||
*/
|
||||
//#define STRING_DISTRIBUTION_DATE "2022-03-12"
|
||||
//#define STRING_DISTRIBUTION_DATE "2022-03-29"
|
||||
|
||||
/**
|
||||
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
||||
|
||||
@@ -71,3 +71,7 @@
|
||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||
#error "POSTMORTEM_DEBUGGING is not supported on AVR boards."
|
||||
#endif
|
||||
|
||||
#if USING_PULLDOWNS
|
||||
#error "PULLDOWN pin mode is not available on AVR boards."
|
||||
#endif
|
||||
|
||||
@@ -59,3 +59,7 @@
|
||||
#if HAS_TMC_SW_SERIAL
|
||||
#error "TMC220x Software Serial is not supported on the DUE platform."
|
||||
#endif
|
||||
|
||||
#if USING_PULLDOWNS
|
||||
#error "PULLDOWN pin mode is not available on DUE boards."
|
||||
#endif
|
||||
|
||||
@@ -73,9 +73,16 @@ uint16_t MarlinHAL::adc_result;
|
||||
esp_adc_cal_characteristics_t characteristics[ADC_ATTEN_MAX];
|
||||
adc_atten_t attenuations[ADC1_CHANNEL_MAX] = {};
|
||||
uint32_t thresholds[ADC_ATTEN_MAX];
|
||||
volatile int numPWMUsed = 0,
|
||||
pwmPins[MAX_PWM_PINS],
|
||||
pwmValues[MAX_PWM_PINS];
|
||||
|
||||
volatile int numPWMUsed = 0;
|
||||
volatile struct { pin_t pin; int value; } pwmState[MAX_PWM_PINS];
|
||||
|
||||
pin_t chan_pin[CHANNEL_MAX_NUM + 1] = { 0 }; // PWM capable IOpins - not 0 or >33 on ESP32
|
||||
|
||||
struct {
|
||||
uint32_t freq; // ledcReadFreq doesn't work if a duty hasn't been set yet!
|
||||
uint16_t res;
|
||||
} pwmInfo[(CHANNEL_MAX_NUM + 1) / 2];
|
||||
|
||||
// ------------------------
|
||||
// Public functions
|
||||
@@ -229,11 +236,15 @@ void MarlinHAL::adc_init() {
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef ADC_REFERENCE_VOLTAGE
|
||||
#define ADC_REFERENCE_VOLTAGE 3.3
|
||||
#endif
|
||||
|
||||
void MarlinHAL::adc_start(const pin_t pin) {
|
||||
const adc1_channel_t chan = get_channel(pin);
|
||||
uint32_t mv;
|
||||
esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv);
|
||||
adc_result = mv * 1023.0 / 3300.0;
|
||||
adc_result = mv * 1023.0f / float(ADC_REFERENCE_VOLTAGE) / 1000.0f;
|
||||
|
||||
// Change the attenuation level based on the new reading
|
||||
adc_atten_t atten;
|
||||
@@ -250,25 +261,81 @@ void MarlinHAL::adc_start(const pin_t pin) {
|
||||
adc1_set_attenuation(chan, atten);
|
||||
}
|
||||
|
||||
void analogWrite(pin_t pin, int value) {
|
||||
// Use ledc hardware for internal pins
|
||||
if (pin < 34) {
|
||||
static int cnt_channel = 1, pin_to_channel[40] = { 0 };
|
||||
if (pin_to_channel[pin] == 0) {
|
||||
ledcAttachPin(pin, cnt_channel);
|
||||
ledcSetup(cnt_channel, 490, 8);
|
||||
ledcWrite(cnt_channel, value);
|
||||
pin_to_channel[pin] = cnt_channel++;
|
||||
// ------------------------
|
||||
// PWM
|
||||
// ------------------------
|
||||
|
||||
int8_t channel_for_pin(const uint8_t pin) {
|
||||
for (int i = 0; i <= CHANNEL_MAX_NUM; i++)
|
||||
if (chan_pin[i] == pin) return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// get PWM channel for pin - if none then attach a new one
|
||||
// return -1 if fail or invalid pin#, channel # (0-15) if success
|
||||
int8_t get_pwm_channel(const pin_t pin, const uint32_t freq, const uint16_t res) {
|
||||
if (!WITHIN(pin, 1, MAX_PWM_IOPIN)) return -1; // Not a hardware PWM pin!
|
||||
int8_t cid = channel_for_pin(pin);
|
||||
if (cid >= 0) return cid;
|
||||
|
||||
// Find an empty adjacent channel (same timer & freq/res)
|
||||
for (int i = 0; i <= CHANNEL_MAX_NUM; i++) {
|
||||
if (chan_pin[i] == 0) {
|
||||
if (chan_pin[i ^ 0x1] != 0) {
|
||||
if (pwmInfo[i / 2].freq == freq && pwmInfo[i / 2].res == res) {
|
||||
chan_pin[i] = pin; // Allocate PWM to this channel
|
||||
ledcAttachPin(pin, i);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
else if (cid == -1) // Pair of empty channels?
|
||||
cid = i & 0xFE; // Save lower channel number
|
||||
}
|
||||
ledcWrite(pin_to_channel[pin], value);
|
||||
}
|
||||
// not attached, is an empty timer slot avail?
|
||||
if (cid >= 0) {
|
||||
chan_pin[cid] = pin;
|
||||
pwmInfo[cid / 2].freq = freq;
|
||||
pwmInfo[cid / 2].res = res;
|
||||
ledcSetup(cid, freq, res);
|
||||
ledcAttachPin(pin, cid);
|
||||
}
|
||||
return cid; // -1 if no channel avail
|
||||
}
|
||||
|
||||
void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=_BV(PWM_RESOLUTION)-1*/, const bool invert/*=false*/) {
|
||||
const int8_t cid = get_pwm_channel(pin, PWM_FREQUENCY, PWM_RESOLUTION);
|
||||
if (cid >= 0) {
|
||||
uint32_t duty = map(invert ? v_size - v : v, 0, v_size, 0, _BV(PWM_RESOLUTION)-1);
|
||||
ledcWrite(cid, duty);
|
||||
}
|
||||
}
|
||||
|
||||
int8_t MarlinHAL::set_pwm_frequency(const pin_t pin, const uint32_t f_desired) {
|
||||
const int8_t cid = channel_for_pin(pin);
|
||||
if (cid >= 0) {
|
||||
if (f_desired == ledcReadFreq(cid)) return cid; // no freq change
|
||||
ledcDetachPin(chan_pin[cid]);
|
||||
chan_pin[cid] = 0; // remove old freq channel
|
||||
}
|
||||
return get_pwm_channel(pin, f_desired, PWM_RESOLUTION); // try for new one
|
||||
}
|
||||
|
||||
// use hardware PWM if avail, if not then ISR
|
||||
void analogWrite(const pin_t pin, const uint16_t value, const uint32_t freq/*=PWM_FREQUENCY*/, const uint16_t res/*=8*/) { // always 8 bit resolution!
|
||||
// Use ledc hardware for internal pins
|
||||
const int8_t cid = get_pwm_channel(pin, freq, res);
|
||||
if (cid >= 0) {
|
||||
ledcWrite(cid, value); // set duty value
|
||||
return;
|
||||
}
|
||||
|
||||
// not a hardware PWM pin OR no PWM channels available
|
||||
int idx = -1;
|
||||
|
||||
// Search Pin
|
||||
for (int i = 0; i < numPWMUsed; ++i)
|
||||
if (pwmPins[i] == pin) { idx = i; break; }
|
||||
if (pwmState[i].pin == pin) { idx = i; break; }
|
||||
|
||||
// not found ?
|
||||
if (idx < 0) {
|
||||
@@ -277,7 +344,7 @@ void analogWrite(pin_t pin, int value) {
|
||||
|
||||
// Take new slot for pin
|
||||
idx = numPWMUsed;
|
||||
pwmPins[idx] = pin;
|
||||
pwmState[idx].pin = pin;
|
||||
// Start timer on first use
|
||||
if (idx == 0) HAL_timer_start(MF_TIMER_PWM, PWM_TIMER_FREQUENCY);
|
||||
|
||||
@@ -285,7 +352,7 @@ void analogWrite(pin_t pin, int value) {
|
||||
}
|
||||
|
||||
// Use 7bit internal value - add 1 to have 100% high at 255
|
||||
pwmValues[idx] = (value + 1) / 2;
|
||||
pwmState[idx].value = (value + 1) / 2;
|
||||
}
|
||||
|
||||
// Handle PWM timer interrupt
|
||||
@@ -296,9 +363,9 @@ HAL_PWM_TIMER_ISR() {
|
||||
|
||||
for (int i = 0; i < numPWMUsed; ++i) {
|
||||
if (count == 0) // Start of interval
|
||||
WRITE(pwmPins[i], pwmValues[i] ? HIGH : LOW);
|
||||
else if (pwmValues[i] == count) // End of duration
|
||||
WRITE(pwmPins[i], LOW);
|
||||
digitalWrite(pwmState[i].pin, pwmState[i].value ? HIGH : LOW);
|
||||
else if (pwmState[i].value == count) // End of duration
|
||||
digitalWrite(pwmState[i].pin, LOW);
|
||||
}
|
||||
|
||||
// 128 for 7 Bit resolution
|
||||
|
||||
@@ -64,6 +64,12 @@
|
||||
#define CRITICAL_SECTION_START() portENTER_CRITICAL(&spinlock)
|
||||
#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&spinlock)
|
||||
|
||||
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
||||
#define PWM_FREQUENCY 1000u // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency()
|
||||
#define PWM_RESOLUTION 10u // Default PWM bit resolution
|
||||
#define CHANNEL_MAX_NUM 15u // max PWM channel # to allocate (7 to only use low speed, 15 to use low & high)
|
||||
#define MAX_PWM_IOPIN 33u // hardware pwm pins < 34
|
||||
|
||||
// ------------------------
|
||||
// Types
|
||||
// ------------------------
|
||||
@@ -83,7 +89,7 @@ typedef Servo hal_servo_t;
|
||||
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0);
|
||||
void noTone(const pin_t _pin);
|
||||
|
||||
void analogWrite(pin_t pin, int value);
|
||||
void analogWrite(const pin_t pin, const uint16_t value, const uint32_t freq=PWM_FREQUENCY, const uint16_t res=8);
|
||||
|
||||
//
|
||||
// Pin Mapping for M42, M43, M226
|
||||
@@ -209,12 +215,17 @@ public:
|
||||
static uint16_t adc_value() { return adc_result; }
|
||||
|
||||
/**
|
||||
* Set the PWM duty cycle for the pin to the given value.
|
||||
* No inverting the duty cycle in this HAL.
|
||||
* No changing the maximum size of the provided value to enable finer PWM duty control in this HAL.
|
||||
* If not already allocated, allocate a hardware PWM channel
|
||||
* to the pin and set the duty cycle..
|
||||
* Optionally invert the duty cycle [default = false]
|
||||
* Optionally change the scale of the provided value to enable finer PWM duty control [default = 255]
|
||||
*/
|
||||
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) {
|
||||
analogWrite(pin, v);
|
||||
}
|
||||
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
|
||||
|
||||
/**
|
||||
* Allocate and set the frequency of a hardware PWM pin
|
||||
* Returns -1 if no pin available.
|
||||
*/
|
||||
static int8_t set_pwm_frequency(const pin_t pin, const uint32_t f_desired);
|
||||
|
||||
};
|
||||
|
||||
@@ -31,20 +31,18 @@
|
||||
// so we only allocate servo channels up high to avoid side effects with regards to analogWrite (fans, leds, laser pwm etc.)
|
||||
int Servo::channel_next_free = 12;
|
||||
|
||||
Servo::Servo() {
|
||||
channel = channel_next_free++;
|
||||
}
|
||||
Servo::Servo() {}
|
||||
|
||||
int8_t Servo::attach(const int inPin) {
|
||||
if (channel >= CHANNEL_MAX_NUM) return -1;
|
||||
if (inPin > 0) pin = inPin;
|
||||
|
||||
ledcSetup(channel, 50, 16); // channel X, 50 Hz, 16-bit depth
|
||||
ledcAttachPin(pin, channel);
|
||||
return true;
|
||||
channel = get_pwm_channel(pin, 50u, 16u);
|
||||
return channel; // -1 if no PWM avail.
|
||||
}
|
||||
|
||||
void Servo::detach() { ledcDetachPin(pin); }
|
||||
// leave channel connected to servo - set duty to zero
|
||||
void Servo::detach() {
|
||||
if (channel >= 0) ledcWrite(channel, 0);
|
||||
}
|
||||
|
||||
int Servo::read() { return degrees; }
|
||||
|
||||
@@ -52,7 +50,7 @@ void Servo::write(int inDegrees) {
|
||||
degrees = constrain(inDegrees, MIN_ANGLE, MAX_ANGLE);
|
||||
int us = map(degrees, MIN_ANGLE, MAX_ANGLE, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
|
||||
int duty = map(us, 0, TAU_USEC, 0, MAX_COMPARE);
|
||||
ledcWrite(channel, duty);
|
||||
if (channel >= 0) ledcWrite(channel, duty); // don't save duty for servos!
|
||||
}
|
||||
|
||||
void Servo::move(const int value) {
|
||||
|
||||
@@ -30,8 +30,7 @@ class Servo {
|
||||
MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo
|
||||
TAU_MSEC = 20,
|
||||
TAU_USEC = (TAU_MSEC * 1000),
|
||||
MAX_COMPARE = _BV(16) - 1, // 65535
|
||||
CHANNEL_MAX_NUM = 16;
|
||||
MAX_COMPARE = _BV(16) - 1; // 65535
|
||||
|
||||
public:
|
||||
Servo();
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
#error "EMERGENCY_PARSER is not yet implemented for ESP32. Disable EMERGENCY_PARSER to continue."
|
||||
#endif
|
||||
|
||||
#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY
|
||||
#error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on ESP32."
|
||||
#if (ENABLED(SPINDLE_LASER_USE_PWM) && SPINDLE_LASER_FREQUENCY > 78125) || (ENABLED(FAST_PWM_FAN_FREQUENCY) && FAST_PWM_FAN_FREQUENCY > 78125)
|
||||
#error "SPINDLE_LASER_FREQUENCY and FAST_PWM_FREQUENCY maximum value is 78125Hz for ESP32."
|
||||
#endif
|
||||
|
||||
#if HAS_TMC_SW_SERIAL
|
||||
@@ -40,3 +40,11 @@
|
||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||
#error "POSTMORTEM_DEBUGGING is not yet supported on ESP32."
|
||||
#endif
|
||||
|
||||
#if MB(MKS_TINYBEE) && ENABLED(FAST_PWM_FAN)
|
||||
#error "FAST_PWM_FAN is not available on TinyBee."
|
||||
#endif
|
||||
|
||||
#if USING_PULLDOWNS
|
||||
#error "PULLDOWN pin mode is not available on ESP32 boards."
|
||||
#endif
|
||||
|
||||
@@ -177,7 +177,7 @@ typedef int8_t pin_t;
|
||||
// ------------------------
|
||||
|
||||
#define CRITICAL_SECTION_START() const bool irqon = !__get_primask(); (void)__iCliRetVal()
|
||||
#define CRITICAL_SECTION_END() if (!primask) (void)__iSeiRetVal()
|
||||
#define CRITICAL_SECTION_END() if (!irqon) (void)__iSeiRetVal()
|
||||
#define cli() noInterrupts()
|
||||
#define sei() interrupts()
|
||||
|
||||
|
||||
@@ -40,3 +40,7 @@
|
||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||
#error "POSTMORTEM_DEBUGGING is not yet supported on Teensy 3.1/3.2."
|
||||
#endif
|
||||
|
||||
#if USING_PULLDOWNS
|
||||
#error "PULLDOWN pin mode is not available on Teensy 3.1/3.2 boards."
|
||||
#endif
|
||||
|
||||
@@ -40,3 +40,7 @@
|
||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||
#error "POSTMORTEM_DEBUGGING is not yet supported on Teensy 3.5/3.6."
|
||||
#endif
|
||||
|
||||
#if USING_PULLDOWNS
|
||||
#error "PULLDOWN pin mode is not available on Teensy 3.5/3.6 boards."
|
||||
#endif
|
||||
|
||||
@@ -476,7 +476,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
|
||||
#endif
|
||||
|
||||
#if HAS_FREEZE_PIN
|
||||
Stepper::frozen = !READ(FREEZE_PIN);
|
||||
stepper.frozen = READ(FREEZE_PIN) == FREEZE_STATE;
|
||||
#endif
|
||||
|
||||
#if HAS_HOME
|
||||
@@ -1166,9 +1166,13 @@ void setup() {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if HAS_FREEZE_PIN
|
||||
#if ENABLED(FREEZE_FEATURE)
|
||||
SETUP_LOG("FREEZE_PIN");
|
||||
SET_INPUT_PULLUP(FREEZE_PIN);
|
||||
#if FREEZE_STATE
|
||||
SET_INPUT_PULLDOWN(FREEZE_PIN);
|
||||
#else
|
||||
SET_INPUT_PULLUP(FREEZE_PIN);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if HAS_SUICIDE
|
||||
|
||||
@@ -364,6 +364,7 @@
|
||||
#define BOARD_ZONESTAR_ZM3E4 4061 // Zonestar ZM3E4 V1 (STM32F103VC)
|
||||
#define BOARD_ZONESTAR_ZM3E4V2 4062 // Zonestar ZM3E4 V2 (STM32F103VC)
|
||||
#define BOARD_ERYONE_ERY32_MINI 4063 // Eryone Ery32 mini (STM32F103VE)
|
||||
#define BOARD_PANDA_PI_V29 4064 // Panda Pi V2.9 - Standalone (STM32F103RC)
|
||||
|
||||
//
|
||||
// ARM Cortex-M4F
|
||||
|
||||
@@ -200,4 +200,4 @@
|
||||
#define HAS_L64XX_NOT_L6474 1
|
||||
#endif
|
||||
|
||||
#define AXIS_IS_L64XX(A) (AXIS_DRIVER_TYPE_##A(L6470) || AXIS_DRIVER_TYPE_##A(L6474) || AXIS_DRIVER_TYPE_##A(L6480) || AXIS_DRIVER_TYPE_##A(POWERSTEP01))
|
||||
#define AXIS_IS_L64XX(A) (AXIS_DRIVER_TYPE_##A(L6470) || AXIS_DRIVER_TYPE_##A(L6474) || AXIS_DRIVER_TYPE_##A(L6480) || AXIS_DRIVER_TYPE_##A(POWERSTEP01))
|
||||
|
||||
@@ -80,6 +80,9 @@ typedef const char Language_Str[];
|
||||
#endif
|
||||
#define GET_TEXT_F(MSG) FPSTR(GET_TEXT(MSG))
|
||||
|
||||
#define GET_EN_TEXT(MSG) GET_LANG(en)::MSG
|
||||
#define GET_EN_TEXT_F(MSG) FPSTR(GET_EN_TEXT(MSG))
|
||||
|
||||
#define GET_LANGUAGE_NAME(INDEX) GET_LANG(LCD_LANGUAGE_##INDEX)::LANGUAGE
|
||||
#define LANG_CHARSIZE GET_TEXT(CHARSIZE)
|
||||
#define USE_WIDE_GLYPH (LANG_CHARSIZE > 2)
|
||||
|
||||
@@ -118,6 +118,7 @@ typedef IF<(NUM_AXIS_ENUMS > 8), uint16_t, uint8_t>::type axis_bits_t;
|
||||
#define LOOP_LINEAR_AXES(VAR) LOOP_S_L_N(VAR, X_AXIS, LINEAR_AXES)
|
||||
#define LOOP_LOGICAL_AXES(VAR) LOOP_S_L_N(VAR, X_AXIS, LOGICAL_AXES)
|
||||
#define LOOP_DISTINCT_AXES(VAR) LOOP_S_L_N(VAR, X_AXIS, DISTINCT_AXES)
|
||||
#define LOOP_DISTINCT_E(VAR) LOOP_L_N(VAR, DISTINCT_E)
|
||||
|
||||
//
|
||||
// feedRate_t is just a humble float
|
||||
@@ -128,6 +129,7 @@ typedef float feedRate_t;
|
||||
// celsius_t is the native unit of temperature. Signed to handle a disconnected thermistor value (-14).
|
||||
// For more resolition (e.g., for a chocolate printer) this may later be changed to Celsius x 100
|
||||
//
|
||||
typedef uint16_t raw_adc_t;
|
||||
typedef int16_t celsius_t;
|
||||
typedef float celsius_float_t;
|
||||
|
||||
|
||||
@@ -367,13 +367,13 @@ void unified_bed_leveling::G29() {
|
||||
|
||||
case 1:
|
||||
LOOP_L_N(x, GRID_MAX_POINTS_X) { // Create a diagonal line several Mesh cells thick that is raised
|
||||
const uint8_t x2 = x + (x < (GRID_MAX_POINTS_Y) - 1 ? 1 : -1);
|
||||
z_values[x][x] += 9.999f;
|
||||
z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1] += 9.999f; // We want the altered line several mesh points thick
|
||||
z_values[x][x2] += 9.999f; // We want the altered line several mesh points thick
|
||||
#if ENABLED(EXTENSIBLE_UI)
|
||||
ExtUI::onMeshUpdate(x, x, z_values[x][x]);
|
||||
ExtUI::onMeshUpdate(x, (x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1), z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1]);
|
||||
ExtUI::onMeshUpdate(x, (x2), z_values[x][x2]);
|
||||
#endif
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1219,6 +1219,7 @@ void unified_bed_leveling::restore_ubl_active_state_and_leave() {
|
||||
}
|
||||
#endif
|
||||
set_bed_leveling_enabled(ubl_state_at_invocation);
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone());
|
||||
}
|
||||
|
||||
mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() {
|
||||
|
||||
@@ -31,9 +31,13 @@
|
||||
|
||||
// Settings for the I2C based DIGIPOT (MCP4018) based on WT150
|
||||
|
||||
#define DIGIPOT_A4988_Rsx 0.250
|
||||
#define DIGIPOT_A4988_Vrefmax 1.666
|
||||
#define DIGIPOT_MCP4018_MAX_VALUE 127
|
||||
#ifndef DIGIPOT_A4988_Rsx
|
||||
#define DIGIPOT_A4988_Rsx 0.250
|
||||
#endif
|
||||
#ifndef DIGIPOT_A4988_Vrefmax
|
||||
#define DIGIPOT_A4988_Vrefmax 1.666
|
||||
#endif
|
||||
#define DIGIPOT_MCP4018_MAX_VALUE 127
|
||||
|
||||
#define DIGIPOT_A4988_Itripmax(Vref) ((Vref) / (8.0 * DIGIPOT_A4988_Rsx))
|
||||
|
||||
|
||||
@@ -489,7 +489,7 @@ void I2CPositionEncodersMgr::init() {
|
||||
encoders[i].set_stepper_ticks(I2CPE_ENC_1_TICKS_REV);
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_1_INVERT
|
||||
encoders[i].set_inverted(I2CPE_ENC_1_INVERT);
|
||||
encoders[i].set_inverted(ENABLED(I2CPE_ENC_1_INVERT));
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_1_EC_METHOD
|
||||
encoders[i].set_ec_method(I2CPE_ENC_1_EC_METHOD);
|
||||
@@ -518,7 +518,7 @@ void I2CPositionEncodersMgr::init() {
|
||||
encoders[i].set_stepper_ticks(I2CPE_ENC_2_TICKS_REV);
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_2_INVERT
|
||||
encoders[i].set_inverted(I2CPE_ENC_2_INVERT);
|
||||
encoders[i].set_inverted(ENABLED(I2CPE_ENC_2_INVERT));
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_2_EC_METHOD
|
||||
encoders[i].set_ec_method(I2CPE_ENC_2_EC_METHOD);
|
||||
@@ -547,7 +547,7 @@ void I2CPositionEncodersMgr::init() {
|
||||
encoders[i].set_stepper_ticks(I2CPE_ENC_3_TICKS_REV);
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_3_INVERT
|
||||
encoders[i].set_inverted(I2CPE_ENC_3_INVERT);
|
||||
encoders[i].set_inverted(ENABLED(I2CPE_ENC_3_INVERT));
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_3_EC_METHOD
|
||||
encoders[i].set_ec_method(I2CPE_ENC_3_EC_METHOD);
|
||||
@@ -576,7 +576,7 @@ void I2CPositionEncodersMgr::init() {
|
||||
encoders[i].set_stepper_ticks(I2CPE_ENC_4_TICKS_REV);
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_4_INVERT
|
||||
encoders[i].set_inverted(I2CPE_ENC_4_INVERT);
|
||||
encoders[i].set_inverted(ENABLED(I2CPE_ENC_4_INVERT));
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_4_EC_METHOD
|
||||
encoders[i].set_ec_method(I2CPE_ENC_4_EC_METHOD);
|
||||
@@ -605,7 +605,7 @@ void I2CPositionEncodersMgr::init() {
|
||||
encoders[i].set_stepper_ticks(I2CPE_ENC_5_TICKS_REV);
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_5_INVERT
|
||||
encoders[i].set_inverted(I2CPE_ENC_5_INVERT);
|
||||
encoders[i].set_inverted(ENABLED(I2CPE_ENC_5_INVERT));
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_5_EC_METHOD
|
||||
encoders[i].set_ec_method(I2CPE_ENC_5_EC_METHOD);
|
||||
@@ -634,7 +634,7 @@ void I2CPositionEncodersMgr::init() {
|
||||
encoders[i].set_stepper_ticks(I2CPE_ENC_6_TICKS_REV);
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_6_INVERT
|
||||
encoders[i].set_inverted(I2CPE_ENC_6_INVERT);
|
||||
encoders[i].set_inverted(ENABLED(I2CPE_ENC_6_INVERT));
|
||||
#endif
|
||||
#ifdef I2CPE_ENC_6_EC_METHOD
|
||||
encoders[i].set_ec_method(I2CPE_ENC_6_EC_METHOD);
|
||||
|
||||
@@ -73,10 +73,10 @@ void FWRetract::reset() {
|
||||
settings.swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP;
|
||||
current_hop = 0.0;
|
||||
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
retracted[i] = false;
|
||||
E_TERN_(retracted_swap[i] = false);
|
||||
current_retract[i] = 0.0;
|
||||
EXTRUDER_LOOP() {
|
||||
retracted[e] = false;
|
||||
E_TERN_(retracted_swap[e] = false);
|
||||
current_retract[e] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,10 +111,10 @@ void FWRetract::retract(const bool retracting E_OPTARG(bool swapping/*=false*/))
|
||||
" swapping ", swapping,
|
||||
" active extruder ", active_extruder
|
||||
);
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
SERIAL_ECHOLNPGM("retracted[", i, "] ", AS_DIGIT(retracted[i]));
|
||||
EXTRUDER_LOOP() {
|
||||
SERIAL_ECHOLNPGM("retracted[", e, "] ", AS_DIGIT(retracted[e]));
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
SERIAL_ECHOLNPGM("retracted_swap[", i, "] ", AS_DIGIT(retracted_swap[i]));
|
||||
SERIAL_ECHOLNPGM("retracted_swap[", e, "] ", AS_DIGIT(retracted_swap[e]));
|
||||
#endif
|
||||
}
|
||||
SERIAL_ECHOLNPGM("current_position.z ", current_position.z);
|
||||
@@ -184,10 +184,10 @@ void FWRetract::retract(const bool retracting E_OPTARG(bool swapping/*=false*/))
|
||||
SERIAL_ECHOLNPGM("retracting ", AS_DIGIT(retracting));
|
||||
SERIAL_ECHOLNPGM("swapping ", AS_DIGIT(swapping));
|
||||
SERIAL_ECHOLNPGM("active_extruder ", active_extruder);
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
SERIAL_ECHOLNPGM("retracted[", i, "] ", AS_DIGIT(retracted[i]));
|
||||
EXTRUDER_LOOP() {
|
||||
SERIAL_ECHOLNPGM("retracted[", e, "] ", AS_DIGIT(retracted[e]));
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
SERIAL_ECHOLNPGM("retracted_swap[", i, "] ", AS_DIGIT(retracted_swap[i]));
|
||||
SERIAL_ECHOLNPGM("retracted_swap[", e, "] ", AS_DIGIT(retracted_swap[e]));
|
||||
#endif
|
||||
}
|
||||
SERIAL_ECHOLNPGM("current_position.z ", current_position.z);
|
||||
|
||||
@@ -64,7 +64,7 @@ public:
|
||||
static void reset();
|
||||
|
||||
static void refresh_autoretract() {
|
||||
LOOP_L_N(i, EXTRUDERS) retracted[i] = false;
|
||||
EXTRUDER_LOOP() retracted[e] = false;
|
||||
}
|
||||
|
||||
static void enable_autoretract(const bool enable) {
|
||||
|
||||
@@ -68,13 +68,13 @@ Joystick joystick;
|
||||
void Joystick::report() {
|
||||
SERIAL_ECHOPGM("Joystick");
|
||||
#if HAS_JOY_ADC_X
|
||||
SERIAL_ECHOPGM_P(SP_X_STR, JOY_X(x.raw));
|
||||
SERIAL_ECHOPGM_P(SP_X_STR, JOY_X(x.getraw()));
|
||||
#endif
|
||||
#if HAS_JOY_ADC_Y
|
||||
SERIAL_ECHOPGM_P(SP_Y_STR, JOY_Y(y.raw));
|
||||
SERIAL_ECHOPGM_P(SP_Y_STR, JOY_Y(y.getraw()));
|
||||
#endif
|
||||
#if HAS_JOY_ADC_Z
|
||||
SERIAL_ECHOPGM_P(SP_Z_STR, JOY_Z(z.raw));
|
||||
SERIAL_ECHOPGM_P(SP_Z_STR, JOY_Z(z.getraw()));
|
||||
#endif
|
||||
#if HAS_JOY_ADC_EN
|
||||
SERIAL_ECHO_TERNARY(READ(JOY_EN_PIN), " EN=", "HIGH (dis", "LOW (en", "abled)");
|
||||
@@ -91,29 +91,29 @@ Joystick joystick;
|
||||
if (READ(JOY_EN_PIN)) return;
|
||||
#endif
|
||||
|
||||
auto _normalize_joy = [](float &axis_jog, const int16_t raw, const int16_t (&joy_limits)[4]) {
|
||||
auto _normalize_joy = [](float &axis_jog, const raw_adc_t raw, const raw_adc_t (&joy_limits)[4]) {
|
||||
if (WITHIN(raw, joy_limits[0], joy_limits[3])) {
|
||||
// within limits, check deadzone
|
||||
if (raw > joy_limits[2])
|
||||
axis_jog = (raw - joy_limits[2]) / float(joy_limits[3] - joy_limits[2]);
|
||||
else if (raw < joy_limits[1])
|
||||
axis_jog = (raw - joy_limits[1]) / float(joy_limits[1] - joy_limits[0]); // negative value
|
||||
axis_jog = int16_t(raw - joy_limits[1]) / float(joy_limits[1] - joy_limits[0]); // negative value
|
||||
// Map normal to jog value via quadratic relationship
|
||||
axis_jog = SIGN(axis_jog) * sq(axis_jog);
|
||||
}
|
||||
};
|
||||
|
||||
#if HAS_JOY_ADC_X
|
||||
static constexpr int16_t joy_x_limits[4] = JOY_X_LIMITS;
|
||||
_normalize_joy(norm_jog.x, JOY_X(x.raw), joy_x_limits);
|
||||
static constexpr raw_adc_t joy_x_limits[4] = JOY_X_LIMITS;
|
||||
_normalize_joy(norm_jog.x, JOY_X(x.getraw()), joy_x_limits);
|
||||
#endif
|
||||
#if HAS_JOY_ADC_Y
|
||||
static constexpr int16_t joy_y_limits[4] = JOY_Y_LIMITS;
|
||||
_normalize_joy(norm_jog.y, JOY_Y(y.raw), joy_y_limits);
|
||||
static constexpr raw_adc_t joy_y_limits[4] = JOY_Y_LIMITS;
|
||||
_normalize_joy(norm_jog.y, JOY_Y(y.getraw()), joy_y_limits);
|
||||
#endif
|
||||
#if HAS_JOY_ADC_Z
|
||||
static constexpr int16_t joy_z_limits[4] = JOY_Z_LIMITS;
|
||||
_normalize_joy(norm_jog.z, JOY_Z(z.raw), joy_z_limits);
|
||||
static constexpr raw_adc_t joy_z_limits[4] = JOY_Z_LIMITS;
|
||||
_normalize_joy(norm_jog.z, JOY_Z(z.getraw()), joy_z_limits);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -44,14 +44,14 @@ Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIX
|
||||
|
||||
#ifdef NEOPIXEL_BKGD_INDEX_FIRST
|
||||
|
||||
void Marlin_NeoPixel::set_background_color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) {
|
||||
for (int background_led = NEOPIXEL_BKGD_INDEX_FIRST; background_led <= NEOPIXEL_BKGD_INDEX_LAST; background_led++)
|
||||
void Marlin_NeoPixel::set_background_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w) {
|
||||
for (int background_led = NEOPIXEL_BKGD_INDEX_FIRST; background_led <= NEOPIXEL_BKGD_INDEX_LAST; background_led++)
|
||||
set_pixel_color(background_led, adaneo1.Color(r, g, b, w));
|
||||
}
|
||||
|
||||
void Marlin_NeoPixel::reset_background_color() {
|
||||
constexpr uint8_t background_color[4] = NEOPIXEL_BKGD_COLOR;
|
||||
set_background_color(background_color[0], background_color[1], background_color[2], background_color[3]);
|
||||
set_background_color(background_color);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -108,7 +108,7 @@ void Marlin_NeoPixel::init() {
|
||||
set_color(adaneo1.Color
|
||||
TERN(LED_USER_PRESET_STARTUP,
|
||||
(LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, LED_USER_PRESET_WHITE),
|
||||
(0, 0, 0, 0))
|
||||
(255, 255, 255, 255))
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -88,7 +88,8 @@ public:
|
||||
static void set_color(const uint32_t c);
|
||||
|
||||
#ifdef NEOPIXEL_BKGD_INDEX_FIRST
|
||||
static void set_background_color(uint8_t r, uint8_t g, uint8_t b, uint8_t w);
|
||||
static void set_background_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w);
|
||||
static void set_background_color(const uint8_t (&rgbw)[4]) { set_background_color(rgbw[0], rgbw[1], rgbw[2], rgbw[3]); }
|
||||
static void reset_background_color();
|
||||
#endif
|
||||
|
||||
|
||||
@@ -143,6 +143,11 @@ uint8_t MMU2::get_current_tool() {
|
||||
#define FILAMENT_PRESENT() (READ(FIL_RUNOUT1_PIN) != runout.out_state())
|
||||
#endif
|
||||
|
||||
void mmu2_attn_buzz(const bool two=false) {
|
||||
BUZZ(200, 404);
|
||||
if (two) { BUZZ(10, 0); BUZZ(200, 404); }
|
||||
}
|
||||
|
||||
void MMU2::mmu_loop() {
|
||||
|
||||
switch (state) {
|
||||
@@ -525,7 +530,7 @@ static void mmu2_not_responding() {
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100);
|
||||
load_filament_to_nozzle(index);
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
ERR_BUZZ();
|
||||
#endif
|
||||
} break;
|
||||
|
||||
@@ -544,7 +549,7 @@ static void mmu2_not_responding() {
|
||||
active_extruder = 0;
|
||||
}
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
ERR_BUZZ();
|
||||
#endif
|
||||
} break;
|
||||
|
||||
@@ -613,7 +618,7 @@ static void mmu2_not_responding() {
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100);
|
||||
load_filament_to_nozzle(index);
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
ERR_BUZZ();
|
||||
#endif
|
||||
} break;
|
||||
|
||||
@@ -633,7 +638,7 @@ static void mmu2_not_responding() {
|
||||
extruder = index;
|
||||
active_extruder = 0;
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
ERR_BUZZ();
|
||||
#endif
|
||||
} break;
|
||||
|
||||
@@ -707,7 +712,7 @@ static void mmu2_not_responding() {
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100);
|
||||
load_filament_to_nozzle(index);
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
ERR_BUZZ();
|
||||
#endif
|
||||
} break;
|
||||
|
||||
@@ -726,7 +731,7 @@ static void mmu2_not_responding() {
|
||||
extruder = index;
|
||||
active_extruder = 0;
|
||||
#else
|
||||
BUZZ(400, 40);
|
||||
ERR_BUZZ();
|
||||
#endif
|
||||
} break;
|
||||
|
||||
@@ -811,25 +816,26 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) {
|
||||
if (turn_off_nozzle && resume_hotend_temp) {
|
||||
thermalManager.setTargetHotend(resume_hotend_temp, active_extruder);
|
||||
LCD_MESSAGE(MSG_HEATING);
|
||||
BUZZ(200, 40);
|
||||
ERR_BUZZ();
|
||||
|
||||
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(1000);
|
||||
}
|
||||
|
||||
if (move_axes && all_axes_homed()) {
|
||||
LCD_MESSAGE(MSG_MMU2_RESUMING);
|
||||
BUZZ(198, 404); BUZZ(4, 0); BUZZ(198, 404);
|
||||
LCD_MESSAGE(MSG_MMU2_RESUMING);
|
||||
mmu2_attn_buzz(true);
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
|
||||
|
||||
if (move_axes && all_axes_homed()) {
|
||||
// Move XY to starting position, then Z
|
||||
do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE));
|
||||
|
||||
// Move Z_AXIS to saved position
|
||||
do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
|
||||
}
|
||||
else {
|
||||
BUZZ(198, 404); BUZZ(4, 0); BUZZ(198, 404);
|
||||
LCD_MESSAGE(MSG_MMU2_RESUMING);
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic pop
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -898,7 +904,7 @@ void MMU2::load_filament(const uint8_t index) {
|
||||
|
||||
command(MMU_CMD_L0 + index);
|
||||
manage_response(false, false);
|
||||
BUZZ(200, 404);
|
||||
mmu2_attn_buzz();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -909,7 +915,7 @@ bool MMU2::load_filament_to_nozzle(const uint8_t index) {
|
||||
if (!_enabled) return false;
|
||||
|
||||
if (thermalManager.tooColdToExtrude(active_extruder)) {
|
||||
BUZZ(200, 404);
|
||||
mmu2_attn_buzz();
|
||||
LCD_ALERTMESSAGE(MSG_HOTEND_TOO_COLD);
|
||||
return false;
|
||||
}
|
||||
@@ -924,7 +930,7 @@ bool MMU2::load_filament_to_nozzle(const uint8_t index) {
|
||||
extruder = index;
|
||||
active_extruder = 0;
|
||||
load_to_nozzle();
|
||||
BUZZ(200, 404);
|
||||
mmu2_attn_buzz();
|
||||
}
|
||||
return success;
|
||||
}
|
||||
@@ -945,7 +951,7 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) {
|
||||
if (!_enabled) return false;
|
||||
|
||||
if (thermalManager.tooColdToExtrude(active_extruder)) {
|
||||
BUZZ(200, 404);
|
||||
mmu2_attn_buzz();
|
||||
LCD_ALERTMESSAGE(MSG_HOTEND_TOO_COLD);
|
||||
return false;
|
||||
}
|
||||
@@ -961,12 +967,11 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) {
|
||||
|
||||
if (recover) {
|
||||
LCD_MESSAGE(MSG_MMU2_EJECT_RECOVER);
|
||||
BUZZ(200, 404);
|
||||
mmu2_attn_buzz();
|
||||
TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_do(PROMPT_USER_CONTINUE, F("MMU2 Eject Recover"), FPSTR(CONTINUE_STR)));
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(F("MMU2 Eject Recover")));
|
||||
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response());
|
||||
BUZZ(200, 404);
|
||||
BUZZ(200, 404);
|
||||
mmu2_attn_buzz(true);
|
||||
|
||||
command(MMU_CMD_R0);
|
||||
manage_response(false, false);
|
||||
@@ -979,7 +984,7 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) {
|
||||
|
||||
set_runout_valid(false);
|
||||
|
||||
BUZZ(200, 404);
|
||||
mmu2_attn_buzz();
|
||||
|
||||
stepper.disable_extruder();
|
||||
|
||||
@@ -994,7 +999,7 @@ bool MMU2::unload() {
|
||||
if (!_enabled) return false;
|
||||
|
||||
if (thermalManager.tooColdToExtrude(active_extruder)) {
|
||||
BUZZ(200, 404);
|
||||
mmu2_attn_buzz();
|
||||
LCD_ALERTMESSAGE(MSG_HOTEND_TOO_COLD);
|
||||
return false;
|
||||
}
|
||||
@@ -1005,7 +1010,7 @@ bool MMU2::unload() {
|
||||
command(MMU_CMD_U0);
|
||||
manage_response(false, true);
|
||||
|
||||
BUZZ(200, 404);
|
||||
mmu2_attn_buzz();
|
||||
|
||||
// no active tool
|
||||
extruder = MMU2_NO_TOOL;
|
||||
|
||||
@@ -196,7 +196,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=POW
|
||||
#if DISABLED(NO_VOLUMETRICS)
|
||||
info.flag.volumetric_enabled = parser.volumetric_enabled;
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
for (int8_t e = 0; e < EXTRUDERS; e++) info.filament_size[e] = planner.filament_size[e];
|
||||
EXTRUDER_LOOP() info.filament_size[e] = planner.filament_size[e];
|
||||
#else
|
||||
if (parser.volumetric_enabled) info.filament_size[0] = planner.filament_size[active_extruder];
|
||||
#endif
|
||||
@@ -461,7 +461,7 @@ void PrintJobRecovery::resume() {
|
||||
// Recover volumetric extrusion state
|
||||
#if DISABLED(NO_VOLUMETRICS)
|
||||
#if HAS_MULTI_EXTRUDER
|
||||
for (int8_t e = 0; e < EXTRUDERS; e++) {
|
||||
EXTRUDER_LOOP() {
|
||||
sprintf_P(cmd, PSTR("M200T%iD%s"), e, dtostrf(info.filament_size[e], 1, 3, str_1));
|
||||
gcode.process_subcommands_now(cmd);
|
||||
}
|
||||
@@ -511,7 +511,7 @@ void PrintJobRecovery::resume() {
|
||||
|
||||
// Restore retract and hop state from an active `G10` command
|
||||
#if ENABLED(FWRETRACT)
|
||||
LOOP_L_N(e, EXTRUDERS) {
|
||||
EXTRUDER_LOOP() {
|
||||
if (info.retract[e] != 0.0) {
|
||||
fwretract.current_retract[e] = info.retract[e];
|
||||
fwretract.retracted[e] = true;
|
||||
@@ -634,7 +634,7 @@ void PrintJobRecovery::resume() {
|
||||
|
||||
#if DISABLED(NO_VOLUMETRICS)
|
||||
DEBUG_ECHOPGM("filament_size:");
|
||||
LOOP_L_N(i, EXTRUDERS) DEBUG_ECHOLNPGM(" ", info.filament_size[i]);
|
||||
EXTRUDER_LOOP() DEBUG_ECHOLNPGM(" ", info.filament_size[e]);
|
||||
DEBUG_EOL();
|
||||
#endif
|
||||
|
||||
@@ -666,7 +666,7 @@ void PrintJobRecovery::resume() {
|
||||
|
||||
#if ENABLED(FWRETRACT)
|
||||
DEBUG_ECHOPGM("retract: ");
|
||||
for (int8_t e = 0; e < EXTRUDERS; e++) {
|
||||
EXTRUDER_LOOP() {
|
||||
DEBUG_ECHO(info.retract[e]);
|
||||
if (e < EXTRUDERS - 1) DEBUG_CHAR(',');
|
||||
}
|
||||
|
||||
@@ -63,9 +63,13 @@ extern FilamentMonitor runout;
|
||||
|
||||
enum RunoutMode : uint8_t {
|
||||
RM_NONE,
|
||||
RM_ACTIVE_LOW,
|
||||
RM_ACTIVE_HIGH,
|
||||
RM_MOTION_SENSOR = 7
|
||||
RM_OUT_ON_LOW,
|
||||
RM_OUT_ON_HIGH,
|
||||
RM_RESERVED3,
|
||||
RM_RESERVED4,
|
||||
RM_RESERVED5,
|
||||
RM_RESERVED6,
|
||||
RM_MOTION_SENSOR
|
||||
};
|
||||
|
||||
class FilamentMonitorBase {
|
||||
@@ -73,7 +77,7 @@ class FilamentMonitorBase {
|
||||
static bool enabled[NUM_RUNOUT_SENSORS], filament_ran_out;
|
||||
static RunoutMode mode[NUM_RUNOUT_SENSORS];
|
||||
|
||||
static uint8_t out_state(const uint8_t e=0) { return mode[e] == RM_ACTIVE_HIGH ? HIGH : LOW; }
|
||||
static uint8_t out_state(const uint8_t e=0) { return mode[e] == RM_OUT_ON_HIGH ? HIGH : LOW; }
|
||||
|
||||
#if ENABLED(HOST_ACTION_COMMANDS)
|
||||
static bool host_handling;
|
||||
|
||||
@@ -27,31 +27,25 @@
|
||||
#include "solenoid.h"
|
||||
|
||||
#include "../module/motion.h" // for active_extruder
|
||||
|
||||
// PARKING_EXTRUDER options alter the default behavior of solenoids, this ensures compliance of M380-381
|
||||
|
||||
#if ENABLED(PARKING_EXTRUDER)
|
||||
#include "../module/tool_change.h"
|
||||
#endif
|
||||
#include "../module/tool_change.h"
|
||||
|
||||
// Used primarily with MANUAL_SOLENOID_CONTROL
|
||||
static void set_solenoid(const uint8_t num, const bool active) {
|
||||
const uint8_t value = active ? PE_MAGNET_ON_STATE : !PE_MAGNET_ON_STATE;
|
||||
#define _SOL_CASE(N) case N: TERN_(HAS_SOLENOID_##N, OUT_WRITE(SOL##N##_PIN, value)); break;
|
||||
static void set_solenoid(const uint8_t num, const uint8_t state) {
|
||||
#define _SOL_CASE(N) case N: TERN_(HAS_SOLENOID_##N, OUT_WRITE(SOL##N##_PIN, state)); break;
|
||||
switch (num) {
|
||||
REPEAT(8, _SOL_CASE)
|
||||
default: SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); break;
|
||||
}
|
||||
|
||||
#if ENABLED(PARKING_EXTRUDER)
|
||||
if (!active && active_extruder == num) // If active extruder's solenoid is disabled, carriage is considered parked
|
||||
if (state == LOW && active_extruder == num) // If active extruder's solenoid is disabled, carriage is considered parked
|
||||
parking_extruder_set_parked(true);
|
||||
#endif
|
||||
}
|
||||
|
||||
void enable_solenoid(const uint8_t num) { set_solenoid(num, true); }
|
||||
void disable_solenoid(const uint8_t num) { set_solenoid(num, false); }
|
||||
void enable_solenoid_on_active_extruder() { }
|
||||
// PARKING_EXTRUDER options alter the default behavior of solenoids to ensure compliance of M380-381
|
||||
void enable_solenoid(const uint8_t num) { set_solenoid(num, TERN1(PARKING_EXTRUDER, PE_MAGNET_ON_STATE)); }
|
||||
void disable_solenoid(const uint8_t num) { set_solenoid(num, TERN0(PARKING_EXTRUDER, !PE_MAGNET_ON_STATE)); }
|
||||
|
||||
void disable_all_solenoids() {
|
||||
#define _SOL_DISABLE(N) TERN_(HAS_SOLENOID_##N, disable_solenoid(N));
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
void enable_solenoid_on_active_extruder();
|
||||
void disable_all_solenoids();
|
||||
void enable_solenoid(const uint8_t num);
|
||||
void disable_solenoid(const uint8_t num);
|
||||
|
||||
@@ -419,12 +419,13 @@ G29_TYPE GcodeSuite::G29() {
|
||||
|
||||
planner.synchronize();
|
||||
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingStart());
|
||||
|
||||
#if ENABLED(AUTO_BED_LEVELING_3POINT)
|
||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> 3-point Leveling");
|
||||
points[0].z = points[1].z = points[2].z = 0; // Probe at 3 arbitrary points
|
||||
#elif ENABLED(AUTO_BED_LEVELING_BILINEAR)
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onMeshLevelingStart());
|
||||
TERN_(DWIN_LCD_PROUI, DWIN_MeshLevelingStart());
|
||||
TERN_(DWIN_CREALITY_LCD_ENHANCED, DWIN_LevelingStart());
|
||||
#endif
|
||||
|
||||
if (!faux) {
|
||||
@@ -577,6 +578,7 @@ G29_TYPE GcodeSuite::G29() {
|
||||
SERIAL_ECHOLNPGM("Grid probing done.");
|
||||
// Re-enable software endstops, if needed
|
||||
SET_SOFT_ENDSTOP_LOOSE(false);
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone());
|
||||
}
|
||||
|
||||
#elif ENABLED(AUTO_BED_LEVELING_3POINT)
|
||||
@@ -606,6 +608,8 @@ G29_TYPE GcodeSuite::G29() {
|
||||
abl.reenable = false;
|
||||
}
|
||||
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone());
|
||||
|
||||
}
|
||||
|
||||
#endif // AUTO_BED_LEVELING_3POINT
|
||||
@@ -899,7 +903,7 @@ G29_TYPE GcodeSuite::G29() {
|
||||
process_subcommands_now(F(Z_PROBE_END_SCRIPT));
|
||||
#endif
|
||||
|
||||
TERN_(HAS_DWIN_E3V2_BASIC, DWIN_CompletedLeveling());
|
||||
TERN_(HAS_DWIN_E3V2_BASIC, DWIN_LevelingDone());
|
||||
|
||||
TERN_(HAS_MULTI_HOTEND, if (abl.tool_index != 0) tool_change(abl.tool_index));
|
||||
|
||||
|
||||
@@ -104,8 +104,8 @@ void GcodeSuite::G29() {
|
||||
mbl_probe_index = 0;
|
||||
if (!ui.wait_for_move) {
|
||||
queue.inject(parser.seen_test('N') ? F("G28" TERN(CAN_SET_LEVELING_AFTER_G28, "L0", "") "\nG29S2") : F("G29S2"));
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onMeshLevelingStart());
|
||||
TERN_(DWIN_LCD_PROUI, DWIN_MeshLevelingStart());
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingStart());
|
||||
TERN_(DWIN_LCD_PROUI, DWIN_LevelingStart());
|
||||
return;
|
||||
}
|
||||
state = MeshNext;
|
||||
@@ -118,9 +118,11 @@ void GcodeSuite::G29() {
|
||||
// For each G29 S2...
|
||||
if (mbl_probe_index == 0) {
|
||||
// Move close to the bed before the first point
|
||||
do_blocking_move_to_z(0.4f
|
||||
do_blocking_move_to_z(
|
||||
#ifdef MANUAL_PROBE_START_Z
|
||||
+ (MANUAL_PROBE_START_Z) - 0.4f
|
||||
MANUAL_PROBE_START_Z
|
||||
#else
|
||||
0.4f
|
||||
#endif
|
||||
);
|
||||
}
|
||||
@@ -155,8 +157,7 @@ void GcodeSuite::G29() {
|
||||
mbl_probe_index = -1;
|
||||
SERIAL_ECHOLNPGM("Mesh probing done.");
|
||||
TERN_(HAS_STATUS_MESSAGE, LCD_MESSAGE(MSG_MESH_DONE));
|
||||
BUZZ(100, 659);
|
||||
BUZZ(100, 698);
|
||||
OKAY_BUZZ();
|
||||
|
||||
home_all_axes();
|
||||
set_bed_leveling_enabled(true);
|
||||
@@ -168,6 +169,7 @@ void GcodeSuite::G29() {
|
||||
#endif
|
||||
|
||||
TERN_(LCD_BED_LEVELING, ui.wait_for_move = false);
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone());
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -82,15 +82,13 @@
|
||||
|
||||
#if ENABLED(SENSORLESS_HOMING)
|
||||
sensorless_t stealth_states {
|
||||
LINEAR_AXIS_LIST(tmc_enable_stallguard(stepperX), tmc_enable_stallguard(stepperY), false, false, false, false)
|
||||
, false
|
||||
#if AXIS_HAS_STALLGUARD(X2)
|
||||
|| tmc_enable_stallguard(stepperX2)
|
||||
#endif
|
||||
, false
|
||||
#if AXIS_HAS_STALLGUARD(Y2)
|
||||
|| tmc_enable_stallguard(stepperY2)
|
||||
#endif
|
||||
LINEAR_AXIS_LIST(
|
||||
TERN0(X_SENSORLESS, tmc_enable_stallguard(stepperX)),
|
||||
TERN0(Y_SENSORLESS, tmc_enable_stallguard(stepperY)),
|
||||
false, false, false, false
|
||||
)
|
||||
, TERN0(X2_SENSORLESS, tmc_enable_stallguard(stepperX2))
|
||||
, TERN0(Y2_SENSORLESS, tmc_enable_stallguard(stepperY2))
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -101,14 +99,10 @@
|
||||
current_position.set(0.0, 0.0);
|
||||
|
||||
#if ENABLED(SENSORLESS_HOMING) && DISABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)
|
||||
tmc_disable_stallguard(stepperX, stealth_states.x);
|
||||
tmc_disable_stallguard(stepperY, stealth_states.y);
|
||||
#if AXIS_HAS_STALLGUARD(X2)
|
||||
tmc_disable_stallguard(stepperX2, stealth_states.x2);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(Y2)
|
||||
tmc_disable_stallguard(stepperY2, stealth_states.y2);
|
||||
#endif
|
||||
TERN_(X_SENSORLESS, tmc_disable_stallguard(stepperX, stealth_states.x));
|
||||
TERN_(X2_SENSORLESS, tmc_disable_stallguard(stepperX2, stealth_states.x2));
|
||||
TERN_(Y_SENSORLESS, tmc_disable_stallguard(stepperY, stealth_states.y));
|
||||
TERN_(Y2_SENSORLESS, tmc_disable_stallguard(stepperY2, stealth_states.y2));
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -239,7 +233,7 @@ void GcodeSuite::G28() {
|
||||
set_and_report_grblstate(M_HOMING);
|
||||
#endif
|
||||
|
||||
TERN_(HAS_DWIN_E3V2_BASIC, DWIN_StartHoming());
|
||||
TERN_(HAS_DWIN_E3V2_BASIC, DWIN_HomingStart());
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onHomingStart());
|
||||
|
||||
planner.synchronize(); // Wait for planner moves to finish!
|
||||
@@ -552,8 +546,8 @@ void GcodeSuite::G28() {
|
||||
|
||||
ui.refresh();
|
||||
|
||||
TERN_(HAS_DWIN_E3V2_BASIC, DWIN_CompletedHoming());
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onHomingComplete());
|
||||
TERN_(HAS_DWIN_E3V2_BASIC, DWIN_HomingDone());
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onHomingDone());
|
||||
|
||||
report_current_position();
|
||||
|
||||
|
||||
@@ -93,12 +93,12 @@
|
||||
}
|
||||
#else
|
||||
SERIAL_ECHOLNPGM(" M200 S", parser.volumetric_enabled);
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
EXTRUDER_LOOP() {
|
||||
report_echo_start(forReplay);
|
||||
SERIAL_ECHOLNPGM(
|
||||
" M200 T", i, " D", LINEAR_UNIT(planner.filament_size[i])
|
||||
" M200 T", e, " D", LINEAR_UNIT(planner.filament_size[e])
|
||||
#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT)
|
||||
, " L", LINEAR_UNIT(planner.volumetric_extruder_limit[i])
|
||||
, " L", LINEAR_UNIT(planner.volumetric_extruder_limit[e])
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ void do_enable(const axis_flags_t to_enable) {
|
||||
}
|
||||
}
|
||||
#if HAS_EXTRUDERS
|
||||
LOOP_L_N(e, EXTRUDERS) {
|
||||
EXTRUDER_LOOP() {
|
||||
const uint8_t a = INDEX_OF_AXIS(E_AXIS, e);
|
||||
if (TEST(shall_enable, a)) {
|
||||
stepper.ENABLE_EXTRUDER(e);
|
||||
@@ -161,7 +161,7 @@ void try_to_disable(const axis_flags_t to_disable) {
|
||||
DEBUG_ECHOLNPGM(" ... still_enabled=", hex_word(still_enabled));
|
||||
}
|
||||
#if HAS_EXTRUDERS
|
||||
LOOP_L_N(e, EXTRUDERS) {
|
||||
EXTRUDER_LOOP() {
|
||||
const uint8_t a = INDEX_OF_AXIS(E_AXIS, e);
|
||||
if (TEST(to_disable.bits, a)) {
|
||||
DEBUG_ECHOPGM("Try to disable E", AS_DIGIT(e), " (", a, ") with overlap ", hex_word(enable_overlap[a]), " ... ");
|
||||
@@ -194,7 +194,7 @@ void try_to_disable(const axis_flags_t to_disable) {
|
||||
}
|
||||
}
|
||||
#if HAS_EXTRUDERS
|
||||
LOOP_L_N(e, EXTRUDERS) {
|
||||
EXTRUDER_LOOP() {
|
||||
const uint8_t a = INDEX_OF_AXIS(E_AXIS, e);
|
||||
if (TEST(still_enabled, a)) {
|
||||
SERIAL_CHAR('E', '0' + e);
|
||||
|
||||
@@ -37,7 +37,7 @@ void GcodeSuite::M380() {
|
||||
#if ENABLED(MANUAL_SOLENOID_CONTROL)
|
||||
enable_solenoid(parser.intval('S', active_extruder));
|
||||
#else
|
||||
enable_solenoid_on_active_extruder();
|
||||
enable_solenoid(active_extruder);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -117,10 +117,10 @@ void GcodeSuite::M900() {
|
||||
#if EXTRUDERS < 2
|
||||
SERIAL_ECHOLNPGM("Advance S", new_slot, " K", kref, "(S", !new_slot, " K", lref, ")");
|
||||
#else
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
const bool slot = TEST(lin_adv_slot, i);
|
||||
SERIAL_ECHOLNPGM("Advance T", i, " S", slot, " K", planner.extruder_advance_K[i],
|
||||
"(S", !slot, " K", other_extruder_advance_K[i], ")");
|
||||
EXTRUDER_LOOP() {
|
||||
const bool slot = TEST(lin_adv_slot, e);
|
||||
SERIAL_ECHOLNPGM("Advance T", e, " S", slot, " K", planner.extruder_advance_K[e],
|
||||
"(S", !slot, " K", other_extruder_advance_K[e], ")");
|
||||
SERIAL_EOL();
|
||||
}
|
||||
#endif
|
||||
@@ -132,9 +132,9 @@ void GcodeSuite::M900() {
|
||||
SERIAL_ECHOLNPGM("Advance K=", planner.extruder_advance_K[0]);
|
||||
#else
|
||||
SERIAL_ECHOPGM("Advance K");
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
SERIAL_CHAR(' ', '0' + i, ':');
|
||||
SERIAL_DECIMAL(planner.extruder_advance_K[i]);
|
||||
EXTRUDER_LOOP() {
|
||||
SERIAL_CHAR(' ', '0' + e, ':');
|
||||
SERIAL_DECIMAL(planner.extruder_advance_K[e]);
|
||||
}
|
||||
SERIAL_EOL();
|
||||
#endif
|
||||
@@ -150,9 +150,9 @@ void GcodeSuite::M900_report(const bool forReplay/*=true*/) {
|
||||
report_echo_start(forReplay);
|
||||
SERIAL_ECHOLNPGM(" M900 K", planner.extruder_advance_K[0]);
|
||||
#else
|
||||
LOOP_L_N(i, EXTRUDERS) {
|
||||
EXTRUDER_LOOP() {
|
||||
report_echo_start(forReplay);
|
||||
SERIAL_ECHOLNPGM(" M900 T", i, " K", planner.extruder_advance_K[i]);
|
||||
SERIAL_ECHOLNPGM(" M900 T", e, " K", planner.extruder_advance_K[e]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -46,7 +46,8 @@
|
||||
*/
|
||||
void GcodeSuite::G12() {
|
||||
// Don't allow nozzle cleaning without homing first
|
||||
if (homing_needed_error()) return;
|
||||
if (homing_needed_error(linear_bits & ~TERN0(NOZZLE_CLEAN_NO_Z, Z_AXIS) & ~TERN0(NOZZLE_CLEAN_NO_Y, Y_AXIS)))
|
||||
return;
|
||||
|
||||
#ifdef WIPE_SEQUENCE_COMMANDS
|
||||
if (!parser.seen_any()) {
|
||||
|
||||
@@ -72,7 +72,7 @@ void GcodeSuite::M603_report(const bool forReplay/*=true*/) {
|
||||
SERIAL_ECHOPGM(" M603 L", LINEAR_UNIT(fc_settings[0].load_length), " U", LINEAR_UNIT(fc_settings[0].unload_length), " ;");
|
||||
say_units();
|
||||
#else
|
||||
LOOP_L_N(e, EXTRUDERS) {
|
||||
EXTRUDER_LOOP() {
|
||||
report_echo_start(forReplay);
|
||||
SERIAL_ECHOPGM(" M603 T", e, " L", LINEAR_UNIT(fc_settings[e].load_length), " U", LINEAR_UNIT(fc_settings[e].unload_length), " ;");
|
||||
say_units();
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
* P<index> : Mode 0 = NONE
|
||||
* 1 = Switch NO (HIGH = filament present)
|
||||
* 2 = Switch NC (LOW = filament present)
|
||||
* 7 = Encoder / Motion Sensor
|
||||
* 3 = Encoder / Motion Sensor
|
||||
*/
|
||||
void GcodeSuite::M591() {
|
||||
if (parser.seen("RSDP" TERN_(HOST_ACTION_COMMANDS, "H"))) {
|
||||
@@ -48,19 +48,17 @@ void GcodeSuite::M591() {
|
||||
#endif
|
||||
const bool seenR = parser.seen_test('R'), seenS = parser.seen('S');
|
||||
if (seenR || seenS) runout.reset();
|
||||
#if NUM_RUNOUT_SENSORS > 1
|
||||
const uint8_t tool = parser.ushortval('E', active_extruder);
|
||||
#else
|
||||
constexpr uint8_t tool = 0;
|
||||
#endif
|
||||
const uint8_t tool = TERN0(MULTI_FILAMENT_SENSOR, parser.ushortval('E', active_extruder));
|
||||
if (seenS) runout.enabled[tool] = parser.value_bool();
|
||||
if (parser.seen('D')) runout.set_runout_distance(parser.value_linear_units(), tool);
|
||||
if (parser.seen('L')) runout.set_runout_distance(parser.value_linear_units(), tool);
|
||||
if (parser.seen('D') || parser.seen('L')) runout.set_runout_distance(parser.value_linear_units(), tool);
|
||||
if (parser.seen('P')) {
|
||||
const uint8_t tmp_mode = parser.value_int();
|
||||
if (tmp_mode < 3 || tmp_mode == 7) {
|
||||
runout.mode[tool] = tmp_mode;
|
||||
runout.reset();
|
||||
const RunoutMode tmp_mode = (RunoutMode)parser.value_int();
|
||||
switch (tmp_mode) {
|
||||
case RM_NONE ... RM_OUT_ON_HIGH:
|
||||
case RM_MOTION_SENSOR:
|
||||
runout.mode[tool] = tmp_mode;
|
||||
runout.reset();
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -83,7 +81,7 @@ void GcodeSuite::M591_report(const bool forReplay/*=true*/) {
|
||||
LOOP_S_L_N(e, 1, NUM_RUNOUT_SENSORS)
|
||||
SERIAL_ECHOLNPGM(
|
||||
" M591"
|
||||
#if NUM_RUNOUT_SENSORS > 1
|
||||
#if MULTI_FILAMENT_SENSOR
|
||||
" E", e,
|
||||
#endif
|
||||
" S", runout.enabled[e]
|
||||
|
||||
@@ -59,7 +59,7 @@ void GcodeSuite::M906() {
|
||||
|
||||
#if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4)
|
||||
const int8_t index = parser.byteval('I', -1);
|
||||
#else
|
||||
#elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
|
||||
constexpr int8_t index = -1;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -258,7 +258,7 @@
|
||||
bool report = true;
|
||||
#if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4)
|
||||
const int8_t index = parser.byteval('I', -1);
|
||||
#else
|
||||
#elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
|
||||
constexpr int8_t index = -1;
|
||||
#endif
|
||||
LOOP_LOGICAL_AXES(i) if (int32_t value = parser.longval(axis_codes[i])) {
|
||||
@@ -457,92 +457,48 @@
|
||||
switch (i) {
|
||||
#if X_SENSORLESS
|
||||
case X_AXIS:
|
||||
#if AXIS_HAS_STALLGUARD(X)
|
||||
if (index < 2) stepperX.homing_threshold(value);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(X2)
|
||||
if (!(index & 1)) stepperX2.homing_threshold(value);
|
||||
#endif
|
||||
if (index < 2) stepperX.homing_threshold(value);
|
||||
TERN_(X2_SENSORLESS, if (!(index & 1)) stepperX2.homing_threshold(value));
|
||||
break;
|
||||
#endif
|
||||
#if Y_SENSORLESS
|
||||
case Y_AXIS:
|
||||
#if AXIS_HAS_STALLGUARD(Y)
|
||||
if (index < 2) stepperY.homing_threshold(value);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(Y2)
|
||||
if (!(index & 1)) stepperY2.homing_threshold(value);
|
||||
#endif
|
||||
if (index < 2) stepperY.homing_threshold(value);
|
||||
TERN_(Y2_SENSORLESS, if (!(index & 1)) stepperY2.homing_threshold(value));
|
||||
break;
|
||||
#endif
|
||||
#if Z_SENSORLESS
|
||||
case Z_AXIS:
|
||||
#if AXIS_HAS_STALLGUARD(Z)
|
||||
if (index < 2) stepperZ.homing_threshold(value);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(Z2)
|
||||
if (index == 0 || index == 2) stepperZ2.homing_threshold(value);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(Z3)
|
||||
if (index == 0 || index == 3) stepperZ3.homing_threshold(value);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(Z4)
|
||||
if (index == 0 || index == 4) stepperZ4.homing_threshold(value);
|
||||
#endif
|
||||
if (index < 2) stepperZ.homing_threshold(value);
|
||||
TERN_(Z2_SENSORLESS, if (index == 0 || index == 2) stepperZ2.homing_threshold(value));
|
||||
TERN_(Z3_SENSORLESS, if (index == 0 || index == 3) stepperZ3.homing_threshold(value));
|
||||
TERN_(Z4_SENSORLESS, if (index == 0 || index == 4) stepperZ4.homing_threshold(value));
|
||||
break;
|
||||
#endif
|
||||
#if I_SENSORLESS && AXIS_HAS_STALLGUARD(I)
|
||||
#if I_SENSORLESS
|
||||
case I_AXIS: stepperI.homing_threshold(value); break;
|
||||
#endif
|
||||
#if J_SENSORLESS && AXIS_HAS_STALLGUARD(J)
|
||||
#if J_SENSORLESS
|
||||
case J_AXIS: stepperJ.homing_threshold(value); break;
|
||||
#endif
|
||||
#if K_SENSORLESS && AXIS_HAS_STALLGUARD(K)
|
||||
#if K_SENSORLESS
|
||||
case K_AXIS: stepperK.homing_threshold(value); break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (report) {
|
||||
#if X_SENSORLESS
|
||||
#if AXIS_HAS_STALLGUARD(X)
|
||||
tmc_print_sgt(stepperX);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(X2)
|
||||
tmc_print_sgt(stepperX2);
|
||||
#endif
|
||||
#endif
|
||||
#if Y_SENSORLESS
|
||||
#if AXIS_HAS_STALLGUARD(Y)
|
||||
tmc_print_sgt(stepperY);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(Y2)
|
||||
tmc_print_sgt(stepperY2);
|
||||
#endif
|
||||
#endif
|
||||
#if Z_SENSORLESS
|
||||
#if AXIS_HAS_STALLGUARD(Z)
|
||||
tmc_print_sgt(stepperZ);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(Z2)
|
||||
tmc_print_sgt(stepperZ2);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(Z3)
|
||||
tmc_print_sgt(stepperZ3);
|
||||
#endif
|
||||
#if AXIS_HAS_STALLGUARD(Z4)
|
||||
tmc_print_sgt(stepperZ4);
|
||||
#endif
|
||||
#endif
|
||||
#if I_SENSORLESS && AXIS_HAS_STALLGUARD(I)
|
||||
tmc_print_sgt(stepperI);
|
||||
#endif
|
||||
#if J_SENSORLESS && AXIS_HAS_STALLGUARD(J)
|
||||
tmc_print_sgt(stepperJ);
|
||||
#endif
|
||||
#if K_SENSORLESS && AXIS_HAS_STALLGUARD(K)
|
||||
tmc_print_sgt(stepperK);
|
||||
#endif
|
||||
TERN_(X_SENSORLESS, tmc_print_sgt(stepperX));
|
||||
TERN_(X2_SENSORLESS, tmc_print_sgt(stepperX2));
|
||||
TERN_(Y_SENSORLESS, tmc_print_sgt(stepperY));
|
||||
TERN_(Y2_SENSORLESS, tmc_print_sgt(stepperY2));
|
||||
TERN_(Z_SENSORLESS, tmc_print_sgt(stepperZ));
|
||||
TERN_(Z2_SENSORLESS, tmc_print_sgt(stepperZ2));
|
||||
TERN_(Z3_SENSORLESS, tmc_print_sgt(stepperZ3));
|
||||
TERN_(Z4_SENSORLESS, tmc_print_sgt(stepperZ4));
|
||||
TERN_(I_SENSORLESS, tmc_print_sgt(stepperI));
|
||||
TERN_(J_SENSORLESS, tmc_print_sgt(stepperJ));
|
||||
TERN_(K_SENSORLESS, tmc_print_sgt(stepperK));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ void GcodeSuite::M919() {
|
||||
|
||||
#if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4)
|
||||
const int8_t index = parser.byteval('I');
|
||||
#else
|
||||
#elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
|
||||
constexpr int8_t index = -1;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -219,8 +219,8 @@
|
||||
* M350 - Set microstepping mode. (Requires digital microstepping pins.)
|
||||
* M351 - Toggle MS1 MS2 pins directly. (Requires digital microstepping pins.)
|
||||
* M355 - Set Case Light on/off and set brightness. (Requires CASE_LIGHT_PIN)
|
||||
* M380 - Activate solenoid on active extruder. (Requires EXT_SOLENOID)
|
||||
* M381 - Disable all solenoids. (Requires EXT_SOLENOID)
|
||||
* M380 - Activate solenoid on active tool (Requires EXT_SOLENOID) or the tool specified by 'S' (Requires MANUAL_SOLENOID_CONTROL).
|
||||
* M381 - Disable solenoids on all tools (Requires EXT_SOLENOID) or the tool specified by 'S' (Requires MANUAL_SOLENOID_CONTROL).
|
||||
* M400 - Finish all moves.
|
||||
* M401 - Deploy and activate Z probe. (Requires a probe)
|
||||
* M402 - Deactivate and stow Z probe. (Requires a probe)
|
||||
|
||||
@@ -92,7 +92,7 @@ void GcodeSuite::M428() {
|
||||
if (!WITHIN(diff[i], -20, 20)) {
|
||||
SERIAL_ERROR_MSG(STR_ERR_M428_TOO_FAR);
|
||||
LCD_ALERTMESSAGE_F("Err: Too far!");
|
||||
BUZZ(200, 40);
|
||||
ERR_BUZZ();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -100,8 +100,7 @@ void GcodeSuite::M428() {
|
||||
LOOP_LINEAR_AXES(i) set_home_offset((AxisEnum)i, diff[i]);
|
||||
report_current_position();
|
||||
LCD_MESSAGE(MSG_HOME_OFFSETS_APPLIED);
|
||||
BUZZ(100, 659);
|
||||
BUZZ(100, 698);
|
||||
OKAY_BUZZ();
|
||||
}
|
||||
|
||||
#endif // HAS_M206_COMMAND
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
#include "../gcode.h"
|
||||
#include "../../MarlinCore.h"
|
||||
#include "../../lcd/marlinui.h"
|
||||
|
||||
/**
|
||||
* M16: Expected Printer Check
|
||||
@@ -37,4 +38,4 @@ void GcodeSuite::M16() {
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif // EXPECTED_PRINTER_CHECK
|
||||
|
||||
@@ -180,7 +180,7 @@ void GcodeSuite::M360() {
|
||||
//
|
||||
config_line(F("NumExtruder"), EXTRUDERS);
|
||||
#if HAS_EXTRUDERS
|
||||
LOOP_L_N(e, EXTRUDERS) {
|
||||
EXTRUDER_LOOP() {
|
||||
config_line_e(e, JERK_STR, TERN(HAS_LINEAR_E_JERK, planner.max_e_jerk[E_INDEX_N(e)], TERN(HAS_CLASSIC_JERK, planner.max_jerk.e, DEFAULT_EJERK)));
|
||||
config_line_e(e, F("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(e)]);
|
||||
config_line_e(e, F("Acceleration"), planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(e)]);
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
void GcodeSuite::M117() {
|
||||
|
||||
if (parser.string_arg && parser.string_arg[0])
|
||||
ui.set_status(parser.string_arg);
|
||||
ui.set_status(parser.string_arg, true);
|
||||
else
|
||||
ui.reset_status();
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ void GcodeSuite::M1001() {
|
||||
process_subcommands_now(F(SD_FINISHED_RELEASECOMMAND));
|
||||
#endif
|
||||
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onPrintFinished());
|
||||
TERN_(EXTENSIBLE_UI, ExtUI::onPrintDone());
|
||||
TERN_(DWIN_LCD_PROUI, DWIN_Print_Finished());
|
||||
|
||||
// Re-select the last printed file in the UI
|
||||
|
||||
@@ -126,7 +126,7 @@ void GcodeSuite::M104_M109(const bool isM109) {
|
||||
#endif
|
||||
|
||||
if (thermalManager.isHeatingHotend(target_extruder) || !no_wait_for_cooling)
|
||||
thermalManager.set_heating_message(target_extruder);
|
||||
thermalManager.set_heating_message(target_extruder, !isM109 && got_temp);
|
||||
}
|
||||
|
||||
TERN_(AUTOTEMP, planner.autotemp_M104_M109());
|
||||
|
||||
@@ -82,14 +82,18 @@ void GcodeSuite::M140_M190(const bool isM190) {
|
||||
if (!got_temp) return;
|
||||
|
||||
thermalManager.setTargetBed(temp);
|
||||
thermalManager.isHeatingBed() ? LCD_MESSAGE(MSG_BED_HEATING) : LCD_MESSAGE(MSG_BED_COOLING);
|
||||
|
||||
ui.set_status(thermalManager.isHeatingBed() ? GET_TEXT_F(MSG_BED_HEATING) : GET_TEXT_F(MSG_BED_COOLING));
|
||||
|
||||
// with PRINTJOB_TIMER_AUTOSTART, M190 can start the timer, and M140 can stop it
|
||||
// With PRINTJOB_TIMER_AUTOSTART, M190 can start the timer, and M140 can stop it
|
||||
TERN_(PRINTJOB_TIMER_AUTOSTART, thermalManager.auto_job_check_timer(isM190, !isM190));
|
||||
|
||||
if (isM190)
|
||||
thermalManager.wait_for_bed(no_wait_for_cooling);
|
||||
else
|
||||
ui.set_status_reset_fn([]{
|
||||
const celsius_t c = thermalManager.degTargetBed();
|
||||
return c < 30 || thermalManager.degBedNear(c);
|
||||
});
|
||||
}
|
||||
|
||||
#endif // HAS_HEATED_BED
|
||||
|
||||
@@ -49,7 +49,7 @@ void GcodeSuite::M192() {
|
||||
}
|
||||
|
||||
const celsius_t target_temp = parser.value_celsius();
|
||||
ui.set_status(thermalManager.isProbeBelowTemp(target_temp) ? GET_TEXT_F(MSG_PROBE_HEATING) : GET_TEXT_F(MSG_PROBE_COOLING));
|
||||
thermalManager.isProbeBelowTemp(target_temp) ? LCD_MESSAGE(MSG_PROBE_HEATING) : LCD_MESSAGE(MSG_PROBE_COOLING);
|
||||
thermalManager.wait_for_probe(target_temp, no_wait_for_cooling);
|
||||
}
|
||||
|
||||
|
||||
@@ -749,6 +749,7 @@
|
||||
#endif
|
||||
|
||||
// Helper macros for extruder and hotend arrays
|
||||
#define EXTRUDER_LOOP() for (int8_t e = 0; e < EXTRUDERS; e++)
|
||||
#define HOTEND_LOOP() for (int8_t e = 0; e < HOTENDS; e++)
|
||||
#define ARRAY_BY_EXTRUDERS(V...) ARRAY_N(EXTRUDERS, V)
|
||||
#define ARRAY_BY_EXTRUDERS1(v1) ARRAY_N_1(EXTRUDERS, v1)
|
||||
|
||||
@@ -575,6 +575,10 @@
|
||||
#define HAS_PRINT_PROGRESS 1
|
||||
#endif
|
||||
|
||||
#if STATUS_MESSAGE_TIMEOUT_SEC > 0
|
||||
#define HAS_STATUS_MESSAGE_TIMEOUT 1
|
||||
#endif
|
||||
|
||||
#if ENABLED(SDSUPPORT) && SD_PROCEDURE_DEPTH
|
||||
#define HAS_MEDIA_SUBCALLS 1
|
||||
#endif
|
||||
|
||||
@@ -459,7 +459,7 @@
|
||||
|
||||
#endif
|
||||
|
||||
#if PIN_EXISTS(SD_DETECT) && NONE(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, HAS_FSMC_GRAPHICAL_TFT, HAS_SPI_GRAPHICAL_TFT, IS_DWIN_MARLINUI, EXTENSIBLE_UI)
|
||||
#if PIN_EXISTS(SD_DETECT) && NONE(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, HAS_FSMC_GRAPHICAL_TFT, HAS_SPI_GRAPHICAL_TFT, IS_DWIN_MARLINUI, EXTENSIBLE_UI, HAS_DWIN_E3V2)
|
||||
#define REINIT_NOISY_LCD 1 // Have the LCD re-init on SD insertion
|
||||
#endif
|
||||
|
||||
@@ -2824,17 +2824,9 @@
|
||||
#endif
|
||||
|
||||
// User Interface
|
||||
#if ENABLED(FREEZE_FEATURE)
|
||||
#if !PIN_EXISTS(FREEZE) && PIN_EXISTS(KILL)
|
||||
#define FREEZE_PIN KILL_PIN
|
||||
#endif
|
||||
#if PIN_EXISTS(FREEZE)
|
||||
#define HAS_FREEZE_PIN 1
|
||||
#endif
|
||||
#else
|
||||
#undef FREEZE_PIN
|
||||
#endif
|
||||
#if PIN_EXISTS(KILL) && TERN1(FREEZE_FEATURE, KILL_PIN != FREEZE_PIN)
|
||||
#if ENABLED(FREEZE_FEATURE) && !PIN_EXISTS(FREEZE) && PIN_EXISTS(KILL)
|
||||
#define FREEZE_PIN KILL_PIN
|
||||
#elif PIN_EXISTS(KILL) && TERN1(FREEZE_FEATURE, KILL_PIN != FREEZE_PIN)
|
||||
#define HAS_KILL 1
|
||||
#endif
|
||||
#if PIN_EXISTS(HOME)
|
||||
@@ -3507,3 +3499,14 @@
|
||||
#if PIN_EXISTS(SAFE_POWER) && DISABLED(DISABLE_DRIVER_SAFE_POWER_PROTECT)
|
||||
#define HAS_DRIVER_SAFE_POWER_PROTECT 1
|
||||
#endif
|
||||
|
||||
#if ANY(ENDSTOPPULLDOWNS, ENDSTOPPULLDOWN_ZMIN_PROBE, \
|
||||
ENDSTOPPULLDOWN_XMIN, ENDSTOPPULLDOWN_YMIN, ENDSTOPPULLDOWN_ZMIN, \
|
||||
ENDSTOPPULLDOWN_IMIN, ENDSTOPPULLDOWN_JMIN, ENDSTOPPULLDOWN_KMIN, \
|
||||
ENDSTOPPULLDOWN_XMAX, ENDSTOPPULLDOWN_YMAX, ENDSTOPPULLDOWN_ZMAX, \
|
||||
ENDSTOPPULLDOWN_IMAX, ENDSTOPPULLDOWN_JMAX, ENDSTOPPULLDOWN_KMAX, \
|
||||
POWER_LOSS_PULLDOWN, CALIBRATION_PIN_PULLDOWN, FIL_RUNOUT_PULLDOWN, \
|
||||
FIL_RUNOUT1_PULLDOWN, FIL_RUNOUT2_PULLDOWN, FIL_RUNOUT3_PULLDOWN, FIL_RUNOUT4_PULLDOWN, \
|
||||
FIL_RUNOUT5_PULLDOWN, FIL_RUNOUT6_PULLDOWN, FIL_RUNOUT7_PULLDOWN, FIL_RUNOUT8_PULLDOWN)
|
||||
#define USING_PULLDOWNS 1
|
||||
#endif
|
||||
|
||||
@@ -782,15 +782,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(TARGET_LPC1768) && ANY( \
|
||||
ENDSTOPPULLDOWNS, \
|
||||
ENDSTOPPULLDOWN_XMAX, ENDSTOPPULLDOWN_YMAX, \
|
||||
ENDSTOPPULLDOWN_ZMAX, ENDSTOPPULLDOWN_XMIN, \
|
||||
ENDSTOPPULLDOWN_YMIN, ENDSTOPPULLDOWN_ZMIN \
|
||||
)
|
||||
#error "PULLDOWN pin mode is not available on the selected board."
|
||||
#endif
|
||||
|
||||
#if BOTH(ENDSTOPPULLUPS, ENDSTOPPULLDOWNS)
|
||||
#error "Enable only one of ENDSTOPPULLUPS or ENDSTOPPULLDOWNS."
|
||||
#elif BOTH(FIL_RUNOUT_PULLUP, FIL_RUNOUT_PULLDOWN)
|
||||
@@ -1105,8 +1096,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
||||
/**
|
||||
* Instant Freeze
|
||||
*/
|
||||
#if ENABLED(FREEZE_FEATURE) && !PIN_EXISTS(FREEZE)
|
||||
#error "FREEZE_FEATURE requires a FREEZE_PIN to be defined."
|
||||
#if ENABLED(FREEZE_FEATURE) && !(PIN_EXISTS(FREEZE) && defined(FREEZE_STATE))
|
||||
#error "FREEZE_FEATURE requires both FREEZE_PIN and FREEZE_STATE."
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -1207,6 +1198,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
||||
#elif ENABLED(SINGLENOZZLE)
|
||||
|
||||
#error "SINGLENOZZLE requires 2 or more EXTRUDERS."
|
||||
#if ENABLED(PID_PARAMS_PER_HOTEND)
|
||||
#error "PID_PARAMS_PER_HOTEND must be disabled when using any SINGLENOZZLE extruder."
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1218,6 +1212,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
||||
#error "SWITCHING_NOZZLE and DUAL_X_CARRIAGE are incompatible."
|
||||
#elif ENABLED(SINGLENOZZLE)
|
||||
#error "SWITCHING_NOZZLE and SINGLENOZZLE are incompatible."
|
||||
#elif HAS_PRUSA_MMU2
|
||||
#error "SWITCHING_NOZZLE and PRUSA_MMU2(S) are incompatible."
|
||||
#elif EXTRUDERS != 2
|
||||
#error "SWITCHING_NOZZLE requires exactly 2 EXTRUDERS."
|
||||
#elif NUM_SERVOS < 1
|
||||
@@ -1706,9 +1702,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
|
||||
* Require pin options and pins to be defined
|
||||
*/
|
||||
#if ENABLED(SENSORLESS_PROBING)
|
||||
#if ENABLED(DELTA) && !(AXIS_HAS_STALLGUARD(X) && AXIS_HAS_STALLGUARD(Y) && AXIS_HAS_STALLGUARD(Z))
|
||||
#if ENABLED(DELTA) && !(X_SENSORLESS && Y_SENSORLESS && Z_SENSORLESS)
|
||||
#error "SENSORLESS_PROBING requires TMC2130/2160/2209/5130/5160 drivers on X, Y, and Z."
|
||||
#elif !AXIS_HAS_STALLGUARD(Z)
|
||||
#elif !Z_SENSORLESS
|
||||
#error "SENSORLESS_PROBING requires a TMC2130/2160/2209/5130/5160 driver on Z."
|
||||
#endif
|
||||
#elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
* version was tagged.
|
||||
*/
|
||||
#ifndef STRING_DISTRIBUTION_DATE
|
||||
#define STRING_DISTRIBUTION_DATE "2022-03-12"
|
||||
#define STRING_DISTRIBUTION_DATE "2022-03-29"
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
@@ -574,6 +574,10 @@
|
||||
#warning "Contrast cannot be changed when LCD_CONTRAST_MIN >= LCD_CONTRAST_MAX."
|
||||
#endif
|
||||
|
||||
#if PROGRESS_MSG_EXPIRE > 0 && HAS_STATUS_MESSAGE_TIMEOUT
|
||||
#warning "It is recommended not to combine PROGRESS_MSG_EXPIRE with STATUS_MESSAGE_TIMEOUT_SEC."
|
||||
#endif
|
||||
|
||||
/**
|
||||
* FYSETC backlighting
|
||||
*/
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
#undef STATUS_HEATERS_X
|
||||
#undef STATUS_BED_X
|
||||
|
||||
/**
|
||||
* Custom _Statusscreen.h files can define:
|
||||
* - A custom logo image
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#if HOTENDS == 0
|
||||
|
||||
#define STATUS_HEATERS_WIDTH 96
|
||||
#define STATUS_BED_X 74
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
|
||||
@@ -56,6 +57,7 @@
|
||||
#elif HOTENDS == 1
|
||||
|
||||
#define STATUS_HEATERS_WIDTH 96
|
||||
#define STATUS_BED_X 74
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
|
||||
@@ -75,6 +77,7 @@
|
||||
#elif HOTENDS == 2
|
||||
|
||||
#define STATUS_HEATERS_WIDTH 96
|
||||
#define STATUS_BED_X 74
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000,
|
||||
@@ -104,6 +107,7 @@
|
||||
#elif HOTENDS == 3
|
||||
|
||||
#define STATUS_HEATERS_WIDTH 96
|
||||
#define STATUS_BED_X 74
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000,
|
||||
@@ -133,6 +137,7 @@
|
||||
#else // HOTENDS > 3
|
||||
|
||||
#define STATUS_HEATERS_WIDTH 120
|
||||
#define STATUS_BED_X 98
|
||||
|
||||
const unsigned char status_heaters_bmp[] PROGMEM = {
|
||||
B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000,
|
||||
@@ -161,7 +166,8 @@
|
||||
|
||||
#endif // HOTENDS
|
||||
|
||||
#define STATUS_BED_TEXT_X (STATUS_HEATERS_WIDTH - 10)
|
||||
#define STATUS_BED_WIDTH 20
|
||||
#define STATUS_BED_TEXT_X (STATUS_BED_X + STATUS_BED_WIDTH / 2)
|
||||
|
||||
#else // !HAS_HEATED_BED || HOTENDS > 3
|
||||
|
||||
|
||||
@@ -4281,7 +4281,7 @@ void DWIN_HandleScreen() {
|
||||
}
|
||||
}
|
||||
|
||||
void DWIN_CompletedHoming() {
|
||||
void DWIN_HomingDone() {
|
||||
HMI_flag.home_flag = false;
|
||||
dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z);
|
||||
if (checkkey == Last_Prepare) {
|
||||
@@ -4297,7 +4297,7 @@ void DWIN_CompletedHoming() {
|
||||
}
|
||||
}
|
||||
|
||||
void DWIN_CompletedLeveling() {
|
||||
void DWIN_LevelingDone() {
|
||||
if (checkkey == Leveling) Goto_MainMenu();
|
||||
}
|
||||
|
||||
|
||||
@@ -243,7 +243,7 @@ void DWIN_HandleScreen();
|
||||
void DWIN_StatusChanged(const char * const cstr=nullptr);
|
||||
void DWIN_StatusChanged(FSTR_P const fstr);
|
||||
|
||||
inline void DWIN_StartHoming() { HMI_flag.home_flag = true; }
|
||||
inline void DWIN_HomingStart() { HMI_flag.home_flag = true; }
|
||||
|
||||
void DWIN_CompletedHoming();
|
||||
void DWIN_CompletedLeveling();
|
||||
void DWIN_HomingDone();
|
||||
void DWIN_LevelingDone();
|
||||
|
||||
@@ -958,8 +958,8 @@ void CrealityDWINClass::Update_Status_Bar(bool refresh/*=false*/) {
|
||||
static bool new_msg;
|
||||
static uint8_t msgscrl = 0;
|
||||
static char lastmsg[64];
|
||||
if (strcmp_P(lastmsg, statusmsg) != 0 || refresh) {
|
||||
strcpy_P(lastmsg, statusmsg);
|
||||
if (strcmp(lastmsg, statusmsg) != 0 || refresh) {
|
||||
strcpy(lastmsg, statusmsg);
|
||||
msgscrl = 0;
|
||||
new_msg = true;
|
||||
}
|
||||
@@ -4693,10 +4693,7 @@ void CrealityDWINClass::Modify_Option(uint8_t value, const char * const * option
|
||||
/* Main Functions */
|
||||
|
||||
void CrealityDWINClass::Update_Status(const char * const text) {
|
||||
char header[4];
|
||||
LOOP_L_N(i, 3) header[i] = text[i];
|
||||
header[3] = '\0';
|
||||
if (strcmp_P(header, PSTR("<F>")) == 0) {
|
||||
if (strncmp_P(text, PSTR("<F>"), 3) == 0) {
|
||||
LOOP_L_N(i, _MIN((size_t)LONG_FILENAME_LENGTH, strlen(text))) filename[i] = text[i + 3];
|
||||
filename[_MIN((size_t)LONG_FILENAME_LENGTH - 1, strlen(text))] = '\0';
|
||||
Draw_Print_Filename(true);
|
||||
@@ -4720,10 +4717,10 @@ void CrealityDWINClass::Start_Print(bool sd) {
|
||||
card.selectFileByName(fname);
|
||||
}
|
||||
#endif
|
||||
strcpy_P(filename, card.longest_filename());
|
||||
strcpy(filename, card.longest_filename());
|
||||
}
|
||||
else
|
||||
strcpy_P(filename, "Host Print");
|
||||
strcpy_P(filename, PSTR("Host Print"));
|
||||
TERN_(LCD_SET_PROGRESS_MANUALLY, ui.set_progress(0));
|
||||
TERN_(USE_M73_REMAINING_TIME, ui.set_remaining_time(0));
|
||||
Draw_Print_Screen();
|
||||
@@ -4918,18 +4915,10 @@ void CrealityDWINClass::Screen_Update() {
|
||||
}
|
||||
|
||||
void CrealityDWINClass::AudioFeedback(const bool success/*=true*/) {
|
||||
if (success) {
|
||||
if (ui.buzzer_enabled) {
|
||||
BUZZ(100, 659);
|
||||
BUZZ( 10, 0);
|
||||
BUZZ(100, 698);
|
||||
}
|
||||
else Update_Status("Success");
|
||||
}
|
||||
else if (ui.buzzer_enabled)
|
||||
BUZZ(40, 440);
|
||||
if (ui.buzzer_enabled)
|
||||
DONE_BUZZ(success);
|
||||
else
|
||||
Update_Status("Failed");
|
||||
Update_Status(success ? "Success" : "Failed");
|
||||
}
|
||||
|
||||
void CrealityDWINClass::Save_Settings(char *buff) {
|
||||
|
||||
@@ -1285,17 +1285,7 @@ void HMI_Printing() {
|
||||
|
||||
#include "../../../libs/buzzer.h"
|
||||
|
||||
void HMI_AudioFeedback(const bool success/*=true*/) {
|
||||
#if HAS_BUZZER
|
||||
if (success) {
|
||||
BUZZ(100, 659);
|
||||
BUZZ(10, 0);
|
||||
BUZZ(100, 698);
|
||||
}
|
||||
else
|
||||
BUZZ(40, 440);
|
||||
#endif
|
||||
}
|
||||
void HMI_AudioFeedback(const bool success/*=true*/) { DONE_BUZZ(success); }
|
||||
|
||||
void Draw_Main_Area() {
|
||||
switch (checkkey) {
|
||||
@@ -1542,20 +1532,20 @@ void HMI_SaveProcessID(const uint8_t id) {
|
||||
}
|
||||
}
|
||||
|
||||
void DWIN_StartHoming() {
|
||||
void DWIN_HomingStart() {
|
||||
HMI_flag.home_flag = true;
|
||||
HMI_SaveProcessID(Homing);
|
||||
Title.ShowCaption(GET_TEXT_F(MSG_HOMING));
|
||||
DWIN_Show_Popup(ICON_BLTouch, GET_TEXT_F(MSG_HOMING), GET_TEXT_F(MSG_PLEASE_WAIT));
|
||||
}
|
||||
|
||||
void DWIN_CompletedHoming() {
|
||||
void DWIN_HomingDone() {
|
||||
HMI_flag.home_flag = false;
|
||||
dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z);
|
||||
if (HMI_flag.abort_action) DWIN_Print_Aborted(); else HMI_ReturnScreen();
|
||||
}
|
||||
|
||||
void DWIN_MeshLevelingStart() {
|
||||
void DWIN_LevelingStart() {
|
||||
#if HAS_ONESTEP_LEVELING
|
||||
HMI_SaveProcessID(Leveling);
|
||||
Title.ShowCaption(GET_TEXT_F(MSG_BED_LEVELING));
|
||||
@@ -1565,7 +1555,7 @@ void DWIN_MeshLevelingStart() {
|
||||
#endif
|
||||
}
|
||||
|
||||
void DWIN_CompletedLeveling() {
|
||||
void DWIN_LevelingDone() {
|
||||
TERN_(HAS_ONESTEP_LEVELING, if (planner.leveling_active) Goto_MeshViewer());
|
||||
}
|
||||
|
||||
@@ -2312,7 +2302,7 @@ TERN(HAS_ONESTEP_LEVELING, float, void) Tram(uint8_t point) {
|
||||
inLev = true;
|
||||
zval = probe.probe_at_point(xpos, ypos, PROBE_PT_STOW);
|
||||
if (isnan(zval))
|
||||
ui.set_status(F("Position Not Reachable, check offsets"));
|
||||
LCD_MESSAGE_F("Position Not Reachable, check offsets");
|
||||
else {
|
||||
sprintf_P(cmd, PSTR("X:%s, Y:%s, Z:%s"),
|
||||
dtostrf(xpos, 1, 1, str_1),
|
||||
@@ -2344,7 +2334,7 @@ void TramC () { Tram(4); }
|
||||
void Trammingwizard() {
|
||||
bed_mesh_t zval = {0};
|
||||
if (HMI_data.FullManualTramming) {
|
||||
ui.set_status(F("Disable manual tramming"));
|
||||
LCD_MESSAGE_F("Disable manual tramming");
|
||||
return;
|
||||
}
|
||||
zval[0][0] = Tram(0);
|
||||
|
||||
@@ -142,13 +142,13 @@ void update_variable();
|
||||
void DWIN_InitScreen();
|
||||
void DWIN_HandleScreen();
|
||||
void DWIN_CheckStatusMessage();
|
||||
void DWIN_StartHoming();
|
||||
void DWIN_CompletedHoming();
|
||||
void DWIN_HomingStart();
|
||||
void DWIN_HomingDone();
|
||||
#if HAS_MESH
|
||||
void DWIN_MeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval);
|
||||
#endif
|
||||
void DWIN_MeshLevelingStart();
|
||||
void DWIN_CompletedLeveling();
|
||||
void DWIN_LevelingStart();
|
||||
void DWIN_LevelingDone();
|
||||
void DWIN_PidTuning(pidresult_t result);
|
||||
void DWIN_Print_Started(const bool sd=false);
|
||||
void DWIN_Print_Pause();
|
||||
|
||||
@@ -21,15 +21,19 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* DWIN End Stops diagnostic page for PRO UI
|
||||
* DWIN Endstops diagnostic page for PRO UI
|
||||
* Author: Miguel A. Risco-Castillo (MRISCOC)
|
||||
* Version: 1.2.2
|
||||
* Date: 2022/02/24
|
||||
*/
|
||||
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if ENABLED(DWIN_LCD_PROUI)
|
||||
|
||||
#include "dwin_defines.h"
|
||||
|
||||
#if BOTH(DWIN_LCD_PROUI, HAS_ESDIAG)
|
||||
#if HAS_ESDIAG
|
||||
|
||||
#include "endstop_diag.h"
|
||||
|
||||
@@ -105,4 +109,5 @@ void ESDiagClass::Update() {
|
||||
DWIN_UpdateLCD();
|
||||
}
|
||||
|
||||
#endif // DWIN_LCD_PROUI && HAS_ESDIAG
|
||||
#endif // HAS_ESDIAG
|
||||
#endif // DWIN_LCD_PROUI
|
||||
|
||||
@@ -155,7 +155,7 @@ void FileNavigator::skiptofileindex(uint16_t skip) {
|
||||
|
||||
if (currentindex == 0 && currentfolderdepth > 0) { // Add a link to go up a folder
|
||||
// The new panel ignores entries that don't end in .GCO or .gcode so add and pad them.
|
||||
if (paneltype == AC_panel_new) {
|
||||
if (paneltype <= AC_panel_new) {
|
||||
TFTSer.println("<<.GCO");
|
||||
Chiron.SendtoTFTLN(F(".. .gcode"));
|
||||
}
|
||||
@@ -177,7 +177,7 @@ void FileNavigator::skiptofileindex(uint16_t skip) {
|
||||
void FileNavigator::sendFile(panel_type_t paneltype) {
|
||||
if (filelist.isDir()) {
|
||||
// Add mandatory tags for new panel otherwise lines are ignored.
|
||||
if (paneltype == AC_panel_new) {
|
||||
if (paneltype <= AC_panel_new) {
|
||||
TFTSer.print(filelist.shortFilename());
|
||||
TFTSer.println(".GCO");
|
||||
TFTSer.print(filelist.shortFilename());
|
||||
|
||||
@@ -57,14 +57,16 @@ namespace ExtUI {
|
||||
|
||||
void onPrintTimerStarted() { Chiron.TimerEvent(AC_timer_started); }
|
||||
void onPrintTimerPaused() { Chiron.TimerEvent(AC_timer_paused); }
|
||||
void onPrintTimerStopped() { Chiron.TimerEvent(AC_timer_stopped); }
|
||||
void onPrintTimerStopped() { Chiron.TimerEvent(AC_timer_stopped); }
|
||||
void onPrintDone() {}
|
||||
|
||||
void onFilamentRunout(const extruder_t) { Chiron.FilamentRunout(); }
|
||||
|
||||
void onUserConfirmRequired(const char * const msg) { Chiron.ConfirmationRequest(msg); }
|
||||
void onStatusChanged(const char * const msg) { Chiron.StatusChange(msg); }
|
||||
|
||||
void onHomingStart() {}
|
||||
void onHomingComplete() {}
|
||||
void onPrintFinished() {}
|
||||
void onHomingDone() {}
|
||||
|
||||
void onFactoryReset() {}
|
||||
|
||||
@@ -103,7 +105,8 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
#if HAS_MESH
|
||||
void onMeshLevelingStart() {}
|
||||
void onLevelingStart() {}
|
||||
void onLevelingDone() {}
|
||||
|
||||
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) {
|
||||
// Called when any mesh points are updated
|
||||
|
||||
@@ -83,13 +83,23 @@ void ChironTFT::Startup() {
|
||||
TFTSer.begin(115200);
|
||||
|
||||
// wait for the TFT panel to initialise and finish the animation
|
||||
delay_ms(250);
|
||||
safe_delay(1000);
|
||||
|
||||
// There are different panels for the Chiron with slightly different commands
|
||||
// So we need to know what we are working with.
|
||||
|
||||
// Panel type can be defined otherwise detect it automatically
|
||||
if (panel_type == AC_panel_unknown) DetectPanelType();
|
||||
switch (panel_type) {
|
||||
case AC_panel_new:
|
||||
SERIAL_ECHOLNF(AC_msg_new_panel_set);
|
||||
break;
|
||||
case AC_panel_standard:
|
||||
SERIAL_ECHOLNF(AC_msg_old_panel_set);
|
||||
break;
|
||||
default:
|
||||
SERIAL_ECHOLNF(AC_msg_auto_panel_detection);
|
||||
DetectPanelType();
|
||||
break;
|
||||
}
|
||||
|
||||
// Signal Board has reset
|
||||
SendtoTFTLN(AC_msg_main_board_has_reset);
|
||||
@@ -355,15 +365,14 @@ bool ChironTFT::ReadTFTCommand() {
|
||||
}
|
||||
|
||||
int8_t ChironTFT::FindToken(char c) {
|
||||
int8_t pos = 0;
|
||||
do {
|
||||
for (int8_t pos = 0; pos < command_len; pos++) {
|
||||
if (panel_command[pos] == c) {
|
||||
#if ACDEBUG(AC_INFO)
|
||||
SERIAL_ECHOLNPGM("Tpos:", pos, " ", c);
|
||||
#endif
|
||||
return pos;
|
||||
}
|
||||
} while (++pos < command_len);
|
||||
}
|
||||
#if ACDEBUG(AC_INFO)
|
||||
SERIAL_ECHOLNPGM("Not found: ", c);
|
||||
#endif
|
||||
@@ -430,7 +439,7 @@ void ChironTFT::SendFileList(int8_t startindex) {
|
||||
}
|
||||
|
||||
void ChironTFT::SelectFile() {
|
||||
if (panel_type == AC_panel_new) {
|
||||
if (panel_type <= AC_panel_new) {
|
||||
strncpy(selectedfile, panel_command + 4, command_len - 3);
|
||||
selectedfile[command_len - 4] = '\0';
|
||||
}
|
||||
@@ -453,7 +462,7 @@ void ChironTFT::SelectFile() {
|
||||
break;
|
||||
default: // enter sub folder
|
||||
// for new panel remove the '.GCO' tag that was added to the end of the path
|
||||
if (panel_type == AC_panel_new)
|
||||
if (panel_type <= AC_panel_new)
|
||||
selectedfile[strlen(selectedfile) - 4] = '\0';
|
||||
filenavigator.changeDIR(selectedfile);
|
||||
SendtoTFTLN(AC_msg_sd_file_open_failed);
|
||||
@@ -466,8 +475,8 @@ void ChironTFT::ProcessPanelRequest() {
|
||||
// Break these up into logical blocks // as its easier to navigate than one huge switch case!
|
||||
int8_t tpos = FindToken('A');
|
||||
// Panel request are 'A0' - 'A36'
|
||||
if (tpos != -1) {
|
||||
const int8_t req = atoi(&panel_command[tpos+1]);
|
||||
if (tpos >= 0) {
|
||||
const int8_t req = atoi(&panel_command[tpos + 1]);
|
||||
|
||||
// Information requests A0 - A8 and A33
|
||||
if (req <= 8 || req == 33) PanelInfo(req);
|
||||
@@ -483,16 +492,18 @@ void ChironTFT::ProcessPanelRequest() {
|
||||
// This may be a response to a panel type detection query
|
||||
if (panel_type == AC_panel_unknown) {
|
||||
tpos = FindToken('S'); // old panel will respond to 'SIZE' with 'SXY 480 320'
|
||||
if (tpos != -1) {
|
||||
if (panel_command[tpos+1]== 'X' && panel_command[tpos+2]=='Y') {
|
||||
if (tpos >= 0) {
|
||||
if (panel_command[tpos + 1] == 'X' && panel_command[tpos + 2] =='Y') {
|
||||
panel_type = AC_panel_standard;
|
||||
SERIAL_ECHOLNF(AC_msg_old_panel_detected);
|
||||
}
|
||||
}
|
||||
else {
|
||||
tpos = FindToken('['); // new panel will respond to 'J200' with '[0]=0'
|
||||
if (tpos != -1) {
|
||||
if (panel_command[tpos+1]== '0' && panel_command[tpos+2]==']') {
|
||||
// new panel will respond to 'J200' with '[0]=0'
|
||||
// it seems only after a power cycle so detection assumes a new panel
|
||||
tpos = FindToken('[');
|
||||
if (tpos >= 0) {
|
||||
if (panel_command[tpos + 1] == '0' && panel_command[tpos + 2] ==']') {
|
||||
panel_type = AC_panel_new;
|
||||
SERIAL_ECHOLNF(AC_msg_new_panel_detected);
|
||||
}
|
||||
@@ -620,18 +631,18 @@ void ChironTFT::PanelAction(uint8_t req) {
|
||||
SelectFile();
|
||||
break;
|
||||
|
||||
case 14: { // A14 Start Printing
|
||||
case 14: // A14 Start Printing
|
||||
// Allows printer to restart the job if we don't want to recover
|
||||
if (printer_state == AC_printer_resuming_from_power_outage) {
|
||||
injectCommands(F("M1000 C")); // Cancel recovery
|
||||
printer_state = AC_printer_idle;
|
||||
}
|
||||
#if ACDebugLevel >= 1
|
||||
SERIAL_ECHOLNPAIR_F("Print: ", selectedfile);
|
||||
SERIAL_ECHOLNPGM("Print: ", selectedfile);
|
||||
#endif
|
||||
printFile(selectedfile);
|
||||
SendtoTFTLN(AC_msg_print_from_sd_card);
|
||||
} break;
|
||||
break;
|
||||
|
||||
case 15: // A15 Resuming from outage
|
||||
if (printer_state == AC_printer_resuming_from_power_outage) {
|
||||
@@ -798,28 +809,25 @@ void ChironTFT::PanelProcess(uint8_t req) {
|
||||
}
|
||||
} break;
|
||||
|
||||
case 30: { // A30 Auto leveling
|
||||
if (FindToken('S') != -1) { // Start probing New panel adds spaces..
|
||||
case 30: // A30 Auto leveling
|
||||
if (FindToken('S') >= 0) { // Start probing New panel adds spaces..
|
||||
// Ignore request if printing
|
||||
if (isPrinting())
|
||||
SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling
|
||||
else {
|
||||
|
||||
|
||||
SendtoTFTLN(AC_msg_start_probing);
|
||||
injectCommands(F("G28\nG29"));
|
||||
printer_state = AC_printer_probing;
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
SendtoTFTLN(AC_msg_start_probing); // Just enter levelling menu
|
||||
}
|
||||
} break;
|
||||
break;
|
||||
|
||||
case 31: { // A31 Adjust all Probe Points
|
||||
case 31: // A31 Adjust all Probe Points
|
||||
// The tokens can occur in different places on the new panel so we need to find it.
|
||||
|
||||
if (FindToken('C') != -1) { // Restore and apply original offsets
|
||||
if (FindToken('C') >= 0) { // Restore and apply original offsets
|
||||
if (!isPrinting()) {
|
||||
injectCommands(F("M501\nM420 S1"));
|
||||
selectedmeshpoint.x = selectedmeshpoint.y = 99;
|
||||
@@ -827,7 +835,7 @@ void ChironTFT::PanelProcess(uint8_t req) {
|
||||
}
|
||||
}
|
||||
|
||||
else if (FindToken('D') != -1) { // Save Z Offset tables and restore leveling state
|
||||
else if (FindToken('D') >= 0) { // Save Z Offset tables and restore leveling state
|
||||
if (!isPrinting()) {
|
||||
setAxisPosition_mm(1.0,Z); // Lift nozzle before any further movements are made
|
||||
injectCommands(F("M500"));
|
||||
@@ -836,7 +844,7 @@ void ChironTFT::PanelProcess(uint8_t req) {
|
||||
}
|
||||
}
|
||||
|
||||
else if (FindToken('G') != -1) { // Get current offset
|
||||
else if (FindToken('G') >= 0) { // Get current offset
|
||||
SendtoTFT(F("A31V "));
|
||||
// When printing use the live z Offset position
|
||||
// we will use babystepping to move the print head
|
||||
@@ -850,7 +858,7 @@ void ChironTFT::PanelProcess(uint8_t req) {
|
||||
|
||||
else {
|
||||
int8_t tokenpos = FindToken('S');
|
||||
if (tokenpos != -1) { // Set offset (adjusts all points by value)
|
||||
if (tokenpos >= 0) { // Set offset (adjusts all points by value)
|
||||
float Zshift = atof(&panel_command[tokenpos+1]);
|
||||
setSoftEndstopState(false); // disable endstops
|
||||
// Allow temporary Z position nudging during print
|
||||
@@ -904,18 +912,18 @@ void ChironTFT::PanelProcess(uint8_t req) {
|
||||
}
|
||||
}
|
||||
}
|
||||
} break;
|
||||
break;
|
||||
|
||||
case 32: { // A32 clean leveling beep flag
|
||||
case 32: // A32 clean leveling beep flag
|
||||
// Ignore request if printing
|
||||
//if (isPrinting()) break;
|
||||
//injectCommands(F("M500\nM420 S1\nG1 Z10 F240\nG1 X0 Y0 F6000"));
|
||||
//TFTSer.println();
|
||||
} break;
|
||||
break;
|
||||
|
||||
// A33 firmware info request see PanelInfo()
|
||||
|
||||
case 34: { // A34 Adjust single mesh point A34 C/S X1 Y1 V123
|
||||
case 34: // A34 Adjust single mesh point A34 C/S X1 Y1 V123
|
||||
if (panel_command[3] == 'C') { // Restore original offsets
|
||||
injectCommands(F("M501\nM420 S1"));
|
||||
selectedmeshpoint.x = selectedmeshpoint.y = 99;
|
||||
@@ -947,7 +955,7 @@ void ChironTFT::PanelProcess(uint8_t req) {
|
||||
}
|
||||
}
|
||||
}
|
||||
} break;
|
||||
break;
|
||||
|
||||
case 36: // A36 Auto leveling for new TFT bet that was a typo in the panel code!
|
||||
SendtoTFTLN(AC_msg_start_probing);
|
||||
|
||||
@@ -89,6 +89,10 @@
|
||||
#define AC_msg_mesh_changes_saved F("Mesh changes saved.")
|
||||
#define AC_msg_old_panel_detected F("Standard TFT panel detected!")
|
||||
#define AC_msg_new_panel_detected F("New TFT panel detected!")
|
||||
#define AC_msg_auto_panel_detection F("Auto detect panel type (assuming new panel)")
|
||||
#define AC_msg_old_panel_set F("Set for standard TFT panel.")
|
||||
#define AC_msg_new_panel_set F("Set for new TFT panel.")
|
||||
|
||||
#define AC_msg_powerloss_recovery F("Resuming from power outage! select the same SD file then press resume")
|
||||
// Error messages must not contain spaces
|
||||
#define AC_msg_error_bed_temp F("Abnormal_bed_temp")
|
||||
@@ -161,10 +165,10 @@ namespace Anycubic {
|
||||
AC_menu_change_to_file,
|
||||
AC_menu_change_to_command
|
||||
};
|
||||
enum panel_type_t : uint8_t {
|
||||
enum panel_type_t : uint8_t { // order is important here as we assume new panel if type is unknown
|
||||
AC_panel_unknown,
|
||||
AC_panel_standard,
|
||||
AC_panel_new
|
||||
AC_panel_new,
|
||||
AC_panel_standard
|
||||
};
|
||||
enum last_error_t : uint8_t {
|
||||
AC_error_none,
|
||||
|
||||
@@ -54,8 +54,8 @@ namespace ExtUI {
|
||||
void onStatusChanged(const char * const msg) {}
|
||||
|
||||
void onHomingStart() {}
|
||||
void onHomingComplete() {}
|
||||
void onPrintFinished() {}
|
||||
void onHomingDone() {}
|
||||
void onPrintDone() {}
|
||||
|
||||
void onFactoryReset() {}
|
||||
|
||||
@@ -95,7 +95,8 @@ namespace ExtUI {
|
||||
|
||||
#if HAS_MESH
|
||||
|
||||
void onMeshLevelingStart() {}
|
||||
void onLevelingStart() {}
|
||||
void onLevelingDone() {}
|
||||
|
||||
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) {
|
||||
// Called when any mesh points are updated
|
||||
|
||||
@@ -73,8 +73,8 @@ namespace ExtUI {
|
||||
void onStatusChanged(const char * const msg) { ScreenHandler.setstatusmessage(msg); }
|
||||
|
||||
void onHomingStart() {}
|
||||
void onHomingComplete() {}
|
||||
void onPrintFinished() {}
|
||||
void onHomingDone() {}
|
||||
void onPrintDone() {}
|
||||
|
||||
void onFactoryReset() {}
|
||||
|
||||
@@ -113,7 +113,8 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
#if HAS_MESH
|
||||
void onMeshLevelingStart() {}
|
||||
void onLevelingStart() {}
|
||||
void onLevelingDone() {}
|
||||
|
||||
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) {
|
||||
// Called when any mesh points are updated
|
||||
|
||||
@@ -83,8 +83,8 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
void onHomingStart() {}
|
||||
void onHomingComplete() {}
|
||||
void onPrintFinished() {}
|
||||
void onHomingDone() {}
|
||||
void onPrintDone() {}
|
||||
|
||||
void onFactoryReset() {
|
||||
dgus_screen_handler.SettingsReset();
|
||||
@@ -109,7 +109,8 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
#if HAS_MESH
|
||||
void onMeshLevelingStart() {}
|
||||
void onLevelingStart() {}
|
||||
void onLevelingDone() {}
|
||||
|
||||
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) {
|
||||
dgus_screen_handler.MeshUpdate(xpos, ypos);
|
||||
|
||||
@@ -59,8 +59,8 @@ namespace ExtUI {
|
||||
void onStatusChanged(const char * const msg) {}
|
||||
|
||||
void onHomingStart() {}
|
||||
void onHomingComplete() {}
|
||||
void onPrintFinished() {}
|
||||
void onHomingDone() {}
|
||||
void onPrintDone() {}
|
||||
|
||||
void onFactoryReset() {}
|
||||
|
||||
@@ -99,7 +99,8 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
#if HAS_MESH
|
||||
void onMeshLevelingStart() {}
|
||||
void onLevelingStart() {}
|
||||
void onLevelingDone() {}
|
||||
|
||||
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) {
|
||||
// Called when any mesh points are updated
|
||||
|
||||
@@ -421,7 +421,7 @@ bool UIFlashStorage::is_present = false;
|
||||
uint32_t addr;
|
||||
uint8_t buff[write_page_size];
|
||||
|
||||
strcpy_P( (char*) buff, (const char*) filename);
|
||||
strcpy_P((char*)buff, FTOP(filename));
|
||||
|
||||
MediaFileReader reader;
|
||||
if (!reader.open((char*) buff)) {
|
||||
|
||||
@@ -106,8 +106,8 @@ bool BioPrintingDialogBox::onTouchEnd(uint8_t tag) {
|
||||
}
|
||||
|
||||
void BioPrintingDialogBox::setStatusMessage(FSTR_P message) {
|
||||
char buff[strlen_P((const char*)message)+1];
|
||||
strcpy_P(buff, (const char*) message);
|
||||
char buff[strlen_P(FTOP(message)) + 1];
|
||||
strcpy_P(buff, FTOP(message));
|
||||
setStatusMessage(buff);
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
void onPrintTimerPaused() {}
|
||||
void onPrintFinished() {}
|
||||
void onPrintDone() {}
|
||||
|
||||
void onFilamentRunout(const extruder_t extruder) {
|
||||
char lcd_msg[30];
|
||||
@@ -90,7 +90,7 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
void onHomingStart() {}
|
||||
void onHomingComplete() {}
|
||||
void onHomingDone() {}
|
||||
|
||||
void onFactoryReset() { InterfaceSettingsScreen::defaultSettings(); }
|
||||
void onStoreSettings(char *buff) { InterfaceSettingsScreen::saveSettings(buff); }
|
||||
@@ -118,7 +118,8 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
#if HAS_LEVELING && HAS_MESH
|
||||
void onMeshLevelingStart() {}
|
||||
void onLevelingStart() {}
|
||||
void onLevelingDone() {}
|
||||
void onMeshUpdate(const int8_t x, const int8_t y, const_float_t val) { BedMeshViewScreen::onMeshUpdate(x, y, val); }
|
||||
void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { BedMeshViewScreen::onMeshUpdate(x, y, state); }
|
||||
#endif
|
||||
|
||||
@@ -242,10 +242,10 @@ class CommandProcessor : public CLCD::CommandFifo {
|
||||
}
|
||||
|
||||
CommandProcessor& toggle2(int16_t x, int16_t y, int16_t w, int16_t h, FSTR_P no, FSTR_P yes, bool state, uint16_t options = FTDI::OPT_3D) {
|
||||
char text[strlen_P((const char *)no) + strlen_P((const char *)yes) + 2];
|
||||
strcpy_P(text, (const char *)no);
|
||||
char text[strlen_P(FTOP(no)) + strlen_P(FTOP(yes)) + 2];
|
||||
strcpy_P(text, FTOP(no));
|
||||
strcat(text, "\xFF");
|
||||
strcat_P(text, (const char *)yes);
|
||||
strcat_P(text, FTOP(yes));
|
||||
return toggle(x, y, w, h, text, state, options);
|
||||
}
|
||||
|
||||
|
||||
@@ -135,9 +135,9 @@ namespace FTDI {
|
||||
}
|
||||
}
|
||||
|
||||
void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, FSTR_P pstr, uint16_t options, uint8_t font) {
|
||||
char str[strlen_P((const char*)pstr) + 1];
|
||||
strcpy_P(str, (const char*)pstr);
|
||||
void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, FSTR_P fstr, uint16_t options, uint8_t font) {
|
||||
char str[strlen_P(FTOP(fstr)) + 1];
|
||||
strcpy_P(str, FTOP(fstr));
|
||||
draw_text_box(cmd, x, y, w, h, (const char*) str, options, font);
|
||||
}
|
||||
} // namespace FTDI
|
||||
|
||||
@@ -33,6 +33,7 @@ namespace FTDI {
|
||||
const bool use_utf8 = has_utf8_chars(str);
|
||||
#define CHAR_WIDTH(c) use_utf8 ? utf8_fm.get_char_width(c) : clcd_fm.char_widths[(uint8_t)c]
|
||||
#else
|
||||
constexpr bool use_utf8 = false;
|
||||
#define CHAR_WIDTH(c) utf8_fm.get_char_width(c)
|
||||
#endif
|
||||
FontMetrics utf8_fm(font);
|
||||
@@ -53,21 +54,17 @@ namespace FTDI {
|
||||
breakPoint = (char*)next;
|
||||
}
|
||||
|
||||
if (lineWidth > w) {
|
||||
*breakPoint = '\0';
|
||||
strcpy_P(breakPoint,PSTR("..."));
|
||||
}
|
||||
if (lineWidth > w)
|
||||
strcpy_P(breakPoint, PSTR("..."));
|
||||
|
||||
cmd.apply_text_alignment(x, y, w, h, options);
|
||||
#if ENABLED(TOUCH_UI_USE_UTF8)
|
||||
if (use_utf8) {
|
||||
draw_utf8_text(cmd, x, y, str, font_size_t::from_romfont(font), options);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
cmd.CLCD::CommandFifo::text(x, y, font, options);
|
||||
cmd.CLCD::CommandFifo::str(str);
|
||||
}
|
||||
if (use_utf8) {
|
||||
TERN_(TOUCH_UI_USE_UTF8, draw_utf8_text(cmd, x, y, str, font_size_t::from_romfont(font), options));
|
||||
}
|
||||
else {
|
||||
cmd.CLCD::CommandFifo::text(x, y, font, options);
|
||||
cmd.CLCD::CommandFifo::str(str);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -80,9 +77,9 @@ namespace FTDI {
|
||||
_draw_text_with_ellipsis(cmd, x, y, w, h, tmp, options, font);
|
||||
}
|
||||
|
||||
void draw_text_with_ellipsis(CommandProcessor& cmd, int x, int y, int w, int h, FSTR_P pstr, uint16_t options, uint8_t font) {
|
||||
char tmp[strlen_P((const char*)pstr) + 3];
|
||||
strcpy_P(tmp, (const char*)pstr);
|
||||
void draw_text_with_ellipsis(CommandProcessor& cmd, int x, int y, int w, int h, FSTR_P fstr, uint16_t options, uint8_t font) {
|
||||
char tmp[strlen_P(FTOP(fstr)) + 3];
|
||||
strcpy_P(tmp, FTOP(fstr));
|
||||
_draw_text_with_ellipsis(cmd, x, y, w, h, tmp, options, font);
|
||||
}
|
||||
} // namespace FTDI
|
||||
|
||||
@@ -191,9 +191,9 @@
|
||||
return render_utf8_text(nullptr, 0, 0, str, fs, maxlen);
|
||||
}
|
||||
|
||||
uint16_t FTDI::get_utf8_text_width(FSTR_P pstr, font_size_t fs) {
|
||||
char str[strlen_P((const char*)pstr) + 1];
|
||||
strcpy_P(str, (const char*)pstr);
|
||||
uint16_t FTDI::get_utf8_text_width(FSTR_P fstr, font_size_t fs) {
|
||||
char str[strlen_P(FTOP(fstr)) + 1];
|
||||
strcpy_P(str, FTOP(fstr));
|
||||
return get_utf8_text_width(str, fs);
|
||||
}
|
||||
|
||||
@@ -234,9 +234,9 @@
|
||||
cmd.cmd(RESTORE_CONTEXT());
|
||||
}
|
||||
|
||||
void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, FSTR_P pstr, font_size_t fs, uint16_t options) {
|
||||
char str[strlen_P((const char*)pstr) + 1];
|
||||
strcpy_P(str, (const char*)pstr);
|
||||
void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, FSTR_P fstr, font_size_t fs, uint16_t options) {
|
||||
char str[strlen_P(FTOP(fstr)) + 1];
|
||||
strcpy_P(str, FTOP(fstr));
|
||||
draw_utf8_text(cmd, x, y, (const char*) str, fs, options);
|
||||
}
|
||||
|
||||
|
||||
@@ -245,8 +245,8 @@ void BaseNumericAdjustmentScreen::widgets_t::adjuster(uint8_t tag, FSTR_P label,
|
||||
}
|
||||
|
||||
if (_what & FOREGROUND) {
|
||||
char b[strlen_P(value)+1];
|
||||
strcpy_P(b,value);
|
||||
char b[strlen(value) + 1];
|
||||
strcpy(b, value);
|
||||
adjuster_sram_val(tag, label, b, is_enabled);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,10 +44,10 @@ void MaxAccelerationScreen::onRedraw(draw_mode_t what) {
|
||||
w.color(e_axis).adjuster( 8, F(STR_E0), getAxisMaxAcceleration_mm_s2(E0) );
|
||||
w.color(e_axis).adjuster(10, F(STR_E1), getAxisMaxAcceleration_mm_s2(E1) );
|
||||
#if DISTINCT_E > 2
|
||||
w.color(e_axis).adjuster(12, F(STR_E2), getAxisMaxAcceleration_mm_s2(E2) );
|
||||
#endif
|
||||
#if DISTINCT_E > 3
|
||||
w.color(e_axis).adjuster(14, F(STR_E3), getAxisMaxAcceleration_mm_s2(E3) );
|
||||
w.color(e_axis).adjuster(12, F(STR_E2), getAxisMaxAcceleration_mm_s2(E2) );
|
||||
#if DISTINCT_E > 3
|
||||
w.color(e_axis).adjuster(14, F(STR_E3), getAxisMaxAcceleration_mm_s2(E3) );
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
w.increments();
|
||||
@@ -65,19 +65,18 @@ bool MaxAccelerationScreen::onTouchHeld(uint8_t tag) {
|
||||
case 8: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E0); break;
|
||||
case 9: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E0); break;
|
||||
#if DISTINCT_E > 1
|
||||
case 10: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E1); break;
|
||||
case 11: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E1); break;
|
||||
case 10: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E1); break;
|
||||
case 11: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E1); break;
|
||||
#if DISTINCT_E > 2
|
||||
case 12: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E2); break;
|
||||
case 13: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E2); break;
|
||||
#if DISTINCT_E > 3
|
||||
case 14: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E3); break;
|
||||
case 15: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E3); break;
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#if DISTINCT_E > 2
|
||||
case 12: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E2); break;
|
||||
case 13: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E2); break;
|
||||
#endif
|
||||
#if DISTINCT_E > 3
|
||||
case 14: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E3); break;
|
||||
case 15: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E3); break;
|
||||
#endif
|
||||
default:
|
||||
return false;
|
||||
default: return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -46,9 +46,9 @@ void MaxVelocityScreen::onRedraw(draw_mode_t what) {
|
||||
w.color(e_axis) .adjuster( 10, F(STR_E1), getAxisMaxFeedrate_mm_s(E1) );
|
||||
#if EXTRUDERS > 2
|
||||
w.color(e_axis).adjuster( 12, F(STR_E2), getAxisMaxFeedrate_mm_s(E2) );
|
||||
#endif
|
||||
#if EXTRUDERS > 3
|
||||
w.color(e_axis).adjuster( 14, F(STR_E3), getAxisMaxFeedrate_mm_s(E3) );
|
||||
#if EXTRUDERS > 3
|
||||
w.color(e_axis).adjuster( 14, F(STR_E3), getAxisMaxFeedrate_mm_s(E3) );
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
w.increments();
|
||||
@@ -63,24 +63,23 @@ bool MaxVelocityScreen::onTouchHeld(uint8_t tag) {
|
||||
case 5: UI_INCREMENT(AxisMaxFeedrate_mm_s, Y); break;
|
||||
case 6: UI_DECREMENT(AxisMaxFeedrate_mm_s, Z); break;
|
||||
case 7: UI_INCREMENT(AxisMaxFeedrate_mm_s, Z); break;
|
||||
#if DISTINCT_E > 0
|
||||
case 8: UI_DECREMENT(AxisMaxFeedrate_mm_s, E0); break;
|
||||
case 9: UI_INCREMENT(AxisMaxFeedrate_mm_s, E0); break;
|
||||
#if DISTINCT_E
|
||||
case 8: UI_DECREMENT(AxisMaxFeedrate_mm_s, E0); break;
|
||||
case 9: UI_INCREMENT(AxisMaxFeedrate_mm_s, E0); break;
|
||||
#if DISTINCT_E > 1
|
||||
case 10: UI_DECREMENT(AxisMaxFeedrate_mm_s, E1); break;
|
||||
case 11: UI_INCREMENT(AxisMaxFeedrate_mm_s, E1); break;
|
||||
#if DISTINCT_E > 2
|
||||
case 12: UI_DECREMENT(AxisMaxFeedrate_mm_s, E2); break;
|
||||
case 13: UI_INCREMENT(AxisMaxFeedrate_mm_s, E2); break;
|
||||
#if DISTINCT_E > 3
|
||||
case 14: UI_DECREMENT(AxisMaxFeedrate_mm_s, E3); break;
|
||||
case 15: UI_INCREMENT(AxisMaxFeedrate_mm_s, E3); break;
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#if DISTINCT_E > 1
|
||||
case 10: UI_DECREMENT(AxisMaxFeedrate_mm_s, E1); break;
|
||||
case 11: UI_INCREMENT(AxisMaxFeedrate_mm_s, E1); break;
|
||||
#endif
|
||||
#if DISTINCT_E > 2
|
||||
case 12: UI_DECREMENT(AxisMaxFeedrate_mm_s, E2); break;
|
||||
case 13: UI_INCREMENT(AxisMaxFeedrate_mm_s, E2); break;
|
||||
#endif
|
||||
#if DISTINCT_E > 3
|
||||
case 14: UI_DECREMENT(AxisMaxFeedrate_mm_s, E3); break;
|
||||
case 15: UI_INCREMENT(AxisMaxFeedrate_mm_s, E3); break;
|
||||
#endif
|
||||
default:
|
||||
return false;
|
||||
default: return false;
|
||||
}
|
||||
SaveSettingsDialogBox::settingsChanged();
|
||||
return true;
|
||||
|
||||
@@ -345,8 +345,8 @@ void StatusScreen::draw_status_message(draw_mode_t what, const char *message) {
|
||||
}
|
||||
|
||||
void StatusScreen::setStatusMessage(FSTR_P message) {
|
||||
char buff[strlen_P((const char * const)message)+1];
|
||||
strcpy_P(buff, (const char * const) message);
|
||||
char buff[strlen_P(FTOP(message)) + 1];
|
||||
strcpy_P(buff, FTOP(message));
|
||||
setStatusMessage((const char *) buff);
|
||||
}
|
||||
|
||||
|
||||
@@ -141,8 +141,8 @@ namespace ExtUI {
|
||||
void onFilamentRunout(const extruder_t extruder) {}
|
||||
void onUserConfirmRequired(const char * const) {}
|
||||
void onHomingStart() {}
|
||||
void onHomingComplete() {}
|
||||
void onPrintFinished() {}
|
||||
void onHomingDone() {}
|
||||
void onPrintDone() {}
|
||||
void onFactoryReset() {}
|
||||
void onStoreSettings(char*) {}
|
||||
void onLoadSettings(const char*) {}
|
||||
@@ -151,7 +151,8 @@ namespace ExtUI {
|
||||
void onConfigurationStoreRead(bool) {}
|
||||
|
||||
#if HAS_MESH
|
||||
void onMeshLevelingStart() {}
|
||||
void onLevelingStart() {}
|
||||
void onLevelingDone() {}
|
||||
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) {}
|
||||
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) {}
|
||||
#endif
|
||||
|
||||
@@ -50,8 +50,8 @@ namespace ExtUI {
|
||||
void onStatusChanged(const char * const msg) { nextion.StatusChange(msg); }
|
||||
|
||||
void onHomingStart() {}
|
||||
void onHomingComplete() {}
|
||||
void onPrintFinished() { nextion.PrintFinished(); }
|
||||
void onHomingDone() {}
|
||||
void onPrintDone() { nextion.PrintFinished(); }
|
||||
|
||||
void onFactoryReset() {}
|
||||
|
||||
@@ -90,7 +90,8 @@ namespace ExtUI {
|
||||
}
|
||||
|
||||
#if HAS_MESH
|
||||
void onMeshLevelingStart() {}
|
||||
void onLevelingStart() {}
|
||||
void onLevelingDone() {}
|
||||
|
||||
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {
|
||||
// Called when any mesh points are updated
|
||||
|
||||
@@ -389,8 +389,10 @@ namespace ExtUI {
|
||||
return !thermalManager.tooColdToExtrude(extruder - E0);
|
||||
}
|
||||
|
||||
GcodeSuite::MarlinBusyState getHostKeepaliveState() { return TERN0(HOST_KEEPALIVE_FEATURE, gcode.busy_state); }
|
||||
bool getHostKeepaliveIsPaused() { return TERN0(HOST_KEEPALIVE_FEATURE, gcode.host_keepalive_is_paused()); }
|
||||
#if ENABLED(HOST_KEEPALIVE_FEATURE)
|
||||
GcodeSuite::MarlinBusyState getHostKeepaliveState() { return gcode.busy_state; }
|
||||
bool getHostKeepaliveIsPaused() { return gcode.host_keepalive_is_paused(); }
|
||||
#endif
|
||||
|
||||
#if HAS_SOFTWARE_ENDSTOPS
|
||||
bool getSoftEndstopState() { return soft_endstop._enabled; }
|
||||
|
||||
@@ -83,8 +83,10 @@ namespace ExtUI {
|
||||
void injectCommands(char * const);
|
||||
bool commandsInQueue();
|
||||
|
||||
GcodeSuite::MarlinBusyState getHostKeepaliveState();
|
||||
bool getHostKeepaliveIsPaused();
|
||||
#if ENABLED(HOST_KEEPALIVE_FEATURE)
|
||||
GcodeSuite::MarlinBusyState getHostKeepaliveState();
|
||||
bool getHostKeepaliveIsPaused();
|
||||
#endif
|
||||
|
||||
bool isHeaterIdle(const heater_t);
|
||||
bool isHeaterIdle(const extruder_t);
|
||||
@@ -172,7 +174,8 @@ namespace ExtUI {
|
||||
float getMeshPoint(const xy_uint8_t &pos);
|
||||
void setMeshPoint(const xy_uint8_t &pos, const_float_t zval);
|
||||
void moveToMeshPoint(const xy_uint8_t &pos, const_float_t z);
|
||||
void onMeshLevelingStart();
|
||||
void onLevelingStart();
|
||||
void onLevelingDone();
|
||||
void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval);
|
||||
inline void onMeshUpdate(const xy_int8_t &pos, const_float_t zval) { onMeshUpdate(pos.x, pos.y, zval); }
|
||||
|
||||
@@ -400,14 +403,14 @@ namespace ExtUI {
|
||||
void onPrintTimerStarted();
|
||||
void onPrintTimerPaused();
|
||||
void onPrintTimerStopped();
|
||||
void onPrintFinished();
|
||||
void onPrintDone();
|
||||
void onFilamentRunout(const extruder_t extruder);
|
||||
void onUserConfirmRequired(const char * const msg);
|
||||
void onUserConfirmRequired(FSTR_P const fstr);
|
||||
void onStatusChanged(const char * const msg);
|
||||
void onStatusChanged(FSTR_P const fstr);
|
||||
void onHomingStart();
|
||||
void onHomingComplete();
|
||||
void onHomingDone();
|
||||
void onSteppersDisabled();
|
||||
void onSteppersEnabled();
|
||||
void onFactoryReset();
|
||||
|
||||
@@ -63,6 +63,7 @@ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t
|
||||
/* Returns length of string in CHARACTERS, NOT BYTES */
|
||||
uint8_t utf8_strlen(const char *pstart);
|
||||
uint8_t utf8_strlen_P(PGM_P pstart);
|
||||
inline uint8_t utf8_strlen(FSTR_P fstart) { return utf8_strlen_P(FTOP(fstart)); }
|
||||
|
||||
/* Returns start byte position of desired char number */
|
||||
uint8_t utf8_byte_pos_by_char_num(const char *pstart, const uint8_t charnum);
|
||||
|
||||
@@ -135,6 +135,7 @@ namespace Language_de {
|
||||
LSTR MSG_BED_LEVELING = _UxGT("Bett-Nivellierung");
|
||||
LSTR MSG_LEVEL_BED = _UxGT("Bett nivellieren");
|
||||
LSTR MSG_BED_TRAMMING = _UxGT("Bett ausrichten");
|
||||
LSTR MSG_BED_TRAMMING_MANUAL = _UxGT("Manuelles ausrichten");
|
||||
LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Das Bett anpassen, bis zum auslösen.");
|
||||
LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Ecken in der Toleranz. Bett ausger.");
|
||||
LSTR MSG_BED_TRAMMING_GOOD_POINTS = _UxGT("Gute Punkte: ");
|
||||
@@ -387,8 +388,9 @@ namespace Language_de {
|
||||
LSTR MSG_ADVANCE_K = _UxGT("Vorschubfaktor");
|
||||
LSTR MSG_ADVANCE_K_E = _UxGT("Vorschubfaktor *");
|
||||
LSTR MSG_CONTRAST = _UxGT("LCD-Kontrast");
|
||||
LSTR MSG_BRIGHTNESS = _UxGT("LCD Helligkeit");
|
||||
LSTR MSG_BRIGHTNESS = _UxGT("LCD-Helligkeit");
|
||||
LSTR MSG_LCD_BKL_TIMEOUT = _UxGT("LCD-Ruhezustand (s)");
|
||||
LSTR MSG_BRIGHTNESS_OFF = _UxGT("LCD ausschalten");
|
||||
LSTR MSG_STORE_EEPROM = _UxGT("Konfig. speichern");
|
||||
LSTR MSG_LOAD_EEPROM = _UxGT("Konfig. laden");
|
||||
LSTR MSG_RESTORE_DEFAULTS = _UxGT("Standardwerte laden");
|
||||
@@ -399,7 +401,7 @@ namespace Language_de {
|
||||
LSTR MSG_SETTINGS_STORED = _UxGT("Einstell. gespei.");
|
||||
LSTR MSG_MEDIA_UPDATE = _UxGT("FW Update vom Medium");
|
||||
LSTR MSG_RESET_PRINTER = _UxGT("Drucker neustarten");
|
||||
LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Aktualisieren");
|
||||
LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Aktualisieren");
|
||||
LSTR MSG_INFO_SCREEN = _UxGT("Info");
|
||||
LSTR MSG_PREPARE = _UxGT("Vorbereitung");
|
||||
LSTR MSG_TUNE = _UxGT("Justierung");
|
||||
@@ -415,6 +417,8 @@ namespace Language_de {
|
||||
LSTR MSG_BUTTON_RESET = _UxGT("Reseten");
|
||||
LSTR MSG_BUTTON_IGNORE = _UxGT("Ignorieren");
|
||||
LSTR MSG_BUTTON_CANCEL = _UxGT("Abbrechen");
|
||||
LSTR MSG_BUTTON_CONFIRM = _UxGT("Bestätigen");
|
||||
LSTR MSG_BUTTON_CONTINUE = _UxGT("Fortsetzen");
|
||||
LSTR MSG_BUTTON_DONE = _UxGT("Fertig");
|
||||
LSTR MSG_BUTTON_BACK = _UxGT("Zurück");
|
||||
LSTR MSG_BUTTON_PROCEED = _UxGT("Weiter");
|
||||
@@ -424,6 +428,7 @@ namespace Language_de {
|
||||
LSTR MSG_BUTTON_PAUSE = _UxGT("Pause");
|
||||
LSTR MSG_BUTTON_RESUME = _UxGT("Fortsetzen");
|
||||
LSTR MSG_BUTTON_ADVANCED = _UxGT("Erweitert");
|
||||
LSTR MSG_BUTTON_SAVE = _UxGT("Speichern");
|
||||
LSTR MSG_PAUSING = _UxGT("Pause...");
|
||||
LSTR MSG_PAUSE_PRINT = _UxGT("SD-Druck pausieren");
|
||||
LSTR MSG_ADVANCED_PAUSE = _UxGT("Erweiterte Pause");
|
||||
|
||||
@@ -403,7 +403,8 @@ namespace Language_en {
|
||||
LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *");
|
||||
LSTR MSG_CONTRAST = _UxGT("LCD Contrast");
|
||||
LSTR MSG_BRIGHTNESS = _UxGT("LCD Brightness");
|
||||
LSTR MSG_BRIGHTNESS_OFF = _UxGT("Turn Off LCD");
|
||||
LSTR MSG_LCD_BKL_TIMEOUT = _UxGT("LCD Timeout (s)");
|
||||
LSTR MSG_BRIGHTNESS_OFF = _UxGT("Backlight Off");
|
||||
LSTR MSG_STORE_EEPROM = _UxGT("Store Settings");
|
||||
LSTR MSG_LOAD_EEPROM = _UxGT("Load Settings");
|
||||
LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restore Defaults");
|
||||
|
||||
@@ -336,6 +336,7 @@ namespace Language_fr {
|
||||
LSTR MSG_BRIGHTNESS = _UxGT("Luminosité LCD");
|
||||
LSTR MSG_CONTRAST = _UxGT("Contraste LCD");
|
||||
LSTR MSG_LCD_BKL_TIMEOUT = _UxGT("Veille LCD (s)");
|
||||
LSTR MSG_BRIGHTNESS_OFF = _UxGT("Éteindre l'écran LCD");
|
||||
LSTR MSG_STORE_EEPROM = _UxGT("Enregistrer config.");
|
||||
LSTR MSG_LOAD_EEPROM = _UxGT("Charger config.");
|
||||
LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restaurer défauts");
|
||||
|
||||
@@ -465,7 +465,15 @@ namespace Language_uk {
|
||||
LSTR MSG_FILAMENT_LOAD = _UxGT("Завантаж., мм");
|
||||
LSTR MSG_ADVANCE_K = _UxGT("Kоеф. просув.");
|
||||
LSTR MSG_ADVANCE_K_E = _UxGT("Kоеф. просув. *");
|
||||
LSTR MSG_CONTRAST = _UxGT("Контраст екрану");
|
||||
#if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
|
||||
LSTR MSG_CONTRAST = _UxGT("Контраст екрану");
|
||||
LSTR MSG_BRIGHTNESS = _UxGT("Яскравість LCD");
|
||||
#else
|
||||
LSTR MSG_CONTRAST = _UxGT("Контраст");
|
||||
LSTR MSG_BRIGHTNESS = _UxGT("Яскравість");
|
||||
#endif
|
||||
LSTR MSG_LCD_BKL_TIMEOUT = _UxGT("LCD Таймаут, с");
|
||||
LSTR MSG_BRIGHTNESS_OFF = _UxGT("Підсвітка вимк.");
|
||||
LSTR MSG_STORE_EEPROM = _UxGT("Зберегти в EEPROM");
|
||||
LSTR MSG_LOAD_EEPROM = _UxGT("Зчитати з EEPROM");
|
||||
LSTR MSG_RESTORE_DEFAULTS = _UxGT("На базові параметри");
|
||||
@@ -497,10 +505,17 @@ namespace Language_uk {
|
||||
LSTR MSG_BUTTON_RESET = _UxGT("Зкинути");
|
||||
LSTR MSG_BUTTON_IGNORE = _UxGT("Ігнорув.");
|
||||
LSTR MSG_BUTTON_CANCEL = _UxGT("Відміна");
|
||||
LSTR MSG_BUTTON_CONFIRM = _UxGT("Підтвер.");
|
||||
LSTR MSG_BUTTON_CONTINUE = _UxGT("Продовж.");
|
||||
LSTR MSG_BUTTON_DONE = _UxGT("Готово");
|
||||
LSTR MSG_BUTTON_BACK = _UxGT("Назад");
|
||||
LSTR MSG_BUTTON_PROCEED = _UxGT("Продовжити");
|
||||
LSTR MSG_BUTTON_SKIP = _UxGT("Пропустити");
|
||||
LSTR MSG_BUTTON_PROCEED = _UxGT("Продовж.");
|
||||
LSTR MSG_BUTTON_SKIP = _UxGT("Пропуск");
|
||||
LSTR MSG_BUTTON_INFO = _UxGT("Інфо");
|
||||
LSTR MSG_BUTTON_LEVEL = _UxGT("Рівень");
|
||||
LSTR MSG_BUTTON_PAUSE = _UxGT("Пауза");
|
||||
LSTR MSG_BUTTON_RESUME = _UxGT("Звіт");
|
||||
LSTR MSG_BUTTON_SAVE = _UxGT("Зберегти");
|
||||
|
||||
LSTR MSG_PAUSING = _UxGT("Призупинення...");
|
||||
LSTR MSG_PAUSE_PRINT = _UxGT("Призупинити друк");
|
||||
@@ -518,6 +533,8 @@ namespace Language_uk {
|
||||
LSTR MSG_USERWAIT = _UxGT("Продовжити...");
|
||||
LSTR MSG_PRINT_PAUSED = _UxGT("Друк призупинено");
|
||||
LSTR MSG_PRINTING = _UxGT("Друк...");
|
||||
LSTR MSG_STOPPING = _UxGT("Зупинка...");
|
||||
LSTR MSG_REMAINING_TIME = _UxGT("Залишилось");
|
||||
LSTR MSG_PRINT_ABORTED = _UxGT("Друк скасовано");
|
||||
LSTR MSG_PRINT_DONE = _UxGT("Друк завершено");
|
||||
LSTR MSG_NO_MOVE = _UxGT("Немає руху.");
|
||||
@@ -702,15 +719,32 @@ namespace Language_uk {
|
||||
|
||||
LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено");
|
||||
LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Екструдовано");
|
||||
LSTR MSG_PLEASE_PREHEAT = _UxGT("Нагрійте хотенд");
|
||||
LSTR MSG_COLORS_GET = _UxGT("Отримати колір");
|
||||
#if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
|
||||
LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Носій не вставлений");
|
||||
LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Перезавантаження...");
|
||||
LSTR MSG_INFO_PRINT_COUNT = _UxGT("Кількість друків");
|
||||
LSTR MSG_INFO_PRINT_TIME = _UxGT("Весь час друку");
|
||||
LSTR MSG_INFO_PRINT_TIME = _UxGT("Час друку");
|
||||
LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Найдовший час");
|
||||
LSTR MSG_COLORS_SELECT = _UxGT("Обрати кольори");
|
||||
LSTR MSG_COLORS_APPLIED = _UxGT("Кольори застосовані");
|
||||
#else
|
||||
LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Немає носія");
|
||||
LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Перезавантаж...");
|
||||
LSTR MSG_INFO_PRINT_COUNT = _UxGT("Друків");
|
||||
LSTR MSG_INFO_PRINT_TIME = _UxGT("Загалом");
|
||||
LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Найдовше");
|
||||
LSTR MSG_COLORS_SELECT = _UxGT("Кольори");
|
||||
LSTR MSG_COLORS_APPLIED = _UxGT("Кольори застос.");
|
||||
#endif
|
||||
LSTR MSG_COLORS_RED = _UxGT("Червоний");
|
||||
LSTR MSG_COLORS_GREEN = _UxGT("Зелений");
|
||||
LSTR MSG_COLORS_BLUE = _UxGT("Синій");
|
||||
LSTR MSG_COLORS_WHITE = _UxGT("Білий");
|
||||
LSTR MSG_UI_LANGUAGE = _UxGT("Мова");
|
||||
LSTR MSG_SOUND_ENABLE = _UxGT("Дозволити звук");
|
||||
LSTR MSG_LOCKSCREEN = _UxGT("Блокувати екран");
|
||||
|
||||
LSTR MSG_INFO_MIN_TEMP = _UxGT("Мін. ") LCD_STR_THERMOMETER;
|
||||
LSTR MSG_INFO_MAX_TEMP = _UxGT("Макс. ") LCD_STR_THERMOMETER;
|
||||
|
||||
@@ -190,6 +190,9 @@ inline lcd_uint_t lcd_put_u8str_ind_P(const lcd_uint_t col, const lcd_uint_t row
|
||||
lcd_moveto(col, row);
|
||||
return lcd_put_u8str_ind_P(pstr, ind, inStr, maxlen);
|
||||
}
|
||||
inline lcd_uint_t lcd_put_u8str_ind(FSTR_P const fstr, const int8_t ind, FSTR_P const inFstr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH) {
|
||||
return lcd_put_u8str_ind_P(FTOP(fstr), ind, FTOP(inFstr), maxlen);
|
||||
}
|
||||
inline lcd_uint_t lcd_put_u8str_ind(const lcd_uint_t col, const lcd_uint_t row, FSTR_P const fstr, const int8_t ind, FSTR_P const inFstr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH) {
|
||||
return lcd_put_u8str_ind_P(col, row, FTOP(fstr), ind, FTOP(inFstr), maxlen);
|
||||
}
|
||||
|
||||
+59
-28
@@ -73,6 +73,10 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
|
||||
#endif
|
||||
char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1];
|
||||
uint8_t MarlinUI::alert_level; // = 0
|
||||
#if HAS_STATUS_MESSAGE_TIMEOUT
|
||||
millis_t MarlinUI::status_message_expire_ms; // = 0
|
||||
#endif
|
||||
statusResetFunc_t MarlinUI::status_reset_callback; // = nullptr
|
||||
#endif
|
||||
|
||||
#if ENABLED(LCD_SET_PROGRESS_MANUALLY)
|
||||
@@ -593,7 +597,7 @@ void MarlinUI::init() {
|
||||
// share the same line on the display.
|
||||
//
|
||||
|
||||
#if DISABLED(PROGRESS_MSG_ONCE) || (PROGRESS_MSG_EXPIRE > 0)
|
||||
#if DISABLED(PROGRESS_MSG_ONCE) || PROGRESS_MSG_EXPIRE > 0
|
||||
#define GOT_MS
|
||||
const millis_t ms = millis();
|
||||
#endif
|
||||
@@ -627,6 +631,18 @@ void MarlinUI::init() {
|
||||
|
||||
#endif // BASIC_PROGRESS_BAR
|
||||
|
||||
bool did_expire = status_reset_callback && (*status_reset_callback)();
|
||||
|
||||
#if HAS_STATUS_MESSAGE_TIMEOUT
|
||||
#ifndef GOT_MS
|
||||
#define GOT_MS
|
||||
const millis_t ms = millis();
|
||||
#endif
|
||||
did_expire |= status_message_expire_ms && ELAPSED(ms, status_message_expire_ms);
|
||||
#endif
|
||||
|
||||
if (did_expire) reset_status();
|
||||
|
||||
#if HAS_MARLINUI_MENU
|
||||
if (use_click()) {
|
||||
#if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT)
|
||||
@@ -1176,7 +1192,7 @@ void MarlinUI::init() {
|
||||
#if HAS_ADC_BUTTONS
|
||||
|
||||
typedef struct {
|
||||
uint16_t ADCKeyValueMin, ADCKeyValueMax;
|
||||
raw_adc_t ADCKeyValueMin, ADCKeyValueMax;
|
||||
uint8_t ADCKeyNo;
|
||||
} _stADCKeypadTable_;
|
||||
|
||||
@@ -1203,10 +1219,10 @@ void MarlinUI::init() {
|
||||
#endif
|
||||
|
||||
// Calculate the ADC value for the voltage divider with specified pull-down resistor value
|
||||
#define ADC_BUTTON_VALUE(r) int(HAL_ADC_RANGE * (ADC_BUTTONS_VALUE_SCALE) * r / (r + ADC_BUTTONS_R_PULLUP))
|
||||
#define ADC_BUTTON_VALUE(r) raw_adc_t(HAL_ADC_RANGE * (ADC_BUTTONS_VALUE_SCALE) * r / (r + ADC_BUTTONS_R_PULLUP))
|
||||
|
||||
static constexpr uint16_t adc_button_tolerance = HAL_ADC_RANGE * 25 / 1024,
|
||||
adc_other_button = HAL_ADC_RANGE * 1000 / 1024;
|
||||
static constexpr raw_adc_t adc_button_tolerance = HAL_ADC_RANGE * 25 / 1024,
|
||||
adc_other_button = raw_adc_t(uint32_t(HAL_ADC_RANGE * 1000UL) / 1024UL);
|
||||
static const _stADCKeypadTable_ stADCKeyTable[] PROGMEM = {
|
||||
// VALUE_MIN, VALUE_MAX, KEY
|
||||
{ adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F1 }, // F1
|
||||
@@ -1226,13 +1242,13 @@ void MarlinUI::init() {
|
||||
|
||||
uint8_t get_ADC_keyValue() {
|
||||
if (thermalManager.ADCKey_count >= 16) {
|
||||
const uint16_t currentkpADCValue = thermalManager.current_ADCKey_raw;
|
||||
const raw_adc_t currentkpADCValue = thermalManager.current_ADCKey_raw;
|
||||
thermalManager.current_ADCKey_raw = HAL_ADC_RANGE;
|
||||
thermalManager.ADCKey_count = 0;
|
||||
if (currentkpADCValue < adc_other_button)
|
||||
LOOP_L_N(i, ADC_KEY_NUM) {
|
||||
const uint16_t lo = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMin),
|
||||
hi = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMax);
|
||||
const raw_adc_t lo = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMin),
|
||||
hi = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMax);
|
||||
if (WITHIN(currentkpADCValue, lo, hi)) return pgm_read_byte(&stADCKeyTable[i].ADCKeyNo);
|
||||
}
|
||||
}
|
||||
@@ -1420,6 +1436,7 @@ void MarlinUI::init() {
|
||||
#if SERVICE_INTERVAL_3 > 0
|
||||
static PGMSTR(service3, "> " SERVICE_NAME_3 "!");
|
||||
#endif
|
||||
|
||||
FSTR_P msg;
|
||||
if (printingIsPaused())
|
||||
msg = GET_TEXT_F(MSG_PRINT_PAUSED);
|
||||
@@ -1450,13 +1467,18 @@ void MarlinUI::init() {
|
||||
set_status(msg, -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Status with a fixed string and alert level.
|
||||
* @param fstr A constant F-string to set as the status.
|
||||
* @param level Alert level. Negative to ignore and reset the level. Non-zero never expires.
|
||||
*/
|
||||
void MarlinUI::set_status(FSTR_P const fstr, int8_t level) {
|
||||
PGM_P const pstr = FTOP(fstr);
|
||||
// Alerts block lower priority messages
|
||||
if (level < 0) level = alert_level = 0;
|
||||
if (level < alert_level) return;
|
||||
alert_level = level;
|
||||
|
||||
TERN_(HOST_STATUS_NOTIFICATIONS, hostui.notify(fstr));
|
||||
PGM_P const pstr = FTOP(fstr);
|
||||
|
||||
// Since the message is encoded in UTF8 it must
|
||||
// only be cut on a character boundary.
|
||||
@@ -1476,6 +1498,8 @@ void MarlinUI::init() {
|
||||
strncpy_P(status_message, pstr, maxLen);
|
||||
status_message[maxLen] = '\0';
|
||||
|
||||
TERN_(HOST_STATUS_NOTIFICATIONS, hostui.notify(fstr));
|
||||
|
||||
finish_status(level > 0);
|
||||
}
|
||||
|
||||
@@ -1487,9 +1511,12 @@ void MarlinUI::init() {
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
void MarlinUI::status_printf(const uint8_t level, FSTR_P const fmt, ...) {
|
||||
void MarlinUI::status_printf(int8_t level, FSTR_P const fmt, ...) {
|
||||
// Alerts block lower priority messages
|
||||
if (level < 0) level = alert_level = 0;
|
||||
if (level < alert_level) return;
|
||||
alert_level = level;
|
||||
|
||||
va_list args;
|
||||
va_start(args, FTOP(fmt));
|
||||
vsnprintf_P(status_message, MAX_MESSAGE_LENGTH, FTOP(fmt), args);
|
||||
@@ -1504,6 +1531,10 @@ void MarlinUI::init() {
|
||||
|
||||
UNUSED(persist);
|
||||
|
||||
set_status_reset_fn();
|
||||
|
||||
TERN_(HAS_STATUS_MESSAGE_TIMEOUT, status_message_expire_ms = persist ? 0 : millis() + (STATUS_MESSAGE_TIMEOUT_SEC) * 1000UL);
|
||||
|
||||
#if HAS_WIRED_LCD
|
||||
|
||||
#if BASIC_PROGRESS_BAR || BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT)
|
||||
@@ -1551,7 +1582,22 @@ void MarlinUI::init() {
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#else // !HAS_STATUS_MESSAGE
|
||||
|
||||
//
|
||||
// Send the status line as a host notification
|
||||
//
|
||||
void MarlinUI::set_status(const char * const cstr, const bool) {
|
||||
TERN(HOST_PROMPT_SUPPORT, hostui.notify(cstr), UNUSED(cstr));
|
||||
}
|
||||
void MarlinUI::set_status(FSTR_P const fstr, const int8_t) {
|
||||
TERN(HOST_PROMPT_SUPPORT, hostui.notify(fstr), UNUSED(fstr));
|
||||
}
|
||||
void MarlinUI::status_printf(int8_t, FSTR_P const fstr, ...) {
|
||||
TERN(HOST_PROMPT_SUPPORT, hostui.notify(fstr), UNUSED(fstr));
|
||||
}
|
||||
|
||||
#endif // !HAS_STATUS_MESSAGE
|
||||
|
||||
#if HAS_DISPLAY
|
||||
|
||||
@@ -1663,22 +1709,7 @@ void MarlinUI::init() {
|
||||
|
||||
#endif
|
||||
|
||||
#elif !HAS_STATUS_MESSAGE // && !HAS_DISPLAY
|
||||
|
||||
//
|
||||
// Send the status line as a host notification
|
||||
//
|
||||
void MarlinUI::set_status(const char * const cstr, const bool) {
|
||||
TERN(HOST_PROMPT_SUPPORT, hostui.notify(cstr), UNUSED(cstr));
|
||||
}
|
||||
void MarlinUI::set_status(FSTR_P const fstr, const int8_t) {
|
||||
TERN(HOST_PROMPT_SUPPORT, hostui.notify(fstr), UNUSED(fstr));
|
||||
}
|
||||
void MarlinUI::status_printf(const uint8_t, FSTR_P const fstr, ...) {
|
||||
TERN(HOST_PROMPT_SUPPORT, hostui.notify(fstr), UNUSED(fstr));
|
||||
}
|
||||
|
||||
#endif // !HAS_DISPLAY && !HAS_STATUS_MESSAGE
|
||||
#endif // HAS_DISPLAY
|
||||
|
||||
#if ENABLED(SDSUPPORT)
|
||||
|
||||
|
||||
@@ -39,10 +39,6 @@
|
||||
#define HAS_ENCODER_ACTION 1
|
||||
#endif
|
||||
|
||||
#if HAS_STATUS_MESSAGE
|
||||
#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U)
|
||||
#endif
|
||||
|
||||
#if E_MANUAL > 1
|
||||
#define MULTI_E_MANUAL 1
|
||||
#endif
|
||||
@@ -63,6 +59,8 @@
|
||||
|
||||
#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U)
|
||||
|
||||
typedef bool (*statusResetFunc_t)();
|
||||
|
||||
#if HAS_WIRED_LCD
|
||||
|
||||
enum LCDViewAction : uint8_t {
|
||||
@@ -346,6 +344,10 @@ public:
|
||||
static char status_message[];
|
||||
static uint8_t alert_level; // Higher levels block lower levels
|
||||
|
||||
#if HAS_STATUS_MESSAGE_TIMEOUT
|
||||
static millis_t status_message_expire_ms; // Reset some status messages after a timeout
|
||||
#endif
|
||||
|
||||
#if ENABLED(STATUS_MESSAGE_SCROLLING)
|
||||
static uint8_t status_scroll_offset;
|
||||
static void advance_status_scroll();
|
||||
@@ -356,16 +358,20 @@ public:
|
||||
static void reset_status(const bool no_welcome=false);
|
||||
static void set_alert_status(FSTR_P const fstr);
|
||||
static void reset_alert_level() { alert_level = 0; }
|
||||
|
||||
static statusResetFunc_t status_reset_callback;
|
||||
static void set_status_reset_fn(const statusResetFunc_t fn=nullptr) { status_reset_callback = fn; }
|
||||
#else
|
||||
static constexpr bool has_status() { return false; }
|
||||
static void reset_status(const bool=false) {}
|
||||
static void set_alert_status(FSTR_P const) {}
|
||||
static void reset_alert_level() {}
|
||||
static void set_status_reset_fn(const statusResetFunc_t=nullptr) {}
|
||||
#endif
|
||||
|
||||
static void set_status(const char * const cstr, const bool persist=false);
|
||||
static void set_status(FSTR_P const fstr, const int8_t level=0);
|
||||
static void status_printf(const uint8_t level, FSTR_P const fmt, ...);
|
||||
static void status_printf(int8_t level, FSTR_P const fmt, ...);
|
||||
|
||||
#if HAS_DISPLAY
|
||||
|
||||
@@ -680,7 +686,31 @@ public:
|
||||
#endif
|
||||
|
||||
static void update_buttons();
|
||||
static bool button_pressed() { return BUTTON_CLICK() || TERN(TOUCH_SCREEN, touch_pressed(), false); }
|
||||
|
||||
#if HAS_ENCODER_NOISE
|
||||
#ifndef ENCODER_SAMPLES
|
||||
#define ENCODER_SAMPLES 10
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Some printers may have issues with EMI noise especially using a motherboard with 3.3V logic levels
|
||||
* it may cause the logical LOW to float into the undefined region and register as a logical HIGH
|
||||
* causing it to erroneously register as if someone clicked the button and in worst case make the
|
||||
* printer unusable in practice.
|
||||
*/
|
||||
static bool hw_button_pressed() {
|
||||
LOOP_L_N(s, ENCODER_SAMPLES) {
|
||||
if (!BUTTON_CLICK()) return false;
|
||||
safe_delay(1);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
static bool hw_button_pressed() { return BUTTON_CLICK(); }
|
||||
#endif
|
||||
|
||||
static bool button_pressed() { return hw_button_pressed() || TERN0(TOUCH_SCREEN, touch_pressed()); }
|
||||
|
||||
#if EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION)
|
||||
static void wait_for_release();
|
||||
#endif
|
||||
|
||||
@@ -276,11 +276,7 @@ void scroll_screen(const uint8_t limit, const bool is_menu) {
|
||||
#if HAS_BUZZER
|
||||
void MarlinUI::completion_feedback(const bool good/*=true*/) {
|
||||
TERN_(HAS_TOUCH_SLEEP, wakeup_screen()); // Wake up on rotary encoder click...
|
||||
if (good) {
|
||||
BUZZ(100, 659);
|
||||
BUZZ(100, 698);
|
||||
}
|
||||
else BUZZ(20, 440);
|
||||
if (good) OKAY_BUZZ(); else ERR_BUZZ();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user