MKFirmware / MarlinKimbra

📟 MK 3D Printer Firmware for Arduino
52 stars 39 forks source link

With REPRAP_DISCOUNT_SMART_CONTROLLER used, compiling results in refresh_cmd_timeout error #81

Closed mmcginnis9272 closed 8 years ago

mmcginnis9272 commented 8 years ago

With REPRAP_DISCOUNT_SMART_CONTROLLER used, compiling results in refresh_cmd_timeout not defined error in the ultralcd.cpp file. I was able to add the following line: inline void refresh_cmd_timeout() {} to a random location in the file ultralcd.cpp file to make it happy and all seems well. Dunno for sure what the purpose of this call is for, though. Here is my resultant ultralcd.cpp file:

include "base.h"

if ENABLED(ULTRA_LCD)

include "Marlin_main.h"

include "cardreader.h"

include "temperature.h"

if ENABLED(AUTO_BED_LEVELING_FEATURE)

include "vector_3.h"

endif

include "planner.h"

include "stepper_indirection.h"

include "stepper.h"

include "configuration_store.h"

include "ultralcd.h"

if HAS(BUZZER)

include "buzzer.h"

endif

int8_t encoderDiff; // updated from interrupt context and added to encoderPosition every LCD update

bool encoderRateMultiplierEnabled; int32_t lastEncoderMovementMillis;

if !MECH(DELTA) && DISABLED(Z_SAFE_HOMING) && Z_HOME_DIR < 0

int pageShowInfo = 0; void set_pageShowInfo(int value){ pageShowInfo = value; }

endif

int plaPreheatHotendTemp; int plaPreheatHPBTemp; int plaPreheatFanSpeed;

int absPreheatHotendTemp; int absPreheatHPBTemp; int absPreheatFanSpeed;

int gumPreheatHotendTemp; int gumPreheatHPBTemp; int gumPreheatFanSpeed;

if HAS(LCD_FILAMENT_SENSOR) || HAS(LCD_POWER_SENSOR)

millis_t previous_lcd_status_ms = 0;

endif

if HAS(LCD_POWER_SENSOR)

millis_t print_millis = 0;

endif

// Function pointer to menu functions. typedef void (*menuFunc_t)();

uint8_t lcd_status_message_level; char lcd_status_message[3 * LCD_WIDTH + 1] = WELCOME_MSG; // worst case is kana with up to 3*LCD_WIDTH+1

if ENABLED(DOGLCD)

include "dogm_lcd_implementation.h"

define LCD_Printpos(x, y) u8g.setPrintPos(x + 5, (y + 1) * (DOG_CHAR_HEIGHT + 2))

else

include "ultralcd_implementation_hitachi_HD44780.h"

define LCD_Printpos(x, y) lcd.setCursor(x, y)

endif

// The main status screen static void lcd_status_screen();

if ENABLED(ULTIPANEL)

if HAS(POWER_SWITCH)

extern bool powersupply;

endif

static float manual_feedrate[] = MANUAL_FEEDRATE; static void lcd_main_menu(); static void lcd_tune_menu(); static void lcd_prepare_menu(); static void lcd_prepare_motion_menu(); static void lcd_prepare_temperature_menu(); static void lcd_move_menu(); static void lcd_control_menu(); static void lcd_stats_menu(); static void lcd_control_temperature_menu(); static void lcd_control_temperature_preheat_pla_settings_menu(); static void lcd_control_temperature_preheat_abs_settings_menu(); static void lcd_control_temperature_preheat_gum_settings_menu(); static void lcd_control_motion_menu(); static void lcd_control_volumetric_menu();

if HAS(LCD_CONTRAST)

static void lcd_set_contrast();

endif

if ENABLED(FWRETRACT)

static void lcd_control_retract_menu();

endif

if MECH(DELTA)

static void lcd_delta_calibrate_menu();

elif !MECH(DELTA) && DISABLED(Z_SAFE_HOMING) && Z_HOME_DIR < 0

static void lcd_level_bed();
static void config_lcd_level_bed();

endif // DELTA

/* Different types of actions that can be used in menu items. _/ static void menu_action_back(menuFunc_t data); static void menu_action_submenu(menuFunc_t data); static void menu_actiongcode(const char pgcode); static void menu_action_function(menuFunc_t data); static void menu_action_setting_edit_bool(const char* pstr, bool* ptr); static void menu_action_setting_edit_int3(const char* pstr, int* ptr, int minValue, int maxValue); static void menu_action_setting_edit_float3(const char* pstr, float* ptr, float minValue, float maxValue); static void menu_action_setting_edit_float32(const char* pstr, float* ptr, float minValue, float maxValue); static void menu_action_setting_edit_float43(const char* pstr, float* ptr, float minValue, float maxValue); static void menu_action_setting_edit_float5(const char* pstr, float* ptr, float minValue, float maxValue); static void menu_action_setting_edit_float51(const char* pstr, float* ptr, float minValue, float maxValue); static void menu_action_setting_edit_float52(const char* pstr, float* ptr, float minValue, float maxValue); static void menu_action_setting_edit_long5(const char* pstr, unsigned long* ptr, unsigned long minValue, unsigned long maxValue); static void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, menuFunc_t callbackFunc); static void menu_action_setting_edit_callback_int3(const char* pstr, int* ptr, int minValue, int maxValue, menuFunc_t callbackFunc); static void menu_action_setting_edit_callback_float3(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); static void menu_action_setting_edit_callback_float32(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); static void menu_action_setting_edit_callback_float43(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); static void menu_action_setting_edit_callback_float5(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); static void menu_action_setting_edit_callback_float51(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); static void menu_action_setting_edit_callback_float52(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); static void menu_action_setting_edit_callback_long5(const char* pstr, unsigned long* ptr, unsigned long minValue, unsigned long maxValue, menuFunc_t callbackFunc);

if ENABLED(SDSUPPORT)

static void lcd_sdcard_menu();
static void menu_action_sdfile(const char\* filename, char\* longFilename);
static void menu_action_sddirectory(const char\* filename, char\* longFilename);

endif

define ENCODER_FEEDRATE_DEADZONE 10

if DISABLED(LCD_I2C_VIKI)

#if DISABLED(ENCODER_STEPS_PER_MENU_ITEM)
  #define ENCODER_STEPS_PER_MENU_ITEM 5
#endif
#if DISABLED(ENCODER_PULSES_PER_STEP)
  #define ENCODER_PULSES_PER_STEP 1
#endif

else

#if DISABLED(ENCODER_STEPS_PER_MENU_ITEM)
  #define ENCODER_STEPS_PER_MENU_ITEM 2 // VIKI LCD rotary encoder uses a different number of steps per rotation
#endif
#if DISABLED(ENCODER_PULSES_PER_STEP)
  #define ENCODER_PULSES_PER_STEP 1
#endif

endif

/* Helper macros for menus */

