Skip to content

Commit b985fda

Browse files
committed
[amnb] Split update() into separate transmit/receive threads
1 parent 20fba99 commit b985fda

File tree

3 files changed

+50
-54
lines changed

3 files changed

+50
-54
lines changed

examples/nucleo_g071rb/amnb/main.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,12 @@ main()
137137

138138
while (true)
139139
{
140-
node1.update();
141-
node2.update();
142-
node3.update();
140+
node1.update_transmit();
141+
node1.update_receive();
142+
node2.update_transmit();
143+
node2.update_receive();
144+
node3.update_transmit();
145+
node3.update_receive();
143146
thread.update();
144147
}
145148

src/modm/communication/amnb/node.hpp

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -125,16 +125,8 @@ class Node : public modm::Resumable<6>
125125
}
126126

127127
public:
128-
void
129-
update()
130-
{
131-
transmit();
132-
receive();
133-
}
134-
135-
protected:
136128
modm::ResumableResult<void>
137-
transmit()
129+
update_transmit()
138130
{
139131
RF_BEGIN(2);
140132
while(1)
@@ -150,6 +142,30 @@ class Node : public modm::Resumable<6>
150142
RF_END();
151143
}
152144

145+
modm::ResumableResult<void>
146+
update_receive()
147+
{
148+
RF_BEGIN(5);
149+
while(1)
150+
{
151+
rx_msg.deallocate(); // deallocates previous message
152+
if (RF_CALL(interface.receiveHeader(&rx_msg)) == InterfaceStatus::Ok)
153+
{
154+
// Check lists if we are interested in this message
155+
is_rx_msg_for_us = handleRxMessage(false);
156+
// Receive the message data, only allocate if it's for us
157+
if (RF_CALL(interface.receiveData(&rx_msg, is_rx_msg_for_us)) == InterfaceStatus::Ok)
158+
{
159+
// Only handle message *with* data if it's for us
160+
if (is_rx_msg_for_us) handleRxMessage(true);
161+
}
162+
}
163+
RF_YIELD();
164+
}
165+
RF_END();
166+
}
167+
168+
protected:
153169
modm::ResumableResult<void>
154170
send(Message &msg)
155171
{
@@ -200,29 +216,6 @@ class Node : public modm::Resumable<6>
200216
RF_END();
201217
}
202218

203-
modm::ResumableResult<void>
204-
receive()
205-
{
206-
RF_BEGIN(5);
207-
while(1)
208-
{
209-
rx_msg.deallocate(); // deallocates previous message
210-
if (RF_CALL(interface.receiveHeader(&rx_msg)) == InterfaceStatus::Ok)
211-
{
212-
// Check lists if we are interested in this message
213-
is_rx_msg_for_us = handleRxMessage(false);
214-
// Receive the message data, only allocate if it's for us
215-
if (RF_CALL(interface.receiveData(&rx_msg, is_rx_msg_for_us)) == InterfaceStatus::Ok)
216-
{
217-
// Only handle message *with* data if it's for us
218-
if (is_rx_msg_for_us) handleRxMessage(true);
219-
}
220-
}
221-
RF_YIELD();
222-
}
223-
RF_END();
224-
}
225-
226219
protected:
227220
bool
228221
handleRxMessage(bool complete)

