FUT091PacketFormatter.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <FUT091PacketFormatter.h>
  2. #include <V2RFEncoding.h>
  3. #include <Units.h>
  4. void FUT091PacketFormatter::updateBrightness(uint8_t value) {
  5. command(static_cast<uint8_t>(FUT091Command::BRIGHTNESS), V2PacketFormatter::tov2scale(value, 0x97, 2));
  6. }
  7. void FUT091PacketFormatter::updateTemperature(uint8_t value) {
  8. command(static_cast<uint8_t>(FUT091Command::KELVIN), V2PacketFormatter::tov2scale(value, 0xCD, 2));
  9. }
  10. void FUT091PacketFormatter::enableNightMode() {
  11. uint8_t arg = groupCommandArg(OFF, groupId);
  12. command(static_cast<uint8_t>(FUT091Command::ON_OFF) | 0x80, arg);
  13. }
  14. BulbId FUT091PacketFormatter::parsePacket(const uint8_t *packet, JsonObject& result) {
  15. uint8_t packetCopy[V2_PACKET_LEN];
  16. memcpy(packetCopy, packet, V2_PACKET_LEN);
  17. V2RFEncoding::decodeV2Packet(packetCopy);
  18. BulbId bulbId(
  19. (packetCopy[2] << 8) | packetCopy[3],
  20. packetCopy[7],
  21. REMOTE_TYPE_FUT091
  22. );
  23. uint8_t command = (packetCopy[V2_COMMAND_INDEX] & 0x7F);
  24. uint8_t arg = packetCopy[V2_ARGUMENT_INDEX];
  25. if (command == (uint8_t)FUT091Command::ON_OFF) {
  26. if ((packetCopy[V2_COMMAND_INDEX] & 0x80) == 0x80) {
  27. result["command"] = "night_mode";
  28. } else if (arg < 5) { // Group is not reliably encoded in group byte. Extract from arg byte
  29. result["state"] = "ON";
  30. bulbId.groupId = arg;
  31. } else {
  32. result["state"] = "OFF";
  33. bulbId.groupId = arg-5;
  34. }
  35. } else if (command == (uint8_t)FUT091Command::BRIGHTNESS) {
  36. uint8_t level = V2PacketFormatter::fromv2scale(arg, 0x97, 2);
  37. result["brightness"] = Units::rescale<uint8_t, uint8_t>(level, 255, 100);
  38. // saturation == kelvin. arg ranges are the same, so can't distinguish
  39. // without using state
  40. } else if (command == (uint8_t)FUT091Command::KELVIN) {
  41. uint8_t kelvin = V2PacketFormatter::fromv2scale(arg, 0xCD, 2);
  42. result["color_temp"] = Units::whiteValToMireds(kelvin, 100);
  43. } else {
  44. result["button_id"] = command;
  45. result["argument"] = arg;
  46. }
  47. return bulbId;
  48. }