ChangeFieldOnFinishTransition.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <ChangeFieldOnFinishTransition.h>
  2. #include <MiLightStatus.h>
  3. ChangeFieldOnFinishTransition::Builder::Builder(
  4. size_t id,
  5. GroupStateField field,
  6. uint16_t arg,
  7. std::shared_ptr<Transition::Builder> delegate
  8. )
  9. : Transition::Builder(delegate->id, delegate->bulbId, delegate->callback)
  10. , delegate(delegate)
  11. , field(field)
  12. , arg(arg)
  13. { }
  14. std::shared_ptr<Transition> ChangeFieldOnFinishTransition::Builder::_build() const {
  15. delegate->setDurationRaw(this->getOrComputeDuration());
  16. delegate->setNumPeriods(this->getOrComputeNumPeriods());
  17. delegate->setPeriod(this->getOrComputePeriod());
  18. return std::make_shared<ChangeFieldOnFinishTransition>(
  19. delegate->build(),
  20. field,
  21. arg,
  22. delegate->getPeriod()
  23. );
  24. }
  25. ChangeFieldOnFinishTransition::ChangeFieldOnFinishTransition(
  26. std::shared_ptr<Transition> delegate,
  27. GroupStateField field,
  28. uint16_t arg,
  29. size_t period
  30. ) : Transition(delegate->id, delegate->bulbId, period, delegate->callback)
  31. , delegate(delegate)
  32. , field(field)
  33. , arg(arg)
  34. , changeSent(false)
  35. { }
  36. bool ChangeFieldOnFinishTransition::isFinished() {
  37. return delegate->isFinished() && changeSent;
  38. }
  39. void ChangeFieldOnFinishTransition::step() {
  40. if (! delegate->isFinished()) {
  41. delegate->step();
  42. } else {
  43. callback(bulbId, field, arg);
  44. changeSent = true;
  45. }
  46. }
  47. void ChangeFieldOnFinishTransition::childSerialize(JsonObject& json) {
  48. json[F("type")] = F("change_on_finish");
  49. json[F("field")] = GroupStateFieldHelpers::getFieldName(field);
  50. json[F("value")] = arg;
  51. JsonObject child = json.createNestedObject(F("child"));
  52. delegate->childSerialize(child);
  53. }