You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
4.4KB

  1. import math
  2. class MAXPacketFactory:
  3. def create_packet(rec: str):
  4. pkt_type = int(rec[7:9], 16)
  5. if pkt_type == 0:
  6. return MAXPairPingPacket(rec)
  7. elif pkt_type == 1:
  8. return MAXPairPongPacket(rec)
  9. elif pkt_type == 2:
  10. return MAXAckPacket(rec)
  11. elif pkt_type == 0x22:
  12. return MAXSetGroupIdPacket(rec)
  13. elif pkt_type == 0xF1:
  14. return MAXWakeUpPacket(rec)
  15. elif pkt_type == 0xF0:
  16. return MAXResetPacket(rec)
  17. else:
  18. print("Unknown message type: {}".format(pkt_type))
  19. result = MAXPacket()
  20. result.from_received(rec)
  21. return result
  22. class MAXPacket:
  23. def __init__(self):
  24. self.length = 0
  25. self.counter = 0
  26. self.type = 0
  27. self.flag = 0
  28. self.sender_address = 0
  29. self.dest_address = 0
  30. self.group_id = 0
  31. def set_values(self, message_counter: str, message_type: str, message_flag: str, sender_address: str,
  32. dest_address: str, group_id: str):
  33. # self.length = length
  34. self.counter = message_counter
  35. self.type = message_type
  36. self.flag = message_flag
  37. self.sender_address = sender_address
  38. self.dest_address = dest_address
  39. self.group_id = group_id
  40. def from_received(self, rec: str):
  41. self.set_values(rec[3:5], rec[5:7], rec[7:9], rec[9:15], rec[15:21], rec[21:23])
  42. self.length = rec[1:3]
  43. def gen_header(self):
  44. header_str = "{}{}{}{}{}{}".format(self.counter, self.flag, self.type, self.sender_address,
  45. self.dest_address, self.group_id)
  46. return header_str
  47. def serialize(self):
  48. header = self.gen_header()
  49. length = int(math.ceil((len(header) + len(self.payload)) / 2))
  50. self.length = length
  51. return "Zs{0:02X}{1}{2}".format(length, header, self.payload)
  52. def to_string(self):
  53. return "MAXPacket: len={}, counter={}, flag={}, type={}, sender_addr={}, dest_addr={}, group_id={}".format(
  54. self.length, self.counter, self.flag, self.type, self.sender_address, self.dest_address, self.group_id
  55. )
  56. class MAXPairPingPacket(MAXPacket):
  57. def __init__(self, rec: str):
  58. self.from_received(rec)
  59. firmware_val = int(rec[23:25], 16)
  60. self.firmware_major = firmware_val // 16
  61. self.firmware_minor = firmware_val % 16
  62. self.device_type = rec[25:27]
  63. self.test_result = rec[27:29]
  64. self.serial = rec[29:-2]
  65. def to_string(self):
  66. result = "{}\nMAXPairPingPacket: firmware_major={} firmware_minor={} device_type={} " \
  67. "test_result={} serial={}".format(super().to_string(), self.firmware_major, self.firmware_minor,
  68. self.device_type, self.test_result, self.serial)
  69. return result
  70. class MAXPairPongPacket(MAXPacket):
  71. def __init__(self, message_counter: str, message_flag: str, sender_address: str, dest_address: str,
  72. group_id: str):
  73. self.set_values(message_counter, "01", message_flag, sender_address, dest_address, group_id)
  74. self.payload = "00"
  75. def to_string(self):
  76. result = "{}\nMAXPairPongPacket: payload={}".format(super().to_string(), self.payload)
  77. return result
  78. class MAXSetGroupIdPacket(MAXPacket):
  79. def __init__(self, message_counter: str, message_flag: str, sender_address: str, dest_address: str,
  80. group_id: str):
  81. self.set_values(message_counter, "01", message_flag, sender_address, dest_address, group_id)
  82. self.payload = "00"
  83. def to_string(self):
  84. result = "{}\nMAXSetGroupIdPacket: payload={}".format(super().to_string(), self.payload)
  85. return result
  86. class MAXAckPacket(MAXPacket):
  87. def __init__(self, rec):
  88. super().__init__()
  89. self.from_received(rec)
  90. self.ack = rec[23:25]
  91. self.unknown_field = rec[25:27]
  92. def to_string(self):
  93. result = "{}\nMAXAckPacket: ack={} unknown_field={}".format(super().to_string(),
  94. self.ack, self.unknown_field)
  95. return result
  96. class MAXWakeUpPacket(MAXPacket):
  97. def __init__(self, rec):
  98. super().__init__()
  99. self.from_received(rec)
  100. class MAXResetPacket(MAXPacket):
  101. def __init__(self, rec):
  102. super().__init__()
  103. self.from_received(rec)