@@ -28,6 +28,7 @@ Arduino_10BASE_T1S_UDP::Arduino_10BASE_T1S_UDP()
28
28
: _udp_pcb{nullptr }
29
29
, _send_to_ip{0 ,0 ,0 ,0 }
30
30
, _send_to_port{0 }
31
+ , _rx_pkt{nullptr }
31
32
{
32
33
33
34
}
@@ -136,70 +137,83 @@ size_t Arduino_10BASE_T1S_UDP::write(const uint8_t * buffer, size_t size)
136
137
int Arduino_10BASE_T1S_UDP::parsePacket ()
137
138
{
138
139
if (_rx_pkt_list.size ())
139
- return _rx_pkt_list.front ()->totalSize ();
140
+ {
141
+ /* Discard UdpRxPacket object previously held by _rx_pkt
142
+ * and replace it with the new one.
143
+ */
144
+ _rx_pkt = _rx_pkt_list.front ();
145
+ _rx_pkt_list.pop_front ();
146
+ return _rx_pkt->totalSize ();
147
+ }
140
148
else
149
+ {
150
+ /* Otherwise ensure that _rx_pkt definitely
151
+ * does not hold any UdpRxPacket object anymore.
152
+ */
153
+ _rx_pkt.reset ();
141
154
return 0 ;
155
+ }
142
156
}
143
157
144
158
int Arduino_10BASE_T1S_UDP::available ()
145
159
{
146
- if (_rx_pkt_list. size () )
147
- return _rx_pkt_list. front () ->available ();
160
+ if (_rx_pkt )
161
+ return _rx_pkt ->available ();
148
162
else
149
163
return 0 ;
150
164
}
151
165
152
166
int Arduino_10BASE_T1S_UDP::read ()
153
167
{
154
- if (_rx_pkt_list. size () )
155
- return _rx_pkt_list. front () ->read ();
168
+ if (_rx_pkt )
169
+ return _rx_pkt ->read ();
156
170
else
157
171
return -1 ;
158
172
}
159
173
160
174
int Arduino_10BASE_T1S_UDP::read (unsigned char * buffer, size_t len)
161
175
{
162
- if (_rx_pkt_list. size () )
163
- return _rx_pkt_list. front () ->read (buffer, len);
176
+ if (_rx_pkt )
177
+ return _rx_pkt ->read (buffer, len);
164
178
else
165
179
return -1 ;
166
180
}
167
181
168
182
int Arduino_10BASE_T1S_UDP::read (char * buffer, size_t len)
169
183
{
170
- if (_rx_pkt_list. size () )
171
- return _rx_pkt_list. front () ->read (buffer, len);
184
+ if (_rx_pkt )
185
+ return _rx_pkt ->read (buffer, len);
172
186
else
173
187
return -1 ;
174
188
}
175
189
176
190
int Arduino_10BASE_T1S_UDP::peek ()
177
191
{
178
- if (_rx_pkt_list. size () )
179
- return _rx_pkt_list. front () ->peek ();
192
+ if (_rx_pkt )
193
+ return _rx_pkt ->peek ();
180
194
else
181
195
return -1 ;
182
196
}
183
197
184
198
void Arduino_10BASE_T1S_UDP::flush ()
185
199
{
186
- /* Drop packet from receive buffer . */
187
- if (_rx_pkt_list. size () )
188
- _rx_pkt_list. pop_front ();
200
+ /* Delete UdpRxPacket object held by _rx_pkt . */
201
+ if (_rx_pkt )
202
+ _rx_pkt. reset ();
189
203
}
190
204
191
205
IPAddress Arduino_10BASE_T1S_UDP::remoteIP ()
192
206
{
193
- if (_rx_pkt_list. size () )
194
- return _rx_pkt_list. front () ->remoteIP ();
207
+ if (_rx_pkt )
208
+ return _rx_pkt ->remoteIP ();
195
209
else
196
210
return IPAddress ();
197
211
}
198
212
199
213
uint16_t Arduino_10BASE_T1S_UDP::remotePort ()
200
214
{
201
- if (_rx_pkt_list. size () )
202
- return _rx_pkt_list. front () ->remotePort ();
215
+ if (_rx_pkt )
216
+ return _rx_pkt ->remotePort ();
203
217
else
204
218
return 0 ;
205
219
}
0 commit comments