forked from mic159/ArduinoMesh
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMeshBase.h
75 lines (62 loc) · 1.78 KB
/
MeshBase.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#ifndef MESH_BASE_H
#define MESH_BASE_H
#include <stdint.h>
#include "RF24.h"
#include "LinkedList.h"
#define PACKED __attribute__ ((packed))
class MeshBase
{
public:
MeshBase(uint8_t ce, uint8_t cs);
struct Peer {
uint32_t address;
uint16_t time;
Peer(uint32_t address) : address(address), time(0) {}
};
struct Message
{
uint8_t protocol_version : 4;
uint8_t ttl : 4;
uint8_t msg_id;
bool split_more : 1;
uint8_t split_part : 7;
uint8_t type;
uint32_t address_from;
} PACKED;
// -- Message types --
enum message_type {
type_peer_discovery,
type_peer_list,
type_user,
};
void Begin();
void Update();
void SendMessage(uint32_t address, uint8_t type, const void* data, uint8_t length);
uint32_t GetAddress() const { return address; }
bool IsReady() const { return address != 0; }
protected:
virtual void OnMessage(const MeshBase::Message* meta, const void* data, uint8_t length) = 0;
virtual void OnNewPeer(Peer*) {}
virtual void OnLostPeer(Peer*) {}
private:
uint32_t address;
RF24 radio;
unsigned long last_broadcast_time;
unsigned long last_peer_check_time;
void SendPeerDiscovery();
void SendMessage(uint32_t address, uint8_t type, const void* data, uint8_t length, bool is_broadcast);
void HandlePeerDiscovery(const Message* msg, const void* buff, uint8_t length);
void HandlePacket(const byte* data, uint8_t length);
void ChooseAddress();
LinkedList<Peer> peers;
Peer* GetPeer(uint32_t address);
struct PeerDiscoveryMessage
{
uint8_t protocol_version;
uint8_t network_capabilities; // What routing/networking can I do for the network
uint8_t application_capabilities; // What type of data do I expose
uint16_t num_peers; // Number of direct peers
uint32_t uptime; // Seconds since boot
} PACKED;
};
#endif