/**

menuFunc_t currentMenu = lcd_statusscreen; /* function pointer to the currently active menu / millis_t next_lcd_update_ms; uint8_t lcd_status_update_delay; bool ignore_click = false; bool wait_for_unclick; uint8t lcdDrawUpdate = 2; / Set to none-zero when the LCD needs to draw, decreased after every draw. Set to 2 in LCD routines so the LCD gets at least 1 full redraw (first redraw is partial) */

//prevMenu and prevEncoderPosition are used to store the previous menu location when editing settings. menuFunc_t prevMenu = NULL; uint16_t prevEncoderPosition; //Variables used when editing values. const char* editLabel; void* editValue; int32_t minEditValue, maxEditValue; menuFunc_t callbackFunc;

// place-holders for Ki and Kd edits float raw_Ki, raw_Kd;

/**

/*

static void lcd_status_screen() { encoderRateMultiplierEnabled = false;

if ENABLED(LCD_PROGRESS_BAR)

millis_t ms = millis();
#if DISABLED(PROGRESS_MSG_ONCE)
  if (ms > progress_bar_ms + PROGRESS_BAR_MSG_TIME + PROGRESS_BAR_BAR_TIME) {
    progress_bar_ms = ms;
  }
#endif
#if PROGRESS_MSG_EXPIRE > 0
  // Handle message expire
  if (expire_status_ms > 0) {
    #if ENABLED(SDSUPPORT)
      if (card.isFileOpen()) {
        // Expire the message when printing is active
        if (IS_SD_PRINTING) {
          if (ms >= expire_status_ms) {
            lcd_status_message[0] = '\0';
            expire_status_ms = 0;
          }
        }
        else {
          expire_status_ms += LCD_UPDATE_INTERVAL;
        }
      }
      else {
        expire_status_ms = 0;
      }
    #else
      expire_status_ms = 0;
    #endif // SDSUPPORT
  }
#endif

endif //LCD_PROGRESS_BAR

lcd_implementation_status_screen();

if HAS(LCD_POWER_SENSOR)

if (millis() > print_millis + 2000) print_millis = millis();

endif

if HAS(LCD_FILAMENT_SENSOR) || HAS(LCD_POWER_SENSOR)

#if HAS(LCD_FILAMENT_SENSOR) && HAS(LCD_POWER_SENSOR)
  if (millis() > previous_lcd_status_ms + 15000)
#else
  if (millis() > previous_lcd_status_ms + 10000)
#endif
{
  previous_lcd_status_ms = millis();
}

endif

if ENABLED(ULTIPANEL)

bool current_click = LCD_CLICKED;

if (ignore_click) {
  if (wait_for_unclick) {
    if (!current_click)
      ignore_click = wait_for_unclick = false;
    else
      current_click = false;
  }
  else if (current_click) {
    lcd_quick_feedback();
    wait_for_unclick = true;
    current_click = false;
  }
}

if (current_click) {
  lcd_goto_menu(lcd_main_menu, true);
  lcd_implementation_init( // to maybe revive the LCD if static electricity killed it.
    #if ENABLED(LCD_PROGRESS_BAR)
      currentMenu == lcd_status_screen
    #endif
  );
  #if HAS(LCD_FILAMENT_SENSOR) || HAS(LCD_POWER_SENSOR)
    previous_lcd_status_ms = millis();  // get status message to show up for a while
  #endif
}

#if ENABLED(ULTIPANEL_FEEDMULTIPLY)
  // Dead zone at 100% feedrate
  if ((feedrate_multiplier < 100 && (feedrate_multiplier + int(encoderPosition)) > 100) ||
      (feedrate_multiplier > 100 && (feedrate_multiplier + int(encoderPosition)) < 100)) {
    encoderPosition = 0;
    feedrate_multiplier = 100;
  }
  if (feedrate_multiplier == 100) {
    if (int(encoderPosition) > ENCODER_FEEDRATE_DEADZONE) {
      feedrate_multiplier += int(encoderPosition) - ENCODER_FEEDRATE_DEADZONE;
      encoderPosition = 0;
    }
    else if (int(encoderPosition) < -ENCODER_FEEDRATE_DEADZONE) {
      feedrate_multiplier += int(encoderPosition) + ENCODER_FEEDRATE_DEADZONE;
      encoderPosition = 0;
    }
  }
  else {
    feedrate_multiplier += int(encoderPosition);
    encoderPosition = 0;
  }
#endif // ULTIPANEL_FEEDMULTIPLY

feedrate_multiplier = constrain(feedrate_multiplier, 10, 999);

endif // ULTIPANEL

}

if ENABLED(ULTIPANEL)

static void lcd_return_to_status() { lcd_goto_menu(lcd_status_screen); }

if ENABLED(SDSUPPORT)

static void lcd_sdcard_pause() { card.pauseSDPrint(); }

static void lcd_sdcard_resume() { card.startFileprint(); }

static void lcd_sdcard_stop() { quickStop(); card.sdprinting = false; card.closeFile(); autotempShutdown(); cancel_heatup = true; lcd_setstatus(MSG_PRINT_ABORTED, true); }

endif // SDSUPPORT

/*

static void lcd_main_menu() { START_MENU(lcd_status_screen); MENU_ITEM(back, MSG_WATCH, lcd_status_screen); if (movesplanned() || IS_SD_PRINTING) MENU_ITEM(submenu, MSG_TUNE, lcd_tune_menu); else { MENU_ITEM(submenu, MSG_PREPARE, lcd_prepare_menu);

if MECH(DELTA)

  MENU_ITEM(submenu, MSG_DELTA_CALIBRATE, lcd_delta_calibrate_menu);
#endif // DELTA

} MENU_ITEM(submenu, MSG_CONTROL, lcd_control_menu); MENU_ITEM(submenu, MSG_STATS, lcd_stats_menu);

if ENABLED(SDSUPPORT)

if (card.cardOK) {
  if (card.isFileOpen()) {
    if (card.sdprinting)
      MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause);
    else
      MENU_ITEM(function, MSG_RESUME_PRINT, lcd_sdcard_resume);
    MENU_ITEM(function, MSG_STOP_PRINT, lcd_sdcard_stop);
  }
  else {
    MENU_ITEM(submenu, MSG_CARD_MENU, lcd_sdcard_menu);
    #if !PIN_EXISTS(SD_DETECT)
      MENU_ITEM(gcode, MSG_CNG_SDCARD, PSTR("M21"));  // SD-card changed by user
    #endif
  }
}
else {
  MENU_ITEM(submenu, MSG_NO_CARD, lcd_sdcard_menu);
  #if !PIN_EXISTS(SD_DETECT)
    MENU_ITEM(gcode, MSG_INIT_SDCARD, PSTR("M21")); // Manually initialize the SD-card via user interface
  #endif
}

endif // SDSUPPORT

END_MENU(); }

if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART)

static void lcd_autostart_sd() { card.autostart_index = 0; card.setroot(); card.checkautostart(true); }

endif

/**

static void lcd_tune_fixstep() {

if MECH(DELTA)

enqueuecommands_P(PSTR("G28 B"));

else

enqueuecommands_P(PSTR("G28 X Y B"));

endif

}

/*

static void lcd_tune_menu() { START_MENU(lcd_main_menu); MENU_ITEM(back, MSG_MAIN, lcd_main_menu); MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_multiplier, 10, 999);

if TEMP_SENSOR_0 != 0

MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 0", &target_temperature[0], 0, HEATER_0_MAXTEMP);

endif

if TEMP_SENSOR_1 != 0

MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 1", &target_temperature[1], 0, HEATER_1_MAXTEMP);

endif

if TEMP_SENSOR_2 != 0

MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 2", &target_temperature[2], 0, HEATER_2_MAXTEMP);

endif

if TEMP_SENSOR_3 != 0

MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 3", &target_temperature[3], 0, HEATER_3_MAXTEMP);

endif

if TEMP_SENSOR_BED != 0

MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP);

endif

MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255); MENU_ITEM_EDIT(int3, MSG_FLOW " 0", &extruder_multiplier[0], 10, 999);

if TEMP_SENSOR_1 != 0

MENU_ITEM_EDIT(int3, MSG_FLOW " 1", &extruder_multiplier[1], 10, 999);

endif

if TEMP_SENSOR_2 != 0

MENU_ITEM_EDIT(int3, MSG_FLOW " 2", &extruder_multiplier[2], 10, 999);

endif

if TEMP_SENSOR_3 != 0

MENU_ITEM_EDIT(int3, MSG_FLOW " 3", &extruder_multiplier[3], 10, 999);

endif

if ENABLED(BABYSTEPPING)

#if ENABLED(BABYSTEP_XY)
  MENU_ITEM(submenu, MSG_BABYSTEP_X, lcd_tune_babystep_x);
  MENU_ITEM(submenu, MSG_BABYSTEP_Y, lcd_tune_babystep_y);
#endif //BABYSTEP_XY
MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_tune_babystep_z);

endif

MENU_ITEM(function, MSG_FIX_LOSE_STEPS, lcd_tune_fixstep);

if ENABLED(FILAMENTCHANGEENABLE)

 MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600"));

endif

END_MENU(); }

if ENABLED(EASY_LOAD)

static void lcd_extrude(float length, float feedrate) { current_position[E_AXIS] += length;

if MECH(DELTA)

  calculate_delta(current_position);
  plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], feedrate, active_extruder, active_driver);
#else
  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feedrate, active_extruder, active_driver);
#endif

} static void lcd_purge() {lcd_extrude(LCD_PURGE_LENGTH, LCD_PURGE_FEEDRATE);} static void lcd_retract() {lcd_extrude(-LCD_RETRACT_LENGTH, LCD_RETRACT_FEEDRATE);} static void lcd_easy_load() { allow_lengthy_extrude_once = true; lcd_extrude(BOWDEN_LENGTH, LCD_LOAD_FEEDRATE); lcd_return_to_status(); } static void lcd_easy_unload() { allow_lengthy_extrude_once = true; lcd_extrude(-BOWDEN_LENGTH, LCD_UNLOAD_FEEDRATE); lcd_return_to_status(); }

endif //EASY_LOAD

void _lcd_preheat(int endnum, const float temph, const float tempb, const int fan) { if (temph > 0) setTargetHotend(temph, endnum);

if TEMP_SENSOR_BED != 0

setTargetBed(tempb);

endif

fanSpeed = fan; lcd_return_to_status(); } void lcd_preheat_pla0() { _lcd_preheat(0, plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed); } void lcd_preheat_abs0() { _lcd_preheat(0, absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed); } void lcd_preheat_gum0() { _lcd_preheat(0, gumPreheatHotendTemp, gumPreheatHPBTemp, gumPreheatFanSpeed); }

if HOTENDS > 1

void lcd_preheat_pla1() { _lcd_preheat(1, plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed); } void lcd_preheat_abs1() { _lcd_preheat(1, absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed); } void lcd_preheat_gum1() { _lcd_preheat(1, gumPreheatHotendTemp, gumPreheatHPBTemp, gumPreheatFanSpeed); }

if HOTENDS > 2

void lcd_preheat_pla2() { _lcd_preheat(2, plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed); }
void lcd_preheat_abs2() { _lcd_preheat(2, absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed); }
void lcd_preheat_gum2() { _lcd_preheat(2, gumPreheatHotendTemp, gumPreheatHPBTemp, gumPreheatFanSpeed); }
#if HOTENDS > 3
  void lcd_preheat_pla3() { _lcd_preheat(3, plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed); }
  void lcd_preheat_abs3() { _lcd_preheat(3, absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed); }
  void lcd_preheat_gum3() { _lcd_preheat(3, gumPreheatHotendTemp, gumPreheatHPBTemp, gumPreheatFanSpeed); }
#endif

endif

void lcd_preheat_pla0123() { setTargetHotend0(plaPreheatHotendTemp); setTargetHotend1(plaPreheatHotendTemp); setTargetHotend2(plaPreheatHotendTemp); _lcd_preheat(3, plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed); } void lcd_preheat_abs0123() { setTargetHotend0(absPreheatHotendTemp); setTargetHotend1(absPreheatHotendTemp); setTargetHotend2(absPreheatHotendTemp); _lcd_preheat(3, absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed); } void lcd_preheat_gum0123() { setTargetHotend0(gumPreheatHotendTemp); setTargetHotend1(gumPreheatHotendTemp); setTargetHotend2(gumPreheatHotendTemp); _lcd_preheat(3, gumPreheatHotendTemp, gumPreheatHPBTemp, gumPreheatFanSpeed); }

endif // HOTENDS > 1

if TEMP_SENSOR_BED != 0

void lcd_preheat_pla_bedonly() { _lcd_preheat(0, 0, plaPreheatHPBTemp, plaPreheatFanSpeed); } void lcd_preheat_abs_bedonly() { _lcd_preheat(0, 0, absPreheatHPBTemp, absPreheatFanSpeed); } void lcd_preheat_gum_bedonly() { _lcd_preheat(0, 0, gumPreheatHPBTemp, gumPreheatFanSpeed); }

endif

static void lcd_preheat_pla_menu() { START_MENU(lcd_prepare_temperature_menu); MENU_ITEM(back, MSG_TEMPERATURE, lcd_prepare_temperature_menu); MENU_ITEM(function, MSG_PREHEAT_PLA " 0", lcd_preheat_pla0);

if HOTENDS > 1

MENU_ITEM(function, MSG_PREHEAT_PLA " 1", lcd_preheat_pla1);
#if HOTENDS > 2
  MENU_ITEM(function, MSG_PREHEAT_PLA " 2", lcd_preheat_pla2);
  #if HOTENDS > 3
    MENU_ITEM(function, MSG_PREHEAT_PLA " 3", lcd_preheat_pla3);
  #endif
#endif
MENU_ITEM(function, MSG_PREHEAT_PLA_ALL, lcd_preheat_pla0123);

endif

if TEMP_SENSOR_BED != 0

MENU_ITEM(function, MSG_PREHEAT_PLA_BEDONLY, lcd_preheat_pla_bedonly);

endif

END_MENU(); }

static void lcd_preheat_abs_menu() { START_MENU(lcd_prepare_temperature_menu); MENU_ITEM(back, MSG_TEMPERATURE, lcd_prepare_temperature_menu); MENU_ITEM(function, MSG_PREHEAT_ABS " 0", lcd_preheat_abs0);

if HOTENDS > 1

MENU_ITEM(function, MSG_PREHEAT_ABS " 1", lcd_preheat_abs1);
#if HOTENDS > 2
  MENU_ITEM(function, MSG_PREHEAT_ABS " 2", lcd_preheat_abs2);
  #if HOTENDS > 3
    MENU_ITEM(function, MSG_PREHEAT_ABS " 3", lcd_preheat_abs3);
  #endif
#endif
MENU_ITEM(function, MSG_PREHEAT_ABS_ALL, lcd_preheat_abs0123);

endif

if TEMP_SENSOR_BED != 0

MENU_ITEM(function, MSG_PREHEAT_ABS_BEDONLY, lcd_preheat_abs_bedonly);

endif

END_MENU(); }

static void lcd_preheat_gum_menu() { START_MENU(lcd_prepare_temperature_menu); MENU_ITEM(back, MSG_TEMPERATURE, lcd_prepare_temperature_menu); MENU_ITEM(function, MSG_PREHEAT_GUM " 0", lcd_preheat_gum0);

if HOTENDS > 1

MENU_ITEM(function, MSG_PREHEAT_GUM " 1", lcd_preheat_gum1);
#if HOTENDS > 2
  MENU_ITEM(function, MSG_PREHEAT_GUM " 2", lcd_preheat_gum2);
  #if HOTENDS > 3
    MENU_ITEM(function, MSG_PREHEAT_GUM " 3", lcd_preheat_gum3);
  #endif
#endif
MENU_ITEM(function, MSG_PREHEAT_GUM_ALL, lcd_preheat_gum0123);

endif

if TEMP_SENSOR_BED != 0

MENU_ITEM(function, MSG_PREHEAT_GUM_BEDONLY, lcd_preheat_gum_bedonly);

endif

END_MENU(); }

void lcd_cooldown() { disable_all_heaters(); fanSpeed = 0; lcd_return_to_status(); }

/*

static void lcd_prepare_menu() { START_MENU(lcd_main_menu);

// // ^ Main // MENU_ITEM(back, MSG_MAIN, lcd_main_menu);

MENU_ITEM(submenu, MSG_MOTION, lcd_prepare_motion_menu); MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_prepare_temperature_menu); END_MENU(); }

/*

static void lcd_prepare_motion_menu() { START_MENU(lcd_prepare_menu); // // ^ Prepare // MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu);

// // Auto Home // MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28"));

// // Level Bed //

if ENABLED(AUTO_BED_LEVELING_FEATURE)

if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS])
  MENU_ITEM(gcode, MSG_LEVEL_BED, PSTR("G29"));

elif !MECH(DELTA) && DISABLED(Z_SAFE_HOMING) && Z_HOME_DIR < 0

MENU_ITEM(submenu, MSG_MBL_SETTING, config_lcd_level_bed);

endif

// // Set Home Offsets // MENU_ITEM(function, MSG_SET_HOME_OFFSETS, lcd_set_home_offsets);

//Add Preset menu for LASER setting '14. 7. 22

if ENABLED(LASERBEAM)

MENU_ITEM_EDIT(int3, MSG_LASER, &laser_ttl_modulation, 0, 255);
if(laser_ttl_modulation == 0) {
  WRITE(LASER_PWR_PIN, LOW);
}
else {
  WRITE(LASER_PWR_PIN, HIGH);
}

endif

// // Move Axis // MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu);

// // Easy Load //

if ENABLED(EASY_LOAD)

MENU_ITEM(function, MSG_E_BOWDEN_LENGTH, lcd_easy_load);
MENU_ITEM(function, MSG_R_BOWDEN_LENGTH, lcd_easy_unload);
MENU_ITEM(function, MSG_PURGE_XMM, lcd_purge);
MENU_ITEM(function, MSG_RETRACT_XMM, lcd_retract);

endif // EASY_LOAD

// // Babystepping //

if ENABLED(BABYSTEPPING)

MENU_ITEM(submenu, MSG_BABYSTEP, lcd_prepare_motion_babystep);

endif

MENU_ITEM(function, MSG_FIX_LOSE_STEPS, lcd_tune_fixstep);

// // Disable Steppers // MENU_ITEM(gcode, MSG_DISABLE_STEPPERS, PSTR("M84"));

END_MENU(); }

/*

static void lcd_prepare_temperature_menu() { START_MENU(lcd_prepare_menu); // // ^ Prepare // MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu); // // Nozzle, Nozzle 2, Nozzle 3, Nozzle 4 //

if TEMP_SENSOR_0 != 0

MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 0", &target_temperature[0], 0, HEATER_0_MAXTEMP);

endif

if HOTENDS > 1 && TEMP_SENSOR_1 != 0

MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 1", &target_temperature[1], 0, HEATER_1_MAXTEMP);
#if HOTENDS > 2 && TEMP_SENSOR_2 != 0
  MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 2", &target_temperature[2], 0, HEATER_2_MAXTEMP);
  #if HOTENDS > 3 && TEMP_SENSOR_3 != 0
    MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 3", &target_temperature[3], 0, HEATER_3_MAXTEMP);
  #endif // HOTENDS > 3
#endif // HOTENDS > 2

endif // HOTENDS > 1

// // Bed //

if TEMP_SENSOR_BED != 0

MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP);

endif

// // Fan Speed // MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255);

// // Preheat PLA // Preheat ABS // Preheat GUM //

if TEMP_SENSOR_0 != 0

#if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 || TEMP_SENSOR_BED != 0
  MENU_ITEM(submenu, MSG_PREHEAT_PLA, lcd_preheat_pla_menu);
  MENU_ITEM(submenu, MSG_PREHEAT_ABS, lcd_preheat_abs_menu);
  MENU_ITEM(submenu, MSG_PREHEAT_GUM, lcd_preheat_gum_menu);
#else
  MENU_ITEM(function, MSG_PREHEAT_PLA, lcd_preheat_pla0);
  MENU_ITEM(function, MSG_PREHEAT_ABS, lcd_preheat_abs0);
  MENU_ITEM(function, MSG_PREHEAT_GUM, lcd_preheat_gum0);
#endif

endif

// // Cooldown // MENU_ITEM(function, MSG_COOLDOWN, lcd_cooldown);

END_MENU(); }

if MECH(DELTA)

static void lcd_delta_calibrate_menu() { START_MENU(lcd_main_menu); MENU_ITEM(back, MSG_MAIN, lcd_main_menu); MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_X, PSTR("G0 F8000 X-77.94 Y-45 Z0")); MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_Y, PSTR("G0 F8000 X77.94 Y-45 Z0")); MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_Z, PSTR("G0 F8000 X0 Y90 Z0")); MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_CENTER, PSTR("G0 F8000 X0 Y0 Z0")); END_MENU(); }

endif // DELTA

inline void line_to_current(float feedrate) {

if MECH(DELTA)

calculate_delta(current_position);
plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], feedrate/60, active_extruder, active_driver);

else

plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feedrate/60, active_extruder, active_driver);

endif

}

/*

float move_menu_scale; static void lcd_move_menu_axis();

static void _lcd_move(const char name, AxisEnum axis, int min, int max) { if (encoderPosition != 0) { refresh_cmd_timeout(); current_position[axis] += float((int)encoderPosition) \ move_menu_scale; if (SOFTWARE_MIN_ENDSTOPS && current_position[axis] < min) current_position[axis] = min; if (SOFTWARE_MAX_ENDSTOPS && current_position[axis] > max) current_position[axis] = max; encoderPosition = 0; line_to_current(manual_feedrate[axis]); lcdDrawUpdate = 1; } if (lcdDrawUpdate) lcd_implementation_drawedit(name, ftostr31(current_position[axis])); if (LCD_CLICKED) lcd_goto_menu(lcd_move_menu_axis); } static void lcd_move_x() { _lcd_move(PSTR(MSG_MOVE_X), X_AXIS, X_MIN_POS, X_MAX_POS); } static void lcd_move_y() { _lcd_move(PSTR(MSG_MOVE_Y), Y_AXIS, Y_MIN_POS, Y_MAX_POS); } static void lcd_move_z() { _lcd_move(PSTR(MSG_MOVE_Z), Z_AXIS, Z_MIN_POS, Z_MAX_POS); } static void lcd_move_e() { if (encoderPosition != 0) {

if ENABLED(IDLE_OOZING_PREVENT)

  IDLE_OOZING_retract(false);
#endif
current_position[E_AXIS] += float((int)encoderPosition) \* move_menu_scale;
encoderPosition = 0;
line_to_current(manual_feedrate[E_AXIS]);
lcdDrawUpdate = 1;

} if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_MOVE_E), ftostr31(current_position[E_AXIS])); if (LCD_CLICKED) lcd_goto_menu(lcd_move_menu_axis); }

/*

static void lcd_move_menu_10mm() { move_menu_scale = 10.0; lcd_move_menu_axis(); } static void lcd_move_menu_1mm() { move_menu_scale = 1.0; lcd_move_menu_axis(); } static void lcd_move_menu_01mm() { move_menu_scale = 0.1; lcd_move_menu_axis(); }

/*

static void lcd_move_menu() { START_MENU(lcd_prepare_motion_menu); MENU_ITEM(back, MSG_MOTION, lcd_prepare_motion_menu); MENU_ITEM(submenu, MSG_MOVE_10MM, lcd_move_menu_10mm); MENU_ITEM(submenu, MSG_MOVE_1MM, lcd_move_menu_1mm); MENU_ITEM(submenu, MSG_MOVE_01MM, lcd_move_menu_01mm); //TODO:X,Y,Z,E END_MENU(); }

/*

static void lcd_control_menu() { START_MENU(lcd_main_menu); MENU_ITEM(back, MSG_MAIN, lcd_main_menu); MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_control_temperature_menu); MENU_ITEM(submenu, MSG_MOTION, lcd_control_motion_menu); MENU_ITEM(submenu, MSG_FILAMENT, lcd_control_volumetric_menu);

if HAS(LCD_CONTRAST)

//MENU_ITEM_EDIT(int3, MSG_CONTRAST, &lcd_contrast, 0, 63);
MENU_ITEM(submenu, MSG_CONTRAST, lcd_set_contrast);

endif

if ENABLED(FWRETRACT)

MENU_ITEM(submenu, MSG_RETRACT, lcd_control_retract_menu);

endif

// // Switch power on/off //

if HAS(POWER_SWITCH)

if (powersupply)
  MENU_ITEM(gcode, MSG_SWITCH_PS_OFF, PSTR("M81"));
else
  MENU_ITEM(gcode, MSG_SWITCH_PS_ON, PSTR("M80"));

endif

// // Autostart //

if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART)

MENU_ITEM(function, MSG_AUTOSTART, lcd_autostart_sd);

endif

if ENABLED(EEPROM_SETTINGS)

MENU_ITEM(function, MSG_STORE_EPROM, Config_StoreSettings);
MENU_ITEM(function, MSG_LOAD_EPROM, Config_RetrieveSettings);

endif

MENU_ITEM(function, MSG_RESTORE_FAILSAFE, Config_ResetDefault); END_MENU(); }

/*

static void lcd_stats_menu() { char row[30]; int day = printer_usage_seconds / 60 / 60 / 24, hours = (printer_usage_seconds / 60 / 60) % 24, minutes = (printer_usage_seconds / 60) % 60; sprintf_P(row, PSTR(MSG_ONFOR " %id %ih %im"), day, hours, minutes); LCD_Printpos(0, 0); lcd_print(row);

if HAS(POWER_CONSUMPTION_SENSOR)

sprintf_P(row, PSTR(MSG_PWRCONSUMED " %iWh"), power_consumption_hour);
LCD_Printpos(0, 1); lcd_print(row);

endif

if (LCD_CLICKED) lcd_goto_menu(lcd_main_menu); }

/*

/*

/*

/*

/*

/*

/*

/*

/*

/*

/*

/*

void lcd_quick_feedback() { lcdDrawUpdate = 2; next_button_update_ms = millis() + 500;

if ENABLED(LCD_USE_I2C_BUZZER)

#if DISABLED(LCD_FEEDBACK_FREQUENCY_HZ)
  #define LCD_FEEDBACK_FREQUENCY_HZ 100
#endif
#if DISABLED(LCD_FEEDBACK_FREQUENCY_DURATION_MS)
  #define LCD_FEEDBACK_FREQUENCY_DURATION_MS (1000/6)
#endif    
lcd.buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ);

elif HAS(BUZZER)

#if DISABLED(LCD_FEEDBACK_FREQUENCY_HZ)
  #define LCD_FEEDBACK_FREQUENCY_HZ 5000
#endif
#if DISABLED(LCD_FEEDBACK_FREQUENCY_DURATION_MS)
  #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2
#endif
buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ);

else

#if DISABLED(LCD_FEEDBACK_FREQUENCY_DURATION_MS)
  #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2
#endif
delay(LCD_FEEDBACK_FREQUENCY_DURATION_MS);

endif

}

/*

static void menu_action_setting_edit_bool(const char* pstr, bool* ptr) { _ptr = !(_ptr); } static void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, menuFunc_t callback) { menu_action_setting_edit_bool(pstr, ptr); (*callback)(); }

endif //ULTIPANEL

/\ LCD API **/ void lcd_init() { lcd_implementation_init();

if ENABLED(NEWPANEL)

SET_INPUT(BTN_EN1);
SET_INPUT(BTN_EN2);
WRITE(BTN_EN1,HIGH);
WRITE(BTN_EN2,HIGH);
#if BTN_ENC > 0
  SET_INPUT(BTN_ENC);
  WRITE(BTN_ENC,HIGH);
#endif
#if ENABLED(REPRAPWORLD_KEYPAD)
  pinMode(SHIFT_CLK,OUTPUT);
  pinMode(SHIFT_LD,OUTPUT);
  pinMode(SHIFT_OUT,INPUT);
  WRITE(SHIFT_OUT,HIGH);
  WRITE(SHIFT_LD,HIGH);
#endif

else // Not NEWPANEL

#if ENABLED(SR_LCD_2W_NL) // Non latching 2 wire shift register
   pinMode (SR_DATA_PIN, OUTPUT);
   pinMode (SR_CLK_PIN, OUTPUT);
#elif ENABLED(SHIFT_CLK)
   pinMode(SHIFT_CLK,OUTPUT);
   pinMode(SHIFT_LD,OUTPUT);
   pinMode(SHIFT_EN,OUTPUT);
   pinMode(SHIFT_OUT,INPUT);
   WRITE(SHIFT_OUT,HIGH);
   WRITE(SHIFT_LD,HIGH);
   WRITE(SHIFT_EN,LOW);
#endif // SR_LCD_2W_NL

endif//!NEWPANEL

if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT)

