Procházet zdrojové kódy

Move screen for Color UI (#19386)

Victor Oliveira před 3 roky
rodič
revize
5b56d6698a
No account linked to committer's email address

binární
Marlin/src/lcd/tft/bitmaps/btn_64x52_rounded.bmp Zobrazit soubor


binární
Marlin/src/lcd/tft/bitmaps/home.bmp Zobrazit soubor


+ 82
- 0
Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp Zobrazit soubor

@@ -0,0 +1,82 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+#include "../../../inc/MarlinConfigPre.h"
24
+
25
+#if HAS_GRAPHICAL_TFT
26
+
27
+extern const uint8_t btn_rounded_64x52x4[1664] = {
28
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
29
+  0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88,
30
+  0x88, 0x88, 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x87, 0x77, 0x78,
31
+  0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x66, 0x78,
32
+  0x88, 0x8d, 0xff, 0xb8, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x7b, 0xff, 0xc6, 0x67,
33
+  0x87, 0xbf, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, 0xf9, 0x56,
34
+  0x87, 0xef, 0x84, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x58, 0xfd, 0x46,
35
+  0x87, 0xff, 0x54, 0x44, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xff, 0x45,
36
+  0x87, 0xff, 0x44, 0x45, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xff, 0x45,
37
+  0x87, 0xff, 0x44, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0xff, 0x44,
38
+  0x87, 0xff, 0x44, 0x56, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xff, 0x44,
39
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
40
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
41
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
42
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
43
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
44
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
45
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
46
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
47
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
48
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
49
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
50
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
51
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
52
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
53
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
54
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
55
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
56
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
57
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
58
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
59
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
60
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
61
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
62
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
63
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
64
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
65
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
66
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
67
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
68
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
69
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
70
+  0x87, 0xff, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xff, 0x44,
71
+  0x87, 0xef, 0x84, 0x56, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xfe, 0x44,
72
+  0x87, 0xaf, 0xf6, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xf9, 0x44,
73
+  0x87, 0x7d, 0xff, 0xb8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9c, 0xff, 0xd4, 0x45,
74
+  0x87, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x54, 0x45,
75
+  0x87, 0x76, 0x56, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x64, 0x44, 0x46,
76
+  0x87, 0x77, 0x65, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x56,
77
+  0x88, 0x77, 0x76, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0x67,
78
+  0x88, 0x77, 0x77, 0x66, 0x65, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x66, 0x78,
79
+  0x88, 0x88, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x78,
80
+};
81
+
82
+#endif // HAS_GRAPHICAL_TFT

+ 94
- 0
Marlin/src/lcd/tft/images/home_64x64x4.cpp Zobrazit soubor

@@ -0,0 +1,94 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+#include "../../../inc/MarlinConfigPre.h"
24
+
25
+#if HAS_GRAPHICAL_TFT
26
+
27
+extern const uint8_t home_64x64x4[2048] = {
28
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
29
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
30
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
31
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
32
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
33
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0x88, 0x76, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
34
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9d, 0xff, 0xea, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
35
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
36
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
37
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
38
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
39
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
40
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x40, 0xbf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
41
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf6, 0x54, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
42
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x57, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
43
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
44
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
45
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
46
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
47
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
48
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
49
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
50
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
51
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
52
+  0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xbf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88,
53
+  0x88, 0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88,
54
+  0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88,
55
+  0x88, 0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88,
56
+  0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88,
57
+  0x88, 0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88, 0x88,
58
+  0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88,
59
+  0x88, 0x69, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xb, 0xff, 0xff, 0xff, 0xc6, 0x78, 0x88,
60
+  0x87, 0x7f, 0xff, 0xff, 0xff, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xbf, 0xff, 0xff, 0xfb, 0x68, 0x88,
61
+  0x87, 0x7f, 0xff, 0xff, 0xf7, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xfd, 0x67, 0x88,
62
+  0x87, 0x3d, 0xff, 0xff, 0x75, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x30, 0xbf, 0xff, 0xfa, 0x68, 0x88,
63
+  0x88, 0x44, 0xce, 0xd7, 0x58, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x74, 0x19, 0xee, 0xa6, 0x88, 0x88,
64
+  0x88, 0x73, 0x24, 0x56, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x52, 0x35, 0x68, 0x88, 0x88,
65
+  0x88, 0x87, 0x66, 0x78, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x87, 0x67, 0x88, 0x88, 0x88,
66
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
67
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
68
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x55, 0x55, 0x55, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
69
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x44, 0x44, 0x44, 0x12, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
70
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x88, 0x88, 0x88, 0x72, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
71
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
72
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
73
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
74
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
75
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
76
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
77
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
78
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
79
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
80
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
81
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
82
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88,
83
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x84, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
84
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0x4c, 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0x97, 0x88, 0x88, 0x88, 0x84, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
85
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x32, 0x44, 0x44, 0x44, 0x44, 0x33, 0x57, 0x88, 0x88, 0x88, 0x88, 0x86, 0x43, 0x34, 0x44, 0x44, 0x44, 0x34, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
86
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
87
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
88
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
89
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
90
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
91
+  0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88
92
+};
93
+
94
+#endif // HAS_GRAPHICAL_TFT

+ 6
- 4
Marlin/src/lcd/tft/tft_color.h Zobrazit soubor

@@ -42,6 +42,7 @@
42 42
 #define COLOR_SCARLET         0xF904  // #FF2020
43 43
 #define COLOR_LIME            0x7E00  // #00FF00
44 44
 #define COLOR_BLUE            0x001F  // #0000FF
45
+#define COLOR_LIGHT_BLUE      0x061F  // #00C3FF
45 46
 #define COLOR_YELLOW          0xFFE0  // #FFFF00
46 47
 #define COLOR_MAGENTA         0xF81F  // #FF00FF
47 48
 #define COLOR_FUCHSIA         0xF81F  // #FF00FF
@@ -66,10 +67,11 @@
66 67
 
67 68
 #define COLOR_DARK_PURPLE     0x9930  // #992380
68 69
 
69
-
70
-#define COLOR_BACKGROUND        0x20AC  // #1E156E
71
-#define COLOR_SELECTION_BG      0x9930  // #992380
72
-#define COLOR_WEBSITE_URL       0x03B7
70
+#ifndef COLOR_BACKGROUND
71
+  #define COLOR_BACKGROUND    0x20AC  // #1E156E
72
+#endif
73
+#define COLOR_SELECTION_BG    0x9930  // #992380
74
+#define COLOR_WEBSITE_URL     0x03B7
73 75
 
74 76
 #define COLOR_INACTIVE          COLOR_GREY
75 77
 #define COLOR_COLD              COLOR_AQUA

+ 2
- 0
Marlin/src/lcd/tft/tft_image.cpp Zobrazit soubor

@@ -45,6 +45,8 @@ const tImage Fan_Slow1_64x64x4      = { (void *)fan_slow1_64x64x4, 64, 64, GREYS
45 45
 const tImage Fan_Fast0_64x64x4      = { (void *)fan_fast0_64x64x4, 64, 64, GREYSCALE4 };
46 46
 const tImage Fan_Fast1_64x64x4      = { (void *)fan_fast1_64x64x4, 64, 64, GREYSCALE4 };
47 47
 const tImage SD_64x64x4             = { (void *)sd_64x64x4, 64, 64, GREYSCALE4 };
48
+const tImage Home_64x64x4           = { (void *)home_64x64x4, 64, 64, GREYSCALE4 };
49
+const tImage BtnRounded_64x52x4     = { (void *)btn_rounded_64x52x4, 64, 52, GREYSCALE4 };
48 50
 const tImage Menu_64x64x4           = { (void *)menu_64x64x4, 64, 64, GREYSCALE4 };
49 51
 const tImage Settings_64x64x4       = { (void *)settings_64x64x4, 64, 64, GREYSCALE4 };
50 52
 const tImage Confirm_64x64x4        = { (void *)confirm_64x64x4, 64, 64, GREYSCALE4 };

+ 6
- 0
Marlin/src/lcd/tft/tft_image.h Zobrazit soubor

@@ -39,6 +39,8 @@ extern const uint8_t fan0_64x64x4[], fan1_64x64x4[];
39 39
 extern const uint8_t fan_slow0_64x64x4[], fan_slow1_64x64x4[];
40 40
 extern const uint8_t fan_fast0_64x64x4[], fan_fast1_64x64x4[];
41 41
 extern const uint8_t sd_64x64x4[];
42
+extern const uint8_t home_64x64x4[];
43
+extern const uint8_t btn_rounded_64x52x4[];
42 44
 extern const uint8_t menu_64x64x4[];
43 45
 extern const uint8_t settings_64x64x4[];
44 46
 extern const uint8_t confirm_64x64x4[];
@@ -90,6 +92,8 @@ enum MarlinImage : uint8_t {
90 92
   imgRefresh,
91 93
   imgLeveling,
92 94
   imgSlider,
95
+  imgHome,
96
+  imgBtn52Rounded,
93 97
   imgCount,
94 98
   noImage = imgCount,
95 99
   imgPageUp = imgLeft,
@@ -136,6 +140,8 @@ extern const tImage Fan_Slow1_64x64x4;
136 140
 extern const tImage Fan_Fast0_64x64x4;
137 141
 extern const tImage Fan_Fast1_64x64x4;
138 142
 extern const tImage SD_64x64x4;
143
+extern const tImage Home_64x64x4;
144
+extern const tImage BtnRounded_64x52x4;
139 145
 extern const tImage Menu_64x64x4;
140 146
 extern const tImage Settings_64x64x4;
141 147
 extern const tImage Confirm_64x64x4;

+ 11
- 0
Marlin/src/lcd/tft/touch.cpp Zobrazit soubor

@@ -35,6 +35,7 @@
35 35
 
36 36
 #include "tft.h"
37 37
 
38
+bool Touch::enabled = true;
38 39
 int16_t Touch::x, Touch::y;
39 40
 touch_control_t Touch::controls[];
40 41
 touch_control_t *Touch::current_control;
@@ -54,6 +55,7 @@ void Touch::init() {
54 55
   calibration_reset();
55 56
   reset();
56 57
   io.Init();
58
+  enable();
57 59
 }
58 60
 
59 61
 void Touch::add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data) {
@@ -72,6 +74,8 @@ void Touch::idle() {
72 74
   uint16_t i;
73 75
   int16_t _x, _y;
74 76
 
77
+  if (!enabled) return;
78
+
75 79
   if (now == millis()) return;
76 80
   now = millis();
77 81
 
@@ -253,6 +257,13 @@ void Touch::touch(touch_control_t *control) {
253 257
       case UBL: hold(control, UBL_REPEAT_DELAY); ui.encoderPosition += control->data; break;
254 258
     #endif
255 259
 
260
+    case MOVE_AXIS:
261
+      ui.goto_screen((screenFunc_t)ui.move_axis_screen);
262
+      break;
263
+
264
+    // TODO: TOUCH could receive data to pass to the callback
265
+    case BUTTON: ((screenFunc_t)control->data)(); break;
266
+
256 267
     default: break;
257 268
   }
258 269
 }

+ 5
- 0
Marlin/src/lcd/tft/touch.h Zobrazit soubor

@@ -79,6 +79,8 @@ enum TouchControlType : uint16_t {
79 79
   FEEDRATE,
80 80
   FLOWRATE,
81 81
   UBL,
82
+  MOVE_AXIS,
83
+  BUTTON,
82 84
 };
83 85
 
84 86
 typedef void (*screenFunc_t)();
@@ -132,6 +134,7 @@ class Touch {
132 134
   private:
133 135
     static TOUCH_DRIVER io;
134 136
     static int16_t x, y;
137
+    static bool enabled;
135 138
 
136 139
     static touch_control_t controls[MAX_CONTROLS];
137 140
     static touch_control_t *current_control;
@@ -162,6 +165,8 @@ class Touch {
162 165
     static void clear() { controls_count = 0; }
163 166
     static void idle();
164 167
     static bool is_clicked() { return touch_control_type == CLICK; }
168
+    static void disable() { enabled = false; }
169
+    static void enable() { enabled = true; }
165 170
 
166 171
     static void add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data = 0);
167 172
 

+ 3
- 0
Marlin/src/lcd/tft/ui_320x240.cpp Zobrazit soubor

@@ -650,4 +650,7 @@ void menu_item(const uint8_t row, bool sel ) {
650 650
   TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 2 + 34 * row, 320, 32, encoderTopLine + row));
651 651
 }
652 652
 
653
+void MarlinUI::move_axis_screen() {
654
+}
655
+
653 656
 #endif // HAS_UI_320x240

+ 2
- 0
Marlin/src/lcd/tft/ui_320x240.h Zobrazit soubor

@@ -73,6 +73,8 @@ const tImage Images[imgCount] = {
73 73
   Refresh_32x32x4,
74 74
   Leveling_32x32x4,
75 75
   Slider8x16x4,
76
+  Home_64x64x4,
77
+  BtnRounded_64x52x4,
76 78
 };
77 79
 
78 80
 #if HAS_TEMP_CHAMBER && HOTENDS > 1

+ 435
- 0
Marlin/src/lcd/tft/ui_480x320.cpp Zobrazit soubor

@@ -291,6 +291,7 @@ void MarlinUI::draw_status_screen() {
291 291
     offset += 32 - tft_string.width();
292 292
   }
293 293
   tft.add_text(455 - tft_string.width() - offset, 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string);
294
+  TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, 132, TFT_WIDTH - 8, 34));
294 295
 
