@@ -37,7 +37,7 @@ void MeshBase::Update()
37
37
// Periodic sends
38
38
if (millis () - last_broadcast_time > PEER_DISCOVERY_TIME)
39
39
{
40
- if (!IsReady ())
40
+ if (!IsReady ())
41
41
ChooseAddress ();
42
42
SendPeerDiscovery ();
43
43
}
@@ -51,11 +51,18 @@ void MeshBase::Update()
51
51
uint8_t len = radio.getDynamicPayloadSize ();
52
52
uint8_t buff[40 ];
53
53
done = radio.read (buff, min (len, sizeof (buff)));
54
- if (pipe_num == 0 )
55
- {
56
- HandleMessage (0 , buff, len);
57
- } else if (pipe_num == 1 ) {
58
- HandlePeerDiscovery (buff, len);
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 ;
59
66
}
60
67
} while (!done);
61
68
}
@@ -80,22 +87,21 @@ void MeshBase::Update()
80
87
}
81
88
}
82
89
83
- void MeshBase::HandlePeerDiscovery (void * buff, uint8_t length)
90
+ void MeshBase::HandlePeerDiscovery (const MeshBase::Message* msg, const void * buff, uint8_t length)
84
91
{
85
92
if (length != sizeof (PeerDiscoveryMessage))
86
93
return ;
87
- PeerDiscoveryMessage from = *(PeerDiscoveryMessage*)buff;
88
- // Dont know why, but this keeps happening?
89
- /* if (from == 0)
90
- return;*/
94
+ const PeerDiscoveryMessage* pd = (struct PeerDiscoveryMessage *)buff;
95
+ // if (msg.protocol_version != 1)
96
+ // return;
91
97
92
- Peer* peer = GetPeer (from. address );
98
+ Peer* peer = GetPeer (msg-> address_from );
93
99
if (peer == NULL )
94
100
{
95
101
// Found a new peer
96
102
Serial.print (" New Peer: " );
97
- Serial.println (from. address , DEC);
98
- Peer* p = new Peer (from. address );
103
+ Serial.println (msg-> address_from , DEC);
104
+ Peer* p = new Peer (msg-> address_from );
99
105
peers.Add (p);
100
106
OnNewPeer (p);
101
107
} else {
@@ -107,27 +113,37 @@ void MeshBase::HandlePeerDiscovery(void* buff, uint8_t length)
107
113
void MeshBase::SendPeerDiscovery ()
108
114
{
109
115
last_broadcast_time = millis ();
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));
116
+ MeshBase::PeerDiscoveryMessage payload;
117
+ payload.protocol_version = 1 ;
118
+ payload.network_capabilities = 0 ;
119
+ payload.application_capabilities = 0 ;
120
+ payload.num_peers = peers.length ;
121
+ payload.uptime = millis () / 1000 ;
122
+ SendMessage (PEER_DISCOVERY, type_peer_discovery, &payload, sizeof (MeshBase::PeerDiscoveryMessage), true );
115
123
}
116
124
117
- void MeshBase::SendBroadcastMessage (uint32_t to, const void * data, uint8_t length)
125
+ void MeshBase::SendMessage (uint32_t to, uint8_t type, const void * data, uint8_t length, bool is_broadcast )
118
126
{
127
+ uint8_t buff[32 ];
128
+ Message* msg = (struct Message *)buff;
129
+ msg->protocol_version = 1 ;
130
+ msg->ttl = 0 ;
131
+ msg->type = type;
132
+ msg->address_from = address;
133
+ msg->split_enabled = 0 ;
134
+ msg->split_part = 0 ;
119
135
radio.stopListening ();
120
- radio.openWritingPipe (TO_BROADCAST (to));
136
+ if (is_broadcast)
137
+ radio.openWritingPipe (TO_BROADCAST (to));
138
+ else
139
+ radio.openWritingPipe (TO_ADDRESS (to));
121
140
radio.write (data, length);
122
141
radio.startListening ();
123
142
}
124
143
125
- void MeshBase::SendMessage (uint32_t to, const void * data, uint8_t length)
144
+ void MeshBase::SendMessage (uint32_t to, uint8_t type, const void * data, uint8_t length)
126
145
{
127
- radio.stopListening ();
128
- radio.openWritingPipe (TO_ADDRESS (to));
129
- radio.write (data, length);
130
- radio.startListening ();
146
+ SendMessage (to, type_user, data, length, false );
131
147
}
132
148
133
149
void MeshBase::ChooseAddress ()
0 commit comments