V6MiLightUdpServer.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // This protocol is documented here:
  2. // http://www.limitlessled.com/dev/
  3. #include <Arduino.h>
  4. #include <MiLightClient.h>
  5. #include <WiFiUdp.h>
  6. #include <MiLightUdpServer.h>
  7. #include <Vector.h>
  8. #include <V6CommandHandler.h>
  9. #define V6_COMMAND_LEN 8
  10. #define V6_MAX_SESSIONS 10
  11. #ifndef _V6_MILIGHT_UDP_SERVER
  12. #define _V6_MILIGHT_UDP_SERVER
  13. struct V6Session {
  14. V6Session(IPAddress ipAddr, uint16_t port, uint16_t sessionId)
  15. : ipAddr(ipAddr),
  16. port(port),
  17. sessionId(sessionId),
  18. next(NULL)
  19. { }
  20. IPAddress ipAddr;
  21. uint16_t port;
  22. uint16_t sessionId;
  23. V6Session* next;
  24. };
  25. class V6MiLightUdpServer : public MiLightUdpServer {
  26. public:
  27. V6MiLightUdpServer(MiLightClient*& client, uint16_t port, uint16_t deviceId)
  28. : MiLightUdpServer(client, port, deviceId),
  29. sessionId(0),
  30. numSessions(0),
  31. firstSession(NULL)
  32. { }
  33. ~V6MiLightUdpServer();
  34. // Should return size of the response packet
  35. virtual void handlePacket(uint8_t* packet, size_t packetSize);
  36. template <typename T>
  37. static T readInt(uint8_t* packet);
  38. template <typename T>
  39. static uint8_t* writeInt(const T& value, uint8_t* packet);
  40. protected:
  41. static V6CommandDemuxer COMMAND_DEMUXER PROGMEM;
  42. static uint8_t START_SESSION_COMMAND[] PROGMEM;
  43. static uint8_t START_SESSION_RESPONSE[] PROGMEM;
  44. static uint8_t COMMAND_HEADER[] PROGMEM;
  45. static uint8_t COMMAND_RESPONSE[] PROGMEM;
  46. static uint8_t LOCAL_SEARCH_COMMAND[] PROGMEM;
  47. static uint8_t HEARTBEAT_HEADER[] PROGMEM;
  48. static uint8_t HEARTBEAT_HEADER2[] PROGMEM;
  49. static uint8_t SEARCH_COMMAND[] PROGMEM;
  50. static uint8_t SEARCH_RESPONSE[] PROGMEM;
  51. static uint8_t OPEN_COMMAND_RESPONSE[] PROGMEM;
  52. V6Session* firstSession;
  53. size_t numSessions;
  54. uint16_t sessionId;
  55. uint16_t beginSession();
  56. bool sendResponse(uint16_t sessionId, uint8_t* responseBuffer, size_t responseSize);
  57. bool matchesPacket(uint8_t* packet1, size_t packet1Len, uint8_t* packet2, size_t packet2Len);
  58. void handleSearch();
  59. void handleStartSession();
  60. bool handleOpenCommand(uint16_t sessionId);
  61. void handleHeartbeat(uint16_t sessionId);
  62. void handleCommand(
  63. uint16_t sessionId,
  64. uint8_t sequenceNum,
  65. uint8_t* cmd,
  66. uint8_t group,
  67. uint8_t checksum
  68. );
  69. };
  70. #endif