make node routine#0 to be non-blocking before each MESSAGE_TIMEOUT | add node routine#1 to print and propagate/ignore discover requests and messages data
This commit is contained in:
parent
cbe48ceebc
commit
9a7d7bb37c
|
@ -3,6 +3,8 @@
|
||||||
#include "packet.h" // Packet
|
#include "packet.h" // Packet
|
||||||
#include "xbee_wrapper.h" // WBeeWrapper
|
#include "xbee_wrapper.h" // WBeeWrapper
|
||||||
|
|
||||||
|
#define SEND_TIMEOUT 10000
|
||||||
|
|
||||||
// Peripherals
|
// Peripherals
|
||||||
LCDWrapper screen = LCDWrapper(0x20, 16, 2);
|
LCDWrapper screen = LCDWrapper(0x20, 16, 2);
|
||||||
XBeeWrapper xbee = XBeeWrapper();
|
XBeeWrapper xbee = XBeeWrapper();
|
||||||
|
@ -10,6 +12,7 @@ XBeeWrapper xbee = XBeeWrapper();
|
||||||
// ACTUAL DATA
|
// ACTUAL DATA
|
||||||
uint8_t wave_id = 255; // last wave
|
uint8_t wave_id = 255; // last wave
|
||||||
uint8_t dist = 255; // actual distance
|
uint8_t dist = 255; // actual distance
|
||||||
|
unsigned long time;
|
||||||
Packet recv, send;
|
Packet recv, send;
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
@ -21,68 +24,101 @@ void setup() {
|
||||||
|
|
||||||
xbee.begin(38400);
|
xbee.begin(38400);
|
||||||
|
|
||||||
|
time = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
|
||||||
// 1. ignore if no received data
|
/* [1] If SEND_TIMEOUT reached -> send data */
|
||||||
|
if( millis() - time >= SEND_TIMEOUT ){
|
||||||
|
time = millis();
|
||||||
|
send_data();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* [2] Listen for incoming data */
|
||||||
if( xbee.receive(recv) != XBWRECV_OK )
|
if( xbee.receive(recv) != XBWRECV_OK )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
uint8_t opcode = recv.getOpcode();
|
uint8_t opcode = recv.getOpcode();
|
||||||
|
|
||||||
// DISCOVER REQUEST
|
// 1. manage discover request
|
||||||
if( opcode == 0 ) {
|
if( opcode == 0 )
|
||||||
|
return manage_discover();
|
||||||
|
|
||||||
// security
|
// 2. manage message data
|
||||||
if( recv.getDist() == 0 && recv.getSender() != 255 )
|
else if( opcode == 1 )
|
||||||
return;
|
return manage_message();
|
||||||
|
|
||||||
screen.printfn(0, "dsc[%3d] %3d / %3d", recv.getSender(), recv.getDist(), recv.getWave());
|
|
||||||
|
|
||||||
// ignore if same wave
|
}
|
||||||
if( recv.getWave() == wave_id ){
|
|
||||||
screen.printfn(1, "x");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// update features
|
void send_data(){
|
||||||
wave_id = recv.getWave();
|
// 1. prepare message
|
||||||
dist = recv.getDist()+1;
|
send.setOpcode(1);
|
||||||
|
send.setDist(dist);
|
||||||
|
send.setTTL(MESSAGE_TTL);
|
||||||
|
uint8_t data[19] = {0};
|
||||||
|
memcpy(data, "https://git.xdrm.io", 19);
|
||||||
|
send.setData(data, 19);
|
||||||
|
send.setSender(SENDERID);
|
||||||
|
|
||||||
// propagate wave
|
// 2. debug
|
||||||
send.setOpcode(0);
|
screen.clear();
|
||||||
send.setWave(wave_id);
|
screen.printfn(0, "msg[%3d/%3d] %3d", send.getDist(), send.getTTL(), send.getSize());
|
||||||
send.setDist(dist);
|
screen.printfn_overflow(1, "%s", send.getData());
|
||||||
send.setSender(42);
|
|
||||||
|
|
||||||
screen.printfn(1, "dsc[%3d] %3d / %3d", send.getSender(), send.getDist(), send.getWave());
|
// 3. send
|
||||||
xbee.broadcast(send);
|
xbee.broadcast(send);
|
||||||
|
screen.printfn(1, "sent ");
|
||||||
|
}
|
||||||
|
|
||||||
// MESSAGE DATA
|
|
||||||
} else {
|
|
||||||
|
|
||||||
screen.clear();
|
void manage_discover(){
|
||||||
screen.printfn(0, "msg[%3d/%3d] %3d", recv.getDist(), recv.getTTL(), recv.getSize());
|
// security
|
||||||
delay(500);
|
if( recv.getDist() == 0 && recv.getSender() != 255 )
|
||||||
screen.printfn_overflow(0, "%s", recv.getData());
|
return;
|
||||||
|
|
||||||
// ignore
|
screen.printfn(0, "dsc[%3d] %3d / %3d", recv.getSender(), recv.getDist(), recv.getWave());
|
||||||
if( recv.getTTL() <= 0 || recv.getDist() > dist ){
|
|
||||||
screen.printfn(1, "x");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// propagation
|
|
||||||
send.setOpcode(1);
|
|
||||||
send.setTTL(recv.getTTL()-1);
|
|
||||||
send.setDist(dist);
|
|
||||||
send.setData(recv.getData(), recv.getSize());
|
|
||||||
|
|
||||||
screen.printfn(1, "msg[%3d/%3d] %3d", send.getDist(), send.getTTL(), send.getSize());
|
|
||||||
xbee.broadcast(send);
|
|
||||||
|
|
||||||
|
// ignore if same wave
|
||||||
|
if( recv.getWave() == wave_id ){
|
||||||
|
screen.printfn(1, "x");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update features
|
||||||
|
wave_id = recv.getWave();
|
||||||
|
dist = recv.getDist()+1;
|
||||||
|
|
||||||
|
// propagate wave
|
||||||
|
send.setOpcode(0);
|
||||||
|
send.setWave(wave_id);
|
||||||
|
send.setDist(dist);
|
||||||
|
send.setSender(SENDERID);
|
||||||
|
|
||||||
|
screen.printfn(1, "dsc[%3d] %3d / %3d", send.getSender(), send.getDist(), send.getWave());
|
||||||
|
xbee.broadcast(send);
|
||||||
|
}
|
||||||
|
|
||||||
|
void manage_message(){
|
||||||
|
screen.clear();
|
||||||
|
screen.printfn(0, "msg[%3d/%3d] %3d", recv.getDist(), recv.getTTL(), recv.getSize());
|
||||||
|
delay(500);
|
||||||
|
screen.printfn_overflow(0, "%s", recv.getData());
|
||||||
|
|
||||||
|
// ignore
|
||||||
|
if( recv.getTTL() <= 0 || recv.getDist() > dist ){
|
||||||
|
screen.printfn(1, "x");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// propagation
|
||||||
|
send.setOpcode(1);
|
||||||
|
send.setTTL(recv.getTTL()-1);
|
||||||
|
send.setDist(dist);
|
||||||
|
send.setData(recv.getData(), recv.getSize());
|
||||||
|
|
||||||
|
screen.printfn(1, "msg[%3d/%3d] %3d", send.getDist(), send.getTTL(), send.getSize());
|
||||||
|
xbee.broadcast(send);
|
||||||
}
|
}
|
|
@ -3,7 +3,9 @@
|
||||||
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
#define DISCOVER_TTL 10000
|
#define DISCOVER_TTL 5000
|
||||||
|
#define SENDERID 42
|
||||||
|
#define MESSAGE_TTL 10
|
||||||
|
|
||||||
// discover request (c.f. class node)
|
// discover request (c.f. class node)
|
||||||
#define DISCOVER_SIZE sizeof(uint8_t)*4
|
#define DISCOVER_SIZE sizeof(uint8_t)*4
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
#include "xbee_wrapper.h"
|
#include "xbee_wrapper.h"
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
|
||||||
#define WAVE_TIMEOUT 5000
|
|
||||||
|
|
||||||
// Peripherals
|
// Peripherals
|
||||||
LCDWrapper screen(0x20, 16, 2);
|
LCDWrapper screen(0x20, 16, 2);
|
||||||
XBeeWrapper xbee = XBeeWrapper();
|
XBeeWrapper xbee = XBeeWrapper();
|
||||||
|
@ -28,15 +26,15 @@ void setup() {
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
|
||||||
/* [1] if WAVE_TIMEOUT reached */
|
/* [1] if DISCOVER_TTL reached -> send discover request */
|
||||||
if( millis() - time >= WAVE_TIMEOUT ){
|
if( millis() - time >= DISCOVER_TTL ){
|
||||||
time = millis();
|
time = millis();
|
||||||
|
|
||||||
// increment wave id (will overflow from 255 to 0)
|
// increment wave id (will overflow from 255 to 0)
|
||||||
send.setOpcode(0);
|
send.setOpcode(0);
|
||||||
send.setWave(++wave_id);
|
send.setWave(++wave_id);
|
||||||
send.setDist(0);
|
send.setDist(0);
|
||||||
send.setSender(42);
|
send.setSender(SENDERID);
|
||||||
|
|
||||||
screen.clear();
|
screen.clear();
|
||||||
screen.printfn(1, "dsc[%3d] %3d / %3d", send.getSender(), send.getDist(), send.getWave());
|
screen.printfn(1, "dsc[%3d] %3d / %3d", send.getSender(), send.getDist(), send.getWave());
|
||||||
|
|
Loading…
Reference in New Issue