2
2
#include < RF24.h>
3
3
#include " MeshBase.h"
4
4
5
+ #define MAX_PACKET_SIZE 32
6
+ #define MAX_PAYLOAD_SIZE (MAX_PACKET_SIZE - sizeof (Message))
7
+
5
8
// -- Broadcast addresses --
6
9
#define PEER_DISCOVERY 1
7
10
@@ -51,19 +54,7 @@ void MeshBase::Update()
51
54
uint8_t len = radio.getDynamicPayloadSize ();
52
55
uint8_t buff[40 ];
53
56
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);
67
58
} while (!done);
68
59
}
69
60
@@ -87,6 +78,29 @@ void MeshBase::Update()
87
78
}
88
79
}
89
80
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
+
90
104
void MeshBase::HandlePeerDiscovery (const MeshBase::Message* msg, const void * buff, uint8_t length)
91
105
{
92
106
if (length != sizeof (PeerDiscoveryMessage))
@@ -128,27 +142,34 @@ void MeshBase::SendPeerDiscovery()
128
142
129
143
void MeshBase::SendMessage (uint32_t to, uint8_t type, const void * data, uint8_t length, bool is_broadcast)
130
144
{
131
- uint8_t buff[32 ];
145
+ byte buff[MAX_PACKET_SIZE ];
132
146
Message* msg = (struct Message *)buff;
133
147
msg->protocol_version = 1 ;
134
148
msg->ttl = 0 ;
135
149
msg->type = type;
136
150
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
+ }
147
168
}
148
169
149
170
void MeshBase::SendMessage (uint32_t to, uint8_t type, const void * data, uint8_t length)
150
171
{
151
- SendMessage (to, type_user , data, length, false );
172
+ SendMessage (to, type , data, length, false );
152
173
}
153
174
154
175
void MeshBase::ChooseAddress ()
0 commit comments