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