🎨 Fix and enhance FTDI Eve Touch UI (#22189)
This commit is contained in:
		@@ -0,0 +1,91 @@
 | 
			
		||||
/*********************************
 | 
			
		||||
 * cocoa_press/leveling_menu.cpp *
 | 
			
		||||
 *********************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 *   Written By Mark Pelletier  2017 - Aleph Objects, Inc.                  *
 | 
			
		||||
 *   Written By Marcio Teixeira 2018 - Aleph Objects, Inc.                  *
 | 
			
		||||
 *                                                                          *
 | 
			
		||||
 *   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.                           *
 | 
			
		||||
 *                                                                          *
 | 
			
		||||
 *   To view a copy of the GNU General Public License, go to the following  *
 | 
			
		||||
 *   location: <https://www.gnu.org/licenses/>.                             *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include "../config.h"
 | 
			
		||||
#include "../screens.h"
 | 
			
		||||
 | 
			
		||||
#ifdef COCOA_LEVELING_MENU
 | 
			
		||||
 | 
			
		||||
#if BOTH(HAS_BED_PROBE,BLTOUCH)
 | 
			
		||||
  #include "../../../../feature/bltouch.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
using namespace FTDI;
 | 
			
		||||
using namespace ExtUI;
 | 
			
		||||
using namespace Theme;
 | 
			
		||||
 | 
			
		||||
#define GRID_ROWS 5
 | 
			
		||||
#define GRID_COLS 3
 | 
			
		||||
#define BED_MESH_TITLE_POS BTN_POS(1,1), BTN_SIZE(3,1)
 | 
			
		||||
#define PROBE_BED_POS      BTN_POS(1,2), BTN_SIZE(1,1)
 | 
			
		||||
#define SHOW_MESH_POS      BTN_POS(2,2), BTN_SIZE(1,1)
 | 
			
		||||
#define EDIT_MESH_POS      BTN_POS(3,2), BTN_SIZE(1,1)
 | 
			
		||||
#define BLTOUCH_TITLE_POS  BTN_POS(1,3), BTN_SIZE(3,1)
 | 
			
		||||
#define BLTOUCH_RESET_POS  BTN_POS(1,4), BTN_SIZE(1,1)
 | 
			
		||||
#define BLTOUCH_TEST_POS   BTN_POS(2,4), BTN_SIZE(1,1)
 | 
			
		||||
#define BACK_POS           BTN_POS(1,5), BTN_SIZE(3,1)
 | 
			
		||||
 | 
			
		||||
void LevelingMenu::onRedraw(draw_mode_t what) {
 | 
			
		||||
  if (what & BACKGROUND) {
 | 
			
		||||
    CommandProcessor cmd;
 | 
			
		||||
    cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color))
 | 
			
		||||
       .cmd(CLEAR(true,true,true))
 | 
			
		||||
       .tag(0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (what & FOREGROUND) {
 | 
			
		||||
    CommandProcessor cmd;
 | 
			
		||||
    cmd.font(font_large)
 | 
			
		||||
       .cmd(COLOR_RGB(bg_text_enabled))
 | 
			
		||||
       .text(BED_MESH_TITLE_POS, GET_TEXT_F(MSG_BED_LEVELING))
 | 
			
		||||
       .text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH))
 | 
			
		||||
       .font(font_medium).colors(normal_btn)
 | 
			
		||||
       .tag(2).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED))
 | 
			
		||||
       .enabled(ENABLED(HAS_MESH))
 | 
			
		||||
       .tag(3).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH))
 | 
			
		||||
       .enabled(ENABLED(HAS_MESH))
 | 
			
		||||
       .tag(4).button(EDIT_MESH_POS, GET_TEXT_F(MSG_EDIT_MESH))
 | 
			
		||||
       #undef  GRID_COLS
 | 
			
		||||
       #define GRID_COLS 2
 | 
			
		||||
       .tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET))
 | 
			
		||||
       .tag(6).button(BLTOUCH_TEST_POS,  GET_TEXT_F(MSG_BLTOUCH_SELFTEST))
 | 
			
		||||
       #undef  GRID_COLS
 | 
			
		||||
       #define GRID_COLS 3
 | 
			
		||||
       .colors(action_btn)
 | 
			
		||||
       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool LevelingMenu::onTouchEnd(uint8_t tag) {
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
    case 1: GOTO_PREVIOUS(); break;
 | 
			
		||||
    case 2: BedMeshViewScreen::doProbe(); break;
 | 
			
		||||
    case 3: BedMeshViewScreen::show(); break;
 | 
			
		||||
    case 4: BedMeshEditScreen::show(); break;
 | 
			
		||||
    case 5: injectCommands_P(PSTR("M280 P0 S60")); break;
 | 
			
		||||
    case 6: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
 | 
			
		||||
    default: return false;
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // COCOA_LEVELING_MENU
 | 
			
		||||
@@ -0,0 +1,32 @@
 | 
			
		||||
/*******************************
 | 
			
		||||
 * cocoa_press/leveling_menu.h *
 | 
			
		||||
 ******************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 *   Written By Mark Pelletier  2017 - Aleph Objects, Inc.                  *
 | 
			
		||||
 *   Written By Marcio Teixeira 2018 - Aleph Objects, Inc.                  *
 | 
			
		||||
 *                                                                          *
 | 
			
		||||
 *   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.                           *
 | 
			
		||||
 *                                                                          *
 | 
			
		||||
 *   To view a copy of the GNU General Public License, go to the following  *
 | 
			
		||||
 *   location: <https://www.gnu.org/licenses/>.                             *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#define COCOA_LEVELING_MENU
 | 
			
		||||
#define COCOA_LEVELING_MENU_CLASS LevelingMenu
 | 
			
		||||
 | 
			
		||||
class LevelingMenu : public BaseScreen, public CachedScreen<LEVELING_SCREEN_CACHE> {
 | 
			
		||||
  public:
 | 
			
		||||
    static void onRedraw(draw_mode_t);
 | 
			
		||||
    static bool onTouchEnd(uint8_t tag);
 | 
			
		||||
};
 | 
			
		||||
@@ -88,7 +88,7 @@ bool MainMenu::onTouchEnd(uint8_t tag) {
 | 
			
		||||
    case  8: GOTO_SCREEN(AdvancedSettingsMenu);             break;
 | 
			
		||||
    case  9: injectCommands_P(PSTR("M84"));                 break;
 | 
			
		||||
    #if HAS_LEVELING
 | 
			
		||||
    case 10:  GOTO_SCREEN(LevelingMenu);                     break;
 | 
			
		||||
    case 10:  GOTO_SCREEN(LevelingMenu);                    break;
 | 
			
		||||
    #endif
 | 
			
		||||
    case 11: GOTO_SCREEN(AboutScreen);                      break;
 | 
			
		||||
    default:
 | 
			
		||||
 
 | 
			
		||||
@@ -132,4 +132,3 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // FTDI_LEVELING_MENU
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -34,28 +34,53 @@
 | 
			
		||||
 * Formats a temperature string (e.g. "100°C")
 | 
			
		||||
 */
 | 
			
		||||
void format_temp(char *str, const_celsius_float_t t1) {
 | 
			
		||||
  sprintf_P(str, PSTR("%3d" S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C));
 | 
			
		||||
  #ifdef TOUCH_UI_LCD_TEMP_PRECISION
 | 
			
		||||
    char num1[7];
 | 
			
		||||
    dtostrf(t1, 4 + TOUCH_UI_LCD_TEMP_PRECISION, TOUCH_UI_LCD_TEMP_PRECISION, num1);
 | 
			
		||||
    sprintf_P(str, PSTR("%s" S_FMT), num1, GET_TEXT(MSG_UNITS_C));
 | 
			
		||||
  #else
 | 
			
		||||
    sprintf_P(str, PSTR("%3d" S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C));
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Formats a temperature string for an idle heater (e.g. "100 °C / idle")
 | 
			
		||||
 */
 | 
			
		||||
void format_temp_and_idle(char *str, const_celsius_float_t t1) {
 | 
			
		||||
  sprintf_P(str, PSTR("%3d" S_FMT " / " S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C), GET_TEXT(MSG_IDLE));
 | 
			
		||||
  #ifdef TOUCH_UI_LCD_TEMP_PRECISION
 | 
			
		||||
    char num1[7];
 | 
			
		||||
    dtostrf(t1, 4 + TOUCH_UI_LCD_TEMP_PRECISION, TOUCH_UI_LCD_TEMP_PRECISION, num1);
 | 
			
		||||
    sprintf_P(str, PSTR("%s" S_FMT " / " S_FMT), num1, GET_TEXT(MSG_UNITS_C), GET_TEXT(MSG_IDLE));
 | 
			
		||||
  #else
 | 
			
		||||
    sprintf_P(str, PSTR("%3d" S_FMT " / " S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C), GET_TEXT(MSG_IDLE));
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Formats a temperature string for an active heater (e.g. "100 / 200°C")
 | 
			
		||||
 */
 | 
			
		||||
void format_temp_and_temp(char *str, const_celsius_float_t t1, const_celsius_float_t t2) {
 | 
			
		||||
  sprintf_P(str, PSTR("%3d / %3d" S_FMT), ROUND(t1), ROUND(t2), GET_TEXT(MSG_UNITS_C));
 | 
			
		||||
  #ifdef TOUCH_UI_LCD_TEMP_PRECISION
 | 
			
		||||
    char num1[7], num2[7];
 | 
			
		||||
    dtostrf(t1, 4 + TOUCH_UI_LCD_TEMP_PRECISION, TOUCH_UI_LCD_TEMP_PRECISION, num1);
 | 
			
		||||
    dtostrf(t2, 4 + TOUCH_UI_LCD_TEMP_PRECISION, TOUCH_UI_LCD_TEMP_PRECISION, num2);
 | 
			
		||||
    sprintf_P(str, PSTR("%s / %s" S_FMT), num1, num2, GET_TEXT(MSG_UNITS_C));
 | 
			
		||||
  #else
 | 
			
		||||
    sprintf_P(str, PSTR("%3d / %3d" S_FMT), ROUND(t1), ROUND(t2), GET_TEXT(MSG_UNITS_C));
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Formats a temperature string for a material (e.g. "100°C (PLA)")
 | 
			
		||||
 */
 | 
			
		||||
void format_temp_and_material(char *str, const_celsius_float_t t1, const char *material) {
 | 
			
		||||
  sprintf_P(str, PSTR("%3d" S_FMT " (" S_FMT ")"), ROUND(t1), GET_TEXT(MSG_UNITS_C), material);
 | 
			
		||||
  #ifdef TOUCH_UI_LCD_TEMP_PRECISION
 | 
			
		||||
    char num1[7];
 | 
			
		||||
    dtostrf(t1, 4 + TOUCH_UI_LCD_TEMP_PRECISION, TOUCH_UI_LCD_TEMP_PRECISION, num1);
 | 
			
		||||
    sprintf_P(str, PSTR("%s" S_FMT " (" S_FMT ")"), num1, GET_TEXT(MSG_UNITS_C), material);
 | 
			
		||||
  #else
 | 
			
		||||
    sprintf_P(str, PSTR("%3d" S_FMT " (" S_FMT ")"), ROUND(t1), GET_TEXT(MSG_UNITS_C), material);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,14 @@ constexpr static ZOffsetScreenData &mydata = screen_data.ZOffsetScreen;
 | 
			
		||||
 | 
			
		||||
void ZOffsetScreen::onEntry() {
 | 
			
		||||
  mydata.z = SHEET_THICKNESS;
 | 
			
		||||
  mydata.softEndstopState = getSoftEndstopState();
 | 
			
		||||
  BaseNumericAdjustmentScreen::onEntry();
 | 
			
		||||
  if (wizardRunning())
 | 
			
		||||
    setSoftEndstopState(false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ZOffsetScreen::onExit() {
 | 
			
		||||
  setSoftEndstopState(mydata.softEndstopState);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ZOffsetScreen::onRedraw(draw_mode_t what) {
 | 
			
		||||
@@ -50,17 +57,13 @@ void ZOffsetScreen::onRedraw(draw_mode_t what) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ZOffsetScreen::move(float mm, int16_t steps) {
 | 
			
		||||
  // We can't store state after the call to the AlertBox, so
 | 
			
		||||
  // check whether the current position equal mydata.z in order
 | 
			
		||||
  // to know whether the user started the wizard.
 | 
			
		||||
  if (getAxisPosition_mm(Z) == mydata.z) {
 | 
			
		||||
    // In the wizard
 | 
			
		||||
  if (wizardRunning()) {
 | 
			
		||||
    mydata.z += mm;
 | 
			
		||||
    setAxisPosition_mm(mydata.z, Z);
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    // Otherwise doing a manual adjustment, possibly during a print.
 | 
			
		||||
    babystepAxis_steps(steps, Z);
 | 
			
		||||
    TERN(BABYSTEPPING, babystepAxis_steps(steps, Z), UNUSED(steps));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -84,9 +87,16 @@ void ZOffsetScreen::runWizard() {
 | 
			
		||||
  AlertDialogBox::show(PSTR("After the printer finishes homing, adjust the Z Offset so that a sheet of paper can pass between the nozzle and bed with slight resistance."));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ZOffsetScreen::wizardRunning() {
 | 
			
		||||
  // We can't store state after the call to the AlertBox, so
 | 
			
		||||
  // check whether the current Z position equals mydata.z in order
 | 
			
		||||
  // to know whether the user started the wizard.
 | 
			
		||||
  return getAxisPosition_mm(Z) == mydata.z;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ZOffsetScreen::onTouchHeld(uint8_t tag) {
 | 
			
		||||
  const int16_t steps = mmToWholeSteps(getIncrement(), Z);
 | 
			
		||||
  const float increment = mmFromWholeSteps(steps, Z);
 | 
			
		||||
  const int16_t steps =   TERN(BABYSTEPPING, mmToWholeSteps(getIncrement(), Z), 0);
 | 
			
		||||
  const float increment = TERN(BABYSTEPPING, mmFromWholeSteps(steps, Z), getIncrement());
 | 
			
		||||
  switch (tag) {
 | 
			
		||||
    case 2: runWizard(); break;
 | 
			
		||||
    case 4: UI_DECREMENT(ZOffset_mm); move(-increment, -steps); break;
 | 
			
		||||
 
 | 
			
		||||
@@ -27,14 +27,17 @@
 | 
			
		||||
 | 
			
		||||
struct ZOffsetScreenData : public BaseNumericAdjustmentScreenData {
 | 
			
		||||
  float z;
 | 
			
		||||
  bool softEndstopState;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ZOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen<ZOFFSET_SCREEN_CACHE> {
 | 
			
		||||
  private:
 | 
			
		||||
    static void move(float mm, int16_t steps);
 | 
			
		||||
    static void runWizard();
 | 
			
		||||
    static bool wizardRunning();
 | 
			
		||||
  public:
 | 
			
		||||
    static void onEntry();
 | 
			
		||||
    static void onExit();
 | 
			
		||||
    static void onRedraw(draw_mode_t);
 | 
			
		||||
    static bool onTouchHeld(uint8_t tag);
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -113,6 +113,7 @@ SCREEN_TABLE {
 | 
			
		||||
  DECL_SCREEN_IF_INCLUDED(COCOA_PREHEAT_MENU)
 | 
			
		||||
  DECL_SCREEN_IF_INCLUDED(COCOA_PREHEAT_SCREEN)
 | 
			
		||||
  DECL_SCREEN_IF_INCLUDED(COCOA_LOAD_CHOCOLATE_SCREEN)
 | 
			
		||||
  DECL_SCREEN_IF_INCLUDED(COCOA_LEVELING_MENU)
 | 
			
		||||
  DECL_SCREEN_IF_INCLUDED(COCOA_MOVE_XYZ_SCREEN)
 | 
			
		||||
  DECL_SCREEN_IF_INCLUDED(COCOA_MOVE_E_SCREEN)
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -157,6 +157,7 @@ enum {
 | 
			
		||||
  #include "cocoa_press/load_chocolate.h"
 | 
			
		||||
  #include "cocoa_press/move_xyz_screen.h"
 | 
			
		||||
  #include "cocoa_press/move_e_screen.h"
 | 
			
		||||
  #include "cocoa_press/leveling_menu.h"
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
  #include "generic/status_screen.h"
 | 
			
		||||
@@ -206,7 +207,9 @@ enum {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HAS_LEVELING
 | 
			
		||||
  #include "generic/leveling_menu.h"
 | 
			
		||||
  #if DISABLED(TOUCH_UI_COCOA_PRESS)
 | 
			
		||||
    #include "generic/leveling_menu.h"
 | 
			
		||||
  #endif
 | 
			
		||||
  #if HAS_BED_PROBE
 | 
			
		||||
    #include "generic/z_offset_screen.h"
 | 
			
		||||
  #endif
 | 
			
		||||
 
 | 
			
		||||
@@ -108,6 +108,7 @@ namespace Theme {
 | 
			
		||||
 | 
			
		||||
    constexpr uint32_t bed_mesh_lines_rgb   = accent_color_6;
 | 
			
		||||
    constexpr uint32_t bed_mesh_shadow_rgb  = 0x444444;
 | 
			
		||||
    #define BED_MESH_POINTS_GRAY
 | 
			
		||||
  #else
 | 
			
		||||
    constexpr uint32_t theme_darkest        = gray_color_1;
 | 
			
		||||
    constexpr uint32_t theme_dark           = gray_color_2;
 | 
			
		||||
 
 | 
			
		||||
@@ -1033,10 +1033,10 @@ namespace ExtUI {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool isPrintingFromMediaPaused() {
 | 
			
		||||
    return TERN0(SDSUPPORT, isPrintingFromMedia() && printingIsPaused());
 | 
			
		||||
    return TERN0(SDSUPPORT, IS_SD_PAUSED());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool isPrintingFromMedia() { return IS_SD_PRINTING(); }
 | 
			
		||||
  bool isPrintingFromMedia() { return TERN0(SDSUPPORT, IS_SD_PRINTING() || IS_SD_PAUSED()); }
 | 
			
		||||
 | 
			
		||||
  bool isPrinting() {
 | 
			
		||||
    return commandsInQueue() || isPrintingFromMedia() || printJobOngoing() || printingIsPaused();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user