FieldTransition.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include <FieldTransition.h>
  2. #include <cmath>
  3. #include <algorithm>
  4. FieldTransition::Builder::Builder(size_t id, const BulbId& bulbId, TransitionFn callback, GroupStateField field, uint16_t start, uint16_t end)
  5. : Transition::Builder(id, bulbId, callback)
  6. , stepSize(0)
  7. , field(field)
  8. , start(start)
  9. , end(end)
  10. { }
  11. std::shared_ptr<Transition> FieldTransition::Builder::_build() const {
  12. size_t duration = getOrComputeDuration();
  13. size_t numPeriods = getOrComputeNumPeriods();
  14. size_t period = getOrComputePeriod();
  15. int16_t distance = end - start;
  16. int16_t stepSize = ceil(std::abs(distance / static_cast<float>(numPeriods)));
  17. if (end < start) {
  18. stepSize = -stepSize;
  19. }
  20. if (stepSize == 0) {
  21. stepSize = end > start ? 1 : -1;
  22. }
  23. return std::make_shared<FieldTransition>(
  24. id,
  25. bulbId,
  26. field,
  27. start,
  28. end,
  29. stepSize,
  30. period,
  31. callback
  32. );
  33. }
  34. FieldTransition::FieldTransition(
  35. size_t id,
  36. const BulbId& bulbId,
  37. GroupStateField field,
  38. uint16_t startValue,
  39. uint16_t endValue,
  40. int16_t stepSize,
  41. size_t period,
  42. TransitionFn callback
  43. ) : Transition(id, bulbId, period, callback)
  44. , field(field)
  45. , currentValue(startValue)
  46. , endValue(endValue)
  47. , stepSize(stepSize)
  48. , finished(false)
  49. { }
  50. void FieldTransition::step() {
  51. callback(bulbId, field, currentValue);
  52. if (currentValue != endValue) {
  53. Transition::stepValue(currentValue, endValue, stepSize);
  54. } else {
  55. finished = true;
  56. }
  57. }
  58. bool FieldTransition::isFinished() {
  59. return finished;
  60. }
  61. void FieldTransition::childSerialize(JsonObject& json) {
  62. json[F("type")] = F("field");
  63. json[F("field")] = GroupStateFieldHelpers::getFieldName(field);
  64. json[F("current_value")] = currentValue;
  65. json[F("end_value")] = endValue;
  66. json[F("step_size")] = stepSize;
  67. }