Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add portrait support for TS35 #25629

Merged
merged 4 commits into from
May 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions Marlin/src/inc/Conditionals_LCD.h
Original file line number Diff line number Diff line change
Expand Up @@ -1686,8 +1686,13 @@
#define TFT_HEIGHT 272
#define GRAPHICAL_TFT_UPSCALE 2
#elif ENABLED(TFT_RES_480x320)
#define TFT_WIDTH 480
#define TFT_HEIGHT 320
#if ENABLED(TFT_COLOR_UI_PORTRAIT)
#define TFT_WIDTH 320
#define TFT_HEIGHT 480
#else
#define TFT_WIDTH 480
#define TFT_HEIGHT 320
#endif
#define GRAPHICAL_TFT_UPSCALE 3
#elif ENABLED(TFT_RES_1024x600)
#define TFT_WIDTH 1024
Expand All @@ -1708,7 +1713,7 @@
#elif ENABLED(TFT_INTERFACE_FSMC)
#define TFT_320x240
#endif
#elif TFT_HEIGHT == 320
#elif TFT_HEIGHT == 320 || (TFT_HEIGHT == 480 && ENABLED(TFT_COLOR_UI_PORTRAIT))
#if ENABLED(TFT_INTERFACE_SPI)
#define TFT_480x320_SPI
#elif ENABLED(TFT_INTERFACE_FSMC)
Expand Down
137 changes: 79 additions & 58 deletions Marlin/src/lcd/tft/ui_480x320.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ void MarlinUI::tft_idle() {
#if ENABLED(TOUCH_SCREEN)
if (TERN0(HAS_TOUCH_SLEEP, lcd_sleep_task())) return;
if (draw_menu_navigation) {
add_control(104, TFT_HEIGHT - 34, PAGE_UP, imgPageUp, encoderTopLine > 0);
add_control(344, TFT_HEIGHT - 34, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items);
add_control(224, TFT_HEIGHT - 34, BACK, imgBack);
add_control(TFT_WIDTH / 6 - 16, TFT_HEIGHT - 34, PAGE_UP, imgPageUp, encoderTopLine > 0);
add_control(TFT_WIDTH / 2 - 16, TFT_HEIGHT - 34, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items);
add_control(5 * TFT_WIDTH / 6 - 16, TFT_HEIGHT - 34, BACK, imgBack);
draw_menu_navigation = false;
}
#endif
Expand Down Expand Up @@ -222,11 +222,10 @@ void MarlinUI::draw_status_screen() {

TERN_(TOUCH_SCREEN, touch.clear());

// heaters and fan
uint16_t i, x, y = TFT_STATUS_TOP_Y;

for (i = 0 ; i < ITEMS_COUNT; i++) {
x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT);
// Statuses of heaters and fans
uint16_t y = STATUS_MARGIN_SIZE;
for (uint16_t i = 0; i < ITEMS_COUNT; i++) {
uint16_t x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT);
switch (i) {
#if HAS_EXTRUDERS
case ITEM_E0: draw_heater_status(x, y, H_E0); break;
Expand All @@ -252,12 +251,13 @@ void MarlinUI::draw_status_screen() {
}
}

y += TERN(HAS_UI_480x272, 120, 128);
y += STATUS_MARGIN_SIZE + 114;

// coordinates
tft.canvas(4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT);
// Coordinates
constexpr uint16_t coords_width = TFT_WIDTH - 8;
tft.canvas((TFT_WIDTH - coords_width) / 2, y, coords_width, FONT_LINE_HEIGHT);
tft.set_background(COLOR_BACKGROUND);
tft.add_rectangle(0, 0, TFT_WIDTH - 8, FONT_LINE_HEIGHT, COLOR_AXIS_HOMED);
tft.add_rectangle(0, 0, coords_width, FONT_LINE_HEIGHT, COLOR_AXIS_HOMED);

if (TERN0(LCD_SHOW_E_TOTAL, printingIsActive())) {
#if ENABLED(LCD_SHOW_E_TOTAL)
Expand All @@ -270,67 +270,86 @@ void MarlinUI::draw_status_screen() {
#endif
}
else {
tft.add_text( 16, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "X");
// Coords in mask "X____Y____Z____"
tft_string.set("X");
tft.add_text(coords_width / 30 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, tft_string);

const bool nhx = axis_should_home(X_AXIS);
tft_string.set(blink && nhx ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x)));
tft.add_text(102 - tft_string.width(), tft_string.vcenter(FONT_LINE_HEIGHT), nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string);
tft_string.ltrim();
tft.add_text(coords_width / 5 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string);

tft_string.set("Y");
tft.add_text(11 * coords_width / 30 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, tft_string);

tft.add_text(192, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "Y");
const bool nhy = axis_should_home(Y_AXIS);
tft_string.set(blink && nhy ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y)));
tft.add_text(280 - tft_string.width(), tft_string.vcenter(FONT_LINE_HEIGHT), nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string);
tft_string.ltrim();
tft.add_text(8 * coords_width / 15 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string);
}
tft.add_text(330, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "Z");
uint16_t offset = 32;