295 296
   // feed rate
296 297
   tft.canvas(96, 180, 100, 32);
@@ -654,4 +655,438 @@ void menu_item(const uint8_t row, bool sel ) {
654 655
   TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 4 + 45 * row, TFT_WIDTH, 43, encoderTopLine + row));
655 656
 }
656 657
 
658
+#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
659
+  #include "../../feature/babystep.h"
660
+#endif
661
+
662
+#if HAS_BED_PROBE
663
+  #include "../../module/probe.h"
664
+#endif
665
+
666
+#define Z_SELECTION_Z 1
667
+#define Z_SELECTION_Z_PROBE -1
668
+
669
+struct MotionAxisState {
670
+  xy_int_t xValuePos, yValuePos, zValuePos, eValuePos, stepValuePos, zTypePos, eNamePos;
671
+  float currentStepSize = 10.0;
672
+  int z_selection = Z_SELECTION_Z;
673
+  uint8_t e_selection = 0;
674
+  bool homming = false;
675
+  bool blocked = false;
676
+  char message[32];
677
+};
678
+
679
+MotionAxisState motionAxisState;
680
+
681
+#define E_BTN_COLOR COLOR_YELLOW
682
+#define X_BTN_COLOR COLOR_CORAL_RED
683
+#define Y_BTN_COLOR COLOR_VIVID_GREEN
684
+#define Z_BTN_COLOR COLOR_LIGHT_BLUE
685
+
686
+#define BTN_WIDTH 64
687
+#define BTN_HEIGHT 52
688
+#define X_MARGIN 20
689
+#define Y_MARGIN 15
690
+
691
+static void quick_feedback() {
692
+  #if HAS_CHIRP
693
+    ui.chirp(); // Buzz and wait. Is the delay needed for buttons to settle?
694
+    #if BOTH(HAS_LCD_MENU, USE_BEEPER)
695
+      for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); }
696
+    #elif HAS_LCD_MENU
697
+      delay(10);
698
+    #endif
699
+  #endif
700
+}
701
+
702
+#define CUR_STEP_VALUE_WIDTH 104
703
+static void drawCurStepValue() {
704
+  tft_string.set((uint8_t *)ftostr52sp(motionAxisState.currentStepSize));
705
+  tft_string.add("mm");
706
+  tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT);
707
+  tft.set_background(COLOR_BACKGROUND);
708
+  tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string);
709
+}
710
+
711
+static void drawCurZSelection() {
712
+  tft_string.set("Z");
713
+  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34);
714
+  tft.set_background(COLOR_BACKGROUND);
715
+  tft.add_text(0, 0, Z_BTN_COLOR, tft_string);
716
+  tft.queue.sync();
717
+  tft_string.set("Offset");
718
+  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34);
719
+  tft.set_background(COLOR_BACKGROUND);
720
+  if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) {
721
+    tft.add_text(0, 0, Z_BTN_COLOR, tft_string);
722
+  }
723
+}
724
+
725
+static void drawCurESelection() {
726
+  tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT);
727
+  tft.set_background(COLOR_BACKGROUND);
728
+  tft_string.set("E");
729
+  tft.add_text(0, 0, E_BTN_COLOR , tft_string);
730
+  tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection));
731
+}
732
+
733
+static void drawMessage(const char *msg) {
734
+  tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - 34, TFT_HEIGHT / 2, 34);
735
+  tft.set_background(COLOR_BACKGROUND);
736
+  tft.add_text(0, 0, COLOR_YELLOW, msg);
737
+}
738
+
739
+static void drawAxisValue(AxisEnum axis) {
740
+  const float value =
741
+    #if HAS_BED_PROBE
742
+      axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ?
743
+      probe.offset.z :
744
+    #endif
745
+    NATIVE_TO_LOGICAL(
746
+      ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset),
747
+      axis
748
+    );
749
+  xy_int_t pos;
750
+  uint16_t color;
751
+  switch (axis) {
752
+    case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break;
753
+    case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break;
754
+    case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break;
755
+    case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break;
756
+    default: return;
757
+  }
758
+  tft.canvas(pos.x, pos.y, BTN_WIDTH + X_MARGIN, BTN_HEIGHT);
759
+  tft.set_background(COLOR_BACKGROUND);
760
+  tft_string.set(ftostr52sp(value));
761
+  tft.add_text(0, 0, color, tft_string);
762
+}
763
+
764
+static void moveAxis(AxisEnum axis, const int8_t direction) {
765
+  quick_feedback();
766
+
767
+  if (axis == E_AXIS && thermalManager.temp_hotend[motionAxisState.e_selection].celsius < EXTRUDE_MINTEMP) {
768
+    drawMessage("Too cold");
769
+    return;
770
+  }
771
+
772
+  const float diff = motionAxisState.currentStepSize * direction;
773
+
774
+  if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) {
775
+    #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
776
+      const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z;
777
+      const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0;
778
+      const float bsDiff = planner.steps_to_mm[Z_AXIS] * babystep_increment,
779
+                  new_probe_offset = probe.offset.z + bsDiff,
780
+                  new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET
781
+                    , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff
782
+                    , new_probe_offset
783
+                  );
784
+      if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) {
785
+        babystep.add_steps(Z_AXIS, babystep_increment);
786
+        if (do_probe)
787
+          probe.offset.z = new_offs;
788
+        else
789
+          TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP);
790
+        drawMessage(""); // clear the error
791
+        drawAxisValue(axis);
792
+      }
793
+      else {
794
+        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
795
+      }
796
+    #elif HAS_BED_PROBE
797
+      // only change probe.offset.z
798
+      probe.offset.z += diff;
799
+      if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) {
800
+        current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN;
801
+        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
802
+      }
803
+      else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) {
804
+        current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX;
805
+        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
806
+      }
807
+      else {
808
+        drawMessage(""); // clear the error
809
+      }
810
+      drawAxisValue(axis);
811
+    #endif
812
+    return;
813
+  }
814
+
815
+  if (!ui.manual_move.processing) {
816
+    // Start with no limits to movement
817
+    float min = current_position[axis] - 1000,
818
+          max = current_position[axis] + 1000;
819
+
820
+    // Limit to software endstops, if enabled
821
+    #if HAS_SOFTWARE_ENDSTOPS
822
+      if (soft_endstops_enabled) switch (axis) {
823
+        case X_AXIS:
824
+          TERN_(MIN_SOFTWARE_ENDSTOP_X, min = soft_endstop.min.x);
825
+          TERN_(MAX_SOFTWARE_ENDSTOP_X, max = soft_endstop.max.x);
826
+          break;
827
+        case Y_AXIS:
828
+          TERN_(MIN_SOFTWARE_ENDSTOP_Y, min = soft_endstop.min.y);
829
+          TERN_(MAX_SOFTWARE_ENDSTOP_Y, max = soft_endstop.max.y);
830
+          break;
831
+        case Z_AXIS:
832
+          TERN_(MIN_SOFTWARE_ENDSTOP_Z, min = soft_endstop.min.z);
833
+          TERN_(MAX_SOFTWARE_ENDSTOP_Z, max = soft_endstop.max.z);
834
+        default: break;
835
+      }
836
+    #endif // HAS_SOFTWARE_ENDSTOPS
837
+
838
+    // Delta limits XY based on the current offset from center
839
+    // This assumes the center is 0,0
840
+    #if ENABLED(DELTA)
841
+      if (axis != Z_AXIS && axis != E_AXIS) {
842
+        max = SQRT(sq((float)(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis
843
+        min = -max;
844
+      }
845
+    #endif
846
+
847
+    // Get the new position
848
+    #if IS_KINEMATIC
849
+      ui.manual_move.offset += diff;
850
+      if (direction < 0)
851
+        NOLESS(ui.manual_move.offset, min - current_position[axis]);
852
+      else
853
+        NOMORE(ui.manual_move.offset, max - current_position[axis]);
854
+    #else
855
+      current_position[axis] += diff;
856
+      if (direction < 0 && current_position[axis] < min) {
857
+        current_position[axis] = min;
858
+        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
859
+      }
860
+      else if (direction > 0 && current_position[axis] > max) {
861
+        current_position[axis] = max;
862
+        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
863
+      }
864
+      else {
865
+        drawMessage(""); // clear the error
866
+      }
867
+    #endif
868
+
869
+    ui.manual_move.soon(axis
870
+      #if MULTI_MANUAL
871
+        , motionAxisState.e_selection
872
+      #endif
873
+    );
874
+  }
875
+
876
+  drawAxisValue(axis);
877
+}
878
+
879
+static void e_plus() {
880
+  moveAxis(E_AXIS, 1);
881
+}
882
+
883
+static void e_minus() {
884
+  moveAxis(E_AXIS, -1);
885
+}
886
+
887
+static void x_minus() {
888
+  moveAxis(X_AXIS, -1);
889
+}
890
+
891
+static void x_plus() {
892
+  moveAxis(X_AXIS, 1);
893
+}
894
+
895
+static void y_plus() {
896
+  moveAxis(Y_AXIS, 1);
897
+}
898
+
899
+static void y_minus() {
900
+  moveAxis(Y_AXIS, -1);
901
+}
902
+
903
+static void z_plus() {
904
+  moveAxis(Z_AXIS, 1);
905
+}
906
+
907
+static void z_minus() {
908
+  moveAxis(Z_AXIS, -1);
909
+}
910
+
911
+static void e_select() {
912
+  motionAxisState.e_selection++;
913
+  if (motionAxisState.e_selection >= EXTRUDERS) {
914
+    motionAxisState.e_selection = 0;
915
+  }
916
+
917
+  quick_feedback();
918
+  drawCurESelection();
919
+  drawAxisValue(E_AXIS);
920
+}
921
+
922
+static void do_home() {
923
+  quick_feedback();
924
+  drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING));
925
+  queue.inject_P(G28_STR);
926
+  // Disable touch until home is done
927
+  touch.disable();
928
+  drawAxisValue(E_AXIS);
929
+  drawAxisValue(X_AXIS);
930
+  drawAxisValue(Y_AXIS);
931
+  drawAxisValue(Z_AXIS);
932
+}
933
+
934
+static void step_size() {
935
+  motionAxisState.currentStepSize = motionAxisState.currentStepSize / 10.0;
936
+  if (motionAxisState.currentStepSize < 0.0015) motionAxisState.currentStepSize = 10.0;
937
+  quick_feedback();
938
+  drawCurStepValue();
939
+}
940
+
941
+#if HAS_BED_PROBE
942
+  static void z_select() {
943
+    motionAxisState.z_selection *= -1;
944
+    quick_feedback();
945
+    drawCurZSelection();
946
+    drawAxisValue(Z_AXIS);
947
+  }
948
+#endif
949
+
950
+static void disable_steppers() {
951
+  quick_feedback();
952
+  queue.inject_P(PSTR("M84"));
953
+}
954
+
955
+static void drawBtn(int x, int y, const char* label, int32_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) {
956
+  uint16_t width = Images[imgBtn52Rounded].width;
957
+  uint16_t height = Images[imgBtn52Rounded].height;
958
+
959
+  tft.queue.sync(); //need sync to change font
960
+
961
+  if (!enabled) bgColor = COLOR_CONTROL_DISABLED;
962
+
963
+  tft.canvas(x, y, width, height);
964
+  tft.set_background(COLOR_BACKGROUND);
965
+  tft.add_image(0, 0, imgBtn52Rounded, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY);
966
+
967
+  if (label != NULL) {
968
+    tft.set_font(Helvetica12Bold);
969
+    tft_string.set_font(Helvetica12Bold);
970
+    tft_string.set(label);
971
+    tft_string.trim();
972
+    tft.add_text(tft_string.center(width), height / 2 - tft_string.font_height() / 2, bgColor, tft_string);
973
+
974
+    tft.queue.sync();
975
+    tft_string.set_font(Helvetica18);
976
+    tft.set_font(Helvetica18);
977
+  }
978
+  else {
979
+    tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY);
980
+  }
981
+
982
+  if (enabled) touch.add_control(BUTTON, x, y, width, height, data);
983
+}
984
+
985
+void MarlinUI::move_axis_screen() {
986
+  // Reset
987
+  motionAxisState.blocked = false;
988
+  touch.enable();
989
+
990
+  ui.clear_lcd();
991
+
992
+  TERN_(TOUCH_SCREEN, touch.clear());
993
+
994
+  const bool busy = printingIsActive();
995
+
996
+  // if we have baby step and we are printing, select baby step
997
+  if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) motionAxisState.z_selection = Z_SELECTION_Z_PROBE;
998
+
999
+  // ROW 1 -> E- Y- CurY Z+
1000
+  int x = X_MARGIN, y = Y_MARGIN, spacing = 0;
1001
+
1002
+  drawBtn(x, y, "E+", (int32_t)e_plus, imgUp, E_BTN_COLOR, !busy);
1003
+
1004
+  spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2;
1005
+  x += BTN_WIDTH + spacing;
1006
+  drawBtn(x, y, "Y+", (int32_t)y_plus, imgUp, Y_BTN_COLOR, !busy);
1007
+
1008
+  // Cur Y
1009
+  x += BTN_WIDTH;
1010
+  motionAxisState.yValuePos.x = x + 2;
1011
+  motionAxisState.yValuePos.y = y;
1012
+  drawAxisValue(Y_AXIS);
1013
+
1014
+  x += spacing;
1015
+  drawBtn(x, y, "Z+", (int32_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step
1016
+
1017
+  // ROW 2 -> "Ex"  X-  HOME X+  "Z"
1018
+  y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3;
1019
+  x = X_MARGIN;
1020
+  spacing = (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4;
1021
+
1022
+  motionAxisState.eNamePos.x = x;
1023
+  motionAxisState.eNamePos.y = y;
1024
+  drawCurESelection();
1025
+  if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (int32_t)e_select);
1026
+
1027
+  x += BTN_WIDTH + spacing;
1028
+  drawBtn(x, y, "X-", (int32_t)x_minus, imgLeft, X_BTN_COLOR, !busy);
1029
+
1030
+  x += BTN_WIDTH + spacing; //imgHome is 64x64
1031
+  add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (int32_t)do_home, imgHome, !busy);
1032
+
1033
+  x += BTN_WIDTH + spacing;
1034
+  uint16_t xplus_x = x;
1035
+  drawBtn(x, y, "X+", (int32_t)x_plus, imgRight, X_BTN_COLOR, !busy);
1036
+
1037
+  x += BTN_WIDTH + spacing;
1038
+  motionAxisState.zTypePos.x = x;
1039
+  motionAxisState.zTypePos.y = y;
1040
+  drawCurZSelection();
1041
+  #if HAS_BED_PROBE
1042
+    if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (int32_t)z_select);
1043
+  #endif
1044
+
1045
+  // ROW 3 -> E- CurX Y-  Z-
1046
+  y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3;
1047
+  x = X_MARGIN;
1048
+  spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2;
1049
+
1050
+  drawBtn(x, y, "E-", (int32_t)e_minus, imgDown, E_BTN_COLOR, !busy);
1051
+
1052
+  // Cur E
1053
+  motionAxisState.eValuePos.x = x;
1054
+  motionAxisState.eValuePos.y = y + BTN_HEIGHT + 2;
1055
+  drawAxisValue(E_AXIS);
1056
+
1057
+  // Cur X
1058
+  motionAxisState.xValuePos.x = BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; //X- pos
1059
+  motionAxisState.xValuePos.y = y - 10;
1060
+  drawAxisValue(X_AXIS);
1061
+
1062
+  x += BTN_WIDTH + spacing;
1063
+  drawBtn(x, y, "Y-", (int32_t)y_minus, imgDown, Y_BTN_COLOR, !busy);
1064
+
1065
+  x += BTN_WIDTH + spacing;
1066
+  drawBtn(x, y, "Z-", (int32_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step
1067
+
1068
+  // Cur Z
1069
+  motionAxisState.zValuePos.x = x;
1070
+  motionAxisState.zValuePos.y = y + BTN_HEIGHT + 2;
1071
+  drawAxisValue(Z_AXIS);
1072
+
1073
+  // ROW 4 -> step_size  disable steppers back
1074
+  y = TFT_HEIGHT - Y_MARGIN - 32; //
1075
+  x = TFT_WIDTH / 2 - CUR_STEP_VALUE_WIDTH / 2;
1076
+  motionAxisState.stepValuePos.x = x;
1077
+  motionAxisState.stepValuePos.y = y;
1078
+  if (!busy) {
1079
+    drawCurStepValue();
1080
+    touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (int32_t)step_size);
1081
+  }
1082
+
1083
+  // alinged with x+
1084
+  drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (int32_t)disable_steppers, imgCancel, COLOR_WHITE, !busy);
1085
+
1086
+  add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack);
1087
+}
1088
+
1089
+#undef BTN_WIDTH
1090
+#undef BTN_HEIGHT
1091
+
657 1092
 #endif // HAS_UI_480x320

