MMU2 fixes (#13082)

This commit is contained in:
revilor 2019-02-06 03:56:22 +01:00 committed by Scott Lahteine
parent 2f8e89adc3
commit 69aaf5d096
2 changed files with 32 additions and 21 deletions

View file

@ -38,10 +38,6 @@ MMU2 mmu2;
#include "../../module/stepper_indirection.h" #include "../../module/stepper_indirection.h"
#include "../../Marlin.h" #include "../../Marlin.h"
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
#include "../runout.h"
#endif
#define MMU_TODELAY 100 #define MMU_TODELAY 100
#define MMU_TIMEOUT 10 #define MMU_TIMEOUT 10
#define MMU_CMD_TIMEOUT 60000ul //5min timeout for mmu commands (except P0) #define MMU_CMD_TIMEOUT 60000ul //5min timeout for mmu commands (except P0)
@ -89,7 +85,7 @@ int8_t MMU2::state = 0;
volatile int8_t MMU2::finda = 1; volatile int8_t MMU2::finda = 1;
volatile bool MMU2::findaRunoutValid; volatile bool MMU2::findaRunoutValid;
int16_t MMU2::version = -1, MMU2::buildnr = -1; int16_t MMU2::version = -1, MMU2::buildnr = -1;
millis_t MMU2::next_request, MMU2::next_response; millis_t MMU2::last_request, MMU2::next_P0_request;
char MMU2::rx_buffer[16], MMU2::tx_buffer[16]; char MMU2::rx_buffer[16], MMU2::tx_buffer[16];
#if HAS_LCD_MENU && ENABLED(MMU2_MENUS) #if HAS_LCD_MENU && ENABLED(MMU2_MENUS)
@ -109,7 +105,8 @@ MMU2::MMU2() {
} }
void MMU2::init() { void MMU2::init() {
findaRunoutValid = false;
set_runout_valid(false);
#if PIN_EXISTS(MMU2_RST) #if PIN_EXISTS(MMU2_RST)
// TODO use macros for this // TODO use macros for this
@ -321,7 +318,7 @@ void MMU2::mmuLoop() {
last_cmd = cmd; last_cmd = cmd;
cmd = MMU_CMD_NONE; cmd = MMU_CMD_NONE;
} }
else if (ELAPSED(millis(), next_response)) { else if (ELAPSED(millis(), next_P0_request)) {
// read FINDA // read FINDA
tx_str_P(PSTR("P0\n")); tx_str_P(PSTR("P0\n"));
state = 2; // wait for response state = 2; // wait for response
@ -350,7 +347,7 @@ void MMU2::mmuLoop() {
if (!finda && findaRunoutValid) filamentRunout(); if (!finda && findaRunoutValid) filamentRunout();
} }
else if (ELAPSED(millis(), next_request)) // Resend request after timeout (30s) else if (ELAPSED(millis(), last_request + MMU_P0_TIMEOUT)) // Resend request after timeout (30s)
state = 1; state = 1;
break; break;
@ -365,7 +362,7 @@ void MMU2::mmuLoop() {
state = 1; state = 1;
last_cmd = MMU_CMD_NONE; last_cmd = MMU_CMD_NONE;
} }
else if (ELAPSED(millis(), next_request)) { else if (ELAPSED(millis(), last_request + MMU_CMD_TIMEOUT)) {
// resend request after timeout // resend request after timeout
if (last_cmd) { if (last_cmd) {
#if ENABLED(MMU2_DEBUG) #if ENABLED(MMU2_DEBUG)
@ -388,7 +385,7 @@ void MMU2::mmuLoop() {
bool MMU2::rx_start() { bool MMU2::rx_start() {
// check for start message // check for start message
if (rx_str_P(PSTR("start\n"))) { if (rx_str_P(PSTR("start\n"))) {
next_response = millis() + 300; next_P0_request = millis() + 300;
return true; return true;
} }
return false; return false;
@ -439,7 +436,7 @@ void MMU2::tx_str_P(const char* str) {
uint8_t len = strlen_P(str); uint8_t len = strlen_P(str);
for (uint8_t i = 0; i < len; i++) mmuSerial.write(pgm_read_byte(str++)); for (uint8_t i = 0; i < len; i++) mmuSerial.write(pgm_read_byte(str++));
rx_buffer[0] = '\0'; rx_buffer[0] = '\0';
next_request = millis() + MMU_P0_TIMEOUT; last_request = millis();
} }
@ -451,7 +448,7 @@ void MMU2::tx_printf_P(const char* format, int argument = -1) {
uint8_t len = sprintf_P(tx_buffer, format, argument); uint8_t len = sprintf_P(tx_buffer, format, argument);
for (uint8_t i = 0; i < len; i++) mmuSerial.write(tx_buffer[i]); for (uint8_t i = 0; i < len; i++) mmuSerial.write(tx_buffer[i]);
rx_buffer[0] = '\0'; rx_buffer[0] = '\0';
next_request = millis() + MMU_P0_TIMEOUT; last_request = millis();
} }
@ -463,7 +460,7 @@ void MMU2::tx_printf_P(const char* format, int argument1, int argument2) {
uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2); uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2);
for (uint8_t i = 0; i < len; i++) mmuSerial.write(tx_buffer[i]); for (uint8_t i = 0; i < len; i++) mmuSerial.write(tx_buffer[i]);
rx_buffer[0] = '\0'; rx_buffer[0] = '\0';
next_request = millis() + MMU_P0_TIMEOUT; last_request = millis();
} }
@ -481,7 +478,7 @@ void MMU2::clear_rx_buffer() {
*/ */
bool MMU2::rx_ok() { bool MMU2::rx_ok() {
if (rx_str_P(PSTR("ok\n"))) { if (rx_str_P(PSTR("ok\n"))) {
next_response = millis() + 300; next_P0_request = millis() + 300;
return true; return true;
} }
return false; return false;
@ -508,7 +505,7 @@ void MMU2::toolChange(uint8_t index) {
if (!enabled) return; if (!enabled) return;
findaRunoutValid = false; set_runout_valid(false);
if (index != extruder) { if (index != extruder) {
@ -534,7 +531,7 @@ void MMU2::toolChange(uint8_t index) {
KEEPALIVE_STATE(NOT_BUSY); KEEPALIVE_STATE(NOT_BUSY);
} }
findaRunoutValid = true; set_runout_valid(true);
} }
@ -553,7 +550,7 @@ void MMU2::toolChange(const char* special) {
#if ENABLED(MMU2_MENUS) #if ENABLED(MMU2_MENUS)
findaRunoutValid = false; set_runout_valid(false);
KEEPALIVE_STATE(IN_HANDLER); KEEPALIVE_STATE(IN_HANDLER);
switch(*special) { switch(*special) {
@ -585,7 +582,7 @@ void MMU2::toolChange(const char* special) {
KEEPALIVE_STATE(NOT_BUSY); KEEPALIVE_STATE(NOT_BUSY);
findaRunoutValid = true; set_runout_valid(true);
#endif #endif
} }
@ -806,7 +803,8 @@ void MMU2::filamentRunout() {
// no active tool // no active tool
extruder = MMU2_NO_TOOL; extruder = MMU2_NO_TOOL;
findaRunoutValid = false;
set_runout_valid(false);
BUZZ(200, 404); BUZZ(200, 404);
@ -845,7 +843,8 @@ void MMU2::filamentRunout() {
// no active tool // no active tool
extruder = MMU2_NO_TOOL; extruder = MMU2_NO_TOOL;
findaRunoutValid = false;
set_runout_valid(false);
KEEPALIVE_STATE(NOT_BUSY); KEEPALIVE_STATE(NOT_BUSY);

View file

@ -24,6 +24,10 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
#include "../runout.h"
#endif
struct E_Step; struct E_Step;
class MMU2 { class MMU2 {
@ -75,8 +79,16 @@ private:
static volatile int8_t finda; static volatile int8_t finda;
static volatile bool findaRunoutValid; static volatile bool findaRunoutValid;
static int16_t version, buildnr; static int16_t version, buildnr;
static millis_t next_request, next_response; static millis_t last_request, next_P0_request;
static char rx_buffer[16], tx_buffer[16]; static char rx_buffer[16], tx_buffer[16];
static inline void set_runout_valid(const bool valid) {
findaRunoutValid = valid;
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
if (valid) runout.reset();
#endif
}
}; };
extern MMU2 mmu2; extern MMU2 mmu2;