1 #include "sysconfig.h"
2 #include "sysdeps.h"
3 
4 #include "uae.h"
5 #include "gui.h"
6 #include "uae/fs.h"
7 
8 amiga_led_function g_amiga_led_function = NULL;
9 struct _uae_led_data g_uae_led_data = {};
10 
od_fs_update_leds(void)11 void od_fs_update_leds(void) {
12     for (int i = 0; i < 4; i++) {
13         int track = gui_data.drive_track[i];
14         int a = 0;
15         int b = 0;
16         if (!gui_data.drive_disabled[i]) {
17             a = track / 10;
18             b = track % 10;
19             if (a == 0) {
20                 a = 10;
21             }
22             if (b == 0) {
23                 b = 10;
24             }
25         }
26         g_uae_led_data.df_t1[i] = a;
27         g_uae_led_data.df_t0[i] = b;
28     }
29     uae_callback(uae_on_update_leds, &g_uae_led_data);
30 }
31 
gui_flicker_led2(int led,int unitnum,int status)32 static void gui_flicker_led2 (int led, int unitnum, int status)
33 {
34     static int resetcounter[LED_MAX];
35     static uae_s8 gui_data_hd, gui_data_cd, gui_data_md;
36     uae_s8 old;
37     uae_s8 *p;
38 
39     if (led == LED_HD)
40             p = &gui_data_hd;
41     else if (led == LED_CD)
42             p = &gui_data_cd;
43     else if (led == LED_MD)
44             p = &gui_data_md;
45     else
46             return;
47     old = *p;
48     if (status < 0) {
49             if (old < 0) {
50                     *p = 0;
51                     gui_led (led, 0, -1);
52             }
53             return;
54     }
55     if (status == 0 && old < 0) {
56            resetcounter[led] = 0;
57             return;
58     }
59     if (status == 0) {
60             resetcounter[led]--;
61             if (resetcounter[led] > 0)
62                     return;
63     }
64     *p = status;
65     resetcounter[led] = 6;
66     if (old != *p)
67             gui_led (led, *p, -1);
68 }
69 
gui_flicker_led(int led,int unitnum,int status)70 void gui_flicker_led (int led, int unitnum, int status) {
71     if (led < 0) {
72         gui_flicker_led2 (LED_HD, 0, 0);
73         gui_flicker_led2 (LED_CD, 0, 0);
74         gui_flicker_led2 (LED_MD, 0, 0);
75     }
76     else {
77         gui_flicker_led2 (led, unitnum, status);
78     }
79 }
80 
gui_led(int led,int state,int brightness)81 void gui_led (int led, int state, int brightness)
82 {
83     //STUB("led %d state %d", led, state);
84     int out_led = -1;
85     int out_state = state;
86 
87     if (led == LED_DF0) out_led = 0;
88     else if (led == LED_DF1) out_led = 1;
89     else if (led == LED_DF2) out_led = 2;
90     else if (led == LED_DF3) out_led = 3;
91     else if (led == LED_POWER) {
92         //printf("POWER %d b %d\n", state, gui_data.powerled_brightness);
93         out_led = 8;
94     }
95     else if (led == LED_HD) out_led = 9;
96     else if (led == LED_CD) {
97         out_led = 10;
98         if (state == 0) {
99             out_state = 0;
100         }
101         else if (state == 4) {
102             out_state = 2;
103         }
104         else {
105             out_state = 1;
106         }
107     }
108     else if (led == LED_MD) out_led = 11;
109 
110     if (led >= LED_DF0 && led <= LED_DF3) {
111         if (gui_data.drive_writing[led - 1]) {
112             out_state = 2;
113         }
114     }
115 
116     if (g_amiga_led_function && out_led > -1) {
117         g_amiga_led_function(out_led, out_state);
118     }
119 }
120 
121 extern "C" {
122 
amiga_on_update_leds(amiga_callback_function * function)123 void amiga_on_update_leds(amiga_callback_function *function) {
124     uae_on_update_leds = function;
125 }
126 
amiga_set_led_function(amiga_led_function function)127 void amiga_set_led_function(amiga_led_function function) {
128     g_amiga_led_function = function;
129 }
130 
131 } // extern "C"
132