Browse Source

Color UI circular task queue (#19918)

Victor Oliveira 3 years ago
parent
commit
94a6844521
No account linked to committer's email address
2 changed files with 37 additions and 22 deletions
  1. 30
    22
      Marlin/src/lcd/tft/tft_queue.cpp
  2. 7
    0
      Marlin/src/lcd/tft/tft_queue.h

+ 30
- 22
Marlin/src/lcd/tft/tft_queue.cpp View File

@@ -32,6 +32,7 @@ uint8_t TFT_Queue::queue[];
32 32
 uint8_t *TFT_Queue::end_of_queue = queue;
33 33
 uint8_t *TFT_Queue::current_task = nullptr;
34 34
 uint8_t *TFT_Queue::last_task = nullptr;
35
+uint8_t *TFT_Queue::last_parameter = nullptr;
35 36
 
36 37
 void TFT_Queue::reset() {
37 38
   tft.abort();
@@ -39,6 +40,7 @@ void TFT_Queue::reset() {
39 40
   end_of_queue = queue;
40 41
   current_task = nullptr;
41 42
   last_task = nullptr;
43
+  last_parameter = nullptr;
42 44
 }
43 45
 
44 46
 void TFT_Queue::async() {
@@ -113,49 +115,28 @@ void TFT_Queue::canvas(queueTask_t *task) {
113 115
     switch (*item) {
114 116
       case CANVAS_SET_BACKGROUND:
115 117
         Canvas.SetBackground(((parametersCanvasBackground_t *)item)->color);
116
-        item += sizeof(parametersCanvasBackground_t);
117 118
         break;
118 119
       case CANVAS_ADD_TEXT:
119 120
         Canvas.AddText(((parametersCanvasText_t *)item)->x, ((parametersCanvasText_t *)item)->y, ((parametersCanvasText_t *)item)->color, item + sizeof(parametersCanvasText_t), ((parametersCanvasText_t *)item)->maxWidth);
120
-        item += sizeof(parametersCanvasText_t) + ((parametersCanvasText_t *)item)->stringLength;
121 121
         break;
122 122
 
123 123
       case CANVAS_ADD_IMAGE:
124 124
         MarlinImage image;
125 125
         uint16_t *colors;
126
-        colorMode_t color_mode;
127 126
 
128 127
         image = ((parametersCanvasImage_t *)item)->image;
129 128
         colors = (uint16_t *)(item + sizeof(parametersCanvasImage_t));
130 129
         Canvas.AddImage(((parametersCanvasImage_t *)item)->x, ((parametersCanvasImage_t *)item)->y, image, colors);
131
-
132
-        item = (uint8_t *)colors;
133
-        color_mode = Images[image].colorMode;
134
-
135
-        switch (color_mode) {
136
-          case GREYSCALE1:
137
-            item += sizeof(uint16_t);
138
-            break;
139
-          case GREYSCALE2:
140
-            item += sizeof(uint16_t) * 3;
141
-            break;
142
-          case GREYSCALE4:
143
-            item += sizeof(uint16_t) * 15;
144
-            break;
145
-          default:
146
-            break;
147
-        }
148 130
         break;
149 131
 
150 132
       case CANVAS_ADD_BAR:
151 133
         Canvas.AddBar(((parametersCanvasBar_t *)item)->x, ((parametersCanvasBar_t *)item)->y, ((parametersCanvasBar_t *)item)->width, ((parametersCanvasBar_t *)item)->height, ((parametersCanvasBar_t *)item)->color);
152
-        item += sizeof(parametersCanvasBar_t);
153 134
         break;
154 135
       case CANVAS_ADD_RECTANGLE:
155 136
         Canvas.AddRectangle(((parametersCanvasRectangle_t *)item)->x, ((parametersCanvasRectangle_t *)item)->y, ((parametersCanvasRectangle_t *)item)->width, ((parametersCanvasRectangle_t *)item)->height, ((parametersCanvasRectangle_t *)item)->color);
156
-        item += sizeof(parametersCanvasRectangle_t);
157 137
         break;
158 138
     }
139
+    item = ((parametersCanvasBackground_t *)item)->nextParameter;
159 140
   }
160 141
 
161 142
   if (Canvas.ToScreen()) task->state = TASK_STATE_COMPLETED;
@@ -172,6 +153,7 @@ void TFT_Queue::fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, ui
172 153
   parametersFill_t *task_parameters = (parametersFill_t *)end_of_queue;
173 154
   end_of_queue += sizeof(parametersFill_t);
174 155
 
156
+  last_parameter = end_of_queue;
175 157
   task_parameters->x = x;
176 158
   task_parameters->y = y;
177 159
   task_parameters->width = width;
@@ -201,6 +183,7 @@ void TFT_Queue::canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height)
201 183
   parametersCanvas_t *task_parameters = (parametersCanvas_t *)end_of_queue;
202 184
   end_of_queue += sizeof(parametersCanvas_t);
203 185
 
186
+  last_parameter = end_of_queue;
204 187
   task_parameters->x = x;
205 188
   task_parameters->y = y;
206 189
   task_parameters->width = width;
@@ -211,19 +194,33 @@ void TFT_Queue::canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height)
211 194
 }
