You've already forked Applications-LidarBot
mirror of
https://github.com/m5stack/Applications-LidarBot.git
synced 2026-05-20 10:23:34 -07:00
363 lines
11 KiB
C++
363 lines
11 KiB
C++
#include "espnow.h"
|
|
|
|
EspNow::EspNow() {
|
|
memset(&slave, 0, sizeof(slave));
|
|
}
|
|
|
|
EspNow::~EspNow() {
|
|
}
|
|
|
|
esp_now_peer_info_t EspNow::slave;
|
|
|
|
// send data
|
|
void EspNow::sendData(void *buf, int len) {
|
|
const uint8_t *peer_addr = slave.peer_addr;
|
|
// Serial.print("Sending: "); Serial.println(data);
|
|
esp_err_t result = esp_now_send(peer_addr, (uint8_t *)buf, len);
|
|
/*
|
|
Serial.print("Send Status: ");
|
|
if (result == ESP_OK) {
|
|
Serial.println("Success");
|
|
} else if (result == ESP_ERR_ESPNOW_NOT_INIT) {
|
|
// How did we get so far!!
|
|
Serial.println("ESPNOW not Init.");
|
|
} else if (result == ESP_ERR_ESPNOW_ARG) {
|
|
Serial.println("Invalid Argument");
|
|
} else if (result == ESP_ERR_ESPNOW_INTERNAL) {
|
|
Serial.println("Internal Error");
|
|
} else if (result == ESP_ERR_ESPNOW_NO_MEM) {
|
|
Serial.println("ESP_ERR_ESPNOW_NO_MEM");
|
|
} else if (result == ESP_ERR_ESPNOW_NOT_FOUND) {
|
|
Serial.println("Peer not found.");
|
|
} else {
|
|
Serial.println("Not sure what happened");
|
|
}*/
|
|
}
|
|
|
|
// Check if the slave is already paired with the master.
|
|
// If not, pair the slave with master
|
|
bool EspNow::manageSlave() {
|
|
if (slave.channel == CHANNEL) {
|
|
if (DELETEBEFOREPAIR) {
|
|
deletePeer();
|
|
}
|
|
|
|
Serial.print("Slave Status: ");
|
|
const esp_now_peer_info_t *peer = &slave;
|
|
const uint8_t *peer_addr = slave.peer_addr;
|
|
// check if the peer exists
|
|
bool exists = esp_now_is_peer_exist(peer_addr);
|
|
if (exists) {
|
|
// Slave already paired.
|
|
Serial.println("Already Paired");
|
|
return true;
|
|
} else {
|
|
// Slave not paired, attempt pair
|
|
esp_err_t addStatus = esp_now_add_peer(peer);
|
|
if (addStatus == ESP_OK) {
|
|
// Pair success
|
|
Serial.println("Pair success");
|
|
return true;
|
|
} else if (addStatus == ESP_ERR_ESPNOW_NOT_INIT) {
|
|
// How did we get so far!!
|
|
Serial.println("ESPNOW Not Init");
|
|
return false;
|
|
} else if (addStatus == ESP_ERR_ESPNOW_ARG) {
|
|
Serial.println("Invalid Argument");
|
|
return false;
|
|
} else if (addStatus == ESP_ERR_ESPNOW_FULL) {
|
|
Serial.println("Peer list full");
|
|
return false;
|
|
} else if (addStatus == ESP_ERR_ESPNOW_NO_MEM) {
|
|
Serial.println("Out of memory");
|
|
return false;
|
|
} else if (addStatus == ESP_ERR_ESPNOW_EXIST) {
|
|
Serial.println("Peer Exists");
|
|
return true;
|
|
} else {
|
|
Serial.println("Not sure what happened");
|
|
return false;
|
|
}
|
|
}
|
|
} else {
|
|
// No slave found to process
|
|
Serial.println("No Slave found to process");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void EspNow::deletePeer() {
|
|
const esp_now_peer_info_t *peer = &slave;
|
|
const uint8_t *peer_addr = slave.peer_addr;
|
|
esp_err_t delStatus = esp_now_del_peer(peer_addr);
|
|
Serial.print("Slave Delete Status: ");
|
|
if (delStatus == ESP_OK) {
|
|
// Delete success
|
|
Serial.println("Success");
|
|
} else if (delStatus == ESP_ERR_ESPNOW_NOT_INIT) {
|
|
// How did we get so far!!
|
|
Serial.println("ESPNOW Not Init");
|
|
} else if (delStatus == ESP_ERR_ESPNOW_ARG) {
|
|
Serial.println("Invalid Argument");
|
|
} else if (delStatus == ESP_ERR_ESPNOW_NOT_FOUND) {
|
|
Serial.println("Peer not found.");
|
|
} else {
|
|
Serial.println("Not sure what happened");
|
|
}
|
|
}
|
|
|
|
EspNowMaster::EspNowMaster() {
|
|
memset(peerlist.list, 0, sizeof(peerlist.list));
|
|
}
|
|
|
|
EspNowMaster::~EspNowMaster() {
|
|
}
|
|
|
|
peerList EspNowMaster::peerlist;
|
|
|
|
// broadcast every address that scanSlaveList found
|
|
void EspNowMaster::InitBroadcastSlave() {
|
|
// clear slave data
|
|
memset(&slave, 0, sizeof(slave));
|
|
for (int ii = 0; ii < 6; ++ii) {
|
|
slave.peer_addr[ii] = (uint8_t)0xff;
|
|
}
|
|
slave.channel = CHANNEL; // pick a channel
|
|
slave.encrypt = 0; // no encryption
|
|
manageSlave();
|
|
}
|
|
|
|
void EspNowMaster::Broadcast() {
|
|
if (isConnected) {
|
|
} else {
|
|
uint8_t req[] = {0xaa, 0x66};
|
|
sendData(req, 2);
|
|
}
|
|
}
|
|
|
|
void EspNowMaster::Init(void) {
|
|
WiFi.mode(WIFI_STA);
|
|
Serial.print(" MAC: ");
|
|
Serial.println(WiFi.macAddress());
|
|
|
|
WiFi.disconnect();
|
|
if (esp_now_init() == ESP_OK) {
|
|
Serial.println("ESPNow Init Success");
|
|
} else {
|
|
Serial.println("ESPNow Init Failed");
|
|
// Retry InitESPNow, add a counte and then restart?
|
|
// InitESPNow();
|
|
// or Simply Restart
|
|
ESP.restart();
|
|
}
|
|
|
|
esp_now_register_send_cb(OnDataSent);
|
|
esp_now_register_recv_cb(OnDataRecv);
|
|
// ScanForSlave();
|
|
|
|
InitBroadcastSlave();
|
|
}
|
|
|
|
int8_t EspNowMaster::isPeerExist(esp_now_peer_info_t peer) {
|
|
char macStr[18];
|
|
if (esp_now_is_peer_exist(peer.peer_addr)) {
|
|
Serial.printf("this peer is already exist\r\n");
|
|
return 1;
|
|
} else {
|
|
for (int i = 0; i < 6; i++) {
|
|
peerlist.list[peerlist.count].peer_addr[i] = peer.peer_addr[i];
|
|
// slave.peer_addr[i] = peer.peer_addr[i];
|
|
}
|
|
peerlist.count++;
|
|
esp_now_add_peer(&peer);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
bool EspNowMaster::confirmPeer(esp_now_peer_info_t peer) {
|
|
for (int i = 0; i < 6; i++) {
|
|
slave.peer_addr[i] = peer.peer_addr[i];
|
|
}
|
|
isConnected = true;
|
|
slave.channel = CHANNEL; // pick a channel
|
|
slave.encrypt = 0;
|
|
manageSlave();
|
|
return true;
|
|
}
|
|
|
|
void EspNowMaster::OnDataSent(const uint8_t *mac_addr,
|
|
esp_now_send_status_t status) {
|
|
char macStr[18];
|
|
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("Last Packet Sent to: "); Serial.println(macStr);
|
|
// Serial.print("Last Packet Send Status: "); Serial.println(status ==
|
|
// ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
|
|
|
|
if (sendCallBack != NULL) {
|
|
sendCallBack(mac_addr, status);
|
|
}
|
|
}
|
|
|
|
void EspNowMaster::OnDataRecv(const uint8_t *mac_addr, const uint8_t *data,
|
|
int data_len) {
|
|
char macStr[18];
|
|
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("Last Packet Recv from: "); Serial.println(macStr);
|
|
// Serial.print("Last Packet Recv Data: "); Serial.println(*data);
|
|
// Serial.println("");
|
|
|
|
if (data_len == 2 && data[0] == 0xaa && data[1] == 0x77) {
|
|
Serial.printf("recv slave confirm");
|
|
Serial.println(macStr);
|
|
esp_now_peer_info_t peer;
|
|
memset(&peer, 0, sizeof(peer));
|
|
for (int i = 0; i < 6; i++) {
|
|
peer.peer_addr[i] = mac_addr[i];
|
|
}
|
|
isPeerExist(peer);
|
|
}
|
|
|
|
if (recvCallBack != NULL) {
|
|
recvCallBack(mac_addr, data, data_len);
|
|
}
|
|
}
|
|
|
|
recvCB EspNowMaster::recvCallBack;
|
|
sendCB EspNowMaster::sendCallBack;
|
|
|
|
EspNowSlave::EspNowSlave() {
|
|
memset(peerlist.list, 0, sizeof(peerlist.list));
|
|
}
|
|
|
|
EspNowSlave::~EspNowSlave() {
|
|
}
|
|
|
|
void EspNowSlave::configDeviceAP() {
|
|
WiFi.mode(WIFI_AP_STA);
|
|
|
|
String mac = WiFi.softAPmacAddress();
|
|
String SSID = "Slave" + mac;
|
|
bool result =
|
|
WiFi.softAP(SSID.c_str(), "Slave_1_Password", SLAVE_CHANNEL, 0);
|
|
if (!result) {
|
|
Serial.println("AP Config failed.");
|
|
} else {
|
|
Serial.println("AP Config Success. Broadcasting with AP: " +
|
|
String(SSID));
|
|
}
|
|
}
|
|
|
|
peerList EspNowSlave::peerlist;
|
|
|
|
void EspNowSlave::Init() {
|
|
configDeviceAP();
|
|
|
|
preferences.begin("test", false);
|
|
String mac_addr;
|
|
mac_addr = preferences.getString("mac_addr", "error");
|
|
Serial.print("Slavemac_addr = ");
|
|
Serial.print(mac_addr);
|
|
|
|
WiFi.disconnect();
|
|
if (esp_now_init() == ESP_OK) {
|
|
Serial.println("ESPNow Init Success");
|
|
} else {
|
|
Serial.println("ESPNow Init Failed");
|
|
// Retry InitESPNow, add a counte and then restart?
|
|
// InitESPNow();
|
|
// or Simply Restart
|
|
ESP.restart();
|
|
}
|
|
|
|
char peer_addr[6] = {0};
|
|
memset(&slave, 0, sizeof(slave));
|
|
sscanf(mac_addr.c_str(), "%x:%x:%x:%x:%x:%x%c", &slave.peer_addr[0],
|
|
&slave.peer_addr[1], &slave.peer_addr[2], &slave.peer_addr[3],
|
|
&slave.peer_addr[4], &slave.peer_addr[5]);
|
|
|
|
for (int i = 0; i < 6; ++i) {
|
|
// slave.peer_addr[i] = (uint8_t) peer_addr[i];
|
|
Serial.printf("%x\r\n", slave.peer_addr[i]);
|
|
}
|
|
slave.channel = SLAVE_CHANNEL;
|
|
// esp_now_add_peer(&slave);
|
|
|
|
esp_now_register_send_cb(OnDataSent);
|
|
esp_now_register_recv_cb(OnDataRecv);
|
|
}
|
|
|
|
void EspNowSlave::OnDataSent(const uint8_t *mac_addr,
|
|
esp_now_send_status_t status) {
|
|
char macStr[18];
|
|
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]);
|
|
if (sendCallBack != NULL) {
|
|
sendCallBack(mac_addr, status);
|
|
}
|
|
}
|
|
|
|
void EspNowSlave::Ack(esp_now_peer_info_t peer) {
|
|
slave = peer;
|
|
slave.channel = SLAVE_CHANNEL;
|
|
slave.encrypt = 0;
|
|
slave.ifidx = WIFI_IF_AP;
|
|
isPeerExist(slave);
|
|
// Serial.println("add peer");
|
|
uint8_t ackdata[] = {0xaa, 0x77};
|
|
Serial.print("macaddress");
|
|
for (int i = 0; i < 6; i++) {
|
|
Serial.printf("%x:", slave.peer_addr[i]);
|
|
}
|
|
// Serial.println("add peer");
|
|
Serial.println();
|
|
isConnected = true;
|
|
sendData(ackdata, 2);
|
|
}
|
|
|
|
int8_t EspNowSlave::isPeerExist(esp_now_peer_info_t peer) {
|
|
char macStr[18];
|
|
if (esp_now_is_peer_exist(peer.peer_addr)) {
|
|
Serial.printf("this peer is already exist\r\n");
|
|
return 1;
|
|
} else {
|
|
for (int i = 0; i < 6; i++) {
|
|
peerlist.list[peerlist.count].peer_addr[i] = peer.peer_addr[i];
|
|
// slave.peer_addr[i] = peer.peer_addr[i];
|
|
}
|
|
peerlist.count++;
|
|
esp_now_add_peer(&peer);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void EspNowSlave::OnDataRecv(const uint8_t *mac_addr, const uint8_t *data,
|
|
int data_len) {
|
|
char macStr[18];
|
|
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]);
|
|
|
|
if (data_len == 2 && data[0] == 0xaa && data[1] == 0x66) {
|
|
Serial.println("recv aa 66");
|
|
esp_now_peer_info_t peer;
|
|
for (int i = 0; i < 6; i++) {
|
|
peer.peer_addr[i] = mac_addr[i];
|
|
}
|
|
peer.channel = SLAVE_CHANNEL; // pick a channel
|
|
peer.encrypt = 0; // no encryption
|
|
peer.ifidx = WIFI_IF_AP;
|
|
isPeerExist(peer);
|
|
}
|
|
|
|
if (recvCallBack != NULL) {
|
|
recvCallBack(mac_addr, data, data_len);
|
|
}
|
|
}
|
|
|
|
recvCB EspNowSlave::recvCallBack;
|
|
sendCB EspNowSlave::sendCallBack; |