#!/usr/bin/lua

json = require('dragino.json')
local utility = require("dragino.utility")
local uci = require("dragino.luci_uci")
local bit=require("dragino.bit")
			
local f = assert(io.open("/var/iot/channels/" .. arg[1], "rb"))
			
local payload = f:read("*all")

f:close()

data=""
local payload_t={}

--Get RSSI
RSSI_RAW_1=tonumber(string.sub(payload,5,6),16)
RSSI_RAW_2=tonumber(string.sub(payload,7,8),16)
minus_flag = bit.bit_rshift(RSSI_RAW_1,7)
RSSI=bit.bit_or(bit.bit_lshift(RSSI_RAW_1,8),RSSI_RAW_2)-minus_flag*65536
payload_t.RSSI=RSSI

--Get SNR
SNR_RAW_1=tonumber(string.sub(payload,13,14),16)
SNR_RAW_2=tonumber(string.sub(payload,15,16),16)
minus_flag = bit.bit_rshift(SNR_RAW_1,7)
SNR=bit.bit_or(bit.bit_lshift(SNR_RAW_1,8),SNR_RAW_2)-minus_flag*65536
payload_t.SNR=SNR/10

--Get Battery
--HEX_BAT=string.sub(payload,17,18)
--BAT_RAW=utility.hex2str(HEX_BAT)
--BAT=bit.bit_and(tonumber(BAT_RAW,16),tonumber("3FFF",16))/1000  -- Got the BAT by BAT & 3FFF
--payload_t.BatV=BAT

	Len=string.len(payload)
if Len==27 then

	--Get Alarm

	Alarm_RAW=tonumber(utility.hex2str(string.sub(payload,17,17)),16)
	Alarm=bit.bit_rshift(bit.bit_and(Alarm_RAW,tonumber("02",16)),1)
	payload_t.Alarm=(Alarm == 1) and "TRUE" or "FALSE"
	
    --Get Mod
	Mod=string.sub(payload,22,22)
	Mod_RAW=utility.hex2str(HEX_Mod)
	payload_t.Mod=Mod_RAW
	
	--Get count_mod
	HEX_Pin_status=string.sub(payload,17,17)
	Pin_status_RAW=utility.hex2str(HEX_Pin_status)
	count_mod=bit.bit_rshift(bit.bit_and(tonumber(Pin_status_RAW,16),tonumber("08",16)),3)
	payload_t.count_mod=(count_mod == 1) and "PART" or "SUM"

	--Get tdc_interval
	HEX_Calculate_flag=string.sub(payload,17,17)
	Calculate_flag_RAW=tonumber(utility.hex2str(HEX_Calculate_flag),16)
	tdc_interval=bit.bit_rshift(bit.bit_and(Calculate_flag_RAW,tonumber("04",16)),2)
	payload_t.tdc_interval=(tdc_interval == 1) and "YES" or "NO"
	
	
	--Get leak_status
	HEX_leak_status=string.sub(payload,17,17)
	leak_status_RAW=tonumber(utility.hex2str(HEX_leak_status),16)
	leak_status=bit.bit_and(leak_status_RAW,tonumber("01",16))
	payload_t.leak_status=(leak_status == 1) and "LEAK" or "NO LEAK"


	--Get leak_times
	Total_pulse_1_RAW=tonumber(utility.hex2str(string.sub(payload,18,18)),16)
	Total_pulse_1=bit.bit_lshift(Total_pulse_1_RAW,16)

	Total_pulse_2_RAW=tonumber(utility.hex2str(string.sub(payload,19,19)),16)
	Total_pulse_2=bit.bit_lshift(Total_pulse_2_RAW,8)

	Total_pulse_3_RAW=tonumber(utility.hex2str(string.sub(payload,20,20)),16)
	Total_pulse_3=Total_pulse_3_RAW
	Total_pulse=bit.bit_or(bit.bit_or(Total_pulse_1,Total_pulse_2),Total_pulse_3)
	payload_t.leak_times=Total_pulse

    --Get leak_duration
    leak_duration_1_RAW=tonumber(utility.hex2str(string.sub(payload,21,21)),16)
	leak_duration_1=bit.bit_lshift(leak_duration_1_RAW,16)

	leak_duration_2_RAW=tonumber(utility.hex2str(string.sub(payload,22,22)),16)
	leak_duration_2=bit.bit_lshift(leak_duration_2_RAW,8)

	leak_duration_3_RAW=tonumber(utility.hex2str(string.sub(payload,23,23)),16)
	leak_duration_3=leak_duration_3_RAW
	Total_leak_duration=bit.bit_or(bit.bit_or(leak_duration_1,leak_duration_2),leak_duration_3)
	payload_t.leak_duration=Total_leak_duration


	Systimestamp_RAW_24=tonumber(utility.hex2str(string.sub(payload,24,24)),16)
	Systimestamp_RAW_25=tonumber(utility.hex2str(string.sub(payload,25,25)),16)
	Systimestamp_RAW_26=tonumber(utility.hex2str(string.sub(payload,26,26)),16)
	Systimestamp_RAW_27=tonumber(utility.hex2str(string.sub(payload,27,27)),16)
	minus_flag_1 = bit.bit_lshift(Systimestamp_RAW_26,8)
	minus_flag_2 = bit.bit_lshift(Systimestamp_RAW_25,16)
	Systimestamp_0=bit.bit_or(bit.bit_or((bit.bit_or(bit.bit_lshift(Systimestamp_RAW_24,24),minus_flag_2)),minus_flag_1),Systimestamp_RAW_27)

	function getTimeStamp(Systimestamp_0)
		return os.date("%Y-%m-%d %H:%M:%S",Systimestamp_0)
	end
	payload_t.Time= getTimeStamp(Systimestamp_0)
	
