PMConnection.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. """
  2. Created on 29-03-2013
  3. @author: citan
  4. """
  5. import serial
  6. import time
  7. from pimonitor.PMPacket import PMPacket
  8. class PMConnection(object):
  9. """
  10. classdocs
  11. """
  12. def __init__(self):
  13. """
  14. Constructor
  15. """
  16. self._ser = None
  17. def open(self):
  18. self._ser = serial.Serial(
  19. port='/dev/ttyUSB0',
  20. # port='/dev/tty.usbserial-000013FA',
  21. baudrate=4800,
  22. timeout=2000,
  23. writeTimeout=55,
  24. parity=serial.PARITY_NONE,
  25. stopbits=serial.STOPBITS_ONE,
  26. bytesize=serial.EIGHTBITS)
  27. time.sleep(0.2)
  28. return self._ser is not None
  29. def close(self):
  30. if self._ser is not None:
  31. self._ser.close()
  32. def init(self, target):
  33. request_packet = PMPacket(self.get_destination(target), 0xF0, [0xBF])
  34. return self.send_packet(request_packet)
  35. def send_packet(self, packet):
  36. self._ser.write(packet.to_string())
  37. time.sleep(0.05)
  38. out_packet = None
  39. data = []
  40. while self._ser.inWaiting() > 0:
  41. # read header
  42. tmp = self._ser.read(3)
  43. data.extend(tmp)
  44. # read size
  45. sizebytes = self._ser.read()
  46. data.append(sizebytes[0])
  47. size = ord(sizebytes[0])
  48. # read data
  49. tmp = self._ser.read(size)
  50. data.extend(tmp)
  51. # read checksum
  52. data.extend(self._ser.read())
  53. data = map(ord, data)
  54. out_packet = PMPacket.from_array(data)
  55. data = []
  56. if packet.is_equal(out_packet):
  57. continue
  58. return out_packet
  59. def read_parameter(self, parameter):
  60. address = parameter.get_address().get_address()
  61. address_len = parameter.get_address().get_length()
  62. data = [0xA8, 0x00]
  63. for i in range(0, address_len):
  64. target_address = address + i
  65. data.append((target_address & 0xffffff) >> 16)
  66. data.append((target_address & 0xffff) >> 8)
  67. data.append(target_address & 0xff)
  68. request_packet = PMPacket(self.get_destination(parameter.get_target()), 0xf0, data)
  69. return self.send_packet(request_packet)
  70. def read_parameters(self, parameters):
  71. data = []
  72. target = parameters[0].get_target()
  73. data.append(0xA8)
  74. data.append(0x00)
  75. for parameter in parameters:
  76. # TODO:
  77. if target != parameter.get_target() and target & 0x01 != parameter.get_target() & 0x01 and target & 0x02 != parameter.get_target() & 0x02:
  78. raise Exception('connection', "targets differ: " + str(target) + " vs " + str(parameter.get_target()))
  79. address = parameter.get_address().get_address()
  80. address_len = parameter.get_address().get_length()
  81. for i in range(0, address_len):
  82. target_address = address + i
  83. data.append((target_address & 0xffffff) >> 16)
  84. data.append((target_address & 0xffff) >> 8)
  85. data.append(target_address & 0xff)
  86. request_packet = PMPacket(self.get_destination(target), 0xf0, data)
  87. out_packet = self.send_packet(request_packet)
  88. out_data = out_packet.get_data()
  89. out_packets = []
  90. data_offset = 1 # skip E8
  91. for parameter in parameters:
  92. address_len = parameter.get_address().get_length()
  93. single_out_data = [0xE8]
  94. single_out_data.extend(out_data[data_offset:address_len + data_offset])
  95. single_out_packet = PMPacket(out_packet.get_destination(), out_packet.get_source(), single_out_data)
  96. out_packets.append(single_out_packet)
  97. data_offset += address_len
  98. return out_packets
  99. @staticmethod
  100. def get_destination(target):
  101. dst = target
  102. if target == 1:
  103. dst = 0x10
  104. if target == 2:
  105. dst = 0x18
  106. if target == 3:
  107. dst = 0x10
  108. return dst