| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 | //! @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;//! @return binary 1 for all filaments//! @par fCount number of filamentsstatic constexpr uint8_t allDepleted(uint8_t fCount){    return fCount == 1 ? 1 : ((1 << (fCount - 1)) | allDepleted(fCount - 1));}//! @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 markedvoid 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 markedvoid 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);    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;}
 |