From 7ce2815c5323179d845d9b377a2277daf0d8e46e Mon Sep 17 00:00:00 2001
From: Markus Rampp <markus.rampp@uibk.ac.at>
Date: Fri, 30 Dec 2022 11:50:55 +0100
Subject: [PATCH] fixed horrible espnow sending implementation +more

---
 .gitignore                           |   3 +
 client/client_satellite/src/main.cpp | 212 +++++++++++++--------------
 2 files changed, 106 insertions(+), 109 deletions(-)

diff --git a/.gitignore b/.gitignore
index a40814f..c570582 100644
--- a/.gitignore
+++ b/.gitignore
@@ -293,3 +293,6 @@ node_modules/
 
 CMakeLists.txt
 CmakeListsPrivate.txt
+forte.code-workspace
+client/client_satellite/.vscode/extensions.json
+client/client_satellite/.vscode/settings.json
diff --git a/client/client_satellite/src/main.cpp b/client/client_satellite/src/main.cpp
index 595b8b8..0122838 100644
--- a/client/client_satellite/src/main.cpp
+++ b/client/client_satellite/src/main.cpp
@@ -1,124 +1,118 @@
-#include "dr26.hpp"
+#include "ESPNow.hpp"
+#include "LC709203F.h"
 #include "NoDataAvailableException.hpp"
+#include "dr26.hpp"
 #include "f_deep_sleep.hpp"
 #include <Arduino.h>
-#include "ESPNow.hpp"
-#include "LC709203F.h"
 
-// FIXME: Use descriptive names for the constants below.
-LC709203F gg;
-static const std::string TAG = "MAIN";
+// Execution time:
+// FIXME: Boot: needs to be measured with oscilloscope and optimised. should be around a few hundres ms, can be <100ms
+// https://github.com/makermoekoe/Picoclick-C3#speed-up-boot-process
+// Part				[ms]
+// First setup: 	 150 
+// Data aquisition:  500
+// ESPNow setup: 	 220
+// Sending 			1200
+// TOTAL: 			2200
 
 static const char *TAG = "MAIN";
 
+LC709203F battery_monitor;
+
+ForteDR26 dr26_channel0;
 ForteDR26 dr26_channel3;
 ForteDR26 dr26_channel1;
 ForteDR26 dr26_channel2;
-ForteDR26 dr26_channel0_power;
 
