ESPNOWRadio.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "ESPNOWRadio.h"
  2. #include <esp_now.h>
  3. #include <WiFi.h>
  4. static uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  5. static esp_now_peer_info_t peerInfo;
  6. static bool is_send_complete = false;
  7. static esp_err_t last_send_result;
  8. static uint8_t rx_buf[256];
  9. static uint8_t last_rx_len = 0;
  10. // callback when data is sent
  11. static void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  12. is_send_complete = true;
  13. ESPNOW_DEBUG_PRINTLN("Send Status: %d", (int)status);
  14. }
  15. static void OnDataRecv(const uint8_t *mac, const uint8_t *data, int len) {
  16. ESPNOW_DEBUG_PRINTLN("Recv: len = %d", len);
  17. memcpy(rx_buf, data, len);
  18. last_rx_len = len;
  19. }
  20. void ESPNOWRadio::begin() {
  21. // Set device as a Wi-Fi Station
  22. WiFi.mode(WIFI_STA);
  23. // Init ESP-NOW
  24. if (esp_now_init() != ESP_OK) {
  25. ESPNOW_DEBUG_PRINTLN("Error initializing ESP-NOW");
  26. return;
  27. }
  28. esp_now_register_send_cb(OnDataSent);
  29. esp_now_register_recv_cb(OnDataRecv);
  30. // Register peer
  31. memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  32. peerInfo.channel = 0;
  33. peerInfo.encrypt = false;
  34. // Add peer
  35. if (esp_now_add_peer(&peerInfo) == ESP_OK) {
  36. ESPNOW_DEBUG_PRINTLN("init success");
  37. } else {
  38. // ESPNOW_DEBUG_PRINTLN("Failed to add peer");
  39. }
  40. }
  41. uint32_t ESPNOWRadio::intID() {
  42. uint8_t mac[8];
  43. memset(mac, 0, sizeof(mac));
  44. esp_efuse_mac_get_default(mac);
  45. uint32_t n, m;
  46. memcpy(&n, &mac[0], 4);
  47. memcpy(&m, &mac[4], 4);
  48. return n * m;
  49. }
  50. void ESPNOWRadio::startSendRaw(const uint8_t* bytes, int len) {
  51. // Send message via ESP-NOW
  52. is_send_complete = false;
  53. esp_err_t result = esp_now_send(broadcastAddress, bytes, len);
  54. if (result == ESP_OK) {
  55. ESPNOW_DEBUG_PRINTLN("Send success");
  56. } else {
  57. last_send_result = result;
  58. is_send_complete = true;
  59. ESPNOW_DEBUG_PRINTLN("Send failed: %d", result);
  60. }
  61. }
  62. bool ESPNOWRadio::isSendComplete() {
  63. return is_send_complete;
  64. }
  65. void ESPNOWRadio::onSendFinished() {
  66. }
  67. float ESPNOWRadio::getLastRSSI() const { return 0; }
  68. float ESPNOWRadio::getLastSNR() const { return 0; }
  69. int ESPNOWRadio::recvRaw(uint8_t* bytes, int sz) {
  70. int len = last_rx_len;
  71. if (last_rx_len > 0) {
  72. memcpy(bytes, rx_buf, last_rx_len);
  73. last_rx_len = 0;
  74. }
  75. return len;
  76. }
  77. uint32_t ESPNOWRadio::getEstAirtimeFor(int len_bytes) {
  78. return 2; // Fast AF
  79. }