PMCUContext.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from pimonitor.cu.PMCUParameter import PMCUParameter
  2. __author__ = 'citan'
  3. class PMCUContext(object):
  4. @classmethod
  5. def RESPONSE_MARK_OFFSET(cls):
  6. return 4
  7. @classmethod
  8. def RESPONSE_ROM_ID_OFFSET(cls):
  9. return 8
  10. @classmethod
  11. def INITIAL_RESPONSE_MIN_LEN(cls):
  12. return 13
  13. def __init__(self, packet, targets):
  14. self._packet = packet
  15. self._targets = targets
  16. def get_rom_id(self):
  17. data = self._packet.to_bytes()
  18. if data[PMCUContext.RESPONSE_MARK_OFFSET()] != 0xFF:
  19. raise Exception('packet', "not valid init response: " + hex(data[0]) + " instead 0xFF")
  20. if len(data) < PMCUContext.INITIAL_RESPONSE_MIN_LEN():
  21. raise Exception('packet', "not valid init response")
  22. rom_id = ((data[PMCUContext.RESPONSE_ROM_ID_OFFSET()] << 32) |
  23. (data[PMCUContext.RESPONSE_ROM_ID_OFFSET() + 1] << 24) |
  24. (data[PMCUContext.RESPONSE_ROM_ID_OFFSET() + 2] << 16) |
  25. (data[PMCUContext.RESPONSE_ROM_ID_OFFSET() + 3] << 8) |
  26. (data[PMCUContext.RESPONSE_ROM_ID_OFFSET() + 4])) & 0xFFFFFFFFFF
  27. rom_id = hex(rom_id).lstrip("0x").upper()
  28. if rom_id[-1] == "L":
  29. rom_id = rom_id[:-1]
  30. return rom_id
  31. def match_parameters(self, parameters):
  32. matched = []
  33. rom_id = self.get_rom_id()
  34. print 'rom id=' + rom_id
  35. for parameter in parameters:
  36. if parameter.get_target() not in self._targets:
  37. continue
  38. cu_type = parameter.get_cu_type()
  39. if cu_type == PMCUParameter.CU_TYPE_STD_PARAMETER():
  40. if parameter.is_supported(self._packet.to_bytes()):
  41. matched.append(parameter)
  42. elif cu_type == PMCUParameter.CU_TYPE_FIXED_ADDRESS_PARAMETER():
  43. if parameter.is_supported(rom_id):
  44. print 'match=' + parameter.get_id()
  45. parameter.switch_to_id(rom_id)
  46. matched.append(parameter)
  47. return matched
  48. def match_switch_parameters(self, parameters):
  49. matched = []
  50. for parameter in parameters:
  51. if parameter.get_target() not in self._targets:
  52. continue
  53. cu_type = parameter.get_cu_type()
  54. if cu_type == PMCUParameter.CU_TYPE_SWITCH_PARAMETER():
  55. if parameter.is_supported(self._packet.to_bytes()):
  56. matched.append(parameter)
  57. return matched
  58. def match_calculated_parameters(self, parameters, supported_parameters):
  59. matched = []
  60. for parameter in parameters:
  61. if parameter.get_target() not in self._targets:
  62. continue
  63. cu_type = parameter.get_cu_type()
  64. if cu_type == PMCUParameter.CU_TYPE_CALCULATED_PARAMETER():
  65. if parameter.is_supported(supported_parameters):
  66. parameter.fill_dependencies(supported_parameters)
  67. matched.append(parameter)
  68. return matched