AutoDeplete.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. //! @file
  2. //! @author: Marek Bel
  3. //! @date Jan 3, 2019
  4. #include "AutoDeplete.h"
  5. #include "assert.h"
  6. //! @brief bit field marking depleted filaments
  7. //!
  8. //! binary 1 marks filament as depleted
  9. //! Zero initialized value means, that no filament is depleted.
  10. static uint8_t depleted;
  11. static const uint8_t filamentCount = 5;
  12. static constexpr uint8_t allDepleted(uint8_t fCount)
  13. {
  14. return fCount == 1 ? 1 : ((1 << (fCount - 1)) | allDepleted(fCount - 2));
  15. }
  16. //! @brief Is filament available for printing?
  17. //! @par filament Filament number to be checked
  18. //! @retval true Filament is available for printing.
  19. //! @retval false Filament is not available for printing.
  20. static bool loaded(uint8_t filament)
  21. {
  22. if (depleted & (1 << filament)) return false;
  23. return true;
  24. }
  25. //! @brief Mark filament as not available for printing.
  26. //! @par filament filament to be marked
  27. void ad_markDepleted(uint8_t filament)
  28. {
  29. assert(filament < filamentCount);
  30. if (filament < filamentCount)
  31. {
  32. depleted |= 1 << filament;
  33. }
  34. }
  35. //! @brief Mark filament as available for printing.
  36. //! @par filament filament to be marked
  37. void ad_markLoaded(uint8_t filament)
  38. {
  39. assert(filament < filamentCount);
  40. if (filament < filamentCount)
  41. {
  42. depleted &= ~(1 << filament);
  43. }
  44. }
  45. //! @brief Get alternative filament, which is not depleted
  46. //! @par filament filament
  47. //! @return Filament, if it is depleted, returns next available,
  48. //! if all filaments are depleted, returns filament function parameter.
  49. uint8_t ad_getAlternative(uint8_t filament)
  50. {
  51. assert(filament < filamentCount);
  52. if (ad_allDepleted()) return filament;
  53. for (uint8_t i = 0; i<filamentCount; ++i)
  54. {
  55. uint8_t nextFilament = (filament + i) % filamentCount;
  56. if (loaded(nextFilament)) return nextFilament;
  57. }
  58. return filament;
  59. }
  60. //! @brief Are all filaments depleted?
  61. //! @retval true All filaments are depleted.
  62. //! @retval false All filaments are not depleted.
  63. bool ad_allDepleted()
  64. {
  65. if (allDepleted(filamentCount) == depleted)
  66. {
  67. return true;
  68. }
  69. return false;
  70. }