V5MiLightUdpServer.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <V5MiLightUdpServer.h>
  2. #include <CctPacketFormatter.h>
  3. void V5MiLightUdpServer::handlePacket(uint8_t* packet, size_t packetSize) {
  4. if (packetSize == 2 || packetSize == 3) {
  5. handleCommand(packet[0], packet[1]);
  6. } else {
  7. Serial.print(F("V5MilightUdpServer: unexpected packet length. Should always be 2-3, was: "));
  8. Serial.println(packetSize);
  9. }
  10. }
  11. void V5MiLightUdpServer::handleCommand(uint8_t command, uint8_t commandArg) {
  12. // On/off for RGBW
  13. if (command >= UDP_RGBW_GROUP_1_ON && command <= UDP_RGBW_GROUP_4_OFF) {
  14. const MiLightStatus status = (command % 2) == 1 ? ON : OFF;
  15. const uint8_t groupId = (command - UDP_RGBW_GROUP_1_ON + 2)/2;
  16. client->prepare(&FUT096Config, deviceId, groupId);
  17. client->updateStatus(status);
  18. this->lastGroup = groupId;
  19. // Command set_white for RGBW
  20. } else if (command == UDP_RGBW_GROUP_ALL_WHITE || command == UDP_RGBW_GROUP_1_WHITE || command == UDP_RGBW_GROUP_2_WHITE || command == UDP_RGBW_GROUP_3_WHITE || command == UDP_RGBW_GROUP_4_WHITE) {
  21. const uint8_t groupId = (command - UDP_RGBW_GROUP_ALL_WHITE)/2;
  22. client->prepare(&FUT096Config, deviceId, groupId);
  23. client->updateColorWhite();
  24. this->lastGroup = groupId;
  25. // Set night_mode for RGBW
  26. } else if (command == UDP_RGBW_GROUP_ALL_NIGHT || command == UDP_RGBW_GROUP_1_NIGHT || command == UDP_RGBW_GROUP_2_NIGHT || command == UDP_RGBW_GROUP_3_NIGHT || command == UDP_RGBW_GROUP_4_NIGHT) {
  27. const uint8_t groupId = (command - UDP_RGBW_GROUP_1_NIGHT + 2)/2;
  28. if (command == UDP_RGBW_GROUP_ALL_NIGHT) const uint8_t groupId = 0;
  29. client->prepare(&FUT096Config, deviceId, groupId);
  30. client->enableNightMode();
  31. this->lastGroup = groupId;
  32. } else {
  33. client->prepare(&FUT096Config, deviceId, lastGroup);
  34. bool handled = true;
  35. switch (command) {
  36. case UDP_RGBW_ALL_ON:
  37. client->updateStatus(ON, 0);
  38. break;
  39. case UDP_RGBW_ALL_OFF:
  40. client->updateStatus(OFF, 0);
  41. break;
  42. case UDP_RGBW_COLOR:
  43. // UDP color is shifted by 0xC8 from 2.4 GHz color, and the spectrum is
  44. // flipped (R->B->G instead of R->G->B)
  45. client->updateColorRaw(0xFF-(commandArg + 0x35));
  46. break;
  47. case UDP_RGBW_DISCO_MODE:
  48. client->nextMode();
  49. break;
  50. case UDP_RGBW_SPEED_DOWN:
  51. pressButton(RGBW_SPEED_DOWN);
  52. break;
  53. case UDP_RGBW_SPEED_UP:
  54. pressButton(RGBW_SPEED_UP);
  55. break;
  56. case UDP_RGBW_BRIGHTNESS:
  57. // map [2, 27] --> [0, 100]
  58. client->updateBrightness(
  59. round(((commandArg - 2) / 25.0)*100)
  60. );
  61. break;
  62. default:
  63. handled = false;
  64. }
  65. if (handled) {
  66. return;
  67. }
  68. uint8_t onOffGroup = CctPacketFormatter::cctCommandIdToGroup(command);
  69. if (onOffGroup != 255) {
  70. client->prepare(&FUT007Config, deviceId, onOffGroup);
  71. // Night mode commands are same as off commands with MSB set
  72. if ((command & 0x80) == 0x80) {
  73. client->enableNightMode();
  74. } else {
  75. client->updateStatus(CctPacketFormatter::cctCommandToStatus(command));
  76. }
  77. return;
  78. }
  79. client->prepare(&FUT007Config, deviceId, lastGroup);
  80. switch(command) {
  81. case UDP_CCT_BRIGHTNESS_DOWN:
  82. client->decreaseBrightness();
  83. break;
  84. case UDP_CCT_BRIGHTNESS_UP:
  85. client->increaseBrightness();
  86. break;
  87. case UDP_CCT_TEMPERATURE_DOWN:
  88. client->decreaseTemperature();
  89. break;
  90. case UDP_CCT_TEMPERATURE_UP:
  91. client->increaseTemperature();
  92. break;
  93. case UDP_CCT_NIGHT_MODE:
  94. client->enableNightMode();
  95. break;
  96. default:
  97. if (!handled) {
  98. Serial.print(F("V5MiLightUdpServer - Unhandled command: "));
  99. Serial.println(command);
  100. }
  101. }
  102. }
  103. }
  104. void V5MiLightUdpServer::pressButton(uint8_t button) {
  105. client->command(button, 0);
  106. }