V2PacketFormatter.cpp 2.7 KB

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