FUT089PacketFormatter.cpp 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include <FUT089PacketFormatter.h>
  2. #include <V2RFEncoding.h>
  3. #include <Units.h>
  4. void FUT089PacketFormatter::modeSpeedDown() {
  5. command(FUT089_ON, FUT089_MODE_SPEED_DOWN);
  6. }
  7. void FUT089PacketFormatter::modeSpeedUp() {
  8. command(FUT089_ON, FUT089_MODE_SPEED_UP);
  9. }
  10. void FUT089PacketFormatter::updateMode(uint8_t mode) {
  11. command(FUT089_MODE, mode);
  12. }
  13. void FUT089PacketFormatter::updateBrightness(uint8_t brightness) {
  14. command(FUT089_BRIGHTNESS, brightness);
  15. }
  16. void FUT089PacketFormatter::updateHue(uint16_t value) {
  17. uint8_t remapped = Units::rescale(value, 255, 360);
  18. updateColorRaw(remapped);
  19. }
  20. void FUT089PacketFormatter::updateColorRaw(uint8_t value) {
  21. command(FUT089_COLOR, FUT089_COLOR_OFFSET + value);
  22. }
  23. void FUT089PacketFormatter::updateTemperature(uint8_t value) {
  24. updateColorWhite();
  25. command(FUT089_KELVIN, 100 - value);
  26. }
  27. void FUT089PacketFormatter::updateSaturation(uint8_t value) {
  28. command(FUT089_SATURATION, value);
  29. }
  30. void FUT089PacketFormatter::updateColorWhite() {
  31. command(FUT089_ON, FUT089_WHITE_MODE);
  32. }
  33. void FUT089PacketFormatter::enableNightMode() {
  34. uint8_t arg = groupCommandArg(OFF, groupId);
  35. command(FUT089_ON | 0x80, arg);
  36. }
  37. void FUT089PacketFormatter::parsePacket(const uint8_t *packet, JsonObject& result) {
  38. uint8_t packetCopy[V2_PACKET_LEN];
  39. memcpy(packetCopy, packet, V2_PACKET_LEN);
  40. V2RFEncoding::decodeV2Packet(packetCopy);
  41. result["device_id"] = (packetCopy[2] << 8) | packetCopy[3];
  42. result["group_id"] = packetCopy[7];
  43. result["device_type"] = "fut089";
  44. uint8_t command = (packetCopy[V2_COMMAND_INDEX] & 0x7F);
  45. uint8_t arg = packetCopy[V2_ARGUMENT_INDEX];
  46. if (command == FUT089_ON) {
  47. if (arg == FUT089_MODE_SPEED_DOWN) {
  48. result["command"] = "mode_speed_down";
  49. } else if (arg == FUT089_MODE_SPEED_UP) {
  50. result["command"] = "mode_speed_up";
  51. } else if (arg == FUT089_WHITE_MODE) {
  52. result["command"] = "white_mode";
  53. } else if (arg <= 8) { // Group is not reliably encoded in group byte. Extract from arg byte
  54. result["state"] = "ON";
  55. result["group_id"] = arg;
  56. } else if (arg >= 9 && arg <= 17) {
  57. result["state"] = "OFF";
  58. result["group_id"] = arg-9;
  59. }
  60. } else if (command == FUT089_COLOR) {
  61. uint8_t rescaledColor = (arg - FUT089_COLOR_OFFSET) % 0x100;
  62. uint16_t hue = Units::rescale<uint16_t, uint16_t>(rescaledColor, 360, 255.0);
  63. result["hue"] = hue;
  64. } else if (command == FUT089_KELVIN) {
  65. result["color_temp"] = Units::whiteValToMireds(arg, 100);
  66. } else if (command == FUT089_BRIGHTNESS) {
  67. uint8_t level = constrain(arg, 0, 100);
  68. result["brightness"] = Units::rescale<uint8_t, uint8_t>(level, 255, 100);
  69. // saturation == kelvin. arg ranges are the same, so won't be able to parse
  70. // both unless state is persisted
  71. } else if (command == FUT089_SATURATION) {
  72. result["saturation"] = constrain(arg, 0, 100);
  73. } else if (command == FUT089_MODE) {
  74. result["mode"] = arg;
  75. } else {
  76. result["button_id"] = command;
  77. result["argument"] = arg;
  78. }
  79. if (! result.containsKey("state")) {
  80. result["state"] = "ON";
  81. }
  82. }