RgbCctPacketFormatter.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <RgbCctPacketFormatter.h>
  2. #include <Units.h>
  3. #include <V2RFEncoding.h>
  4. void RgbCctPacketFormatter::modeSpeedDown() {
  5. command(RGB_CCT_ON, RGB_CCT_MODE_SPEED_DOWN);
  6. }
  7. void RgbCctPacketFormatter::modeSpeedUp() {
  8. command(RGB_CCT_ON, RGB_CCT_MODE_SPEED_UP);
  9. }
  10. void RgbCctPacketFormatter::updateMode(uint8_t mode) {
  11. lastMode = mode;
  12. command(RGB_CCT_MODE, mode);
  13. }
  14. void RgbCctPacketFormatter::nextMode() {
  15. updateMode((lastMode+1)%RGB_CCT_NUM_MODES);
  16. }
  17. void RgbCctPacketFormatter::previousMode() {
  18. updateMode((lastMode-1)%RGB_CCT_NUM_MODES);
  19. }
  20. void RgbCctPacketFormatter::updateBrightness(uint8_t brightness) {
  21. command(RGB_CCT_BRIGHTNESS, RGB_CCT_BRIGHTNESS_OFFSET + brightness);
  22. }
  23. void RgbCctPacketFormatter::updateHue(uint16_t value) {
  24. uint8_t remapped = Units::rescale(value, 255, 360);
  25. updateColorRaw(remapped);
  26. }
  27. void RgbCctPacketFormatter::updateColorRaw(uint8_t value) {
  28. command(RGB_CCT_COLOR, RGB_CCT_COLOR_OFFSET + value);
  29. }
  30. void RgbCctPacketFormatter::updateTemperature(uint8_t value) {
  31. command(RGB_CCT_KELVIN, RGB_CCT_KELVIN_OFFSET - (value*2));
  32. }
  33. void RgbCctPacketFormatter::updateSaturation(uint8_t value) {
  34. uint8_t remapped = value + RGB_CCT_SATURATION_OFFSET;
  35. command(RGB_CCT_SATURATION, remapped);
  36. }
  37. void RgbCctPacketFormatter::updateColorWhite() {
  38. updateTemperature(0);
  39. }
  40. void RgbCctPacketFormatter::enableNightMode() {
  41. uint8_t arg = groupCommandArg(OFF, groupId);
  42. command(RGB_CCT_ON | 0x80, arg);
  43. }
  44. void RgbCctPacketFormatter::parsePacket(const uint8_t *packet, JsonObject& result) {
  45. uint8_t packetCopy[RGB_CCT_PACKET_LEN];
  46. memcpy(packetCopy, packet, RGB_CCT_PACKET_LEN);
  47. V2RFEncoding::decodeV2Packet(packetCopy);
  48. result["device_id"] = (packetCopy[2] << 8) | packetCopy[3];
  49. result["group_id"] = packetCopy[7];
  50. result["device_type"] = "rgb_cct";
  51. uint8_t command = (packetCopy[V2_COMMAND_INDEX] & 0x7F);
  52. uint8_t arg = packetCopy[V2_ARGUMENT_INDEX];
  53. if (command == RGB_CCT_ON) {
  54. if (arg == RGB_CCT_MODE_SPEED_DOWN) {
  55. result["command"] = "mode_speed_down";
  56. } else if (arg == RGB_CCT_MODE_SPEED_UP) {
  57. result["command"] = "mode_speed_up";
  58. } else if (arg < 5) { // Group is not reliably encoded in group byte. Extract from arg byte
  59. result["state"] = "ON";
  60. result["group_id"] = arg;
  61. } else {
  62. result["state"] = "OFF";
  63. result["group_id"] = arg-5;
  64. }
  65. } else if (command == RGB_CCT_COLOR) {
  66. uint8_t rescaledColor = (arg - RGB_CCT_COLOR_OFFSET) % 0x100;
  67. uint16_t hue = Units::rescale<uint16_t, uint16_t>(rescaledColor, 360, 255.0);
  68. result["hue"] = hue;
  69. } else if (command == RGB_CCT_KELVIN) {
  70. uint8_t temperature =
  71. static_cast<uint8_t>(
  72. // Range in packets is 180 - 220 or something like that. Shift to
  73. // 0..224. Then strip out values out of range [0..24), and (224..255]
  74. constrain(
  75. static_cast<uint8_t>(arg + RGB_CCT_KELVIN_REMOTE_OFFSET),
  76. 24,
  77. 224
  78. )
  79. +
  80. // Shift 24 down to 0
  81. RGB_CCT_KELVIN_REMOTE_START
  82. )/2; // values are in increments of 2
  83. result["color_temp"] = Units::whiteValToMireds(temperature, 100);
  84. // brightness == saturation
  85. } else if (command == RGB_CCT_BRIGHTNESS && arg >= (RGB_CCT_BRIGHTNESS_OFFSET - 15)) {
  86. uint8_t level = constrain(arg - RGB_CCT_BRIGHTNESS_OFFSET, 0, 100);
  87. result["brightness"] = Units::rescale<uint8_t, uint8_t>(level, 255, 100);
  88. } else if (command == RGB_CCT_SATURATION) {
  89. result["saturation"] = constrain(arg - RGB_CCT_SATURATION_OFFSET, 0, 100);
  90. } else if (command == RGB_CCT_MODE) {
  91. result["mode"] = arg;
  92. } else {
  93. result["button_id"] = command;
  94. result["argument"] = arg;
  95. }
  96. if (! result.containsKey("state")) {
  97. result["state"] = "ON";
  98. }
  99. }