Browse Source

Add filament auto deplete engine for multi-material prints with MMUv2.

Marek Bel 5 years ago
parent
commit
a309ec1b0b
2 changed files with 95 additions and 0 deletions
  1. 78 0
      Firmware/AutoDeplete.cpp
  2. 17 0
      Firmware/AutoDeplete.h

+ 78 - 0
Firmware/AutoDeplete.cpp

@@ -0,0 +1,78 @@
+//! @file
+//! @author: Marek Bel
+//! @date Jan 3, 2019
+
+#include "AutoDeplete.h"
+#include "assert.h"
+
+//! @brief bit field marking depleted filaments
+//!
+//! binary 1 marks filament as depleted
+//! Zero initialized value means, that no filament is depleted.
+static uint8_t depleted;
+static const uint8_t filamentCount = 5;
+
+static constexpr uint8_t allDepleted(uint8_t fCount)
+{
+    return fCount == 1 ? 1 : ((1 << (fCount - 1)) | allDepleted(fCount - 2));
+}
+
+//! @brief Is filament available for printing?
+//! @par filament Filament number to be checked
+//! @retval true Filament is available for printing.
+//! @retval false Filament is not available for printing.
+static bool loaded(uint8_t filament)
+{
+    if (depleted & (1 << filament)) return false;
+    return true;
+}
+
+//! @brief Mark filament as not available for printing.
+//! @par filament filament to be marked
+void ad_markDepleted(uint8_t filament)
+{
+    assert(filament < filamentCount);
+    if (filament < filamentCount)
+    {
+        depleted |= 1 << filament;
+    }
+}
+
+//! @brief Mark filament as available for printing.
+//! @par filament filament to be marked
+void ad_markLoaded(uint8_t filament)
+{
+    assert(filament < filamentCount);
+    if (filament < filamentCount)
+    {
+        depleted &= ~(1 << filament);
+    }
+}
+
+//! @brief Get alternative filament, which is not depleted
+//! @par filament filament
+//! @return Filament, if it is depleted, returns next available,
+//! if all filaments are depleted, returns filament function parameter.
+uint8_t ad_getAlternative(uint8_t filament)
+{
+    assert(filament < filamentCount);
+    if (ad_allDepleted()) return filament;
+    for (uint8_t i = 0; i<filamentCount; ++i)
+    {
+        uint8_t nextFilament = (filament + i) % filamentCount;
+        if (loaded(nextFilament)) return nextFilament;
+    }
+    return filament;
+}
+
+//! @brief Are all filaments depleted?
+//! @retval true All filaments are depleted.
+//! @retval false All filaments are not depleted.
+bool ad_allDepleted()
+{
+    if (allDepleted(filamentCount) == depleted)
+    {
+        return true;
+    }
+    return false;
+}

+ 17 - 0
Firmware/AutoDeplete.h

@@ -0,0 +1,17 @@
+//! @file
+//! @author: Marek Bel
+//! @brief Filament auto deplete engine for multi-material prints with MMUv2 (Now marketed as SpoolJoin)
+//!
+//! Interface for marking MMUv2 filaments as depleted and getting alternative filament for printing.
+
+#ifndef AUTODEPLETE_H
+#define AUTODEPLETE_H
+
+#include <stdint.h>
+
+void ad_markDepleted(uint8_t filament);
+void ad_markLoaded(uint8_t filament);
+uint8_t ad_getAlternative(uint8_t filament);
+bool ad_allDepleted();
+
+#endif /* AUTODEPLETE_H */