V2PacketFormatter.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include <V2PacketFormatter.h>
  2. #include <V2RFEncoding.h>
  3. #define GROUP_COMMAND_ARG(status, groupId, numGroups) ( groupId + (status == OFF ? (numGroups + 1) : 0) )
  4. V2PacketFormatter::V2PacketFormatter(uint8_t protocolId, uint8_t numGroups)
  5. : PacketFormatter(9),
  6. protocolId(protocolId),
  7. numGroups(numGroups)
  8. { }
  9. void V2PacketFormatter::initializePacket(uint8_t* packet) {
  10. size_t packetPtr = 0;
  11. // Always encode with 0x00 key. No utility in varying it.
  12. packet[packetPtr++] = 0x00;
  13. packet[packetPtr++] = protocolId;
  14. packet[packetPtr++] = deviceId >> 8;
  15. packet[packetPtr++] = deviceId & 0xFF;
  16. packet[packetPtr++] = 0;
  17. packet[packetPtr++] = 0;
  18. packet[packetPtr++] = sequenceNum++;
  19. packet[packetPtr++] = groupId;
  20. packet[packetPtr++] = 0;
  21. }
  22. void V2PacketFormatter::command(uint8_t command, uint8_t arg) {
  23. pushPacket();
  24. if (held) {
  25. command |= 0x80;
  26. }
  27. currentPacket[V2_COMMAND_INDEX] = command;
  28. currentPacket[V2_ARGUMENT_INDEX] = arg;
  29. }
  30. void V2PacketFormatter::updateStatus(MiLightStatus status, uint8_t groupId) {
  31. command(0x01, GROUP_COMMAND_ARG(status, groupId, numGroups));
  32. }
  33. void V2PacketFormatter::unpair() {
  34. for (size_t i = 0; i < 5; i++) {
  35. updateStatus(ON, 0);
  36. }
  37. }
  38. void V2PacketFormatter::finalizePacket(uint8_t* packet) {
  39. V2RFEncoding::encodeV2Packet(packet);
  40. }
  41. void V2PacketFormatter::format(uint8_t const* packet, char* buffer) {
  42. buffer += sprintf_P(buffer, PSTR("Raw packet: "));
  43. for (int i = 0; i < packetLength; i++) {
  44. buffer += sprintf_P(buffer, PSTR("%02X "), packet[i]);
  45. }
  46. uint8_t decodedPacket[packetLength];
  47. memcpy(decodedPacket, packet, packetLength);
  48. V2RFEncoding::decodeV2Packet(decodedPacket);
  49. buffer += sprintf_P(buffer, PSTR("\n\nDecoded:\n"));
  50. buffer += sprintf_P(buffer, PSTR("Key : %02X\n"), decodedPacket[0]);
  51. buffer += sprintf_P(buffer, PSTR("b1 : %02X\n"), decodedPacket[1]);
  52. buffer += sprintf_P(buffer, PSTR("ID : %02X%02X\n"), decodedPacket[2], decodedPacket[3]);
  53. buffer += sprintf_P(buffer, PSTR("Command : %02X\n"), decodedPacket[4]);
  54. buffer += sprintf_P(buffer, PSTR("Argument : %02X\n"), decodedPacket[5]);
  55. buffer += sprintf_P(buffer, PSTR("Sequence : %02X\n"), decodedPacket[6]);
  56. buffer += sprintf_P(buffer, PSTR("Group : %02X\n"), decodedPacket[7]);
  57. buffer += sprintf_P(buffer, PSTR("Checksum : %02X"), decodedPacket[8]);
  58. }
  59. uint8_t V2PacketFormatter::groupCommandArg(MiLightStatus status, uint8_t groupId) {
  60. return GROUP_COMMAND_ARG(status, groupId, numGroups);
  61. }