Improve and fix LULZBOT_TOUCH_UI (#15434)

- Add start print confirmation dialog box
- Fix incorrect text colors in UI
- Adjust bio printer UI
This commit is contained in:
Marcio Teixeira 2019-09-30 21:15:48 -06:00 committed by Scott Lahteine
parent b198f321c8
commit 087fe0e9d6
14 changed files with 178 additions and 100 deletions

View File

@ -184,6 +184,7 @@ namespace Language_en {
PROGMEM Language_Str ERASING = u8"Erasing...";
PROGMEM Language_Str ERASED = u8"SPI flash erased";
PROGMEM Language_Str CALIBRATION_WARNING = u8"For best results, unload the filament and clean the hotend prior to starting calibration. Continue?";
PROGMEM Language_Str START_PRINT_CONFIRMATION = u8"Start printing %s?";
PROGMEM Language_Str ABORT_WARNING = u8"Are you sure you want to cancel the print?";
PROGMEM Language_Str EXTRUDER_SELECTION = u8"Extruder Selection";
PROGMEM Language_Str CURRENT_TEMPERATURE = u8"Current Temp";
@ -222,10 +223,12 @@ namespace Language_en {
#ifdef LULZBOT_USE_BIOPRINTER_UI
PROGMEM Language_Str MAIN_MENU = u8"Main Menu";
PROGMEM Language_Str RELEASE_XY_AXIS = u8"Release XY Axis";
PROGMEM Language_Str LOAD_SYRINGE = u8"Load Syringe";
PROGMEM Language_Str MOVE_TO_HOME = u8"Move To Home";
PROGMEM Language_Str RAISE_PLUNGER = u8"Raise Plunger";
PROGMEM Language_Str RELEASE_XY_AXIS = u8"Release X and Y Axis";
PROGMEM Language_Str AUTOLEVEL_X_AXIS = u8"Auto-level X Axis";
PROGMEM Language_Str BED_TEMPERATURE = u8"Bed Temperature";
PROGMEM Language_Str LOADING_WARNING = u8"About to home to loading position. Ensure the top and the bed of the printer are clear.\n\nContinue?";
PROGMEM Language_Str HOMING_WARNING = u8"About to re-home plunger and auto-level. Remove syringe prior to proceeding.\n\nContinue?";
PROGMEM Language_Str HOME_XYZ_WARNING = u8"About to move to home position. Ensure the top and the bed of the printer are clear.\n\nContinue?";
PROGMEM Language_Str HOME_E_WARNING = u8"About to re-home plunger and auto-level. Remove syringe prior to proceeding.\n\nContinue?";
#endif
}; // namespace Language_en

View File

@ -1,26 +0,0 @@
/***************
* languages.h *
***************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - 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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#pragma once
#include "language_en.h"
#include "language_de.h"
#include "language_fr.h"

View File

@ -85,12 +85,14 @@ void BaseNumericAdjustmentScreen::widgets_t::_button_style(CommandProcessor &cmd
default: break;
}
const bool rgb_changed = old_colors->rgb != new_colors->rgb;
const bool rgb_changed = (old_colors->rgb != new_colors->rgb) ||
(_style == TEXT_LABEL && style != TEXT_LABEL) ||
(_style != TEXT_LABEL && style == TEXT_LABEL);
const bool grad_changed = old_colors->grad != new_colors->grad;
const bool fg_changed = (old_colors->fg != new_colors->fg) || (_style == TEXT_AREA);
const bool bg_changed = old_colors->bg != new_colors->bg;
if (rgb_changed) cmd.cmd(COLOR_RGB(new_colors->rgb));
if (rgb_changed) cmd.cmd(COLOR_RGB(style == TEXT_LABEL ? bg_text_enabled : new_colors->rgb));
if (grad_changed) cmd.gradcolor(new_colors->grad);
if (fg_changed) cmd.fgcolor(new_colors->fg);
if (bg_changed) cmd.bgcolor(new_colors->bg);
@ -122,6 +124,7 @@ BaseNumericAdjustmentScreen::widgets_t &BaseNumericAdjustmentScreen::widgets_t::
void BaseNumericAdjustmentScreen::widgets_t::heading(progmem_str label) {
if (_what & BACKGROUND) {
CommandProcessor cmd;
_button_style(cmd, TEXT_LABEL);
cmd.font(font_medium)
.text(
#ifdef TOUCH_UI_PORTRAIT
@ -208,11 +211,12 @@ void BaseNumericAdjustmentScreen::widgets_t::adjuster_sram_val(uint8_t tag, prog
CommandProcessor cmd;
if (_what & BACKGROUND) {
_button_style(cmd, TEXT_AREA);
_button_style(cmd, TEXT_LABEL);
cmd.tag(0)
.font(font_small)
.text( BTN_POS(1,_line), BTN_SIZE(4,1), label)
.fgcolor(_color).button( BTN_POS(5,_line), BTN_SIZE(5,1), F(""), OPT_FLAT);
.text( BTN_POS(1,_line), BTN_SIZE(4,1), label);
_button_style(cmd, TEXT_AREA);
cmd.fgcolor(_color).button( BTN_POS(5,_line), BTN_SIZE(5,1), F(""), OPT_FLAT);
}
cmd.font(font_medium);
@ -267,12 +271,13 @@ void BaseNumericAdjustmentScreen::widgets_t::text_field(uint8_t tag, progmem_str
CommandProcessor cmd;
if (_what & BACKGROUND) {
_button_style(cmd, TEXT_AREA);
_button_style(cmd, TEXT_LABEL);
cmd.enabled(1)
.tag(0)
.font(font_small)
.text( BTN_POS(1,_line), BTN_SIZE(4,1), label)
.fgcolor(_color)
.text( BTN_POS(1,_line), BTN_SIZE(4,1), label);
_button_style(cmd, TEXT_AREA);
cmd.fgcolor(_color)
.tag(tag)
.button( BTN_POS(5,_line), BTN_SIZE(9,1), F(""), OPT_FLAT);
}
@ -297,14 +302,15 @@ void BaseNumericAdjustmentScreen::widgets_t::toggle(uint8_t tag, progmem_str lab
CommandProcessor cmd;
if (_what & BACKGROUND) {
_button_style(cmd, TEXT_LABEL);
cmd.font(font_small)
.text(
#ifdef TOUCH_UI_PORTRAIT
BTN_POS(1, _line), BTN_SIZE( 8,1),
#else
BTN_POS(1, _line), BTN_SIZE(10,1),
#endif
label
#ifdef TOUCH_UI_PORTRAIT
BTN_POS(1, _line), BTN_SIZE( 8,1),
#else
BTN_POS(1, _line), BTN_SIZE(10,1),
#endif
label
);
}
@ -314,12 +320,12 @@ void BaseNumericAdjustmentScreen::widgets_t::toggle(uint8_t tag, progmem_str lab
.enabled(is_enabled)
.font(font_small)
.toggle2(
#ifdef TOUCH_UI_PORTRAIT
BTN_POS( 9,_line), BTN_SIZE(5,1),
#else
BTN_POS(10,_line), BTN_SIZE(4,1),
#endif
GET_TEXTF(NO), GET_TEXTF(YES), value
#ifdef TOUCH_UI_PORTRAIT
BTN_POS( 9,_line), BTN_SIZE(5,1),
#else
BTN_POS(10,_line), BTN_SIZE(4,1),
#endif
GET_TEXTF(NO), GET_TEXTF(YES), value
);
}
@ -330,6 +336,7 @@ void BaseNumericAdjustmentScreen::widgets_t::home_buttons(uint8_t tag) {
CommandProcessor cmd;
if (_what & BACKGROUND) {
_button_style(cmd, TEXT_LABEL);
cmd.font(font_small)
.text(BTN_POS(1, _line), BTN_SIZE(4,1), GET_TEXTF(HOME));
}

View File

@ -29,14 +29,18 @@
using namespace FTDI;
void BioConfirmHomeE::onRedraw(draw_mode_t) {
drawMessage(GET_TEXTF(HOMING_WARNING));
drawMessage(GET_TEXTF(HOME_E_WARNING));
drawYesNoButtons(1);
}
bool BioConfirmHomeE::onTouchEnd(uint8_t tag) {
switch (tag) {
case 1:
SpinnerDialogBox::enqueueAndWait_P(F(LULZBOT_HOME_E_COMMANDS));
SpinnerDialogBox::enqueueAndWait_P(F(
"G112\n"
LULZBOT_AXIS_LEVELING_COMMANDS "\n"
LULZBOT_PARK_AND_RELEASE_COMMANDS
));
current_screen.forget();
break;
case 2:

View File

@ -29,14 +29,17 @@
using namespace FTDI;
void BioConfirmHomeXYZ::onRedraw(draw_mode_t) {
drawMessage(GET_TEXTF(LOADING_WARNING));
drawMessage(GET_TEXTF(HOME_XYZ_WARNING));
drawYesNoButtons(1);
}
bool BioConfirmHomeXYZ::onTouchEnd(uint8_t tag) {
switch (tag) {
case 1:
SpinnerDialogBox::enqueueAndWait_P(F(LULZBOT_HOME_XYZ_COMMANDS));
SpinnerDialogBox::enqueueAndWait_P(F(
"G28\n"
LULZBOT_PARK_AND_RELEASE_COMMANDS
));
current_screen.forget();
break;
case 2:

View File

@ -30,7 +30,7 @@ using namespace FTDI;
using namespace Theme;
void MainMenu::onRedraw(draw_mode_t what) {
#define GRID_ROWS 8
#define GRID_ROWS 10
#define GRID_COLS 2
if (what & BACKGROUND) {
@ -45,14 +45,16 @@ void MainMenu::onRedraw(draw_mode_t what) {
.font(font_large).text( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXTF(MAIN_MENU))
.colors(normal_btn)
.font(font_medium)
.tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXTF(LOAD_SYRINGE))
.tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(RELEASE_XY_AXIS))
.tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(BED_TEMPERATURE))
.tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(INTERFACE_SETTINGS))
.tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(ADVANCED_SETTINGS))
.tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(ABOUT_PRINTER))
.tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXTF(MOVE_TO_HOME))
.tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(RAISE_PLUNGER))
.tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(RELEASE_XY_AXIS))
.tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(AUTOLEVEL_X_AXIS))
.tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(BED_TEMPERATURE))
.tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(INTERFACE_SETTINGS))
.tag(8).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXTF(ADVANCED_SETTINGS))
.tag(9).button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXTF(ABOUT_PRINTER))
.colors(action_btn)
.tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXTF(BACK));
.tag(1).button( BTN_POS(1,10), BTN_SIZE(2,1), GET_TEXTF(BACK));
}
#undef GRID_COLS
@ -62,14 +64,18 @@ void MainMenu::onRedraw(draw_mode_t what) {
bool MainMenu::onTouchEnd(uint8_t tag) {
using namespace ExtUI;
const bool e_homed = isAxisPositionKnown(E0);
switch (tag) {
case 1: SaveSettingsDialogBox::promptToSaveSettings(); break;
case 2: GOTO_SCREEN(BioConfirmHomeXYZ); break;
case 3: StatusScreen::unlockMotors(); break;
case 4: GOTO_SCREEN(TemperatureScreen); break;
case 5: GOTO_SCREEN(InterfaceSettingsScreen); break;
case 6: GOTO_SCREEN(AdvancedSettingsMenu); break;
case 7: GOTO_SCREEN(AboutScreen); break;
case 3: SpinnerDialogBox::enqueueAndWait_P(e_homed ? F("G0 E0 F120") : F("G112")); break;
case 4: StatusScreen::unlockMotors(); break;
case 5: SpinnerDialogBox::enqueueAndWait_P(F(LULZBOT_AXIS_LEVELING_COMMANDS)); break;
case 6: GOTO_SCREEN(TemperatureScreen); break;
case 7: GOTO_SCREEN(InterfaceSettingsScreen); break;
case 8: GOTO_SCREEN(AdvancedSettingsMenu); break;
case 9: GOTO_SCREEN(AboutScreen); break;
default:
return false;
}

View File

@ -275,7 +275,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) {
break;
case 9: GOTO_SCREEN(FilesScreen); break;
case 10: GOTO_SCREEN(MainMenu); break;
case 13: SpinnerDialogBox::enqueueAndWait_P(F("G112")); break;
case 13: GOTO_SCREEN(BioConfirmHomeE); break;
case 14: SpinnerDialogBox::enqueueAndWait_P(F("G28 Z")); break;
case 15: GOTO_SCREEN(TemperatureScreen); break;
case 16: fine_motion = !fine_motion; break;

View File

@ -38,7 +38,7 @@ void TuneMenu::onRedraw(draw_mode_t what) {
.font(font_medium);
}
#define GRID_ROWS 7
#define GRID_ROWS 8
#define GRID_COLS 2
if (what & FOREGROUND) {
@ -55,9 +55,10 @@ void TuneMenu::onRedraw(draw_mode_t what) {
.enabled(false)
#endif
.tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(NUDGE_NOZZLE))
.enabled(!isPrinting()).tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(LOAD_SYRINGE))
.enabled(!isPrinting()).tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(RELEASE_XY_AXIS))
.colors(action_btn) .tag(1).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(BACK));
.enabled(!isPrinting()).tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(MOVE_TO_HOME))
.enabled(!isPrinting()).tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(RAISE_PLUNGER))
.enabled(!isPrinting()).tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(RELEASE_XY_AXIS))
.colors(action_btn) .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXTF(BACK));
}
#undef GRID_COLS
#undef GRID_ROWS
@ -65,12 +66,13 @@ void TuneMenu::onRedraw(draw_mode_t what) {
bool TuneMenu::onTouchEnd(uint8_t tag) {
switch (tag) {
case 1: GOTO_PREVIOUS(); break;
case 2: GOTO_SCREEN(FeedratePercentScreen); break;
case 3: GOTO_SCREEN(TemperatureScreen); break;
case 4: GOTO_SCREEN(NudgeNozzleScreen); break;
case 5: GOTO_SCREEN(BioConfirmHomeXYZ); break;
case 6: StatusScreen::unlockMotors(); break;
case 1: GOTO_PREVIOUS(); break;
case 2: GOTO_SCREEN(FeedratePercentScreen); break;
case 3: GOTO_SCREEN(TemperatureScreen); break;
case 4: GOTO_SCREEN(NudgeNozzleScreen); break;
case 5: GOTO_SCREEN(BioConfirmHomeXYZ); break;
case 6: SpinnerDialogBox::enqueueAndWait_P(F("G0 E0 F120")); break;
case 7: StatusScreen::unlockMotors(); break;
default:
return false;
}

View File

@ -0,0 +1,70 @@
/**************************************
* confirm_start_print_dialog_box.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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#include "../config.h"
#if ENABLED(LULZBOT_TOUCH_UI)
#include "screens.h"
#include "screen_data.h"
using namespace FTDI;
using namespace Theme;
using namespace ExtUI;
void ConfirmStartPrintDialogBox::onEntry() {
BaseScreen::onEntry();
sound.play(twinkle, PLAY_ASYNCHRONOUS);
}
void ConfirmStartPrintDialogBox::onRedraw(draw_mode_t) {
const char *filename = getLongFilename();
char buffer[strlen_P(GET_TEXT(START_PRINT_CONFIRMATION)) + strlen(filename) + 1];
sprintf_P(buffer, GET_TEXT(START_PRINT_CONFIRMATION), filename);
drawMessage((const char *)buffer);
drawYesNoButtons(1);
}
bool ConfirmStartPrintDialogBox::onTouchEnd(uint8_t tag) {
switch (tag) {
case 1:
printFile(getShortFilename());
StatusScreen::setStatusMessage(GET_TEXTF(PRINT_STARTING));
GOTO_SCREEN(StatusScreen);
return true;
case 2: GOTO_PREVIOUS(); return true;
default: return false;
}
}
const char *ConfirmStartPrintDialogBox::getFilename(bool longName) {
FileList files;
files.seek(screen_data.ConfirmStartPrintDialogBox.file_index, true);
return longName ? files.longFilename() : files.shortFilename();
}
void ConfirmStartPrintDialogBox::show(uint8_t file_index) {
screen_data.ConfirmStartPrintDialogBox.file_index = file_index;
GOTO_SCREEN(ConfirmStartPrintDialogBox);
}
#endif // LULZBOT_TOUCH_UI

View File

@ -41,21 +41,15 @@ void FilesScreen::onEntry() {
BaseScreen::onEntry();
}
const char *FilesScreen::getSelectedShortFilename() {
const char *FilesScreen::getSelectedFilename(bool longName) {
FileList files;
files.seek(getFileForTag(screen_data.FilesScreen.selected_tag), true);
return files.shortFilename();
}
const char *FilesScreen::getSelectedLongFilename() {
FileList files;
files.seek(getFileForTag(screen_data.FilesScreen.selected_tag), true);
return files.longFilename();
files.seek(getSelectedFileIndex(), true);
return longName ? files.longFilename() : files.shortFilename();
}
void FilesScreen::drawSelectedFile() {
FileList files;
files.seek(getFileForTag(screen_data.FilesScreen.selected_tag), true);
files.seek(getSelectedFileIndex(), true);
screen_data.FilesScreen.flags.is_dir = files.isDir();
drawFileButton(
files.filename(),
@ -65,6 +59,10 @@ void FilesScreen::drawSelectedFile() {
);
}
uint16_t FilesScreen::getSelectedFileIndex() {
return getFileForTag(screen_data.FilesScreen.selected_tag);
}
uint16_t FilesScreen::getFileForTag(uint8_t tag) {
return screen_data.FilesScreen.cur_page * files_per_page + tag - 2;
}
@ -213,9 +211,7 @@ bool FilesScreen::onTouchEnd(uint8_t tag) {
}
break;
case 243:
printFile(getSelectedShortFilename());
StatusScreen::setStatusMessage(GET_TEXTF(PRINT_STARTING));
GOTO_SCREEN(StatusScreen);
ConfirmStartPrintDialogBox::show(getSelectedFileIndex());
return true;
case 244:
{

View File

@ -35,6 +35,7 @@ union screen_data_t {
struct {char passcode[5];} LockScreen;
struct {bool isError;} AlertDialogBox;
struct {bool auto_hide;} SpinnerDialogBox;
struct {uint8_t file_index;} ConfirmStartPrintDialogBox;
struct {
uint8_t e_tag, t_tag, repeat_tag;
ExtUI::extruder_t saved_extruder;

View File

@ -43,6 +43,7 @@ SCREEN_TABLE {
DECL_SCREEN(ConfirmUserRequestAlertBox),
DECL_SCREEN(RestoreFailsafeDialogBox),
DECL_SCREEN(SaveSettingsDialogBox),
DECL_SCREEN(ConfirmStartPrintDialogBox),
DECL_SCREEN(ConfirmAbortPrintDialogBox),
#if ENABLED(CALIBRATION_GCODE)
DECL_SCREEN(ConfirmAutoCalibrationDialogBox),

View File

@ -179,6 +179,20 @@ class SaveSettingsDialogBox : public DialogBoxBaseClass, public UncachedScreen {
static void settingsChanged() {needs_save = true;}
};
class ConfirmStartPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen {
private:
inline static const char *getShortFilename() {return getFilename(false);}
inline static const char *getLongFilename() {return getFilename(true);}
static const char *getFilename(bool longName);
public:
static void onEntry();
static void onRedraw(draw_mode_t);
static bool onTouchEnd(uint8_t);
static void show(uint8_t file_index);
};
class ConfirmAbortPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen {
public:
static void onRedraw(draw_mode_t);
@ -360,7 +374,8 @@ class BaseNumericAdjustmentScreen : public BaseScreen {
BTN_ACTION,
BTN_TOGGLE,
BTN_DISABLED,
TEXT_AREA
TEXT_AREA,
TEXT_LABEL
} _style;
protected:
@ -637,9 +652,11 @@ class FilesScreen : public BaseScreen, public CachedScreen<FILES_SCREEN_CACHE, F
static uint8_t getTagForLine(uint8_t line) {return line + 2;}
static uint8_t getLineForTag(uint8_t tag) {return tag - 2;}
static uint16_t getFileForTag(uint8_t tag);
static uint16_t getSelectedFileIndex();
static const char *getSelectedShortFilename();
static const char *getSelectedLongFilename();
inline static const char *getSelectedShortFilename() {return getSelectedFilename(false);}
inline static const char *getSelectedLongFilename() {return getSelectedFilename(true);}
static const char *getSelectedFilename(bool longName);
static void drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted);
static void drawFileList();

View File

@ -30,12 +30,6 @@
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wno-format"
#ifdef __AVR__
#define S_FMT "%S"
#else
#define S_FMT "%s"
#endif
/**
* Formats a temperature string (e.g. "100°C")
*/