pinMode(SD_DETECT_PIN, INPUT);
WRITE(SD_DETECT_PIN, HIGH);
lcd_sd_status = 2; // UNKNOWN

endif

if ENABLED(LCD_HAS_SLOW_BUTTONS)

slow_buttons = 0;

endif

lcd_buttons_update();

if ENABLED(ULTIPANEL)

encoderDiff = 0;

endif

}

int lcd_strlen(char *s) { int i = 0, j = 0; while (s[i]) { if ((s[i] & 0xc0) != 0x80) j++; i++; } return j; }

int lcd_strlen_P(const char *s) { int j = 0; while (pgm_read_byte(s)) { if ((pgm_read_byte(s) & 0xc0) != 0x80) j++; s++; } return j; }

/**

void lcd_ignore_click(bool b) { ignore_click = b; wait_for_unclick = false; }

void lcd_finishstatus(bool persist=false) {

if ENABLED(LCD_PROGRESS_BAR)

progress_bar_ms = millis();
#if PROGRESS_MSG_EXPIRE > 0
  expire_status_ms = persist ? 0 : progress_bar_ms + PROGRESS_MSG_EXPIRE;
#endif

endif

lcdDrawUpdate = 2;

if HAS(LCD_FILAMENT_SENSOR) || HAS(LCD_POWER_SENSOR)

previous_lcd_status_ms = millis();  //get status message to show up for a while

endif

}

if ENABLED(LCD_PROGRESS_BAR) && PROGRESS_MSG_EXPIRE > 0

void dontExpireStatus() { expire_status_ms = 0; }

endif

void set_utf_strlen(char *s, uint8_t n) { uint8_t i = 0, j = 0; while (s[i] && (j < n)) { if ((s[i] & 0xc0u) != 0x80u) j++; i++; } while (j++ < n) s[i++] = ' '; s[i] = 0; }

bool lcd_hasstatus() { return (lcd_status_message[0] != '\0'); }

void lcd_setstatus(const char* message, bool persist) { if (lcd_status_message_level > 0) return; strncpy(lcd_status_message, message, 3*LCD_WIDTH); set_utf_strlen(lcd_status_message, LCD_WIDTH); lcd_finishstatus(persist); }

void lcd_setstatuspgm(const char* message, uint8_t level) { if (level >= lcd_status_message_level) { strncpy_P(lcd_status_message, message, 3*LCD_WIDTH); set_utf_strlen(lcd_status_message, LCD_WIDTH); lcd_status_message_level = level; lcd_finishstatus(level > 0); } }

void lcd_setalertstatuspgm(const char* message) { lcd_setstatuspgm(message, 1);

if ENABLED(ULTIPANEL)

lcd_return_to_status();

endif

}

void lcd_reset_alert_level() { lcd_status_message_level = 0; }

if HAS(LCD_CONTRAST)

void lcd_setcontrast(uint8_t value) { lcd_contrast = value & 0x3F; u8g.setContrast(lcd_contrast); }

endif

if ENABLED(ULTIPANEL)

/**

/****/ /* Number to string conversion **/ /*****/