212 195
 
213 196
 void TFT_Queue::set_background(uint16_t color) {
197
+  handle_queue_overflow(sizeof(parametersCanvasBackground_t));
214 198
   parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t));
215 199
   parametersCanvasBackground_t *parameters = (parametersCanvasBackground_t *)end_of_queue;
200
+  last_parameter = end_of_queue;
216 201
 
217 202
   parameters->type = CANVAS_SET_BACKGROUND;
218 203
   parameters->color = color;
219 204
 
220 205
   end_of_queue += sizeof(parametersCanvasBackground_t);
221 206
   task_parameters->count++;
207
+  parameters->nextParameter = end_of_queue;
208
+}
209
+
210
+#define QUEUE_SAFETY_FREE_SPACE 100
211
+
212
+void TFT_Queue::handle_queue_overflow(uint16_t sizeNeeded) {
213
+  if (uintptr_t(end_of_queue) + sizeNeeded + (QUEUE_SAFETY_FREE_SPACE) - uintptr_t(queue) >= QUEUE_SIZE) {
214
+    end_of_queue = queue;
215
+    ((parametersCanvasText_t *)last_parameter)->nextParameter = end_of_queue;
216
+  }
222 217
 }
223 218
 
224 219
 void TFT_Queue::add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth) {
220
+  handle_queue_overflow(sizeof(parametersCanvasText_t) + maxWidth);
225 221
   parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t));
226 222
   parametersCanvasText_t *parameters = (parametersCanvasText_t *)end_of_queue;
223
+  last_parameter = end_of_queue;
227 224
 
228 225
   uint8_t *pointer = string;
229 226
 
@@ -239,13 +236,16 @@ void TFT_Queue::add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string
239 236
   /* TODO: Deal with maxWidth */
240 237
   while ((*(end_of_queue++) = *pointer++) != 0x00);
241 238
 
239
+  parameters->nextParameter = end_of_queue;
242 240
   parameters->stringLength = pointer - string;
243 241
   task_parameters->count++;
244 242
 }
245 243
 
246 244
 void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) {
245
+  handle_queue_overflow(sizeof(parametersCanvasImage_t));
247 246
   parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t));
248 247
   parametersCanvasImage_t *parameters = (parametersCanvasImage_t *)end_of_queue;
248
+  last_parameter = end_of_queue;
249 249
 
250 250
   parameters->type = CANVAS_ADD_IMAGE;
251 251
   parameters->x = x;
@@ -254,6 +254,7 @@ void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *col
254 254
 
255 255
   end_of_queue += sizeof(parametersCanvasImage_t);
256 256
   task_parameters->count++;
257
+  parameters->nextParameter = end_of_queue;
257 258
 
258 259
   colorMode_t color_mode = Images[image].colorMode;
259 260
 
@@ -275,6 +276,7 @@ void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *col
275 276
   }
276 277
 
277 278
   end_of_queue = (uint8_t *)color;
