Merge branch 'bugfix-2.0.x' of https://github.com/MarlinFirmware/Marlin into bugfix-2.0.x
This commit is contained in:
		@@ -927,6 +927,9 @@
 | 
			
		||||
 | 
			
		||||
// Before deploy/stow pause for user confirmation
 | 
			
		||||
//#define PAUSE_BEFORE_DEPLOY_STOW
 | 
			
		||||
#if ENABLED(PAUSE_BEFORE_DEPLOY_STOW)
 | 
			
		||||
  //#define PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED // For Manual Deploy Allenkey Probe
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Enable one or more of the following if probing seems unreliable.
 | 
			
		||||
 
 | 
			
		||||
@@ -905,6 +905,17 @@
 | 
			
		||||
  // Add an optimized binary file transfer mode, initiated with 'M28 B1'
 | 
			
		||||
  //#define BINARY_FILE_TRANSFER
 | 
			
		||||
 | 
			
		||||
  // LPC-based boards have on-board SD Card options. Override here or defaults apply.
 | 
			
		||||
  #ifdef TARGET_LPC1768
 | 
			
		||||
    //#define LPC_SD_LCD          // Use the SD drive in the external LCD controller.
 | 
			
		||||
    //#define LPC_SD_ONBOARD      // Use the SD drive on the control board. (No SD_DETECT_PIN. M21 to init.)
 | 
			
		||||
    //#define LPC_SD_CUSTOM_CABLE // Use a custom cable to access the SD (as defined in a pins file).
 | 
			
		||||
    //#define USB_SD_DISABLED     // Disable SD Card access over USB (for security).
 | 
			
		||||
    #if ENABLED(LPC_SD_ONBOARD)
 | 
			
		||||
      //#define USB_SD_ONBOARD    // Provide the onboard SD card to the host as a USB mass storage device.
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
#endif // SDSUPPORT
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -21,213 +21,132 @@
 | 
			
		||||
 */
 | 
			
		||||
#ifdef ARDUINO_ARCH_ESP32
 | 
			
		||||
 | 
			
		||||
#include "../../inc/MarlinConfig.h"
 | 
			
		||||
#include "../../inc/MarlinConfigPre.h"
 | 
			
		||||
 | 
			
		||||
#if ENABLED(WIFISUPPORT)
 | 
			
		||||
 | 
			
		||||
#include "WebSocketSerial.h"
 | 
			
		||||
 | 
			
		||||
extern WebSocketSerial webSocketSerial;
 | 
			
		||||
 | 
			
		||||
#include "wifi.h"
 | 
			
		||||
#include <AsyncTCP.h>
 | 
			
		||||
#include <ESPAsyncWebServer.h>
 | 
			
		||||
 | 
			
		||||
struct ring_buffer_r {
 | 
			
		||||
  unsigned char buffer[RX_BUFFER_SIZE];
 | 
			
		||||
  volatile ring_buffer_pos_t head, tail;
 | 
			
		||||
};
 | 
			
		||||
WebSocketSerial webSocketSerial;
 | 
			
		||||
AsyncWebSocket ws("/ws"); // TODO Move inside the class.
 | 
			
		||||
 | 
			
		||||
struct ring_buffer_t {
 | 
			
		||||
  unsigned char buffer[256];
 | 
			
		||||
  volatile uint8_t head, tail;
 | 
			
		||||
};
 | 
			
		||||
// RingBuffer impl
 | 
			
		||||
 | 
			
		||||
ring_buffer_r rx_buffer = { { 0 }, 0, 0 };
 | 
			
		||||
ring_buffer_t tx_buffer = { { 0 }, 0, 0 };
 | 
			
		||||
#define NEXT_INDEX(I, SIZE) ((I + 1) & (ring_buffer_pos_t)(SIZE - 1))
 | 
			
		||||
 | 
			
		||||
static bool _written;
 | 
			
		||||
RingBuffer::RingBuffer(ring_buffer_pos_t size)
 | 
			
		||||
  : data(new uint8_t[size]),
 | 
			
		||||
    read_index(0),
 | 
			
		||||
    write_index(0),
 | 
			
		||||
    size(size)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
#if ENABLED(EMERGENCY_PARSER)
 | 
			
		||||
  static EmergencyParser::State emergency_state; // = EP_RESET
 | 
			
		||||
#endif
 | 
			
		||||
RingBuffer::~RingBuffer() { delete[] data; }
 | 
			
		||||
 | 
			
		||||
AsyncWebSocket ws("/ws"); // access at ws://[esp ip]/ws
 | 
			
		||||
