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

Commit9b028c2

Browse files
committed
Split long messages on send.
TODO: Re-assemble messages on recieve
1 parent7c06309 commit9b028c2

File tree

3 files changed

+49
-28
lines changed

3 files changed

+49
-28
lines changed

‎MeshBase.cpp

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
#include<RF24.h>
33
#include"MeshBase.h"
44

5+
#defineMAX_PACKET_SIZE32
6+
#defineMAX_PAYLOAD_SIZE (MAX_PACKET_SIZE -sizeof(Message))
7+
58
// -- Broadcast addresses --
69
#definePEER_DISCOVERY1
710

@@ -51,19 +54,7 @@ void MeshBase::Update()
5154
uint8_t len = radio.getDynamicPayloadSize();
5255
uint8_t buff[40];
5356
done = radio.read(buff,min(len,sizeof(buff)));
54-
55-
const MeshBase::Message* msg = (structMeshBase::Message*)buff;
56-
uint8_t payload_length = len -sizeof(Message);
57-
constuint8_t* payload = buff +sizeof(Message);
58-
59-
switch(msg->type) {
60-
case type_peer_discovery:
61-
HandlePeerDiscovery(msg, payload, payload_length);
62-
break;
63-
default:
64-
OnMessage(msg, payload, payload_length);
65-
break;
66-
}
57+
HandlePacket(buff, len);
6758
}while (!done);
6859
}
6960

@@ -87,6 +78,29 @@ void MeshBase::Update()
8778
}
8879
}
8980

81+
voidMeshBase::HandlePacket(const byte* data,uint8_t len)
82+
{
83+
if (len <sizeof(Message))
84+
return;
85+
const MeshBase::Message* msg = (structMeshBase::Message*)data;
86+
uint8_t payload_length = len -sizeof(Message);
87+
const byte* payload = data +sizeof(Message);
88+
if (msg->split_enabled)
89+
{
90+
// Re-assembly needed
91+
// TODO: Re-assemble packets
92+
}else {
93+
switch(msg->type) {
94+
case type_peer_discovery:
95+
HandlePeerDiscovery(msg, payload, payload_length);
96+
break;
97+
default:
98+
OnMessage(msg, payload, payload_length);
99+
break;
100+
}
101+
}
102+
}
103+
90104
voidMeshBase::HandlePeerDiscovery(const MeshBase::Message* msg,constvoid* buff,uint8_t length)
91105
{
92106
if (length !=sizeof(PeerDiscoveryMessage))
@@ -128,27 +142,34 @@ void MeshBase::SendPeerDiscovery()
128142

129143
voidMeshBase::SendMessage(uint32_t to,uint8_t type,constvoid* data,uint8_t length,bool is_broadcast)
130144
{
131-
uint8_t buff[32];
145+
byte buff[MAX_PACKET_SIZE];
132146
Message* msg = (structMessage*)buff;
133147
msg->protocol_version =1;
134148
msg->ttl =0;
135149
msg->type = type;
136150
msg->address_from = address;
137-
msg->split_enabled =0;
138-
msg->split_part =0;
139-
memcpy(&buff[sizeof(Message)], data,min(length,32 -sizeof(Message)));
140-
radio.stopListening();
141-
if (is_broadcast)
142-
radio.openWritingPipe(TO_BROADCAST(to));
143-
else
144-
radio.openWritingPipe(TO_ADDRESS(to));
145-
radio.write(buff, length +sizeof(Message));
146-
radio.startListening();
151+
msg->split_enabled = length > MAX_PAYLOAD_SIZE;
152+
153+
uint8_t num_pkts = (length / MAX_PAYLOAD_SIZE) +1;
154+
for (uint8_t num =0; num < num_pkts; ++num)
155+
{
156+
uint8_t remaining_length = length - (num * MAX_PAYLOAD_SIZE);
157+
msg->split_part = num;
158+
memcpy(buff +sizeof(Message), (const byte*)data + (num * MAX_PAYLOAD_SIZE),min(remaining_length, MAX_PAYLOAD_SIZE));
159+
160+
radio.stopListening();
161+
if (is_broadcast)
162+
radio.openWritingPipe(TO_BROADCAST(to));
163+
else
164+
radio.openWritingPipe(TO_ADDRESS(to));
165+
radio.write(buff,min(remaining_length, MAX_PAYLOAD_SIZE));
166+
radio.startListening();
167+
}
147168
}
148169

149170
voidMeshBase::SendMessage(uint32_t to,uint8_t type,constvoid* data,uint8_t length)
150171
{
151-
SendMessage(to,type_user, data, length,false);
172+
SendMessage(to,type, data, length,false);
152173
}
153174

154175
voidMeshBase::ChooseAddress()

‎MeshBase.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class MeshBase
5353
voidSendPeerDiscovery();
5454
voidSendMessage(uint32_t address,uint8_t type,constvoid* data,uint8_t length,bool is_broadcast);
5555
voidHandlePeerDiscovery(const Message* msg,constvoid* buff,uint8_t length);
56-
voidHandleMessage(constMessage* msg,constvoid* data,uint8_t length);
56+
voidHandlePacket(constbyte* data,uint8_t length);
5757
voidChooseAddress();
5858

5959
LinkedList<Peer>peers;

‎RF_test.ino

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ protected:
1717
{
1818
if (!IsReady())return;
1919
char buff[255];
20-
int len =snprintf(buff,255,"Hello %u from %u", p->address,GetAddress());
21-
Serial.print("Sending message:");
20+
int len =snprintf(buff,255,"Hello %u", p->address);
21+
Serial.print("Me:");
2222
Serial.println(buff);
2323
SendMessage(p->address, type_user, buff, len +1);
2424
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp