V5MiLightUdpServer.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. Serial.print("MiLight-RGBW Command received: Device ");
  19. Serial.print(deviceId);
  20. Serial.print(" - Group ");
  21. Serial.print(groupId);
  22. Serial.print(" - Command ");
  23. Serial.print(command);
  24. Serial.println();
  25. this->lastGroup = groupId;
  26. // Command set_white for RGBW
  27. } 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) {
  28. const uint8_t groupId = (command - UDP_RGBW_GROUP_ALL_WHITE)/2;
  29. client->prepare(&FUT096Config, deviceId, groupId);
  30. client->updateColorWhite();
  31. Serial.print("MiLight-RGBW SetToWhite command received: Device ");
  32. Serial.print(deviceId);
  33. Serial.print(" - Group ");
  34. Serial.print(groupId);
  35. Serial.print(" - Command ");
  36. Serial.print(command);
  37. Serial.println();
  38. this->lastGroup = groupId;
  39. } else {
  40. client->prepare(&FUT096Config, deviceId, lastGroup);
  41. bool handled = true;
  42. switch (command) {
  43. case UDP_RGBW_ALL_ON:
  44. client->updateStatus(ON, 0);
  45. break;
  46. case UDP_RGBW_ALL_OFF:
  47. client->updateStatus(OFF, 0);
  48. break;
  49. case UDP_RGBW_COLOR:
  50. // UDP color is shifted by 0xC8 from 2.4 GHz color, and the spectrum is
  51. // flipped (R->B->G instead of R->G->B)
  52. client->updateColorRaw(0xFF-(commandArg + 0x35));
  53. break;
  54. case UDP_RGBW_DISCO_MODE:
  55. client->nextMode();
  56. break;
  57. case UDP_RGBW_SPEED_DOWN:
  58. pressButton(RGBW_SPEED_DOWN);
  59. break;
  60. case UDP_RGBW_SPEED_UP:
  61. pressButton(RGBW_SPEED_UP);
  62. break;
  63. case UDP_RGBW_BRIGHTNESS:
  64. // map [2, 27] --> [0, 100]
  65. client->updateBrightness(
  66. round(((commandArg - 2) / 25.0)*100)
  67. );
  68. break;
  69. case UDP_RGBW_GROUP_ALL_NIGHT:
  70. Serial.print("MiLight-RGBW: GROUP_ALL_NIGHT received! Device ");
  71. Serial.print(deviceId);
  72. Serial.print(" - Group ");
  73. Serial.print(lastGroup);
  74. Serial.println();
  75. client->enableNightMode();
  76. break;
  77. case UDP_RGBW_GROUP_1_NIGHT:
  78. Serial.print("MiLight-RGBW: GROUP_1_NIGHT received! Device ");
  79. Serial.print(deviceId);
  80. Serial.print(" - Group ");
  81. Serial.print(lastGroup);
  82. Serial.println();
  83. client->enableNightMode();
  84. break;
  85. case UDP_RGBW_GROUP_2_NIGHT:
  86. Serial.print("MiLight-RGBW: GROUP_2_NIGHT received! Device ");
  87. Serial.print(deviceId);
  88. Serial.print(" - Group ");
  89. Serial.print(lastGroup);
  90. Serial.println();
  91. client->enableNightMode();
  92. break;
  93. case UDP_RGBW_GROUP_3_NIGHT:
  94. Serial.print("MiLight-RGBW: GROUP_3_NIGHT received! Device ");
  95. Serial.print(deviceId);
  96. Serial.print(" - Group ");
  97. Serial.print(lastGroup);
  98. Serial.println();
  99. client->enableNightMode();
  100. break;
  101. case UDP_RGBW_GROUP_4_NIGHT:
  102. Serial.print("MiLight-RGBW: GROUP_4_NIGHT received! Device ");
  103. Serial.print(deviceId);
  104. Serial.print(" - Group ");
  105. Serial.print(lastGroup);
  106. Serial.println();
  107. client->enableNightMode();
  108. break;
  109. default:
  110. handled = false;
  111. }
  112. if (handled) {
  113. return;
  114. }
  115. uint8_t onOffGroup = CctPacketFormatter::cctCommandIdToGroup(command);
  116. if (onOffGroup != 255) {
  117. client->prepare(&FUT091Config, deviceId, onOffGroup);
  118. // Night mode commands are same as off commands with MSB set
  119. if ((command & 0x80) == 0x80) {
  120. client->enableNightMode();
  121. } else {
  122. client->updateStatus(CctPacketFormatter::cctCommandToStatus(command));
  123. }
  124. return;
  125. }
  126. client->prepare(&FUT091Config, deviceId, lastGroup);
  127. switch(command) {
  128. case UDP_CCT_BRIGHTNESS_DOWN:
  129. client->decreaseBrightness();
  130. break;
  131. case UDP_CCT_BRIGHTNESS_UP:
  132. client->increaseBrightness();
  133. break;
  134. case UDP_CCT_TEMPERATURE_DOWN:
  135. client->decreaseTemperature();
  136. break;
  137. case UDP_CCT_TEMPERATURE_UP:
  138. client->increaseTemperature();
  139. break;
  140. case UDP_CCT_NIGHT_MODE:
  141. client->enableNightMode();
  142. break;
  143. default:
  144. if (!handled) {
  145. Serial.print(F("V5MiLightUdpServer - Unhandled command: "));
  146. Serial.println(command);
  147. }
  148. }
  149. }
  150. }
  151. void V5MiLightUdpServer::pressButton(uint8_t button) {
  152. client->command(button, 0);
  153. }