Skip to content

Commit 9b028c2

Browse files
committed
Split long messages on send.
TODO: Re-assemble messages on recieve
1 parent 7c06309 commit 9b028c2

File tree

3 files changed

+49
-28
lines changed

3 files changed

+49
-28
lines changed

MeshBase.cpp

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

5+
#define MAX_PACKET_SIZE 32
6+
#define MAX_PAYLOAD_SIZE (MAX_PACKET_SIZE - sizeof(Message))
7+
58
// -- Broadcast addresses --
69
#define PEER_DISCOVERY 1
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 = (struct MeshBase::Message*)buff;
56-
uint8_t payload_length = len - sizeof(Message);
57-
const uint8_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+
void MeshBase::HandlePacket(const byte* data, uint8_t len)
82+
{
83+
if (len < sizeof(Message))
84+
return;
85+
const MeshBase::Message* msg = (struct MeshBase::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
void MeshBase::HandlePeerDiscovery(const MeshBase::Message* msg, const void* buff, uint8_t length)
91105
{
92106
if (length != sizeof(PeerDiscoveryMessage))
@@ -128,27 +142,34 @@ void MeshBase::SendPeerDiscovery()
128142

129143
void MeshBase::SendMessage(uint32_t to, uint8_t type, const void* data, uint8_t length, bool is_broadcast)
130144
{
131-
uint8_t buff[32];
145+
byte buff[MAX_PACKET_SIZE];
132146
Message* msg = (struct Message*)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
void MeshBase::SendMessage(uint32_t to, uint8_t type, const void* data, uint8_t length)
150171
{
151-
SendMessage(to, type_user, data, length, false);
172+
SendMessage(to, type, data, length, false);
152173
}
153174

154175
void MeshBase::ChooseAddress()

MeshBase.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class MeshBase
5353
void SendPeerDiscovery();
5454
void SendMessage(uint32_t address, uint8_t type, const void* data, uint8_t length, bool is_broadcast);
5555
void HandlePeerDiscovery(const Message* msg, const void* buff, uint8_t length);
56-
void HandleMessage(const Message* msg, const void* data, uint8_t length);
56+
void HandlePacket(const byte* data, uint8_t length);
5757
void ChooseAddress();
5858

5959
LinkedList<Peer> peers;

RF_test.ino

+2-2
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)