elseif Len==24 then
	TDC_RAW_1=bit.bit_lshift(tonumber(utility.hex2str(string.sub(payload,17,17)),16),16)
	TDC_RAW_2=bit.bit_lshift(tonumber(utility.hex2str(string.sub(payload,18,18)),16),8)
	TDC_RAW_3=tonumber(utility.hex2str(string.sub(payload,19,19)),16)
	TDC=bit.bit_or(bit.bit_or(TDC_RAW_1,TDC_RAW_2),TDC_RAW_3)
	Disalarm=bit.bit_and(tonumber(utility.hex2str(string.sub(payload,20,20)),16),tonumber("01",16))
	Keep_status=bit.bit_and(tonumber(utility.hex2str(string.sub(payload,21,21)),16),tonumber("01",16))
	keep_time=bit.bit_or(bit.bit_lshift(tonumber(utility.hex2str(string.sub(payload,22,22)),16),8),tonumber(utility.hex2str(string.sub(payload,23,23)),16))
	
	leak_alarm_time=tonumber(utility.hex2str(string.sub(payload,24,24)),16)
	
	payload_t.TDC=TDC
	payload_t.Stop_Timer=Disalarm
	payload_t.KEEP_STATUS=Keep_status
	payload_t.Keep_Timer=keep_time
	payload_t.leak_alarm_time=leak_alarm_time
	
elseif Len==23 then

    if (tonumber(utility.hex2str(string.sub(payload,17,17)),16) == tonumber("11",16)) then
	Sensor ="SW3L"
	payload_t.Sensor=Sensor
	end
	
	payload_t.SENSOR_MODEL=Sensor
	if (tonumber(utility.hex2str(string.sub(payload,21,21)),16) == 255) then
		Sub_band="NULL"
	else
		Sub_band=tonumber(utility.hex2str(string.sub(payload,21,21)),16)
	end
	payload_t.SUB_BAND=Sub_band
	
	if (tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 1) then
		Freq_band="EU868"
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 2) then 
		Freq_band="US915"
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 3) then 
		Freq_band="IN865"
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 4) then 
		Freq_band="AU915"	
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 5) then 
		Freq_band="KZ865"
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 6) then 
		Freq_band="RU864"	
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 7) then 
		Freq_band="AS923"	
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 8) then 
		Freq_band="AS923_1"	
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 9) then 
		Freq_band="AS923_2"
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 10) then 
		Freq_band="AS923_3"
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 11) then 
		Freq_band="CN470"
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 12) then 
		Freq_band="EU433"
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 13) then 
		Freq_band="KR920"	
	elseif	(tonumber(utility.hex2str(string.sub(payload,20,20)),16) == 14) then 
		Freq_band="MA869"	
	end	
	payload_t.FREQUENCY_BAND=Freq_band
	
	Firm_ver_RAW_1=bit.bit_and(tonumber(utility.hex2str(string.sub(payload,18,18)),16),tonumber("0F",16))
	Firm_ver_RAW_2=bit.bit_and(bit.bit_rshift(tonumber(utility.hex2str(string.sub(payload,19,19)),16),4),tonumber("0F",16))
	Firm_ver_RAW_3=bit.bit_and(tonumber(utility.hex2str(string.sub(payload,19,19)),16),tonumber("0F",16))
	Firm_ver=Firm_ver_RAW_1 .. "." .. Firm_ver_RAW_2 .. "."  ..Firm_ver_RAW_3
	payload_t.FIRMWARE_VERSION=Firm_ver
	
	BAT_RAW_1=bit.bit_lshift(tonumber(utility.hex2str(string.sub(payload,22,22)),16),8)
	BAT_RAW_2=tonumber(utility.hex2str(string.sub(payload,23,23)),16)
	BAT=bit.bit_or(BAT_RAW_1,BAT_RAW_2)/1000
	payload_t.BAT=BAT
end

local server_type = uci:get("gateway","general","server_type")
local mqtt_broker = uci:get("mqtt","common","server_type")

if server_type == "mqtt" then
	if mqtt_broker == "ThingSpeak" then
		local data_up="field1=".. payload_t.RSSI .. "&field2=".. payload_t.SNR .. "&field3=".. payload_t.BAT .. "&field4=".. payload_t.Alarm .. "&field5=".. payload_t.RSSI .. "&field6=".. payload_t.SNR .."&field7=".. payload_t.Pin_status.. "&field8="..payload_t.Calculate_flag.. "&field9=".. payload_t.Systimestamp.."&field10="..payload_t.Total_pulse.."&field10="..payload_t.Disconnect_duration.."&status=MQTTPUBLISH" 
			print(data_up) 
		return data_up
	end
end 

print(json.encode(payload_t))
return json.encode(payload_t)




