FUT091PacketFormatter.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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, false));
  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. } else if (command == (uint8_t)FUT091Command::KELVIN) {
  39. uint8_t kelvin = V2PacketFormatter::fromv2scale(arg, 0xCD, 2, false);
  40. result["color_temp"] = Units::whiteValToMireds(kelvin, 100);
  41. } else {
  42. result["button_id"] = command;
  43. result["argument"] = arg;
  44. }
  45. return bulbId;
  46. }