Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Host Keepalive serial output with multi-serial #21283

Merged
6 changes: 2 additions & 4 deletions Marlin/src/HAL/ESP32/FlushableHardwareSerial.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@
*/
#pragma once

#ifdef ARDUINO_ARCH_ESP32

#include <HardwareSerial.h>

#include "../shared/Marduino.h"
#include "../../core/serial_hook.h"

class FlushableHardwareSerial : public HardwareSerial {
Expand All @@ -32,5 +32,3 @@ class FlushableHardwareSerial : public HardwareSerial {
};

extern Serial0Type<FlushableHardwareSerial> flushableSerial;

#endif // ARDUINO_ARCH_ESP32
2 changes: 1 addition & 1 deletion Marlin/src/core/serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ extern uint8_t marlin_debug_flags;
//
// Serial redirection
//
#define SERIAL_ALL 0x7F
#define SERIAL_ALL 0xFF
thinkyhead marked this conversation as resolved.
Show resolved Hide resolved
#if HAS_MULTI_SERIAL
#define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p)
#define _PORT_RESTORE(n,p) RESTORE(n)
Expand Down
2 changes: 1 addition & 1 deletion Marlin/src/core/serial_hook.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial<SerialT> >, public Seria
RuntimeSerial(const bool e, Args... args) : BaseClassT(e), SerialT(args...), writeHook(0), eofHook(0), userPointer(0) {}
};

// A class that's duplicating its output conditionally to 2 serial interface
// A class that duplicates its output conditionally to 2 serial interfaces
template <class Serial0T, class Serial1T, const uint8_t offset = 0, const uint8_t step = 1>
struct MultiSerial : public SerialBase< MultiSerial<Serial0T, Serial1T, offset, step> > {
typedef SerialBase< MultiSerial<Serial0T, Serial1T, offset, step> > BaseClassT;
Expand Down
1 change: 1 addition & 0 deletions Marlin/src/gcode/gcode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1062,6 +1062,7 @@ void GcodeSuite::process_subcommands_now(char * gcode) {
static millis_t next_busy_signal_ms = 0;
if (!autoreport_paused && host_keepalive_interval && busy_state != NOT_BUSY) {
if (PENDING(ms, next_busy_signal_ms)) return;
PORT_REDIRECT(SERIAL_ALL);
switch (busy_state) {
case IN_HANDLER:
case IN_PROCESS:
Expand Down
26 changes: 9 additions & 17 deletions Marlin/src/gcode/queue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,32 +272,24 @@ void GCodeQueue::flush_and_request_resend(const serial_index_t serial_ind) {
SERIAL_ECHOLN(serial_state[serial_ind].last_N + 1);
}

// Multiserial already handle the dispatch to/from multiple port by itself
inline bool serial_data_available(uint8_t index = SERIAL_ALL) {
if (index == SERIAL_ALL) {
for (index = 0; index < NUM_SERIAL; index++) {
const int a = SERIAL_IMPL.available(index);
#if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE)
if (a > RX_BUFFER_SIZE - 2) {
PORT_REDIRECT(SERIAL_PORTMASK(index));
SERIAL_ERROR_MSG("RX BUF overflow, increase RX_BUFFER_SIZE: ", a);
}
#endif
if (a > 0) return true;
}
return false;
}
inline bool serial_data_available(uint8_t index) {
const int a = SERIAL_IMPL.available(index);
#if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE)
if (a > RX_BUFFER_SIZE - 2) {
PORT_REDIRECT(SERIAL_PORTMASK(index));
SERIAL_ERROR_MSG("RX BUF overflow, increase RX_BUFFER_SIZE: ", a);
}
#endif

return a > 0;
}

// Multiserial already handles dispatch to/from multiple ports
inline bool any_serial_data_available() {
LOOP_L_N(p, NUM_SERIAL)
if (serial_data_available(p))
return true;
}

inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); }

void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) {
Expand Down Expand Up @@ -409,7 +401,7 @@ void GCodeQueue::get_serial_commands() {
// send "wait" to indicate Marlin is still waiting.
#if NO_TIMEOUTS > 0
const millis_t ms = millis();
if (ring_buffer.empty() && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) {
if (ring_buffer.empty() && !any_serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) {
SERIAL_ECHOLNPGM(STR_WAIT);
last_command_time = ms;
}
Expand Down
6 changes: 3 additions & 3 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -422,9 +422,9 @@ HAS_SERVOS = src_filter=+<src/module/servo.cpp> +<src/gcode/control
MORGAN_SCARA = src_filter=+<src/gcode/scara>
HAS_MICROSTEPS = src_filter=+<src/gcode/control/M350_M351.cpp>
(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer
ESP3DLib=https://github.com/luc-github/ESP3DLib.git
arduinoWebSockets=https://github.com/Links2004/arduinoWebSockets.git
ESP32SSDP=https://github.com/luc-github/ESP32SSDP.git
ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/master.zip
arduinoWebSockets=links2004/[email protected]
luc-github/ESP32SSDP@^1.1.1
lib_ignore=ESPAsyncTCP

#
Expand Down