tft_string.set("Z");
tft.add_text(7 * coords_width / 10 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, tft_string);

const bool nhz = axis_should_home(Z_AXIS);
if (blink && nhz)
tft_string.set('?');
else {
const float z = LOGICAL_Z_POSITION(current_position.z);
tft_string.set(ftostr52sp((int16_t)z));
tft_string.rtrim();
offset += tft_string.width();
tft_string.set(blink && nhz ? "?" : ftostr52sp(LOGICAL_Z_POSITION(current_position.z)));
tft_string.ltrim();
tft_string.rtrim();
tft.add_text(13 * coords_width / 15 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), nhz ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string);

tft_string.set(ftostr52sp(z));
offset -= tft_string.width();
}
tft.add_text(455 - tft_string.width() - offset, tft_string.vcenter(FONT_LINE_HEIGHT), nhz ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string);
TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT));

y += TERN(HAS_UI_480x272, 34, 48);
// feed rate
tft.canvas(96, y, 128, 32);
tft.set_background(COLOR_BACKGROUND);
y += STATUS_MARGIN_SIZE + 34;

// Feed rate (preparing)
tft_string.set(i16tostr3rj(feedrate_percentage));
tft_string.add("%");
uint16_t component_width = 36 + tft_string.width(); // 32px icon size + 4px margin before text
uint16_t color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED;
uint16_t x = FEEDRATE_X(component_width);

// Feed rate (drawing)
tft.canvas(x, y, component_width, 32);
tft.set_background(COLOR_BACKGROUND);
tft.add_image(0, 0, imgFeedRate, color);
tft_string.set(i16tostr3rj(feedrate_percentage));
tft_string.add('%');
tft.add_text(36, tft_string.vcenter(30), color , tft_string);
TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 96, y, 128, 32));
TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, x, y, component_width, 32));

// flow rate
tft.canvas(284, y, 128, 32);
tft.set_background(COLOR_BACKGROUND);
color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED;
tft.add_image(0, 0, imgFlowRate, color);
// Flow rate (preparing)
tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder]));
tft_string.add('%');
component_width = 36 + tft_string.width();
color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED;
x = FLOWRATE_X(component_width);

// Flow rate (drawing)
tft.canvas(x, y, component_width, 32);
tft.set_background(COLOR_BACKGROUND);
tft.add_image(0, 0, imgFlowRate, color);
tft.add_text(36, tft_string.vcenter(30), color , tft_string);
TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 284, y, 128, 32, active_extruder));
TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, x, y, component_width, 32, active_extruder));

#if TFT_COLOR_UI_PORTRAIT || DISABLED(TOUCH_SCREEN)
y += STATUS_MARGIN_SIZE + 32;
#endif

#if ENABLED(TOUCH_SCREEN)
add_control(404, y, menu_main, imgSettings);
// Settings button
add_control(SETTINGS_X, y, menu_main, imgSettings);

