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.

78 lines
3.3KB

  1. from MAXCube import MAXCube
  2. from MAXPacket import MAXPacket, MAXPacketFactory, MAXPairPingPacket, MAXPairPongPacket, MAXAckPacket, \
  3. MAXResetPacket, MAXWakeUpPacket, MAXSetGroupIdPacket
  4. from time import sleep
  5. from enum import Enum
  6. class HandshakeState(Enum):
  7. PING_RECEIVED = 1
  8. PONG_SENT = 2
  9. PONG_ACK = 3
  10. GROUP_ID_SENT = 4
  11. GROUP_ID_ACK = 5
  12. class Handshake:
  13. def __init__(self, partner_addr, dev_type):
  14. self.partner_addr = partner_addr
  15. self.dev_type = dev_type
  16. self.state: HandshakeState = HandshakeState.PING_RECEIVED
  17. class MAXPacketHandler:
  18. def __init__(self, cube: MAXCube):
  19. self.cube = cube
  20. self.quit_flag = False
  21. self.handshakes = []
  22. def handle_msg(self, pkt: MAXPacket):
  23. print(pkt.to_string())
  24. if pkt.dest_address == self.cube.addr or pkt.dest_address == "000000":
  25. if isinstance(pkt, MAXPairPingPacket):
  26. handshake = Handshake(pkt.sender_address, pkt.device_type)
  27. self.handshakes.append(handshake)
  28. pong = MAXPairPongPacket(message_counter="00", message_flag="00", sender_address=self.cube.addr,
  29. dest_address=pkt.sender_address, group_id="00")
  30. pong_str = pong.serialize()
  31. print(pong.to_string())
  32. self.cube.request(pong_str)
  33. handshake.state = HandshakeState.PONG_SENT
  34. elif isinstance(pkt, MAXAckPacket):
  35. cur_handshake: Handshake = None
  36. for handshake in self.handshakes:
  37. if handshake.partner_addr == pkt.sender_address:
  38. cur_handshake = handshake
  39. break
  40. if cur_handshake is not None:
  41. if cur_handshake.state == HandshakeState.PONG_SENT:
  42. cur_handshake.state = HandshakeState.PONG_ACK
  43. print(pkt.to_string())
  44. if cur_handshake.dev_type == "05":
  45. # Handshake is finished
  46. print("Paired device with addr={} and type={}".format(cur_handshake.partner_addr,
  47. cur_handshake.dev_type))
  48. self.handshakes.remove(cur_handshake)
  49. else:
  50. set_group_id = MAXSetGroupIdPacket(message_counter="00", message_flag="00", sender_address=self.cube.addr,
  51. dest_address=pkt.sender_address, group_id="00")
  52. set_group_id_str = set_group_id.serialize()
  53. print(set_group_id_str)
  54. self.cube.request(set_group_id_str)
  55. cur_handshake.state = HandshakeState.GROUP_ID_SENT
  56. if cur_handshake.state == HandshakeState.GROUP_ID_SENT:
  57. cur_handshake.state = HandshakeState.GROUP_ID_ACK
  58. else:
  59. print("Paket is not ours!")
  60. def receive_loop(self):
  61. while not self.quit_flag and self.cube.is_connected():
  62. resp = self.cube.response()
  63. if resp is not None and resp[0:1] == "Z":
  64. pkt = MAXPacketFactory.create_packet(resp)
  65. self.handle_msg(pkt)
  66. sleep(0.1)