Browse Source

code cleanup

pull/2568/head
Christos Themelis 5 months ago
parent
commit
e9685941a5
  1. 179
      src/helpers/esp32/ESPNOWRadio.cpp
  2. 1
      variants/elecrow_espnow/platformio.ini

179
src/helpers/esp32/ESPNOWRadio.cpp

@ -3,84 +3,94 @@
#include <WiFi.h> #include <WiFi.h>
#include <esp_wifi.h> #include <esp_wifi.h>
static constexpr uint16_t BRIDGE_PACKET_MAGIC = 0xC03E; #ifdef CLIENT_WITHOUT_LORA
static const size_t MAX_ESPNOW_PACKET_SIZE = 250; static constexpr uint16_t BRIDGE_PACKET_MAGIC = 0xC03E;
/** static const size_t MAX_ESPNOW_PACKET_SIZE = 250;
* @brief Common field sizes used by bridge implementations /**
* * @brief Common field sizes used by bridge implementations
* These constants define the size of common packet fields used across bridges. *
* BRIDGE_MAGIC_SIZE is used by all bridges for packet identification. * These constants define the size of common packet fields used across bridges.
* BRIDGE_LENGTH_SIZE is used by bridges that need explicit length fields (like RS232). * BRIDGE_MAGIC_SIZE is used by all bridges for packet identification.
* BRIDGE_CHECKSUM_SIZE is used by all bridges for Fletcher-16 checksums. * BRIDGE_LENGTH_SIZE is used by bridges that need explicit length fields (like RS232).
*/ * BRIDGE_CHECKSUM_SIZE is used by all bridges for Fletcher-16 checksums.
static constexpr uint16_t BRIDGE_MAGIC_SIZE = sizeof(BRIDGE_PACKET_MAGIC); */
static constexpr uint16_t BRIDGE_LENGTH_SIZE = sizeof(uint16_t); static constexpr uint16_t BRIDGE_MAGIC_SIZE = sizeof(BRIDGE_PACKET_MAGIC);
static constexpr uint16_t BRIDGE_CHECKSUM_SIZE = sizeof(uint16_t); static constexpr uint16_t BRIDGE_LENGTH_SIZE = sizeof(uint16_t);
static constexpr uint16_t BRIDGE_CHECKSUM_SIZE = sizeof(uint16_t);
static uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
static esp_now_peer_info_t peerInfo; static uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
static volatile bool is_send_complete = false; static esp_now_peer_info_t peerInfo;
static esp_err_t last_send_result; static volatile bool is_send_complete = false;
static uint8_t rx_buf[256]; static esp_err_t last_send_result;
static uint8_t last_rx_len = 0; static uint8_t rx_buf[256];
static char bridge_secret[16]; static uint8_t last_rx_len = 0;
static char bridge_secret[16];
static void xorCrypt(uint8_t *data, size_t len) {
size_t keyLen = strlen(bridge_secret);
for (size_t i = 0; i < len; i++) {
data[i] ^= bridge_secret[i % keyLen];
}
}
// callback when data is sent static uint16_t fletcher16(const uint8_t *data, size_t len) {
static void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { uint8_t sum1 = 0, sum2 = 0;
is_send_complete = true;
ESPNOW_DEBUG_PRINTLN("Send Status: %d", (int)status);
}
static void xorCrypt(uint8_t *data, size_t len) { for (size_t i = 0; i < len; i++) {
size_t keyLen = strlen(bridge_secret); sum1 = (sum1 + data[i]) % 255;
for (size_t i = 0; i < len; i++) { sum2 = (sum2 + sum1) % 255;
data[i] ^= bridge_secret[i % keyLen]; }
}
}
static uint16_t fletcher16(const uint8_t *data, size_t len) { return (sum2 << 8) | sum1;
uint8_t sum1 = 0, sum2 = 0; }
for (size_t i = 0; i < len; i++) { static bool validateChecksum(const uint8_t *data, size_t len, uint16_t received_checksum) {
sum1 = (sum1 + data[i]) % 255; uint16_t calculated_checksum = fletcher16(data, len);
sum2 = (sum2 + sum1) % 255; return received_checksum == calculated_checksum;
} }
return (sum2 << 8) | sum1; #endif
}
static bool validateChecksum(const uint8_t *data, size_t len, uint16_t received_checksum) { // callback when data is sent
uint16_t calculated_checksum = fletcher16(data, len); static void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
return received_checksum == calculated_checksum; is_send_complete = true;
ESPNOW_DEBUG_PRINTLN("Send Status: %d", (int)status);
} }
static void OnDataRecv(const uint8_t *mac, const uint8_t *data, int len) { static void OnDataRecv(const uint8_t *mac, const uint8_t *data, int len) {
ESPNOW_DEBUG_PRINTLN("Recv: len = %d", len); ESPNOW_DEBUG_PRINTLN("Recv: len = %d", len);
if (len < 4) return; #ifdef CLIENT_WITHOUT_LORA
if (len < 4) return;
uint16_t magic = (data[0] << 8) | data[1]; uint16_t magic = (data[0] << 8) | data[1];
if (magic != BRIDGE_PACKET_MAGIC) return; if (magic != BRIDGE_PACKET_MAGIC) return;
uint8_t decrypted[MAX_ESPNOW_PACKET_SIZE]; uint8_t decrypted[MAX_ESPNOW_PACKET_SIZE];
int encLen = len - 2; // everything except magic int encLen = len - 2; // everything except magic
memcpy(decrypted, data + 2, encLen); memcpy(decrypted, data + 2, encLen);
xorCrypt(decrypted, encLen); xorCrypt(decrypted, encLen);
uint16_t rx_cksum = (decrypted[0] << 8) | decrypted[1]; uint16_t rx_cksum = (decrypted[0] << 8) | decrypted[1];
uint8_t* meshPayload = decrypted + 2; uint8_t* meshPayload = decrypted + 2;
int meshLen = encLen - 2; int meshLen = encLen - 2;
if (!validateChecksum(meshPayload, meshLen, rx_cksum)) return; if (!validateChecksum(meshPayload, meshLen, rx_cksum)) return;
memcpy(rx_buf, meshPayload, meshLen); memcpy(rx_buf, meshPayload, meshLen);
last_rx_len = meshLen; last_rx_len = meshLen;
#else
memcpy(rx_buf, data, len);
last_rx_len = len;
#endif
} }
void ESPNOWRadio::init() { void ESPNOWRadio::init() {
// Set device as a Wi-Fi Station // Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
strncpy(bridge_secret, "LVSITANOS", sizeof(bridge_secret)); #ifdef CLIENT_WITHOUT_LORA
strncpy(bridge_secret, "LVSITANOS", sizeof(bridge_secret));
#endif
// Long Range mode // Long Range mode
esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_LR); esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_LR);
@ -127,42 +137,39 @@ uint32_t ESPNOWRadio::intID() {
bool ESPNOWRadio::startSendRaw(const uint8_t* bytes, int len) { bool ESPNOWRadio::startSendRaw(const uint8_t* bytes, int len) {
// Send message via ESP-NOW // Send message via ESP-NOW
is_send_complete = false; #ifdef CLIENT_WITHOUT_LORA
if (!bytes || len <= 0) { if (!bytes || len <= 0) {
Serial.println("Invalid raw mesh packet"); ESPNOW_DEBUG_PRINTLN("Invalid raw mesh packet");
return false; return false;
} }
if (len > (MAX_ESPNOW_PACKET_SIZE - 4)) { if (len > (MAX_ESPNOW_PACKET_SIZE - 4)) {
Serial.println("Mesh packet too large for ESP-NOW"); ESPNOW_DEBUG_PRINTLN("Mesh packet too large for ESP-NOW");
return false; return false;
} }
uint8_t out[MAX_ESPNOW_PACKET_SIZE]; uint8_t out[MAX_ESPNOW_PACKET_SIZE];
out[0] = (BRIDGE_PACKET_MAGIC >> 8) & 0xFF;
// 1) magic out[1] = BRIDGE_PACKET_MAGIC & 0xFF;
out[0] = (BRIDGE_PACKET_MAGIC >> 8) & 0xFF;
out[1] = BRIDGE_PACKET_MAGIC & 0xFF; uint16_t cksum = fletcher16(bytes, len);
out[2] = (cksum >> 8) & 0xFF;
// 2) checksum (πάνω στο raw mesh packet) out[3] = cksum & 0xFF;
uint16_t cksum = fletcher16(bytes, len);
out[2] = (cksum >> 8) & 0xFF; memcpy(out + 4, bytes, len);
out[3] = cksum & 0xFF; xorCrypt(out + 2, len + 2);
esp_err_t result = esp_now_send(broadcastAddress, out, len + 4);
// 3) payload = raw mesh packet #else
memcpy(out + 4, bytes, len); is_send_complete = false;
esp_err_t result = esp_now_send(broadcastAddress, bytes, len);
// 4) encrypt checksum + payload #endif
xorCrypt(out + 2, len + 2);
// 5) send via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, out, len + 4);
if (result == ESP_OK) { if (result == ESP_OK) {
n_sent++; n_sent++;
ESPNOW_DEBUG_PRINTLN("Send success"); ESPNOW_DEBUG_PRINTLN("Send success");
return true; return true;
} }
last_send_result = result; last_send_result = result;
is_send_complete = true; is_send_complete = true;
ESPNOW_DEBUG_PRINTLN("Send failed: %d", result); ESPNOW_DEBUG_PRINTLN("Send failed: %d", result);

1
variants/elecrow_espnow/platformio.ini

@ -28,6 +28,7 @@ build_flags =
-D LV_CONF_PATH=lv_conf.h -D LV_CONF_PATH=lv_conf.h
-D ELECROW_DISPLAY_50 -D ELECROW_DISPLAY_50
-D USE_MODULE_SWITCHES -D USE_MODULE_SWITCHES
-D CLIENT_WITHOUT_LORA
-D ADVERT_NAME='"Elecrow Terminal"' -D ADVERT_NAME='"Elecrow Terminal"'
-D MAX_CONTACTS=350 -D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8

Loading…
Cancel
Save