From 75be0801c62196b1a107bc3aa7c22d99d5c75c72 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.h  |  2 ++
 3 files changed, 64 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.h b/NodeManager.h
index 321702b..0377571 100644
--- a/NodeManager.h
+++ b/NodeManager.h
@@ -12,6 +12,8 @@
 
 void printFM();
 
+void printFM();
+
 /***********************************
    Constants
 */
-- 
GitLab