From d88b8630e73a6fb350f0b701967f97b1b75b3b69 Mon Sep 17 00:00:00 2001
From: Moritz Perschke <moritz.perschke@uibk.ac.at>
Date: Tue, 25 Oct 2022 12:54:23 +0200
Subject: [PATCH] implemented filtering of received messages at client by type

---
 client/client/lib/espnow/src/ESPNow.cpp  | 94 +++++++++++++-----------
 client/client/lib/espnow/src/ESPNow.hpp  |  6 ++
 client/client/lib/espnow/src/Message.hpp |  3 +-
 client/client/platformio.ini             |  2 +
 client/client/src/main.cpp               |  7 +-
 host/esp32-espnow-recv/platformio.ini    |  4 +-
 host/esp32-espnow-recv/src/main.cpp      |  6 ++
 7 files changed, 74 insertions(+), 48 deletions(-)

diff --git a/client/client/lib/espnow/src/ESPNow.cpp b/client/client/lib/espnow/src/ESPNow.cpp
index 99b4abd..28eedfb 100644
--- a/client/client/lib/espnow/src/ESPNow.cpp
+++ b/client/client/lib/espnow/src/ESPNow.cpp
@@ -5,6 +5,15 @@ static const char *TAG = "ESPNOW";
 uint8_t BROADCAST_MAC[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
 esp_now_peer_info_t hostInfo;
 Preferences preferences;
+bool msg_recv = false;
+
+bool was_msg_received(){
+	if(msg_recv){
+		msg_recv = false;
+		return true;
+	}
+	return false;
+}
 
 void get_host_mac(uint8_t *destination)
 {
@@ -17,6 +26,16 @@ void get_host_mac(uint8_t *destination)
 	}
 	preferences.end();
 }
+
+esp_err_t add_host_to_peers(config received){
+	esp_now_peer_info_t host;
+	memset(&host, 0, sizeof(host));
+	memcpy(host.peer_addr, received.host, sizeof(received.host));
+	host.encrypt = false;
+	host.channel = 0;
+	return esp_now_add_peer(&host);
+}
+
 void on_data_sent(const uint8_t *mac_addr, esp_now_send_status_t status)
 {
 	ESP_LOGE(TAG, "Message sent to");
@@ -28,60 +47,49 @@ void on_data_sent(const uint8_t *mac_addr, esp_now_send_status_t status)
 	// go to sleep
 }
 