ring_buffer_pos_t RingBuffer::write(const uint8_t c) {
 | 
			
		||||
  const ring_buffer_pos_t n = NEXT_INDEX(write_index, size);
 | 
			
		||||
 | 
			
		||||
FORCE_INLINE int next_rx_index(const int i) { return (ring_buffer_pos_t)(i + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); }
 | 
			
		||||
FORCE_INLINE int next_tx_index(const int i) { return (ring_buffer_pos_t)(i + 1) & (ring_buffer_pos_t)(TX_BUFFER_SIZE - 1); }
 | 
			
		||||
 | 
			
		||||
static void addToBuffer(uint8_t * const data, const size_t len) {
 | 
			
		||||
  for (size_t i = 0; i < len; i++) {
 | 
			
		||||
    ring_buffer_pos_t h = rx_buffer.head;
 | 
			
		||||
    const ring_buffer_pos_t t = rx_buffer.tail, n = next_rx_index(h);
 | 
			
		||||
 | 
			
		||||
    if (n != t) { rx_buffer.buffer[h] = data[i]; h = n; }
 | 
			
		||||
 | 
			
		||||
    // TODO: buffer is full, handle?
 | 
			
		||||
 | 
			
		||||
    rx_buffer.head = h;
 | 
			
		||||
  if (n != read_index) {
 | 
			
		||||
    this->data[write_index] = c;
 | 
			
		||||
    write_index = n;
 | 
			
		||||
    return 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // TODO: buffer is full, handle?
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Handle WebSocket event
 | 
			
		||||
static void onEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) {
 | 
			
		||||
  switch (type) {
 | 
			
		||||
    case WS_EVT_CONNECT: client->ping(); break; // client connected
 | 
			
		||||
    case WS_EVT_DISCONNECT:                     // client disconnected
 | 
			
		||||
    case WS_EVT_ERROR:                          // error was received from the other end
 | 
			
		||||
    case WS_EVT_PONG: break;                    // pong message was received (in response to a ping request maybe)
 | 
			
		||||
    case WS_EVT_DATA: {                         // data packet
 | 
			
		||||
      AwsFrameInfo * info = (AwsFrameInfo*)arg;
 | 
			
		||||
      if (info->opcode == WS_TEXT || info->message_opcode == WS_TEXT)
 | 
			
		||||
        addToBuffer(data, len);
 | 
			
		||||
    }
 | 
			
		||||
ring_buffer_pos_t RingBuffer::write(const uint8_t *buffer, ring_buffer_pos_t size) {
 | 
			
		||||
  ring_buffer_pos_t written = 0;
 | 
			
		||||
  for (ring_buffer_pos_t i = 0; i < size; i++) {
 | 
			
		||||
    written += write(buffer[i]);
 | 
			
		||||
  }
 | 
			
		||||
  return written;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Public Methods
 | 
			
		||||
int RingBuffer::available(void) {
 | 
			
		||||
  return (size - read_index + write_index) & (size - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RingBuffer::peek(void) {
 | 
			
		||||
  return available() ? data[read_index] : -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int RingBuffer::read(void) {
 | 
			
		||||
  if (available()) {
 | 
			
		||||
    const int ret = data[read_index];
 | 
			
		||||
    read_index = NEXT_INDEX(read_index, size);
 | 
			
		||||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
  return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ring_buffer_pos_t RingBuffer::read(uint8_t *buffer) {
 | 
			
		||||
   ring_buffer_pos_t len = available();
 | 
			
		||||
 | 
			
		||||
  for(ring_buffer_pos_t i = 0; read_index != write_index; i++) {
 | 
			
		||||
    buffer[i] = data[read_index];
 | 
			
		||||
    read_index = NEXT_INDEX(read_index, size);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RingBuffer::flush(void) { read_index = write_index; }
 | 
			
		||||
 | 
			
		||||
// WebSocketSerial impl
 | 
			
		||||
WebSocketSerial::WebSocketSerial()
 | 
			
		||||
    : rx_buffer(RingBuffer(RX_BUFFER_SIZE)),
 | 
			
		||||
      tx_buffer(RingBuffer(TX_BUFFER_SIZE))
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
void WebSocketSerial::begin(const long baud_setting) {
 | 
			
		||||
  ws.onEvent(onEvent);
 | 
			
		||||
  server.addHandler(&ws); // attach AsyncWebSocket
 | 
			
		||||
  ws.onEvent([this](AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
 | 
			
		||||
    switch (type) {
 | 
			
		||||
      case WS_EVT_CONNECT: client->ping(); break; // client connected
 | 
			
		||||
      case WS_EVT_DISCONNECT:                     // client disconnected
 | 
			
		||||
      case WS_EVT_ERROR:                          // error was received from the other end
 | 
			
		||||
      case WS_EVT_PONG: break;                    // pong message was received (in response to a ping request maybe)
 | 
			
		||||
      case WS_EVT_DATA: {                         // data packet
 | 
			
		||||
        AwsFrameInfo * info = (AwsFrameInfo*)arg;
 | 
			
		||||
        if (info->opcode == WS_TEXT || info->message_opcode == WS_TEXT)
 | 
			
		||||
          this->rx_buffer.write(data, len);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
  server.addHandler(&ws);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WebSocketSerial::end() { }
 | 
			
		||||
int WebSocketSerial::peek(void) { return rx_buffer.peek(); }
 | 
			
		||||
int WebSocketSerial::read(void) { return rx_buffer.read(); }
 | 
			
		||||
int WebSocketSerial::available(void) { return rx_buffer.available(); }
 | 
			
		||||
void WebSocketSerial::flush(void) { rx_buffer.flush(); }
 | 
			
		||||
 | 
			
		||||
int WebSocketSerial::peek(void) {
 | 
			
		||||
  const int v = rx_buffer.head == rx_buffer.tail ? -1 : rx_buffer.buffer[rx_buffer.tail];
 | 
			
		||||
  return v;
 | 
			
		||||
}
 | 
			
		||||
size_t WebSocketSerial::write(const uint8_t c) {
 | 
			
		||||
  size_t ret = tx_buffer.write(c);
 | 
			
		||||
 | 
			
		||||
int WebSocketSerial::read(void) {
 | 
			
		||||
  const ring_buffer_pos_t h = rx_buffer.head, t = rx_buffer.tail;
 | 
			
		||||
  if (h == t) return -1;  // Nothing to read? Return now
 | 
			
		||||
 | 
			
		||||
  const int v = rx_buffer.buffer[t];
 | 
			
		||||
 | 
			
		||||
  rx_buffer.tail = (ring_buffer_pos_t)(t + 1) & (RX_BUFFER_SIZE - 1); // Advance tail
 | 
			
		||||
 | 
			
		||||
  return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool WebSocketSerial::available(void) {
 | 
			
		||||
  const ring_buffer_pos_t h = rx_buffer.head, t = rx_buffer.tail;
 | 
			
		||||
  return (ring_buffer_pos_t)(RX_BUFFER_SIZE + h - t) & (RX_BUFFER_SIZE - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WebSocketSerial::flush(void) {
 | 
			
		||||
  ws.textAll("flush");
 | 
			
		||||
  rx_buffer.tail = rx_buffer.head;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if TX_BUFFER_SIZE
 | 
			
		||||
 | 
			
		||||
  void WebSocketSerial::write(const uint8_t c) {
 | 
			
		||||
    _written = true;
 | 
			
		||||
 | 
			
		||||
    const uint8_t i = (tx_buffer.head + 1) & (TX_BUFFER_SIZE - 1);
 | 
			
		||||
 | 
			
		||||
    // Store new char. head is always safe to move
 | 
			
		||||
    tx_buffer.buffer[tx_buffer.head] = c;
 | 
			
		||||
    tx_buffer.head = i;
 | 
			
		||||
 | 
			
		||||
    if (c == '\n') {
 | 
			
		||||
      ws.textAll(tx_buffer.buffer, tx_buffer.head);
 | 
			
		||||
      tx_buffer.head = 0;
 | 
			
		||||
    }
 | 
			
		||||
  if (ret && c == '\n') {
 | 
			
		||||
    uint8_t tmp[TX_BUFFER_SIZE];
 | 
			
		||||
    ring_buffer_pos_t size = tx_buffer.read(tmp);
 | 
			
		||||
    ws.textAll(tmp, size);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void WebSocketSerial::flushTx(void) {
 | 
			
		||||
    ws.textAll("flushTx");
 | 
			
		||||
    if (!_written) return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
 //void WebSocketSerial::write(const uint8_t c) { _written = true; }
 | 
			
		||||
 //void WebSocketSerial::flushTx(void) { if (!_written) return; }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Imports from print.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
void WebSocketSerial::print(char c, int base) { print((long)c, base); }
 | 
			
		||||
void WebSocketSerial::print(unsigned char b, int base) { print((unsigned long)b, base); }
 | 
			
		||||
void WebSocketSerial::print(int n, int base) { print((long)n, base); }
 | 
			
		||||
void WebSocketSerial::print(unsigned int n, int base) { print((unsigned long)n, base); }
 | 
			
		||||
void WebSocketSerial::print(long n, int base) {
 | 
			
		||||
  if (base == 0)
 | 
			
		||||
    write(n);
 | 
			
		||||
  else if (base == 10) {
 | 
			
		||||
    if (n < 0) { print('-'); n = -n; }
 | 
			
		||||
    printNumber(n, 10);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
    printNumber(n, base);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WebSocketSerial::print(unsigned long n, int base) {
 | 
			
		||||
  if (base == 0) write(n); else printNumber(n, base);
 | 
			
		||||
size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) {
 | 
			
		||||
  size_t written = 0;
 | 
			
		||||
  for(size_t i = 0; i < size; i++) {
 | 
			
		||||
    written += write(buffer[i]);
 | 
			
		||||
  }
 | 
			
		||||
  return written;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WebSocketSerial::print(double n, int digits)         { printFloat(n, digits); }
 | 
			
		||||
 | 
			
		||||
void WebSocketSerial::println(void)                       { print('\r'); print('\n'); }
 | 
			
		||||
void WebSocketSerial::println(const String& s)            { print(s); println(); }
 | 
			
		||||
void WebSocketSerial::println(const char c[])             { print(c); println(); }
 | 
			
		||||
void WebSocketSerial::println(char c, int base)           { print(c, base); println(); }
 | 
			
		||||
void WebSocketSerial::println(unsigned char b, int base)  { print(b, base); println(); }
 | 
			
		||||
void WebSocketSerial::println(int n, int base)            { print(n, base); println(); }
 | 
			
		||||
void WebSocketSerial::println(unsigned int n, int base)   { print(n, base); println(); }
 | 
			
		||||
void WebSocketSerial::println(long n, int base)           { print(n, base); println(); }
 | 
			
		||||
void WebSocketSerial::println(unsigned long n, int base)  { print(n, base); println(); }
 | 
			
		||||
void WebSocketSerial::println(double n, int digits)       { print(n, digits); println(); }
 | 
			
		||||
 | 
			
		||||
// Private Methods
 | 
			
		||||
 | 
			
		||||
void WebSocketSerial::printNumber(unsigned long n, uint8_t base) {
 | 
			
		||||
  if (n) {
 | 
			
		||||
    unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
 | 
			
		||||
    int8_t i = 0;
 | 
			
		||||
    while (n) {
 | 
			
		||||
      buf[i++] = n % base;
 | 
			
		||||
      n /= base;
 | 
			
		||||
    }
 | 
			
		||||
    while (i--)
 | 
			
		||||
      print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
    print('0');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WebSocketSerial::printFloat(double number, uint8_t digits) {
 | 
			
		||||
  // Handle negative numbers
 | 
			
		||||
  if (number < 0.0) { print('-'); number = -number; }
 | 
			
		||||
 | 
			
		||||
  // Round correctly so that print(1.999, 2) prints as "2.00"
 | 
			
		||||
  // Use a lookup table for performance
 | 
			
		||||
  constexpr double rounds[] = { 0.5, 0.05, 0.005, 0.0005, 0.00005, 0.000005, 0.0000005, 0.00000005 };
 | 
			
		||||
  number += rounds[digits];
 | 
			
		||||
 | 
			
		||||
  //number += pow(10, -(digits + 1)); // slower single-line equivalent
 | 
			
		||||
 | 
			
		||||
  // Extract the integer part of the number and print it
 | 
			
		||||
  unsigned long int_part = (unsigned long)number;
 | 
			
		||||
  print(int_part);
 | 
			
		||||
 | 
			
		||||
  // Print the decimal point, but only if there are digits beyond
 | 
			
		||||
  double remainder = number - (double)int_part;
 | 
			
		||||
  if (digits) {
 | 
			
		||||
    print('.');
 | 
			
		||||
    // Extract digits from the remainder one at a time
 | 
			
		||||
    while (digits--) {
 | 
			
		||||
      remainder *= 10.0;
 | 
			
		||||
      const int toPrint = int(remainder);
 | 
			
		||||
      print(toPrint);
 | 
			
		||||
      remainder -= toPrint;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
void WebSocketSerial::flushTX(void) {
 | 
			
		||||
  // No need to do anything as there's no benefit to sending partial lines over the websocket connection.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // WIFISUPPORT
 | 
			
		||||
 
 | 
			
		||||
@@ -23,12 +23,7 @@
 | 
			
		||||
 | 
			
		||||
#include "../../inc/MarlinConfig.h"
 | 
			
		||||
 | 
			
		||||
#include <WString.h>
 | 
			
		||||
 | 
			
		||||
#define DEC 10
 | 
			
		||||
#define HEX 16
 | 
			
		||||
#define OCT 8
 | 
			
		||||
#define BIN 2
 | 
			
		||||
#include "Stream.h"
 | 
			
		||||
 | 
			
		||||
#ifndef RX_BUFFER_SIZE
 | 
			
		||||
  #define RX_BUFFER_SIZE 128
 | 
			
		||||
@@ -40,60 +35,50 @@
 | 
			
		||||
  #error "TX_BUFFER_SIZE is required for the WebSocket."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if RX_BUFFER_SIZE > 256
 | 
			
		||||
  typedef uint16_t ring_buffer_pos_t;
 | 
			
		||||
#else
 | 
			
		||||
  typedef uint8_t ring_buffer_pos_t;
 | 
			
		||||
#endif
 | 
			
		||||
typedef uint16_t ring_buffer_pos_t;
 | 
			
		||||
 | 
			
		||||
class RingBuffer {
 | 
			
		||||
  uint8_t *data;
 | 
			
		||||
  ring_buffer_pos_t size, read_index, write_index;
 | 
			
		||||
 | 
			
		||||
class WebSocketSerial {
 | 
			
		||||
public:
 | 
			
		||||
  WebSocketSerial() {};
 | 
			
		||||
  static void begin(const long);
 | 
			
		||||
  static void end();
 | 
			
		||||
  static int peek(void);
 | 
			
		||||
  static int read(void);
 | 
			
		||||
  static void flush(void);
 | 
			
		||||
  static void flushTx(void);
 | 
			
		||||
  static bool available(void);
 | 
			
		||||
  static void write(const uint8_t c);
 | 
			
		||||
  RingBuffer(ring_buffer_pos_t size);
 | 
			
		||||
  ~RingBuffer();
 | 
			
		||||
 | 
			
		||||
  int available(void);
 | 
			
		||||
  int peek(void);
 | 
			
		||||
  int read(void);
 | 
			
		||||
  ring_buffer_pos_t read(uint8_t *buffer);
 | 
			
		||||
  void flush(void);
 | 
			
		||||
  ring_buffer_pos_t write(const uint8_t c);
 | 
			
		||||
  ring_buffer_pos_t write(const uint8_t* buffer, ring_buffer_pos_t size);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class WebSocketSerial: public Stream {
 | 
			
		||||
  RingBuffer rx_buffer;
 | 
			
		||||
  RingBuffer tx_buffer;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  WebSocketSerial();
 | 
			
		||||
  void begin(const long);
 | 
			
		||||
  void end();
 | 
			
		||||
  int available(void);
 | 
			
		||||
  int peek(void);
 | 
			
		||||
  int read(void);
 | 
			
		||||
  void flush(void);
 | 
			
		||||
  void flushTX(void);
 | 
			
		||||
  size_t write(const uint8_t c);
 | 
			
		||||
  size_t write(const uint8_t* buffer, size_t size);
 | 
			
		||||
 | 
			
		||||
  operator bool() { return true; }
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(SERIAL_STATS_DROPPED_RX)
 | 
			
		||||
    FORCE_INLINE static uint32_t dropped() { return 0; }
 | 
			
		||||
    FORCE_INLINE uint32_t dropped() { return 0; }
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
 | 
			
		||||
    FORCE_INLINE static int rxMaxEnqueued() { return 0; }
 | 
			
		||||
    FORCE_INLINE int rxMaxEnqueued() { return 0; }
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
 | 
			
		||||
  FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
 | 
			
		||||
  FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
 | 
			
		||||
  FORCE_INLINE static void print(const char* str) { write(str); }
 | 
			
		||||
 | 
			
		||||
  static void print(char, int = 0);
 | 
			
		||||
  static void print(unsigned char, int = 0);
 | 
			
		||||
  static void print(int, int = DEC);
 | 
			
		||||
  static void print(unsigned int, int = DEC);
 | 
			
		||||
  static void print(long, int = DEC);
 | 
			
		||||
  static void print(unsigned long, int = DEC);
 | 
			
		||||
  static void print(double, int = 2);
 | 
			
		||||
 | 
			
		||||
  static void println(const String& s);
 | 
			
		||||
  static void println(const char[]);
 | 
			
		||||
  static void println(char, int = 0);
 | 
			
		||||
  static void println(unsigned char, int = 0);
 | 
			
		||||
  static void println(int, int = DEC);
 | 
			
		||||
  static void println(unsigned int, int = DEC);
 | 
			
		||||
  static void println(long, int = DEC);
 | 
			
		||||
  static void println(unsigned long, int = DEC);
 | 
			
		||||
  static void println(double, int = 2);
 | 
			
		||||
  static void println(void);
 | 
			
		||||
  operator bool() { return true; }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  static void printNumber(unsigned long, const uint8_t);
 | 
			
		||||
  static void printFloat(double, uint8_t);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern WebSocketSerial webSocketSerial;
 | 
			
		||||
 
 | 
			
		||||
@@ -303,9 +303,9 @@ int i2s_init() {
 | 
			
		||||
  xTaskCreate(stepperTask, "StepperTask", 10000, NULL, 1, NULL);
 | 
			
		||||
 | 
			
		||||
  // Route the i2s pins to the appropriate GPIO
 | 
			
		||||
  gpio_matrix_out_check(22, I2S0O_DATA_OUT23_IDX, 0, 0);
 | 
			
		||||
  gpio_matrix_out_check(25, I2S0O_WS_OUT_IDX, 0, 0);
 | 
			
		||||
  gpio_matrix_out_check(26, I2S0O_BCK_OUT_IDX, 0, 0);
 | 
			
		||||
  gpio_matrix_out_check(I2S_DATA, I2S0O_DATA_OUT23_IDX, 0, 0);
 | 
			
		||||
  gpio_matrix_out_check(I2S_BCK, I2S0O_BCK_OUT_IDX, 0, 0);
 | 
			
		||||
  gpio_matrix_out_check(I2S_WS, I2S0O_WS_OUT_IDX, 0, 0);
 | 
			
		||||
 | 
			
		||||
  // Start the I2S peripheral
 | 
			
		||||
  return i2s_start(I2S_NUM_0);
 | 
			
		||||
 
 | 
			
		||||
@@ -29,3 +29,9 @@ int i2s_init();
 | 
			
		||||
void i2s_write(uint8_t pin, uint8_t val);
 | 
			
		||||
 | 
			
		||||
void i2s_push_sample();
 | 
			
		||||
 | 
			
		||||
// pin definitions
 | 
			
		||||
 | 
			
		||||
#define I2S_WS 25
 | 
			
		||||
#define I2S_BCK 26
 | 
			
		||||
#define I2S_DATA 27
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,24 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Marlin 3D Printer Firmware
 | 
			
		||||
 * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
 | 
			
		||||
 *
 | 
			
		||||
 * Based on Sprinter and grbl.
 | 
			
		||||
 * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifdef TARGET_LPC1768
 | 
			
		||||
 | 
			
		||||
#include <usb/usb.h>
 | 
			
		||||
 
 | 
			
		||||
@@ -137,8 +137,11 @@ uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_v
 | 
			
		||||
 | 
			
		||||
    case U8G_COM_MSG_WRITE_BYTE:
 | 
			
		||||
      //u8g->pin_list[U8G_PI_SET_A0] = 1;
 | 
			
		||||
      //if (u8g_com_arduino_ssd_start_sequence(u8g) == 0)
 | 
			
		||||
      //  return u8g_i2c_stop(), 0;
 | 
			
		||||
      if (u8g_com_ssd_I2C_start_sequence(u8g) == 0) {
 | 
			
		||||
        u8g_i2c_stop();
 | 
			
		||||
        return 0;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (u8g_i2c_send_byte(arg_val) == 0) {
 | 
			
		||||
        u8g_i2c_stop();
 | 
			
		||||
        return 0;
 | 
			
		||||
@@ -186,9 +189,6 @@ uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_v
 | 
			
		||||
    case U8G_COM_MSG_ADDRESS:                     /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
 | 
			
		||||
      u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
 | 
			
		||||
      u8g->pin_list[U8G_PI_SET_A0] = 1;   /* force a0 to set again */
 | 
			
		||||
 | 
			
		||||
      u8g_i2c_start(0); // send slave address and write bit
 | 
			
		||||
      u8g_i2c_send_byte(arg_val ? 0x40 : 0x80);  // Write to ? Graphics DRAM mode : Command mode
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
  } // switch
 | 
			
		||||
 
 | 
			
		||||
@@ -65,10 +65,76 @@
 | 
			
		||||
#undef SPI_SPEED
 | 
			
		||||
#define SPI_SPEED 2  // About 2 MHz
 | 
			
		||||
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <LPC17xx.h>
 | 
			
		||||
#include <gpio.h>
 | 
			
		||||
 | 
			
		||||
#include <Arduino.h>
 | 
			
		||||
 | 
			
		||||
uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) {
 | 
			
		||||
 | 
			
		||||
  for (uint8_t i = 0; i < 8; i++) {
 | 
			
		||||
    if (spi_speed == 0) {
 | 
			
		||||
      gpio_set(mosi_pin, !!(b & 0x80));
 | 
			
		||||
      gpio_set(sck_pin, HIGH);
 | 
			
		||||
      b <<= 1;
 | 
			
		||||
      if (miso_pin >= 0 && gpio_get(miso_pin)) b |= 1;
 | 
			
		||||
      gpio_set(sck_pin, LOW);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      const uint8_t state = (b & 0x80) ? HIGH : LOW;
 | 
			
		||||
      for (uint8_t j = 0; j < spi_speed; j++)
 | 
			
		||||
        gpio_set(mosi_pin, state);
 | 
			
		||||
 | 
			
		||||
      for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++)
 | 
			
		||||
        gpio_set(sck_pin, HIGH);
 | 
			
		||||
 | 
			
		||||
      b <<= 1;
 | 
			
		||||
      if (miso_pin >= 0 && gpio_get(miso_pin)) b |= 1;
 | 
			
		||||
 | 
			
		||||
      for (uint8_t j = 0; j < spi_speed; j++)
 | 
			
		||||
        gpio_set(sck_pin, LOW);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) {
 | 
			
		||||
 | 
			
		||||
  for (uint8_t i = 0; i < 8; i++) {
 | 
			
		||||
    const uint8_t state = (b & 0x80) ? HIGH : LOW;
 | 
			
		||||
    if (spi_speed == 0) {
 | 
			
		||||
      gpio_set(sck_pin, LOW);
 | 
			
		||||
      gpio_set(mosi_pin, state);
 | 
			
		||||
      gpio_set(mosi_pin, state);  // need some setup time
 | 
			
		||||
      gpio_set(sck_pin, HIGH);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++)
 | 
			
		||||
        gpio_set(sck_pin, LOW);
 | 
			
		||||
 | 
			
		||||
      for (uint8_t j = 0; j < spi_speed; j++)
 | 
			
		||||
        gpio_set(mosi_pin, state);
 | 
			
		||||
 | 
			
		||||
      for (uint8_t j = 0; j < spi_speed; j++)
 | 
			
		||||
        gpio_set(sck_pin, HIGH);
 | 
			
		||||
    }
 | 
			
		||||
    b <<= 1;
 | 
			
		||||
    if (miso_pin >= 0 && gpio_get(miso_pin)) b |= 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint8_t SPI_speed = 0;
 | 
			
		||||
 | 
			
		||||
static void u8g_sw_spi_HAL_LPC1768_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) {
 | 
			
		||||
  swSpiTransfer(val, SPI_speed, clockPin, -1, dataPin);
 | 
			
		||||
  #if ENABLED(FYSETC_MINI_12864)
 | 
			
		||||
    swSpiTransfer_mode_3(val, SPI_speed, clockPin, -1, dataPin);
 | 
			
		||||
  #else
 | 
			
		||||
    swSpiTransfer_mode_0(val, SPI_speed, clockPin, -1, dataPin);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
 | 
			
		||||
 
 | 
			
		||||
@@ -194,6 +194,7 @@
 | 
			
		||||
#define BOARD_BIQU_B300_V1_0      1760  // BIQU B300_V1.0 (Power outputs: Hotend0, Fan, Bed, SPI Driver)
 | 
			
		||||
#define BOARD_BIGTREE_SKR_V1_3    1761  // BIGTREE SKR_V1.3 (Power outputs: Hotend0, Hotend1, Fan, Bed)
 | 
			
		||||
#define BOARD_AZTEEG_X5_MINI      1762  // Azteeg X5 Mini (Power outputs: Hotend0, Bed, Fan)
 | 
			
		||||
#define BOARD_MKS_SGEN            1763  // MKS-SGen (Power outputs: Hotend0, Hotend1, Bed, Fan)
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// SAM3X8E ARM Cortex M3
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Serial aliases for debugging.
 | 
			
		||||
 
 | 
			
		||||
@@ -264,15 +264,15 @@ void safe_delay(millis_t ms) {
 | 
			
		||||
    return conv;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Convert unsigned float to string with 1234.56 format omitting trailing zeros
 | 
			
		||||
  char* ftostr62rj(const float &f) {
 | 
			
		||||
    const long i = ((f < 0 ? -f : f) * 1000 + 5) / 10;
 | 
			
		||||
    conv[0] = RJDIGIT(i, 100000);
 | 
			
		||||
  // Convert unsigned float to string with 1234.5 format omitting trailing zeros
 | 
			
		||||
  char* ftostr51rj(const float &f) {
 | 
			
		||||
    const long i = ((f < 0 ? -f : f) * 100 + 5) / 10;
 | 
			
		||||
    conv[0] = ' ';
 | 
			
		||||
    conv[1] = RJDIGIT(i, 10000);
 | 
			
		||||
    conv[2] = RJDIGIT(i, 1000);
 | 
			
		||||
    conv[3] = DIGIMOD(i, 100);
 | 
			
		||||
    conv[4] = '.';
 | 
			
		||||
    conv[5] = DIGIMOD(i, 10);
 | 
			
		||||
    conv[3] = RJDIGIT(i, 100);
 | 
			
		||||
    conv[4] = DIGIMOD(i, 10);
 | 
			
		||||
    conv[5] = '.';
 | 
			
		||||
    conv[6] = DIGIMOD(i, 1);
 | 
			
		||||
    return conv;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -106,8 +106,8 @@ inline void serial_delay(const millis_t ms) {
 | 
			
		||||
  // Convert signed float to string with +123.45 format
 | 
			
		||||
  char* ftostr52sign(const float &x);
 | 
			
		||||
 | 
			
		||||
  // Convert unsigned float to string with 1234.56 format omitting trailing zeros
 | 
			
		||||
  char* ftostr62rj(const float &x);
 | 
			
		||||
  // Convert unsigned float to string with 1234.5 format omitting trailing zeros
 | 
			
		||||
  char* ftostr51rj(const float &x);
 | 
			
		||||
 | 
			
		||||
  // Convert float to rj string with 123 or -12 format
 | 
			
		||||
  FORCE_INLINE char* ftostr3(const float &x) { return i16tostr3(int16_t(x + (x < 0 ? -0.5f : 0.5f))); }
 | 
			
		||||
 
 | 
			
		||||
@@ -151,6 +151,12 @@ void PrintJobRecovery::save(const bool force/*=false*/, const bool save_queue/*=
 | 
			
		||||
 | 
			
		||||
    // Machine state
 | 
			
		||||
    COPY(info.current_position, current_position);
 | 
			
		||||
    #if HAS_HOME_OFFSET
 | 
			
		||||
      COPY(info.home_offset, home_offset);
 | 
			
		||||
    #endif
 | 
			
		||||
    #if HAS_POSITION_SHIFT
 | 
			
		||||
      COPY(info.position_shift, position_shift);
 | 
			
		||||
    #endif
 | 
			
		||||
    info.feedrate = uint16_t(feedrate_mm_s * 60.0f);
 | 
			
		||||
 | 
			
		||||
    #if HOTENDS > 1
 | 
			
		||||
@@ -187,7 +193,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const bool save_queue/*=
 | 
			
		||||
      info.retract_hop = fwretract.current_hop;
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    //relative mode
 | 
			
		||||
    // Relative mode
 | 
			
		||||
    info.relative_mode = relative_mode;
 | 
			
		||||
    info.relative_modes_e = gcode.axis_relative_modes[E_AXIS];
 | 
			
		||||
 | 
			
		||||
@@ -239,20 +245,30 @@ void PrintJobRecovery::resume() {
 | 
			
		||||
    gcode.process_subcommands_now_P(PSTR("M420 S0 Z0"));
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  // Set Z to 0, raise Z by 2mm, and Home (XY only for Cartesian) with no raise
 | 
			
		||||
  // (Only do simulated homing in Marlin Dev Mode.)
 | 
			
		||||
  gcode.process_subcommands_now_P(PSTR("G92.0 Z0\nG1 Z" STRINGIFY(RECOVERY_ZRAISE) "\nG28 R0"
 | 
			
		||||
    #if ENABLED(MARLIN_DEV_MODE)
 | 
			
		||||
      " S"
 | 
			
		||||
    #elif !IS_KINEMATIC
 | 
			
		||||
      " X Y"
 | 
			
		||||
  // Reset E, raise Z, home XY...
 | 
			
		||||
  gcode.process_subcommands_now_P(PSTR("G92.9 E0"
 | 
			
		||||
    #if Z_HOME_DIR > 0
 | 
			
		||||
      // If Z homing goes to max, reset E and home all
 | 
			
		||||
      "\nG28R0"
 | 
			
		||||
      #if ENABLED(MARLIN_DEV_MODE)
 | 
			
		||||
        "S"
 | 
			
		||||
      #endif
 | 
			
		||||
    #else
 | 
			
		||||
      // Set Z to 0, raise Z by RECOVERY_ZRAISE, and Home (XY only for Cartesian)
 | 
			
		||||
      // with no raise. (Only do simulated homing in Marlin Dev Mode.)
 | 
			
		||||
      "Z0\nG1Z" STRINGIFY(RECOVERY_ZRAISE) "\nG28R0"
 | 
			
		||||
      #if ENABLED(MARLIN_DEV_MODE)
 | 
			
		||||
        "S"
 | 
			
		||||
      #elif !IS_KINEMATIC
 | 
			
		||||
        "XY"
 | 
			
		||||
      #endif
 | 
			
		||||
    #endif
 | 
			
		||||
  ));
 | 
			
		||||
 | 
			
		||||
  // Pretend that all axes are homed
 | 
			
		||||
  axis_homed = axis_known_position = xyz_bits;
 | 
			
		||||
 | 
			
		||||
  char cmd[40], str_1[16], str_2[16];
 | 
			
		||||
  char cmd[50], str_1[16], str_2[16];
 | 
			
		||||
 | 
			
		||||
  // Select the previously active tool (with no_move)
 | 
			
		||||
  #if EXTRUDERS > 1
 | 
			
		||||
@@ -315,16 +331,16 @@ void PrintJobRecovery::resume() {
 | 
			
		||||
    memcpy(&mixer.gradient, &info.gradient, sizeof(info.gradient));
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  // Restore Z (plus raise) and E positions with G92.0
 | 
			
		||||
  dtostrf(info.current_position[Z_AXIS] + RECOVERY_ZRAISE, 1, 3, str_1);
 | 
			
		||||
  dtostrf(info.current_position[E_AXIS]
 | 
			
		||||
    #if ENABLED(SAVE_EACH_CMD_MODE)
 | 
			
		||||
      - 5 // Extra extrusion on restart
 | 
			
		||||
    #endif
 | 
			
		||||
    , 1, 3, str_2
 | 
			
		||||
  );
 | 
			
		||||
  sprintf_P(cmd, PSTR("G92.0 Z%s E%s"), str_1, str_2);
 | 
			
		||||
  gcode.process_subcommands_now(cmd);
 | 
			
		||||
  // Extrude and retract to clean the nozzle
 | 
			
		||||
  #if POWER_LOSS_PURGE_LEN
 | 
			
		||||
    //sprintf_P(cmd, PSTR("G1 E%d F200"), POWER_LOSS_PURGE_LEN);
 | 
			
		||||
    //gcode.process_subcommands_now(cmd);
 | 
			
		||||
    gcode.process_subcommands_now_P(PSTR("G1 E" STRINGIFY(POWER_LOSS_PURGE_LEN) " F200"));
 | 
			
		||||
  #endif
 | 
			
		||||
  #if POWER_LOSS_RETRACT_LEN
 | 
			
		||||
    sprintf_P(cmd, PSTR("G1 E%d F3000"), POWER_LOSS_PURGE_LEN - POWER_LOSS_RETRACT_LEN);
 | 
			
		||||
    gcode.process_subcommands_now(cmd);
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  // Move back to the saved XY
 | 
			
		||||
  dtostrf(info.current_position[X_AXIS], 1, 3, str_1);
 | 
			
		||||
@@ -337,13 +353,37 @@ void PrintJobRecovery::resume() {
 | 
			
		||||
  sprintf_P(cmd, PSTR("G1 Z%s F200"), str_1);
 | 
			
		||||
  gcode.process_subcommands_now(cmd);
 | 
			
		||||
 | 
			
		||||
  // Un-retract
 | 
			
		||||
  #if POWER_LOSS_PURGE_LEN
 | 
			
		||||
    //sprintf_P(cmd, PSTR("G1 E%d F3000"), POWER_LOSS_PURGE_LEN);
 | 
			
		||||
    //gcode.process_subcommands_now(cmd);
 | 
			
		||||
    gcode.process_subcommands_now_P(PSTR("G1 E" STRINGIFY(POWER_LOSS_PURGE_LEN) " F3000"));
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  // Restore the feedrate
 | 
			
		||||
  sprintf_P(cmd, PSTR("G1 F%d"), info.feedrate);
 | 
			
		||||
  gcode.process_subcommands_now(cmd);
 | 
			
		||||
 | 
			
		||||
  //relative mode
 | 
			
		||||
  if (info.relative_mode) relative_mode = true;
 | 
			
		||||
  if (info.relative_modes_e) gcode.axis_relative_modes[E_AXIS] = true;
 | 
			
		||||
  // Restore E position with G92.9
 | 
			
		||||
  dtostrf(info.current_position[E_AXIS], 1, 3, str_1);
 | 
			
		||||
  sprintf_P(cmd, PSTR("G92.9 E%s"), str_1);
 | 
			
		||||
  gcode.process_subcommands_now(cmd);
 | 
			
		||||
 | 
			
		||||
  // Relative mode
 | 
			
		||||
  relative_mode = info.relative_mode;
 | 
			
		||||
  gcode.axis_relative_modes[E_AXIS] = info.relative_modes_e;
 | 
			
		||||
 | 
			
		||||
  #if HAS_HOME_OFFSET || HAS_POSITION_SHIFT
 | 
			
		||||
    LOOP_XYZ(i) {
 | 
			
		||||
      #if HAS_HOME_OFFSET
 | 
			
		||||
        home_offset[i] = info.home_offset[i];
 | 
			
		||||
      #endif
 | 
			
		||||
      #if HAS_POSITION_SHIFT
 | 
			
		||||
        position_shift[i] = info.position_shift[i];
 | 
			
		||||
      #endif
 | 
			
		||||
      update_workspace_offset((AxisEnum)i);
 | 
			
		||||
    }
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  // Process commands from the old pending queue
 | 
			
		||||
  uint8_t c = info.commands_in_queue, r = info.cmd_queue_index_r;
 | 
			
		||||
@@ -372,6 +412,25 @@ void PrintJobRecovery::resume() {
 | 
			
		||||
          DEBUG_ECHO(info.current_position[i]);
 | 
			
		||||
        }
 | 
			
		||||
        DEBUG_EOL();
 | 
			
		||||
 | 
			
		||||
        #if HAS_HOME_OFFSET
 | 
			
		||||
          DEBUG_ECHOPGM("home_offset: ");
 | 
			
		||||
          LOOP_XYZ(i) {
 | 
			
		||||
            if (i) DEBUG_CHAR(',');
 | 
			
		||||
            DEBUG_ECHO(info.home_offset[i]);
 | 
			
		||||
          }
 | 
			
		||||
          DEBUG_EOL();
 | 
			
		||||
        #endif
 | 
			
		||||
 | 
			
		||||
        #if HAS_POSITION_SHIFT
 | 
			
		||||
          DEBUG_ECHOPGM("position_shift: ");
 | 
			
		||||
          LOOP_XYZ(i) {
 | 
			
		||||
            if (i) DEBUG_CHAR(',');
 | 
			
		||||
            DEBUG_ECHO(info.position_shift[i]);
 | 
			
		||||
          }
 | 
			
		||||
          DEBUG_EOL();
 | 
			
		||||
        #endif
 | 
			
		||||
 | 
			
		||||
        DEBUG_ECHOLNPAIR("feedrate: ", info.feedrate);
 | 
			
		||||
 | 
			
		||||
        #if HOTENDS > 1
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,8 @@
 | 
			
		||||
#define SAVE_INFO_INTERVAL_MS 0
 | 
			
		||||
//#define SAVE_EACH_CMD_MODE
 | 
			
		||||
//#define DEBUG_POWER_LOSS_RECOVERY
 | 
			
		||||
#define POWER_LOSS_PURGE_LEN 20
 | 
			
		||||
#define POWER_LOSS_RETRACT_LEN 10
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  uint8_t valid_head;
 | 
			
		||||
@@ -42,6 +44,13 @@ typedef struct {
 | 
			
		||||
  // Machine state
 | 
			
		||||
  float current_position[NUM_AXIS];
 | 
			
		||||
 | 
			
		||||
  #if HAS_HOME_OFFSET
 | 
			
		||||
    float home_offset[XYZ];
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_POSITION_SHIFT
 | 
			
		||||
    float position_shift[XYZ];
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  uint16_t feedrate;
 | 
			
		||||
 | 
			
		||||
  #if HOTENDS > 1
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,9 @@ inline void delay_for_power_down() { safe_delay(SPINDLE_LASER_POWERDOWN_DELAY);
 | 
			
		||||
 | 
			
		||||
inline void set_spindle_laser_ocr(const uint8_t ocr) {
 | 
			
		||||
  WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ENABLE_INVERT); // turn spindle on (active low)
 | 
			
		||||
  analogWrite(SPINDLE_LASER_PWM_PIN, (SPINDLE_LASER_PWM_INVERT) ? 255 - ocr : ocr);
 | 
			
		||||
  #if ENABLED(SPINDLE_LASER_PWM)
 | 
			
		||||
    analogWrite(SPINDLE_LASER_PWM_PIN, (SPINDLE_LASER_PWM_INVERT) ? 255 - ocr : ocr);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if ENABLED(SPINDLE_LASER_PWM)
 | 
			
		||||
 
 | 
			
		||||
@@ -33,9 +33,23 @@
 | 
			
		||||
 */
 | 
			
		||||
void GcodeSuite::G92() {
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(CNC_COORDINATE_SYSTEMS)
 | 
			
		||||
    switch (parser.subcode) {
 | 
			
		||||
      case 1:
 | 
			
		||||
  bool didE = false;
 | 
			
		||||
  #if IS_SCARA || !HAS_POSITION_SHIFT
 | 
			
		||||
    bool didXYZ = false;
 | 
			
		||||
  #else
 | 
			
		||||
    constexpr bool didXYZ = false;
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if USE_GCODE_SUBCODES
 | 
			
		||||
    const uint8_t subcode_G92 = parser.subcode;
 | 
			
		||||
  #else
 | 
			
		||||
    constexpr uint8_t subcode_G92 = 0;
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  switch (subcode_G92) {
 | 
			
		||||
    default: break;
 | 
			
		||||
    #if ENABLED(CNC_COORDINATE_SYSTEMS)
 | 
			
		||||
      case 1: {
 | 
			
		||||
        // Zero the G92 values and restore current position
 | 
			
		||||
        #if !IS_SCARA
 | 
			
		||||
          LOOP_XYZ(i) {
 | 
			
		||||
@@ -46,44 +60,46 @@ void GcodeSuite::G92() {
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        #endif // Not SCARA
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(CNC_COORDINATE_SYSTEMS)
 | 
			
		||||
    #define IS_G92_0 (parser.subcode == 0)
 | 
			
		||||
  #else
 | 
			
		||||
    #define IS_G92_0 true
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  bool didE = false;
 | 
			
		||||
  #if IS_SCARA || !HAS_POSITION_SHIFT
 | 
			
		||||
    bool didXYZ = false;
 | 
			
		||||
  #else
 | 
			
		||||
    constexpr bool didXYZ = false;
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  if (IS_G92_0) LOOP_XYZE(i) {
 | 
			
		||||
    if (parser.seenval(axis_codes[i])) {
 | 
			
		||||
      const float l = parser.value_axis_units((AxisEnum)i),
 | 
			
		||||
                  v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i),
 | 
			
		||||
                  d = v - current_position[i];
 | 
			
		||||
      if (!NEAR_ZERO(d)) {
 | 
			
		||||
        #if IS_SCARA || !HAS_POSITION_SHIFT
 | 
			
		||||
          if (i == E_AXIS) didE = true; else didXYZ = true;
 | 
			
		||||
          current_position[i] = v;        // Without workspaces revert to Marlin 1.0 behavior
 | 
			
		||||
        #elif HAS_POSITION_SHIFT
 | 
			
		||||
          if (i == E_AXIS) {
 | 
			
		||||
            didE = true;
 | 
			
		||||
            current_position[E_AXIS] = v; // When using coordinate spaces, only E is set directly
 | 
			
		||||
      } return;
 | 
			
		||||
    #endif
 | 
			
		||||
    #if ENABLED(POWER_LOSS_RECOVERY)
 | 
			
		||||
      case 9: {
 | 
			
		||||
        LOOP_XYZE(i) {
 | 
			
		||||
          if (parser.seenval(axis_codes[i])) {
 | 
			
		||||
            current_position[i] = parser.value_axis_units((AxisEnum)i);
 | 
			
		||||
            #if IS_SCARA || !HAS_POSITION_SHIFT
 | 
			
		||||
              if (i == E_AXIS) didE = true; else didXYZ = true;
 | 
			
		||||
            #elif HAS_POSITION_SHIFT
 | 
			
		||||
              if (i == E_AXIS) didE = true;
 | 
			
		||||
            #endif
 | 
			
		||||
          }
 | 
			
		||||
          else {
 | 
			
		||||
            position_shift[i] += d;       // Other axes simply offset the coordinate space
 | 
			
		||||
            update_workspace_offset((AxisEnum)i);
 | 
			
		||||
        }
 | 
			
		||||
      } break;
 | 
			
		||||
    #endif
 | 
			
		||||
    case 0: {
 | 
			
		||||
      LOOP_XYZE(i) {
 | 
			
		||||
        if (parser.seenval(axis_codes[i])) {
 | 
			
		||||
          const float l = parser.value_axis_units((AxisEnum)i),
 | 
			
		||||
                      v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i),
 | 
			
		||||
                      d = v - current_position[i];
 | 
			
		||||
          if (!NEAR_ZERO(d)) {
 | 
			
		||||
            #if IS_SCARA || !HAS_POSITION_SHIFT
 | 
			
		||||
              if (i == E_AXIS) didE = true; else didXYZ = true;
 | 
			
		||||
              current_position[i] = v;        // Without workspaces revert to Marlin 1.0 behavior
 | 
			
		||||
            #elif HAS_POSITION_SHIFT
 | 
			
		||||
              if (i == E_AXIS) {
 | 
			
		||||
                didE = true;
 | 
			
		||||
                current_position[E_AXIS] = v; // When using coordinate spaces, only E is set directly
 | 
			
		||||
              }
 | 
			
		||||
              else {
 | 
			
		||||
                position_shift[i] += d;       // Other axes simply offset the coordinate space
 | 
			
		||||
                update_workspace_offset((AxisEnum)i);
 | 
			
		||||
              }
 | 
			
		||||
            #endif
 | 
			
		||||
          }
 | 
			
		||||
        #endif
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    } break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(CNC_COORDINATE_SYSTEMS)
 | 
			
		||||
 
 | 
			
		||||
@@ -526,8 +526,9 @@ void gcode_line_error(PGM_P const err, const int8_t port) {
 | 
			
		||||
 | 
			
		||||
#endif // BINARY_FILE_TRANSFER
 | 
			
		||||
 | 
			
		||||
FORCE_INLINE bool is_M29(const char * const cmd) {
 | 
			
		||||
  return cmd[0] == 'M' && cmd[1] == '2' && cmd[2] == '9' && !WITHIN(cmd[3], '0', '9');
 | 
			
		||||
FORCE_INLINE bool is_M29(const char * const cmd) {  // matches "M29" & "M29 ", but not "M290", etc
 | 
			
		||||
  const char * const m29 = strstr_P(cmd, PSTR("M29"));
 | 
			
		||||
  return m29 && !NUMERIC(m29[3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -31,9 +31,6 @@
 | 
			
		||||
 * M23: Open a file
 | 
			
		||||
 */
 | 
			
		||||
void GcodeSuite::M23() {
 | 
			
		||||
  #if ENABLED(POWER_LOSS_RECOVERY)
 | 
			
		||||
    card.removeJobRecoveryFile();
 | 
			
		||||
  #endif
 | 
			
		||||
  // Simplify3D includes the size, so zero out all spaces (#7227)
 | 
			
		||||
  for (char *fn = parser.string_arg; *fn; ++fn) if (*fn == ' ') *fn = '\0';
 | 
			
		||||
  card.openFile(parser.string_arg, true);
 | 
			
		||||
 
 | 
			
		||||
@@ -143,6 +143,8 @@
 | 
			
		||||
 | 
			
		||||
  #define DOGLCD
 | 
			
		||||
  #define ULTIPANEL
 | 
			
		||||
  #define LCD_CONTRAST_MIN 0
 | 
			
		||||
  #define LCD_CONTRAST_MAX 255
 | 
			
		||||
  #define DEFAULT_LCD_CONTRAST 255
 | 
			
		||||
  #define LED_COLORS_REDUCE_GREEN
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -517,7 +517,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
 | 
			
		||||
    else {
 | 
			
		||||
      #if DISABLED(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING)
 | 
			
		||||
        if (!TEST(axis_known_position, axis))
 | 
			
		||||
          lcd_put_u8str_P(axis == Z_AXIS ? PSTR("      ") : PSTR("    "));
 | 
			
		||||
          lcd_put_u8str_P(axis == Z_AXIS ? PSTR("       ") : PSTR("    "));
 | 
			
		||||
        else
 | 
			
		||||
      #endif
 | 
			
		||||
          lcd_put_u8str(value);
 | 
			
		||||
 
 | 
			
		||||
@@ -245,7 +245,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
 | 
			
		||||
    else {
 | 
			
		||||
      #if DISABLED(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING)
 | 
			
		||||
        if (!TEST(axis_known_position, axis))
 | 
			
		||||
          lcd_put_u8str_P(axis == Z_AXIS ? PSTR("      ") : PSTR("    "));
 | 
			
		||||
          lcd_put_u8str_P(axis == Z_AXIS ? PSTR("       ") : PSTR("    "));
 | 
			
		||||
        else
 | 
			
		||||
      #endif
 | 
			
		||||
          lcd_put_u8str(value);
 | 
			
		||||
 
 | 
			
		||||
@@ -112,7 +112,11 @@
 | 
			
		||||
  //#define U8G_CLASS U8GLIB_MINI12864
 | 
			
		||||
  //#define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 8 stripes
 | 
			
		||||
  #define U8G_CLASS U8GLIB_MINI12864_2X
 | 
			
		||||
  #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                              // 4 stripes
 | 
			
		||||
  #if EITHER(FYSETC_MINI_12864, TARGET_LPC1768)
 | 
			
		||||
    #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0   // 4 stripes SW-SPI
 | 
			
		||||
  #else
 | 
			
		||||
    #define U8G_PARAM DOGLCD_CS, DOGLCD_A0                            // 4 stripes HW-SPI
 | 
			
		||||
  #endif
 | 
			
		||||
#elif ENABLED(U8GLIB_SH1106_EINSTART)
 | 
			
		||||
  // Connected via motherboard header
 | 
			
		||||
  #define U8G_CLASS U8GLIB_SH1106_128X64
 | 
			
		||||
 
 | 
			
		||||
@@ -35,15 +35,20 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define DISPLAY_CHARSET_ISO10646_CZ
 | 
			
		||||
#define THIS_LANGUAGES_SPECIAL_SYMBOLS      _UxGT("áÁčČďĎéÉěĚíÍňŇóÓřŘšŠťŤúÚůŮýÝžŽ³")
 | 
			
		||||
#define CHARSIZE 2
 | 
			
		||||
 | 
			
		||||
#define WELCOME_MSG                         MACHINE_NAME _UxGT(" připraven.")
 | 
			
		||||
#define MSG_YES                             _UxGT("ANO")
 | 
			
		||||
#define MSG_NO                              _UxGT("NE")
 | 
			
		||||
#define MSG_BACK                            _UxGT("Zpět")
 | 
			
		||||
#define MSG_SD_INSERTED                     _UxGT("Karta vložena")
 | 
			
		||||
#define MSG_SD_REMOVED                      _UxGT("Karta vyjmuta")
 | 
			
		||||
#define MSG_LCD_ENDSTOPS                    _UxGT("Endstopy") // max 8 znaku
 | 
			
		||||
#define MSG_LCD_SOFT_ENDSTOPS               _UxGT("Soft Endstopy")
 | 
			
		||||
#define MSG_MAIN                            _UxGT("Hlavní nabídka")
 | 
			
		||||
#define MSG_ADVANCED_SETTINGS               _UxGT("Další nastavení")
 | 
			
		||||
#define MSG_CONFIGURATION                   _UxGT("Konfigurace")
 | 
			
		||||
#define MSG_AUTOSTART                       _UxGT("Autostart")
 | 
			
		||||
#define MSG_DISABLE_STEPPERS                _UxGT("Uvolnit motory")
 | 
			
		||||
#define MSG_DEBUG_MENU                      _UxGT("Nabídka ladění")
 | 
			
		||||
@@ -56,6 +61,7 @@
 | 
			
		||||
#define MSG_AUTO_HOME_X                     _UxGT("Domů osa X")
 | 
			
		||||
#define MSG_AUTO_HOME_Y                     _UxGT("Domů osa Y")
 | 
			
		||||
#define MSG_AUTO_HOME_Z                     _UxGT("Domů osa Z")
 | 
			
		||||
#define MSG_AUTO_Z_ALIGN                    _UxGT("Auto srovnání Z")
 | 
			
		||||
#define MSG_LEVEL_BED_HOMING                _UxGT("Měření podložky")
 | 
			
		||||
#define MSG_LEVEL_BED_WAITING               _UxGT("Kliknutím spusťte")
 | 
			
		||||
#define MSG_LEVEL_BED_NEXT_POINT            _UxGT("Další bod")
 | 
			
		||||
@@ -76,7 +82,13 @@
 | 
			
		||||
#define MSG_PREHEAT_2_END                   MSG_PREHEAT_2 _UxGT(" hotend")
 | 
			
		||||
#define MSG_PREHEAT_2_BEDONLY               MSG_PREHEAT_2 _UxGT(" podlož")
 | 
			
		||||
#define MSG_PREHEAT_2_SETTINGS              MSG_PREHEAT_2 _UxGT(" nast")
 | 
			
		||||
#define MSG_PREHEAT_CUSTOM                  _UxGT("Zahřát vlastní")
 | 
			
		||||
#define MSG_COOLDOWN                        _UxGT("Zchladit")
 | 
			
		||||
#define MSG_LASER_MENU                      _UxGT("Ovládání laseru")
 | 
			
		||||
#define MSG_LASER_OFF                       _UxGT("Vypnout laser")
 | 
			
		||||
#define MSG_LASER_ON                        _UxGT("Zapnout laser")
 | 
			
		||||
#define MSG_LASER_POWER                     _UxGT("Výkon laseru")
 | 
			
		||||
#define MSG_SPINDLE_REVERSE                 _UxGT("Vřeteno opačně")
 | 
			
		||||
#define MSG_SWITCH_PS_ON                    _UxGT("Zapnout napájení")
 | 
			
		||||
#define MSG_SWITCH_PS_OFF                   _UxGT("Vypnout napájení")
 | 
			
		||||
#define MSG_EXTRUDE                         _UxGT("Vytlačit (extr.)")
 | 
			
		||||
@@ -88,10 +100,23 @@
 | 
			
		||||
#define MSG_NEXT_CORNER                     _UxGT("Další roh")
 | 
			
		||||
#define MSG_EDITING_STOPPED                 _UxGT("Konec úprav sítě")
 | 
			
		||||
 | 
			
		||||
#define MSG_MESH_X                          _UxGT("Index X")
 | 
			
		||||
#define MSG_MESH_Y                          _UxGT("Index Y")
 | 
			
		||||
#define MSG_MESH_EDIT_Z                     _UxGT("Hodnota Z")
 | 
			
		||||
#define MSG_USER_MENU                       _UxGT("Vlastní příkazy")
 | 
			
		||||
#define MSG_UBL_DOING_G29                   _UxGT("Provádím G29")
 | 
			
		||||
#define MSG_UBL_UNHOMED                     _UxGT("Přejeďte domů")
 | 
			
		||||
#define MSG_UBL_TOOLS                       _UxGT("UBL nástroje")
 | 
			
		||||
#define MSG_UBL_LEVEL_BED                   _UxGT("Unified Bed Leveling")
 | 
			
		||||
#define MSG_IDEX_MENU                       _UxGT("Režim IDEX")
 | 
			
		||||
#define MSG_OFFSETS_MENU                    _UxGT("Ofsety nástrojů")
 | 
			
		||||
#define MSG_IDEX_MODE_AUTOPARK              _UxGT("Auto-Park")
 | 
			
		||||
#define MSG_IDEX_MODE_DUPLICATE             _UxGT("Duplikace")
 | 
			
		||||
#define MSG_IDEX_MODE_MIRRORED_COPY         _UxGT("Zrcadlení")
 | 
			
		||||
#define MSG_IDEX_MODE_FULL_CTRL             _UxGT("Plná kontrola")
 | 
			
		||||
#define MSG_X_OFFSET                        _UxGT("2. tryska X")
 | 
			
		||||
#define MSG_Y_OFFSET                        _UxGT("2. tryska Y")
 | 
			
		||||
#define MSG_Z_OFFSET                        _UxGT("2. tryska Z")
 | 
			
		||||
#define MSG_UBL_MANUAL_MESH                 _UxGT("Manuální síť bodů")
 | 
			
		||||
#define MSG_UBL_BC_INSERT                   _UxGT("Vložte kartu, změřte")
 | 
			
		||||
#define MSG_UBL_BC_INSERT2                  _UxGT("Změřte")
 | 
			
		||||
@@ -169,7 +194,6 @@
 | 
			
		||||
#define MSG_INTENSITY_B                     _UxGT("Modrá intenzita")
 | 
			
		||||
#define MSG_INTENSITY_W                     _UxGT("Bílá intenzita")
 | 
			
		||||
#define MSG_LED_BRIGHTNESS                  _UxGT("Jas")
 | 
			
		||||
#define MSG_USER_MENU                       _UxGT("Vlastní příkazy")
 | 
			
		||||
 | 
			
		||||
#define MSG_MOVING                          _UxGT("Posouvání...")
 | 
			
		||||
#define MSG_FREE_XY                         _UxGT("Uvolnit XY")
 | 
			
		||||
@@ -177,6 +201,7 @@
 | 
			
		||||
#define MSG_MOVE_Y                          _UxGT("Posunout Y")
 | 
			
		||||
#define MSG_MOVE_Z                          _UxGT("Posunout Z")
 | 
			
		||||
#define MSG_MOVE_E                          _UxGT("Extrudér")
 | 
			
		||||
#define MSG_HOTEND_TOO_COLD                 _UxGT("Hotend je studený")
 | 
			
		||||
#define MSG_MOVE_01MM                       _UxGT("Posunout o 0,1mm")
 | 
			
		||||
#define MSG_MOVE_1MM                        _UxGT("Posunout o 1mm")
 | 
			
		||||
#define MSG_MOVE_10MM                       _UxGT("Posunout o 10mm")
 | 
			
		||||
@@ -184,6 +209,7 @@
 | 
			
		||||
#define MSG_BED_Z                           _UxGT("Výška podl.")
 | 
			
		||||
#define MSG_NOZZLE                          _UxGT("Tryska")
 | 
			
		||||
#define MSG_BED                             _UxGT("Podložka")
 | 
			
		||||
#define MSG_CHAMBER                         _UxGT("Komora")
 | 
			
		||||
#define MSG_FAN_SPEED                       _UxGT("Rychlost vent.")
 | 
			
		||||
#define MSG_EXTRA_FAN_SPEED                 _UxGT("Rychlost ex. vent.")
 | 
			
		||||
#define MSG_FLOW                            _UxGT("Průtok")
 | 
			
		||||
@@ -250,10 +276,15 @@
 | 
			
		||||
#define MSG_LOAD_EEPROM                     _UxGT("Načíst nastavení")
 | 
			
		||||
#define MSG_RESTORE_FAILSAFE                _UxGT("Obnovit výchozí")
 | 
			
		||||
#define MSG_INIT_EEPROM                     _UxGT("Inic. EEPROM")
 | 
			
		||||
#define MSG_SD_UPDATE                       _UxGT("Aktualizace z SD")
 | 
			
		||||
#define MSG_RESET_PRINTER                   _UxGT("Reset tiskárny")
 | 
			
		||||
#define MSG_REFRESH                         _UxGT("Obnovit")
 | 
			
		||||
#define MSG_WATCH                           _UxGT("Info obrazovka")
 | 
			
		||||
#define MSG_PREPARE                         _UxGT("Připrava tisku")
 | 
			
		||||
#define MSG_TUNE                            _UxGT("Doladění tisku")
 | 
			
		||||
#define MSG_START_PRINT                     _UxGT("Spustit tisk")
 | 
			
		||||
#define MSG_BUTTON_PRINT                    _UxGT("Tisk")
 | 
			
		||||
#define MSG_BUTTON_CANCEL                   _UxGT("Zrušit")
 | 
			
		||||
#define MSG_PAUSE_PRINT                     _UxGT("Pozastavit tisk")
 | 
			
		||||
#define MSG_RESUME_PRINT                    _UxGT("Obnovit tisk")
 | 
			
		||||
#define MSG_STOP_PRINT                      _UxGT("Zastavit tisk")
 | 
			
		||||
@@ -277,6 +308,12 @@
 | 
			
		||||
#define MSG_CONTROL_RETRACT_RECOVERF        _UxGT("UnRet  V")
 | 
			
		||||
#define MSG_CONTROL_RETRACT_RECOVER_SWAPF   _UxGT("S UnRet V")
 | 
			
		||||
#define MSG_AUTORETRACT                     _UxGT("AutoRetr.")
 | 
			
		||||
#define MSG_FILAMENT_SWAP_LENGTH            _UxGT("Délka retrakce")
 | 
			
		||||
#define MSG_TOOL_CHANGE                     _UxGT("Výměna nástroje")
 | 
			
		||||
#define MSG_TOOL_CHANGE_ZLIFT               _UxGT("Zdvih Z")
 | 
			
		||||
#define MSG_SINGLENOZZLE_PRIME_SPD          _UxGT("Rychlost primár.")
 | 
			
		||||
#define MSG_SINGLENOZZLE_RETRACT_SPD        _UxGT("Rychlost retrak.")
 | 
			
		||||
#define MSG_NOZZLE_STANDBY                  _UxGT("Tryska standby")
 | 
			
		||||
#define MSG_FILAMENTCHANGE                  _UxGT("Vyměnit filament")
 | 
			
		||||
#define MSG_FILAMENTLOAD                    _UxGT("Zavést filament")
 | 
			
		||||
#define MSG_FILAMENTUNLOAD                  _UxGT("Vysunout filament")
 | 
			
		||||
@@ -287,16 +324,22 @@
 | 
			
		||||
#define MSG_ZPROBE_OUT                      _UxGT("Sonda Z mimo podl")
 | 
			
		||||
#define MSG_SKEW_FACTOR                     _UxGT("Faktor zkosení")
 | 
			
		||||
#define MSG_BLTOUCH                         _UxGT("BLTouch")
 | 
			
		||||
#define MSG_BLTOUCH_SELFTEST                _UxGT("BLTouch Self-Test")
 | 
			
		||||
#define MSG_BLTOUCH_RESET                   _UxGT("BLTouch Reset")
 | 
			
		||||
#define MSG_BLTOUCH_DEPLOY                  _UxGT("BLTouch Vysunout")
 | 
			
		||||
#define MSG_BLTOUCH_STOW                    _UxGT("BLTouch Zasunout")
 | 
			
		||||
#define MSG_BLTOUCH_SELFTEST                _UxGT("BLTouch self-test")
 | 
			
		||||
#define MSG_BLTOUCH_RESET                   _UxGT("BLTouch reset")
 | 
			
		||||
#define MSG_BLTOUCH_DEPLOY                  _UxGT("BLTouch vysunout")
 | 
			
		||||
#define MSG_BLTOUCH_SW_MODE                 _UxGT("SW výsun BLTouch")
 | 
			
		||||
#define MSG_BLTOUCH_5V_MODE                 _UxGT("BLTouch 5V režim")
 | 
			
		||||
#define MSG_BLTOUCH_OD_MODE                 _UxGT("BLTouch OD režim")
 | 
			
		||||
#define MSG_BLTOUCH_STOW                    _UxGT("BLTouch zasunout")
 | 
			
		||||
#define MSG_MANUAL_DEPLOY                   _UxGT("Vysunout Z-sondu")
 | 
			
		||||
#define MSG_MANUAL_STOW                     _UxGT("Zasunout Z-sondu")
 | 
			
		||||
#define MSG_HOME                            _UxGT("Domů")  // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST
 | 
			
		||||
#define MSG_FIRST                           _UxGT("první")
 | 
			
		||||
#define MSG_ZPROBE_ZOFFSET                  _UxGT("Z ofset")
 | 
			
		||||
#define MSG_BABYSTEP_X                      _UxGT("Babystep X")
 | 
			
		||||
#define MSG_BABYSTEP_Y                      _UxGT("Babystep Y")
 | 
			
		||||
#define MSG_BABYSTEP_Z                      _UxGT("Babystep Z")
 | 
			
		||||
#define MSG_BABYSTEP_TOTAL                  _UxGT("Celkem")
 | 
			
		||||
#define MSG_ENDSTOP_ABORT                   _UxGT("Endstop abort")
 | 
			
		||||
#define MSG_HEATING_FAILED_LCD              _UxGT("Chyba zahřívání")
 | 
			
		||||
#define MSG_HEATING_FAILED_LCD_BED          _UxGT("Chyba zahř.podl.")
 | 
			
		||||
@@ -307,6 +350,8 @@
 | 
			
		||||
#define MSG_ERR_MINTEMP                     _UxGT("NÍZKA TEPLOTA")
 | 
			
		||||
#define MSG_ERR_MAXTEMP_BED                 _UxGT("VYS. TEPL. PODL.")
 | 
			
		||||
#define MSG_ERR_MINTEMP_BED                 _UxGT("NÍZ. TEPL. PODL.")
 | 
			
		||||
#define MSG_ERR_MAXTEMP_CHAMBER             _UxGT("Err: MAXTEMP KOMORA")
 | 
			
		||||
#define MSG_ERR_MINTEMP_CHAMBER             _UxGT("Err: MINTEMP KOMORA")
 | 
			
		||||
#define MSG_ERR_Z_HOMING                    MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST
 | 
			
		||||
#define MSG_HALTED                          _UxGT("TISK. ZASTAVENA")
 | 
			
		||||
#define MSG_PLEASE_RESET                    _UxGT("Proveďte reset")
 | 
			
		||||
@@ -380,18 +425,82 @@
 | 
			
		||||
#define MSG_FILAMENT_CHANGE_OPTION_PURGE    _UxGT("Vytlačit víc")
 | 
			
		||||
#define MSG_FILAMENT_CHANGE_OPTION_RESUME   _UxGT("Obnovit tisk")
 | 
			
		||||
#define MSG_FILAMENT_CHANGE_NOZZLE          _UxGT("  Tryska: ")
 | 
			
		||||
#define MSG_RUNOUT_SENSOR                   _UxGT("Senzor filamentu")
 | 
			
		||||
#define MSG_ERR_HOMING_FAILED               _UxGT("Parkování selhalo")
 | 
			
		||||
#define MSG_ERR_PROBING_FAILED              _UxGT("Kalibrace selhala")
 | 
			
		||||
#define MSG_M600_TOO_COLD                   _UxGT("M600: Moc studený")
 | 
			
		||||
 | 
			
		||||
#define MSG_MMU2_FILAMENT_CHANGE_HEADER     _UxGT("VÝMĚNA FILAMENTU")
 | 
			
		||||
#define MSG_MMU2_CHOOSE_FILAMENT_HEADER     _UxGT("VYBERTE FILAMENT")
 | 
			
		||||
#define MSG_MMU2_MENU                       _UxGT("MMU")
 | 
			
		||||
#define MSG_MMU2_WRONG_FIRMWARE             _UxGT("Aktual. MMU firmware!")
 | 
			
		||||
#define MSG_MMU2_NOT_RESPONDING             _UxGT("MMU potř. pozornost.")
 | 
			
		||||
#define MSG_MMU2_RESUME                     _UxGT("Obnovit tisk")
 | 
			
		||||
#define MSG_MMU2_RESUMING                   _UxGT("Obnovování...")
 | 
			
		||||
#define MSG_MMU2_LOAD_FILAMENT              _UxGT("Zavést filament")
 | 
			
		||||
#define MSG_MMU2_LOAD_ALL                   _UxGT("Zavést všechny")
 | 
			
		||||
#define MSG_MMU2_LOAD_TO_NOZZLE             _UxGT("Zavést do trysky")
 | 
			
		||||
#define MSG_MMU2_EJECT_FILAMENT             _UxGT("Vysunout filament")
 | 
			
		||||
#define MSG_MMU2_EJECT_FILAMENT0            _UxGT("Vysun. filament 1")
 | 
			
		||||
#define MSG_MMU2_EJECT_FILAMENT1            _UxGT("Vysun. filament 2")
 | 
			
		||||
#define MSG_MMU2_EJECT_FILAMENT2            _UxGT("Vysun. filament 3")
 | 
			
		||||
#define MSG_MMU2_EJECT_FILAMENT3            _UxGT("Vysun. filament 4")
 | 
			
		||||
#define MSG_MMU2_EJECT_FILAMENT4            _UxGT("Vysun. filament 5")
 | 
			
		||||
#define MSG_MMU2_UNLOAD_FILAMENT            _UxGT("Vytáhnout filament")
 | 
			
		||||
#define MSG_MMU2_LOADING_FILAMENT           _UxGT("Zavádění fil. %i...")
 | 
			
		||||
#define MSG_MMU2_EJECTING_FILAMENT          _UxGT("Vytahování fil. ...")
 | 
			
		||||
#define MSG_MMU2_UNLOADING_FILAMENT         _UxGT("Vysouvání fil....")
 | 
			
		||||
#define MSG_MMU2_ALL                        _UxGT("Všechny")
 | 
			
		||||
#define MSG_MMU2_FILAMENT0                  _UxGT("Filament 1")
 | 
			
		||||
#define MSG_MMU2_FILAMENT1                  _UxGT("Filament 2")
 | 
			
		||||
#define MSG_MMU2_FILAMENT2                  _UxGT("Filament 3")
 | 
			
		||||
#define MSG_MMU2_FILAMENT3                  _UxGT("Filament 4")
 | 
			
		||||
#define MSG_MMU2_FILAMENT4                  _UxGT("Filament 5")
 | 
			
		||||
#define MSG_MMU2_RESET                      _UxGT("Resetovat MMU")
 | 
			
		||||
#define MSG_MMU2_RESETTING                  _UxGT("Resetování MMU...")
 | 
			
		||||
#define MSG_MMU2_EJECT_RECOVER              _UxGT("Vytáhněte, klikněte")
 | 
			
		||||
 | 
			
		||||
#define MSG_MIX                             _UxGT("Mix")
 | 
			
		||||
#define MSG_MIX_COMPONENT                   _UxGT("Komponenta")
 | 
			
		||||
#define MSG_MIXER                           _UxGT("Mixér")
 | 
			
		||||
#define MSG_GRADIENT                        _UxGT("Přechod")
 | 
			
		||||
#define MSG_FULL_GRADIENT                   _UxGT("Celý přechod")
 | 
			
		||||
#define MSG_TOGGLE_MIX                      _UxGT("Přepnout mix")
 | 
			
		||||
#define MSG_CYCLE_MIX                       _UxGT("Střídat mix")
 | 
			
		||||
#define MSG_GRADIENT_MIX                    _UxGT("Přechod mix")
 | 
			
		||||
#define MSG_REVERSE_GRADIENT                _UxGT("Opačný přechod")
 | 
			
		||||
#if LCD_WIDTH >= 20
 | 
			
		||||
  #define MSG_ACTIVE_VTOOL                    _UxGT("Aktivní V-nástroj")
 | 
			
		||||
  #define MSG_START_VTOOL                     _UxGT("Spustit V-nástroj")
 | 
			
		||||
  #define MSG_END_VTOOL                       _UxGT("Ukončit V-nástroj")
 | 
			
		||||
  #define MSG_GRADIENT_ALIAS                  _UxGT("Alias V-nástroje")
 | 
			
		||||
  #define MSG_RESET_VTOOLS                    _UxGT("Resetovat V-nástroj")
 | 
			
		||||
  #define MSG_COMMIT_VTOOL                    _UxGT("Uložit V-nástroj mix")
 | 
			
		||||
  #define MSG_VTOOLS_RESET                    _UxGT("V-nástroj resetovat")
 | 
			
		||||
#else
 | 
			
		||||
  #define MSG_ACTIVE_VTOOL                    _UxGT("Aktivní V-nástr.")
 | 
			
		||||
  #define MSG_START_VTOOL                     _UxGT("Spustit V-nástr.")
 | 
			
		||||
  #define MSG_END_VTOOL                       _UxGT("Ukončit V-nástr.")
 | 
			
		||||
  #define MSG_GRADIENT_ALIAS                  _UxGT("Alias V-nástr.")
 | 
			
		||||
  #define MSG_RESET_VTOOLS                    _UxGT("Reset. V-nástr.")
 | 
			
		||||
  #define MSG_COMMIT_VTOOL                    _UxGT("Uložit V-nás. mix")
 | 
			
		||||
  #define MSG_VTOOLS_RESET                    _UxGT("V-nástr. reset.")
 | 
			
		||||
#endif
 | 
			
		||||
#define MSG_START_Z                         _UxGT("Počáteční Z")
 | 
			
		||||
#define MSG_END_Z                           _UxGT("  Koncové Z")
 | 
			
		||||
#define MSG_BRICKOUT                        _UxGT("Brickout")
 | 
			
		||||
#define MSG_INVADERS                        _UxGT("Invaders")
 | 
			
		||||
#define MSG_SNAKE                           _UxGT("Sn4k3")
 | 
			
		||||
#define MSG_MAZE                            _UxGT("Bludiště")
 | 
			
		||||
 | 
			
		||||
#if LCD_HEIGHT >= 4
 | 
			
		||||
  // Up to 3 lines allowed
 | 
			
		||||
  #define MSG_ADVANCED_PAUSE_WAITING_1      _UxGT("Stikněte tlačítko")
 | 
			
		||||
  #define MSG_ADVANCED_PAUSE_WAITING_2      _UxGT("pro obnovení tisku")
 | 
			
		||||
  #define MSG_PAUSE_PRINT_INIT_1            _UxGT("Parkování...")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_INIT_1        _UxGT("Čekejte prosím")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_INIT_2        _UxGT("na zahájení")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_INIT_3        _UxGT("výměny filamentu")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_UNLOAD_1      _UxGT("Čekejte prosím")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_UNLOAD_2      _UxGT("na vysunuti")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_UNLOAD_3      _UxGT("filamentu")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_INSERT_1      _UxGT("Vložte filament")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_INSERT_2      _UxGT("a stiskněte")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_INSERT_3      _UxGT("tlačítko...")
 | 
			
		||||
@@ -399,21 +508,46 @@
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_HEAT_2        _UxGT("nahřátí trysky")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_HEATING_1     _UxGT("Čekejte prosím")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_HEATING_2     _UxGT("na nahřátí tr.")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_UNLOAD_1      _UxGT("Čekejte prosím")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_UNLOAD_2      _UxGT("na vysunuti")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_UNLOAD_3      _UxGT("filamentu")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_LOAD_1        _UxGT("Čekejte prosím")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_LOAD_2        _UxGT("na zavedení")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_LOAD_3        _UxGT("filamentu")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_PURGE_1       _UxGT("Vyčkejte na")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_PURGE_2       _UxGT("vytlačení")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_CONT_PURGE_1  _UxGT("Klikněte pro")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_CONT_PURGE_2  _UxGT("ukončení")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_CONT_PURGE_3  _UxGT("vytlačování")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_RESUME_1      _UxGT("Čekejte prosím")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_RESUME_2      _UxGT("na pokračování")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_RESUME_3      _UxGT("tisku")
 | 
			
		||||
#else // LCD_HEIGHT < 4
 | 
			
		||||
  // Up to 2 lines allowed
 | 
			
		||||
  #define MSG_ADVANCED_PAUSE_WAITING_1      _UxGT("Stikněte tlač.")
 | 
			
		||||
  #define MSG_ADVANCED_PAUSE_WAITING_2      _UxGT("pro obnovení")
 | 
			
		||||
  #define MSG_PAUSE_PRINT_INIT_1            _UxGT("Parkování...")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_INIT_1        _UxGT("Čekejte...")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_UNLOAD_1      _UxGT("Vysouvání...")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_INSERT_1      _UxGT("Vložte, klikněte")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_HEAT_1        _UxGT("Klikněte pro")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_HEAT_2        _UxGT("nahřátí")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_HEATING_1     _UxGT("Nahřívání...")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_UNLOAD_1      _UxGT("Vysouvání...")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_LOAD_1        _UxGT("Zavádění...")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_PURGE_1       _UxGT("Vytlačování...")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_CONT_PURGE_1  _UxGT("Klikněte pro")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_CONT_PURGE_2  _UxGT("ukončení")
 | 
			
		||||
  #define MSG_FILAMENT_CHANGE_RESUME_1      _UxGT("Pokračování...")
 | 
			
		||||
#endif // LCD_HEIGHT < 4
 | 
			
		||||
 | 
			
		||||
#define MSG_TMC_DRIVERS                     _UxGT("TMC budiče")
 | 
			
		||||
#define MSG_TMC_CURRENT                     _UxGT("Proud budičů")
 | 
			
		||||
#define MSG_TMC_HYBRID_THRS                 _UxGT("Hybridní práh")
 | 
			
		||||
#define MSG_TMC_HOMING_THRS                 _UxGT("Domů bez senzorů")
 | 
			
		||||
#define MSG_TMC_STEPPING_MODE               _UxGT("Režim kroků")
 | 
			
		||||
#define MSG_TMC_STEALTH_ENABLED             _UxGT("StealthChop povolen")
 | 
			
		||||
#define MSG_SERVICE_RESET                   _UxGT("Reset")
 | 
			
		||||
#define MSG_SERVICE_IN                      _UxGT(" za:")
 | 
			
		||||
#define MSG_BACKLASH                        _UxGT("Vůle")
 | 
			
		||||
#define MSG_BACKLASH_CORRECTION             _UxGT("Korekce")
 | 
			
		||||
#define MSG_BACKLASH_SMOOTHING              _UxGT("Vyhlazení")
 | 
			
		||||
@@ -1362,6 +1362,9 @@
 | 
			
		||||
  #ifndef MSG_ADVANCED_PAUSE_WAITING_1
 | 
			
		||||
    #define MSG_ADVANCED_PAUSE_WAITING_1      _UxGT("Click to continue")
 | 
			
		||||
  #endif
 | 
			
		||||
  #ifndef MSG_PAUSE_PRINT_INIT_1
 | 
			
		||||
    #define MSG_PAUSE_PRINT_INIT_1            _UxGT("Parking...")
 | 
			
		||||
  #endif
 | 
			
		||||
  #ifndef MSG_FILAMENT_CHANGE_INIT_1
 | 
			
		||||
    #define MSG_FILAMENT_CHANGE_INIT_1        _UxGT("Please wait...")
 | 
			
		||||
  #endif
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,8 @@
 | 
			
		||||
#define THIS_LANGUAGES_SPECIAL_SYMBOLS      _UxGT("äÄáÁčČďĎéÉíÍĺĹľĽňŇóÓôÔŕŔšŠťŤúÚýÝžŽ³")
 | 
			
		||||
 | 
			
		||||
#define WELCOME_MSG                         MACHINE_NAME _UxGT(" pripravená.")
 | 
			
		||||
#define MSG_YES                             _UxGT("ÁNO")
 | 
			
		||||
#define MSG_NO                              _UxGT("NIE")
 | 
			
		||||
#define MSG_BACK                            _UxGT("Naspäť")
 | 
			
		||||
#define MSG_SD_INSERTED                     _UxGT("Karta vložená")
 | 
			
		||||
#define MSG_SD_REMOVED                      _UxGT("Karta vybraná")
 | 
			
		||||
@@ -104,6 +106,7 @@
 | 
			
		||||
#define MSG_UBL_TOOLS                       _UxGT("Nástroje UBL")
 | 
			
		||||
#define MSG_UBL_LEVEL_BED                   _UxGT("UBL rovnanie")
 | 
			
		||||
#define MSG_IDEX_MENU                       _UxGT("IDEX režim")
 | 
			
		||||
#define MSG_OFFSETS_MENU                    _UxGT("Offset nástrojov")
 | 
			
		||||
#define MSG_IDEX_MODE_AUTOPARK              _UxGT("Auto-parkovanie")
 | 
			
		||||
#define MSG_IDEX_MODE_DUPLICATE             _UxGT("Duplikácia")
 | 
			
		||||
#define MSG_IDEX_MODE_MIRRORED_COPY         _UxGT("Zrkadlená kópia")
 | 
			
		||||
@@ -276,6 +279,9 @@
 | 
			
		||||
#define MSG_WATCH                           _UxGT("Info. obrazovka")
 | 
			
		||||
#define MSG_PREPARE                         _UxGT("Príprava tlače")
 | 
			
		||||
#define MSG_TUNE                            _UxGT("Doladenie tlače")
 | 
			
		||||
#define MSG_START_PRINT                     _UxGT("Spustiť tlač")
 | 
			
		||||
#define MSG_BUTTON_PRINT                    _UxGT("Tlačiť")
 | 
			
		||||
#define MSG_BUTTON_CANCEL                   _UxGT("Zrušiť")
 | 
			
		||||
#define MSG_PAUSE_PRINT                     _UxGT("Pozastaviť tlač")
 | 
			
		||||
#define MSG_RESUME_PRINT                    _UxGT("Obnoviť tlač")
 | 
			
		||||
#define MSG_STOP_PRINT                      _UxGT("Zastaviť tlač")
 | 
			
		||||
@@ -330,6 +336,7 @@
 | 
			
		||||
#define MSG_BABYSTEP_X                      _UxGT("Babystep X")
 | 
			
		||||
#define MSG_BABYSTEP_Y                      _UxGT("Babystep Y")
 | 
			
		||||
#define MSG_BABYSTEP_Z                      _UxGT("Babystep Z")
 | 
			
		||||
#define MSG_BABYSTEP_TOTAL                  _UxGT("Celkom")
 | 
			
		||||
#define MSG_ENDSTOP_ABORT                   _UxGT("Zastavenie Endstop")
 | 
			
		||||
#define MSG_HEATING_FAILED_LCD              _UxGT("Chyba ohrevu")
 | 
			
		||||
#define MSG_HEATING_FAILED_LCD_BED          _UxGT("Chyba ohrevu podl.")
 | 
			
		||||
@@ -461,6 +468,10 @@
 | 
			
		||||
#define MSG_VTOOLS_RESET                    _UxGT("V-tools resetované")
 | 
			
		||||
#define MSG_START_Z                         _UxGT("Počiat.Z")
 | 
			
		||||
#define MSG_END_Z                           _UxGT("Konečn.Z")
 | 
			
		||||
#define MSG_BRICKOUT                        _UxGT("Brickout")
 | 
			
		||||
#define MSG_INVADERS                        _UxGT("Nájazdníci")
 | 
			
		||||
#define MSG_SNAKE                           _UxGT("Had")
 | 
			
		||||
#define MSG_MAZE                            _UxGT("Bludisko")
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Filament Change screens show up to 3 lines on a 4-line display
 | 
			
		||||
@@ -515,3 +526,6 @@
 | 
			
		||||
 | 
			
		||||
#define MSG_SERVICE_RESET                   _UxGT("Vynulovať")
 | 
			
		||||
#define MSG_SERVICE_IN                      _UxGT(" za:")
 | 
			
		||||
#define MSG_BACKLASH                        _UxGT("Kompenz. vôle")
 | 
			
		||||
#define MSG_BACKLASH_CORRECTION             _UxGT("Korekcia")
 | 
			
		||||
#define MSG_BACKLASH_SMOOTHING              _UxGT("Vyhladzovanie")
 | 
			
		||||
 
 | 
			
		||||
@@ -167,9 +167,9 @@ DEFINE_MENU_EDIT_ITEM(float3);      // 123        right-justified
 | 
			
		||||
DEFINE_MENU_EDIT_ITEM(float52);     // 123.45
 | 
			
		||||
DEFINE_MENU_EDIT_ITEM(float43);     // 1.234
 | 
			
		||||
DEFINE_MENU_EDIT_ITEM(float5);      // 12345      right-justified
 | 
			
		||||
DEFINE_MENU_EDIT_ITEM(float51);     // +1234.5
 | 
			
		||||
DEFINE_MENU_EDIT_ITEM(float51);     // 1234.5     right-justified
 | 
			
		||||
DEFINE_MENU_EDIT_ITEM(float51sign); // +1234.5
 | 
			
		||||
DEFINE_MENU_EDIT_ITEM(float52sign); // +123.45
 | 
			
		||||
DEFINE_MENU_EDIT_ITEM(float62);     // 1234.56    right-justified
 | 
			
		||||
DEFINE_MENU_EDIT_ITEM(long5);       // 12345      right-justified
 | 
			
		||||
 | 
			
		||||
void MenuItem_bool::action_edit(PGM_P pstr, bool *ptr, screenFunc_t callback) {
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,8 @@
 | 
			
		||||
#include "../ultralcd.h"
 | 
			
		||||
#include "../../inc/MarlinConfig.h"
 | 
			
		||||
 | 
			
		||||
#include "limits.h"
 | 
			
		||||
 | 
			
		||||
extern int8_t encoderLine, encoderTopLine, screen_items;
 | 
			
		||||
extern bool screen_changed;
 | 
			
		||||
 | 
			
		||||
@@ -54,9 +56,9 @@ DECLARE_MENU_EDIT_TYPE(float,    float3,      ftostr3,         1     );   // 123
 | 
			
		||||
DECLARE_MENU_EDIT_TYPE(float,    float52,     ftostr52,      100     );   // 123.45
 | 
			
		||||
DECLARE_MENU_EDIT_TYPE(float,    float43,     ftostr43sign, 1000     );   // 1.234
 | 
			
		||||
DECLARE_MENU_EDIT_TYPE(float,    float5,      ftostr5rj,       0.01f );   // 12345      right-justified
 | 
			
		||||
DECLARE_MENU_EDIT_TYPE(float,    float51,     ftostr51sign,   10     );   // +1234.5
 | 
			
		||||
DECLARE_MENU_EDIT_TYPE(float,    float51,     ftostr51rj,     10     );   // 1234.5     right-justified
 | 
			
		||||
DECLARE_MENU_EDIT_TYPE(float,    float51sign, ftostr51sign,   10     );   // +1234.5
 | 
			
		||||
DECLARE_MENU_EDIT_TYPE(float,    float52sign, ftostr52sign,  100     );   // +123.45
 | 
			
		||||
DECLARE_MENU_EDIT_TYPE(float,    float62,     ftostr62rj,    100     );   // 1234.56    right-justified
 | 
			
		||||
DECLARE_MENU_EDIT_TYPE(uint32_t, long5,       ftostr5rj,       0.01f );   // 12345      right-justified
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////
 | 
			
		||||
@@ -119,9 +121,9 @@ DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(float3);           // 123        right-justif
 | 
			
		||||
DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(float52);          // 123.45
 | 
			
		||||
DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(float43);          // 1.234
 | 
			
		||||
DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(float5);           // 12345      right-justified
 | 
			
		||||
DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(float51);          // +1234.5
 | 
			
		||||
DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(float51);          // 1234.5     right-justified
 | 
			
		||||
DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(float51sign);      // +1234.5
 | 
			
		||||
DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(float52sign);      // +123.45
 | 
			
		||||
DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(float62);          // 1234.56    right-justified
 | 
			
		||||
DEFINE_DRAW_MENU_ITEM_SETTING_EDIT(long5);            // 12345      right-justified
 | 
			
		||||
 | 
			
		||||
#define draw_menu_item_edit_bool(sel, row, pstr, pstr2, data, ...)           DRAW_BOOL_SETTING(sel, row, pstr, data)
 | 
			
		||||
@@ -179,8 +181,10 @@ class TMenuItem : MenuItemBase {
 | 
			
		||||
    static char* to_string(const int16_t value)       { return NAME::strfunc(unscale(value)); }
 | 
			
		||||
  public:
 | 
			
		||||
    static void action_edit(PGM_P const pstr, type_t * const ptr, const type_t minValue, const type_t maxValue, const screenFunc_t callback=NULL, const bool live=false) {
 | 
			
		||||
      const int16_t minv = scale(minValue);
 | 
			
		||||
      init(pstr, ptr, minv, int16_t(scale(maxValue)) - minv, int16_t(scale(*ptr)) - minv, edit, callback, live);
 | 
			
		||||
      // Make sure minv and maxv fit within int16_t
 | 
			
		||||
      const int16_t minv = MAX(scale(minValue), INT16_MIN),
 | 
			
		||||
                    maxv = MIN(scale(maxValue), INT16_MAX);
 | 
			
		||||
      init(pstr, ptr, minv, maxv - minv, scale(*ptr) - minv, edit, callback, live);
 | 
			
		||||
    }
 | 
			
		||||
    static void edit() { MenuItemBase::edit(to_string, load); }
 | 
			
		||||
};
 | 
			
		||||
@@ -199,8 +203,8 @@ DECLARE_MENU_EDIT_ITEM(float52);
 | 
			
		||||
DECLARE_MENU_EDIT_ITEM(float43);
 | 
			
		||||
DECLARE_MENU_EDIT_ITEM(float5);
 | 
			
		||||
DECLARE_MENU_EDIT_ITEM(float51);
 | 
			
		||||
DECLARE_MENU_EDIT_ITEM(float51sign);
 | 
			
		||||
DECLARE_MENU_EDIT_ITEM(float52sign);
 | 
			
		||||
DECLARE_MENU_EDIT_ITEM(float62);
 | 
			
		||||
DECLARE_MENU_EDIT_ITEM(long5);
 | 
			
		||||
 | 
			
		||||
class MenuItem_bool {
 | 
			
		||||
 
 | 
			
		||||
@@ -571,14 +571,14 @@ void menu_backlash();
 | 
			
		||||
    START_MENU();
 | 
			
		||||
    MENU_BACK(MSG_ADVANCED_SETTINGS);
 | 
			
		||||
 | 
			
		||||
    #define EDIT_QSTEPS(Q) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_##Q##STEPS, &planner.settings.axis_steps_per_mm[_AXIS(Q)], 5, 9999, _planner_refresh_positioning)
 | 
			
		||||
    #define EDIT_QSTEPS(Q) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float51, MSG_##Q##STEPS, &planner.settings.axis_steps_per_mm[_AXIS(Q)], 5, 9999, _planner_refresh_positioning)
 | 
			
		||||
    EDIT_QSTEPS(A);
 | 
			
		||||
    EDIT_QSTEPS(B);
 | 
			
		||||
    EDIT_QSTEPS(C);
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(DISTINCT_E_FACTORS)
 | 
			
		||||
      #define EDIT_ESTEPS(N,E) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E##N##STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(E)], 5, 9999, _planner_refresh_e##E##_positioning)
 | 
			
		||||
      MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ESTEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(active_extruder)], 5, 9999, _planner_refresh_positioning);
 | 
			
		||||
      #define EDIT_ESTEPS(N,E) MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float51, MSG_E##N##STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(E)], 5, 9999, _planner_refresh_e##E##_positioning)
 | 
			
		||||
      MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float51, MSG_ESTEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(active_extruder)], 5, 9999, _planner_refresh_positioning);
 | 
			
		||||
      EDIT_ESTEPS(1,0);
 | 
			
		||||
      EDIT_ESTEPS(2,1);
 | 
			
		||||
      #if E_STEPPERS > 2
 | 
			
		||||
@@ -594,7 +594,7 @@ void menu_backlash();
 | 
			
		||||
        #endif // E_STEPPERS > 3
 | 
			
		||||
      #endif // E_STEPPERS > 2
 | 
			
		||||
    #elif E_STEPPERS
 | 
			
		||||
      MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ESTEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, _planner_refresh_positioning);
 | 
			
		||||
      MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float51, MSG_ESTEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, _planner_refresh_positioning);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    END_MENU();
 | 
			
		||||
 
 | 
			
		||||
@@ -310,24 +310,35 @@ inline void do_probe_raise(const float z_raise) {
 | 
			
		||||
 | 
			
		||||
FORCE_INLINE void probe_specific_action(const bool deploy) {
 | 
			
		||||
  #if ENABLED(PAUSE_BEFORE_DEPLOY_STOW)
 | 
			
		||||
    do {
 | 
			
		||||
      #if ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED)
 | 
			
		||||
        if (deploy == (READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_INVERTING)) break;
 | 
			
		||||
      #endif
 | 
			
		||||
 | 
			
		||||
    BUZZ(100, 659);
 | 
			
		||||
    BUZZ(100, 698);
 | 
			
		||||
      BUZZ(100, 659);
 | 
			
		||||
      BUZZ(100, 698);
 | 
			
		||||
 | 
			
		||||
    PGM_P const ds_str = deploy ? PSTR(MSG_MANUAL_DEPLOY) : PSTR(MSG_MANUAL_STOW);
 | 
			
		||||
    ui.return_to_status();       // To display the new status message
 | 
			
		||||
    ui.set_status_P(ds_str, 99);
 | 
			
		||||
    serialprintPGM(ds_str);
 | 
			
		||||
    SERIAL_EOL();
 | 
			
		||||
      PGM_P const ds_str = deploy ? PSTR(MSG_MANUAL_DEPLOY) : PSTR(MSG_MANUAL_STOW);
 | 
			
		||||
      ui.return_to_status();       // To display the new status message
 | 
			
		||||
      ui.set_status_P(ds_str, 99);
 | 
			
		||||
      serialprintPGM(ds_str);
 | 
			
		||||
      SERIAL_EOL();
 | 
			
		||||
 | 
			
		||||
    KEEPALIVE_STATE(PAUSED_FOR_USER);
 | 
			
		||||
    wait_for_user = true;
 | 
			
		||||
    #if ENABLED(HOST_PROMPT_SUPPORT)
 | 
			
		||||
      host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Stow Probe"), PSTR("Continue"));
 | 
			
		||||
    #endif
 | 
			
		||||
    while (wait_for_user) idle();
 | 
			
		||||
    ui.reset_status();
 | 
			
		||||
    KEEPALIVE_STATE(IN_HANDLER);
 | 
			
		||||
      KEEPALIVE_STATE(PAUSED_FOR_USER);
 | 
			
		||||
      wait_for_user = true;
 | 
			
		||||
      #if ENABLED(HOST_PROMPT_SUPPORT)
 | 
			
		||||
        host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Stow Probe"), PSTR("Continue"));
 | 
			
		||||
      #endif
 | 
			
		||||
      while (wait_for_user) idle();
 | 
			
		||||
      ui.reset_status();
 | 
			
		||||
      KEEPALIVE_STATE(IN_HANDLER);
 | 
			
		||||
    } while(
 | 
			
		||||
      #if ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED)
 | 
			
		||||
        true
 | 
			
		||||
      #else
 | 
			
		||||
        false
 | 
			
		||||
      #endif
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
  #endif // PAUSE_BEFORE_DEPLOY_STOW
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -316,6 +316,8 @@
 | 
			
		||||
  #include "pins_RAMPS_RE_ARM.h"        // LPC1768                                    env:LPC1768
 | 
			
		||||
#elif MB(MKS_SBASE)
 | 
			
		||||
  #include "pins_MKS_SBASE.h"           // LPC1768                                    env:LPC1768
 | 
			
		||||
#elif MB(MKS_SGEN)
 | 
			
		||||
  #include "pins_MKS_SGEN.h"            // LPC1769                                    env:LPC1769
 | 
			
		||||
#elif MB(AZSMZ_MINI)
 | 
			
		||||
  #include "pins_AZSMZ_MINI.h"          // LPC1768                                    env:LPC1768
 | 
			
		||||
#elif MB(AZTEEG_X5_GT)
 | 
			
		||||
 
 | 
			
		||||
@@ -185,13 +185,9 @@
 | 
			
		||||
//
 | 
			
		||||
// SD Support
 | 
			
		||||
//
 | 
			
		||||
//#define USB_SD_DISABLED     // Disable host access to SD card as mass storage device through USB
 | 
			
		||||
//#define USB_SD_ONBOARD      // Enable host access to SD card as mass storage device through USB
 | 
			
		||||
 | 
			
		||||
//#define LPC_SD_LCD          // Marlin uses the SD drive attached to the LCD
 | 
			
		||||
#define LPC_SD_ONBOARD        // Marlin uses the SD drive on the control board.  There is no SD detect pin
 | 
			
		||||
                              // for the onboard card.  Init card from LCD menu or send M21 whenever printer
 | 
			
		||||
                              // is powered on to enable SD access.
 | 
			
		||||
#if !ANY(LPC_SD_LCD, LPC_SD_ONBOARD, LPC_SD_CUSTOM_CABLE)
 | 
			
		||||
  #define LPC_SD_ONBOARD
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if ENABLED(LPC_SD_LCD)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -208,15 +208,24 @@
 | 
			
		||||
      #define LCD_PINS_D7   P1_23
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(MKS_MINI_12864)
 | 
			
		||||
      #define DOGLCD_CS     P1_21
 | 
			
		||||
      #define DOGLCD_A0     P1_22
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
#endif // ULTRA_LCD
 | 
			
		||||
 | 
			
		||||
//#define USB_SD_DISABLED
 | 
			
		||||
#define USB_SD_ONBOARD        // Provide the onboard SD card to the host as a USB mass storage device
 | 
			
		||||
//
 | 
			
		||||
// SD Support
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#define LPC_SD_LCD            // Marlin uses the SD drive attached to the LCD
 | 
			
		||||
//#define LPC_SD_ONBOARD        // Marlin uses the SD drive on the control board
 | 
			
		||||
#if !ANY(LPC_SD_LCD, LPC_SD_ONBOARD, LPC_SD_CUSTOM_CABLE)
 | 
			
		||||
  #undef USB_SD_DISABLED
 | 
			
		||||
  #define USB_SD_ONBOARD
 | 
			
		||||
  #define LPC_SD_LCD
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if ENABLED(LPC_SD_LCD)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -105,18 +105,29 @@
 | 
			
		||||
  #define LCD_PINS_RS      P0_16
 | 
			
		||||
  #define LCD_PINS_ENABLE  P0_18
 | 
			
		||||
  #define LCD_PINS_D4      P0_15
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(MKS_MINI_12864)
 | 
			
		||||
    #define DOGLCD_CS      P2_06
 | 
			
		||||
    #define DOGLCD_A0      P0_16
 | 
			
		||||
  #endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// SD Support
 | 
			
		||||
//
 | 
			
		||||
//#define USB_SD_DISABLED     // Disable host access to SD card as mass storage device through USB
 | 
			
		||||
#define USB_SD_ONBOARD        // Enable host access to SD card as mass storage device through USB
 | 
			
		||||
 | 
			
		||||
//#define LPC_SD_LCD          // Marlin uses the SD drive attached to the LCD
 | 
			
		||||
#define LPC_SD_ONBOARD        // Marlin uses the SD drive on the control board.  There is no SD detect pin
 | 
			
		||||
                              // for the onboard card.  Init card from LCD menu or send M21 whenever printer
 | 
			
		||||
                              // is powered on to enable SD access.
 | 
			
		||||
// MKS_MINI_12864 strongly prefers the SD card on the display and
 | 
			
		||||
// requires jumpers on the SKR V1.1 board as documented here:
 | 
			
		||||
// https://www.facebook.com/groups/505736576548648/permalink/630639874058317/
 | 
			
		||||
#if !ANY(LPC_SD_LCD, LPC_SD_ONBOARD, LPC_SD_CUSTOM_CABLE)
 | 
			
		||||
  #if ENABLED(MKS_MINI_12864)
 | 
			
		||||
    #define LPC_SD_LCD
 | 
			
		||||
    #undef USB_SD_DISABLED
 | 
			
		||||
    #define USB_SD_ONBOARD
 | 
			
		||||
  #else
 | 
			
		||||
    #define USB_SD_ONBOARD
 | 
			
		||||
    #define LPC_SD_ONBOARD
 | 
			
		||||
  #endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if ENABLED(LPC_SD_LCD)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -143,7 +143,7 @@
 | 
			
		||||
  #define LED_PIN          13
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SPINDLE_LASER_PWM_PIN     7   // MUST BE HARDWARE PWM
 | 
			
		||||
#define SPINDLE_LASER_PWM_PIN    -1   // MUST BE HARDWARE PWM
 | 
			
		||||
#define SPINDLE_LASER_ENA_PIN     4   // Pin should have a pullup!
 | 
			
		||||
 | 
			
		||||
// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,12 @@
 | 
			
		||||
  #error "Oops! Make sure you have the LPC1768 environment selected in your IDE."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define BOARD_NAME        "MKS SBASE"
 | 
			
		||||
#define BOARD_WEBSITE_URL "https://github.com/makerbase-mks/MKS-SBASE"
 | 
			
		||||
#ifndef BOARD_NAME
 | 
			
		||||
  #define BOARD_NAME        "MKS SBASE"
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef BOARD_WEBSITE_URL
 | 
			
		||||
  #define BOARD_WEBSITE_URL "https://github.com/makerbase-mks/MKS-SBASE"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define LED_PIN            P1_18   // Used as a status indicator
 | 
			
		||||
#define LED2_PIN           P1_19
 | 
			
		||||
@@ -154,23 +158,11 @@
 | 
			
		||||
#define ENET_TXD0          P1_00   // J12-11
 | 
			
		||||
#define ENET_TXD1          P1_01   // J12-12
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The SBase can share the on-board SD card with a PC via USB the following
 | 
			
		||||
 * definitions control this feature:
 | 
			
		||||
 */
 | 
			
		||||
//#define USB_SD_DISABLED
 | 
			
		||||
#define USB_SD_ONBOARD        // Provide the onboard SD card to the host as a USB mass storage device
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * There are a number of configurations available for the SBase SD card reader.
 | 
			
		||||
 * - A custom cable can be used to allow access to the LCD based SD card.
 | 
			
		||||
 * - A standard cable can be used for access to the LCD SD card (but no SD detect).
 | 
			
		||||
 * - The onboard SD card can be used and optionally shared with a PC via USB.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//#define LPC_SD_CUSTOM_CABLE // Use a custom cable to access the SD
 | 
			
		||||
//#define LPC_SD_LCD          // Marlin uses the SD drive attached to the LCD
 | 
			
		||||
#define LPC_SD_ONBOARD        // Marlin uses the SD drive attached to the control board
 | 
			
		||||
#if !ANY(LPC_SD_LCD, LPC_SD_ONBOARD, LPC_SD_CUSTOM_CABLE)
 | 
			
		||||
  #undef USB_SD_DISABLED
 | 
			
		||||
  #define USB_SD_ONBOARD
 | 
			
		||||
  #define LPC_SD_ONBOARD
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if ENABLED(LPC_SD_CUSTOM_CABLE)
 | 
			
		||||
 | 
			
		||||
@@ -249,6 +241,41 @@
 | 
			
		||||
    #define DOGLCD_SCK     SCK_PIN
 | 
			
		||||
    #define DOGLCD_MOSI    MOSI_PIN
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(FYSETC_MINI_12864)
 | 
			
		||||
    /**
 | 
			
		||||
     * The Fysetc display can NOT use the SCK and MOSI pins on EXP2, so a
 | 
			
		||||
     * special cable is needed to go between EXP2 on the FYSETC and the
 | 
			
		||||
     * controller board's EXP2 and J8. It also means that a software SPI
 | 
			
		||||
     * is needed to drive those pins.
 | 
			
		||||
     *
 | 
			
		||||
     * The Fysetc requires mode 3 SPI interface.
 | 
			
		||||
     *
 | 
			
		||||
     * Pins 6, 7 & 8 on EXP2 are no connects. That means a second special
 | 
			
		||||
     * cable will be needed if the RGB LEDs are to be active.
 | 
			
		||||
     */
 | 
			
		||||
    #define DOGLCD_CS      LCD_PINS_ENABLE // EXP1.3  (LCD_EN on Fysetc schematic)
 | 
			
		||||
    #define DOGLCD_A0      LCD_PINS_RS     // EXP1.4  (LCD_A0 on Fysetc schematic)
 | 
			
		||||
    #define DOGLCD_SCK     P2_11           // J8-5  (SCK on Fysetc schematic)
 | 
			
		||||
    #define DOGLCD_MOSI    P4_28           // J8-6  (MOSI on Fysetc schematic)
 | 
			
		||||
 | 
			
		||||
    #define RGB_LED
 | 
			
		||||
    //#define RGBW_LED
 | 
			
		||||
    #if EITHER(RGB_LED, RGBW_LED)
 | 
			
		||||
      #define RGB_LED_R_PIN P2_12          // J8-4  (LCD_D6 on Fysetc schematic)
 | 
			
		||||
      #define RGB_LED_G_PIN P1_23          // J8-3  (LCD_D5 on Fysetc schematic)
 | 
			
		||||
      #define RGB_LED_B_PIN P1_22          // J8-2  (LCD_D7 on Fysetc schematic)
 | 
			
		||||
      //#define RGB_LED_W_PIN -1
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
  #elif ENABLED(MINIPANEL)
 | 
			
		||||
    // GLCD features
 | 
			
		||||
    // Uncomment screen orientation
 | 
			
		||||
    //#define LCD_SCREEN_ROT_90
 | 
			
		||||
    //#define LCD_SCREEN_ROT_180
 | 
			
		||||
    //#define LCD_SCREEN_ROT_270
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -281,7 +308,7 @@
 | 
			
		||||
 #endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC2208)
 | 
			
		||||
#if MB(MKS_SBASE) && HAS_DRIVER(TMC2208)
 | 
			
		||||
  // The shortage of pins becomes apparent.
 | 
			
		||||
  // Worst case you may have to give up the LCD
 | 
			
		||||
  // RX pins need to be interrupt capable
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								Marlin/src/pins/pins_MKS_SGEN.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								Marlin/src/pins/pins_MKS_SGEN.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Marlin 3D Printer Firmware
 | 
			
		||||
 * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
 | 
			
		||||
 * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
 | 
			
		||||
 *
 | 
			
		||||
 * Based on Sprinter and grbl.
 | 
			
		||||
 * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * MKS SGen pin assignments
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef LPC1769
 | 
			
		||||
  #error "Oops! Make sure you have the LPC1769 environment selected in your IDE."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define BOARD_NAME        "MKS SGEN"
 | 
			
		||||
#define BOARD_WEBSITE_URL "https://github.com/makerbase-mks/MKS-SGEN"
 | 
			
		||||
 | 
			
		||||
#include "pins_MKS_SBASE.h"
 | 
			
		||||
 | 
			
		||||
#undef E1_STEP_PIN
 | 
			
		||||
#undef E1_DIR_PIN
 | 
			
		||||
#undef E1_ENABLE_PIN
 | 
			
		||||
 | 
			
		||||
//#undef BTN_EN1
 | 
			
		||||
//#undef BTN_EN2
 | 
			
		||||
//#define BTN_EN1        P1_23   // EXP2.5
 | 
			
		||||
//#define BTN_EN2        P1_22   // EXP2.3
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC2208)
 | 
			
		||||
  // The shortage of pins becomes apparent.
 | 
			
		||||
  // In the worst case you may have to give up the LCD.
 | 
			
		||||
  // RX pins must be interrupt-capable.
 | 
			
		||||
  #define X_SERIAL_TX_PIN  P4_29   // J8-2
 | 
			
		||||
  #define X_SERIAL_RX_PIN  P4_29   // J8-2
 | 
			
		||||
 | 
			
		||||
  #define Y_SERIAL_TX_PIN  P2_08   // J8-3
 | 
			
		||||
  #define Y_SERIAL_RX_PIN  P2_08   // J8-3
 | 
			
		||||
 | 
			
		||||
  #define Z_SERIAL_TX_PIN  P2_11   // J8-4
 | 
			
		||||
  #define Z_SERIAL_RX_PIN  P2_11   // J8-4
 | 
			
		||||
  #define E0_SERIAL_TX_PIN P2_13   // J8-5
 | 
			
		||||
  #define E0_SERIAL_RX_PIN P2_13   // J8-5
 | 
			
		||||
#endif
 | 
			
		||||
@@ -156,7 +156,10 @@
 | 
			
		||||
    #define LCD_PINS_D7    29
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(MINIPANEL)
 | 
			
		||||
  #if ENABLED(FYSETC_MINI_12864)
 | 
			
		||||
    #define DOGLCD_CS      LCD_PINS_ENABLE
 | 
			
		||||
    #define DOGLCD_A0      LCD_PINS_RS
 | 
			
		||||
  #elif ENABLED(MINIPANEL)
 | 
			
		||||
    #define DOGLCD_CS      25
 | 
			
		||||
    #define DOGLCD_A0      27
 | 
			
		||||
  #endif
 | 
			
		||||
 
 | 
			
		||||
@@ -269,11 +269,21 @@
 | 
			
		||||
 | 
			
		||||
#elif ENABLED(ULTRA_LCD)
 | 
			
		||||
 | 
			
		||||
  #define BEEPER_PIN       P1_30   // (37) not 5V tolerant
 | 
			
		||||
  //#define SCK_PIN        P0_15   // (52)  system defined J3-9 & AUX-3
 | 
			
		||||
  //#define MISO_PIN       P0_17   // (50)  system defined J3-10 & AUX-3
 | 
			
		||||
  //#define MOSI_PIN       P0_18   // (51)  system defined J3-10 & AUX-3
 | 
			
		||||
  //#define SS_PIN         P1_23   // (53)  system defined J3-5 & AUX-3 (Sometimes called SDSS)
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(FYSETC_MINI_12864)
 | 
			
		||||
    #define BEEPER_PIN     P1_01
 | 
			
		||||
    #define BTN_ENC        P1_04
 | 
			
		||||
  #else
 | 
			
		||||
    #define BEEPER_PIN     P1_30   // (37) not 5V tolerant
 | 
			
		||||
    #define BTN_ENC        P2_11   // (35) J3-3 & AUX-4
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #define BTN_EN1          P3_26   // (31) J3-2 & AUX-4
 | 
			
		||||
  #define BTN_EN2          P3_25   // (33) J3-4 & AUX-4
 | 
			
		||||
  #define BTN_ENC          P2_11   // (35) J3-3 & AUX-4
 | 
			
		||||
 | 
			
		||||
  #define SD_DETECT_PIN    P1_31   // (49) J3-1 & AUX-3 (NOT 5V tolerant)
 | 
			
		||||
  #define KILL_PIN         P1_22   // (41) J5-4 & AUX-4
 | 
			
		||||
@@ -296,13 +306,6 @@
 | 
			
		||||
  #if ANY(VIKI2, miniVIKI)
 | 
			
		||||
    // #define LCD_SCREEN_ROT_180
 | 
			
		||||
 | 
			
		||||
    #define BTN_EN1        P3_26   // (31) J3-2 & AUX-4
 | 
			
		||||
    #define BTN_EN2        P3_25   // (33) J3-4 & AUX-4
 | 
			
		||||
    #define BTN_ENC        P2_11   // (35) J3-3 & AUX-4
 | 
			
		||||
 | 
			
		||||
    #define SD_DETECT_PIN  P1_31   // (49) J3-1 & AUX-3 (NOT 5V tolerant)
 | 
			
		||||
    #define KILL_PIN       P1_22   // (41) J5-4 & AUX-4
 | 
			
		||||
 | 
			
		||||
    #define DOGLCD_CS      P0_16   // (16)
 | 
			
		||||
    #define DOGLCD_A0      P2_06   // (59) J3-8 & AUX-2
 | 
			
		||||
    #define DOGLCD_SCK     SCK_PIN
 | 
			
		||||
@@ -311,8 +314,17 @@
 | 
			
		||||
    #define STAT_LED_BLUE_PIN P0_26 //(63)  may change if cable changes
 | 
			
		||||
    #define STAT_LED_RED_PIN P1_21 // ( 6)  may change if cable changes
 | 
			
		||||
  #else
 | 
			
		||||
    #define DOGLCD_CS      P0_26   // (63) J5-3 & AUX-2
 | 
			
		||||
    #define DOGLCD_A0      P2_06   // (59) J3-8 & AUX-2
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(FYSETC_MINI_12864)
 | 
			
		||||
      #define DOGLCD_SCK   P0_15
 | 
			
		||||
      #define DOGLCD_MOSI  P0_18
 | 
			
		||||
      #define DOGLCD_CS    P1_09  // use Ethernet connector for EXP1 cable signals
 | 
			
		||||
      #define DOGLCD_A0    P1_14
 | 
			
		||||
    #else
 | 
			
		||||
      #define DOGLCD_CS    P0_26   // (63) J5-3 & AUX-2
 | 
			
		||||
      #define DOGLCD_A0    P2_06   // (59) J3-8 & AUX-2
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #define LCD_BACKLIGHT_PIN P0_16 //(16) J3-7 & AUX-4 - only used on DOGLCD controllers
 | 
			
		||||
    #define LCD_PINS_ENABLE P0_18  // (51) (MOSI) J3-10 & AUX-3
 | 
			
		||||
    #define LCD_PINS_D4    P0_15   // (52) (SCK)  J3-9 & AUX-3
 | 
			
		||||
@@ -323,11 +335,6 @@
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  //#define MISO_PIN         P0_17   // (50)  system defined J3-10 & AUX-3
 | 
			
		||||
  //#define MOSI_PIN         P0_18   // (51)  system defined J3-10 & AUX-3
 | 
			
		||||
  //#define SCK_PIN          P0_15   // (52)  system defined J3-9 & AUX-3
 | 
			
		||||
  //#define SS_PIN           P1_23   // (53)  system defined J3-5 & AUX-3 (Sometimes called SDSS)
 | 
			
		||||
 | 
			
		||||
  #if ENABLED(MINIPANEL)
 | 
			
		||||
    // GLCD features
 | 
			
		||||
    // Uncomment screen orientation
 | 
			
		||||
@@ -354,18 +361,21 @@
 | 
			
		||||
#define ENET_TXD0          P1_00   // (78)  J12-11
 | 
			
		||||
#define ENET_TXD1          P1_01   // (79)  J12-12
 | 
			
		||||
 | 
			
		||||
//#define USB_SD_DISABLED
 | 
			
		||||
#define USB_SD_ONBOARD        // Provide the onboard SD card to the host as a USB mass storage device
 | 
			
		||||
 | 
			
		||||
//#define LPC_SD_LCD          // Marlin uses the SD drive attached to the LCD
 | 
			
		||||
#define LPC_SD_ONBOARD        // Marlin uses the SD drive on the control board
 | 
			
		||||
//
 | 
			
		||||
// SD Support
 | 
			
		||||
//
 | 
			
		||||
#if !ANY(LPC_SD_LCD, LPC_SD_ONBOARD, LPC_SD_CUSTOM_CABLE)
 | 
			
		||||
  #undef USB_SD_DISABLED
 | 
			
		||||
  #define USB_SD_ONBOARD
 | 
			
		||||
  #define LPC_SD_ONBOARD
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if ENABLED(LPC_SD_LCD)
 | 
			
		||||
 | 
			
		||||
  #define SCK_PIN          P0_15
 | 
			
		||||
  #define MISO_PIN         P0_17
 | 
			
		||||
  #define MOSI_PIN         P0_18
 | 
			
		||||
  #define SS_PIN           P1_23   // Chip select for SD card used by Marlin
 | 
			
		||||
  #define SCK_PIN          P0_15   // (52)  system defined J3-9 & AUX-3
 | 
			
		||||
  #define MISO_PIN         P0_17   // (50)  system defined J3-10 & AUX-3
 | 
			
		||||
  #define MOSI_PIN         P0_18   // (51)  system defined J3-10 & AUX-3
 | 
			
		||||
  #define SS_PIN           P1_23   // (53)  system defined J3-5 & AUX-3 (Sometimes called SDSS) - CS used by Marlin
 | 
			
		||||
  #define ONBOARD_SD_CS    P0_06   // Chip select for "System" SD card
 | 
			
		||||
 | 
			
		||||
#elif ENABLED(LPC_SD_ONBOARD)
 | 
			
		||||
 
 | 
			
		||||
@@ -1030,6 +1030,7 @@ void CardReader::printingHasFinished() {
 | 
			
		||||
  // be zeroed and written instead of deleted.
 | 
			
		||||
  void CardReader::removeJobRecoveryFile() {
 | 
			
		||||
    if (jobRecoverFileExists()) {
 | 
			
		||||
      recovery.init();
 | 
			
		||||
      removeFile(job_recovery_file_name);
 | 
			
		||||
      #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
 | 
			
		||||
        SERIAL_ECHOPGM("Power-loss file delete");
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user