test/modm/communication/amnb/node_test.cpp

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ AmnbNodeTest::testBroadcast()
3636
{
3737
node.broadcast(0x10);
3838
node.broadcast(0x20, uint32_t(0x03020100));
39-
node.update(); node.update();
39+
node.update_transmit(); node.update_receive(); node.update_transmit(); node.update_receive();
4040
const uint8_t raw[] = {0x7E, 0x7E, 84, 0x08, 0x10, 0, 0x7E, 0x7E, 58, 0x08, 0x20, 4, 0, 1, 2, 3};
4141
TEST_ASSERT_EQUALS(SharedMedium::raw_transmitted.size(), sizeof(raw));
4242
TEST_ASSERT_EQUALS_ARRAY(SharedMedium::transmitted, raw, sizeof(raw));
@@ -46,7 +46,7 @@ AmnbNodeTest::testBroadcast()
4646
SharedMedium::fail_tx_index = 2;
4747
{
4848
node.broadcast(0x70);
49-
for(uint32_t ii=0; ii < 20000; ii += 10) { node.update(); micro_clock::setTime(ii); }
49+
for(uint32_t ii=0; ii < 20000; ii += 10) { node.update_transmit(); node.update_receive(); micro_clock::setTime(ii); }
5050
// first transmission attempt fails
5151
const uint8_t raw[] = {0x7E, 0x7E, 110, 0x7E, 0x7E, 110, 0x08, 0x70, 0};
5252
TEST_ASSERT_EQUALS(SharedMedium::raw_transmitted.size(), sizeof(raw));
@@ -65,7 +65,7 @@ AmnbNodeTest::testRequest()
6565
micro_clock::setTime(0); milli_clock::setTime(0);
6666
modm::ResumableResult< Result<> > res{0};
6767
for(uint32_t ii=0; (res = node.request(0x10, 0x80)).getState() == modm::rf::Running; ii += 10)
68-
{ micro_clock::setTime(ii); milli_clock::setTime(ii/1000); node.update(); }
68+
{ micro_clock::setTime(ii); milli_clock::setTime(ii/1000); node.update_transmit(); node.update_receive(); }
6969

7070
TEST_ASSERT_EQUALS(res.getResult().error(), Error::RequestTimeout);
7171
TEST_ASSERT_FALSE(bool(res.getResult()));
@@ -79,7 +79,7 @@ AmnbNodeTest::testRequest()
7979
micro_clock::setTime(0); milli_clock::setTime(0);
8080
modm::ResumableResult< Result<> > res{0};
8181
for(uint32_t ii=0; (res = node.request(0x10, 0x80)).getState() == modm::rf::Running; ii += 10)
82-
{ micro_clock::setTime(ii); milli_clock::setTime(ii/1000); node.update(); }
82+
{ micro_clock::setTime(ii); milli_clock::setTime(ii/1000); node.update_transmit(); node.update_receive(); }
8383

8484
TEST_ASSERT_EQUALS(res.getResult().error(), Error::ResponseAllocationFailed);
8585
TEST_ASSERT_FALSE(bool(res.getResult()));
@@ -94,7 +94,7 @@ AmnbNodeTest::testRequest()
9494
micro_clock::setTime(0); milli_clock::setTime(0);
9595
modm::ResumableResult< Result<uint8_t, uint8_t> > res{0};
9696
for(uint32_t ii=0; (res = node.request<uint8_t, uint8_t>(0x10, 0x80, uint8_t(0x10))).getState() == modm::rf::Running; ii += 10)
97-
{ micro_clock::setTime(ii); milli_clock::setTime(ii/1000); node.update(); }
97+
{ micro_clock::setTime(ii); milli_clock::setTime(ii/1000); node.update_transmit(); node.update_receive(); }
9898

9999
TEST_ASSERT_EQUALS(res.getResult().error(), Error::UserError);
100100
TEST_ASSERT_FALSE(bool(res.getResult()));
@@ -116,7 +116,7 @@ AmnbNodeTest::testRequest()
116116
for(uint32_t ii=0;
117117
(res = node.request<uint32_t>(0x10, 0x80, uint32_t(0x03020100))).getState() == modm::rf::Running;
118118
ii += 10)
119-
{ micro_clock::setTime(ii); milli_clock::setTime(ii/1000); node.update(); }
119+
{ micro_clock::setTime(ii); milli_clock::setTime(ii/1000); node.update_transmit(); node.update_receive(); }
120120

121121
TEST_ASSERT_EQUALS(res.getResult().error(), Error::Ok);
122122
TEST_ASSERT_TRUE(bool(res.getResult()));
@@ -177,7 +177,7 @@ AmnbNodeTest::testAction()
177177
SharedMedium::reset();
178178
SharedMedium::add_rx({0x7E, 0x7E, 104, 8, 1, 68, 0, 1, 2, 3});
179179
{
180-
node.update(); node.update();
180+
node.update_transmit(); node.update_receive(); node.update_transmit(); node.update_receive();
181181
TEST_ASSERT_EQUALS(trig, 0);
182182
const uint8_t raw[] = {0x7E, 0x7E, 237, 8, 1, 97, 2};
183183
TEST_ASSERT_EQUALS(SharedMedium::transmitted.size(), sizeof(raw));
@@ -188,7 +188,7 @@ AmnbNodeTest::testAction()
188188
SharedMedium::reset();
189189
SharedMedium::add_rx({0x7E, 0x7E, 163, 8, 10, 64});
190190
{
191-
node.update(); node.update();
191+
node.update_transmit(); node.update_receive(); node.update_transmit(); node.update_receive();
192192
TEST_ASSERT_EQUALS(trig, 0);
193193
const uint8_t raw[] = {0x7E, 0x7E, 76, 8, 10, 129, 3};
194194
TEST_ASSERT_EQUALS(SharedMedium::transmitted.size(), sizeof(raw));
@@ -200,7 +200,7 @@ AmnbNodeTest::testAction()
200200
SharedMedium::reset();
201201
SharedMedium::add_rx({0x7E, 0x7E, 227, 8, 1, 64});
202202
{
203-
node.update(); node.update();
203+
node.update_transmit(); node.update_receive(); node.update_transmit(); node.update_receive();
204204
TEST_ASSERT_EQUALS(trig, 1);
205205
TEST_ASSERT_EQUALS(count, 11);
206206
const uint8_t raw[] = {0x7E, 0x7E, 42, 8, 1, 96};
@@ -212,7 +212,7 @@ AmnbNodeTest::testAction()
212212
SharedMedium::reset();
213213
SharedMedium::add_rx({0x7E, 0x7E, 141, 8, 2, 68, 0, 1, 2, 3});
214214
{
215-
node.update(); node.update();
215+
node.update_transmit(); node.update_receive(); node.update_transmit(); node.update_receive();
216216
TEST_ASSERT_EQUALS(trig, 2);
217217
TEST_ASSERT_EQUALS(count, 11+21);
218218
const uint8_t raw[] = {0x7E, 0x7E, 209, 8, 2, 96};
@@ -224,7 +224,7 @@ AmnbNodeTest::testAction()
224224
SharedMedium::reset();
225225
SharedMedium::add_rx({0x7E, 0x7E, 46, 8, 3, 68, 0, 1, 2, 3});
226226
{
227-
node.update(); node.update();
227+
node.update_transmit(); node.update_receive(); node.update_transmit(); node.update_receive();
228228
TEST_ASSERT_EQUALS(trig, 4);
229229
const uint8_t raw[] = {0x7E, 0x7E, 84, 8, 3, 100, 4, 5, 6, 7};
230230
TEST_ASSERT_EQUALS(SharedMedium::transmitted.size(), sizeof(raw));
@@ -235,7 +235,7 @@ AmnbNodeTest::testAction()
235235
SharedMedium::reset();
236236
SharedMedium::add_rx({0x7E, 0x7E, 233, 8, 4, 64});
237237
{
238-
node.update(); node.update();
238+
node.update_transmit(); node.update_receive(); node.update_transmit(); node.update_receive();
239239
TEST_ASSERT_EQUALS(trig, 8);
240240
const uint8_t raw[] = {0x7E, 0x7E, 94, 8, 4, 161, 3};
241241
TEST_ASSERT_EQUALS(SharedMedium::transmitted.size(), sizeof(raw));
@@ -246,7 +246,7 @@ AmnbNodeTest::testAction()
246246
SharedMedium::reset();
247247
SharedMedium::add_rx({0x7E, 0x7E, 227, 8, 5, 68, 0, 1, 2, 3});
248248
{
249-
node.update(); node.update();
249+
node.update_transmit(); node.update_receive(); node.update_transmit(); node.update_receive();
250250
TEST_ASSERT_EQUALS(trig, 16);
251251
const uint8_t raw[] = {0x7E, 0x7E, 133, 8, 5, 164, 0xde, 0xc0, 0xad, 0xba};
252252
TEST_ASSERT_EQUALS(SharedMedium::transmitted.size(), sizeof(raw));
@@ -291,31 +291,31 @@ AmnbNodeTest::testListener()
291291
trig = 0;
292292
SharedMedium::add_rx({0x7E, 0x7E, 4, 32, 1, 0});
293293
{
294-
node.update();
294+
node.update_transmit(); node.update_receive();
295295
TEST_ASSERT_EQUALS(trig, 1);
296296
TEST_ASSERT_EQUALS(count, 11);
297-
node.update();
297+
node.update_transmit(); node.update_receive();
298298
TEST_ASSERT_EQUALS(trig, 1);
299299
TEST_ASSERT_EQUALS(count, 11);
300300
}
301301
trig = 0;
302302
SharedMedium::add_rx({0x7E, 0x7E, 102, 16, 2, 4, 0, 1, 2, 3});
303303
{
304-
node.update();
304+
node.update_transmit(); node.update_receive();
305305
TEST_ASSERT_EQUALS(trig, 6);
306306
TEST_ASSERT_EQUALS(count, 11+21);
307-
node.update();
307+
node.update_transmit(); node.update_receive();
308308
TEST_ASSERT_EQUALS(trig, 6);
309309
TEST_ASSERT_EQUALS(count, 11+21);
310310
}
311311
trig = 0;
312312
SharedMedium::add_rx({0x7E, 0x7E, 4, 32, 1, 0});
313313
SharedMedium::add_rx({0x7E, 0x7E, 102, 16, 2, 4, 0, 1, 2, 3});
314314
{
315-
node.update();
315+
node.update_transmit(); node.update_receive();
316316
TEST_ASSERT_EQUALS(trig, 1);
317317
TEST_ASSERT_EQUALS(count, 11+21+12);
318-
node.update();
318+
node.update_transmit(); node.update_receive();
319319
TEST_ASSERT_EQUALS(trig, 7);
320320
TEST_ASSERT_EQUALS(count, 11+21+12+22);
321321
}

0 commit comments

Comments
 (0)