-bool are_mac_addresses_equal(uint8_t first_mac[], uint8_t second_mac[]){
-	bool result = true;
-	for(int i=0; i<6; i++){
-		result && (first_mac[i] == second_mac[i]);
-	}
-	return result;
-}
-
 void on_data_recv(const uint8_t *mac, const uint8_t *incomingData, int len)
 {
+	// is msg host -> yes -> set bool
+	// assume host change not happening, rare event
+	// => on host change, broadcast 
 	ESP_LOGE(TAG, "Message recieved");
 	preferences.begin("config", false);
-	config new_config;
-	memcpy(&new_config, incomingData, sizeof(new_config)); // TODO: check for valid mac
-														  // all the esp32 macs so far use the same first 3(?) bytes so maybe use that
-
-	uint8_t stored[6];
-	preferences.getBytes("host", stored, sizeof(uint8_t) * 6);
-
-	// put the host address in flash mem
-	// this does not work as long as we don't know whether a message was received
-	// save received host address if there is none saved or received one is different than before
-	if (!preferences.isKey("host") || !are_mac_addresses_equal(stored, new_config.host)) {
-		preferences.putBytes("host", new_config.host, sizeof(new_config.host));
-		ESP_LOGI(TAG, "host MAC address saved to flash");
-
-		// add host to peers
-		esp_now_peer_info_t host;
-		memset(&host, 0, sizeof(host));
-		memcpy(host.peer_addr, new_config.host, sizeof(new_config.host));
-		host.encrypt = false;
-		host.channel = 0;
-		if(esp_now_add_peer(&host) != ESP_OK){
-			ESP_LOGE(TAG, "Adding host to peers failed");
+	config received_msg;
+	memcpy(&received_msg, incomingData, sizeof(received_msg)); // TODO: check for valid mac
+														  // all the esp32 macs so far use the same first 3(?) bytes so maybe use that	
+	switch (received_msg.type){
+		case dataAck:{
+			msg_recv = true;
+			Time::getInstance().setTime(
+			received_msg.epoch_seconds); // see https://www.esp32.com/viewtopic.php?t=9965, maybe this needs an offset
+			Serial.println(Time::getInstance().getEpochSeconds());
+			if (!preferences.isKey("host")) {
+			preferences.putBytes("host", received_msg.host, sizeof(received_msg.host));
+			ESP_LOGI(TAG, "host MAC address saved to flash");
+
+			// add host to peers
+			add_host_to_peers(received_msg);
+			}
 		}
-
-		if(!are_mac_addresses_equal(stored, new_config.host)){
-			esp_now_del_peer(stored);
+		case hostChange:{
+			Time::getInstance().setTime(received_msg.epoch_seconds);
+			// delete old host
+			if(preferences.isKey("host")){
+				uint8_t old[6];
+				get_host_mac(old);
+				esp_now_del_peer(old);
+			}
+			// add new host
+			add_host_to_peers(received_msg);
 		}
-
-	} // changed Oct. 24th: now has the capability to change the mac in flash
-	else{
-		uint8_t stored[6];
-		preferences.getBytes("host", stored, sizeof(uint8_t) * 6);
-		if(!are_mac_addresses_equal(stored, new_config.host)){
-
+		default:{
+			return;
 		}
 	}
 	preferences.end();
-	// sync time
-	Time::getInstance().setTime(
-	    new_config.epoch_seconds); // see https://www.esp32.com/viewtopic.php?t=9965, maybe this needs an offset
 }
 
+
 esp_err_t espnow_setup()
 {
 	esp_err_t result;
diff --git a/client/client/lib/espnow/src/ESPNow.hpp b/client/client/lib/espnow/src/ESPNow.hpp
index df22899..266b139 100644
--- a/client/client/lib/espnow/src/ESPNow.hpp
+++ b/client/client/lib/espnow/src/ESPNow.hpp
@@ -11,7 +11,12 @@
 #include <WiFi.h>
 #include <esp_now.h>
 
+enum MessageType{
+    dataAck,
+    hostChange
+};
 typedef struct config {
+	MessageType type;
 	uint8_t host[6];
 	long epoch_seconds;
 } config;
@@ -19,6 +24,7 @@ typedef struct config {
 esp_err_t espnow_setup();
 //esp_err_t espnow_send_message(const Message& message);
 bool is_host_defined();
+bool was_msg_received();
 void get_host_mac(uint8_t *destination);
 void on_data_sent(const uint8_t *mac_addr, esp_now_send_status_t status);
 void on_data_recv(const uint8_t *mac, const uint8_t *incomingData, int len);
diff --git a/client/client/lib/espnow/src/Message.hpp b/client/client/lib/espnow/src/Message.hpp
index 3711df2..5a6ca81 100644
--- a/client/client/lib/espnow/src/Message.hpp
+++ b/client/client/lib/espnow/src/Message.hpp
@@ -23,4 +23,5 @@ class Message {
   private:
 	ClientDataPackage clientDataPackage;
 	uint8_t recipient[6]{};
-};
\ No newline at end of file
+};
+
diff --git a/client/client/platformio.ini b/client/client/platformio.ini
index 28cc58c..19ee957 100644
--- a/client/client/platformio.ini
+++ b/client/client/platformio.ini
@@ -20,6 +20,8 @@ build_flags =
 	-DCORE_DEBUG_LEVEL=5
 	-std=gnu++17
 build_unflags = -std=gnu++11
+monitor_port = /dev/ttyUSB0
+upload_port = /dev/ttyUSB0
 lib_deps =
 	sparkfun/SparkFun SCD30 Arduino Library@^1.0.18
 	Wire
diff --git a/client/client/src/main.cpp b/client/client/src/main.cpp
index b3fa613..c03886c 100644
--- a/client/client/src/main.cpp
+++ b/client/client/src/main.cpp
@@ -6,6 +6,7 @@
 #include <drs26.hpp>
 #include <ina219.hpp>
 #include <scd30.hpp>
+#include "ESPNow.hpp"
 // #include "esp32-hal-log.h"
 static const std::string TAG = "MAIN";
 
@@ -35,8 +36,10 @@ void loop()
 			if(message.send() != ESP_OK){
 				RtcMemory::store(message.getMessageAsMinifiedJsonString());
 			}
-			// some sort of if(message received) is needed as well
-			// String test = RtcMemory::get_from_storage();
+			delay(5000);
+			if(!was_msg_received()){
+				RtcMemory::store(message.getMessageAsMinifiedJsonString());
+			}
 		}
 
 	} catch (const NoDataAvailableException &e) {
diff --git a/host/esp32-espnow-recv/platformio.ini b/host/esp32-espnow-recv/platformio.ini
index 808a5bb..73a15dd 100644
--- a/host/esp32-espnow-recv/platformio.ini
+++ b/host/esp32-espnow-recv/platformio.ini
@@ -13,8 +13,8 @@ platform = espressif32
 board = esp32-c3-devkitm-1
 monitor_speed = 115200
 framework = arduino
-; monitor_port = /dev/ttyUSB1
-; upload_port = /dev/ttyUSB1
+monitor_port = /dev/ttyUSB1
+upload_port = /dev/ttyUSB1
 build_flags =
     -I include
     -DCORE_DEBUG_LEVEL=5
diff --git a/host/esp32-espnow-recv/src/main.cpp b/host/esp32-espnow-recv/src/main.cpp
index b9a1f09..61baf52 100644
--- a/host/esp32-espnow-recv/src/main.cpp
+++ b/host/esp32-espnow-recv/src/main.cpp
@@ -13,7 +13,12 @@ long time1 = 0;
 
 //SoftwareSerial mySerial(RXD2, TXD2);
 
+enum MessageType{
+    dataAck,
+    hostChange
+};
 typedef struct response{
+	MessageType type;
 	uint8_t mac[6];
 	long time;
 }response;
@@ -62,6 +67,7 @@ void on_data_recv(const uint8_t *mac, const uint8_t *incomingData, int len)
 
 	// respond with own mac + time
 	response response;
+	response.type = dataAck;
 	esp_read_mac(response.mac, ESP_MAC_WIFI_STA);
 	response.time = 7 * time1++;
 	esp_err_t success = esp_now_send(mac, (uint8_t *) &response, sizeof(response));
-- 
GitLab