-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathRepeaterSender.cpp
157 lines (137 loc) · 4.19 KB
/
RepeaterSender.cpp
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
//Copyright (c) Piet Wauters 2022 <[email protected]>
#include "RepeaterSender.h"
#include "network.h"
#include <iostream>
#include <Preferences.h>
#include "esp_err.h"
using namespace std;
RepeaterSender::RepeaterSender()
{
//ctor
}
RepeaterSender::~RepeaterSender()
{
//dtor
}
/*
bool addPeer(const uint8_t *peer_addr) { // add pairing
memset(&slave, 0, sizeof(slave));
const esp_now_peer_info_t *peer = &slave;
memcpy(slave.peer_addr, peer_addr, 6);
slave.channel = chan; // pick a channel
slave.encrypt = 0; // no encryption
// check if the peer exists
bool exists = esp_now_is_peer_exist(slave.peer_addr);
if (exists) {
// Slave already paired.
Serial.println("Already Paired");
return true;
}
else {
esp_err_t addStatus = esp_now_add_peer(peer);
if (addStatus == ESP_OK) {
// Pair success
Serial.println("Pair success");
return true;
}
else
{
Serial.println("Pair failed");
return false;
}
}
}
*/
// callback when data is sent
void OnDataSentMaster(const uint8_t *mac_addr, esp_now_send_status_t status) {
//char macStr[18];
//Serial.print("Packet to: ");
// Copies the sender mac address to a string
/*snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
Serial.print(macStr);
Serial.print(" send status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
*/
//if(status != ESP_NOW_SEND_SUCCESS)
}
void OnDataRecvMaster(const unsigned char * mac_addr, const uint8_t *incomingData, int len) {
/* memcpy(&m_message, incomingData, sizeof(m_message));
if(m_message.piste_ID == m_MasterPiste)
{
if(m_message.type == PAIRING_REQUEST){
}
}
*/
}
void RepeaterSender::begin()
{
// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Once ESPNow is successfully Init, we will register for Send CB to
// get the status of Trasnmitted packet
esp_now_register_send_cb(OnDataSentMaster);
uint8_t primary;
wifi_second_chan_t second;
esp_wifi_get_channel(&primary, &second);
peerInfo.channel = primary;
peerInfo.ifidx = ESP_IF_WIFI_AP;
Serial.print("Wifi channel");Serial.println(peerInfo.channel);
peerInfo.encrypt = false;
Preferences networkpreferences;
networkpreferences.begin("credentials", false);
m_message.piste_ID = networkpreferences.getInt("pisteNr", 500);
networkpreferences.end();
RegisterRepeater(m_broadcastAddress);
RegisterRepeater(m_receiverAddress);
}
void RepeaterSender::RegisterRepeater(uint8_t *broadcastAddress)
{
// Register peer
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}
}
void RepeaterSender::BroadcastHeartBeat()
{
if(millis() < TimeToNextHeartbeat)
return;
TimeToNextHeartbeat = millis() + HeartPeriod;
m_message.type = HEARTBEAT;
m_message.event = m_HeartbeatCounter++;
esp_err_t result = esp_now_send(m_broadcastAddress, (uint8_t *) &m_message, sizeof(m_message));
}
void RepeaterSender::update (FencingStateMachine *subject, uint32_t eventtype)
{
// Send message via ESP-NOW
m_message.messagenumber = currentNewMessageCount++;
m_message.event = eventtype;
m_message.type = EVENT;
//esp_err_t result = esp_now_send(m_receiverAddress, (uint8_t *) &m_message, sizeof(m_message));
esp_err_t result = esp_now_send(m_broadcastAddress, (uint8_t *) &m_message, sizeof(m_message));
m_nextResendTime = 0;
if(eventtype && MAIN_TYPE_MASK == EVENT_TIMER){
if(eventtype && DATA_BYTE0_MASK) // don't resend hundreths
m_resendCount = 0;
return;
}
if(eventtype && MAIN_TYPE_MASK == EVENT_LIGHTS)
m_resendCount = 7;
else
m_resendCount = MESSAGE_REPETITION_FACTOR;
}
void RepeaterSender::RepeatLastMessage(){
if(m_resendCount){
if(millis() > m_nextResendTime){
esp_err_t result = esp_now_send(m_broadcastAddress, (uint8_t *) &m_message, sizeof(m_message));
m_resendCount--;
m_nextResendTime = millis() + m_ResendDelta[m_resendCount];
}
}
}