FieldTransition.cpp 1.9 KB

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