279
+  parameters->nextParameter = end_of_queue;
278 280
 }
279 281
 
280 282
 uint16_t gradient(uint16_t colorA, uint16_t colorB, uint16_t factor) {
@@ -314,8 +316,10 @@ void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t colo
314 316
 }
315 317
 
316 318
 void TFT_Queue::add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) {
319
+  handle_queue_overflow(sizeof(parametersCanvasBar_t));
317 320
   parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t));
318 321
   parametersCanvasBar_t *parameters = (parametersCanvasBar_t *)end_of_queue;
322
+  last_parameter = end_of_queue;
319 323
 
320 324
   parameters->type = CANVAS_ADD_BAR;
321 325
   parameters->x = x;
@@ -326,11 +330,14 @@ void TFT_Queue::add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
326 330
 
327 331
   end_of_queue += sizeof(parametersCanvasBar_t);
328 332
   task_parameters->count++;
333
+  parameters->nextParameter = end_of_queue;
329 334
 }
330 335
 
331 336
 void TFT_Queue::add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) {
337
+  handle_queue_overflow(sizeof(parametersCanvasRectangle_t));
332 338
   parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t));
333 339
   parametersCanvasRectangle_t *parameters = (parametersCanvasRectangle_t *)end_of_queue;
340
+  last_parameter = end_of_queue;
334 341
 
335 342
   parameters->type = CANVAS_ADD_RECTANGLE;
336 343
   parameters->x = x;
@@ -341,6 +348,7 @@ void TFT_Queue::add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t h
341 348
 
342 349
   end_of_queue += sizeof(parametersCanvasRectangle_t);
343 350
   task_parameters->count++;
351
+  parameters->nextParameter = end_of_queue;
344 352
 }
345 353
 
346 354
 #endif // HAS_GRAPHICAL_TFT

+ 7
- 0
Marlin/src/lcd/tft/tft_queue.h View File

@@ -73,11 +73,13 @@ typedef struct __attribute__((__packed__)) {
73 73
 
74 74
 typedef struct __attribute__((__packed__)) {
75 75
   CanvasSubtype type;
76
+  uint8_t *nextParameter;
76 77
   uint16_t color;
77 78
 } parametersCanvasBackground_t;
78 79
 
79 80
 typedef struct __attribute__((__packed__)) {
80 81
   CanvasSubtype type;
82
+  uint8_t *nextParameter;
81 83
   uint16_t x;
82 84
   uint16_t y;
83 85
   uint16_t color;
@@ -88,6 +90,7 @@ typedef struct __attribute__((__packed__)) {
88 90
 
89 91
 typedef struct __attribute__((__packed__)) {
90 92
   CanvasSubtype type;
93
+  uint8_t *nextParameter;
91 94
   int16_t x;
92 95
   int16_t y;
93 96
   MarlinImage image;
@@ -95,6 +98,7 @@ typedef struct __attribute__((__packed__)) {
95 98
 
96 99
 typedef struct __attribute__((__packed__)) {
97 100
   CanvasSubtype type;
101
+  uint8_t *nextParameter;
98 102
   uint16_t x;
99 103
   uint16_t y;
100 104
   uint16_t width;
@@ -104,6 +108,7 @@ typedef struct __attribute__((__packed__)) {
104 108
 
105 109
 typedef struct __attribute__((__packed__)) {
106 110
   CanvasSubtype type;
111
+  uint8_t *nextParameter;
107 112
   uint16_t x;
108 113
   uint16_t y;
109 114
   uint16_t width;
@@ -117,10 +122,12 @@ class TFT_Queue {
117 122
     static uint8_t *end_of_queue;
118 123
     static uint8_t *current_task;
119 124
     static uint8_t *last_task;
125
+    static uint8_t *last_parameter;
120 126
 
121 127
     static void finish_sketch();
122 128
     static void fill(queueTask_t *task);
123 129
     static void canvas(queueTask_t *task);
130
+    static void handle_queue_overflow(uint16_t sizeNeeded);
124 131
 
125 132
   public:
126 133
     static void reset();

Loading…
Cancel
Save