From 2ceb22f26cce5544e9d3fa225dd9e3a14c7576e9 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Sat, 1 Jul 2017 19:47:11 +0200
Subject: [PATCH] Add debug statements printing out free memory

---
 MemoryFree.cpp  | 44 ++++++++++++++++++++++++++++++++++++++++++++
 MemoryFree.h    | 18 ++++++++++++++++++
 NodeManager.cpp |  7 +++++++
 NodeManager.h   |  3 +++
 4 files changed, 72 insertions(+)
 create mode 100644 MemoryFree.cpp
 create mode 100644 MemoryFree.h

diff --git a/MemoryFree.cpp b/MemoryFree.cpp
new file mode 100644
index 0000000..3e9eab9
--- /dev/null
+++ b/MemoryFree.cpp
@@ -0,0 +1,44 @@
+ #if (ARDUINO >= 100)
+#include <Arduino.h>
+#else
+#include <WProgram.h>
+#endif
+
+extern unsigned int __heap_start;
+extern void *__brkval;
+
+/*
+ * The free list structure as maintained by the 
+ * avr-libc memory allocation routines.
+ */
+struct __freelist {
+  size_t sz;
+  struct __freelist *nx;
+};
+
+/* The head of the free list structure */
+extern struct __freelist *__flp;
+
+#include "MemoryFree.h"
+
+/* Calculates the size of the free list */
+int freeListSize() {
+  struct __freelist* current;
+  int total = 0;
+  for (current = __flp; current; current = current->nx) {
+    total += 2; /* Add two bytes for the memory block's header  */
+    total += (int) current->sz;
+  }
+  return total;
+}
+
+int freeMemory() {
+  int free_memory;
+  if ((int)__brkval == 0) {
+    free_memory = ((int)&free_memory) - ((int)&__heap_start);
+  } else {
+    free_memory = ((int)&free_memory) - ((int)__brkval);
+    free_memory += freeListSize();
+  }
+  return free_memory;
+}
\ No newline at end of file
diff --git a/MemoryFree.h b/MemoryFree.h
new file mode 100644
index 0000000..3a7f2d5
--- /dev/null
+++ b/MemoryFree.h
@@ -0,0 +1,18 @@
+ // MemoryFree library based on code posted here:
+// http://forum.arduino.cc/index.php?topic=27536.msg204024#msg204024
+// Extended by Matthew Murdoch to include walking of the free list.
+
+#ifndef	MEMORY_FREE_H
+#define MEMORY_FREE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int freeMemory();
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/NodeManager.cpp b/NodeManager.cpp
index 8012987..390a69c 100755
--- a/NodeManager.cpp
+++ b/NodeManager.cpp
@@ -4,6 +4,10 @@
 
 #include "NodeManager.h"
 
+void printFM() {
+  Serial.print (F("Free memory = "));
+  Serial.println (freeMemory ());
+}
 /***************************************
    PowerManager
 */
@@ -3293,6 +3297,7 @@ void NodeManager::presentation() {
 
 // setup NodeManager
 void NodeManager::setup() {
+  Serial.print(F("NodeManager::setup: ")); printFM();
   // retrieve and store isMetric from the controller
   if (_get_controller_config) _is_metric = getControllerConfig().isMetric;
   #if DEBUG == 1
@@ -3307,9 +3312,11 @@ void NodeManager::setup() {
   // run setup for all the registered sensors
   for (int i = 1; i <= MAX_SENSORS; i++) {
     if (_sensors[i] == 0) continue;
+    Serial.print(F("NodeManager::setup: Before sensor "));Serial.print(i);printFM();
     // call each sensor's setup()
     _sensors[i]->setup();
   }
+  Serial.print(F("NodeManager::setup: END"));printFM();
 }
 
 // run the main function for all the register sensors
diff --git a/NodeManager.h b/NodeManager.h
index 8728831..2cd0f0c 100755
--- a/NodeManager.h
+++ b/NodeManager.h
@@ -5,10 +5,13 @@
 #define NodeManager_h
 
 #include <Arduino.h>
+#include "MemoryFree.h"
 
 // define NodeManager version
 #define VERSION "1.6-dev"
 
+void printFM();
+
 /***********************************
    Constants
 */
-- 
GitLab