V5MiLightUdpServer.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include <V5MiLightUdpServer.h>
  2. size_t V5MiLightUdpServer::handlePacket(uint8_t* packet, size_t packetSize, uint8_t* responseBuffer) {
  3. if (packetSize == 2 || packetSize == 3) {
  4. handleCommand(packet[0], packet[1]);
  5. } else {
  6. Serial.print("V5MilightUdpServer: unexpected packet length. Should always be 2-3, was: ");
  7. Serial.println(packetSize);
  8. }
  9. return 0;
  10. }
  11. void V5MiLightUdpServer::handleCommand(uint8_t command, uint8_t commandArg) {
  12. if (command >= UDP_RGBW_GROUP_1_ON && command <= UDP_RGBW_GROUP_4_OFF) {
  13. const MiLightStatus status = (command % 2) == 1 ? ON : OFF;
  14. const uint8_t groupId = (command - UDP_RGBW_GROUP_1_ON + 2)/2;
  15. client->prepare(MilightRgbwConfig, deviceId, groupId);
  16. client->updateStatus(status);
  17. this->lastGroup = groupId;
  18. } else if (command >= UDP_RGBW_GROUP_ALL_WHITE && command <= UDP_RGBW_GROUP_4_WHITE) {
  19. const uint8_t groupId = (command - UDP_RGBW_GROUP_ALL_WHITE)/2;
  20. client->prepare(MilightRgbwConfig, deviceId, groupId);
  21. client->updateColorWhite();
  22. this->lastGroup = groupId;
  23. } else if (uint8_t cctGroup = cctCommandIdToGroup(command)) {
  24. client->prepare(MilightCctConfig, deviceId, cctGroup);
  25. client->updateStatus(cctCommandToStatus(command));
  26. this->lastGroup = cctGroup;
  27. }
  28. else {
  29. client->prepare(MilightRgbwConfig, deviceId, lastGroup);
  30. bool handled = true;
  31. switch (command) {
  32. case UDP_RGBW_ALL_ON:
  33. client->updateStatus(ON, 0);
  34. break;
  35. case UDP_RGBW_ALL_OFF:
  36. client->updateStatus(OFF, 0);
  37. break;
  38. case UDP_RGBW_COLOR:
  39. // UDP color is shifted by 0xC8 from 2.4 GHz color, and the spectrum is
  40. // flipped (R->B->G instead of R->G->B)
  41. client->updateColorRaw(0xFF-(commandArg + 0x35));
  42. break;
  43. case UDP_RGBW_DISCO_MODE:
  44. pressButton(RGBW_DISCO_MODE);
  45. break;
  46. case UDP_RGBW_SPEED_DOWN:
  47. pressButton(RGBW_SPEED_DOWN);
  48. break;
  49. case UDP_RGBW_SPEED_UP:
  50. pressButton(RGBW_SPEED_UP);
  51. break;
  52. case UDP_RGBW_BRIGHTNESS:
  53. // map [2, 27] --> [0, 100]
  54. client->updateBrightness(
  55. round(((commandArg - 2) / 25.0)*100)
  56. );
  57. break;
  58. default:
  59. handled = false;
  60. }
  61. client->prepare(MilightCctConfig);
  62. switch(command) {
  63. case UDP_CCT_BRIGHTNESS_DOWN:
  64. client->decreaseBrightness();
  65. break;
  66. case UDP_CCT_BRIGHTNESS_UP:
  67. client->increaseBrightness();
  68. break;
  69. case UDP_CCT_TEMPERATURE_DOWN:
  70. client->decreaseTemperature();
  71. break;
  72. case UDP_CCT_TEMPERATURE_UP:
  73. client->increaseTemperature();
  74. break;
  75. default:
  76. if (!handled) {
  77. Serial.print("V5MiLightUdpServer - Unhandled command: ");
  78. Serial.println(command);
  79. }
  80. }
  81. }
  82. }
  83. void V5MiLightUdpServer::pressButton(uint8_t button) {
  84. client->command(button, 0);
  85. }
  86. uint8_t V5MiLightUdpServer::cctCommandIdToGroup(uint8_t command) {
  87. switch (command) {
  88. case UDP_CCT_GROUP_1_ON:
  89. case UDP_CCT_GROUP_1_OFF:
  90. return 1;
  91. case UDP_CCT_GROUP_2_ON:
  92. case UDP_CCT_GROUP_2_OFF:
  93. return 2;
  94. case UDP_CCT_GROUP_3_ON:
  95. case UDP_CCT_GROUP_3_OFF:
  96. return 3;
  97. case UDP_CCT_GROUP_4_ON:
  98. case UDP_CCT_GROUP_4_OFF:
  99. return 4;
  100. }
  101. return 0;
  102. }
  103. MiLightStatus V5MiLightUdpServer::cctCommandToStatus(uint8_t command) {
  104. switch (command) {
  105. case UDP_CCT_GROUP_1_ON:
  106. case UDP_CCT_GROUP_2_ON:
  107. case UDP_CCT_GROUP_3_ON:
  108. case UDP_CCT_GROUP_4_ON:
  109. return ON;
  110. case UDP_CCT_GROUP_1_OFF:
  111. case UDP_CCT_GROUP_2_OFF:
  112. case UDP_CCT_GROUP_3_OFF:
  113. case UDP_CCT_GROUP_4_OFF:
  114. return OFF;
  115. }
  116. }