pv1_log_proto = Proto("PV1_Log", "PV1 ES2 Log Protocol")

log_level_str = 
{
	[ 1 ] = "[F]",
    [ 2 ] = "[E]",
    [ 4 ] = "[W]",
    [ 8 ] = "[D]",
    [ 16 ] = "[I]",
    [ 32 ] = "[T]",
    [ 64 ] = "[I]",
    [ 128 ] = "[V]",
    [ 256 ] = "[S]",
    [ 512 ] = "[U]",
	[ 0xFFFFFFFF ] = "[A]", 
}

local log_content 	= ProtoField.string("logContent", 	"Message:\t")
local log_Seq 		= ProtoField.uint16("logSeq", 		"Sequence: \t", base.DEC)
local log_pid		= ProtoField.uint32("logPid", 		"PID: \t\t", base.DEC)
local log_datetime  = ProtoField.string("logDateTime",	"DateTime:\t\t")
local log_time 		= ProtoField.string("logTime", 		"Date:\t\t")
local log_level		= ProtoField.uint32("logLevel",		"Level: \t\t", base.DEC, log_level_str)

pv1_log_proto.fields = {
log_Seq, log_content, log_pid, log_datetime, log_level
}

function pv1_log_proto.dissector(buffer, pinfo, tree)
	pinfo.cols.protocol:set("LOG")	
	local offset = 0
	local buf_len = buffer:len()
	local logInfoTree = tree:add(pv1_log_proto, buffer(0, 18), "Log Message Information")
		
	logInfoTree:add(log_Seq, buffer(offset, 2))
	offset = offset + 2
	
	local l_pid = buffer(offset, 4):uint()
	logInfoTree:add(log_pid, buffer(offset, 4))
	offset = offset + 4
	
	local l_second = buffer(offset, 4):uint()
	offset = offset + 4
	
	local l_nsecond = buffer(offset, 4):uint()
	offset = offset + 4
			
	logInfoTree:add(log_datetime, "[" .. os.date("%c", l_second)  .. "." .. string.format("%03d", l_nsecond / 1000) .. "]")	
	
	local l_level = buffer(offset, 4):uint()
	local l_lvStr
	
	if l_level == 1 then
		l_lvStr = "F"	
	elseif l_level == 2 then
		l_lvStr = "E"
	elseif l_level == 4 then
		l_lvStr = "W"
	elseif l_level == 8 then
		l_lvStr = "D"
	elseif l_level == 16 then
		l_lvStr = "I"
	elseif l_level == 32 then
		l_lvStr = "T"
	elseif l_level == 64 then
		l_lvStr = "C"
	elseif l_level == 128 then
		l_lvStr = "V"
	elseif l_level == 256 then
		l_lvStr = "S"
	elseif l_level == 0xFFFFFFFF then
		l_lvStr = "A"	
	else
		l_lvStr = "U"
	end
	
	logInfoTree:add(log_level, buffer(offset, 4))
	offset = offset + 4
		
	local logInfo = buffer(offset, buf_len - 19):string()
	local logMsgTree = tree:add(pv1_log_proto, buffer(18, buf_len - 18), "Log Message Content")
	logMsgTree:add(log_content, logInfo)
	
	if buffer(buf_len - 1, 1):string() == '\n' then
		pinfo.cols.info:set("{" .. tostring(l_pid) .. "} [" ..  os.date("%X", l_second)  .. "." .. string.format("%03d", l_nsecond / 1000) .. "] [" .. tostring(l_lvStr) .. "] " .. buffer(18, buf_len - 19):string())		
	else 
		pinfo.cols.info:set("{" .. tostring(l_pid) .. "} [" ..  os.date("%X", l_second)  .. "." .. string.format("%03d", l_nsecond / 1000) .. "] [" .. tostring(l_lvStr) .. "] " .. buffer(18, buf_len - 18):string())		
	end
end

local pv1_log_udp_port_table = DissectorTable.get("udp.port")
--local pv1_log_port = 10000
pv1_log_udp_port_table:add("10000-10020", pv1_log_proto)