33
33
#include "esp_now.h"
34
34
#include "esp_wifi.h"
35
35
36
+ #include "freertos/queue.h"
37
+
36
38
#include "py/runtime.h"
37
39
#include "py/mphal.h"
38
40
#include "py/nlr.h"
@@ -79,37 +81,44 @@ static inline void _get_bytes(mp_obj_t str, size_t len, uint8_t *dst) {
79
81
80
82
// this is crap of course but lets try it
81
83
82
- static int recv_buf_len = 0 ;
83
- uint8_t recv_mac [6 ];
84
- static uint8_t recv_buffer [250 ];
84
+ typedef struct {
85
+ uint8_t macaddr [ESP_NOW_ETH_ALEN ];
86
+ uint16_t len ;
87
+ uint8_t data [ESP_NOW_MAX_DATA_LEN ];
88
+ } esp_now_queue_t ;
89
+
90
+ QueueHandle_t esp_now_queue ;
85
91
86
92
STATIC mp_obj_t espnow_recv () {
87
- if (recv_buf_len < 1 ) return mp_const_none ;
93
+ static esp_now_queue_t queue_item = { 0 };
94
+ int r = xQueueReceive (esp_now_queue , & queue_item , 0 );
95
+ if (r != pdTRUE ) return mp_const_none ;
88
96
mp_obj_tuple_t * msg = mp_obj_new_tuple (2 , NULL );
89
- msg -> items [0 ] = mp_obj_new_bytes (recv_mac , sizeof (recv_mac ));
90
- msg -> items [1 ] = mp_obj_new_bytes (recv_buffer , recv_buf_len );
91
- recv_buf_len = 0 ;
97
+ msg -> items [0 ] = mp_obj_new_bytes (queue_item .macaddr , ESP_NOW_ETH_ALEN );
98
+ msg -> items [1 ] = mp_obj_new_bytes (queue_item .data , queue_item .len );
92
99
return msg ;
93
100
}
94
101
95
102
MP_DEFINE_CONST_FUN_OBJ_0 (espnow_recv_obj , espnow_recv );
96
103
97
- void simple_cb (const uint8_t * macaddr , const uint8_t * data , int len )
104
+ void recv_cb (const uint8_t * macaddr , const uint8_t * data , int len )
98
105
{
99
- if (len < sizeof (recv_buffer )) {
100
- memcpy (recv_buffer , data , len );
101
- memcpy (recv_mac , macaddr , 6 );
102
- recv_buf_len = len ;
103
- }
106
+ // this is double copying, perhaps I should be just queueing the pointers
107
+ static esp_now_queue_t queue_item = { 0 };
108
+ queue_item .len = len ;
109
+ memcpy (queue_item .macaddr , macaddr , ESP_NOW_ETH_ALEN );
110
+ memcpy (queue_item .data , data , len );
111
+ xQueueSend (esp_now_queue , & queue_item , 0 );
104
112
}
105
113
106
114
static int initialized = 0 ;
107
115
108
116
STATIC mp_obj_t espnow_init () {
109
117
if (!initialized ) {
110
118
esp_now_init ();
119
+ esp_now_queue = xQueueCreate (5 , sizeof (esp_now_queue_t ));
111
120
initialized = 1 ;
112
- esp_now_register_recv_cb (simple_cb );
121
+ esp_now_register_recv_cb (recv_cb );
113
122
}
114
123
return mp_const_none ;
115
124
}
@@ -118,31 +127,34 @@ MP_DEFINE_CONST_FUN_OBJ_0(espnow_init_obj, espnow_init);
118
127
STATIC mp_obj_t espnow_deinit () {
119
128
if (initialized ) {
120
129
esp_now_deinit ();
130
+ vQueueDelete (esp_now_queue );
121
131
initialized = 0 ;
122
132
}
123
133
return mp_const_none ;
124
134
}
125
135
MP_DEFINE_CONST_FUN_OBJ_0 (espnow_deinit_obj , espnow_deinit );
126
136
127
137
STATIC mp_obj_t espnow_set_pmk (mp_obj_t pmk ) {
128
- uint8_t buf [ESP_NOW_ETH_ALEN ];
129
- _get_bytes (pmk , ESP_NOW_ETH_ALEN , buf );
138
+ uint8_t buf [ESP_NOW_KEY_LEN ];
139
+ _get_bytes (pmk , ESP_NOW_KEY_LEN , buf );
130
140
esp_espnow_exceptions (esp_now_set_pmk (buf ));
131
141
return mp_const_none ;
132
142
}
133
143
MP_DEFINE_CONST_FUN_OBJ_1 (espnow_set_pmk_obj , espnow_set_pmk );
134
144
135
145
STATIC mp_obj_t espnow_add_peer (size_t n_args , const mp_obj_t * args ) {
136
146
esp_now_peer_info_t peer = {0 };
147
+ // leaving channel as 0 for autodetect
137
148
peer .ifidx = ((wlan_if_obj_t * )MP_OBJ_TO_PTR (args [0 ]))-> if_id ;
138
149
_get_bytes (args [1 ], ESP_NOW_ETH_ALEN , peer .peer_addr );
139
- _get_bytes (args [2 ], ESP_NOW_KEY_LEN , peer .lmk );
140
- peer .encrypt = (n_args > 3 && mp_obj_is_true (args [3 ])) ? 1 : 0 ;
141
- // leaving channel as 0 for autodetect
150
+ if (n_args > 2 ) {
151
+ _get_bytes (args [2 ], ESP_NOW_KEY_LEN , peer .lmk );
152
+ peer .encrypt = 1 ;
153
+ }
142
154
esp_espnow_exceptions (esp_now_add_peer (& peer ));
143
155
return mp_const_none ;
144
156
}
145
- MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (espnow_add_peer_obj , 3 , 4 , espnow_add_peer );
157
+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (espnow_add_peer_obj , 2 , 3 , espnow_add_peer );
146
158
147
159
STATIC mp_obj_t espnow_send (mp_obj_t addr , mp_obj_t msg ) {
148
160
mp_uint_t len1 ;
0 commit comments