Browse Source

Color UI circular task queue (#19918)

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

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

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

Loading…
Cancel
Save