Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf76585e

Browse files
committed
Move to LinkedList class and peer discovery message
1 parent0276d95 commitf76585e

File tree

4 files changed

+101
-173
lines changed

4 files changed

+101
-173
lines changed

‎LinkedList.h

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#ifndef LINKED_LIST_H
2+
#defineLINKED_LIST_H
3+
4+
template<typename T>
5+
classLinkedList {
6+
public:
7+
LinkedList():last(NULL),first(NULL),length(0){}
8+
9+
structNode {
10+
T* item;
11+
Node* next;
12+
Node* prev;
13+
Node(T* item):item(item),next(NULL),prev(NULL){}
14+
};
15+
16+
voidAdd(T* item) {
17+
Node* n =newNode(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+
returnNULL;
37+
}
38+
39+
voidRemove(T* item) {
40+
Node* n =GetItem(item);
41+
Remove(n);
42+
}
43+
44+
Node*Remove(Node* n) {
45+
if (!n)
46+
returnNULL;
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

Lines changed: 24 additions & 51 deletions
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
voidMeshBase::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 =newPeer(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
voidMeshBase::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
voidMeshBase::SendBroadcastMessage(uint32_t to,constvoid* data,uint8_t length)
@@ -131,53 +141,16 @@ void MeshBase::ChooseAddress()
131141
Serial.println(address, DEC);
132142
}
133143

134-
voidMeshBase::AddPeer(uint32_t a)
135-
{
136-
Serial.print("New Peer:");
137-
Serial.println(a, DEC);
138-
Peer* n =newPeer(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
returnNULL;
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

Lines changed: 10 additions & 7 deletions
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
classMeshBase
89
{
@@ -12,9 +13,7 @@ class MeshBase
1213
structPeer {
1314
uint32_taddress;
1415
uint16_ttime;
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
voidBegin();
@@ -37,12 +36,16 @@ class MeshBase
3736
voidHandlePeerDiscovery(void* buff,uint8_t length);
3837
voidChooseAddress();
3938

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

4341
Peer*GetPeer(uint32_t address);
44-
voidAddPeer(uint32_t address);
45-
Peer*RemovePeer(Peer* peer);
42+
43+
structPeerDiscoveryMessage
44+
{
45+
uint8_tversion;
46+
uint32_taddress;
47+
uint16_tnum_peers;
48+
};
4649

4750
};
4851

‎RF_test.ino

Lines changed: 1 addition & 115 deletions
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)

[8]ページ先頭

©2009-2025 Movatter.jp