char conv[8];

// Convert float to string with +123.4 format char *ftostr3(const float &x) { return itostr3((int)x); }

// Convert int to string with 12 format char *itostr2(const uint8_t &x) { //sprintf(conv,"%5.1f",x); int xx = x; conv[0] = (xx / 10) % 10 + '0'; conv[1] = xx % 10 + '0'; conv[2] = 0; return conv; }

// Convert float to string with +123.4 format char ftostr31(const float &x) { int xx = abs(x \ 10); conv[0] = (x >= 0) ? '+' : '-'; conv[1] = (xx / 1000) % 10 + '0'; conv[2] = (xx / 100) % 10 + '0'; conv[3] = (xx / 10) % 10 + '0'; conv[4] = '.'; conv[5] = xx % 10 + '0'; conv[6] = 0; return conv; }

// Convert float to string with 123.4 format, dropping sign char ftostr31ns(const float &x) { int xx = abs(x \ 10); conv[0] = (xx / 1000) % 10 + '0'; conv[1] = (xx / 100) % 10 + '0'; conv[2] = (xx / 10) % 10 + '0'; conv[3] = '.'; conv[4] = xx % 10 + '0'; conv[5] = 0; return conv; }

// Convert float to string with 123.4 format char ftostr32(const float &x) { long xx = abs(x \ 100); conv[0] = x >= 0 ? (xx / 10000) % 10 + '0' : '-'; conv[1] = (xx / 1000) % 10 + '0'; conv[2] = (xx / 100) % 10 + '0'; conv[3] = '.'; conv[4] = (xx / 10) % 10 + '0'; conv[5] = xx % 10 + '0'; conv[6] = 0; return conv; }

