14
14
#include "esp_check.h"
15
15
#include "nvs_flash.h"
16
16
#include "eppp_link.h"
17
+ #include "esp_private/wifi.h"
17
18
18
19
static const char * TAG = "eppp_slave" ;
19
20
@@ -27,14 +28,20 @@ static EventGroupHandle_t s_wifi_event_group;
27
28
* - we failed to connect after the maximum amount of retries */
28
29
#define WIFI_CONNECTED_BIT BIT0
29
30
#define WIFI_FAIL_BIT BIT1
31
+ //---------------------------------------
32
+ #define WIFI_CONNECTED BIT2
30
33
31
34
32
35
static int s_retry_num = 0 ;
36
+ static EventGroupHandle_t s_events ;
33
37
34
38
static void event_handler (void * arg , esp_event_base_t event_base , int32_t event_id , void * event_data )
35
39
{
40
+ ESP_LOGI (TAG , "event_handler: event_base=%s event_id=%d" , event_base , event_id );
36
41
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START ) {
42
+ ESP_LOGI (TAG , "WIFI start event" );
37
43
esp_wifi_connect ();
44
+ xEventGroupSetBits (s_events , WIFI_CONNECTED );
38
45
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED ) {
39
46
if (s_retry_num < CONFIG_ESP_MAXIMUM_RETRY ) {
40
47
esp_wifi_connect ();
@@ -56,7 +63,7 @@ void init_network_interface(void)
56
63
{
57
64
s_wifi_event_group = xEventGroupCreate ();
58
65
59
- esp_netif_create_default_wifi_sta ();
66
+ // esp_netif_create_default_wifi_sta();
60
67
61
68
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT ();
62
69
ESP_ERROR_CHECK (esp_wifi_init (& cfg ));
@@ -82,9 +89,10 @@ void init_network_interface(void)
82
89
};
83
90
ESP_ERROR_CHECK (esp_wifi_set_mode (WIFI_MODE_STA ));
84
91
ESP_ERROR_CHECK (esp_wifi_set_config (WIFI_IF_STA , & wifi_config ));
85
- ESP_ERROR_CHECK (esp_wifi_start ());
92
+ // ESP_ERROR_CHECK(esp_wifi_start());
86
93
87
94
ESP_LOGI (TAG , "wifi_init_sta finished." );
95
+ return ;
88
96
89
97
/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
90
98
* number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
@@ -116,23 +124,111 @@ void init_network_interface(void)
116
124
#endif // SoC WiFi capable chip
117
125
118
126
#ifdef CONFIG_EPPP_LINK_CHANNELS_SUPPORT
127
+ #define HELLO_RECEIVED BIT0
128
+ #define MAC_REQUEST BIT1
129
+
130
+ typedef enum {
131
+ UNKNOWN ,
132
+ HELLO ,
133
+ START ,
134
+ CONNECTED ,
135
+ DISCONNECTED ,
136
+ ERROR ,
137
+ } state_t ;
138
+ static state_t s_state = UNKNOWN ;
139
+ static eppp_channel_fn_t s_transmit = {NULL };
140
+ static esp_netif_t * s_eppp_netif = NULL ;
141
+
119
142
static esp_err_t recv (esp_netif_t * netif , int nr , void * buffer , size_t len )
120
143
{
121
- char data [32 ];
122
- if (len < sizeof (data )) {
123
- memcpy (data , buffer , len );
124
- printf ("Received [%d] %*s\n" , (int )len , (int )len , data );
125
- return ESP_OK ;
144
+ if (nr == 1 ) {
145
+ printf ("Received channel=%d len=%d %.*s\n" , nr , (int )len , (int )len , (char * )buffer );
146
+ if (s_state == HELLO ) {
147
+ const char hello [] = "Hello server" ;
148
+ const char mac [] = "Get MAC" ;
149
+ if (len == sizeof (hello ) && memcmp (buffer , hello , len ) == 0 ) {
150
+ xEventGroupSetBits (s_events , HELLO_RECEIVED );
151
+ } else if (len == sizeof (mac ) && memcmp (buffer , mac , sizeof (mac )) == 0 ) {
152
+ xEventGroupSetBits (s_events , MAC_REQUEST );
153
+ }
154
+ }
155
+ } else if (nr == 2 ) {
156
+ printf ("Received WIFI channel=%d len=%d\n" , nr , (int )len );
157
+ return esp_wifi_internal_tx (WIFI_IF_STA , buffer , len );
158
+ }
159
+ return ESP_OK ;
160
+ }
161
+
162
+
163
+ static esp_err_t wifi_receive (void * buffer , uint16_t len , void * eb )
164
+ {
165
+ s_transmit (s_eppp_netif , 2 , buffer , len );
166
+ esp_wifi_internal_free_rx_buffer (eb );
167
+ return ESP_OK ;
168
+ }
169
+
170
+
171
+ static void task_transmit (void * arg )
172
+ {
173
+ int counter = 0 ;
174
+ esp_netif_t * eppp_netif = (esp_netif_t * )arg ;
175
+ while (1 ) {
176
+ EventBits_t bits = xEventGroupWaitBits (s_events ,
177
+ HELLO_RECEIVED | MAC_REQUEST | WIFI_CONNECTED ,
178
+ pdTRUE ,
179
+ pdFALSE ,
180
+ pdMS_TO_TICKS (1000 ));
181
+ // if (bits & HELLO_SERVER) {
182
+ // const char hello[] = "Hello server";
183
+ // s_transmit(eppp_netif, 1, hello, sizeof(hello));
184
+ // } else
185
+ if (bits & HELLO_RECEIVED ) {
186
+ const char hello [] = "Hello client" ;
187
+ s_transmit (eppp_netif , 1 , (void * )hello , sizeof (hello ));
188
+ // s_state = CONNECTED;
189
+ } else if (bits & MAC_REQUEST ) {
190
+ uint8_t mac [6 ];
191
+ esp_err_t ret ;
192
+
193
+ if ((ret = esp_wifi_get_mac (WIFI_IF_STA , mac )) != ESP_OK ) {
194
+ ESP_LOGE (TAG , "esp_wifi_get_mac failed with %d" , ret );
195
+ s_state = ERROR ;
196
+ continue ;
197
+ }
198
+ char mac_data [5 /* MAC: */ + 6 * 2 /* 6 bytes per char */ + 5 /* : */ + 1 /* \0 */ ];
199
+ sprintf (mac_data , "MAC: %02x:%02x:%02x:%02x:%02x:%02x" , mac [0 ], mac [1 ], mac [2 ], mac [3 ], mac [4 ], mac [5 ]);
200
+ ESP_LOGI (TAG , "Sending MAC: %.*s" , (int )sizeof (mac_data ), mac_data );
201
+ s_transmit (eppp_netif , 1 , (void * )mac_data , sizeof (mac_data ));
202
+ s_state = START ;
203
+ ret = esp_wifi_start ();
204
+ ESP_LOGI (TAG , "WIFI start result: %d" , ret );
205
+ esp_wifi_internal_reg_rxcb (WIFI_IF_STA , wifi_receive );
206
+ } else if (bits & WIFI_CONNECTED ) {
207
+ ESP_LOGI (TAG , "WIFI connected" );
208
+ const char connected [] = "Connected" ;
209
+ s_transmit (eppp_netif , 1 , (void * )connected , sizeof (connected ));
210
+ } else {
211
+ s_state = HELLO ;
212
+ printf ("Do nothing\n" );
213
+ // const char hello[] = "Hello server";
214
+ // s_transmit(eppp_netif, 1, (void*)hello, sizeof(hello));
215
+ // s_state = HELLO;
216
+ }
217
+ }
218
+
219
+ while (1 ) {
220
+
221
+ char data [32 ];
222
+ sprintf (data , "Message from host #%d" , counter ++ );
223
+ s_transmit (eppp_netif , 1 , data , strlen (data ));
224
+ vTaskDelay (1000 / portTICK_PERIOD_MS );
126
225
}
127
- return ESP_ERR_INVALID_SIZE ;
128
226
}
227
+
129
228
#endif // CONFIG_EPPP_LINK_CHANNELS_SUPPORT
130
229
131
230
void app_main (void )
132
231
{
133
- #ifdef CONFIG_EPPP_LINK_CHANNELS_SUPPORT
134
- static eppp_channel_fn_t transmit = NULL ;
135
- #endif // CONFIG_EPPP_LINK_CHANNELS_SUPPORT
136
232
//Initialize NVS
137
233
esp_err_t ret = nvs_flash_init ();
138
234
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND ) {
@@ -165,21 +261,16 @@ void app_main(void)
165
261
config .transport = EPPP_TRANSPORT_SDIO ;
166
262
#endif // transport device
167
263
168
- esp_netif_t * eppp_netif = eppp_listen (& config );
169
- if (eppp_netif == NULL ) {
264
+ s_eppp_netif = eppp_listen (& config );
265
+ if (s_eppp_netif == NULL ) {
170
266
ESP_LOGE (TAG , "Failed to setup connection" );
171
267
return ;
172
268
}
173
- ESP_ERROR_CHECK (esp_netif_napt_enable (eppp_netif ));
269
+ // ESP_ERROR_CHECK(esp_netif_napt_enable(eppp_netif));
174
270
#ifdef CONFIG_EPPP_LINK_CHANNELS_SUPPORT
175
- ESP_RETURN_ON_FALSE (eppp_add_channels (eppp_netif , 1 , & transmit , recv ) == ESP_OK ,, TAG , "Failed to add channels" );
176
- ESP_RETURN_ON_FALSE (transmit ,, TAG , "Channel tx function is not set" );
177
- int counter = 0 ;
178
- while (1 ) {
179
- char data [32 ];
180
- sprintf (data , "Message from slave #%d" , counter ++ );
181
- transmit (eppp_netif , 1 , data , strlen (data ));
182
- vTaskDelay (1000 / portTICK_PERIOD_MS );
183
- }
271
+ ESP_RETURN_ON_FALSE (s_events = xEventGroupCreate (),, TAG , "Failed to create event group" );
272
+ ESP_RETURN_ON_FALSE (eppp_add_channels (s_eppp_netif , 1 , & s_transmit , recv ) == ESP_OK ,, TAG , "Failed to add channels" );
273
+ ESP_RETURN_ON_FALSE (s_transmit ,, TAG , "Channel tx function is not set" );
274
+ xTaskCreate (task_transmit , "task_transmit" , 2048 , s_eppp_netif , 5 , NULL );
184
275
#endif // CONFIG_EPPP_LINK_CHANNELS_SUPPORT
185
276
}
0 commit comments