Add filament auto deplete engine for multi-material prints with MMUv2.
This commit is contained in:
parent
d1ca73597b
commit
a309ec1b0b
78
Firmware/AutoDeplete.cpp
Normal file
78
Firmware/AutoDeplete.cpp
Normal file
@ -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
Firmware/AutoDeplete.h
Normal file
17
Firmware/AutoDeplete.h
Normal file
@ -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 */
|
Loading…
Reference in New Issue
Block a user