FieldTransition.cpp 1.9 KB

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