share libs with symlinks | fix + finish xbee_wrapper and packet | update mains
This commit is contained in:
parent
7c65091230
commit
53ac51febd
|
@ -2,7 +2,6 @@
|
|||
#include <LiquidCrystal_I2C.h>
|
||||
#include "packet.h" // Packet
|
||||
#include "xbee_wrapper.h" // WBeeWrapper
|
||||
#include "protocol.h"
|
||||
|
||||
// Peripherals
|
||||
LiquidCrystal_I2C screen(0x27, 16, 2);
|
||||
|
@ -11,9 +10,8 @@ XBeeWrapper xbee = XBeeWrapper();
|
|||
// ACTUAL DATA
|
||||
uint8_t wave_id = 255; // last wave
|
||||
uint8_t dist = 255; // actual distance
|
||||
struct discover dsc = {0,0,0};
|
||||
struct message msg = {1, dist, 0, 0, {}};
|
||||
Packet pkt;
|
||||
Packet recv;
|
||||
Packet send;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(38400);
|
||||
|
@ -28,26 +26,55 @@ void setup() {
|
|||
void loop() {
|
||||
|
||||
// 1. ignore if no received data
|
||||
if( xbee.receive(pkt) == XBWRCV_OK ){
|
||||
if( xbee.receive(recv) == XBWRECV_OK ){
|
||||
uint8_t opcode = recv.getOpcode();
|
||||
Serial.print("+ opcode = ");
|
||||
Serial.println(opcode);
|
||||
|
||||
// DISCOVER REQUEST
|
||||
if( opcode == 0 ) {
|
||||
Serial.println("+ discover request");
|
||||
Serial.print(" + wave = ");
|
||||
Serial.println(recv.getWave());
|
||||
Serial.print(" + dist = ");
|
||||
Serial.println(recv.getDist());
|
||||
|
||||
if( recv.getWave() != wave_id ){
|
||||
wave_id = recv.getWave();
|
||||
dist = recv.getDist()+1;
|
||||
recv.setDist(dist);
|
||||
|
||||
send.setOpcode(0);
|
||||
send.setWave(wave_id);
|
||||
send.setDist(dist);
|
||||
xbee.broadcast(send);
|
||||
Serial.println(" + propagated");
|
||||
|
||||
}
|
||||
|
||||
// MESSAGE DATA
|
||||
} else {
|
||||
|
||||
Serial.println("+ message data");
|
||||
Serial.print(" + ttl = ");
|
||||
Serial.println(recv.getTTL());
|
||||
Serial.print(" + dist = ");
|
||||
Serial.println(recv.getDist());
|
||||
|
||||
// propagation
|
||||
if( recv.getTTL() > 0 && recv.getDist() <= dist ){
|
||||
send.setOpcode(1);
|
||||
send.setTTL(recv.getTTL()-1);
|
||||
send.setDist(dist);
|
||||
send.setData(recv.getData(), recv.getSize());
|
||||
xbee.broadcast(send);
|
||||
Serial.println(" + propagated");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// manage packet
|
||||
}
|
||||
// xbee.readPacket();
|
||||
// if( xbee.getResponse().isAvailable() ){
|
||||
|
||||
// if( xbee.getResponse().getApiId() == ZB_RX_RESPONSE ){
|
||||
// // got a zb rx packet
|
||||
|
||||
// // now extract response
|
||||
// xbee.getResponse().getZBRxResponse(res);
|
||||
|
||||
// // get data type (byte 0)
|
||||
// uint8_t type = res.getData(0)
|
||||
|
||||
|
||||
// res.getBytes()
|
||||
// analogWrite(dataLed, res.getData(0));
|
||||
// }
|
||||
|
||||
// }
|
||||
|
||||
}
|
||||
|
|
|
@ -1,65 +0,0 @@
|
|||
#include "packet.h"
|
||||
|
||||
|
||||
/* PUBLIC
|
||||
----------------------------------------*/
|
||||
// builds a packet from raw data and returns the error code
|
||||
uint8_t Packet::read(uint8_t buf[], uint8_t size){
|
||||
// 1. fail on invalid size
|
||||
if( size < 1 ) return PKTREAD_EMPTY;
|
||||
if( size > PROTO_SIZE ) return PKTREAD_OVERFLOW;
|
||||
|
||||
// 2. extract packet type
|
||||
type = buf[0] == 0;
|
||||
|
||||
// 3. extract depending on type
|
||||
return type ? read_discover(buf, size) : read_message(buf, size);
|
||||
|
||||
};
|
||||
|
||||
// writes the binary representation of the packet
|
||||
uint8_t Packet::write(uint8_t buf[], uint8_t size){
|
||||
/* TODO */
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
||||
/* PRIVATE
|
||||
----------------------------------------*/
|
||||
uint8_t Packet::read_discover(uint8_t buf[], uint8_t size){
|
||||
// 1. fail on invalid size
|
||||
if( size != DISCOVER_SIZE )
|
||||
return PKTREAD_INVALID_DISCOVER_FORMAT;
|
||||
|
||||
// 2. extract fixed
|
||||
dsc.opcode = buf[0];
|
||||
dsc.wave = buf[1];
|
||||
dsc.dist = buf[2];
|
||||
|
||||
return PKTREAD_OK;
|
||||
};
|
||||
|
||||
uint8_t Packet::read_message(uint8_t buf[], uint8_t size){
|
||||
// 1. fail on invalid size
|
||||
if( size < MESSAGE_MIN_SIZE || size > MESSAGE_MAX_SIZE )
|
||||
return PKTREAD_INVALID_MESSAGE_FORMAT;
|
||||
|
||||
// 2. extract fixed
|
||||
msg.opcode = buf[0];
|
||||
msg.dist = buf[1];
|
||||
msg.ttl = buf[2];
|
||||
msg.size = buf[3];
|
||||
|
||||
// 3. check message size
|
||||
if( size - 4 - 1 != msg.size )
|
||||
return PKTREAD_INVALID_MESSAGE_FORMAT;
|
||||
|
||||
// 4. extract message
|
||||
strncpy(
|
||||
(char*) msg.data,
|
||||
(char*)buf+4,
|
||||
msg.size
|
||||
);
|
||||
|
||||
return PKTREAD_OK;
|
||||
};
|
|
@ -0,0 +1 @@
|
|||
../../packet.cpp
|
|
@ -1,37 +0,0 @@
|
|||
#ifndef _PACKET_H_
|
||||
#define _PACKET_H_
|
||||
|
||||
#include "protocol.h"
|
||||
#include <Wire.h>
|
||||
|
||||
#define PKTREAD_OK 0
|
||||
#define PKTREAD_EMPTY 1
|
||||
#define PKTREAD_OVERFLOW 2
|
||||
#define PKTREAD_INVALID_DISCOVER_FORMAT 3
|
||||
#define PKTREAD_INVALID_MESSAGE_FORMAT 4
|
||||
|
||||
class Packet {
|
||||
private:
|
||||
// 1. common
|
||||
uint8_t buf[];
|
||||
uint8_t bufsize;
|
||||
bool type; // true = discover ; false = message
|
||||
|
||||
// 2. wrappers
|
||||
struct discover dsc;
|
||||
struct message msg;
|
||||
|
||||
// 3. helpers
|
||||
uint8_t read_discover(uint8_t buf[], uint8_t size);
|
||||
uint8_t read_message(uint8_t buf[], uint8_t size);
|
||||
|
||||
public:
|
||||
// builds a packet from raw data and returns the status code
|
||||
uint8_t read(uint8_t buf[], uint8_t size);
|
||||
|
||||
// writes the binary representation of the packet
|
||||
uint8_t write(uint8_t buf[], uint8_t size);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
../../packet.h
|
|
@ -1,30 +0,0 @@
|
|||
#include "xbee_wrapper.h"
|
||||
|
||||
|
||||
XBeeWrapper::XBeeWrapper(){ xbee = XBee(); };
|
||||
|
||||
|
||||
void XBeeWrapper::begin(unsigned long baud){
|
||||
xbee.setSerial(Serial1);
|
||||
Serial1.begin(baud);
|
||||
};
|
||||
|
||||
|
||||
uint8_t XBeeWrapper::receive(Packet& pkt){
|
||||
xbee.readPacket();
|
||||
|
||||
if( !xbee.getResponse().isAvailable() )
|
||||
return XBWRCV_NONE;
|
||||
|
||||
if( xbee.getResponse().getApiId() != ZB_RX_RESPONSE )
|
||||
return XBWRCV_NONE;
|
||||
|
||||
Rx64Response res;
|
||||
xbee.getResponse().getZBRxResponse(res);
|
||||
|
||||
// extract data and propagate error
|
||||
if( !pkt.read(res.getData(), res.getDataLength()) )
|
||||
return XBWRCV_ERROR;
|
||||
|
||||
return XBWRCV_OK;
|
||||
};
|
|
@ -0,0 +1 @@
|
|||
../../xbee_wrapper.cpp
|
|
@ -1,31 +0,0 @@
|
|||
#ifndef _WBEE_WRAPPER_H_
|
||||
#define _WBEE_WRAPPER_H_
|
||||
|
||||
#include <Wire.h>
|
||||
#include <XBee.h>
|
||||
#include "protocol.h"
|
||||
#include "packet.h"
|
||||
|
||||
#define XBWRCV_OK 0
|
||||
#define XBWRCV_NONE 1
|
||||
#define XBWRCV_ERROR 2
|
||||
|
||||
|
||||
class XBeeWrapper{
|
||||
private:
|
||||
XBee xbee;
|
||||
|
||||
public:
|
||||
XBeeWrapper();
|
||||
|
||||
// initialises the XBee interface
|
||||
void begin(unsigned long baud);
|
||||
|
||||
// tries to extract a received packet
|
||||
uint8_t receive(Packet& pkt);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
../../xbee_wrapper.h
|
|
@ -0,0 +1,100 @@
|
|||
#include "packet.h"
|
||||
|
||||
|
||||
/* PUBLIC
|
||||
----------------------------------------*/
|
||||
// builds a packet from raw data and returns the error code
|
||||
uint8_t Packet::read(uint8_t buf[], size_t size){
|
||||
// 1. fail on invalid size
|
||||
if( size < 1 ) return PKTREAD_EMPTY;
|
||||
if( size > PROTO_SIZE ) return PKTREAD_OVERFLOW;
|
||||
|
||||
// 2. extract packet type
|
||||
opcode = buf[0];
|
||||
|
||||
// 3. extract depending on type
|
||||
return (opcode == 0) ? read_discover(buf, size) : read_message(buf, size);
|
||||
|
||||
};
|
||||
|
||||
// writes the binary representation of the packet
|
||||
size_t Packet::write(uint8_t buf[]){
|
||||
if( opcode == 0 )
|
||||
return write_discover(buf);
|
||||
|
||||
return write_message(buf);
|
||||
};
|
||||
|
||||
/* GETTERS / SETTERS
|
||||
----------------------------------------*/
|
||||
uint8_t Packet::getOpcode() { return opcode; }
|
||||
void Packet::setOpcode(uint8_t value) { opcode = value; dsc.opcode = value; msg.opcode = value; }
|
||||
|
||||
uint8_t Packet::getWave() { return dsc.wave; }
|
||||
void Packet::setWave(uint8_t value) { dsc.wave = value; }
|
||||
|
||||
uint8_t Packet::getDist() { return (opcode == 0) ? dsc.dist : msg.dist; }
|
||||
void Packet::setDist(uint8_t value) { if(opcode == 0) dsc.dist = value; else msg.dist = value; }
|
||||
|
||||
uint8_t Packet::getTTL() { return msg.ttl; }
|
||||
void Packet::setTTL(uint8_t value) { msg.ttl = value; }
|
||||
|
||||
uint8_t Packet::getSize() { return msg.size; }
|
||||
|
||||
uint8_t* Packet::getData() { return msg.data; }
|
||||
void Packet::setData(uint8_t *buffer, uint8_t size) { memcpy(msg.data, buffer, size); msg.size = size; }
|
||||
|
||||
|
||||
|
||||
/* PRIVATE
|
||||
----------------------------------------*/
|
||||
uint8_t Packet::read_discover(uint8_t buf[], size_t size){
|
||||
// 1. fail on invalid size
|
||||
if( size != DISCOVER_SIZE )
|
||||
return PKTREAD_INVALID_DISCOVER_FORMAT;
|
||||
|
||||
dsc.opcode = buf[0];
|
||||
dsc.wave = buf[1];
|
||||
dsc.dist = buf[2];
|
||||
|
||||
return PKTREAD_OK;
|
||||
};
|
||||
|
||||
uint8_t Packet::read_message(uint8_t buf[], size_t size){
|
||||
// 1. fail on invalid size
|
||||
if( size < MESSAGE_MIN_SIZE || size > MESSAGE_MAX_SIZE )
|
||||
return PKTREAD_INVALID_MESSAGE_FORMAT;
|
||||
|
||||
msg.opcode = buf[0];
|
||||
msg.dist = buf[1];
|
||||
msg.ttl = buf[2];
|
||||
msg.size = buf[3];
|
||||
|
||||
// 3. check message size
|
||||
if( size - 4 - 1 != msg.size )
|
||||
return PKTREAD_INVALID_MESSAGE_FORMAT;
|
||||
|
||||
// 4. extract message
|
||||
memcpy(msg.data, buf+4, msg.size);
|
||||
|
||||
return PKTREAD_OK;
|
||||
};
|
||||
|
||||
size_t Packet::write_discover(uint8_t buf[]){
|
||||
buf[0] = dsc.opcode;
|
||||
buf[1] = dsc.wave;
|
||||
buf[2] = dsc.dist;
|
||||
|
||||
return 3;
|
||||
};
|
||||
|
||||
size_t Packet::write_message(uint8_t buf[]){
|
||||
buf[0] = msg.opcode;
|
||||
buf[1] = msg.dist;
|
||||
buf[2] = msg.ttl;
|
||||
buf[3] = msg.size;
|
||||
|
||||
memcpy( buf+4, msg.data, msg.size );
|
||||
|
||||
return 4 + msg.size;
|
||||
};
|
|
@ -0,0 +1,55 @@
|
|||
#ifndef _PACKET_H_
|
||||
#define _PACKET_H_
|
||||
|
||||
#include "protocol.h"
|
||||
#include <Wire.h>
|
||||
|
||||
#define PKTREAD_OK 0
|
||||
#define PKTREAD_EMPTY 1
|
||||
#define PKTREAD_OVERFLOW 2
|
||||
#define PKTREAD_INVALID_DISCOVER_FORMAT 3
|
||||
#define PKTREAD_INVALID_MESSAGE_FORMAT 4
|
||||
|
||||
class Packet {
|
||||
private:
|
||||
// 1. common
|
||||
uint8_t opcode; // 0 = discover ; 1 = message
|
||||
|
||||
// 2. wrappers
|
||||
struct discover dsc;
|
||||
struct message msg;
|
||||
|
||||
// 3. helpers
|
||||
uint8_t read_discover(uint8_t buf[], size_t size);
|
||||
uint8_t read_message(uint8_t buf[], size_t size);
|
||||
size_t write_discover(uint8_t buf[]);
|
||||
size_t write_message(uint8_t buf[]);
|
||||
|
||||
public:
|
||||
// builds a packet from raw data and returns the status code
|
||||
uint8_t read(uint8_t buf[], size_t size);
|
||||
|
||||
// writes the binary representation of the packet returns the size
|
||||
size_t write(uint8_t buf[]);
|
||||
|
||||
// GETTERS / SETTERS
|
||||
uint8_t getOpcode();
|
||||
void setOpcode(uint8_t value);
|
||||
|
||||
uint8_t getWave();
|
||||
void setWave(uint8_t value);
|
||||
|
||||
uint8_t getDist();
|
||||
void setDist(uint8_t value);
|
||||
|
||||
uint8_t getTTL();
|
||||
void setTTL(uint8_t value);
|
||||
|
||||
uint8_t getSize();
|
||||
|
||||
uint8_t* getData();
|
||||
void setData(uint8_t *buffer, uint8_t size);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
|
@ -6,7 +6,7 @@
|
|||
#define DISCOVER_TTL 10000
|
||||
|
||||
// discover request (c.f. class node)
|
||||
#define DISCOVER_SIZE sizeof(uint8_t)*3 + 1
|
||||
#define DISCOVER_SIZE sizeof(uint8_t)*3
|
||||
struct discover {
|
||||
uint8_t opcode; // opcode = 0
|
||||
uint8_t wave; // id de la wave
|
||||
|
@ -14,14 +14,14 @@
|
|||
};
|
||||
|
||||
|
||||
#define MESSAGE_MIN_SIZE sizeof(uint8_t)*4 + 1
|
||||
#define MESSAGE_MAX_SIZE sizeof(uint8_t)*4+sizeof(uint8_t)*255 + 1
|
||||
#define MESSAGE_MIN_SIZE sizeof(uint8_t)*4
|
||||
#define MESSAGE_MAX_SIZE sizeof(uint8_t)*4+sizeof(uint8_t)*255
|
||||
struct message {
|
||||
uint8_t opcode; // opcode = 1
|
||||
uint8_t dist; // distance of the last sender
|
||||
uint8_t ttl; // time to live default = 10
|
||||
uint8_t size; // size of message in bytes
|
||||
uint8_t data[]; // actual message
|
||||
uint8_t *data; // actual message
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
#include <Wire.h>
|
||||
#include <XBee.h>
|
||||
#include "protocol.h"
|
||||
#include <LiquidCrystal_I2C.h>
|
||||
#include "xbee_wrapper.h"
|
||||
#include "packet.h"
|
||||
|
||||
#define WAVE_TIMEOUT 5000
|
||||
|
||||
// Peripherals
|
||||
LiquidCrystal_I2C screen(0x27, 16, 2);
|
||||
XBee xbee = XBee();
|
||||
XBeeWrapper xbee = XBeeWrapper();
|
||||
|
||||
// ACTUAL DATA
|
||||
uint8_t wave_id = 250;
|
||||
struct discover dsc = {0,0,0};
|
||||
Packet send;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(38400);
|
||||
|
@ -20,39 +20,25 @@ void setup() {
|
|||
screen.begin();
|
||||
screen.backlight();
|
||||
|
||||
xbee.setSerial(Serial1);
|
||||
Serial1.begin(38400);
|
||||
|
||||
// xbee.begin(38400);
|
||||
xbee.begin(38400);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
delay(WAVE_TIMEOUT);
|
||||
|
||||
// increment wave id (will overflow from 255 to 0)
|
||||
dsc.wave = ++wave_id; // set wave id
|
||||
|
||||
screen.clear();
|
||||
screen.print("+ wave");
|
||||
screen.print(dsc.wave);
|
||||
screen.print(wave_id+1);
|
||||
|
||||
uint8_t payload[3] = {dsc.opcode, dsc.wave, dsc.dist};
|
||||
// increment wave id (will overflow from 255 to 0)
|
||||
send.setOpcode(0);
|
||||
send.setWave(++wave_id);
|
||||
send.setDist(0);
|
||||
|
||||
XBeeAddress64 addr64 = XBeeAddress64(0x00000000, 0x0000FFFF);
|
||||
Tx64Request tx = Tx64Request(addr64, payload, sizeof(payload));
|
||||
xbee.send(tx);
|
||||
if( xbee.broadcast(send) == XBWSEND_OK )
|
||||
Serial.println("sent");
|
||||
else
|
||||
Serial.println("failed");
|
||||
|
||||
/* Check the status of our sent payload (not mandatory)
|
||||
|
||||
TxStatusResponse txStatus = TxStatusResponse();
|
||||
xbee.readPacket();
|
||||
if( xbee.getResponse().isAvailable() ){
|
||||
if( xbee.getResponse().getApiId() == TX_STATUS_RESPONSE ){
|
||||
xbee.getResponse().getTxStatusResponse(txStatus);
|
||||
txStatus.isSuccess() && Serial.println(" ... sent") || Serial.println(" ... failed");
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
../../packet.cpp
|
|
@ -0,0 +1 @@
|
|||
../../packet.h
|
|
@ -0,0 +1 @@
|
|||
../../xbee_wrapper.cpp
|
|
@ -0,0 +1 @@
|
|||
../../xbee_wrapper.h
|
|
@ -0,0 +1,69 @@
|
|||
#include "xbee_wrapper.h"
|
||||
|
||||
|
||||
XBeeWrapper::XBeeWrapper(){ xbee = XBee(); };
|
||||
|
||||
|
||||
void XBeeWrapper::begin(unsigned long baud){
|
||||
xbee.setSerial(Serial1);
|
||||
Serial1.begin(baud);
|
||||
};
|
||||
|
||||
|
||||
uint8_t XBeeWrapper::receive(Packet& pkt){
|
||||
xbee.readPacket();
|
||||
|
||||
if( !xbee.getResponse().isAvailable() )
|
||||
return XBWRECV_NONE;
|
||||
|
||||
uint8_t apiId = xbee.getResponse().getApiId();
|
||||
if( apiId != RX_16_RESPONSE && apiId != RX_64_RESPONSE )
|
||||
return XBWRECV_NONE;
|
||||
|
||||
if( apiId == RX_16_RESPONSE ){
|
||||
|
||||
Rx16Response res;
|
||||
xbee.getResponse().getRx16Response(res);
|
||||
|
||||
// extract data and propagate error
|
||||
if( !pkt.read(res.getData(), res.getDataLength()) )
|
||||
return XBWRECV_ERROR;
|
||||
|
||||
} else {
|
||||
|
||||
Rx64Response res;
|
||||
xbee.getResponse().getRx64Response(res);
|
||||
|
||||
// extract data and propagate error
|
||||
if( !pkt.read(res.getData(), res.getDataLength()) )
|
||||
return XBWRECV_ERROR;
|
||||
|
||||
}
|
||||
|
||||
|
||||
return XBWRECV_OK;
|
||||
};
|
||||
|
||||
uint8_t XBeeWrapper::broadcast(Packet& pkt){
|
||||
// build broadcast addr
|
||||
XBeeAddress64 bcast = XBeeAddress64(0x00000000, 0x0000FFFF);
|
||||
|
||||
// build payload from packet
|
||||
uint8_t payload[PROTO_SIZE];
|
||||
size_t payload_size = pkt.write(payload);
|
||||
|
||||
// send
|
||||
Tx64Request tx = Tx64Request(bcast, payload, payload_size);
|
||||
xbee.send(tx);
|
||||
|
||||
// // check status
|
||||
// TxStatusResponse txStatus = TxStatusResponse();
|
||||
// xbee.readPacket();
|
||||
// if( xbee.getResponse().isAvailable() ){
|
||||
// if( xbee.getResponse().getApiId() == TX_STATUS_RESPONSE ){
|
||||
// xbee.getResponse().getTxStatusResponse(txStatus);
|
||||
// return txStatus.isSuccess() ? XBWSEND_OK : XBWSEND_ERROR;
|
||||
// }
|
||||
// }
|
||||
return XBWSEND_OK;
|
||||
};
|
|
@ -0,0 +1,38 @@
|
|||
#ifndef _WBEE_WRAPPER_H_
|
||||
#define _WBEE_WRAPPER_H_
|
||||
|
||||
#include <Wire.h>
|
||||
#include <XBee.h>
|
||||
#include "protocol.h"
|
||||
#include "packet.h"
|
||||
|
||||
#define XBWRECV_OK 0
|
||||
#define XBWRECV_NONE 1
|
||||
#define XBWRECV_ERROR 2
|
||||
|
||||
#define XBWSEND_OK 0
|
||||
#define XBWSEND_ERROR 1
|
||||
#define XBWSEND_UNKNOWN 2
|
||||
|
||||
|
||||
class XBeeWrapper{
|
||||
private:
|
||||
XBee xbee;
|
||||
|
||||
public:
|
||||
XBeeWrapper();
|
||||
|
||||
// initialises the XBee interface
|
||||
void begin(unsigned long baud);
|
||||
|
||||
// tries to extract a received packet
|
||||
uint8_t receive(Packet& pkt);
|
||||
|
||||
// tries to broadcast a packet
|
||||
uint8_t broadcast(Packet& pkt);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue