Skip to content

Commit f76585e

Browse files
committed
Move to LinkedList class and peer discovery message
1 parent 0276d95 commit f76585e

File tree

4 files changed

+101
-173
lines changed

4 files changed

+101
-173
lines changed

LinkedList.h

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#ifndef LINKED_LIST_H
2+
#define LINKED_LIST_H
3+
4+
template<typename T>
5+
class LinkedList {
6+
public:
7+
LinkedList():last(NULL),first(NULL),length(0){}
8+
9+
struct Node {
10+
T* item;
11+
Node* next;
12+
Node* prev;
13+
Node(T* item):item(item),next(NULL),prev(NULL){}
14+
};
15+
16+
void Add(T* item) {
17+
Node* n = new Node(item);
18+
if (last == NULL) {
19+
last = n;
20+
first = n;
21+
} else {
22+
last->next = n;
23+
n->prev = last;
24+
last = n;
25+
}
26+
length += 1;
27+
}
28+
29+
Node* GetItem(T* item) {
30+
Node* n = first;
31+
while(n != NULL) {
32+
if (n->item == item)
33+
return n;
34+
n = n->next;
35+
}
36+
return NULL;
37+
}
38+
39+
void Remove(T* item) {
40+
Node* n = GetItem(item);
41+
Remove(n);
42+
}
43+
44+
Node* Remove(Node* n) {
45+
if (!n)
46+
return NULL;
47+
if (first == n)
48+
first = n->next;
49+
if (last == n)
50+
last = n->prev;
51+
if (n->prev)
52+
n->prev->next = n->next;
53+
if (n->next)
54+
n->next->prev = n->prev;
55+
Node* ret = n->next;
56+
delete n;
57+
length -= 1;
58+
return n->next;
59+
}
60+
61+
Node* last;
62+
Node* first;
63+
uint16_t length;
64+
};
65+
66+
#endif

MeshBase.cpp

+24-51
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,15 @@ void MeshBase::Update()
6363
// Update peers
6464
if (millis() - last_peer_check_time > PEER_CHECK_TIME)
6565
{
66-
Peer* current = first;
66+
LinkedList<Peer>::Node* current = peers.first;
6767
while(current != NULL)
6868
{
69-
current->time += 1;
70-
if (current->time >= PEER_TIMEOUT)
69+
current->item->time += 1;
70+
if (current->item->time >= PEER_TIMEOUT)
7171
{
72-
current = RemovePeer(current);
72+
Serial.print("Lost Peer: ");
73+
Serial.println(current->item->address, DEC);
74+
current = peers.Remove(current);
7375
} else {
7476
current = current->next;
7577
}
@@ -80,18 +82,22 @@ void MeshBase::Update()
8082

8183
void MeshBase::HandlePeerDiscovery(void* buff, uint8_t length)
8284
{
83-
if (length != sizeof(uint32_t))
85+
if (length != sizeof(PeerDiscoveryMessage))
8486
return;
85-
uint32_t from = *(uint32_t*)buff;
87+
PeerDiscoveryMessage from = *(PeerDiscoveryMessage*)buff;
8688
// Dont know why, but this keeps happening?
87-
if (from == 0)
88-
return;
89+
/*if (from == 0)
90+
return;*/
8991

90-
Peer* peer = GetPeer(from);
92+
Peer* peer = GetPeer(from.address);
9193
if (peer == NULL)
9294
{
9395
// Found a new peer
94-
AddPeer(from);
96+
Serial.print("New Peer: ");
97+
Serial.println(from.address, DEC);
98+
Peer* p = new Peer(from.address);
99+
peers.Add(p);
100+
OnNewPeer(p);
95101
} else {
96102
// Existing peer, reset timer
97103
peer->time = 0;
@@ -101,7 +107,11 @@ void MeshBase::HandlePeerDiscovery(void* buff, uint8_t length)
101107
void MeshBase::SendPeerDiscovery()
102108
{
103109
last_broadcast_time = millis();
104-
SendBroadcastMessage(PEER_DISCOVERY, &address, sizeof(address));
110+
MeshBase::PeerDiscoveryMessage msg;
111+
msg.version = 1;
112+
msg.address = address;
113+
msg.num_peers = peers.length;
114+
SendBroadcastMessage(PEER_DISCOVERY, &msg, sizeof(MeshBase::PeerDiscoveryMessage));
105115
}
106116

107117
void MeshBase::SendBroadcastMessage(uint32_t to, const void* data, uint8_t length)
@@ -131,53 +141,16 @@ void MeshBase::ChooseAddress()
131141
Serial.println(address, DEC);
132142
}
133143

134-
void MeshBase::AddPeer(uint32_t a)
135-
{
136-
Serial.print("New Peer: ");
137-
Serial.println(a, DEC);
138-
Peer* n = new Peer(a);
139-
if (last == NULL)
140-
{
141-
// Empty list.
142-
first = n;
143-
last = n;
144-
} else {
145-
// Attach onto end
146-
last->next = n;
147-
n->prev = last;
148-
last = n;
149-
}
150-
OnNewPeer(n);
151-
}
152-
153144
MeshBase::Peer* MeshBase::GetPeer(uint32_t a)
154145
{
155-
Peer* current = first;
146+
LinkedList<Peer>::Node* current = peers.first;
156147
while(current != NULL)
157148
{
158-
if (current->address == a)
159-
return current;
149+
if (current->item->address == a)
150+
return current->item;
160151
current = current->next;
161152
}
162153
// Could not find..
163154
return NULL;
164155
}
165156

166-
MeshBase::Peer* MeshBase::RemovePeer(MeshBase::Peer* p)
167-
{
168-
Serial.print("Lost Peer: ");
169-
Serial.println(p->address, DEC);
170-
OnLostPeer(p);
171-
Peer* next = p->next;
172-
if (first == p)
173-
first = p->next;
174-
if (last == p)
175-
last = p->prev;
176-
if (p->prev)
177-
p->prev->next = p->next;
178-
if (p->next)
179-
p->next->prev = p->prev;
180-
delete p;
181-
return next;
182-
}
183-

MeshBase.h

+10-7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <stdint.h>
55
#include "RF24.h"
6+
#include "LinkedList.h"
67

78
class MeshBase
89
{
@@ -12,9 +13,7 @@ class MeshBase
1213
struct Peer {
1314
uint32_t address;
1415
uint16_t time;
15-
Peer* next;
16-
Peer* prev;
17-
Peer(uint32_t address) : address(address), time(0), next(0), prev(0) {}
16+
Peer(uint32_t address) : address(address), time(0) {}
1817
};
1918

2019
void Begin();
@@ -37,12 +36,16 @@ class MeshBase
3736
void HandlePeerDiscovery(void* buff, uint8_t length);
3837
void ChooseAddress();
3938

40-
Peer* first;
41-
Peer* last;
39+
LinkedList<Peer> peers;
4240

4341
Peer* GetPeer(uint32_t address);
44-
void AddPeer(uint32_t address);
45-
Peer* RemovePeer(Peer* peer);
42+
43+
struct PeerDiscoveryMessage
44+
{
45+
uint8_t version;
46+
uint32_t address;
47+
uint16_t num_peers;
48+
};
4649

4750
};
4851

RF_test.ino

+1-115
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ void setup()
2323
{
2424
Serial.begin(9600);
2525
Serial.println("Starting RF_TEST");
26-
//randomSeed(analogRead(0));
26+
randomSeed(analogRead(0));
2727
app.Begin();
2828
}
2929

@@ -32,117 +32,3 @@ void loop()
3232
app.Update();
3333
delay(100);
3434
}
35-
/*#include <SPI.h>
36-
//#include "RF24.h"
37-
//#include "printf.h"
38-
39-
40-
//RF24 radio(9,10);
41-
42-
typedef enum
43-
{
44-
BROADCAST_PEER_DISCOVERY = 1,
45-
BROADCAST_MISC,
46-
47-
BROADCAST_MAX,
48-
} broadcast_chanel;
49-
50-
const uint64_t broadcast_addresses[BROADCAST_MAX] = { 0, 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
51-
const uint64_t client_addresses[4] = { 0x112100000F0LL, 0x11210000F1LL, 0x11210000F2LL, 0x11210000F3LL };
52-
const uint8_t client_num = 1;
53-
54-
unsigned long last_broadcast;
55-
56-
struct Peer
57-
{
58-
uint64_t address;
59-
uint32_t last_seen;
60-
boolean used;
61-
Peer() : address(0), last_seen(0), used(false) {}
62-
};
63-
64-
Peer peers[20];
65-
66-
67-
void setup(void)
68-
{
69-
Serial.begin(9600);
70-
Serial.println("RF_TEST");
71-
Serial.print("ADDRESS: ");
72-
Serial.print(client_num, DEC);
73-
Serial.print(" - ");
74-
Serial.print((uint32_t)(client_addresses[client_num] >> 32), HEX);
75-
Serial.print((uint32_t)(client_addresses[client_num] ), HEX);
76-
Serial.println("");
77-
78-
radio.begin();
79-
radio.enableDynamicPayloads();
80-
radio.setRetries(2,1);
81-
//radio.openWritingPipe(client_addresses[client_num]);
82-
radio.openReadingPipe(0, client_addresses[client_num]);
83-
radio.openReadingPipe(BROADCAST_PEER_DISCOVERY,broadcast_addresses[BROADCAST_PEER_DISCOVERY]);
84-
radio.openReadingPipe(BROADCAST_MISC,broadcast_addresses[BROADCAST_MISC]);
85-
radio.setAutoAck(0, true);
86-
radio.setAutoAck(BROADCAST_PEER_DISCOVERY, false);
87-
radio.setAutoAck(BROADCAST_MISC, false);
88-
89-
// Im here!
90-
sendPD();
91-
}
92-
93-
bool doPD()
94-
{
95-
return millis() - last_broadcast > 3000;
96-
}
97-
98-
void sendPD()
99-
{
100-
radio.stopListening();
101-
radio.openWritingPipe(broadcast_addresses[BROADCAST_PEER_DISCOVERY]);
102-
radio.write(&client_addresses[client_num], sizeof(client_addresses[client_num]));
103-
last_broadcast = millis();
104-
radio.startListening();
105-
}
106-
107-
void sendMessage(uint64_t address, const void* message, uint8_t length)
108-
{
109-
radio.stopListening();
110-
radio.openWritingPipe(address);
111-
radio.write(message, length);
112-
radio.startListening();
113-
}
114-
115-
116-
void loop(void)
117-
{
118-
uint8_t pipe_num;
119-
if (radio.available(&pipe_num))
120-
{
121-
uint8_t len = radio.getDynamicPayloadSize();
122-
123-
if (pipe_num == BROADCAST_PEER_DISCOVERY)
124-
{
125-
uint64_t payload;
126-
radio.read( &payload, len );
127-
Serial.print("Found client: ");
128-
Serial.print((uint32_t)(payload >> 32), HEX);
129-
Serial.print((uint32_t)(payload ), HEX);
130-
Serial.println("");
131-
sendMessage(payload, "Hello there.", 12);
132-
}
133-
else //if (pipe_num == 0)
134-
{
135-
char payload[33];
136-
radio.read(payload, len);
137-
payload[len] = 0;
138-
Serial.print("Got packet. Message: ");
139-
Serial.println(payload);
140-
}
141-
}
142-
143-
// Periodically send a PD broadcast.
144-
if (doPD()) { sendPD(); }
145-
146-
delay(10);
147-
148-
}*/

0 commit comments

Comments
 (0)