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

dbcc.lua 2.8 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. --[[
  2. Thin wrapper of dbcc module for lua
  3. Author: donkey <anjingyu_ws@foxmail.com>
  4. --]]
  5. local dbcc = {}
  6. dbcc.ByteOrder = {
  7. Motorola = 0, -- 0 big-endbian
  8. Intel = 1 -- 1 little-endbian
  9. }
  10. dbcc.Sign = {
  11. Unsigned = 0,
  12. Signed = 1
  13. }
  14. dbcc.Multiplexor = {
  15. None = 0,
  16. Multiplexed = 1,
  17. Multiplexor = 2
  18. }
  19. dbcc.dbcc = require("dbcc")
  20. local SignalDelegate = {}
  21. function SignalDelegate:new()
  22. o = {}
  23. setmetatable(o, self)
  24. self.__index = self
  25. return o
  26. end
  27. function SignalDelegate:on_encoded(msg_id, db):
  28. end
  29. function SignalDelegate:on_decoded(msg_id, signal_name, value):
  30. end
  31. dbcc.SignalDelegate = SignalDelegate
  32. local SignalProcessor = {}
  33. function SignalProcessor:new(dbc_file_path)
  34. o = {dp = dbcc.dbcc.DbcParser:new(dbc_file_path), msgs = {}, handlers = {}}
  35. setmetatable(o, self)
  36. self.__index = self
  37. -- Load messages from DBC file
  38. for msg in self.dp do
  39. if msg.dlc == 0 then
  40. continue
  41. end
  42. end
  43. return o
  44. end
  45. for msg in self.__dp:
  46. if msg.dlc == 0:
  47. continue
  48. msg_entity = (msg, {})
  49. for sig in msg:
  50. msg_entity[1][sig.name] = sig
  51. self.__msgs[msg.id] = msg_entity
  52. def register_delegate(self, msg_id: int, sig_name: str, delegate: SignalDelegate) -> bool:
  53. if msg_id in self.__msgs and sig_name in self.__msgs[msg_id][1]:
  54. if msg_id not in self.__handlers:
  55. self.__handlers[msg_id] = {}
  56. self.__handlers[msg_id][sig_name] = delegate
  57. return True
  58. return False
  59. def unregister_delegate(self, msg_id: int, sig_name: str):
  60. if msg_id in self.__handlers and sig_name in self.__handlers[msg_id]:
  61. del self.__handlers[msg_id][sig_name]
  62. if len(self.__handlers[msg_id]) == 0:
  63. del self.__handlers[msg_id]
  64. def decode_message(self, msg_id: int, data: bytearray):
  65. if msg_id in self.__handlers:
  66. sigs = self.__handlers[msg_id]
  67. for sig_name, hdl in sigs.items():
  68. sig = self.__msgs[msg_id][1][sig_name]
  69. r = sig.decode(data)
  70. hdl.on_decoded(msg_id, sig_name, r)
  71. def encode_message(self, msg_id: int, values: dict):
  72. if msg_id in self.__handlers:
  73. sigs = self.__handlers[msg_id]
  74. data = bytearray(8)
  75. for sig_name, val in values.items():
  76. if sig_name in sigs:
  77. sig = self.__msgs[msg_id][1][sig_name]
  78. sig.encode(val, data)
  79. else:
  80. self.__logger.warning("Did not register handler for signal (#{}).{}".format(msg_id, sig_name))
  81. sigs[sig_name].on_encoded(msg_id, data)
  82. return dbcc