// Convert float to string with 1.234 format char ftostr43(const float &x) { long xx = x \ 1000; if (xx >= 0) { conv[0] = (xx / 1000) % 10 + '0'; } else { conv[0] = '-'; } xx = abs(xx); conv[1] = '.'; conv[2] = (xx / 100) % 10 + '0'; conv[3] = (xx / 10) % 10 + '0'; conv[4] = (xx) % 10 + '0'; conv[5] = 0; return conv; }

// Convert float to string with 1.23 format char _ftostr12ns(const float &x) { long xx=x_100;

xx=abs(xx); conv[0]=(xx/100)%10+'0'; conv[1]='.'; conv[2]=(xx/10)%10+'0'; conv[3]=(xx)%10+'0'; conv[4]=0; return conv; }

// Convert float to space-padded string with -23.4 format char ftostr32sp(const float &x) { long xx = abs(x \ 100); uint8_t dig;

if (x < 0) { // negative val = -_0 conv[0] = '-'; dig = (xx / 1000) % 10; conv[1] = dig ? '0' + dig : ' '; } else { // positive val = __0 dig = (xx / 10000) % 10; if (dig) { conv[0] = '0' + dig; conv[1] = '0' + (xx / 1000) % 10; } else { conv[0] = ' '; dig = (xx / 1000) % 10; conv[1] = dig ? '0' + dig : ' '; } }

conv[2] = '0' + (xx / 100) % 10; // lsd always

dig = xx % 10; if (dig) { // 2 decimal places conv[5] = '0' + dig; conv[4] = '0' + (xx / 10) % 10; conv[3] = '.'; } else { // 1 or 0 decimal place dig = (xx / 10) % 10; if (dig) { conv[4] = '0' + dig; conv[3] = '.'; } else { conv[3] = conv[4] = ' '; } conv[5] = ' '; } conv[6] = '\0'; return conv; }

// Convert int to lj string with +123.0 format char *itostr31(const int &x) { conv[0] = x >= 0 ? '+' : '-'; int xx = abs(x); conv[1] = (xx / 100) % 10 + '0'; conv[2] = (xx / 10) % 10 + '0'; conv[3] = xx % 10 + '0'; conv[4] = '.'; conv[5] = '0'; conv[6] = 0; return conv; }

// Convert int to rj string with 123 or -12 format char *itostr3(const int &x) { int xx = x; if (xx < 0) { conv[0] = '-'; xx = -xx; } else conv[0] = xx >= 100 ? (xx / 100) % 10 + '0' : ' ';

conv[1] = xx >= 10 ? (xx / 10) % 10 + '0' : ' '; conv[2] = xx % 10 + '0'; conv[3] = 0; return conv; }

// Convert int to lj string with 123 format char *itostr3left(const int &xx) { if (xx >= 100) { conv[0] = (xx / 100) % 10 + '0'; conv[1] = (xx / 10) % 10 + '0'; conv[2] = xx % 10 + '0'; conv[3] = 0; } else if (xx >= 10) { conv[0] = (xx / 10) % 10 + '0'; conv[1] = xx % 10 + '0'; conv[2] = 0; } else { conv[0] = xx % 10 + '0'; conv[1] = 0; } return conv; }

// Convert int to rj string with 1234 format char *itostr4(const int &xx) { conv[0] = xx >= 1000 ? (xx / 1000) % 10 + '0' : ' '; conv[1] = xx >= 100 ? (xx / 100) % 10 + '0' : ' '; conv[2] = xx >= 10 ? (xx / 10) % 10 + '0' : ' '; conv[3] = xx % 10 + '0'; conv[4] = 0; return conv; }

char *ltostr7(const long &xx) { if (xx >= 1000000) conv[0]=(xx/1000000)%10+'0'; else conv[0]=' '; if (xx >= 100000) conv[1]=(xx/100000)%10+'0'; else conv[1]=' '; if (xx >= 10000) conv[2]=(xx/10000)%10+'0'; else conv[2]=' '; if (xx >= 1000) conv[3]=(xx/1000)%10+'0'; else conv[3]=' '; if (xx >= 100) conv[4]=(xx/100)%10+'0'; else conv[4]=' '; if (xx >= 10) conv[5]=(xx/10)%10+'0'; else conv[5]=' '; conv[6]=(xx)%10+'0'; conv[7]=0; return conv; }

// convert float to string with +123 format char *ftostr30(const float &x) { int xx=x; conv[0]=(xx>=0)?'+':'-'; xx=abs(xx); conv[1]=(xx/100)%10+'0'; conv[2]=(xx/10)%10+'0'; conv[3]=(xx)%10+'0'; conv[4]=0; return conv; }

// Convert float to rj string with 12345 format char *ftostr5(const float &x) { long xx = abs(x); conv[0] = xx >= 10000 ? (xx / 10000) % 10 + '0' : ' '; conv[1] = xx >= 1000 ? (xx / 1000) % 10 + '0' : ' '; conv[2] = xx >= 100 ? (xx / 100) % 10 + '0' : ' '; conv[3] = xx >= 10 ? (xx / 10) % 10 + '0' : ' '; conv[4] = xx % 10 + '0'; conv[5] = 0; return conv; }

// Convert float to string with +1234.5 format char ftostr51(const float &x) { long xx = abs(x \ 10); conv[0] = (x >= 0) ? '+' : '-'; conv[1] = (xx / 10000) % 10 + '0'; conv[2] = (xx / 1000) % 10 + '0'; conv[3] = (xx / 100) % 10 + '0'; conv[4] = (xx / 10) % 10 + '0'; conv[5] = '.'; conv[6] = xx % 10 + '0'; conv[7] = 0; return conv; }

// Convert float to string with +123.45 format char ftostr52(const float &x) { conv[0] = (x >= 0) ? '+' : '-'; long xx = abs(x \ 100); conv[1] = (xx / 10000) % 10 + '0'; conv[2] = (xx / 1000) % 10 + '0'; conv[3] = (xx / 100) % 10 + '0'; conv[4] = '.'; conv[5] = (xx / 10) % 10 + '0'; conv[6] = xx % 10 + '0'; conv[7] = 0; return conv; }

if DISABLED(DELTA) && DISABLED(Z_SAFE_HOMING) && Z_HOME_DIR < 0

static void lcd_level_bed() {

switch(pageShowInfo) {
  case 0:
    {
      LCD_Printpos(0, 0); lcd_printPGM(PSTR(MSG_MBL_INTRO));
      LCD_Printpos(0, 1); lcd_printPGM(PSTR(MSG_MBL_BUTTON));
    }
  break;
  case 1:
    {
      LCD_Printpos(0, 0); lcd_printPGM(PSTR(MSG_MBL_1));
      LCD_Printpos(0, 1); lcd_printPGM(PSTR(MSG_MBL_BUTTON));
    }
  break;
  case 2:
    {
      LCD_Printpos(0, 0); lcd_printPGM(PSTR(MSG_MBL_2));
      LCD_Printpos(0, 1); lcd_printPGM(PSTR(MSG_MBL_BUTTON));
    }
  break;
  case 3:
    {
      LCD_Printpos(0, 0); lcd_printPGM(PSTR(MSG_MBL_3));
      LCD_Printpos(0, 1); lcd_printPGM(PSTR(MSG_MBL_BUTTON));
    }
  break;
  case 4:
    {
      LCD_Printpos(0, 0); lcd_printPGM(PSTR(MSG_MBL_4));
      LCD_Printpos(0, 1); lcd_printPGM(PSTR(MSG_MBL_BUTTON));
    }
  break;
  case 5:
    {
      LCD_Printpos(0, 0); lcd_printPGM(PSTR(MSG_MBL_5));
      LCD_Printpos(0, 1); lcd_printPGM(PSTR(MSG_MBL_BUTTON));
    }
  break;
  case 6:
    {
      LCD_Printpos(0, 0); lcd_printPGM(PSTR(MSG_MBL_6));
      LCD_Printpos(0, 1); lcd_printPGM(PSTR("                  "));
      delay(5000);
      enqueuecommands_P(PSTR("G28"));
      lcd_goto_menu(lcd_prepare_motion_menu);
    }
  break;
}

}

static void config_lcd_level_bed() { ECHO_EM(MSG_MBL_SETTING); enqueuecommands_P(PSTR("G28 M")); pageShowInfo = 0; lcd_goto_menu(lcd_level_bed); }

endif

endif //ULTRA_LCD

if ENABLED(SDSUPPORT) && ENABLED(SD_SETTINGS)

void set_sd_dot() {

if ENABLED(DOGLCD)

  u8g.firstPage();
  do {
    u8g.setColorIndex(1);
    u8g.drawPixel(0, 0); // draw sd dot
    u8g.setColorIndex(1); // black on white
    (_currentMenu)();
  } while( u8g.nextPage() );
#endif

} void unset_sd_dot() {

if ENABLED(DOGLCD)

  u8g.firstPage();
  do {
    u8g.setColorIndex(0);
    u8g.drawPixel(0, 0); // draw sd dot
    u8g.setColorIndex(1); // black on white
    (_currentMenu)();
  } while( u8g.nextPage() );
#endif

}

endif

simonepri commented 8 years ago

Should be solved https://github.com/MagoKimbra/MarlinKimbra/commit/0ffafb8167bbe3044f0f2fd17eb8a42998a2afaf Try this version: https://github.com/MagoKimbra/MarlinKimbra/tree/dev Let me know