TransitionController.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include <Transition.h>
  2. #include <FieldTransition.h>
  3. #include <ColorTransition.h>
  4. #include <GroupStateField.h>
  5. #include <TransitionController.h>
  6. #include <LinkedList.h>
  7. #include <functional>
  8. using namespace std::placeholders;
  9. TransitionController::TransitionController()
  10. : callback(std::bind(&TransitionController::transitionCallback, this, _1, _2, _3))
  11. , currentId(0)
  12. { }
  13. void TransitionController::clearListeners() {
  14. observers.clear();
  15. }
  16. void TransitionController::addListener(Transition::TransitionFn fn) {
  17. observers.push_back(fn);
  18. }
  19. std::shared_ptr<Transition::Builder> TransitionController::buildColorTransition(const BulbId& bulbId, const ParsedColor& start, const ParsedColor& end) {
  20. return std::make_shared<ColorTransition::Builder>(
  21. currentId++,
  22. bulbId,
  23. callback,
  24. start,
  25. end
  26. );
  27. }
  28. std::shared_ptr<Transition::Builder> TransitionController::buildFieldTransition(const BulbId& bulbId, GroupStateField field, uint16_t start, uint16_t end) {
  29. return std::make_shared<FieldTransition::Builder>(
  30. currentId++,
  31. bulbId,
  32. callback,
  33. field,
  34. start,
  35. end
  36. );
  37. }
  38. void TransitionController::addTransition(std::shared_ptr<Transition> transition) {
  39. activeTransitions.add(transition);
  40. }
  41. void TransitionController::transitionCallback(const BulbId& bulbId, GroupStateField field, uint16_t arg) {
  42. for (auto it = observers.begin(); it != observers.end(); ++it) {
  43. (*it)(bulbId, field, arg);
  44. }
  45. }
  46. void TransitionController::clear() {
  47. activeTransitions.clear();
  48. }
  49. void TransitionController::loop() {
  50. auto current = activeTransitions.getHead();
  51. while (current != nullptr) {
  52. auto next = current->next;
  53. Transition& t = *current->data;
  54. t.tick();
  55. if (t.isFinished()) {
  56. activeTransitions.remove(current);
  57. }
  58. current = next;
  59. }
  60. }
  61. ListNode<std::shared_ptr<Transition>>* TransitionController::getTransitions() {
  62. return activeTransitions.getHead();
  63. }
  64. ListNode<std::shared_ptr<Transition>>* TransitionController::findTransition(size_t id) {
  65. auto current = getTransitions();
  66. while (current != nullptr) {
  67. if (current->data->id == id) {
  68. return current;
  69. }
  70. current = current->next;
  71. }
  72. return nullptr;
  73. }
  74. Transition* TransitionController::getTransition(size_t id) {
  75. auto node = findTransition(id);
  76. if (node == nullptr) {
  77. return nullptr;
  78. } else {
  79. return node->data.get();
  80. }
  81. }
  82. bool TransitionController::deleteTransition(size_t id) {
  83. auto node = findTransition(id);
  84. if (node == nullptr) {
  85. return false;
  86. } else {
  87. activeTransitions.remove(node);
  88. return true;
  89. }
  90. }