FUT091PacketFormatter.cpp 2.2 KB

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