// SD-card button / Cancel button
#if HAS_MEDIA
const bool cm = card.isMounted(), pa = printingIsActive();
if (cm && pa)
add_control(12, y, STOP, imgCancel, true, COLOR_CONTROL_CANCEL);
add_control(SDCARD_X, y, STOP, imgCancel, true, COLOR_CONTROL_CANCEL);
else
add_control(12, y, menu_media, imgSD, cm && !pa, COLOR_CONTROL_ENABLED, COLOR_CONTROL_DISABLED);
add_control(SDCARD_X, y, menu_media, imgSD, cm && !pa, COLOR_CONTROL_ENABLED, COLOR_CONTROL_DISABLED); // 64px icon size
#endif

y += STATUS_MARGIN_SIZE + TERN(TFT_COLOR_UI_PORTRAIT, 64, 44);
#endif

y += TERN(HAS_UI_480x272, 39, 44);
// print duration
// Print duration
char buffer[14];
duration_t elapsed = print_job_timer.duration();
elapsed.toDigital(buffer);
Expand All @@ -340,17 +359,19 @@ void MarlinUI::draw_status_screen() {
tft_string.set(buffer);
tft.add_text(tft_string.center(128), tft_string.vcenter(29), COLOR_PRINT_TIME, tft_string);

y += TERN(HAS_UI_480x272, 29, 36);
// progress bar
y += STATUS_MARGIN_SIZE + 29;

// Progress bar
const uint8_t progress = ui.get_progress_percent();
tft.canvas(4, y, TFT_WIDTH - 8, 9);
tft.set_background(COLOR_PROGRESS_BG);
tft.add_rectangle(0, 0, TFT_WIDTH - 8, 9, COLOR_PROGRESS_FRAME);
if (progress)
tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress) / 100, 7, COLOR_PROGRESS_BAR);

y += 15;
// status message
y += STATUS_MARGIN_SIZE + 7;

// Status message
tft.canvas(0, y, TFT_WIDTH, FONT_LINE_HEIGHT);
tft.set_background(COLOR_BACKGROUND);
tft_string.set(status_message);
Expand Down Expand Up @@ -397,7 +418,7 @@ void MenuEditItemBase::draw_edit_screen(FSTR_P const fstr, const char * const va

if (ui.can_show_slider()) {

#define SLIDER_LENGTH 336
#define SLIDER_LENGTH TFT_WIDTH * 0.7
#define SLIDER_Y_POSITION 186

tft.canvas((TFT_WIDTH - SLIDER_LENGTH) / 2, SLIDER_Y_POSITION, SLIDER_LENGTH, 16);
Expand All @@ -420,9 +441,9 @@ void MenuEditItemBase::draw_edit_screen(FSTR_P const fstr, const char * const va

void TFT::draw_edit_screen_buttons() {
#if ENABLED(TOUCH_SCREEN)
add_control(64, TFT_HEIGHT - 64, DECREASE, imgDecrease);
add_control(352, TFT_HEIGHT - 64, INCREASE, imgIncrease);
add_control(208, TFT_HEIGHT - 64, CLICK, imgConfirm);
add_control((TFT_WIDTH - 3 * 64) / 6, TFT_HEIGHT - 64, DECREASE, imgDecrease);
add_control((TFT_WIDTH - 64) / 2, TFT_HEIGHT - 64, INCREASE, imgIncrease);
add_control((TFT_WIDTH * 5 - 3 * 64) / 6, TFT_HEIGHT - 64, CLICK, imgConfirm);
#endif
}

Expand Down Expand Up @@ -451,8 +472,8 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con
tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string);
}
#if ENABLED(TOUCH_SCREEN)
if (no) add_control( 88, TFT_HEIGHT - 64, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL);
if (yes) add_control(328, TFT_HEIGHT - 64, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM));
if (no) add_control(TFT_WIDTH / 4 - 32, TFT_HEIGHT - 64, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL);
if (yes) add_control(TFT_WIDTH * 3 / 4 - 32, TFT_HEIGHT - 64, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM));
#endif
}

