|
@@ -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
|