-void setup() {
-    Serial.begin(115200);
-    //Set the GPIO which conrtols the step up to OUTPUT
-    gpio_set_direction(GPIO_NUM_32, GPIO_MODE_OUTPUT);
-
-    gg.begin();
-    gg.setCellCapacity(LC709203F_APA_1000MAH);
-
-
-    DeepSleep::print_wakeup_reason();
-    DeepSleep::bootCount++;
+void send_msgs(const std::__cxx11::list<Message> msgs)
+{
+	for (const Message &msg : msgs) {
+
+		if (msg.send() != ESP_OK) {
+			RtcMemory::store(msg.getMessageAsMinifiedJsonString());
+		}
+		unsigned long ts = millis();
+		// it takes ~110ms for receiving an acknowledgement by the host in perfect conditions
+		uint16_t message_timeout = 2000;
+		while (!was_msg_received()) {
+			if ((millis() - ts) > message_timeout) {
+				RtcMemory::store(msg.getMessageAsMinifiedJsonString());
+				ESP_LOGE(TAG, "Timeout: Host not available\n");
+				break;
+			}
+		}
+		ESP_LOGD(TAG, "Time until acknowledgement: %ld", millis() - ts);
+	}
+}
+// one loop takes ~2200 ms
+void setup()
+{
+	unsigned long ts = millis();
+	Serial.begin(115200);
+	// Set the GPIO which conrtols the step up to OUTPUT
+	gpio_set_direction(GPIO_NUM_32, GPIO_MODE_OUTPUT);
+
+	// blinking led for debug
+	// gpio_set_direction(GPIO_NUM_17, GPIO_MODE_OUTPUT);
+	// gpio_set_level(GPIO_NUM_17, 1);
+
+	battery_monitor.begin();
+
+	DeepSleep::print_wakeup_reason();
+	DeepSleep::bootCount++;
 	ESP_LOGD(TAG, "Boot number: %d", DeepSleep::bootCount);
 
-    gpio_set_level(GPIO_NUM_32, 1);
-    dr26_channel1.setup();
-    dr26_channel3.setChannel(3);
-    dr26_channel1.setChannel(1);
-    dr26_channel2.setChannel(2);
-    dr26_channel0_power.setChannel(0);
-    gpio_set_level(GPIO_NUM_32, 0);
-
-    espnow_setup();
-    //	log_e("Setup complete.");
+	gpio_set_level(GPIO_NUM_32, 1);
+	// delay(100);
+	dr26_channel1.setup();
+	dr26_channel0.setChannel(0);
+	dr26_channel1.setChannel(1);
+	dr26_channel2.setChannel(2);
+	dr26_channel3.setChannel(3);
+
+	ESP_LOGD(TAG, "Setup took %ld ms", millis() - ts);
+
+	try {
+		// FIXME: put me into seperate trys? No data will be sent when 1 exception occurs
+
+		ts = millis();
+		auto messages0 = dr26_channel0.buildMessages();
+		auto messages1 = dr26_channel1.buildMessages();
+		auto messages2 = dr26_channel2.buildMessages();
+		auto messages3 = dr26_channel3.buildMessages();
+		auto messages4 = battery_monitor.buildMessages();
+		// roughly takes 500ms, ~120ms for each adc channel, barely anything for battery monitor
+		ESP_LOGD(TAG, "Reading data and building messages took %ld ms", millis() - ts);
+		gpio_set_level(GPIO_NUM_32, 0);
+
+		// FIXME: put this outside the try loop?
+		ts = millis();
+		espnow_setup();
+		ESP_LOGD(TAG, "EPSNow setup took %ld ms", millis() - ts);
+		ts = millis();
+		send_msgs(messages0);
+		send_msgs(messages1);
+		send_msgs(messages2);
+		send_msgs(messages3);
+		send_msgs(messages4);
+		// roughly takes 3s in ideal conditions
+		ESP_LOGD(TAG, "Sending messages took %ld ms", millis() - ts);
+
+	} catch (const NoDataAvailableException &e) {
+		std::cerr << e.what() << '\n';
+	}
+	// just to be safe in case exception happens above
+	gpio_set_level(GPIO_NUM_32, 0);
+	// keep it in deep sleep
+	gpio_hold_en((gpio_num_t)GPIO_NUM_32);
+
+	battery_monitor.setPowerMode(LC709203F_POWER_SLEEP);
+	// battery protection: go to deep sleep for unlimited time when voltage less than 3.2V
+	if (battery_monitor.cellVoltage_mV() > 3200) {
+		DeepSleep::deep_sleep(10 * 60);
+	} else {
+		esp_deep_sleep_start();
+	}
 }
 
-void loop() {
-    gpio_set_level(GPIO_NUM_32, 1);
-    Serial.println(
-            "***********************1-DRS26 NOT YET CONNECTED**********************************");
-    Serial.println(dr26_channel1.readData(), 5);
-    Serial.println("***********************2-DRS26**********************************");
-    Serial.println(dr26_channel2.readData(), 5);
-    Serial.println("***********************3-DRS26 *********************************");
-    Serial.println(dr26_channel3.readData(), 5);
-
-
-    Serial.println("***********************0-Voltage-Battery**********************************");
-    dr26_channel3.changeGain(GAIN_TWOTHIRDS);
-    Serial.println(dr26_channel0_power.readData(), 5);
-
-    Serial.println("***********************REAL-Voltage-Battery**********************************");
-    Serial.println(gg.cellVoltage_mV() / 1000.0);
-
-    try {
-
-        auto messages = dr26_channel0_power.buildMessages();
-
-
-        for (const Message &message: messages) {
-            if (message.send() != ESP_OK) {
-                RtcMemory::store(message.getMessageAsMinifiedJsonString());
-            }
-            delay(5000);
-            if (!was_msg_received()) {
-                RtcMemory::store(message.getMessageAsMinifiedJsonString());
-            }
-        }
-
-        dr26_channel3.changeGain(GAIN_ONE);
-        auto messages2 = dr26_channel1.buildMessages(1, "CIRCUMFERENCE_INCREMENT");
-
-        for (const Message &message2: messages2) {
-            if (message2.send() != ESP_OK) {
-                RtcMemory::store(message2.getMessageAsMinifiedJsonString());
-            }
-            delay(5000);
-            if (!was_msg_received()) {
-                RtcMemory::store(message2.getMessageAsMinifiedJsonString());
-            }
-        }
-
-        auto messages3 = dr26_channel2.buildMessages(2, "CIRCUMFERENCE_INCREMENT");
-
-        for (const Message &message3: messages3) {
-            if (message3.send() != ESP_OK) {
-                RtcMemory::store(message3.getMessageAsMinifiedJsonString());
-            }
-            delay(5000);
-            if (!was_msg_received()) {
-                RtcMemory::store(message3.getMessageAsMinifiedJsonString());
-            }
-        }
-
-        auto messages4 = gg.buildMessages();
-        for (const Message &message4: messages4) {
-            if (message4.send() != ESP_OK) {
-                RtcMemory::store(message4.getMessageAsMinifiedJsonString());
-            }
-            delay(5000);
-            if (!was_msg_received()) {
-                RtcMemory::store(message4.getMessageAsMinifiedJsonString());
-            }
-        }
-
-
-    } catch (const NoDataAvailableException &e) {
-        std::cerr << e.what() << '\n';
-    }
-
-
-    Serial.print("This device: ");
-    Serial.println("\n");
-    gpio_set_level(GPIO_NUM_32, 0);
-    delay(5000);
-    DeepSleep::deep_sleep(100);
-}
+void loop() {}
\ No newline at end of file
-- 
GitLab