PMConnection.py 4.2 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. def close(self):
  29. if self._ser != None:
  30. self._ser.close()
  31. def init(self, target):
  32. request_packet = PMPacket(self.get_destination(target), 0xF0, [0xBF])
  33. return self.send_packet(request_packet)
  34. def send_packet(self, packet):
  35. self._ser.write(packet.to_string())
  36. time.sleep(0.05)
  37. out_packet = None
  38. tmp = []
  39. data = []
  40. while self._ser.inWaiting() > 0:
  41. tmp = []
  42. # read header
  43. tmp = self._ser.read(3)
  44. data.extend(tmp)
  45. # read size
  46. sizebytes = self._ser.read()
  47. data.append(sizebytes[0])
  48. size = ord(sizebytes[0])
  49. # read data
  50. tmp = self._ser.read(size)
  51. data.extend(tmp)
  52. # read checksum
  53. data.extend(self._ser.read())
  54. data = map(ord, data)
  55. out_packet = PMPacket.from_array(data)
  56. data = []
  57. if(packet.is_equal(out_packet)):
  58. continue
  59. return out_packet
  60. def read_parameter(self, parameter):
  61. address = parameter.get_address()
  62. address_len = parameter.get_address_length()
  63. data = []
  64. data.append(0xA8)
  65. data.append(0x00)
  66. for i in range(0, address_len):
  67. target_address = address + i
  68. data.append((target_address & 0xffffff) >> 16)
  69. data.append((target_address & 0xffff) >> 8)
  70. data.append(target_address & 0xff)
  71. request_packet = PMPacket(self.get_destination(parameter.get_target()), 0xf0, data)
  72. return self.send_packet(request_packet)
  73. def read_parameters(self, parameters):
  74. data = []
  75. target = parameters[0].get_target()
  76. data.append(0xA8)
  77. data.append(0x00)
  78. for parameter in parameters:
  79. # TODO:
  80. if target != parameter.get_target() and target & 0x01 != parameter.get_target() & 0x01 and target & 0x02 != parameter.get_target() & 0x02:
  81. raise Exception('connection', "targets differ: " + str(target) + " vs " + str(parameter.get_target()))
  82. address = parameter.get_address()
  83. address_len = parameter.get_address_length()
  84. for i in range(0, address_len):
  85. target_address = address + i
  86. data.append((target_address & 0xffffff) >> 16)
  87. data.append((target_address & 0xffff) >> 8)
  88. data.append(target_address & 0xff)
  89. request_packet = PMPacket(self.get_destination(target), 0xf0, data)
  90. out_packet = self.send_packet(request_packet)
  91. out_data = out_packet.get_data()
  92. out_packets = []
  93. data_offset = 1 # skip E8
  94. for parameter in parameters:
  95. address_len = parameter.get_address_length()
  96. single_out_data = [0xE8]
  97. single_out_data.extend(out_data[data_offset:address_len + data_offset])
  98. single_out_packet = PMPacket(out_packet.get_destination(), out_packet.get_source(), single_out_data);
  99. out_packets.append(single_out_packet)
  100. data_offset += address_len
  101. return out_packets
  102. def get_destination(self, target):
  103. dst = target
  104. if target == 1:
  105. dst = 0x10
  106. if target == 2:
  107. dst = 0x18
  108. if target == 3:
  109. dst = 0x10
  110. return dst