+ 2
- 0
Marlin/src/lcd/tft/ui_480x320.h Zobrazit soubor

@@ -73,6 +73,8 @@ const tImage Images[imgCount] = {
73 73
   Refresh_32x32x4,
74 74
   Leveling_32x32x4,
75 75
   Slider8x16x4,
76
+  Home_64x64x4,
77
+  BtnRounded_64x52x4,
76 78
 };
77 79
 
78 80
 #if HAS_TEMP_CHAMBER && HOTENDS > 1

+ 4
- 0
Marlin/src/lcd/ultralcd.h Zobrazit soubor

@@ -682,6 +682,10 @@ public:
682 682
     static void touch_calibration();
683 683
   #endif
684 684
 
685
+  #if HAS_GRAPHICAL_TFT
686
+    static void move_axis_screen();
687
+  #endif
688
+
685 689
 private:
686 690
 
687 691
   #if HAS_DISPLAY

+ 10
- 2
Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h Zobrazit soubor

@@ -325,13 +325,21 @@
325 325
   #define LCD_PINS_RS                       PC6
326 326
 
327 327
 #elif ENABLED(TFT_480x320_SPI)
328
+  #ifndef XPT2046_X_CALIBRATION
328 329
     #define XPT2046_X_CALIBRATION         -17253
330
+  #endif
331
+  #ifndef XPT2046_Y_CALIBRATION
329 332
     #define XPT2046_Y_CALIBRATION          11579
333
+  #endif
334
+  #ifndef XPT2046_X_OFFSET
330 335
     #define XPT2046_X_OFFSET                 514
336
+  #endif
337
+  #ifndef XPT2046_Y_OFFSET
331 338
     #define XPT2046_Y_OFFSET                 -24
339
+  #endif
332 340
 
333
-    #define TFT_DRIVER                    ST7796
334
-    #define TFT_BUFFER_SIZE                14400
341
+  #define TFT_DRIVER                      ST7796
342
+  #define TFT_BUFFER_SIZE                  14400
335 343
 
336 344
 #endif
337 345
 

Loading…
Zrušit
Uložit