16
16
17
17
#include <sys/wait.h>
18
18
19
+ #include "common/queue.h"
20
+
19
21
#include "mgos_debug_internal.h"
20
22
#include "mgos_init_internal.h"
21
23
#include "mgos_mongoose.h"
@@ -34,9 +36,22 @@ struct ubuntu_flags Flags;
34
36
static bool mongoose_running = false;
35
37
static pid_t s_parent , s_child ;
36
38
39
+ struct cb_info {
40
+ void (* cb )(void * arg );
41
+ void * cb_arg ;
42
+ STAILQ_ENTRY (cb_info ) next ;
43
+ };
44
+
45
+ STAILQ_HEAD (s_cbs , cb_info ) s_cbs = STAILQ_HEAD_INITIALIZER (s_cbs );
46
+ struct mgos_rlock_type * s_cbs_lock = NULL ;
47
+ struct mgos_rlock_type * s_mgos_lock = NULL ;
48
+
37
49
static int ubuntu_mongoose (void ) {
38
50
enum mgos_init_result r ;
39
51
52
+ s_cbs_lock = mgos_rlock_create ();
53
+ s_mgos_lock = mgos_rlock_create ();
54
+
40
55
ubuntu_set_boottime ();
41
56
ubuntu_set_nsleep100 ();
42
57
if (!ubuntu_cap_init ()) {
@@ -51,11 +66,33 @@ static int ubuntu_mongoose(void) {
51
66
}
52
67
mongoose_running = true;
53
68
while (mongoose_running ) {
54
- mongoose_poll (1000 );
69
+ mgos_rlock (s_cbs_lock );
70
+ while (!STAILQ_EMPTY (& s_cbs )) {
71
+ struct cb_info * cbi = STAILQ_FIRST (& s_cbs );
72
+ STAILQ_REMOVE_HEAD (& s_cbs , next );
73
+ mgos_runlock (s_cbs_lock );
74
+ cbi -> cb (cbi -> cb_arg );
75
+ free (cbi );
76
+ mgos_rlock (s_cbs_lock );
77
+ }
78
+ mgos_runlock (s_cbs_lock );
79
+ mongoose_poll (1 );
55
80
}
56
81
return 0 ;
57
82
}
58
83
84
+ bool mgos_invoke_cb (mgos_cb_t cb , void * arg , bool from_isr ) {
85
+ struct cb_info * cbi = (struct cb_info * ) calloc (1 , sizeof (* cbi ));
86
+ if (cbi == NULL ) return false;
87
+ cbi -> cb = cb ;
88
+ cbi -> cb_arg = arg ;
89
+ mgos_rlock (s_cbs_lock );
90
+ STAILQ_INSERT_TAIL (& s_cbs , cbi , next );
91
+ mgos_runlock (s_cbs_lock );
92
+ (void ) from_isr ;
93
+ return true;
94
+ }
95
+
59
96
static int ubuntu_main (void ) {
60
97
for (;;) {
61
98
int wstatus ;
@@ -126,12 +163,33 @@ void mongoose_schedule_poll(bool from_isr) {
126
163
(void ) from_isr ;
127
164
}
128
165
166
+ static void ubuntu_net_up (void * arg ) {
167
+ struct mgos_net_ip_info ipaddr ;
168
+ char ip [INET_ADDRSTRLEN ], netmask [INET_ADDRSTRLEN ], gateway [INET_ADDRSTRLEN ];
169
+ mgos_eth_dev_get_ip_info (0 , & ipaddr );
170
+ inet_ntop (AF_INET , (void * ) & ipaddr .gw .sin_addr , gateway , INET_ADDRSTRLEN );
171
+ inet_ntop (AF_INET , (void * ) & ipaddr .ip .sin_addr , ip , INET_ADDRSTRLEN );
172
+ inet_ntop (AF_INET , (void * ) & ipaddr .netmask .sin_addr , netmask ,
173
+ INET_ADDRSTRLEN );
174
+ LOG (LL_INFO , ("Network: ip=%s netmask=%s gateway=%s" , ip , netmask , gateway ));
175
+ mgos_event_trigger (MGOS_NET_EV_CONNECTING , NULL );
176
+ mgos_event_trigger (MGOS_NET_EV_CONNECTED , NULL );
177
+ mgos_event_trigger (MGOS_NET_EV_IP_ACQUIRED , NULL );
178
+ (void ) arg ;
179
+ }
180
+
181
+ void mgos_lock (void ) {
182
+ mgos_rlock (s_mgos_lock );
183
+ }
184
+
185
+ void mgos_unlock (void ) {
186
+ mgos_runlock (s_mgos_lock );
187
+ }
188
+
129
189
enum mgos_init_result mongoose_init (void ) {
130
190
enum mgos_init_result r ;
131
191
int cpu_freq ;
132
192
size_t heap_size , free_heap_size ;
133
- struct mgos_net_ip_info ipaddr ;
134
- char ip [INET_ADDRSTRLEN ], netmask [INET_ADDRSTRLEN ], gateway [INET_ADDRSTRLEN ];
135
193
136
194
r = mgos_uart_init ();
137
195
if (r != MGOS_INIT_OK ) {
@@ -165,12 +223,7 @@ enum mgos_init_result mongoose_init(void) {
165
223
LOG (LL_INFO , ("CPU: %d MHz, heap: %lu total, %lu free" , cpu_freq , heap_size ,
166
224
free_heap_size ));
167
225
168
- mgos_eth_dev_get_ip_info (0 , & ipaddr );
169
- inet_ntop (AF_INET , (void * ) & ipaddr .gw .sin_addr , gateway , INET_ADDRSTRLEN );
170
- inet_ntop (AF_INET , (void * ) & ipaddr .ip .sin_addr , ip , INET_ADDRSTRLEN );
171
- inet_ntop (AF_INET , (void * ) & ipaddr .netmask .sin_addr , netmask ,
172
- INET_ADDRSTRLEN );
173
- LOG (LL_INFO , ("Network: ip=%s netmask=%s gateway=%s" , ip , netmask , gateway ));
226
+ mgos_invoke_cb (ubuntu_net_up , NULL , false /* from_isr */ );
174
227
175
228
return mgos_init ();
176
229
}
0 commit comments