@@ -32,7 +32,34 @@ const unsigned char key[] = "-----BEGIN PRIVATE KEY-----\n" CONFIG_ESP_WIFI_REMO
32
32
33
33
using namespace server ;
34
34
35
+ class Sync {
36
+ friend class RpcInstance ;
37
+ public:
38
+ void lock ()
39
+ {
40
+ xSemaphoreTake (mutex, portMAX_DELAY);
41
+ }
42
+ void unlock ()
43
+ {
44
+ xSemaphoreGive (mutex);
45
+ }
46
+ esp_err_t init ()
47
+ {
48
+ mutex = xSemaphoreCreateMutex ();
49
+ return mutex == nullptr ? ESP_ERR_NO_MEM : ESP_OK;
50
+ }
51
+ ~Sync ()
52
+ {
53
+ if (mutex) {
54
+ vSemaphoreDelete (mutex);
55
+ }
56
+ }
57
+ private:
58
+ SemaphoreHandle_t mutex{nullptr };
59
+ };
60
+
35
61
class RpcInstance {
62
+ friend class Sync ;
36
63
public:
37
64
RpcEngine rpc{role::SERVER};
38
65
int sock{-1 };
@@ -43,11 +70,12 @@ class RpcInstance {
43
70
ESP_RETURN_ON_ERROR (start_server (), TAG, " Failed to start RPC server" );
44
71
ESP_RETURN_ON_ERROR (rpc.init (), TAG, " Failed to init RPC engine" );
45
72
ESP_RETURN_ON_ERROR (esp_netif_napt_enable (netif), TAG, " Failed to enable NAPT" );
73
+ ESP_RETURN_ON_ERROR (sync.init (), TAG, " Failed to init locks" );
46
74
ESP_RETURN_ON_ERROR (esp_event_handler_register (WIFI_EVENT, ESP_EVENT_ANY_ID, handler, this ), TAG, " Failed to register event" );
47
75
ESP_RETURN_ON_ERROR (esp_event_handler_register (IP_EVENT, ESP_EVENT_ANY_ID, handler, this ), TAG, " Failed to register event" );
48
76
return xTaskCreate (task, " server" , 8192 , this , 5 , nullptr ) == pdTRUE ? ESP_OK : ESP_FAIL;
49
77
}
50
-
78
+ Sync sync;
51
79
private:
52
80
esp_netif_t *netif{nullptr };
53
81
static void task (void *ctx)
@@ -81,6 +109,7 @@ class RpcInstance {
81
109
esp_err_t wifi_event (int32_t id)
82
110
{
83
111
ESP_LOGI (TAG, " Received WIFI event %" PRIi32, id);
112
+ std::lock_guard<Sync> lock (sync);
84
113
ESP_RETURN_ON_ERROR (rpc.send (api_id::WIFI_EVENT, &id), TAG, " Failed to marshall WiFi event" );
85
114
return ESP_OK;
86
115
}
@@ -97,6 +126,7 @@ class RpcInstance {
97
126
ESP_RETURN_ON_ERROR (esp_netif_get_ip_info (netif, &ip_event.ppp_ip ), TAG, " Failed to get IP info" );
98
127
ESP_LOGI (TAG, " IP address:" IPSTR, IP2STR (&ip_data->ip_info .ip ));
99
128
}
129
+ std::lock_guard<Sync> lock (sync);
100
130
ESP_RETURN_ON_ERROR (rpc.send (api_id::IP_EVENT, &ip_event), TAG, " Failed to marshal IP event" );
101
131
return ESP_OK;
102
132
}
@@ -114,7 +144,7 @@ class RpcInstance {
114
144
{
115
145
auto header = rpc.get_header ();
116
146
ESP_LOGI (TAG, " Received header id %d" , (int ) header.id );
117
-
147
+ std::lock_guard<Sync> lock (sync);
118
148
switch (header.id ) {
119
149
case api_id::SET_MODE: {
120
150
auto req = rpc.get_payload <wifi_mode_t >(api_id::SET_MODE, header);
0 commit comments