37
37
#define LINE_HEIGHT (FONT_HEIGHT)
38
38
39
39
// 3 extra lines for fan, therm, indicators.
40
- #define DPY_MAX_ROWS (LINE_HEIGHT *(N_MOTORS + 3U))
40
+ #define DPY_MAX_ROWS (LINE_HEIGHT *(N_MOTORS + 4U))
41
41
#define DPY_MAX_COLS 480
42
42
#define LED_HT LINE_HEIGHT
43
43
@@ -59,6 +59,7 @@ struct Dashboard2DState {
59
59
uint32_t framebuffer [DPY_MAX_ROWS * DPY_MAX_COLS ];
60
60
61
61
char * ind_labels ;
62
+ char * title ;
62
63
63
64
pixman_color_t leds [N_LEDS ];
64
65
uint32_t led_colours [N_LEDS ];
@@ -101,7 +102,7 @@ static pixman_color_t attr_disabled[2] = {
101
102
102
103
static pixman_color_t * dashboard_2d_get_attr (const p404_motorif_status_t * s )
103
104
{
104
- return s -> status .stalled ? attr_stall :
105
+ return s -> status .stalled ? attr_stall :
105
106
(!s -> status .enabled ? attr_disabled :
106
107
( s -> status .stealth ? attr_stealth : attr_norm )
107
108
);
@@ -112,10 +113,10 @@ static void dashboard_2d_update_display(void *opaque)
112
113
Dashboard2DState * s = DB2D_DISPLAY (opaque );
113
114
DisplaySurface * surface = qemu_console_surface (s -> con );
114
115
uint8_t * dest = NULL ;
115
-
116
+
116
117
const p404_motorif_status_t * m [10 ] = {NULL };
117
118
118
- int motor_count = 0 ;
119
+ int motor_count = 1 ;
119
120
120
121
for (int i = 0 ; i < N_MOTORS ; i ++ )
121
122
{
@@ -128,7 +129,7 @@ static void dashboard_2d_update_display(void *opaque)
128
129
s -> redraw = true;
129
130
if (m [i ]-> max_pos > 0 ) // negative max pos means no endstop...
130
131
{
131
- int row = FONT_HEIGHT * i ;
132
+ int row = FONT_HEIGHT * ( i + 1 ) ;
132
133
int offset = FONT_WIDTH + (FONT_WIDTH /2 );
133
134
int index = (DPY_MAX_COLS * row )+ offset ;
134
135
uint16_t scale = (m [i ]-> max_pos <=200 ? 2 : 1 );
@@ -145,11 +146,9 @@ static void dashboard_2d_update_display(void *opaque)
145
146
}
146
147
}
147
148
}
148
-
149
149
}
150
150
}
151
-
152
- if (!s -> redraw )
151
+ if (!s -> redraw )
153
152
return ;
154
153
155
154
dest = surface_data (surface );
@@ -160,11 +159,11 @@ static void dashboard_2d_update_display(void *opaque)
160
159
if (m [i ] && m [i ]-> status .changed )
161
160
{
162
161
char pos [9 ];
163
- vga_putcharxy (s -> con , 0 , i , m [i ]-> label , dashboard_2d_get_attr (m [i ]) );
162
+ vga_putcharxy (s -> con , 0 , i + 1 , m [i ]-> label , dashboard_2d_get_attr (m [i ]) );
164
163
snprintf (pos , sizeof (pos ),"%8.3f" , m [i ]-> current_pos );
165
164
for (int j = 0 ; j < 8 ; j ++ )
166
165
{
167
- vga_putcharxy (s -> con , (60 - 8 )+ j , i , pos [j ], attr_norm );
166
+ vga_putcharxy (s -> con , (60 - 8 )+ j , i + 1 , pos [j ], attr_norm );
168
167
}
169
168
}
170
169
}
@@ -192,7 +191,7 @@ static void dashboard_2d_update_display(void *opaque)
192
191
QEMU_RGB (0xFF * light , 0xFF * light , 0xFF * light ),
193
192
QEMU_RGB (s -> therm_pwms [i ], 0 ,0 ),
194
193
};
195
-
194
+
196
195
vga_putcharxy (s -> con , (10 * i ) + 0 , motor_count + 1 , 'T' , attr_norm );
197
196
vga_putcharxy (s -> con , (10 * i ) + 1 , motor_count + 1 , '0' + i , attr_norm );
198
197
vga_putcharxy (s -> con , (10 * i ) + 2 , motor_count + 1 , ':' , attr_norm );
@@ -203,14 +202,20 @@ static void dashboard_2d_update_display(void *opaque)
203
202
}
204
203
205
204
for (int i = 0 ; i < MIN (strlen (s -> ind_labels ), N_LEDS ); i ++ )
206
- {
205
+ {
207
206
bool light = s -> leds [i ].red < (128 <<8 ) && s -> leds [i ].green < (128 <<8 ) && s -> leds [i ].blue < (128 <<8 );
208
207
pixman_color_t fg = QEMU_RGB (255 * light , 255 * light , 255 * light );
209
208
vga_putcharxy_s (s -> con , (4 * i ) + 1 , motor_count + 2 , s -> ind_labels [i ], & fg , & s -> leds [i ]);
210
209
vga_putcharxy_s (s -> con , (4 * i ) + 0 , motor_count + 2 , ' ' , & fg , & s -> leds [i ]);
211
210
vga_putcharxy_s (s -> con , (4 * i ) + 2 , motor_count + 2 , ' ' , & fg , & s -> leds [i ]);
212
211
}
213
-
212
+ if (s -> title != NULL )
213
+ {
214
+ for (int i = 0 ; i < strlen (s -> title ); i ++ )
215
+ {
216
+ vga_putcharxy (s -> con , i , 0 , s -> title [i ], attr_norm );
217
+ }
218
+ }
214
219
s -> redraw = false;
215
220
dpy_gfx_update (s -> con , 0 , 0 , DPY_MAX_COLS , DPY_MAX_ROWS + LED_HT );
216
221
}
@@ -234,6 +239,14 @@ static void dashboard_2d_wled_in(void *opaque, int n, int level)
234
239
s -> leds [n ].blue = level <<8 ;
235
240
}
236
241
242
+ static void dashboard_2d_rgbled_in (void * opaque , int n , int level )
243
+ {
244
+ Dashboard2DState * s = DB2D_DISPLAY (opaque );
245
+ s -> leds [n ].red = (level & 0xFF0000 ) >> 8 ;
246
+ s -> leds [n ].green = (level & 0x00FF00 );
247
+ s -> leds [n ].blue = (level & 0x0000FF ) << 8 ;
248
+ }
249
+
237
250
static void dashboard_2d_rled_in (void * opaque , int n , int level )
238
251
{
239
252
Dashboard2DState * s = DB2D_DISPLAY (opaque );
@@ -269,7 +282,6 @@ static void dashboard_2d_bled_in(void *opaque, int n, int level)
269
282
static void dashboard_2d_digital_led_in (void * opaque , int n , int level )
270
283
{
271
284
Dashboard2DState * s = DB2D_DISPLAY (opaque );
272
-
273
285
s -> leds [n ].red = (level * 255 )<<8 ;
274
286
s -> leds [n ].green = (level * 255 )<<8 ;
275
287
}
@@ -310,6 +322,7 @@ static void dashboard_2d_init(Object *obj)
310
322
DeviceState * dev = DEVICE (obj );
311
323
312
324
qdev_init_gpio_in_named (dev , dashboard_2d_wled_in , "led-w" , N_LEDS );
325
+ qdev_init_gpio_in_named (dev , dashboard_2d_rgbled_in , "led-rgb" , N_LEDS );
313
326
qdev_init_gpio_in_named (dev , dashboard_2d_rled_in , "led-r" , N_LEDS );
314
327
qdev_init_gpio_in_named (dev , dashboard_2d_gled_in , "led-g" , N_LEDS );
315
328
qdev_init_gpio_in_named (dev , dashboard_2d_bled_in , "led-b" , N_LEDS );
@@ -328,16 +341,15 @@ static void dashboard_2d_realize(DeviceState *dev, Error **errp)
328
341
Dashboard2DState * s = DB2D_DISPLAY (dev );
329
342
330
343
// Calculate total rows:
331
- int i = 0 ;
344
+ int i = 1 ;
332
345
for (i = 0 ; i < N_MOTORS ; i ++ )
333
346
{
334
347
if (s -> motors [i ] == NULL )
335
348
break ;
336
349
}
337
-
338
350
s -> current_rows = LINE_HEIGHT * i ;
339
351
340
- s -> current_rows += (3 * LINE_HEIGHT );
352
+ s -> current_rows += (4 * LINE_HEIGHT );
341
353
s -> con = graphic_console_init (dev , 0 , & dashboard_2d_ops , s );
342
354
qemu_console_resize (s -> con , DPY_MAX_COLS , s -> current_rows );
343
355
}
@@ -367,6 +379,7 @@ static Property dashboard_2d_properties[] = {
367
379
DEFINE_PROP_UINT8 ("fans" , Dashboard2DState , fan_count , 0 ),
368
380
DEFINE_PROP_UINT8 ("thermistors" , Dashboard2DState , therm_count , 0 ),
369
381
DEFINE_PROP_STRING ("indicators" , Dashboard2DState , ind_labels ),
382
+ DEFINE_PROP_STRING ("title" , Dashboard2DState , title ),
370
383
DEFINE_PROP_END_OF_LIST ()
371
384
};
372
385
0 commit comments