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+
90104void 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
129143void 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
149170void 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
154175void MeshBase::ChooseAddress ()
0 commit comments