Expand Down Expand Up @@ -898,7 +919,7 @@ void MarlinUI::move_axis_screen() {
drawAxisValue(Z_AXIS);

// ROW 4 -> step_size disable steppers back
y = TFT_HEIGHT - Y_MARGIN - 32; //
y = TFT_HEIGHT - Y_MARGIN - 32;
x = TFT_WIDTH / 2 - CUR_STEP_VALUE_WIDTH / 2;
motionAxisState.stepValuePos.x = x;
motionAxisState.stepValuePos.y = y;
Expand Down
65 changes: 65 additions & 0 deletions Marlin/src/lcd/tft/ui_480x320.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,69 @@

#define MENU_LINE_HEIGHT (MENU_ITEM_HEIGHT + 2)

/**
* Status screen - portrait layout:
*
* | FAN E0 BED .. | - 120px
* | Coordinates | - FONT_LINE_HEIGHT
* | Feedrate Flowrate | - 32px
* | SD Settings | - 64px if ENABLED(TOUCHSCREEN), else 0px
* | Print duration time | - 29px
* | Progress bar | - 7px
* | Status message | - FONT_LINE_HEIGHT
*
* Summary with touchscreen:
* - Total height: 252px + 2 * FONT_LINE_HEIGHT (320px if FONT_LINE_HEIGHT is 34px)
* - Rows count: 7
* - Margins count: 8
*
* Summary without touchscreen:
* - Total height: 188px + 2 * FONT_LINE_HEIGHT (256px if FONT_LINE_HEIGHT is 34px)
* - Rows count: 6
* - Margins count: 7
*
* Status screen - landscape layout:
*
* | FAN E0 BED ... | - 120px
* | Coordinates | - FONT_LINE_HEIGHT
* | SD Flowrate Feedrate Settings | - 44px for TOUCHSCREEN, else 32px
* | Print duration time | - 29px
* | Progress bar | - 7px
* | Status message | - FONT_LINE_HEIGHT
*
* Summary with touchscreen:
* - Total height: 200px (268px if FONT_LINE_HEIGHT is 34px)
* - Rows count: 6
* - Margins count: 7
*
* Summary without touchscreen:
* - Total height: 188px + 2 * FONT_LINE_HEIGHT (256px if FONT_LINE_HEIGHT is 34px)
* - Rows count: 6
* - Margins count: 7
*/
#ifdef TFT_COLOR_UI_PORTRAIT
#if ENABLED(TOUCH_SCREEN)
#define STATUS_TOTAL_ROWS_HEIGHT (2 * FONT_LINE_HEIGHT + 120 + 32 + 64 + 29 + 7)
#define STATUS_MARGINS_REGIONS 8
#else
#define STATUS_TOTAL_ROWS_HEIGHT (2 * FONT_LINE_HEIGHT + 120 + 32 + 29 + 7)
#define STATUS_MARGINS_REGIONS 7
#endif

#define FEEDRATE_X(W) ((TFT_WIDTH - 2 * (W)) / 4)
#define FLOWRATE_X(W) ((3 * TFT_WIDTH - 2 * (W)) / 4)
#define SETTINGS_X (3 * TFT_WIDTH / 4 - 32)
#define SDCARD_X (TFT_WIDTH / 4 - 32)
#else
#define STATUS_TOTAL_ROWS_HEIGHT (2 * FONT_LINE_HEIGHT + 120 + TERN(TOUCH_SCREEN, 44, 32) + 29 + 7)
#define STATUS_MARGINS_REGIONS 7

#define FEEDRATE_X(W) (3 * TFT_WIDTH / 8 - (W) / 2)
#define FLOWRATE_X(W) (5 * TFT_WIDTH / 8 - (W) / 2)
#define SETTINGS_X (TFT_WIDTH / 8 - 32)
#define SDCARD_X (7 * TFT_WIDTH / 8 - 32)
#endif

#define STATUS_MARGIN_SIZE ((TFT_HEIGHT - STATUS_TOTAL_ROWS_HEIGHT) / STATUS_MARGINS_REGIONS)

#include "tft_font.h"