58
58
/*
59
59
modified by alpine to 3x upscale for 3.5 TFT of the TwoTrees Sapphire Pro
60
60
61
- ToDo:
62
- * touchUI in general
63
- * check touch control to match hotzones to desired design
64
- *
65
-
66
- * make selectable upscale options (own class)
61
+ ToDo:
62
+
63
+ * done - linear upscale algorithm to safe cpu
64
+ * color selection / temperature indicator
65
+ (see old MKS version)
66
+ * G-Code control ("on/off"/"brightness"/color profiles)
67
+ * nyan cat
68
+
69
+ longterm:
70
+ * make selectable upscale options (in own classes)
67
71
* configurable through main/board config
68
- *
69
-
70
- for 480x320 px
72
+ * submit to marlin
73
+
74
+ done:
75
+ * touchUI in general --> done
76
+ * check touch control to match hotzones to desired design --> done
77
+ (not quite exact but reasonable close)
71
78
72
- desired screen arrangement:
73
-
74
- <-- 480 px -->
75
- __________________________
76
- |_| top offset: 32 px |_|
77
- |_|______________________|_| /\
78
- | | Marlin display |_| |
79
- | | 384*192 px |_| |
80
- |_|______________________|_| 320 px
81
- |_| middle spacing 16 px |_| |
82
- |_|______________________|_| |
83
- | | touch UI: 384*64 px |_| \/
84
- | | element Y: 2+60+2 px |_|
85
- |_|______________________|_|
86
- |_| bottom offset: 16 px |_|
87
- |_|______________________|_|
88
- ^- left offset: ^- right offset:
89
- 48 px 48 px
90
- */
79
+ */
91
80
92
81
#include " ../../inc/MarlinConfig.h"
93
82
105
94
extern void LCD_IO_WriteMultiple (uint16_t color, uint32_t count);
106
95
#endif
107
96
97
+ /*
98
+ desired screen arrangement:
99
+
100
+ (0/0) <-- 480 px -->
101
+ \/_________________________
102
+ |_| top offset: y 32 px |_|
103
+ |_|______________________|_| /\
104
+ | | Marlin display |_| |
105
+ | | 384*192 px |_| |
106
+ |_|______________________|_| 320 px
107
+ |_| middle spacing 16 px |_| |
108
+ |_|______________________|_| |
109
+ || touch UI: 384*64 px || \/
110
+ || UIelement Y 2+60+2 px ||
111
+ ||________________________||
112
+ |_| bottom offset y 16 px|_|
113
+ |_|______________________|_|<- (479/319)
114
+ ^- left offset: ^- right offset:
115
+ 48 px 48 px
116
+ */
117
+
108
118
#define WIDTH LCD_PIXEL_WIDTH
109
119
#define HEIGHT LCD_PIXEL_HEIGHT
110
120
#define PAGE_HEIGHT 8
119
129
#define LCD_ROW 0x2B /* Row address register */
120
130
#define LCD_WRITE_RAM 0x2C
121
131
132
+ /*
133
+ Touch UI
134
+ ||----------------------------||
135
+ || middle spacing 384*16px ||
136
+ ||----------------------------||/___ y = 242 px
137
+ || ELX | | ELA || ELB | | ELC ||\
138
+ x ||^24 ^136 ^248 ^360 ||/___ y = 301 px
139
+ ||----------------------------||\
140
+ 24 px + 96*4 px + 16*3 px + 24 px
141
+ */
142
+
143
+ #define BUTTON_SIZE_X 32
144
+ #define BUTTON_SIZE_Y 20
145
+
146
+ #define BUTTOND_X_LO 24
147
+ #define BUTTOND_X_HI (BUTTOND_X_LO + 3 * BUTTON_SIZE_X -1 )
148
+
149
+ #define BUTTONA_X_LO 136
150
+ #define BUTTONA_X_HI (BUTTONA_X_LO + 3 * BUTTON_SIZE_X -1 )
151
+
152
+ #define BUTTONB_X_LO 248
153
+ #define BUTTONB_X_HI (BUTTONB_X_LO + 3 * BUTTON_SIZE_X -1 )
154
+
155
+ #define BUTTONC_X_LO 360
156
+ #define BUTTONC_X_HI (BUTTONC_X_LO + 3 * BUTTON_SIZE_X -1 )
157
+
158
+ #define BUTTON_Y_LO 242
159
+ #define BUTTON_Y_HI (BUTTON_Y_LO + 3 * BUTTON_SIZE_Y -1 )
160
+
161
+
162
+
122
163
// see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html
123
164
124
165
#define COLOR_BLACK 0x0000 // #000000
151
192
#define TFT_MARLINUI_COLOR COLOR_WHITE
152
193
#endif
153
194
#ifndef TFT_MARLINBG_COLOR
154
- #define TFT_MARLINBG_COLOR COLOR_BLACK
195
+ #define TFT_MARLINBG_COLOR COLOR_NAVY
155
196
#endif
156
197
#ifndef TFT_DISABLED_COLOR
157
198
#define TFT_DISABLED_COLOR COLOR_DARK
158
199
#endif
159
200
#ifndef TFT_BTCANCEL_COLOR
160
- #define TFT_BTCANCEL_COLOR COLOR_RED
201
+ #define TFT_BTCANCEL_COLOR COLOR_WHITE
161
202
#endif
162
203
#ifndef TFT_BTARROWS_COLOR
163
- #define TFT_BTARROWS_COLOR COLOR_BLUE
204
+ #define TFT_BTARROWS_COLOR COLOR_WHITE
164
205
#endif
165
206
#ifndef TFT_BTOKMENU_COLOR
166
- #define TFT_BTOKMENU_COLOR COLOR_RED
207
+ #define TFT_BTOKMENU_COLOR COLOR_WHITE
167
208
#endif
168
209
169
210
static uint32_t lcd_id = 0 ;
@@ -186,6 +227,7 @@ static const uint8_t clear_screen_sequence[] = {
186
227
187
228
// @ ToDo
188
229
// check positions for new offsets
230
+ // --> done. see marlin/src/feature/touch/xpt2046.cpp
189
231
190
232
#if ENABLED(TOUCH_BUTTONS)
191
233
@@ -204,29 +246,29 @@ static const uint8_t clear_screen_sequence[] = {
204
246
};
205
247
206
248
static const uint8_t buttonD_sequence[] = {
207
- U8G_ESC_ADR (0 ), LCD_COLUMN, U8G_ESC_ADR (1 ), U8G_ESC_DATA (14 ), U8G_ESC_DATA (77 ),
208
- U8G_ESC_ADR (0 ), LCD_ROW, U8G_ESC_ADR (1 ), U8G_ESC_DATA (185 ), U8G_ESC_DATA (224 ),
249
+ U8G_ESC_ADR (0 ), LCD_COLUMN, U8G_ESC_ADR (1 ), U8G_ESC_DATA (BUTTOND_X_LO ), U8G_ESC_DATA (BUTTOND_X_HI ),
250
+ U8G_ESC_ADR (0 ), LCD_ROW, U8G_ESC_ADR (1 ), U8G_ESC_DATA (BUTTON_Y_LO ), U8G_ESC_DATA (BUTTON_Y_HI ),
209
251
U8G_ESC_ADR (0 ), LCD_WRITE_RAM, U8G_ESC_ADR (1 ),
210
252
U8G_ESC_END
211
253
};
212
254
213
255
static const uint8_t buttonA_sequence[] = {
214
- U8G_ESC_ADR (0 ), LCD_COLUMN, U8G_ESC_ADR (1 ), U8G_ESC_DATA (90 ), U8G_ESC_DATA (153 ),
215
- U8G_ESC_ADR (0 ), LCD_ROW, U8G_ESC_ADR (1 ), U8G_ESC_DATA (185 ), U8G_ESC_DATA (224 ),
256
+ U8G_ESC_ADR (0 ), LCD_COLUMN, U8G_ESC_ADR (1 ), U8G_ESC_DATA (BUTTONA_X_LO ), U8G_ESC_DATA (BUTTONA_X_HI ),
257
+ U8G_ESC_ADR (0 ), LCD_ROW, U8G_ESC_ADR (1 ), U8G_ESC_DATA (BUTTON_Y_LO ), U8G_ESC_DATA (BUTTON_Y_HI ),
216
258
U8G_ESC_ADR (0 ), LCD_WRITE_RAM, U8G_ESC_ADR (1 ),
217
259
U8G_ESC_END
218
260
};
219
261
220
262
static const uint8_t buttonB_sequence[] = {
221
- U8G_ESC_ADR (0 ), LCD_COLUMN, U8G_ESC_ADR (1 ), U8G_ESC_DATA (166 ), U8G_ESC_DATA (229 ),
222
- U8G_ESC_ADR (0 ), LCD_ROW, U8G_ESC_ADR (1 ), U8G_ESC_DATA (185 ), U8G_ESC_DATA (224 ),
263
+ U8G_ESC_ADR (0 ), LCD_COLUMN, U8G_ESC_ADR (1 ), U8G_ESC_DATA (BUTTONB_X_LO ), U8G_ESC_DATA (BUTTONB_X_HI ),
264
+ U8G_ESC_ADR (0 ), LCD_ROW, U8G_ESC_ADR (1 ), U8G_ESC_DATA (BUTTON_Y_LO ), U8G_ESC_DATA (BUTTON_Y_HI ),
223
265
U8G_ESC_ADR (0 ), LCD_WRITE_RAM, U8G_ESC_ADR (1 ),
224
266
U8G_ESC_END
225
267
};
226
268
227
269
static const uint8_t buttonC_sequence[] = {
228
- U8G_ESC_ADR (0 ), LCD_COLUMN, U8G_ESC_ADR (1 ), U8G_ESC_DATA (242 ), U8G_ESC_DATA (305 ),
229
- U8G_ESC_ADR (0 ), LCD_ROW, U8G_ESC_ADR (1 ), U8G_ESC_DATA (185 ), U8G_ESC_DATA (224 ),
270
+ U8G_ESC_ADR (0 ), LCD_COLUMN, U8G_ESC_ADR (1 ), U8G_ESC_DATA (BUTTONC_X_LO ), U8G_ESC_DATA (BUTTONC_X_HI ),
271
+ U8G_ESC_ADR (0 ), LCD_ROW, U8G_ESC_ADR (1 ), U8G_ESC_DATA (BUTTON_Y_LO ), U8G_ESC_DATA (BUTTON_Y_HI ),
230
272
U8G_ESC_ADR (0 ), LCD_WRITE_RAM, U8G_ESC_ADR (1 ),
231
273
U8G_ESC_END
232
274
};
@@ -430,28 +472,61 @@ static const uint8_t ili9341_init_sequence[] = { // 0x9341 - ILI9341
430
472
// *check if other parts of marlin use drawImage
431
473
432
474
void drawImage (const uint8_t *data, u8g_t *u8g, u8g_dev_t *dev, uint16_t length, uint16_t height, uint16_t color) {
433
- uint16_t buffer[128 ];
475
+ static uint16_t p_buffer[288 ];
476
+ uint16_t * buffer = &p_buffer[0 ];
434
477
435
478
for (uint16_t i = 0 ; i < height; i++) {
436
- uint16_t k = 0 ;
479
+ uint32_t k = 0 ;
437
480
for (uint16_t j = 0 ; j < length; j++) {
438
481
uint16_t v = TFT_MARLINBG_COLOR;
439
482
if (*(data + (i * (length >> 3 ) + (j >> 3 ))) & (0x80 >> (j & 7 )))
440
483
v = color;
441
484
else
442
485
v = TFT_MARLINBG_COLOR;
443
- buffer[k++] = v; buffer[k++] = v;
486
+
487
+ // linear write should be faster
488
+ // optimize later
489
+ //
490
+ // buffer[k+96] = v;
491
+ // buffer[k+192] = v;
492
+ // buffer[k++] = v;
493
+ // buffer[k+96] = v;
494
+ // buffer[k+192] = v;
495
+ // buffer[k++] = v;
496
+ // buffer[k+96] = v;
497
+ // buffer[k+192] = v;
498
+ // buffer[k++] = v;
499
+
500
+ // upscale X 3x
501
+ buffer[k++] = v;
502
+ buffer[k++] = v;
503
+ buffer[k++] = v;
444
504
}
445
505
#ifdef LCD_USE_DMA_FSMC
446
- if (k <= 80 ) { // generally is... for our buttons
447
- memcpy (&buffer[k], &buffer[0 ], k * sizeof (uint16_t ));
506
+ // if (k <= 80) { // generally is... for our buttons
507
+ // memcpy(&buffer[k], &buffer[0], k * sizeof(uint16_t));
448
508
449
- LCD_IO_WriteSequence (buffer, k * sizeof (uint16_t ));
509
+ // LCD_IO_WriteSequence(buffer, k * sizeof(uint16_t));
510
+ // }
511
+ // else {
512
+ // LCD_IO_WriteSequence(buffer, k);
513
+
514
+ // LCD_IO_WriteSequence(buffer, k);
515
+ // }
516
+
517
+ // Upscale Y 3x
518
+ // linear write should be faster for big arrays
519
+ //
520
+ for (uint16_t l = 0 ; l < 96 ; l++)
521
+ {
522
+ buffer[l+96 ] = buffer[l];
450
523
}
451
- else {
452
- LCD_IO_WriteSequence (buffer, k);
453
- LCD_IO_WriteSequence ( buffer, k) ;
524
+ for ( uint16_t l = 0 ; l < 96 ; l++)
525
+ {
526
+ buffer[l+ 192 ] = buffer[l] ;
454
527
}
528
+
529
+ LCD_IO_WriteSequence (p_buffer, 288 );
455
530
#else
456
531
u8g_WriteSequence (u8g, dev, k << 1 , (uint8_t *)buffer);
457
532
u8g_WriteSequence (u8g, dev, k << 1 , (uint8_t *)buffer);
@@ -510,20 +585,22 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
510
585
// bottom line and buttons
511
586
#if ENABLED(TOUCH_BUTTONS)
512
587
513
- #ifdef LCD_USE_DMA_FSMC
514
- u8g_WriteEscSeqP (u8g, dev, separation_line_sequence_left);
515
- LCD_IO_WriteMultiple (TFT_DISABLED_COLOR, 300 );
516
- u8g_WriteEscSeqP (u8g, dev, separation_line_sequence_right);
517
- LCD_IO_WriteMultiple (TFT_DISABLED_COLOR, 300 );
518
- #else
519
- memset2 (buffer, TFT_DISABLED_COLOR, 150 );
520
- u8g_WriteEscSeqP (u8g, dev, separation_line_sequence_left);
521
- for (uint8_t i = 4 ; i--;)
522
- u8g_WriteSequence (u8g, dev, 150 , (uint8_t *)buffer);
523
- u8g_WriteEscSeqP (u8g, dev, separation_line_sequence_right);
524
- for (uint8_t i = 4 ; i--;)
525
- u8g_WriteSequence (u8g, dev, 150 , (uint8_t *)buffer);
526
- #endif
588
+ // why the linewrites
589
+
590
+ // #ifdef LCD_USE_DMA_FSMC
591
+ // u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_left);
592
+ // LCD_IO_WriteMultiple(TFT_DISABLED_COLOR, 300);
593
+ // u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_right);
594
+ // LCD_IO_WriteMultiple(TFT_DISABLED_COLOR, 300);
595
+ // #else
596
+ // memset2(buffer, TFT_DISABLED_COLOR, 150);
597
+ // u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_left);
598
+ // for (uint8_t i = 4; i--;)
599
+ // u8g_WriteSequence(u8g, dev, 150, (uint8_t *)buffer);
600
+ // u8g_WriteEscSeqP(u8g, dev, separation_line_sequence_right);
601
+ // for (uint8_t i = 4; i--;)
602
+ // u8g_WriteSequence(u8g, dev, 150, (uint8_t *)buffer);
603
+ // #endif
527
604
528
605
// @ check button sizes
529
606
u8g_WriteEscSeqP (u8g, dev, buttonD_sequence);
@@ -566,23 +643,38 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
566
643
// buffer[k++] = c;
567
644
568
645
// @ 3x upscale X and Y in same loop
646
+ // 1 px -> 3*3 px
569
647
// resulting buffersize RGB565 * 1152 - 128*3*3
570
- // need to check what solution is faster
571
648
572
- buffer[k+384 ] = c;
573
- buffer[k+768 ] = c;
649
+ // sequential write should be faster
650
+ // buffer[k+384] = c;
651
+ // buffer[k+768] = c;
652
+ // buffer[k++] = c;
653
+ // buffer[k+384] = c;
654
+ // buffer[k+768] = c;
655
+ // buffer[k++] = c;
656
+ // buffer[k+384] = c;
657
+ // buffer[k+768] = c;
658
+ // buffer[k++] = c;
574
659
buffer[k++] = c;
575
- buffer[k+384 ] = c;
576
- buffer[k+768 ] = c;
577
660
buffer[k++] = c;
578
- buffer[k+384 ] = c;
579
- buffer[k+768 ] = c;
580
661
buffer[k++] = c;
581
662
}
582
663
#ifdef LCD_USE_DMA_FSMC
583
664
// @ 2x upscale Y
584
665
// resulting buffersize RGB565 * 512 - 256*2
585
666
// memcpy(&buffer[256], &buffer[0], 512);
667
+ // Upscale Y 3x
668
+ // linear write should be faster for big arrays
669
+ //
670
+ for (uint16_t l = 0 ; l < 384 ; l++)
671
+ {
672
+ buffer[l+384 ] = buffer[l];
673
+ }
674
+ for (uint16_t l = 0 ; l < 384 ; l++)
675
+ {
676
+ buffer[l+768 ] = buffer[l];
677
+ }
586
678
587
679
if (allow_async) {
588
680
if (y > 0 || page > 1 ) LCD_IO_WaitSequence_Async ();
@@ -594,7 +686,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
594
686
LCD_IO_WriteSequence_Async (buffer, 1152 );
595
687
}
596
688
else
597
- LCD_IO_WriteSequence (buffer, 512 );
689
+ LCD_IO_WriteSequence (buffer, 1152 );
598
690
#else
599
691
uint8_t * bufptr = (uint8_t *) buffer;
600
692
for (uint8_t i = 2 ; i--;) {
0 commit comments