FUT020PacketFormatter.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <FUT020PacketFormatter.h>
  2. #include <Units.h>
  3. void FUT020PacketFormatter::updateColorRaw(uint8_t color) {
  4. command(static_cast<uint8_t>(FUT020Command::COLOR), color);
  5. }
  6. void FUT020PacketFormatter::updateHue(uint16_t hue) {
  7. uint16_t remapped = Units::rescale<uint16_t, uint16_t>(hue, 255.0, 360.0);
  8. remapped = (remapped + 0xB0) % 0x100;
  9. updateColorRaw(remapped);
  10. }
  11. void FUT020PacketFormatter::updateColorWhite() {
  12. command(static_cast<uint8_t>(FUT020Command::COLOR_WHITE_TOGGLE), 0);
  13. }
  14. void FUT020PacketFormatter::nextMode() {
  15. command(static_cast<uint8_t>(FUT020Command::MODE_SWITCH), 0);
  16. }
  17. void FUT020PacketFormatter::updateBrightness(uint8_t value) {
  18. const GroupState* state = this->stateStore->get(deviceId, groupId, MiLightRemoteType::REMOTE_TYPE_FUT020);
  19. int8_t knownValue = (state != NULL && state->isSetBrightness()) ? state->getBrightness() : -1;
  20. valueByStepFunction(
  21. &PacketFormatter::increaseBrightness,
  22. &PacketFormatter::decreaseBrightness,
  23. FUT02xPacketFormatter::NUM_BRIGHTNESS_INTERVALS,
  24. value / FUT02xPacketFormatter::NUM_BRIGHTNESS_INTERVALS,
  25. knownValue / FUT02xPacketFormatter::NUM_BRIGHTNESS_INTERVALS
  26. );
  27. }
  28. void FUT020PacketFormatter::increaseBrightness() {
  29. command(static_cast<uint8_t>(FUT020Command::BRIGHTNESS_UP), 0);
  30. }
  31. void FUT020PacketFormatter::decreaseBrightness() {
  32. command(static_cast<uint8_t>(FUT020Command::BRIGHTNESS_DOWN), 0);
  33. }
  34. void FUT020PacketFormatter::updateStatus(MiLightStatus status, uint8_t groupId) {
  35. command(static_cast<uint8_t>(FUT020Command::ON_OFF), 0);
  36. }
  37. BulbId FUT020PacketFormatter::parsePacket(const uint8_t* packet, JsonObject result) {
  38. FUT020Command command = static_cast<FUT020Command>(packet[FUT02xPacketFormatter::FUT02X_COMMAND_INDEX] & 0x0F);
  39. BulbId bulbId(
  40. (packet[1] << 8) | packet[2],
  41. 0,
  42. REMOTE_TYPE_FUT020
  43. );
  44. switch (command) {
  45. case FUT020Command::ON_OFF:
  46. result[F("state")] = F("ON");
  47. break;
  48. case FUT020Command::BRIGHTNESS_DOWN:
  49. result[F("command")] = F("brightness_down");
  50. break;
  51. case FUT020Command::BRIGHTNESS_UP:
  52. result[F("command")] = F("brightness_up");
  53. break;
  54. case FUT020Command::MODE_SWITCH:
  55. result[F("command")] = F("next_mode");
  56. break;
  57. case FUT020Command::COLOR_WHITE_TOGGLE:
  58. result[F("command")] = F("color_white_toggle");
  59. break;
  60. case FUT020Command::COLOR:
  61. uint16_t remappedColor = Units::rescale<uint16_t, uint16_t>(packet[FUT02xPacketFormatter::FUT02X_ARGUMENT_INDEX], 360.0, 255.0);
  62. remappedColor = (remappedColor + 113) % 360;
  63. result[GroupStateFieldNames::HUE] = remappedColor;
  64. break;
  65. }
  66. return bulbId;
  67. }