function error_handler_dissectors(buffer, pinfo, tree, TC_TM_PROTOCOL, offset, instance) -- Define the fields of the protocol local f_fault_status_ind = ProtoField.uint8("TC_TM_PROTOCOL.fault_status_ind", "Fault Status Indication", base.HEX) local f_total_error_groups = ProtoField.uint8("TC_TM_PROTOCOL.total_error_groups", "Total Number of Error Groups", base.DEC) -- Define the fields for each error group and fault status local f_error_group_io = ProtoField.uint8("TC_TM_PROTOCOL.error_group_io", "Total Number of Errors in IO", base.DEC) local f_fault_status_io = ProtoField.uint32("TC_TM_PROTOCOL.fault_status_io", "Fault Status of Group IO", base.HEX) local f_error_group_ahw_set_1 = ProtoField.uint8("TC_TM_PROTOCOL.error_group_ahw_set_1", "Total Number of Errors in AHW_SET-1", base.DEC) local f_fault_status_ahw_set_1 = ProtoField.uint32("TC_TM_PROTOCOL.fault_status_ahw_set_1", "Fault Status of Group AHW_SET-1", base.HEX) local f_error_group_ahw_set_2 = ProtoField.uint8("TC_TM_PROTOCOL.error_group_ahw_set_2", "Total Number of Errors in AHW_SET-2", base.DEC) local f_fault_status_ahw_set_2 = ProtoField.uint32("TC_TM_PROTOCOL.fault_status_ahw_set_2", "Fault Status of Group AHW_SET-2", base.HEX) local f_error_group_system_1 = ProtoField.uint8("TC_TM_PROTOCOL.error_group_system_1", "Total Number of Errors in SYSTEM Group 1", base.DEC) local f_fault_status_system_1 = ProtoField.uint32("TC_TM_PROTOCOL.fault_status_system_1", "Fault Status of Group SYSTEM 1", base.HEX) local f_error_group_system_2 = ProtoField.uint8("TC_TM_PROTOCOL.error_group_system_2", "Total Number of Errors in SYSTEM Group 2", base.DEC) local f_fault_status_system_2 = ProtoField.uint32("TC_TM_PROTOCOL.fault_status_system_2", "Fault Status of Group SYSTEM 2", base.HEX) local f_error_group_comms = ProtoField.uint8("TC_TM_PROTOCOL.error_group_comms", "Total Number of Errors in COMMS", base.DEC) local f_fault_status_comms = ProtoField.uint32("TC_TM_PROTOCOL.fault_status_comms", "Fault Status of Group COMMS", base.HEX) local f_error_group_adcs = ProtoField.uint8("TC_TM_PROTOCOL.error_group_adcs", "Total Number of Errors in ADCS", base.DEC) local f_fault_status_adcs = ProtoField.uint32("TC_TM_PROTOCOL.fault_status_adcs", "Fault Status of Group ADCS", base.HEX) local f_error_group_eps = ProtoField.uint8("TC_TM_PROTOCOL.error_group_eps", "Total Number of Errors in EPS", base.DEC) local f_fault_status_eps = ProtoField.uint32("TC_TM_PROTOCOL.fault_status_eps", "Fault Status of Group EPS", base.HEX) -- Add all fields to the protocol tm_protocol.fields = { f_fault_status_ind, f_total_error_groups, f_error_group_io, f_fault_status_io, f_error_group_ahw_set_1, f_fault_status_ahw_set_1, f_error_group_ahw_set_2, f_fault_status_ahw_set_2, f_error_group_system_1, f_fault_status_system_1, f_error_group_system_2, f_fault_status_system_2, f_error_group_comms, f_fault_status_comms, f_error_group_adcs, f_fault_status_adcs, f_error_group_eps, f_fault_status_eps } -- Create a subtree for the protocol local subtree = tree:add(TC_TM_PROTOCOL, buffer(), "ERROR HANDLER") -- Fault Status Indication (1 byte) subtree:add(f_fault_status_ind, buffer(offset, 1):le_uint()) offset = offset + 1 -- Total Number of Error Groups (1 byte) subtree:add(f_total_error_groups, buffer(offset, 1):le_uint()) offset = offset + 1 -- Dissect each error group based on the description -- Group IO --local error_group_io = buffer(offset, 1):le_uint() subtree:add(f_error_group_io, buffer(offset, 1):le_unit()) offset = offset + 1 local temp local temp1 temp = buffer(offset, 4):le_uint() for i = 0, error_group_io - 1 do temp1 = (temp >> i) & 0x01 if temp1 == 0 then subtree:add(f_fault_status_io, temp):set_text(string.format("NOFAULT")) elseif temp1 == 1 then subtree:add(f_fault_status_io, temp):set_text(string.format("FAULT")) end end offset = offset + 4 -- Group AHW_SET-1 --local error_group_ahw_set_1 = buffer(offset, 1):uint() subtree:add(f_error_group_ahw_set_1, buffer(offset, 1):le_uint()) offset = offset + 1 temp = buffer(offset, 4):le_uint() for i = 0, error_group_ahw_set_1 - 1 do temp1 = (temp >> i) & 0x01 if temp1 == 0 then subtree:add(f_fault_status_ahw_set_1, temp):set_text(string.format("NOFAULT")) elseif temp1 == 1 then subtree:add(f_fault_status_ahw_set_1, temp):set_text(string.format("FAULT")) end end offset = offset + 4 -- Group AHW_SET-2 --local error_group_ahw_set_2 = buffer(offset, 1):uint() subtree:add(f_error_group_ahw_set_2, buffer(offset, 1):le_uint()) offset = offset + 1 temp = buffer(offset, 4):le_uint() for i = 0, error_group_ahw_set_2 - 1 do temp1 = (temp >> i) & 0x01 if temp1 == 0 then subtree:add(f_fault_status_ahw_set_2, temp):set_text(string.format("NOFAULT")) elseif temp1 == 1 then subtree:add(f_fault_status_ahw_set_2, temp):set_text(string.format("FAULT")) end end offset = offset + 4 -- Group SYSTEM 1 --local error_group_system_1 = buffer(offset, 1):uint() subtree:add(f_error_group_system_1, buffer(offset, 1):le_uint()) offset = offset + 1 temp = buffer(offset, 4):le_uint() for i = 0, error_group_system_1 - 1 do temp1 = (temp >> i) & 0x01 if temp1 == 0 then subtree:add(f_fault_status_system_1, temp):set_text(string.format("NOFAULT")) elseif temp1 == 1 then subtree:add(f_fault_status_system_2, temp):set_text(string.format("FAULT")) end end offset = offset + 4 -- Group SYSTEM 2 --local error_group_system_2 = buffer(offset, 1):uint() subtree:add(f_error_group_system_2, buffer(offset, 1):le_uint()) offset = offset + 1 temp = buffer(offset, 4):le_uint() for i = 0, error_group_system_2 - 1 do temp1 = (temp >> i) & 0x01 if temp1 == 0 then subtree:add(f_fault_status_system_2, temp):set_text(string.format("NOFAULT")) elseif temp1 == 1 then subtree:add(f_fault_status_system_2, temp):set_text(string.format("FAULT")) end end offset = offset + 4 -- Group COMMS --local error_group_comms = buffer(offset, 1):uint() subtree:add(f_error_group_comms, buffer(offset, 1):le_uint()) offset = offset + 1 temp = buffer(offset, 4):le_uint() for i = 0, error_group_comms - 1 do temp1 = (temp >> i) & 0x01 if temp1 == 0 then subtree:add(f_fault_status_comms, temp):set_text(string.format("NOFAULT")) elseif temp1 == 1 then subtree:add(f_fault_status_comms, temp):set_text(string.format("FAULT")) end end offset = offset + 4 -- Group ADCS --local error_group_adcs = buffer(offset, 1):uint() subtree:add(f_error_group_adcs, buffer(offset, 1):le_uint()) offset = offset + 1 temp = buffer(offset, 4):le_uint() for i = 0, error_group_adcs - 1 do temp1 = (temp >> i) & 0x01 if temp1 == 0 then subtree:add(f_fault_status_adcs, temp):set_text(string.format("NOFAULT")) elseif temp1 == 1 then subtree:add(f_fault_status_adcs, temp):set_text(string.format("FAULT")) end end offset = offset + 4 -- Group EPS --local error_group_eps = buffer(offset, 1):uint() subtree:add(f_error_group_eps, buffer(offset, 1):le_uint()) offset = offset + 1 temp = buffer(offset, 4):le_uint() for i = 0, error_group_eps - 1 do temp1 = (temp >> i) & 0x01 if temp1 == 0 then subtree:add(f_fault_status_eps, temp):set_text(string.format("NOFAULT")) elseif temp1 == 1 then subtree:add(f_fault_status_eps, temp):set_text(string.format("FAULT")) end end offset = offset + 4 end