-- IEDNet protocol example -- Added by Richard Green (v0.2.9) -- Set version info local my_info = { version = "0.2.14", author = "Atlas/IED", description = "this plugin parses IEDNet Protocol", repository = "Not at this time" } set_plugin_info(my_info) -- create a function to dissect it local proto_iednet = Proto("IED", "IEDNet Protocol Data") local f = proto_iednet.fields fields = {} f.bytes = ProtoField.bytes("foo.bytes", "Byte array") f.object_id = ProtoField.uint16("object_id", "Object Id", base.HEX) f.message_id = ProtoField.uint16("message_id", "Message Id", base.HEX) f.message_num = ProtoField.uint16("message_num", "Message Number", base.HEX) function proto_iednet.dissector(buffer,pinfo,tree) local subtree = tree:add( proto_iednet, buffer() ) subtree:add(buffer(0,3), "IED Header: IED") subtree:add_le(proto_iednet.fields.object_id, buffer(3,2)) subtree:add_le(proto_iednet.fields.message_id, buffer(5,2)) subtree:add_le(proto_iednet.fields.message_num, buffer(7,2)) print(buffer(3,2):le_uint()) --Gets little endian unsigned int from the buffer in this case in array position 3 and 4 print(buffer(5,2):le_uint()) --5,6 print(buffer(7,2):le_uint()) --7,8 if pcall(buffer:len() == 9) then print(buffer(9,buffer:len()):uint()) subtree:add(buffer(3,2),interpreter(buffer(3,2):le_uint(), buffer(5,2):le_uint(), null)) else var = buffer:len() - 9 for fieldsPresent = 1, var do print(buffer(8+fieldsPresent,1):le_uint()) fields[fieldsPresent] = buffer(8+fieldsPresent,1):uint() end subtree:add(buffer(3,2),interpreter(buffer(3,2):le_uint(), buffer(5,2):le_uint(), fields)) end end -- load the udp.port table udp_table = DissectorTable.get("udp.port") -- register our protocol to handle udp port 3048 udp_table:add(3048,proto_iednet) -- Added entry for legacy IEDnet on port 1024 **V0.2.11 KAT 9/25/19 udp_table:add(1024,proto_iednet) function interpreter(x, y, fields) local message = " " local field13Lenght = 0 -- Obj. ID: 0100 nested with message IDs --if (x == 0x0100) then -- debug("object id is 0x100") -- do processing of 0x100 object ids here --end -- rest of lanes code if (x == 0x0100) then --msg = 0001 if(y == 0x0001) then return "Request Network Status" --msg = 4001 elseif(y == 0x4001) then return "Request Network Status, without response" --msg = 8001 -- Modified/fixed by Richard Green (v0.2.8) elseif(y == 0x8001) then --check if no fields if(fieldsPresent == 0) then message = message .. "No fields\n" else --field 1 if(fields[1] == 0x0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 0x01) then message = message .. "Command was Recieved, but Failed to Complete\n" elseif(fields[1] == 0x02) then message = message .. "Unrecognized Command (Only for IED Messages)\n" else message = message .. "Various Other Error Codes that can be defined " .. fields[1] .. "\n" end --field 2 message = message .. string.format(" The System Type is: 0x%1x%02x", fields[3], fields[2]) .. "\n" --field 3 if(fields[4] == 0x0) then message = message .. " This Station has no init Data. It needs to be Initialized\n" elseif(fields[4] == 0x1) then message = message .. " This Station has been Initialized previously\n" else message = message .. " Unknown Error " .. fields[4] .. "\n" end --field 4 message = message .. string.format(" SW Version: %1d.%1d.%1d.%1d", (fields[6] / 16), (fields[6] % 16), (fields[5] / 16), (fields[5] % 16)) .. "\n" --field 5 n message = message .. " Computer Name is " .. fields[7] .. " characters long.\n" --field 6 i = 1 length = fields[7] message = message .. " Name of the computer is " while (i <= length) do message = message .. string.char(fields[7+i]) i = i+1 end message = message .. "\n" end return "Respond Network Status\n" .. message --msg = 0002 elseif(y == 0x0002) then --field 1 if((fields[1] .. fields[2]) == 5) then message = message .. "ACS/vACS Lifeline\n" elseif((fields[1] .. fields[2]) == 6) then message = messag .. "8101(DOS)\n" elseif((fields[1] .. fields[2]) == 7) then message = message .. "LAN8101(Lantronix-based)\n" elseif((fields[1] .. fields[2]) == 0xA) then message = message .. "LAN5901(Lantronix network interface for 540, 596 and 564 units)\n" elseif((fields[1] .. fields[2]) == 106) then message = message .. "Win8010(Online)\n" elseif((fields[1] .. fields[2]) == 107) then message = message .. "Win8101(Simulated)\n" elseif((fields[1] .. fields[2]) == 200) then message = message .. "IED Node Agent (Default)\n" elseif((fields[1] .. fields[2]) == 201) then message = message .. "IED Node Manager\n" elseif((fields[1] .. fields[2]) == 0x100) then message = message .. "ACS N\n" elseif((fields[1] .. fields[2]) == 0x200) then message = message .. "Plasma Display N\n" elseif((fields[1] .. fields[2]) == 0x300) then message = message .. "3200 device ID N\n" elseif((fields[1] .. fields[2]) == 0x520) then message = message .. "MS528 w/ CM-1 module\n" elseif((fields[1] .. fields[2]) == 0x521) then message = message .. "MS528 w/ CM-2 chipset\n" elseif((fields[1] .. fields[2]) == 0x530) then message = message .. "MS520(8-button) w/ CM-1 module\n" elseif((fields[1] .. fields[2]) == 0x531) then message = message .. "MS520(8-button) w/ CM-2 chipset\n" elseif((fields[1] .. fields[2]) == 0x550) then message = message .. "550CS mic station\n" elseif((fields[1] .. fields[2]) == 0x600) then message = message .. "Titan NDU (unspecified T90xxDSP)\n" elseif((fields[1] .. fields[2]) == 0x601) then message = message .. "Titan T9008DSP\n" elseif((fields[1] .. fields[2]) == 0x602) then message = message .. "Titan T9016DSP\n" elseif((fields[1] .. fields[2]) == 0x603) then message = message .. "Titan T9024DSP\n" elseif((fields[1] .. fields[2]) == 0x604) then message = message .. "Titan T9032DSP\n" elseif((fields[1] .. fields[2]) == 0x610) then message = message .. "Titan IPAU(T9160)\n" elseif((fields[1] .. fields[2]) == 0x612) then message = message .. "Titan Zone Output Processor (T9116DSP)\n" elseif((fields[1] .. fields[2]) == 0x614) then message = message .. "Titan Zone Outpur Processor (T9132DSP)\n" elseif((fields[1] .. fields[2]) == 0x621) then message = message .. "Titan T9032MT\n" elseif((fields[1] .. fields[2]) == 0x622) then message = message .. "Titan T9032NS\n" elseif((fields[1] .. fields[2]) == 0x623) then message = message .. "Titan T9032LVIO\n" elseif((fields[1] .. fields[2]) == 0x624) then message = message .. "Titan T9016LVIO\n" elseif((fields[1] .. fields[2]) == 0x625) then message = message .. "Titan T9016TY\n" elseif((fields[1] .. fields[2]) == 0x626) then message = message .. "Titan T9032TY\n" elseif((fields[1] .. fields[2]) == 0x627) then message = message .. "Titan T9040LNR (LVIO, Noise, Relay)\n" elseif((fields[1] .. fields[2]) == 0x701) then message = message .. "LanCom 9612ICM\n" elseif((fields[1] .. fields[2]) == 0x702) then message = message .. "LanCom 9611SRM\n" elseif((fields[1] .. fields[2]) == 0x703) then message = message .. "LanCom CobraNet (hallway) Amplifier\n" elseif((fields[1] .. fields[2]) == 0x800) then messsage = message .. "vACS N\n" elseif((fields[1] .. fields[2]) == 0x1516) then message = message .. "IED1516LI Logic Input Device\n" elseif((fields[1] .. fields[2]) == 0x1522) then message = message .. "IED1522AIO Audio Input/Output Device\n" elseif((fields[1] .. fields[2]) == 0x1542) then message = message .. "IED1542NA 2-chan Network Amplifier\n" elseif((fields[1] .. fields[2]) == 0x1544) then message = message .. "IED1544BAS Backup Amp Switcher\n" elseif((fields[1] .. fields[2]) == 0x1581) then message = message .. "IED1581NA 1-chan Network Amplifier\n" elseif((fields[1] .. fields[2]) == 0x5400) then message = message .. "IED5400ACS\n" elseif((fields[1] .. fields[2]) == 0x5410) then message = message .. "IED5455(?) control station\n" elseif((fields[1] .. fields[2]) == 0x5411) then message = message .. "IED5408 8-button mic station\n" elseif((fields[1] .. fields[2]) == 0x5420) then message = message .. "IED5404DZM Digital Zone Manager\n" elseif((fields[1] .. fields[2]) == 0x5421) then message = message .. "IED5432DZM Digital Zone Manager\n" -- Added by Richard Green (v0.2.7) -- The above style "elseif((fields[1] .. fields[2]) == 0x0509) then" did not work for me -- Separated individually elseif((fields[1] == 0x05) and (fields[2] == 0x09)) then message = message .. "AtlasIED IPx Speakers\n" else message = message .. "Unknown System Type\n" end --field 2 if(fields[3] == 0) then message = message .. " This Station has no init data. It needs to be initialized.\n" elseif(fields[3] == 1) then message = message .. " This Station has been initialized previously.\n" else message = message .. " Unrecogized hex value:" .. string.format("%02x\n",fields[3]) end --field 3 -- Modified by Richard Green (v0.2.7) -- Fixed by Richard Green (v0.2.8) message = message .. string.format(" Version of Software Running: %1d.%1d.%1d.%1d", (fields[5] / 16), (fields[5] % 16), (fields[4] / 16), (fields[4] % 16)) .. "\n" --field 4 message = message .. " Name of the Computer is " .. fields[6] .. " characters long\n" --field 5 i = 1 length = fields[6] message = message .. " The computer is named: " while (i <= length) do message = message .. string.char(fields[6+i]) i = i+1 end message = message .. "\n" return "Broadcast Network Connect Status\n" .. message --msg = 0003 elseif(y == 0x0003) then --field 1 message = message .. "System Type: " .. fields[1] .. fields[2] .. "\n" --field 2 length = fields[3]+fields[4] message = message .. "Computer Name is: " .. length .. " characters long\n" --field 3 i = 1 message = message .. "Computer Name is: " while (i <= length) do message = message .. string.char(fields[4+i])"\n" i = i+1 end message = message .. "\n" return "Broadcast Network Disconnect Status\n" .. message --msg = 0004 elseif(y == 0x0004) then --field 1 i = 1 message = message .. "Current Date (in format of mm/dd/yyyy): " while (i <= 10) do message = message .. string.char(fields[1+i]) .. "\n" i = i+1 end message = message .. "\n" return "Set Date\n" .. message -- msg = 8004 elseif(y == 0x8004) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end return "Respond Set Date: " .. message --msg = 0005 elseif(y == 0x0005) then --field 1 i = 1 message = message .. "Current Time (in format of 24 hours and hh:mm:ss): " while (i <= 8) do message = message .. string.char(fields[0+i]) i = i+1 end message = message .. "\n" return "Set time\n" .. message -- msg = 8005 elseif(y == 0x8005) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end return "Repond Set Time: " .. message --msg = 0006 elseif(y == 0x0006) then return "Get Date" -- msg = 8006 elseif(y == 0x8006) then --field 1 if (fields[1] == 0) then message = message .. "Command completed Successfully\n" elseif (fields[1] == 1) then message = message .. "Command Recieved, but failed to Complete\n" elseif (fields[1] == 2) then message = message .. "Invalid or unrecognized command (only for IED messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 i = 1 message = message .. "Current Date (in format of mm/dd/yyyy): " while (i <= 10) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" return "Respond Get Date\n" .. message --msg = 0007 elseif(y == 0x0007) then return "Get time" -- msg = 8007 elseif(y == 0x8007) then --field 1 if(fields[1] == 0) then message = message .. "Command completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command Recieved, but failed to Complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized vommand (only for IED messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 i = 1 message = message .. "Current Time is (24 hour clock, in form of hh:mm:ss): " while (i <= 8) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" return "Respond Get time\n" .. message -- msg = 0008 elseif(y == 0x0008) then --field 1 if(fields[1] == 0)then message = message .. "Send\n" elseif(fields[1] == 1) then message = message .. "Recieve\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[1]) end --field 2 if(fields[2] == 0) then message = message .. "Continue\n" elseif(fields[2] == 1) then message = message .. "New\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[2]) end --field 3 if(fields[3] == 0) then message = message .. "Not-final\n" elseif(fields[3] == 1) then message = message .. "Final\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[3]) end --field 4 message = message .. "File Date: " .. fields[4] .. fields[5] .. "\n" --field 5 message = message .. "File Time: " .. fields[6] .. fields[7] .. "\n" --field 6 fileNameLength = fields[8] message = message .. "Entire path and filename length: " .. fields[8] .. "\n" --field 7 length = fields[9] .. fields[10] message = message .. "Buffer length: " .. length .. "\n" --field 8 i = 1 message = message .. "Path and filename: " while (i <= length) do message = message .. string.char(fields[10+i]) i = i+1 end message = message .. "\n" --field 9 j = 1 message = message .. "Current transfer data buffer: " while (j <= length) do message = message .. string.char(fields[10+fileNameLength+j]) j = j+1 end message = message .. "\n" return "Upload File\n" .. message -- msg = 0009 elseif(y == 0x0009) then --field 1 length = fields[1] .. fields[2] message = message .. "Length of ASCII text message: " .. length .. "\n" --field 2 i = 1 message = message .. "Char message: " while (i <= length) do message = message .. string.char(fields[3+i]) i = i+1 end message = message .. "\n" return "Send Chat Data\n" .. message --msg = 000a elseif(y == 0x000a) then --field 1 message = message .. "Node Reset Command (For use with IED Node Agent):\n" if(fields[1] == 0x01) then message = message .. "Change Auto Reboot Time (if this command used field 2 must contain the reboot time)\n" elseif(fields[1] == 0x02) then message = message .. "Disable Automatic Rebooting\n" elseif(fields[1] == 0x03) then message = message .. "Force a hard reboot of the computer\n" else message = message .. "Error\n" end --field2 if(fields[1] == 0x01) then i = 1 message = message .. "Time in format hh:mm:ss: " while (i <= 8) do message = message .. string.char(fields[2+i]) .. "\n" i = i+1 end else end return "Reset Node\n" .. message -- msg = 000B elseif(y == 0x000b) then --field 1 if(fields[1] == 0) then message = message.. "Send\n" elseif(fields[1] == 1) then message = message .. "Recieve\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[1]) end --field 2 if(fields[2] == 1) then message = message .. "New\n" elseif(fields[2] == 0) then message = message .. "Continue\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[2]) end --field 3 if(fields[3] == 0) then message = message .. "not-final\n" elseif(fields[3] == 1) then message = message .. "final\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[3]) end --field 4 message = message .. "File Date (used in response, 0x0000 here): " .. string.char(fields[4] .. fields[5]) .. "\n" --field 5 message = message .. "File Time (used in response, 0x0000 here): " .. string.char(fields[6] .. fields[7]) .. "\n" --field 6 message = message .. "Path and filename length: " .. fields[8] .. "\n" --field 7 message = message .. "Buffer length of the current transfer data buffer (used in response, 0x0000 here: " .. fields[9] .. fields[10] .. "\n" --field 8 i = 1 length = fields[8] message = message .. "Path and filename: " while ( i <= length) do message = message .. string.char(fields[10+i]) i = i+1 end message = message .. "\n" --field 9 i = 1 buffLength = fields[9] .. fields[10] message = message .. "Current transfer data buffer: " while (i <= buffLength) do message = message .. string.char(fields[10+length+i]) i = i+1 end message = message .. "\n" return "Download File\n" .. message --msg = 800B elseif(y == 0x800b) then --field 1 if(fields[1] == 0) then message = message .. "Send\n" elseif(fields[1] == 1) then message = message .. "Recieve\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[1]) end --field 2 if(fields[2] == 0) then message = message .. "Continue\n" elseif(fields[2] == 1) then message = message .. "New\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[2]) end --field 3 if(fields[3] == 0) then message = message .. "Not-Final\n" elseif(fields[3] == 1) then message = message .. "Final\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[3]) end --field 4 message = message .. "File Date: " .. string.char(fields[4] .. fields[5]) .. "\n" --field 5 message = message .. "File Time: " .. string.char(fields[6] .. fields[7]) .. "\n" --field 6 length = fields[8] message = message .. "Path and Filename length: " .. fields[8] .. "\n" --field 7 buffLength = fields[9] .. fields[10] message = message .. "Buffer length of current transfer data buffer: " .. fields[9] .. fields[10] .. "\n" --field 8 i = 1 message = message .. "Path and filename of the file to transfer: " while (i <= length) do message = message .. string.char(fields[10+i]) i = i+1 end message = message .. "\n" --field 9 i = 1 message = message .. "Current transfer data buffer: " while (i <= buffLength) do message = message .. string.char(fields[10+length+i]) i = i+1 end message = message .. "\n" return "Respond Download File\n" .. message --msg = 000C elseif(y == 0x000c) then --field 1 length = fields[1] .. fields[2] message = message .. "Filename length: " .. fields[1] .. fields[2] .. "\n" --field 2 i = 1 message = message .. "Path and file name: " while (i <= length) do message = message .. string.char(fields[2+i]) i = i+1 end message = message .. "\n" return "Poll Matching Wildcards\n" .. message --msg = 800C elseif(y == 0x800c) then --field 1 length = fields[1] message = message .. "Number of files found to satisfy the wild card statement: " .. fields[1] .."\n" --field 2 i = 1 message = message .. "File name: " while (i <= length) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" return "Respond Poll Matching Wildcards\n" .. message --msg = 000D elseif(y == 0x000d) then --field 1 length = fields[1] message = message .. "Length of computer name: " .. fields[1] .. "\n" --field 2 i = 1 message = message .. "Computer Name: " while (i <= length) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" return "Set Computer Name\n" .. message --msg = 000e elseif(y == 0x000e) then return "Get Process" --msg = 800E elseif(y == 0x800e) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed successfully \n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete \n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized (Only for IED Messages) \n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "Number of processes: " .. fields[2] .. "\n" --field 3 i = 1 message = message .. "The window handle: " while (i <= 4) do message = message .. sting.char(fields[2+i]) i = i+1 end message = message .. "\n" --field 4 i = 1 message = message .. "The process ID: " while (i <= 4) do message = message .. string.char(fields[6+i]) i = i+1 end message = message .. "\n" --field 5 length = fields[12] message = message .. "Length of the process name: " .. fields[12] .. "\n" --field 6 i = 1 message = message .. "The process name: " while (i <= length) do message = message .. string.char(fields[12+i]) i = i+1 end message = message .. "\n" --field 7 proclength = fields[12+length] message = message .. "The length of the process file name: " .. fields[12+length] .. "\n" --field 8 i = 1 message = message .. "The file name: " while (i <= proclength) do message = message .. string.char(fields[12+length+i]) i = i+1 end message = message .. "\n" return "Respond Get Processes\n" .. message --msg = 0010 elseif(y == 0x0010) then --field 1 length = fields[1] message = message .. "Length of the filename: " .. fields[1] .. "\n" --field 2 i = 1 message = message .. "The process filename: " while (i <= length) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" return "Check File Etistence\n" .. message --msg = 0011 elseif(y == 0x0011) then --field 1 length = fields[1] message = message .. "The length of the process name: " .. fields[1] .. "\n" --field 2 i = 1 message = message .. "The process name: " while (i <= length) do message = message .. sting.char(fields[1+i]) i = i+1 end message = message .. "\n" return "Start Process\n" .. message --msg = 0012 elseif(y == 0x0012) then --field 1 if(fields[1] == 0) then message = message .. "Stop process by using the process name\n" elseif(fields[1] == 1) then message = message .. "Stop processby using the process window handle and process ID\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[1]) end --field 2 i = 1 message = message .. "The window handle: " while (i <= 4) do message = message .. fields[1+i] i = i+1 end message = message .. "\n" --field 3 i = 1 message = message .. "The process ID: " while (i <= 4) do message = message .. fields[5+i] --field 4 length = fields[10] message = message .. "The length of the process name: " .. fields[10] .. "\n" --field 5 i = 1 message = message .. "The process name: " while (i <= length) do message = message .. string.char(fields[10+i]) i = i+1 end message = message .. "\n" return "Stop Process\n" .. message end --msg = 0013 elseif(y == 0x0013) then --field 1 length = fields[1] message = message .. "The length of the old file name: " .. fields[1] .. "\n" --field 2 i = 1 message = message .. "The old file name: " while (i <= length) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" return "Replace File\n" .. message --msg = 0014 elseif(y == 0x0014) then --field 1 length = fields[1] message = message .. "The length of the file name: " .. fields[1] .. "\n" --field 2 i = 1 message = message .. "The file name: " while (i <= length) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" return "Get Version\n" .. message --msg = 8014 elseif(y == 0x8014) then --field 1 if(fields[1] == 0) then message = message .. "Command completed successfully\n" elseif(fields[1] == 1) then message = message .. "command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (only for IED messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "The number of properties being returned: " .. fields[2] .. "\n" --field 3 length = fields[3] message = message .. "The length of the company name: " .. fields[3] .. "\n" --field 4 i = 1 message = message .. "The company name: " while (i <= length) do message = message .. string.char(fields[3+i]) i = i+1 end message = message .. "\n" --field 5 origLength = fields[4+length] message = message .. "The length of the original filename: " .. fields[4+length] .. "\n" --field 6 i = 1 message = message .. "The original filename: " while (i <= origLength) do message = message .. string.char(fields[length+4+i]) i = i+1 end message = message .. "\n" --field 7 prodLength = fields[length+origLength+5] message = message .. "The length of the product name: " .. prodLength .. "\n" --field 8 i = 1 message = message .. "The product name: " while (i <= prodLength) do message = message .. string.char(fields[5+length+origLength+i]) i = i+1 end message = message .. "\n" --field 9 prodVerLength = fields[length+origLength+prodLength+6] message = message .. "The length of the product version: " .. prodVerLength .. "\n" --field 10 i = 1 message = message .. "The product version: " while (i <= proVerLength) do message = message .. string.char(fields[6+length+origLength+prodLength]) i = i+1 end message = message .. "\n" --field 11 fileVerLength = fields[7+length+origLength+prodLength+proVerLength] message = message .. "The length of the file version: ".. fileVerLength .. "\n" --field 12 i = 1 message = message .. "The process name: " while (i <= fileVerLength) do message = message .. string.char(fields[7+i+length+origLength+prodLength+proVerLength]) i = i+1 end message = message .. "\n" return "Respond Get Version\n" .. message --msg = 0015 elseif(y == 0x0015) then --field 1 length = fields[1] message = message .. "The length of the process name: " .. fields[1] .. "\n" --field 2 i = 1 message = message .. "The process name: " while (i <= length) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" --field 3 procLength = fields[2+length] message = message .. "The length of the process parameters: " .. fields[2+length] .. "\n" --field 4 i = 1 message = message .. "The process parameters: " while (i <= procLength) do message = message .. string,char(fields[2+length+procLength]) i = i+1 end message = message .. "\n" return "Add Etec Process" .. message --msg = 0016 elseif(y == 0x0016) then --field 1 length = fields[1] message = message .. "The length of the process name: " .. fields[1] .. "\n" --field 2 i = 1 message = message .. "The process name: " while (i <= length) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" return "Delete Etec Process" .. message --msg = 0017 elseif(y == 0x0017) then return "Dump Debug Data" --msg = 0018 elseif(y == 0x0018) then return "Re-Initialized the ACS" --msg = 0019 elseif(y == 0x0019) then --field 1 message = message .. "ACS System Number: " .. fields[1] .. "\n" --field 2 if(fields[2] == 1) then message = message .. "Force Lifeline\n" elseif(fields[2] == 2) then message = message .. "Remove Lifeline\n" elseif(fields[2] == 3) then message = message .. "Stop Monitoring\n" elseif(fields[2] == 4) then message = message .. "Resume Monitoring\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[2]) end return "LifeLine Command" .. message --msg 001A elseif(y == 0x001a) then --field 1 message = message .. "ACS System Number: " .. fields[1] .. "\n" return "LifeLine Query" .. message --msg 801A elseif(y == 0x801a) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "ACS System Number: " .. fields[2] .. "\n" --field 3 if(fields[3] == 1) then message = message .. "Lifeline\n" elseif(fields[3] == 3) then message = message .. "Not Monitoring\n" elseif(fields[3] == 4) then message = message .. "Monitoring\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[3]) end return "Respond LifeLine Query" .. message --msg = 001C elseif(y == 0x001c) then --field 1 length = fields[1] message = message .. "Directory Length: " .. fields[1] .. "\n" --field 2 i = 1 message = message .. "Path to directory: " while (i <= length) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" --field 3 message = message .. "Listing Offset: " .. fields[2+length] .. "\n" return "Get Directory Listing" .. message --msg = 801C elseif(y == 0x801c) then --field 1 if(fields[1] == 4) then message = message .. "Directory does not exist\n" elseif(fields[1] == 5) then message = message .. "No more files were available path the offset given\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[1]) end --field 2 length = fields[2] .. fields[3] message = message .. "Directory Length: " .. length .. "\n" --field 3 i = 1 message = message .. "Path to directory: " while (i <= length) do message = message .. string.char(fields[3+i]) i = i+1 end message = message .. "\n" --field 4 listOff = fields[4+length] .. fields[5+length] message = message .. "Listing Offset: " .. listOff .. "\n" --field 5 numOfListings = fields[6+length] .. fields[7+length] message = message .. "Number of Listings to follow: " .. numOfListings .. "\n" --field 6 i = 2 j = 0 arrayLength = 1 while(fields[i] ~= nil) do arrayLength = arrayLength+1 end i = 1 while (i <= numOfListings) do count = 1 while (count <= 11) do message = message .. string.char(fields[j+count+7+length]) count = count+1 end j = j+11 message = message .. string.char(fields[j+length+19] .. fields[j+length+8]) j = j+2 count = 1 while (count <= 8) do message = message .. string.char(fields[j+length+7+count]) count = count+1 end j = j+8 message = message .. string.char(fields[j+length+8]) j = j+1 count = 1 while (count <= 6) do message = message .. string.char(fields[j+length+7+count]) count = count+1 end j = j+6 message = message .. string.char(fields[j+length+8]) j = j+1 count = 1 while (count <= (arrayLength-2)) do message = message .. string(fields[j+length+7+count]) count = count+1 end message = message .. string.char(fields[arrayLength-1] .. fields[arrayLength]) message = message .. "\n" end message = message .. "\n" message = message .. "Respond Get Directory Listing\n" --msg = 0101 elseif(y == 0x0101) then --lol --field 1 if(fields[1] == 0) then message = message .. "You/Self\n" elseif(fields[1] == 1) then message = message .. "CPU 1 (Slot 1)\n" elseif(fields[1] == 2) then message = message .. "CPU 2 (Slot 2)\n" elseif(fields[1] == 8) then message = message .. "510N Card1\n" elseif(fields[1] == 9) then message = message .. "510N Card 2\n" elseif(fields[1] == 10) then message = message .. "510N Card 3\n" elseif(fields[1] == 11) then message = message .. "510N Card 4\n" elseif(fields[1] == 12) then message = message .. "510N Card 5\n" elseif(fields[1] == 13) then message = message .. "510N Card 6\n" elseif(fields[1] == 14) then message = message .. "510N Card 7\n" elseif(fields[1] == 15) then message = message .. "510N Card 8\n" elseif(fields[1] == 254) then message = message .. "Buddy\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[1]) end return "Get Operational Status" .. message --msg = 8101 elseif(y == 0x8101) then --field 1 if(fields[1] == 0) then message = message .. "Command completed successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "Respondent's IPC Node: " .. fields[2] .. "\n" --field 3 message = message .. "Dual Processor Operation Flag: " .. fields[3] .. "\n" --field 4 if(fields[4] == 0) then message = message .. "Respondent's Operation Mode: Unknown\n" elseif(fields[4] == 1) then message = message .. "Respondent's Operation Mode: Backup\n" elseif(fields[4] == 2) then message = message .. "Respondent's Operation Mode: Primary\n" elseif(fields[4] == 3) then message = message .. "Respondent's Operation Mode: Fault\n" else message = message .. "Error\n" end --field 5 message = message .. "Buddy's Operation Mode: " .. fields[5] .. "\n" --field 6 if(fields[6] == 0) then message = message .. "Hard drive Status: Hard drive\n" elseif(fields[6] == 1) then message = message .. "Hard drive Status: Flash drive\n" else message = message .. "Error\n" end return "Get Operational Status Response" .. message --msg = 0102 elseif(y == 0x0102) then --field 1 message = message .. "Source's IPC Node: " .. fields[1] .. "\n" --field 2 message = message .. "Dual Preocessor Operational Flag: " .. fields[2] .. "\n" --field 3 message = message .. "Source's operation Mode: " .. fields[3] .. "\n" --field 4 message = message .. "Buddy's operation Mode: " .. fields[4] .. "\n" --field 5 if(fields[5] == 0) then message = message .. "Hard drive Status: Hard drive\n" elseif(fields[5] == 1) then message = message .. "Hard drive Status: Flash drive\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[1]) end return "Report Operational Status" .. message --msg = 0103 elseif(y == 0x0103) then --field 1 message = message .. "Destination IPC Node: " .. fields[1] .. "\n" --field 2 if(fields[2] == 0) then message = message .. "The CPU and buddy communicate to ensure there is one CPU in primary mode, if partner is in backup then the CPU switches to primary mode\n" elseif(fields[2] == 1) then message = message .. "The CPU and buddy will not communicate, it is up to the 590 computer to insure one CPU is in primary at all times\n" else message = message .. "Error\n" end --field 3 if(fields[3] == 1) then message = message .. "Operation mode: Backup\n" elseif(fields[3] == 2) then message = message .. "Operation mode: Primary\n" else message = message .. "Error\n" end return "Set Operational Mode" .. message --msg = 0104 elseif(y == 0x0104) then --field 1 message = message .. "Destination IPC Node: " .. fields[1] .. "\n" return "Get Ethernet Information" .. message --msg = 8104 elseif(y == 0x8104) then --field 1 if(fields[1] == 0) then message = message .. "Command completed\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "Respondant's IPC Node: " .. fields[2] .. "\n" --field 3 i = 1 message = message .. "IP Address: " while (i <= 4) do message = message .. string.char(fields[2+i]) i = i+1 end message = message .. "\n" return "Get Ethernet Information Response" .. message --msg = 0105 elseif(y == 0x0105) then --field 1 message = message .. "Destination IPC Node: " .. fields[1] .. "\n" --field 2 i = 1 message = message .. "IP Address: " while (i <= 4) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" --field 3 i = 1 message = message .. "IP Subnet Mask: " while (i <= 4) do message = message .. fields[5+i] i = i+1 end message = message .. "\n" --field 4 i = 1 message = message .. "Default Router IP Address: " while (i <= 4) do message = message .. fields[9+i] i = i+1 end message = message .. "\n" return "Set Ethernet Information" .. message --msg = 0110 elseif(y == 0x0110) then --field 1 message = message .. "Stamp number: " .. fields[1] .. "\n" --field 2 length = fields[2] message = message .. "Stamp length: " .. fields[2] .. "\n" --field 3 i = 1 message = message .. "Stamp: " while (i <= length) do message = message .. string.char(fields[2+i]) i = i+1 end message = message .. "\n" return "Set Data Stamp" .. message --msg = 0111 elseif(y == 0x0111) then --field 1 message = message .. "Stamp number: " .. fields[1] .. "\n" return "Get Data Stamp" .. message --msg = 8111 elseif(y == 0x8111) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Stamp does not exist\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "Stamp Number: " .. fields[2] .. "\n" --field 3 length = fields[3] message = message .. "Stamp Length: " .. fields[3] .. "\n" --field 4 i = 1 message = message .. "Stamp: " while (i <= length) do message = message .. string.char(fields[3+i]) .. "\n" i = i+1 end message = message .. "\n" return "Get Data Stamp Response" .. message else return "Unrecognized Message ID: " .. y end --obj = 0101 elseif(x == 0x0101) then --msg = 0001 if(y == 0x0001) then return "Request Dual CPU Status" --msg = 8001 elseif(y == 0x8001) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 if(fields[2] == 1) then message = message .. "Dual CPU 1 selected\n" elseif(fields[2] == 2) then message = message .. "Dual CPU 2 selected\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[2]) end --field 3 i = 1 message = message .. "First Dual CPU IP Address: " while (i <= 4) do message = message .. fields[2+i] i = i+1 end message = message .. "\n" --field 4 i = 1 message = message .. "Second Dual CPU IP Address: " while (i <= 4) do message = message .. fields[6+i] i = i+1 end message = message .. "\n" return "Respond DUal CPU Status" .. message --msg = 0002 elseif(y == 0x0002) then --field 1 if(fields[1] == 1) then message = message .. "Dual CPU 1 selected\n" elseif(fields[1] == 2) then message = message .. "Dual CPU 2 selected\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[1]) end return "Change Dual CPU" .. message else return "Unrecognized message ID" .. y end --obj = 0ABC elseif(x == 0x0abc) then --msg = 0001 if(y == 0x0001) then --field 1 length = fields[1] .. fields[2] message = message .. "XML Field Length: " .. fields[1] .. fields[2] .. "\n" --field 2 i = 1 message = message .. "XML Message: " while (i <= length) do message = message .. string.char(fields[2+i]) i = i+1 end message = message .. "\n" return "XML Message " .. message else return "Unrecognized message ID: " ..y end --obj = 1000 elseif(x == 0x1000) then --msg = 0001 if(y == 0x0001) then --field 1 field1 = fields[1] if(field1 >= 0x80) then if(field1 == 0x81) then message = message "Announcement type is deferred Live\n" elseif(field1 == 0x82) then message = message .. "Announcement type is deferred Live or Delayed\n" elseif(field1 == 0x83) then message = message .. "Announcement type is deferred Delayed\n" elseif(field1 == 0x84) then message = message .. "Announcement type is deferred Prerecorded\n" elseif(field1 == 0x85) then message = message .. "Announcement type is deferred Record (new permanent message)\n" elseif(field1 == 0x86) then message = message .. "Announcement type is deferred Time Talker prerecorded announcement type\n" elseif(field1 == 0x87) then message = message .. "Announcement type is deferred AAS Manager prerecorded announcement type\n" elseif(field1 == 0x88) then message = message .. "Announcement type is deferred T-CAS prerecorded announcement\n" elseif(field1 == 0x89) then message = message .. "Announcement type is deferred T-CAS live announcement\n" elseif(field1 == 0x8a) then message = message .. "Intercom (vACS only)\n" elseif(field1 == 0x8b) then message = message .. "Monitor (vACS only)\n" elseif(field1 == 0x8c) then message = message .. "Mute (vACS only)\n" elseif(field1 == 0x8d) then message = message .. "TTS (vASC only)\n" elseif(field1 == 0x8e) then message = message .. "SMS (vACS only)\n" elseif((field1 >= 0x90) or (field1 <= 0x9f)) then y = field1 - 0x80 message = message .. "Test announcement using internal bus (ACS only): " .. y .. "\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",field1) end else if(field1 == 0x01) then message = message .. "Announcement type is Live\n" elseif(field1 == 0x02) then message = message .. "Announcement type is Live or Delayed\n" elseif(field1 == 0x03) then message = message .. "Announcement type is Delayed\n" elseif(field1 == 0x04) then message = message .. "Announcement type is Prerecoded\n" elseif(field1 == 0x05) then message = message .. "Announcement type is Record (new permanent message)\n" elseif(field1 == 0x06) then message = message .. "Announcement type is Time Talker prerecorded announcement type\n" elseif(field1 == 0x07) then message = message .. "Announcement type is AAS Manager prerecorded announcement\n" elseif(field1 == 0x08) then message = message .."Announcement type is T-CAS prerecorded announcement\n" elseif(field1 == 0x09) then message = message .. "Announcement type is T-CAS live announcement\n" elseif(field1 == 0x0a) then message = message .. "Announcement type is Intercom (vACS only)\n" elseif(field1 == 0x0b) then message = message .. "Announcement type is Monitor (vACS only)\n" elseif(field1 == 0x0c) then message = message .. "Announcement type is Mute (vACS only)\n" elseif(field1 == 0x0d) then message = message .. "Announcement type is TTS (vACS only)\n" elseif(field1 == 0x0e) then message = message .. "Announcement type SMS (vACS only)\n" elseif((field1 >= 0x10) or (field1 <= 0x1f)) then message = message .. "Test announcement using internal bus (ACS only): " .. fields1 .. "\n" else message = message .. "Unknown value" end end --field 2 field2 = fields[2] if(field2 < 0x80) then message = message .. "For test announcements mic stations are unlocked\n" else message = message .. "For test announcements all mic stations are locked\n" end --field 3 field3 = fields[3] if((field1 == 0x14) or(field1 == 0x94)) then message = message .. "Language ID: " .. fields[3] .. "\n" elseif((field1 <= 0x04) and (field1 >=0x01)) then message = message .. "Source ID: " .. fields[3] .. "\n" else message = message .. "Announcement Source ID: " .. fields[3] .. "\n" end --field 4 field4 = fields[4] msbSet = false wordQuantity = false if(field4 >= 0x80) then msbSet = true y = fields[4] - 0x80 message = message .. "Number of bytes in the zone bit list is: " .. y .. "\n" else message = message .. "Field 5 is a zone map list\n" end if(((field4 >= 0x40) and (field4 < 0x80)) or (field4 >= 0xc0)) then wordQuantity = true message = message .. "Zone maps are word quantities\n" elseif(((field4 < 0x40) and (field >= 0x80)) or (field4 < 0xc0)) then message = message .. "Zone maps are byte quatities\n" else message = message .. "Unknown value\n" end --field 5 field5 = fields[5] if(msbSet == true) then if(wordQuantity == true) then message = message .. "Zone bit list: " .. fields[5] .. fields[6] .. "\n" else message = message .. "Zone bit list: " .. fields[5] .. "\n" end else if(wordQuantity == true) then message = message .. "Zone map list: " .. fields[5] .. fields[6] .. "\n" else message = message .. "Zone map list: " .. fields[5] .. "\n" end end --field 6 field6 = fields[6] if(field6 == 0x00) then message = message .. "Plays infinitely\n" else message = message .. "Plays: " .. field6 .. " times\n" end --field 7 field7 = fields[7] if(((field1 == 0x0a) or (field1 == 0x8a)) or ((field1 == 0x0b) or (field1 == 0x8b))) then if(field7 >= 0x80) then field7 = field7 - 0x80 message = message .. "Tone delay: " .. field7 .. " seconds\n" else message = message .."Tone interval: " .. field7 .. " seconds\n" end elseif(((field1 == 0x01) or (field1 == 0x81)) or ((field1 == 0x05) or (field1 == 0x85))) then message = message .. "Field is not valid for Live or Record type announcements\n" else message = message .. "Invalid value\n" end --field 8 field8 = fields[8] if(field8 == 1) then message = message .. "Audio only\n" elseif(field8 == 2) then message = message .. "Visual only\n" elseif(field8 == 3) then message = message .. "Audio and visual\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",field8) end --field 9 field9 = fields[9] .. fields[10] if((field8 == 1) or (field8 == 3)) then message = message .. "Canned audio tone lead-in: " .. field9 .. "\n" else message = message .. "This field is invalid\n" end --field 10 field10 = fields[11] .. fields[12] if((field10 == 2) or (field10 == 3)) then message = message .. "Canned visual lead-in: " .. field10 .. "\n" else message = message .. "This field is invalid\n" end --field 11 field11 = fields[13] .. fields[14] storedMessageID = false if(((field1 == 0x0a) or (field1 == 0x8a)) or ((field1 == 0x0b) or (field1 == 0x8b))) then message = message .. "Tone take number: " .. field11 .. "\n" elseif((field1 == 0x0e) or (field1 == 0x8e)) then message = message .. "SMS List ID: " .. field11 .. "\n" else if(field11 >= 0x80) then storedMessageID = true message = message .. "Look in stored Message Audio takes in field 13\n" else message = message .. "Audio take to use for recording: " .. field11 .. "\n" end end --field 12 field12 = fields[15] .. fields[16] if(field1 == 1) then field12 = 0 message = message .. "Value changed to zero\n" elseif(field1 == 4) then message = message .. "Audio take numbers in field 13: " .. field12 .. "\n" elseif(field1 == 5) then if(field11 >= 0x80) then message = message .. "Maybe 0\n" else message = message .. "Maybe something other than 0\n" end else message = message .. "Unknown value, Error\n" end --field 13 i = 1 while (i <= (field12*2)) do field13 = fields13 .. fields[16+i] i = i+1 end if(field11 >= 0x80) then message = message .. "Recording Take numbers that make up the assembled message: " .. field13 .. "\n" else message = message .. "Audio Take numbers that make up the assembled message: " .. field13 .. "\n" end --field 14 field14 = fields[17+(field12*2)] .. fields[18+(field12*2)] if(((field1 == 0x01) or (field1 == 0x81)) or ((field1 == 0x02) or (field1 == 0x82) or ((field1 == 0x03) or (field1== 0x83)) or ((field1 == 0x05) or (field1 == 0x85)))) then message = message .. "Length of text: " .. field14 .. "\n" elseif((field1 == 0x04) or (field1 == 0x84)) then message = message .. "Visual take numbers: " .. field14 .. "\n" elseif((field1 == 0x0d) or (field1 == 0x8d)) then message = message .. "Number of characters in the XML string " .. field14 .. "\n" else if(field14 >= 0x80) then message = message .. "Length of text: " .. (field14 - 0x80) .. "\n" else message = message .. "Visual take numbers: " .. field14 .. "\n" end end --field 15 i = 1 while(i <= field14) do message = message .. string.char(fields[18+(field12*2)+i]) .. "\n" i = i+1 end message = message .. "\n" return "Announcement Request" .. message --msg = 8001 elseif(y == 0x8001) then --field 1 if(fields[1] == 0) then message = message .. "Command completed successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only IED Messages)\n" else message = message .. "NACK code:" .. fields[1] .. "\n" end --field 2 message = message .. "Annoncement ID: " .. fields[2] .. fields[3] .. "\n" return "Respond Announcement Request" .. message --msg = 0101 elseif(y == 0x0101) then --lol msbSet = false wordQuantity = false --field 1 message = message .. "Announcement ID: " .. fields[1] .. message --field 2 if(fields[2] < 0x80) then msbSet = true if(fields[2] >= 0xc0) then wordQuantity = true message = message .. "In word quantities \n" else message = message .. "In byte quantities \n" end message = message .. "Number of zone maps in the zonemap list: " .. (fields[2] - 0x80) .. "\n" else msbSet = true if(fields[2] >= 0xc0) then wordQuantity = true message = message .. "In word quantities \n" else message = message .. "In byte quantities \n" end message = message .. "Number of bytes in the zone bit list: " .. fields[2] .. "\n" end --field 3 if(msbSet == true) then --zonebit list **KAT removed word case for bitlist and made Hex 9/25/19 i = 1 message = message .. "Zone bitlist: " while (i <= fields[2]) do message = message .. string.format("0x%02x",fields[2+i]) .. " " i = i+1 end message = message .. "\n" else --zonemap list **v0.2.11 KAT fixed Word size to use two bytes 9/25/19 i = 1 if(wordQuantity == true) then -- 2 bytes each message = message .. "Zonebit list: " while (i <= (2*fields[2])) do if i == 1 then message = message .. (fields[2+i+1]*256) + fields[2+i] else message = message .. ", " .. (fields[2+i+1]*256) + fields[2+i] end i = i+2 end else --1 byte each message = message .. "Zonemap list: " while (i <= fields[2]) do if i == 1 then message = message .. fields[2+i] else message = message .. ", " .. fields[2+i] end i = i+1 end end message = message .. "\n" end return "Annoncement Ready " .. message --msg = 0002 **v0.2.11 KAT fixed Annc ID to be word 9/25/19 elseif(y == 0x0002) then --field 1 message = message .. "Announcement ID: " .. (fields[2]*256) + fields[1] .. "\n" return "End Announcement" .. message --msg = 0003 **v0.2.11 KAT fixed Annc ID to be word 9/25/19 elseif(y == 0x0003) then --field 1 message = message .. "Announcment ID: " .. (fields[2]*256) + fields[1] .. "\n" return "Announcement Complete" .. message --msg = 0004 elseif(y == 0x0004) then --field 1 if(fields[1] == 0) then message = message .. "Announcement has not started (died). Annoucement NEVER went active\n" elseif(fields[1] == 1) then message = message .. "Announcement has gone active\n" elseif(fields[1] == 2) then message = message .. "Announcement is ready (to go active)\n" elseif(fields[1] == 3) then message = message .. "Announcement is idle\n" elseif(fields[1] == 4) then message = message .. "Busy (GLOBALCOM Only)\n" elseif(fields[1] == 5) then message = message .. "Complete (GLOBALCOM Only)\n" else message = message .. "Unrecognized code\n" end --field 2 v0.2.11 KAT fixed byte order 9/25/19 message = message .. "AnncID: " .. (fields[3]*256) + fields[2] .. "\n" return "Announcement Active Status" .. message --msg = 0005 elseif(y == 0x0005) then --field 1 message = message .. "ACS Sys#: " .. fields[1] .. "\n" --field 2 message = message .. "DigAud Chan#: " .. fields[2] .. "\n" --field 3 message = message .. "Master Zn ObjID: " .. fields[3]+(fields[4]*256) .. "\n" --field 4 message = message .. "Master AnncID: " .. fields[5]+(fields[6]*256) .. "\n" --field 5 **v0.2.11 KAT Added in Run/Premept Priorities and bumped other fields down message = message .. "Run Pri: " .. fields[7] .. "\n" --field 6 message = message .. "Preempt Pri: " .. fields[8] .. "\n" --field 7 message = message .. "Act flags: " .. string.format("0x%02x%02x",fields[9],fields[10]) .. "\n" --field 8 length = fields[11] message = message .. "#Zmaps: " .. fields[11] .. "\n" --field 9 if(fields[12] == 1) then message = message .. "Aud\n" elseif(fields[12] == 2) then message = message .. "Vis\n" elseif(fields[12] == 3) then message = message .. "Aud/Vis\n" else message = message .. "A/V Flag:" .. fields[12] .. "\n" end --field 10 ** v0.2.11 KAT Fixed Word decode 9/25/19 message = message .. "Take/Text Len: " .. fields[13] + (fields[14]*256) .. "\n" --field 11 **KAT 9/25/19 Comment out showing clusters since nobody cares -- i = 1 -- message = message .. "Clusters: " -- while (i <= 12) do -- message = message .. fields[14+i] -- i = i+1 -- end -- message = message .. "\n" --field 12 **v0.2.11 KAT fixed Word decode & added commas 9/25/19 i = 1 message = message .. "Zmaps: " while (i <= length*2) do if i == 1 then message = message .. (fields[27+i]*256) + fields[26+i] .. " " else message = message .. ", " .. (fields[27+i]*256) + fields[26+i] .. " " end i = i+2 end message = message .."\n" --field 13 i = 1 message = message .. "Aud/Vis: " while (i <= fields[13] + (fields[14]*256)) do message = message .. string.char(fields[(26+(length*2))+i]) i = i+1 end return "Dig Aud Annc Request\n" .. message --msg = 8005 elseif(y == 0x8005) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecgonized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 **v0.2.11 KAT fixed Word quantity 9/25/19 message = message .. "Announcement ID: " .. (fields[3]*256) + fields[2] .. "\n" return "Respond Digital Audio Announcement Request" .. message --msg = 0006 elseif(y == 0x0006) then if(fields[1] == 0) then message = message .. "Drop the monitoring\n" else message = message .. "Route to system number: " .. fields[1] .. "\n" end return "Master Remote Monitoring Request via 510N" .. message --msg = 0021 --Added by Richard Green elseif(y == 0x0021) then -- Used abbreviations to add more fields without being truncated --field 1 message = message .. "Resp Behavior: " .. fields[1] if(fields[1] == 0x00)then message = message .. " (No resp)\n" elseif(fields[1] == 0x01) then message = message .. " (Norm resp)\n" elseif(fields[1] == 0x05) then message = message .. " (Delay resp by Device ID x N msec)\n" else message = message .. "\n" end --field 2 message = message .. " Conn Type: " .. string.format("0x%02x", fields[2]) if(fields[2] == 0x00) then message = message .. " (Disc Input)\n" elseif(fields[2] == 0x01) then message = message .. " (Conn Input)\n" elseif(fields[2] == 0x81) then message = message .. " (Perm Input)\n" elseif(fields[2] == 0x10) then message = message .. " (Disc Output)\n" elseif(fields[2] == 0x11) then message = message .. " (Conn Output)\n" elseif(fields[2] == 0x91) then message = message .. "(Perm Output)\n" else message = message .. "\n" end --field 3 message = message .. " Conn ID: " .. (fields[4] * 256) + fields[3] .. "\n" --field 4 message = message .. " Dev ID HI Byte: " .. fields[5] .. "\n" --field 5 --Limited to first three because the parse is getting truncated message = message .. " Dev ID List: " i = 0 i_limit = 3 while (i < i_limit) do ending = ", " if ((i + 1) == i_limit) then ending = "\n" end message = message .. string.format("0x%02x%s", fields[6+i], ending) i = i+1 end --field 6 message = message .. " Ch #: " .. fields[38] .. "\n" --field 7 message = message .. " Port #: " .. (fields[40] * 256) + fields[39] .. "\n" --field 8 message = message .. " RTP PL: " .. fields[41] .. "\n" --field 9 message = message .. " IO #: " .. fields[42] .. "\n" --field 10 message = message .. " TM LIM: " .. (fields[44] * 256) + fields[43] .. "\n" --field 11 message = message .. " Flags: " .. fields[45] .. "\n" return "Digital Audio Connection Request:\n" .. message --msg = 8021 --Added by Richard Green elseif(y == 0x8021) then -- Used abbreviations to add more fields without being truncated --field 1 message = message .. "ACK/NACK Response: " .. fields[1] .. "\n" --field 2 message = message .. " Conn ID: " .. (fields[3] * 256) + fields[2] .. "\n" --field 3 message = message .. " Dev ID: " .. (fields[5] * 256) + fields[4] .. "\n" return "Digital Audio Connection Response:\n" .. message --msg = 0023 (new Strobe Request) --Added by Ken Tench elseif(y == 0x0023) then -- Used abbreviations to add more fields without being truncated --field 1 message = message .. "Resp Behavior: " .. fields[1] if(fields[1] == 0x00)then message = message .. " (No resp)\n" elseif(fields[1] == 0x01) then message = message .. " (Norm resp)\n" elseif(fields[1] == 0x05) then message = message .. " (Delay resp by Device ID x N msec)\n" else message = message .. "\n" end --field 2 message = message .. " Conn Type: " .. string.format("0x%02x", fields[2]) if(fields[2] == 0x00) then message = message .. " (Deact)\n" elseif(fields[2] == 0x01) then message = message .. " (Act)\n" elseif(fields[2] == 0x17) then message = message .. " (Pulse)\n" else message = message .. "\n" end --field 3 message = message .. " Action ID: " .. (fields[4] * 256) + fields[3] .. "\n" --field 4 message = message .. " Dev ID HI Byte: " .. string.format("0x%02x\n",fields[5]) --field 5 --Limited to first three because the parse is getting truncated message = message .. " Dev ID List: " i = 0 i_limit = 3 while (i < i_limit) do ending = ", " if ((i + 1) == i_limit) then ending = "\n" end message = message .. string.format("0x%02x%s", fields[6+i], ending) i = i+1 end --field 6 message = message .. " Which?: " .. string.format("0x%02x",fields[38]) .. "\n" --field 7 message = message .. " Pulse Dur: " .. (fields[40] * 256) + fields[39] .. "\n" --field 8 (Because of little-endian in B G R order, zero at end if transparency - don't care) message = message .. " Strobe Color RGB: " message = message .. string.format("%02x %02x %02x\n",fields[43],fields[42],fields[41]) return "Digital Strobe Request:\n" .. message --msg = 8023 --Added by Ken Tench elseif(y == 0x8023) then -- Used abbreviations to add more fields without being truncated --field 1 message = message .. "ACK/NACK Response: " .. fields[1] .. "\n" --field 2 message = message .. " Action ID: " .. (fields[3] * 256) + fields[2] .. "\n" --field 3 message = message .. " Dev ID: " .. (fields[5] * 256) + fields[4] .. "\n" return "Digital Audio Strobe Response:\n" .. message --msg = 8025 --Added by Richard Green elseif(y == 0x8025) then -- Used abbreviations to add more fields without being truncated --field 1 message = message .. "ACK/NACK Resp: " .. fields[1] .. "\n" --field 2 message = message .. " Action ID: " .. (fields[3] * 256) + fields[2] .. "\n" --field 3 message = message .. " Dev ID: " .. (fields[5] * 256) + fields[4] .. "\n" return "Digital Device Relay Response:\n" .. message --msg = 0025 --Added by Richard Green elseif(y == 0x0025) then -- Used abbreviations to add more fields without being truncated --field 1 message = message .. "Resp Behavior: " .. fields[1] .. "\n" --field 2 message = message .. " Action Type: " .. string.format("0x%02x", fields[2]) .. "\n" --field 3 message = message .. " Action ID: " .. (fields[4] * 256) + fields[3] .. "\n" --field 4 message = message .. " Dev ID HI Byte: " .. fields[5] .. "\n" --field 5 --Limited to first three because the parse is getting truncated message = message .. " Dev ID List: " i = 0 i_limit = 3 while (i < i_limit) do ending = ", " if ((i + 1) == i_limit) then ending = "\n" end message = message .. string.format("0x%02x%s", fields[6+i], ending) i = i+1 end --field 6 message = message .. " Relay #: " .. fields[38] .. "\n" --field 7 message = message .. " Pulse Duration: " .. (fields[40] * 256) + fields[39] .. "\n" return "Digital Device Relay Request:\n" .. message else return "Unrecognized Message ID " .. y end --obj = 1100 elseif(x == 0x1100) then --msg = 0001 if(y == 0x0001) then return "Initialize" --msg = 0002 elseif(y == 0x0002) then --field 1 if(fields[1] == 0) then message = message .. "Do not respond to Network Message at all\n" elseif(fields[1] == 1) then message = message .. "Return response\n" elseif(fields[1] == 2) then message = message .. "Acknowledge the Network Message, but do not return the response fromthe audio controller\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[1]) end --field 2 length = fields[2] .. fields[3] message = message .. "Length of Message: " .. fields[2] .. fields[3] .. "\n" --field 3 i = 1 message = message .. "Message: " while (i <= length) do message = message .. string.char(fields[3+i]) i = i+1 end messge = message .. "\n" return "Audio Controller Direct Command" .. message --msg = 8002 elseif(y == 0x8002) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was Recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (only for IED Messages)\n" else message = message .. "Various orther error codes that can be defined" end --field 2 length = fields[2] .. fields[3] message = message .. "Length of message: " .. fields[2] .. fields[3] .. "\n" --field 3 i = 1 message = message .. "Message: " while (i <= length) do message = message .. string.char(fields[3+i]) i = i+1 end message = message .. "\n" return "Respond to Audio Controller Direct Command" .. message --msg = 0004 elseif(y == 0x0004) then --field 1 message = message .. "Local Audio Network Bus Number: " .. fields[1] .. "\n" --field 2 message = message .. "Number of non-local busses that are being requested to be used. This field will be zero if it desired to only capture the local bus" .. fields[2] .. "\n" --field 3 i = 1 length = fields[2] message = message .. "Audio Network Bus Usage: " while (i <= length) do message = message .. fields[2+i] .. "\n" return "Set Audio Network Bus Number" .. message end --msg = 8004 elseif(y == 0x8004) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (only for IED Messages)\n" else message = message .. "Various other error codes that can be defined" end --field 2 message = message .. "Local bus (if applicable)" .. fields[2] .. "\n" --field 3 length = fields[3] message = message .. "Number of non-local busses granted permission: " .. fields[3] .. "\n" --field 4 i = 1 message = message .. "Audio Network bus Numbers: " while (i <= length) do message = message .. fields[3+i] i = i+1 end message = message .. "\n" return "Respond Audio Network Bus Usage" .. message --msg = 0005 elseif(y == 0x0005) then --field 1 message = message .. "Local Bus number: " .. fields[1] .. "\n" --field 2 length = fields[2] message = message .. "number of non-local busses being freed: " .. fields[2] .. "\n" --field 3 i = 1 message = message .. "Audio Network Bus Numbers: " while (i <= length) do message = message .. fields[2+i] i = i+1 end message = message .. "\n" return "Release Audio Network Bus" .. message --msg = 0006 elseif(y == 0x0006) then --field 1 message = message .. "Audio Network Bus Numbers: " .. fields[1] .. "\n" return "Audio Network Bus Use Preemtped" .. message --msg = 0007 elseif(y == 0x0007) then return "Get Audio Controller type" --msg = 8007 elseif(y == 0x8007) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (only for IED Messages)\n" else message = message .. "Various otehr error codes that can be defined\n" end --field 2 if((fields[2] .. fields[3]) == 0x0001) then message = message .. "ACS type audio controller\n" elseif((fields[2] .. fields[3]) == 0x8000) then message = message .. "8000 type audio controller\n" else message = message .. "Undefined Audio controller type" end return "Respond Get Audio Controller type" .. message --msg = 000D elseif(y == 0x000d) then passwordLength = null pinSet = false graphicSet = false --field 1 if(fields[1] == 0) then passwordLength = 1 message = message .. "Passwords in field 4 are Word values with no PIN and no graphic permissions\n" elseif(fields[1] == 1) then passwordLength = 2 message = message .. "Passwords in field 4 are Long values with no PIN and no graphic permissions\n" elseif(fields[1] == 2) then passwordLength = 1 pinSet = true message = message .. "Passwords in field 4 are Word values with PIN and no graphic permissions\n" elseif(fields[1] == 3) then passwordLength = 2 pinSet = true message = message .. "Passwords in field 4 are Long values with PIN and no graphic permissions\n" elseif(fields[1] == 4) then passwordLength = 1 graphicSet = true message = message .. "Passwords in field 4 are Word values with graphics permissions and no PIN\n" elseif(fields[1] == 5) then passwordLength = 2 graphicSet = true message = message .. "Passwords in field 4 are Long values with graphics permissions and no PIN\n" elseif(fields[1] == 6) then passwordLength = 1 pinSet = true graphicSet = true message = message .. "Passwords in field 4 are Word values wtih graphics permissions and PIN\n" elseif(fields[1] == 7) then passwordLength = 2 pinSet = true graphicSet = true message = message .. "Passwords in field 4 are Long values wtih graphics permissions and PIN\n" else message = message .. "Unrecognized value: " .. string.format("0x%02x\n",fields[1]) end --field 2 if(fields[2] == 0) then message = message .. "Continuation\n" elseif(fields[2] == 1) then message = message .. "New\n" elseif(fields[2] == 2) then message = message .. "Modification\n" else message = message .. "Unrecognized code:" .. fields[2] .. "\n" end --field 3 if(fields[2] == 2) then message = message .. "Can only modify one message at a time\n" elseif(fields[3] > 60) then message = message .. "Can only have a max of 60 records in each message\n" else message = message .. "Number of records in this message: " .. fields[3] .. "\n" end --field 4 if(wordLength == 1) then message = message .. "Binary encoded representation of the password length word (16 bits): " .. fields[4] .. fields[5] .. "\n" elseif(wordLength == 2) then i = 1 message = message .. "Binary encoded representation of the password length long (): " while (i <= 8) do message = message .. fields[3+i] i = i+1 end message = message .. "\n" else message = message .. "Error\n" end if(pinSet == true) then i = 1 if(wordLength == 1) then message = message .. "Binary encoded representation of the PIN: " while (i <= 8) do message = message .. fields[i+5] i = i+1 end message = message .. "\n" else message = message .. "Binary encoded representation of the PIN: " while (i <= 8) do message = message .. fields[7+i] i = i+1 end message = message .. "\n" end else message = message .. "There is no PIN used\n" end if(pinSet == true) then if(wordLength == 1) then i = 1 message = message .. "Permission Array: " while (i <= 12) do message = message .. fields[13+i] i = i+1 end message = message .. "\n" i = 1 message = message .. "Airline Number: " while (i <= 8) do message = message .. fields[25+i] i = i+1 end message = message .. "\n" if(graphicSet == true) then i = 1 message = message .. "Graphic Permission: " while (i <= 8) do message = message .. fields[33+i] i = i+1 end message = message .. "\n" message = message .. "528 Language: " .. fields[42] .. "\n" else message = message .. "No Graphic Permissions\n" end else i = 1 message = message .. "Permission Array: " while (i <= 12) do message = message .. fields[20+i] i = i+1 end message = message .. "\n" i = 1 message = message .. "Airline Number: " while (i <= 8) do message = message .. fields[32+i] i = i+1 end message = message .. "\n" if(graphicSet == true) then i = 1 message = message .. "Graphic Permission: " while (i <= 8) do message = message .. fields[40+i] i = i+1 end message = message .. "\n" message = message .. "528 Language: " .. fields[48] .. "\n" else message = message .. "No Graphic Permission\n" end end else if(wordLength == 1) then i = 1 message = message .. "Permission Array: " while (i <= 12) do message = message .. fields[15+i] i = i+1 end message = message .. "\n" i = 1 message = message .. "Airline Number: " while (i <= 8) do message = message .. fields[27+i] i = i+1 end message = message .. "\n" if(graphicSet == true) then i = 1 message = message .. "Graphic Permission: " while (i <= 8) do message = message .. fields[26+i] i = i+1 end message = message .. "\n" message = message .. "528 Language: " .. fields[36] .. "\n" else message = message .. "No Graphic Permission\n" end else i = 1 message = message .. "Permission Array: " while (i <= 12) do message = message .. fields[12+i] i = i+1 end message = message .. "\n" i = 1 message = message .. "Airline Number: " while (i <= 8) do message = message .. fields[24+i] i = i+1 end message = message .. "\n" if(graphicSet == true) then i = 1 message = message .. "Graphic Permission: " while (i <= 8) do message = message .. fields[32+i] i = i+1 end message = message .. "\n" message = message .. "528 Language: " .. fields[40] .. "\n" else message = message .. "No Graphic Permission\n" end end end return "Mic Station Security table" .. message --msg = 000F elseif(y == 0x000f) then --field 1 message = message .. "Mic Station Number: " .. fields[1] .. fields[2] .. "\n" --field 2 message = message .. "Pass Code used to login to Mic: " .. fields[3] .. fields[4] .. "\n" return "Mic Station Login Request" --msg = 0100 elseif(y == 0x0100) then --field 1 message = message .. "Subsystem to test: " .. fields[1] .. "\n" return "Test Audio Controller System Components" --msg = 0101 elseif(y == 0x0101) then --lol --field 1 message = message .. "Subsystem to test: " .. fields[1] .. "\n" --field 2 i = 1 message = message .. "Time in 24 hour format: " while (i <= 8) do message = message .. string.char(fields[1+i]) i = i+1 end message = message .. "\n" return "Set Audio Controller System test time" .. message --msg = 0102 elseif(y == 0x0102) then return "Get Audio Controller System test time" --msg = 8102 elseif(y == 0x8102) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "Subsystem to test: " .. fields[2] .."\n" --field 3 i = 1 message = message .. "Time in 24 hour format: " while (i <= 8) do message = message .. fields[2+i] i = i+1 end message = message .. "\n" return "Respond Get Audio Controller System test time" .. message --msg = 0113 --Added by Richard Green elseif(y == 0x0113) then --field 1 message = message .. "Multicast IP: " .. string.format("%d.%d.%d.%d\n", fields[1], fields[2], fields[3], fields[4]) return "Set Multicast Control Group:\n" .. message --msg = 8113 --Added by Richard Green elseif(y == 0x8113) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" end return "Respond Set Multicast Control Group:" .. message --msg = 0114 --Added by Richard Green elseif(y == 0x0114) then return "Get Multicast Control Group\n" .. message --msg = 8114 --Added by Richard Green elseif(y == 0x8114) then --field 1 message = message .. "Response Behavior: " .. fields[1] .. "\n" --field 2 message = message .. " Multicast IP: " .. string.format("%d.%d.%d.%d\n", fields[2], fields[3], fields[4], fields[5]) return "Respond Get Multicast Control Group:\n" .. message --msg = 0115 --Added by Richard Green elseif(y == 0x0115) then --field 1 message = message .. "# Rcvr Defs: " .. fields[1] .. "\n" --field 2 message = message .. " [0] Rcvr #: " .. fields[2] .. "\n" --field 3 message = message .. " [0] Rcvr Ch Lvl: " .. fields[3] .. "\n" --field x if (fields[1] > 1) then message = message .. " ..." .. "\n" end return "Set Device Audio Levels:\n" .. message --msg = 8115 --Added by Richard Green elseif(y == 0x8115) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" end return "Respond Set Device Audio Levels:" .. message --msg = 0116 --Added by Richard Green elseif(y == 0x0116) then return "Get Device Audio Levels\n" .. message --msg = 8116 --Added by Richard Green elseif(y == 0x8116) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" end --field 2 message = message .. "# Rcvr Defs: " .. fields[2] .. "\n" --field 3 message = message .. " Rcvr # @ lvl': " if(fields[2] >= 1) then message = message .. string.format("%d@%d", fields[3], fields[4]) end if(fields[2] >= 2) then message = message .. string.format(", %d@%d", fields[5], fields[6]) end if(fields[2] >= 3) then message = message .. string.format(", %d@%d", fields[7], fields[8]) end if(fields[2] >= 4) then message = message .. string.format(", %d@%d", fields[9], fields[10]) end if(fields[2] >= 5) then message = message .. string.format(", %d@%d", fields[11], fields[12]) end if(fields[2] >= 6) then message = message .. string.format(", %d@%d", fields[13], fields[14]) end if(fields[2] >= 7) then message = message .. string.format(", %d@%d", fields[15], fields[16]) end if(fields[2] >= 8) then message = message .. string.format(", %d@%d", fields[17], fields[18]) end if(fields[2] >= 9) then message = message .. string.format(", %d@%d", fields[19], fields[20]) end if(fields[2] >= 10) then message = message .. string.format(", %d@%d", fields[21], fields[22]) end if(fields[2] >= 11) then message = message .. string.format(", %d@%d", fields[23], fields[24]) end if(fields[2] >= 12) then message = message .. string.format(", %d@%d", fields[25], fields[26]) end if(fields[2] >= 13) then message = message .. string.format(", %d@%d", fields[27], fields[28]) end message = message .."\n" return "Respond Set Device Audio Levels:" .. message else return "Unrecognized Message ID " .. y end --obj = 1110 elseif(x == 0x1110) then --msg = 0005 if(y == 0x0005) then --field 1 message = message .. "Take Number: " .. fields[1] .. "\n" return "Get take Length" .. message --msg = 8005 elseif(y == 0x8005) then --field 1 message = message .. "Take Length: " .. fields[1] .. "\n" return "Respond Get take Length" .. message else return "Unrecognized Message ID " .. y end --obj = 1200 elseif(x == 0x1200) then --msg = 0001 if(y == 0x0001) then return "Initialize" --msg = 0002 elseif(y == 0x0002) then return "Display/Defer a test Message" --msg = 4002 w/o response elseif(y == 0x4002) then return "Display/Defer a test Message, Without a Response" --msg = 0003 elseif(y == 0x0003) then return "Display Deferred test Message" --msg = 4003 w/o response elseif(y == 0x4003) then return "Display Deferred test Message, Without a Response" --msg = 0004 elseif(y == 0x0004) then --field 1 message = message .. "Response Flag: " .. fields[1] .. "\n" --field 2 length = fields[2] .. fields[3] message = message .. "Number of bytes in field 3: " .. fields[2] .. fields[3] .. "\n" --field 3 i = 1 message = message .. "Data to be sent directly to equipment: " while (i <= length) do message = message .. fields[3+i] i = i+1 end message = message .. "\n" return "Visual Display Controller Direct Command" --msg = 8004 elseif(y == 0x8004) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 length = fields[2] .. fields[3] message = message .. "Number of bytes in field 3: " .. fields[2] .. fields[3] .. "\n" --field 3 i = 1 message = message .. "Data: " while (i <= length) do message = message .. fields[3+i] i = i+1 end message = message .. "\n" return "Respond to Visual Display Controller Direct Message" .. message --msg = 0010 elseif(y == 0x0010) then --field 1 message = message .. "Priority of message: " .. fields[1] .. fields[2] .. "\n" --field 2 message = message .. "Message Number to invoke: " .. fields[3] .. "\n" --field 3 message = message .. "Message hold time: " .. fields[4] .. fields[5] .. "\n" --field 4 zoneMap = 0 if(fields[6] == 0) then zoneMap = 1 message = message .. "Zone info to follow\n" elseif(fields[6] == 1) then zoneMap = 2 message = message .. "Sign number info to follow\n" else message = message .."Error\n" end --field 5 sig5 = false if(fields[7] >=80) then sig5 = true if(fields[6] == 0) then zoneMap = 1 message = message .. "Number of bytes in zonemap list: " .. (fields[7] - 0x80) .. "\n" elseif(fields[6] == 1) then zoneMap = 2 message = message .. "Number of bytes in sign list: " .. (fields[7] - 0x80) .. "\n" else message = message .. "Error\n" end elseif(fields[7] == 0) then message = message .. "All signs that the visual display controller controls will display the message\n" else if(fields[6] == 0) then zoneMap = 1 message = message .. "Number of zonemaps: " .. fields[7] .. "\n" elseif(fields[6] == 1) then zoneMap = 2 message = message .. "Number of bytes in sign list: " .. fields[7] .. "\n" else message = message .."Error\n" end end --field 6 i = 1 val = fields[7] - 0x80 if(sig5 == true) then if(zoneMap == 1) then while(i= 0x80) then sig4 = 2 message = message .. "Number of bytes in zonemap/sign bitmap: " .. (fields[6] - 0x80) .. "\n" elseif(fields[6] == 0) then message = message .. "All signs that the visual display controller controls will display the messag\n" else sig4 = 1 message = message .. "Number of zonemap/sign list: " .. fields[6] .. "\n" end --field 5 i = 1 if(sig4 == 1) then if(zoneMap == 1) then while(i < fields[6]) do message = message .. "Zonemap list " .. fields[6+i] i = i+1 end message = message .. "\n" elseif(zoneMap == 2) then while(i < fields[6]) do message = message .. "Sign list " .. fields[6+i] i = i+1 end message = message .. "\n" else message = message .. "Error\n" end elseif(sig4 == 2) then if(zoneMap == 1) then while(i < fields[6]) do if(bitband(fields[6+i],0x01) == 0x01) then message = message .. "Zonemap " .. i .. " is filled\n" i = i+1 elseif(bitband(fields[6+i],0x02) == 0x02) then message = message .. "Zonemap " .. i .. " is filled\n" i = i+1 elseif(bitband(fields[6+i],0x04) == 0x04) then message = message .. "Zonemap " .. i .. " is filled\n" i = i+1 elseif(bitband(fields[6+i],0x08) == 0x08) then message = message .. "Zone map " .. i .. " is filled\n" i = i+1 elseif(bitband(fields[6+i],0x10) == 0x10) then message = message .. "Zone map " .. i .. " is filled\n" i = i+1 elseif(bitband(fields[6+i],0x20) == 0x20) then message = message .. "Zone map " .. i .. " is filled\n" i = i+1 elseif(bitband(fields[6+i],0x40) == 0x40) then message = message .. "Zone map " .. i .. " is filled\n" i = i+1 elseif(bitband(fields[6+i],0x80) == 0x80) then message = message .. "Zone map " .. i .. " is filled\n" i = i+1 else message = message .. "Error\n" end end elseif(zoneMap == 2) then while(i= 0x80) then message = message .. "Panel Number of Message: " .. (fields[2] - 0x80) .. "\n" else message = message .. "Panel Number of Message: " .. fields[2] .. "\n" end --field 3 if(fields[1] >= 0x80) then message = message .. "Message ID: " .. fields[3] .. fields[4] .. "\n" else message = message .. "No Message ID, message is not deferred\n" end --field 4 if(fields[1] >= 0x80) then if((fields[5] ..fields[6])== 0) then message = message .. "Text message\n" elseif((fields[5] .. fields[6]) == 1) then message = message .. "Pre-made File\n" elseif((fields[5] .. fields[6]) == 2) then message = message .. "HTML Stream\n" elseif((fields[5] .. fields[6]) == 3) then message = message .. "FLASH Module\n" else message = message .. "Error\n" end else if((fields[3] .. fields[4]) == 0) then message = message .. "Text message\n" elseif((fields[3] .. fields[4]) == 1)then message = message .. "Pre-made File\n" elseif((fields[3] .. fields[4]) == 2) then message = message .. "HTML Stream\n" elseif((fields[3] .. fields[4]) == 3) then message = message .. "FLASH Module\n" else message = message .. "Error\n" end end --field 5 if(fields[1] >= 0x80) then message = message .. "Message hold time: " .. fields[7] .. fields[8] .. "\n" else message = message .. "Message hold time: " .. fields[5] .. fields[6] .. "\n" end --field 6 if(fields[1] >= 0x80) then message = message .. "Text size: " .. fields[9] .. fields[10] .. "\n" else message = message .. "Text size: " .. fields[7] .. fields[8] .. "\n" end --field 7 zoneMap = 0 if(fields[1] >= 0x80) then if(fields[11] == 0) then zoneMap = 1 message = message .. "Zone info to follow\n" elseif(fields[11] == 1) then zoneMap = 2 message = message .. "Sign number info to follow\n" else message = message .. "Error\n" end else if(fields[9] == 0) then zoneMap = 1 message = message .. "Zone info to follow\n" elseif(fields[9] == 1) then zoneMap = 2 message = message .. "Sign number info to follow\n" else message = message .. "Error\n" end end --field 8 if(fields[1] >=0x80) then if(zoneMap == 1) then message = message .. "Number of Zones in the list: " .. fields[12] .. "\n" elseif(zoneMap == 2) then message = message .. "Number of Signs in the list: " .. fields[12] .. "\n" else message = message .. "Error\n" end else if(zoneMap == 1) then message = message .. "Number of zones in the list: " .. fields[10] .. "\n" elseif(zoneMap == 2) then message = message .. "Number of Sign in the list: " .. fields[10] .. "\n" else message = message .. "Error\n" end end --field 9 i = 1 if(fields[1] >= 0x80) then if(zoneMap == 1) then while(i <= fields[12]) do message = message .. "Zonemap list " .. fields[12+i] .. "\n" i = i+1 end elseif(zoneMap == 2) then while(i <= fields[12]) do message = message .. "Sign list " .. fields[12+i] .. "\n" i = i+1 end else message = message .. "Error\n" end else if(zoneMap == 1) then while(i <= fields[10]) do message = message .. "Zonemap list " .. fields[10+i] .. "\n" i = i+1 end elseif(zoneMap == 2) then while(i <= fields[10]) do message = message .. "Zonemap list " .. fields[10+i] .. "\n" end else message = message .. "Error\n" end end --field 10 if(fields[1] >= 0x80) then length = fields[13+i] .. fields[14+i] message = message .. "Length of text message: " .. fields[13+i] .. fields[14+i] .. "\n" else length = fields[11+i] .. fields[12+i] message = message .. "Length of text message: " .. fields[11+i] .. fields[12+i] .. "\n" end --field 11 if(fields[1] >= 0x80) then i = 1 message = message .. "Text Message (text between <> refer to tags that denote font/style changes): " while (i <= length) do message = message .. string.char(fields[15+i]) i = i+1 end message = message .. "\n" else i = 1 message = message .. "Text Message (text between <> refer to tags that denote font/style changes): " while (i <= length) do message = message .. string.char(fields[15+i]) i = i+1 end message = message .."\n" end return "Store Continuous Play test messages" .. message --msg = 4015 w/o response elseif(y == 0x4015) then --field 1 message = message .. "Priority of Message (Lower = higher priority) " .. fields[1] .. "\n" --field 2 if(fields[2] >= 0x80) then message = message .. "Panel Number of Message " .. (fields[2] - 0x80) .. "\n" else message = message .. "Panel Number of Message " .. fields[2] .. "\n" end --field 3 if(fields[1] >= 0x80) then message = message .. "Message ID: " .. fields[3] .. fields[4] .. "\n" else message = message .. "No Message ID, message is not deferred\n" end --field 4 if(fields[1] >= 0x80) then if((fields[5] .. fields[6]) == 0) then message = message .. "Text message\n" elseif((fields[5] .. fields[6]) == 1) then message = message .. "Pre-made File\n" elseif((fields[5] .. fields[6]) == 2) then message = message .. "HTML Stream\n" elseif((fields[5] .. fields[6]) == 3) then message = message .. "FLASH Module\n" else message = message .. "Error\n" end else if((fields[3] .. fields[4]) == 0) then message = message .. "Text message\n" elseif((fields[3] .. fields[4]) == 1)then message = message .. "Pre-made File\n" elseif((fields[3] .. fields[4]) == 2) then message = message .. "HTML Stream\n" elseif((fields[3] .. fields[4]) == 3) then message = message .. "FLASH Module\n" else message = message .. "Error\n" end end --field 5 if(fields[1] >= 0x80) then message = message .. "Message hold time: " .. fields[7] .. fields[8] .. "\n" else message = message .. "Message hold time: " .. fieds[5] .. fields[6] .. "\n" end --field 6 if(fields[1] >= 0x80) then message = message .. "Text size: " .. fields[9] .. fields[10] .. "\n" else message = message .. "Text size: " .. fields[7] .. fields[8] .. "\n" end --field 7 zoneMap = 0 if(fields[1] >= 0x80) then if(fields[1] == 0) then zoneMap = 1 message = message .. "Zone info to follow\n" elseif(fields[1] == 1) then zoneMap = 2 message = message .. "Sign number info to follow\n" else message = message .. "Error\n" end else if(fields[9] == 0) then zoneMap = 1 message = message .. "Zone info to follow\n" elseif(fields[9] == 1) then zoneMap = 2 message = message .. "Sign number info to follow\n" else message = message .. "Error\n" end end --field 8 if(fields[1] >=0x80) then if(zoneMap == 1) then message = message .. "Number of Zones in the list: " .. fields[12] .. "\n" elseif(zoneMap == 2) then message = message .. "Number of Signs in the list: " .. fields[12] .. "\n" else message = message .. "Error\n" end else if(zoneMap == 1) then message = message .. "Number of zones in the list: " .. fields[10] .. "\n" elseif(zoneMap == 2) then message = message .. "Number of Sign in the list: " .. fields[10] .. "\n" else message = message .. "Error\n" end end --field 9 i = 1 if(fields[1] >= 0x80) then if(zoneMap == 1) then while(i <= fields[12]) do message = message .. "Zonemap list " .. fields[12+i] .. "\n" i = i+1 end elseif(zoneMap == 2) then while(i <= fields[12]) do message = message .. "Sign list " .. fields[12+i] .. "\n" i = i+1 end else message = message .. "Error\n" end else if(zoneMap == 1) then while(i <= fields[10]) do message = message .. "Zonemap list " .. fields[10+i] .. "\n" i = i+1 end elseif(zoneMap == 2) then while(i <= fields[10]) do message = message .. "Zonemap list " .. fields[10+i] .. "\n" i = i+1 end else message = message .. "Error\n" end end --field 10 if(fields[1] >= 0x80) then length = fields[13+i] .. fields[14+i] message = message .. "Length of text message: " .. fields[13+i] .. fields[14+i] .. "\n" else length = fields[13+i] .. fields[14+i] message = message .. "Length of text message: " .. fields[11+i] .. fields[12+i] .. "\n" end --field 11 if(fields[1] >= 0x80) then i = 1 message = message .. "Text Message (text between <> refer to tags that denote font/style changes): " while (i <= length) do message = message .. string.char(fields[15+i]) i = i+1 end message = message .. "\n" else i = 1 message = message .. "Text Message (text between <> refer to tags that denote font/style changes): " while (i <= length) do message = message .. string.char(fields[15+i]) i = i+1 end message = message .."\n" end return "Store continuous Play test Message, Without Response" .. message --msg = 0016 elseif(y == 0x0016) then --field 1 message = message .. "Message Slot Number: " .. fields[1] .. fields[2] .. "\n" --field 2 if(fields[3] == 0) then message = message .. "Zone info to follow\n" elseif(fields[3] == 1) then message = message .. "Sign number info to follow\n" else message = message .. "Error\n" end --field 3 if(fields[3] == 0) then message = message .. "Number of zones in the zone list: " .. fields[4] .. "\n" elseif(fields[3] == 1) then message = message .. "Number of signs in the sign list: " .. fields[4] .. "\n" else message = message .. "Error\n" end --field 4 i = 1 if(fields[3] == 0) then while(fields[4] > i) do message = message .. "Zone " .. i .. ": " .. fields[4+i] i = i+1 end message = message .. "\n" elseif(fields[3] == 1) then while(fields[4] > i) do message = message .. "Sign " .. i .. ": " .. fields[4+i] i = i+1 end message = message .. "\n" else message = message .. "Error\n" end return "Delete Continuous Play test Message" .. message --msg = 0017 elseif(y == 0x0017) then --field 1 message = message .. "Panel Number: " .. fields[1] .. fields[2] .. "\n" --field 2 if(fields[3] == 0) then message = message .. "Zone info to follow\n" elseif(fields[3] == 1) then message = message .. "Sign number info to follow\n" else message = message .. "Error\n" end --field 3 if(fields[3] == 0) then message = message .. "Number of zones: " .. fields[4] .. "\n" elseif(fields[3] == 1) then message = message .. "Number of signs: " .. fields[4].. "\n" else message = message .. "Error\n" end --field 4 i = 1 if(fields[3] == 0) then while(fields[4] > i) do message = message .. "Zone " .. i .. ": " .. fields[4+i] .. "\n" i = i+1 end elseif(fields[3] == 1) then while(fields[4] > i) do message = message .. "Sign " .. i .. ": " .. fields[4+i] .. "\n" i = i+1 end else message = message .. "Error\n" end return "Cancel Currently Playing test Message" .. message --msg = 0018 elseif(y == 0x0018) then --field 1 if(fields[1] == 0) then message = message .. "Stop Playing Continuous Play Messages\n" elseif(fields[1] == 1) then message = message .. "Start Playing Continuous Play Messages\n" else message = message .. "Error\n" end --field 2 if(fields[2] == 0) then message = message .. "Zone info to follow\n" elseif(fields[2] == 1) then message = message .. "Sign info to follow\n" else message = message .. "Error\n" end --field 3 if(fields[2] == 0) then message = message .. "Number of zones: " .. fields[3] .. "\n" elseif(fields[2] == 1) then message = message .. "Number of signs: " .. fields[3] .. "\n" else message = message .. "Error\n" end --field 4 i = 1 if(fields[2] == 0) then while(fields[3] > i) do message = message .. "Zone " .. i .. ": " .. fields[4+i] i = i+1 end message = message .. "\n" elseif(fields[2] == 1) then while(fields[3] > i) do message = message .. "Sign " .. i .. ": " .. fields[4+i] .. "\n" i = i+1 end message = message .. "\n" else message = message .. "Error\n" end return "Start/Stop Continuous Play Message" .. message --msg = 0019 elseif(y == 0x0019) then --field 1 message = message .. "Message Slot Number: " .. fields[1] .. fields[2] .. "\n" --field 2 if(fields[3] == 0) then message = message .. "Zone info to follow\n" elseif(fields[3] == 1) then message = message .. "Sign number info to follow\n" else message = message .. "Error\n" end return "Get Continuous Count" .. message --msg = 8019 elseif(y == 0x8019) then --field 1 length = fields[1] .. fields[2] message = message .. "Length: " .. fields[1] .. fields[2] .. "\n" --field 2 i = 1 message = message .. "Message Counts: \n" while(length >= i) do message = message .. "Slot Number Deleted: " .. fields[2+i] .. "\n" i = i+1 message = message .. "Number of times the message has been played since loading: " .. fields[2+i] .. "\n" i = i+1 end return "Respond Get Continuous Count" .. message --msg = 0020 elseif(y == 0x0020) then --field 1 message = message .. "Display Number: " .. fields[1] .. "\n" --field 2 message = message .. "Sign ID: " .. fields[2] .. "\n" --field 3 message = message .. "Zone ID: " .. fields[3] .. "\n" --field 4 message = message .. "Display ID: " .. fields[4] .. "\n" --field 5 message = message .. "Screen Top: " .. fields[5] .. fields[6] .. "\n" --field 6 message = message .. "Screen Left: " .. fields[7] .. fields[8] .. "\n" --field 7 message = message .. "Screen Width: " .. fields[9] .. fields[10] .. "\n" --field 8 message = message .. "Screen Height: " .. fields[11] .. fields[12] .. "\n" --field 9 message = message .. "Default Text Size: " .. fields[13] .. "\n" return "Set Visual Display Configuration" .. message --msg = 0100 elseif(y == 0x0100) then return "Test Visual Display Controller System Components" --msg = 0101 elseif(y == 0x0101) then --lol return "Set Visual Display Controller System Test Time" --msg = 0102 elseif(y == 0x0102) then return "Set Visual Display Controller System test time" --msg = 8102 elseif(y == 0x8102) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = messsage .. "NACK code: " .. fields[1] .. "\n" end return "Respond Get Visual Display Controller System test time" .. message else return "Unrecognized Message ID " .. y end --obj = 1300 elseif(x == 0x1300) then --msg = 0001 if(y == 0x0001) then return "Resource Status" --msg = 0002 elseif(y == 0x0002) then return "Resync Request" --msg = 0003 elseif(y == 0x0003) then return "Flight Announcement Request/Played" --msg = 0004 elseif(y == 0x0004) then return "Flight Record Arrival" --msg = 0005 elseif(y == 0x0005) then return "Flight Record Departure" --msg = 0006 elseif(y == 0x0006) then return "Fire Alarm Announcement Request" --msg = 0007 elseif(y == 0x0007) then return "Flight Record Update Request" --msg = 0008 elseif(y == 0x0008) then return "Flight Announcement Sequence Started" --msg = 0009 elseif(y == 0x0009) then return "Flight Announcement Sequence Cancelled" --msg = 0010 elseif(y == 0x0010) then return "Flight Announce Request to Audio Controller" --msg = 0011 elseif(y == 0x0011) then return "Flight Announcement Sequence Load" --msg = 0012 elseif(y == 0x0012) then return "Flight Announcement Sequence Delete" --msg = 0013 elseif(y == 0x0013) then return "Flight Announcement Request" --msg = 0020 elseif(y == 0x0020) then return "Flight Status Update" --msg = 0021 elseif(y == 0x0021) then return "Clear All Scheduled flights" else return "Unrecognized Message ID " .. y end --obj = 2100 elseif(x == 0x2100) then --msg = 0002 if(y == 0x0002) then --field 1 if(fields[1] == 0) then message = message .. "Do not respond to Network Message at all\n" elseif(fields[1] == 1) then message = message .. "Return response\n" elseif(fields[1] == 2) then message = message .. "Acknowledge Network Message, but do not return the response from the IED540\n" else message = message .. "Error\n" end --field 2 message = message .. "Address Number: " .. fields[2] .. "\n" --field 3 message = message .. "Command Code: " .. fields[3] .. "\n" --field 4 length = fields[4] message = message .. "Length: " .. fields[4] .. "\n" --field 5 i = 1 message = message .. "Data: " while (i <= length) do message = message .. string.char(fields[5+i]) i = i+1 end message = message .. "\n" return "Write Request" .. message --msg = 8002 elseif(y == 0x8002) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only IED Message)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "Address Number: " .. fields[2] .. "\n" --field 3 message = message .. "Command Code: " .. fields[3] .. "\n" --field 4 if(fields[4] == 0) then message = message .. "Ok\n" elseif(fields[4] == 1) then message = message .. "DSR Not Set Error\n" elseif(fields[4] == 2) then message = message .. "Transmit Board Address Error\n" elseif(fields[4] == 3) then message = message .. "No DSR Error\n" elseif(fields[4] == 4) then message = message .. "Transmit Command Code Error\n" elseif(fields[4] == 5) then message = message .. "Response Command Code Error\n" elseif(fields[4] == 6) then message = message .. "Read/Write 540 Status Error\n" elseif(fields[4] == 11) then message = message .. "Transmit Error\n" elseif(fields[4] == 12) then message = message .. "Checksum Write Error\n" elseif(fields[4] == 13) then message = message .. "Write 540 Status Error\n" elseif(fields[4] == 14) then message = message .. "After Checksum Read Error\n" elseif(fields[4] == 15) then message = message .. "No I/O Port Error\n" else message = message .. "Error\n" end --field 5 message = message .. "Write 540 Status: " .. fields[5] .. "\n" --field 6 message = message .. "Write 540 Status: " .. fields[6] .. "\n" return "Respond Write Request" .. message --msg = 0003 elseif(y == 0x0003) then --field 1 if(fields[1] == 0) then message = message .. "Do not respond to Network Message at all\n" elseif(fields[1] == 1) then message = message .. "Return response\n" elseif(fields[1] == 2) then message = message .. "Acknowledge Network Message, but do not return the response from the IED540\n" else message = message .. "Error\n" end --field 2 message = message .. "Address Number: " .. fields[2] .. "\n" --field 3 message = message .. "command Code: " .. fields[3] .. "\n" --field 4 message = message .. "Length: " .. fields[4] .. "\n" return "Read Request" .. message --msg = 8003 elseif(y == 0x8003) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "Address Number: " .. fields[2] .. "\n" --field 3 message = message .. "Command Code: " .. fields[3] .. "\n" --field 4 length = fields[4] message = message .. "Length: " .. fields[4] .. "\n" --field 5 i = 1 message = message .. "Text: " while (i <= length) do message = message .. string.char(fields[4+i]) .. "\n" --field 6 if(fields[5+length] == 0) then message = message .. "Ok\n" elseif(fields[5+length] == 1) then message = message .. "DSR Not Set Error\n" elseif(fields[5+length] == 1) then message = message .. "Transmit Board Address Error\n" elseif(fields[5+length] == 2) then message = message .. "Response Command Code Error\n" elseif(fields[5+length] == 3) then message = message .. "No DSR Error\n" elseif(fields[5+length] == 4) then message = message .. "Transmit Command Code Error\n" elseif(fields[5+length] == 5) then message = message .. "Response Command Code Error\n" elseif(fields[5+length] == 6) then message = message .. "Read/Write 540 Status Error\n" elseif(fields[5+length] == 7) then message = message .. "No Response Error\n" elseif(fields[5+length] == 8) then message = message .. "No Checksum Error\n" elseif(fields[5+length] == 9) then message = message .. "Wrong Checksum Error\n" elseif(fields[5+length] == 10) then message = message .. "DSR Not Dropped Error\n" elseif(fields[5+length] == 15) then message = message .. "No I/O Port Error\n" else message = message .. "Error\n" end --field 7 message = message .. "Read 540 Status: " .. fields[6+length] .. "\n" return "Respond Read Request" .. message end else return "Unrecognized Message ID " .. y end --obj = 2200 elseif(x == 0x2200) then --msg = 0002 if(y == 0x0002) then --field 1 if(fields[1] == 0) then message = message .. "Do not respond to Network Message at all\n" elseif(fields[1] == 1) then message = message .. "Return response\n" elseif(fields[1] == 2) then message = message .. "Acknowledge Network Message, but do not return the response from the IED device\n" else message = message .. "Error\n" end --field 2 message = message .. "Address Number: " .. fields[2] .. "\n" --field 3 length = fields[3] message = message .. "Length: " .. fields[3] .. "\n" --field 4 i = 1 message = message .. "Data: " while (i <= length) do message = message .. fields[3+i] i = i+1 end return "Transfer Request" .. message --msg = 8002 elseif(y == 0x8002) then --field 1 if(fields[1] == 0) then message = message .. "Everything OK\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "No device responded to the Address with DSR\n" elseif(fields[1] == 4) then message = message .. "DSR not released after sending of data byte(s)\n" elseif(fields[1] == 9) then message = message .. "Status byte not returned from device\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "Address Number: " .. fields[2] .. "\n" --field 4 if((fields[1] == 0) or (fields[1] == 2)) then message = message .. "Status from the IED-422 Device: 0" else message = message .. "Status from the IED-422 Device: " .. fields[3] .. "\n" end return "Respond Transfer Request" .. message else return "Unrecognized Message ID " .. y end --obj = 3000 elseif(x == 0x3000) then --msg = 0001 if(y == 0x0001) then return "Initialize" --msg = 0002 elseif(y == 0x002) then return "Request Fault Status" --msg 8002 elseif(y == 0x8002) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 length = fields[2] .. fields[3] --bytes 1 and 2 of field 2 = # of bytes in the fault list excluding MSB message = message .. "Number of bytes in fault in the fault list: " .. fields[2] .. fields[3] .. "\n" --convert string to int length = tonumber(length) --field 3 i = 1 if(fields[2] >= 0x80) then message = message .. "3 bytes each: " while (i <= length) do message = message .. fields[3+i] i = i+1 message = message .. fields[3+i] i = i+1 message = message .. fields[3+i] i = i+1 message = message .. "\n" end message = message .."\n" else while (i <= length) do message = message .. "Field 3 of the defined fault report: " .. buffer(11+i,1) .. "\n" i = i+1 message = message .. "Field 4 of the defined fault report: " .. buffer(11+i,1) .. "\n" i = i+1 end end return "Respond Fault Status" .. message --msg = 0100 elseif(y == 0x0100) then --field 1 if(fields[1] == 1) then message = message .. "Adds records of the Email table\n" elseif(fields[1] == 2) then message = message .. "Adds records of the Node table\n" else message = message .. "Error\n" end return "Set Fault DB" .. message else return "Unrecognized Message ID " .. y end --obj = 4100 elseif(x == 0x4100) then --msg = 0001 if(y == 0x0001) then return "Initialize" --msg = 8001 elseif(y == 0x8001) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end return "Report Initialization Response: " .. message --msg = 0002 elseif(y == 0x0002) then --field 1 --low byte if(bit.band(fields[1], 0x01) == 0x01) then message = message .. " * Faults\n" end if(bit.band(fields[1], 0x02) == 0x02) then message = message .. " * Test Results\n" end if(bit.band(fields[1], 0x04) == 0x04) then message = message .. " * Ambient Compensation Processing\n" end if(bit.band(fields[1], 0x08) == 0x08) then message = message .. " * Annoucement Activity\n" end if(bit.band(fields[1], 0x10) == 0x10) then message = message .. " * Device Activity\n" end if(bit.band(fields[1], 0x20) == 0x20) then message = message .. " * ACS Announment Status\n" end if(bit.band(fields[1], 0x40) == 0x40) then message = message .. " * 590ACSFault Set\n" end if(bit.band(fields[1], 0x80) == 0x80) then message = message .. " * Button Activity(Real and Virtual buttons)\n" end --high byte if(bit.band(fields[2], 0x04) == 0x04) then message = message .. " * Fault Resend\n" end return "Reports subscribed to\n" .. message --msg = 8002 elseif(y == 0x8002) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end return "Report Subscription Response: " .. message --msg = 0003 elseif(y == 0x0003) then --field 1 --low byte if(bit.band(fields[1], 0x01) == 0x01) then message = message .. " * Faults\n" end if(bit.band(fields[1], 0x02) == 0x02) then message = message .. " * Test Results\n" end if(bit.band(fields[1], 0x04) == 0x04) then message = message .. " * Ambient Compensation Processing\n" end if(bit.band(fields[1], 0x08) == 0x08) then message = message .. " * Annoucement Activity\n" end if(bit.band(fields[1], 0x10) == 0x10) then message = message .. " * Device Activity\n" end if(bit.band(fields[1], 0x20) == 0x20) then message = message .. " * ACS Announment Status\n" end if(bit.band(fields[1], 0x40) == 0x40) then message = message .. " * 590ACSFault Set\n" end if(bit.band(fields[1], 0x80) == 0x80) then message = message .. " * Button Activity(Real and Virtual buttons)\n" end --high byte if(bit.band(fields[2], 0x04) == 0x04) then message = message .. " * Fault Resend\n" end return "Reports Unsubscribed\n" .. message -- msg == 8003 elseif(y == 0x8003) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --msg = 0004 elseif(y == 0x0004) then return "Get Subscription Status" --msg = 8004 elseif(y == 0x8004) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 field3Length = fields[2] .. fields[3] message = message .. "Number of bytes to follow: " .. fields[2] .. fields[3] .. "\n" --field 3 i = 0 if(math.mod(field3Length,6) == 0) then else field3Length = field3Length - (math.mod(field3Length,6)) end while ((field3Length/6) >= i) do message = message .. "Address: " .. fields[3+i] .. fields[4+i] .. fields[5+i] .. fields[6+i] .. "\n" i = i+4 message = message .. "Subscription status for the address: " .. fields[3+i] .. fields[4+i] .. "\n" i = i+2 end return "Respond Get Subscription Status" .. message else return "Unrecognized Message ID " .. y end --obj = 4200 elseif(x == 0x4200) then --msg = 0001 if(y == 0x0001) then --field 1 length = fields[1] message = message .. "Number of bytes in report " .. fields[1] .. "\n" --field 2 -- Fixed by Richard Green (v0.2.10) i = 1 message = message .. "Defined Report: 0x" while (i < fields[1]) do message = message .. string.format("%02x ", fields[1+i]) i = i+1 end message = message .. "\n" return "Initialize" .. message else return "Unrecognized Message ID " .. y end --obj = 4300 elseif(x == 0x4300) then --msg = 0001 if(y == 0x0001) then return "Acknowledge DHD Fault" else return "Unrecognized Message ID " .. y end --obj = 5000 elseif(x == 0x5000) then --msg = 0001 if(y == 0x0001) then return "Request Glue Address" --msg = 0002 elseif(y == 0x0002) then return "Glue Address" --msg = 0003 elseif(y == 0x0003) then return "Glue Register" --msg = 8003 elseif(y == 0x8003) then return "Respond Glue Register" --msg = 0006 elseif(y == 0x0006) then return "Update record" --msg = 0008 elseif(y == 0x0008) then return "Get Lock" --msg = 8008 elseif(y == 0x8008) then return "Respond Get Lock" --msg = 0009 elseif(y == 0x0009) then return "Release Lock" --msg = 000A elseif(y == 0x000a) then return "Test Message" --msg = 0010 elseif(y == 0x0010) then return "Flight Record Arrival/Departure" --msg = 0011 elseif(y == 0x0011) then return "Flight Record Update" --msg = 8010 or 8011 elseif((y == 0x8010) or (y == 0x8011)) then return "Respond Flight Record Change" --msg = 00013 elseif(y == 0x0013) then return "Client Check Active" --msg = 0014 elseif(y == 0x0014) then return "Client Logout Request" --msg = 0020 elseif(y == 0x0020) then return "Client Logout" --msg = 0025 elseif(y == 0x0025) then return "Flight Record Arrival/Departure Committed" --msg = 0026 elseif(y == 0x0026) then return "Flight Record Update Committed" --msg = 0027 elseif(y == 0x0027) then return "Data Update Error" else return "Unrecognized Message ID " .. y end --obj = 0000 elseif(x == 0x0000) then --msg = 0001 if(y == 0x0001) then --field 1 if((fields[1] .. fields[2]) == 1) then message = message .. "Data is to be saved to a file\n" elseif((fields[1] .. fields[2]) == 2) then message = message .. "Data is a network message\n" else message = message .. "Error\n" end --field 2 message = message .. "Total Length of Entire Transfer: " .. fields[3] .. fields[4] .. fields[5] .. fields[6] .. "\n" --field 3 length = fields[7] ..fields[8] message = message .. "Length of filename: " .. fields[7] .. fields[8] .. "\n" --field 4 i = 1 message = message .. "Filename: " while (i <= length) do message = message .. sting.char(fields[9+i]) i = i+1 end message = message .. "\n" return "Initiate Data transfer" .. message --msg = 8001 elseif(y == 0x8001) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "Transfer ID: " .. fields[2] .. fields[3] .. "\n" --field 3 message = message .. "Maximum Packet Length: " .. fields[4] .. fields[5] .. "\n" return "Respond Initiate Data transfer" .. message --msg = 0002 elseif(y == 0x0002) then --field 1 message = message .. "Transfer ID: " .. fields[1] .. fields[2] .. "\n" --field 2 message = message .. "Total Packets: " .. fields[3] .. fields[4] .. "\n" --field 3 message = message .. "Packet Number: " .. fields[5] .. fields[6] .. "\n" --field 4 length = fields[7] .. fields[8] message = message .. "Data Length of this packet: " .. fields[7] .. fields[8] .. "\n" --field 5 i = 1 message = message .. "Packet Data: " while (i <= length) do message = message .. fields[8+i] i = i+1 end message = message .. "\n" return "Transfer Data" .. message --msg = 8002 elseif(y == 0x8002) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 message = message .. "Transfer ID: " .. fields[2] .. fields[3] .. "\n" --field 3 message = message .. "Total Packets: " .. fields[4] .. fields[5] .. "\n" --field 4 message = message .. "Packet Number: " .. fields[6] .. fields[7] .. "\n" return "Respond Transfer Data" .. message --msg = 0003 elseif(y == 0x0003) then --field 1 message = message .. "Transfer ID: " .. fields[1] .. fields[2] .. "\n" --field 2 if((fields[3] .. fields[4]) == 1) then message = message .. "Any existing Data is to be saved into a file, in the case of a file or the network message that has been transmitted is to be processed\n" elseif((fields[3] .. fields[4]) == 2) then message = message .. "Delete any previously transmitted data, in the case of a file transmission, or throw away the network message (don't process it)\n" else message = message .. "Error\n" end return "Abort Data transfer" .. message --msg = 0100 elseif(y == 0x0100) then --field 1 message = message .. "Debugging Flags: " .. fields[1] .. fields[2] .. "\n" return "Start Debug Logging" .. message --msg = 0101 elseif(y == 0x0101) then return "Stop Debug Logging" --msg = 8101 elseif(y == 0x8101) then --field 1 if(fields[1] == 0) then message = message .. "Command Completed Successfully\n" elseif(fields[1] == 1) then message = message .. "Command was recieved, but failed to complete\n" elseif(fields[1] == 2) then message = message .. "Invalid or unrecognized command (Only for IED Messages)\n" else message = message .. "NACK code: " .. fields[1] .. "\n" end --field 2 length = fields[2] + (fields[3]*256) message = message .. "Length of the filename: " .. fields[2] +(fields[3]*256) .. "\n" --field 3 i = 1 message = messgae .. "Filename: " while (i <= length) do message = message .. string.char(fields[3+i]) i = i+1 end message = message .. "\n" return "Stop Debug Logging Response" .. message else return "Unrecognized Message ID " .. y end --Obj = FF00 elseif (x == 0xff00) then message = message .. "---IED24 Message: " method1 = bit.band((y / 1024), 0xF) method2 = bit.band(y, 0xFF) if y < 0x8000 then message = message .. string.format("Method: %1dm%1d\n",method1, method2) else message = message .. string.format("%1dm%1d Response\n",method1, method2) end ToObj = fields[7] + (fields[8]*256) FromObj = fields[13] + (fields[14]*256) message = message .. " From Obj: " .. FromObj .. " -> To Obj: " .. ToObj .. "\n" message = message .. " First 8 Data Bytes: " i=1 while (i <= 8) do message = message .. string.format("%02x ", fields[14+i]) i = i+1 end return message else i = 1 message = "First 8 Data Bytes (in Hex): " while (i <= 8) do message = message .. string.format(" %02x",fields[i]) i = i+1 end message = message .. "\n" return message end end