eps_dissector.lua 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. function eps_dissector(buffer, pinfo, tree, TC_TM_PROTOCOL, offset, instance)
  2. local f_timestamp = ProtoField.uint8("TC_TM_PROTOCOL.timestamp_eps", "Timestamp", base.DEC)
  3. local f_pv_cnt = ProtoField.uint8("TC_TM_PROTOCOL.pv_cnt", "PV Count", base.DEC)
  4. local f_mppt_cnt = ProtoField.uint8("TC_TM_PROTOCOL.mppt_cnt", "MPPT Count", base.DEC)
  5. local f_op_conv_cnt = ProtoField.uint8("TC_TM_PROTOCOL.op_conv_cnt", "OP Converter Count", base.DEC)
  6. local f_btry_cnt = ProtoField.uint8("TC_TM_PROTOCOL.btry_cnt", "Battery Count", base.DEC)
  7. local f_btry_temp_sns_cnt = ProtoField.uint8("TC_TM_PROTOCOL.btry_temp_sns_cnt", "Battery Temp Sensor Count", base.DEC)
  8. local f_chnl_cnt = ProtoField.uint8("TC_TM_PROTOCOL.chnl_cnt", "Channel Count", base.DEC)
  9. local f_volt_rail_cnt = ProtoField.uint8("TC_TM_PROTOCOL.volt_rail_cnt", "Voltage Rail Count", base.DEC)
  10. local f_pv_volt_rd = ProtoField.float("TC_TM_PROTOCOL.pv_volt_rd", "PV Voltage Readings", base.DEC)
  11. local f_pv_cur_rd = ProtoField.float("TC_TM_PROTOCOL.pv_cur_rd", "PV Current Readings", base.DEC)
  12. local f_mppt_volt_rd = ProtoField.float("TC_TM_PROTOCOL.mppt_volt_rd", "MPPT Voltage Readings", base.DEC)
  13. local f_mppt_cur_rd = ProtoField.float("TC_TM_PROTOCOL.mppt_cur_rd", "MPPT Current Readings", base.DEC)
  14. local f_op_conv_volt_rd = ProtoField.bytes("TC_TM_PROTOCOL.op_conv_volt_rd", "OP Converter Voltage Readings")
  15. local f_tot_btry_volt_rd = ProtoField.float("TC_TM_PROTOCOL.tot_btry_volt_rd", "Total Battery Voltage Read", base.DEC)
  16. local f_tot_btry_cur_rd = ProtoField.float("TC_TM_PROTOCOL.tot_btry_cur_rd", "Total Battery Current Read", base.DEC)
  17. local f_btry_temp_sns_rd = ProtoField.uint8("TC_TM_PROTOCOL.btry_temp_sns_rd", "Battery Temp Sensor Readings", base.DEC)
  18. local f_chnl_state = ProtoField.uint16("TC_TM_PROTOCOL.chnl_state", "Channel States", base.DEC)
  19. local f_volt_rail_cur_value = ProtoField.bytes("TC_TM_PROTOCOL.volt_rail_cur_value", "Voltage Rail Current Values")
  20. local f_chnl_ovr_cur_flg = ProtoField.bytes("TC_TM_PROTOCOL.chnl_ovr_cur_flg", "Channel Overcurrent Flags")
  21. local f_hrm_btry_mode_info = ProtoField.uint8("TC_TM_PROTOCOL.hrm_btry_mode_info", "HRM Battery Mode Info", base.DEC)
  22. local f_eps_chnl_hw_sts = ProtoField.bytes("TC_TM_PROTOCOL.eps_chnl_hw_sts", "EPS CNTRL Channel HW status")
  23. local f_reserved_byte_size = ProtoField.uint8("TC_TM_PROTOCOL.f_reserved_byte_size", "Reserved Byte Size", base.DEC)
  24. local f_reserved_byte_array = ProtoField.uint8("TC_TM_PROTOCOL.f_reserved_byte_size", "Reserved Byte Array", base.DEC)
  25. TC_TM_PROTOCOL.fields = {
  26. f_timestamp, f_pv_cnt, f_mppt_cnt, f_op_conv_cnt, f_btry_cnt, f_btry_temp_sns_cnt,
  27. f_chnl_cnt, f_volt_rail_cnt, f_pv_volt_rd, f_pv_cur_rd, f_mppt_volt_rd,
  28. f_mppt_cur_rd, f_op_conv_volt_rd, f_tot_btry_volt_rd, f_tot_btry_cur_rd,
  29. f_btry_temp_sns_rd, f_chnl_state, f_volt_rail_cur_value,
  30. f_chnl_ovr_cur_flg, f_hrm_btry_mode_info, f_eps_chnl_hw_sts
  31. }
  32. local subtree = tree:add(TC_TM_PROTOCOL, buffer(), "EPS GET LIVE PARAM")
  33. for i = 0, instance - 1 do
  34. local subtree1 = subtree:add(TC_TM_PROTOCOL, buffer(), "Instance "..i)
  35. subtree1:add(f_timestamp, buffer(offset, 4):le_uint())
  36. offset = offset + 8
  37. local pv_cnt = buffer(offset, 1):le_uint()
  38. subtree1:add(f_pv_cnt, buffer(offset, 1):le_uint())
  39. offset = offset + 1
  40. local mppt_cnt = buffer(offset, 1):le_uint()
  41. subtree1:add(f_mppt_cnt, buffer(offset, 1):le_uint())
  42. offset = offset + 1
  43. local op_conv_cnt = buffer(offset, 1):le_uint()
  44. subtree1:add(f_op_conv_cnt, buffer(offset, 1):le_uint())
  45. offset = offset + 1
  46. local btry_cnt = buffer(offset, 1):le_uint()
  47. subtree1:add(f_btry_cnt, buffer(offset, 1):le_uint())
  48. offset = offset + 1
  49. local btry_temp_sns_cnt = buffer(offset, 1):le_uint()
  50. subtree1:add(f_btry_temp_sns_cnt, buffer(offset, 1):le_uint())
  51. offset = offset + 1
  52. local chnl_cnt = buffer(offset, 1):le_uint()
  53. subtree1:add(f_chnl_cnt, buffer(offset, 1):le_uint())
  54. offset = offset + 1
  55. local volt_rail_cnt = buffer(offset, 1):le_uint()
  56. subtree1:add(f_volt_rail_cnt, buffer(offset, 1):le_uint())
  57. offset = offset + 1
  58. local count = 0 -- Initialize the sum to 0
  59. local value
  60. for i = 0, pv_cnt - 1 do
  61. value = buffer(offset, 2):le_uint() -- Parse as little-endian uint16
  62. value = value/10;
  63. subtree1:add(f_pv_volt_rd, value):set_text(string.format("PV Volt %d ----> %0.1f V", i, value))
  64. offset = offset + 2 -- Move the offset forward by 2 bytes
  65. end
  66. for i = 0, pv_cnt - 1 do
  67. value = buffer(offset, 2):le_uint()
  68. value = value / 100
  69. subtree1:add(f_pv_cur_rd, value):set_text(string.format("PV Current %d ----> %0.2f A", i, value))
  70. offset = offset + 2
  71. end
  72. for i = 0, mppt_cnt - 1 do
  73. value = buffer(offset, 2):le_uint()
  74. value = value / 10
  75. subtree1:add(f_mppt_volt_rd, value):set_text(string.format("MPPT Volt %d ----> %0.1f V", i, value))
  76. offset = offset + 2
  77. end
  78. for i = 0, mppt_cnt - 1 do
  79. value = buffer(offset, 2):le_uint()
  80. value = value / 100
  81. subtree1:add(f_mppt_cur_rd, value):set_text(string.format("MPPT Current %d ----> %0.2f A", i, value))
  82. offset = offset + 2
  83. end
  84. for i = 0, op_conv_cnt - 1 do
  85. value = buffer(offset, 2):le_uint()
  86. value = value / 10
  87. subtree1:add(f_op_conv_volt_rd, value):set_text(string.format("OP Convertor Volt %d ----> %0.1f V", i, value))
  88. offset = offset + 2
  89. end
  90. local tot_btry_volt = buffer(offset, 2):le_uint()
  91. tot_btry_volt = tot_btry_volt / 10
  92. subtree1:add(f_tot_btry_volt_rd, tot_btry_volt):set_text(string.format("Total Battery Voltage Read ---- %0.1f V", tot_btry_volt))
  93. offset = offset + 2
  94. local tot_btry_curr = buffer(offset, 2):le_uint()
  95. tot_btry_curr = tot_btry_curr / 100
  96. subtree1:add(f_tot_btry_cur_rd, tot_btry_curr):set_text(string.format("Total Battery Curr Read ---- %0.2f A", tot_btry_curr))
  97. offset = offset + 2
  98. for i = 0, btry_temp_sns_cnt - 1 do
  99. value = buffer(offset, 1):le_uint()
  100. subtree1:add(f_btry_temp_sns_rd, value):set_text(string.format("Battery Temp Sensor %d ----> %d degC", i, value))
  101. offset = offset + 1
  102. end
  103. count = math.ceil(chnl_cnt / 8)
  104. local chnl_state = buffer(offset, count):le_uint()
  105. for i = 0, chnl_cnt - 1 do
  106. data = (chnl_state >> i) & 1
  107. if data == 1 then
  108. subtree1:add(f_chnl_state, data):set_text(string.format("Channel %d ----> ON", i)) -- Adjust size as needed
  109. else
  110. subtree1:add(f_chnl_state, data):set_text(string.format("Channel %d ----> OFF", i))
  111. end
  112. end
  113. offset = offset + count
  114. for i = 0, volt_rail_cnt - 1 do
  115. value = buffer(offset, 2):le_uint()
  116. value = value / 100
  117. subtree1:add(f_volt_rail_cur_value, value):set_text(string.format("Volt Rail current Values %d ----> %0.2f A", i, value))
  118. offset = offset + 2
  119. end
  120. count = math.ceil(volt_rail_cnt / 8)
  121. local over_flow = buffer(offset, count):le_uint()
  122. for i = 0, volt_rail_cnt - 1 do
  123. data = (over_flow >> i) & 1
  124. if data == 1 then
  125. subtree1:add(f_chnl_ovr_cur_flg, data):set_text(string.format("Over Current Flag %d ----> SET", i)) -- Adjust size as needed
  126. else
  127. subtree1:add(f_chnl_ovr_cur_flg, data):set_text(string.format("Over Current Flag %d ----> CLR", i))
  128. end
  129. end
  130. offset = offset + count
  131. local btry_mode = buffer(offset, 1):le_uint()
  132. local data = btry_mode & 0x0f
  133. if data == 0 then
  134. subtree1:add(f_hrm_btry_mode_info,data):set_text(string.format("EPS MODE ----> OFF"))
  135. elseif data == 1 then
  136. subtree1:add(f_hrm_btry_mode_info, data):set_text(string.format("EPS MODE ----> CRITICAL"))
  137. elseif data == 2 then
  138. subtree1:add(f_hrm_btry_mode_info, data):set_text(string.format("EPS MODE ----> SAFE"))
  139. elseif data == 3 then
  140. subtree1:add(f_hrm_btry_mode_info, data):set_text(string.format("EPS MODE ----> NORMAL"))
  141. elseif data == 4 then
  142. subtree1:add(f_hrm_btry_mode_info, data):set_text(string.format("EPS MODE ----> FULL"))
  143. end
  144. data = (btry_mode >> 4) & 1
  145. if data == 1 then
  146. subtree1:add(f_hrm_btry_mode_info, data):set_text(string.format("Bttery Charge Status ----> Charging"))
  147. else
  148. subtree1:add(f_hrm_btry_mode_info, data):set_text(string.format("Bttery Charge Status ----> Not Charging"))
  149. end
  150. data = (btry_mode >> 5) & 3
  151. if data == 3 then
  152. subtree1:add(f_hrm_btry_mode_info, data):set_text(string.format("HRM Release Status ----> Both Left and Right opened"))
  153. elseif data == 2 then
  154. subtree1:add(f_hrm_btry_mode_info, data):set_text(string.format("HRM Release Status ----> Left opened and Right Not opened"))
  155. elseif data == 1 then
  156. subtree1:add(f_hrm_btry_mode_info, data):set_text(string.format("HRM Release Status ----> Right opened and Left Not opened"))
  157. elseif data == 0 then
  158. subtree1:add(f_hrm_btry_mode_info, data):set_text(string.format("HRM Release Status ----> Both Left and Right Not opened"))
  159. end
  160. offset = offset + 1
  161. offset = offset + 24
  162. local temp
  163. --local data = buffer(offset, 2):le_uint()
  164. subtree1:add("EPS Cntrl channel HW status ------>")
  165. for i = 0,13 - 1 do
  166. data = buffer(offset, 1):le_uint()
  167. if data == 0 then
  168. subtree1:add(f_eps_chnl_hw_sts, data):set_text(string.format("Channel %d ----> %d",i, data))
  169. elseif data == 1 then
  170. subtree1:add(f_eps_chnl_hw_sts, data):set_text(string.format("Channel %d ----> %d",i, data))
  171. end
  172. offset = offset + 1
  173. end
  174. --subtree:add(f_reserved_byte_size, buffer(offset, 1):le_uint())
  175. --offset = offset + 1
  176. --subtree:add(reserved_byte_array, buffer(offset, 1):le_uint())
  177. --offset = offset + 1
  178. end
  179. end