meas_decoder.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. # meas_decoder.py
  2. # KWP1281 Measuring Block Value Formulas
  3. # Reference: http://nefariousmotorsports.com/forum/index.php?topic=22.0
  4. # Formula IDs are DECIMAL (1-70), matching the first byte in each 3-byte measurement triplet.
  5. def decode_measurement(formula: int, a: int, b: int) -> dict:
  6. val = 0.0
  7. unit = ""
  8. raw = f"0x{formula:02X}, {a}, {b}"
  9. try:
  10. if formula == 1:
  11. val = a * 0.2 * b
  12. unit = "RPM"
  13. elif formula == 2:
  14. val = a * 0.002 * b
  15. unit = "%"
  16. elif formula == 3:
  17. val = a * 0.002 * b
  18. unit = "°"
  19. elif formula == 4:
  20. val = abs(b - 127) * 0.01 * a
  21. unit = "°ATDC" if b > 127 else "°BTDC"
  22. elif formula == 5:
  23. val = 0.1 * a * b - 10 * a
  24. unit = "°C"
  25. elif formula == 6:
  26. val = 0.001 * a * b
  27. unit = "V"
  28. elif formula == 7:
  29. val = 0.01 * a * b
  30. unit = "km/h"
  31. elif formula == 8:
  32. val = 0.1 * a * b
  33. unit = ""
  34. elif formula == 9:
  35. val = (b - 127) * 0.02 * a
  36. unit = "°"
  37. elif formula == 10:
  38. val = b
  39. unit = "COLD" if b == 0 else "WARM"
  40. elif formula == 11:
  41. val = 0.0001 * a * (b - 128) + 1
  42. unit = ""
  43. elif formula == 12:
  44. val = 0.001 * a * b
  45. unit = "Ω"
  46. elif formula == 13:
  47. val = (b - 127) * 0.001 * a
  48. unit = "mm"
  49. elif formula == 14:
  50. val = 0.005 * a * b
  51. unit = "bar"
  52. elif formula == 15:
  53. val = 0.01 * a * b
  54. unit = "ms"
  55. elif formula == 16:
  56. # Bitfield: b = bit flags, a = bitmask of which bits are used
  57. val = b
  58. unit = "Bits"
  59. elif formula == 17:
  60. # Two ASCII characters
  61. val = 0
  62. unit = chr(a) + chr(b) if 32 <= a <= 126 and 32 <= b <= 126 else f"{a:02X}{b:02X}"
  63. elif formula == 18:
  64. val = 0.04 * a * b
  65. unit = "mbar"
  66. elif formula == 19:
  67. val = a * b * 0.01
  68. unit = "L"
  69. elif formula == 20:
  70. val = a * (b - 128) / 128
  71. unit = "%"
  72. elif formula == 21:
  73. val = 0.001 * a * b
  74. unit = "V"
  75. elif formula == 22:
  76. val = 0.001 * a * b
  77. unit = "ms"
  78. elif formula == 23:
  79. val = (b / 256) * a
  80. unit = "%"
  81. elif formula == 24:
  82. val = 0.001 * a * b
  83. unit = "A"
  84. elif formula == 25:
  85. val = (b * 1.421) + (a / 182)
  86. unit = "g/s"
  87. elif formula == 26:
  88. val = b - a
  89. unit = "°C"
  90. elif formula == 27:
  91. val = abs(b - 128) * 0.01 * a
  92. unit = "°ATDC" if b < 128 else "°BTDC"
  93. elif formula == 28:
  94. val = b - a
  95. unit = ""
  96. elif formula == 29:
  97. val = 0
  98. unit = "Map 1" if b < a else "Map 2"
  99. elif formula == 30:
  100. val = (b / 12) * a
  101. unit = "°C kW"
  102. elif formula == 31:
  103. val = (b / 2560) * a
  104. unit = "°C"
  105. elif formula == 32:
  106. val = (b - 256) if b > 128 else b
  107. unit = ""
  108. elif formula == 33:
  109. val = (100 * b / a) if a != 0 else (100 * b)
  110. unit = "%"
  111. elif formula == 34:
  112. val = (b - 128) * 0.01 * a
  113. unit = "kW"
  114. elif formula == 35:
  115. val = 0.01 * a * b
  116. unit = "L/h"
  117. elif formula == 36:
  118. val = b * 10 + a * 2560
  119. unit = "km"
  120. elif formula == 37:
  121. val = (a << 8) | b # Unknown formula, show raw
  122. unit = "raw"
  123. elif formula == 38:
  124. val = (b - 128) * 0.001 * a
  125. unit = "°C kW"
  126. elif formula == 39:
  127. val = (b / 256) * a
  128. unit = "mg/h"
  129. elif formula == 40:
  130. val = b * 0.1 + (25.5 * a) - 400
  131. unit = "A"
  132. elif formula == 41:
  133. val = b + a * 255
  134. unit = "Ah"
  135. elif formula == 42:
  136. val = b * 0.1 + (25.5 * a) - 400
  137. unit = "kW"
  138. elif formula == 43:
  139. val = b * 0.1 + (25.5 * a)
  140. unit = "V"
  141. elif formula == 44:
  142. # Time display
  143. val = 0
  144. unit = f"{a}:{b:02d}"
  145. elif formula == 45:
  146. val = 0.1 * a * b / 100
  147. unit = ""
  148. elif formula == 46:
  149. val = (a * b - 3200) * 0.0027
  150. unit = "°C kW"
  151. elif formula == 47:
  152. val = (b - 128) * a
  153. unit = "ms"
  154. elif formula == 48:
  155. val = b + a * 255
  156. unit = ""
  157. elif formula == 49:
  158. val = (b / 4) * a
  159. unit = "mg/h"
  160. elif formula == 50:
  161. val = ((b - 128) / (0.01 * a)) if a != 0 else ((b - 128) / 0.01)
  162. unit = "mbar"
  163. elif formula == 51:
  164. val = ((b - 128) / 255) * a
  165. unit = "mg/h"
  166. elif formula == 52:
  167. val = b * 0.02 * a - a
  168. unit = "Nm"
  169. elif formula == 53:
  170. val = (b - 128) * 1.4222 + 0.006 * a
  171. unit = "g/s"
  172. elif formula == 54:
  173. val = a * 256 + b
  174. unit = ""
  175. elif formula == 55:
  176. val = a * b / 200
  177. unit = "s"
  178. elif formula == 56:
  179. val = a * 256 + b
  180. unit = "WSC"
  181. elif formula == 57:
  182. val = a * 256 + b + 65536
  183. unit = "WSC"
  184. elif formula == 58:
  185. val = 1.0225 * (256 - b) if b > 128 else 1.0225 * b
  186. unit = ""
  187. elif formula == 59:
  188. val = (a * 256 + b) / 32768
  189. unit = ""
  190. elif formula == 60:
  191. val = (a * 256 + b) * 0.01
  192. unit = "s"
  193. elif formula == 61:
  194. val = ((b - 128) / a) if a != 0 else (b - 128)
  195. unit = ""
  196. elif formula == 62:
  197. val = 0.256 * a * b
  198. unit = "S"
  199. elif formula == 63:
  200. # ASCII + "?"
  201. val = 0
  202. unit = (chr(a) if 32 <= a <= 126 else "?") + (chr(b) if 32 <= b <= 126 else "?") + "?"
  203. elif formula == 64:
  204. val = a + b
  205. unit = "Ω"
  206. elif formula == 65:
  207. val = 0.01 * a * (b - 127)
  208. unit = "mm"
  209. elif formula == 66:
  210. val = (a * b) / 511.12
  211. unit = "V"
  212. elif formula == 67:
  213. val = (640 * a) + b * 2.5
  214. unit = "°"
  215. elif formula == 68:
  216. val = (256 * a + b) / 7.365
  217. unit = "°/s"
  218. elif formula == 69:
  219. val = (256 * a + b) * 0.3254
  220. unit = "bar"
  221. elif formula == 70:
  222. val = (256 * a + b) * 0.192
  223. unit = "m/s²"
  224. else:
  225. val = (a << 8) | b # Fallback raw value
  226. unit = "raw"
  227. except Exception as e:
  228. val = 0
  229. unit = "Err"
  230. # Round to 2 decimal places if it's a float
  231. if isinstance(val, float):
  232. val = round(val, 2)
  233. return {
  234. "value": val,
  235. "unit": unit,
  236. "raw": raw,
  237. "formula_id": formula,
  238. "a": a,
  239. "b": b
  240. }