Skip to content

Commit aac4663

Browse files
committed
On-screen LEDs
1 parent 5e9a493 commit aac4663

19 files changed

+442
-23
lines changed

STATUS

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ wait.
3030
- Make the user interface adapt better to non-16:9 displays.
3131
- Better support for high-DPI displays.
3232
- New standard bezel which tries to frame the 4:3 output while being pleasant.
33-
- On-screen LEDs by default (TODO).
34-
- On-screen keyboard (F11 or SELECT to toggle) - Visual look not done yet.
33+
- New on-screen LEDs by default.
34+
- New On-screen keyboard (F11 or SELECT to toggle) - Visual look not done yet.
3535
- New performance overlay (Alt/Cmd+O) which makes it easier to identify
3636
performance issues.
3737
- Much improved support for Raspberry Pi 4.

fsemu/src/fsemu-color.h

+8-8
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ extern "C" {
1111

1212
typedef uint32_t fsemu_color_t;
1313

14-
#define FSEMU_COLOR_RGB(c) \
15-
(((c & 0xff0000) >> 16) | (c & 0x00ff00) | ((c & 0x0000ff) << 16) | \
14+
#define FSEMU_COLOR_RGB(c) \
15+
((((c) &0xff0000) >> 16) | ((c) &0x00ff00) | (((c) &0x0000ff) << 16) | \
1616
0xff000000)
1717

18-
#define FSEMU_COLOR_RGBA(c) \
19-
(((c & 0xff000000) >> 24) | ((c & 0x00ff0000) >> 8) | \
20-
((c & 0x0000ff00) << 8) | ((c & 0x000000ff) << 24))
18+
#define FSEMU_COLOR_RGBA(c) \
19+
((((c) &0xff000000) >> 24) | (((c) &0x00ff0000) >> 8) | \
20+
(((c) &0x0000ff00) << 8) | (((c) &0x000000ff) << 24))
2121

22-
#define FSEMU_COLOR_RGB_A(c, a) \
23-
(((c & 0xff0000) >> 16) | (c & 0x00ff00) | ((c & 0x0000ff) << 16) | \
24-
((a & 0x000000ff) << 24))
22+
#define FSEMU_COLOR_RGB_A(c, a) \
23+
((((c) &0xff0000) >> 16) | ((c) &0x00ff00) | (((c) &0x0000ff) << 16) | \
24+
(((a) &0x000000ff) << 24))
2525

2626
#define FSEMU_COLOR_BLACK FSEMU_COLOR_RGB(0x000000)
2727
#define FSEMU_COLOR_BLUE FSEMU_COLOR_RGB(0x0000ff)

fsemu/src/fsemu-glvideo.c

+2
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,9 @@ static void fsemu_glvideo_render_text(fsemu_gui_item_t *widget)
10581058
double text_h = 2.0 * widget->textimage->height / 1080.0;
10591059
double text_w = 2.0 * widget->textimage->width * client_size.h /
10601060
client_size.w / 1080.0;
1061+
dr.x = dr.x + (dr.w - text_w) * widget->text_halign;
10611062
dr.y = dr.y + (dr.h - text_h) * (1.0 - widget->text_valign);
1063+
10621064
dr.h = text_h;
10631065
// FIXME: Clamp with to original dr.w plus adjust tx to achieve clipping?
10641066
dr.w = text_w;

fsemu/src/fsemu-gui.h

+2
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ struct fsemu_gui_item_struct {
103103

104104
char *text;
105105
fsemu_image_t *textimage;
106+
// Default is 0.0 for left-aligned.
107+
float text_halign;
106108
// Default is 0.5 for centered vertically.
107109
float text_valign;
108110
// For example FSEMU_WIDGET_TEXT_TRANSFORM_UPPERCASE.

fsemu/src/fsemu-layer.h

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
extern "C" {
88
#endif
99

10+
#define FSEMU_LAYER_LEDS -1000
1011
#define FSEMU_LAYER_VIDEO 0
1112
#define FSEMU_LAYER_OSMENU 8000
1213
#define FSEMU_LAYER_OSKEYBOARD 9000

fsemu/src/fsemu-led.c

+55-6
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,27 @@
66

77
#include "fsemu-util.h"
88

9+
// FIXME: DEBUG -> INFO;
10+
int fsemu_led_log_level = FSEMU_LOG_LEVEL_DEBUG;
11+
912
struct fsemu_led_t {
1013
char *id;
1114
char *label;
1215
fsemu_led_state_t state;
16+
int brightness;
17+
bool changed;
1318
};
1419

1520
void fsemu_led_init(fsemu_led_t *led)
1621
{
17-
fsemu_led_set_id(led, "");
18-
fsemu_led_set_label(led, "");
22+
// Memory might not be initialized to zeros, all fields must be
23+
// initialized here.
24+
led->id = strdup("");
25+
led->label = strdup("");
26+
led->state = 0;
27+
led->brightness = 100;
28+
// Set changed to one initially, useful for check in renderer.
29+
led->changed = 1;
1930
}
2031

2132
fsemu_led_t *fsemu_led_create(void)
@@ -33,10 +44,14 @@ const char *fsemu_led_id(fsemu_led_t *led)
3344
void fsemu_led_set_id(fsemu_led_t *led, const char *id)
3445
{
3546
fsemu_assert(id != NULL);
36-
if (led->id) {
37-
free(led->id);
47+
if (strcmp(id, led->id) == 0) {
48+
return;
3849
}
50+
// if (led->id) {
51+
free(led->id);
52+
// }
3953
led->id = strdup(id);
54+
led->changed = true;
4055
}
4156

4257
const char *fsemu_led_label(fsemu_led_t *led)
@@ -47,10 +62,14 @@ const char *fsemu_led_label(fsemu_led_t *led)
4762
void fsemu_led_set_label(fsemu_led_t *led, const char *label)
4863
{
4964
fsemu_assert(label != NULL);
50-
if (led->label) {
51-
free(led->label);
65+
if (strcmp(label, led->label) == 0) {
66+
return;
5267
}
68+
// if (led->label) {
69+
free(led->label);
70+
// }
5371
led->label = strdup(label);
72+
led->changed = true;
5473
}
5574

5675
fsemu_led_state_t fsemu_led_state(fsemu_led_t *led)
@@ -60,5 +79,35 @@ fsemu_led_state_t fsemu_led_state(fsemu_led_t *led)
6079

6180
void fsemu_led_set_state(fsemu_led_t *led, fsemu_led_state_t state)
6281
{
82+
if (state == led->state) {
83+
return;
84+
}
85+
fsemu_assert (state >= 0 && state < FSEMU_LED_MAX_STATES);
6386
led->state = state;
87+
// printf("LED \"%s\" -> state %d\n", led->label, state);
88+
led->changed = true;
89+
}
90+
91+
int fsemu_led_brightness(fsemu_led_t *led)
92+
{
93+
return led->brightness;
94+
}
95+
96+
void fsemu_led_set_brightness(fsemu_led_t *led, int brightness)
97+
{
98+
if (brightness == led->brightness) {
99+
return;
100+
}
101+
led->brightness = brightness;
102+
// printf("LED \"%s\" -> brightness %d\n", led->label, brightness);
103+
led->changed = true;
104+
}
105+
106+
bool fsemu_led_check_and_reset_changed(fsemu_led_t *led)
107+
{
108+
if (led->changed) {
109+
led->changed = false;
110+
return true;
111+
}
112+
return false;
64113
}

fsemu/src/fsemu-led.h

+41
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22
#define FSEMU_LED_H_
33

44
#include "fsemu-config.h"
5+
#include "fsemu-log.h"
56

67
#ifdef __cplusplus
78
extern "C" {
89
#endif
910

11+
#define FSEMU_LED_MAX_STATES 4
12+
1013
typedef enum {
1114
FSEMU_LED_STATE_OFF,
1215
FSEMU_LED_STATE_ON,
16+
FSEMU_LED_STATE_ALT,
1317
} fsemu_led_state_t;
1418

1519
struct fsemu_led_t;
@@ -31,6 +35,43 @@ fsemu_led_state_t fsemu_led_state(fsemu_led_t *led);
3135

3236
void fsemu_led_set_state(fsemu_led_t *led, fsemu_led_state_t state);
3337

38+
// Brightness in percentage
39+
40+
int fsemu_led_brightness(fsemu_led_t *led);
41+
42+
void fsemu_led_set_brightness(fsemu_led_t *led, int brightness);
43+
44+
// Check if the LED has changed since the last time this funciton was called.
45+
// Useful when rendering the LEDs.
46+
47+
bool fsemu_led_check_and_reset_changed(fsemu_led_t *led);
48+
49+
// ----------------------------------------------------------------------------
50+
// Logging
51+
// ----------------------------------------------------------------------------
52+
53+
extern int fsemu_led_log_level;
54+
55+
#define fsemu_led_log(format, ...) \
56+
FSEMU_LOG(led, "[FSE] [LED]", format, ##__VA_ARGS__)
57+
58+
#define fsemu_led_log_debug(format, ...) \
59+
FSEMU_LOG_DEBUG(led, "[FSE] [LED]", format, ##__VA_ARGS__)
60+
61+
#define fsemu_led_log_error(format, ...) \
62+
FSEMU_LOG_ERROR(led, "[FSE] [LED]", format, ##__VA_ARGS__)
63+
64+
#define fsemu_led_log_info(format, ...) \
65+
FSEMU_LOG_INFO(led, "[FSE] [LED]", format, ##__VA_ARGS__)
66+
67+
#define fsemu_led_log_trace(format, ...) \
68+
FSEMU_LOG_TRACE(led, "[FSE] [LED]", format, ##__VA_ARGS__)
69+
70+
#define fsemu_led_log_warning(format, ...) \
71+
FSEMU_LOG_WARNING(led, "[FSE] [LED]", format, ##__VA_ARGS__)
72+
73+
// ----------------------------------------------------------------------------
74+
3475
#ifdef __cplusplus
3576
}
3677
#endif

0 commit comments

Comments
 (0)