#!/usr/bin/lua

--Decoder for LDS01/LWL01

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


--Get Mode 
MODE_RAW=utility.hex2str(string.sub(payload,19,19))
MODE_0=tonumber(MODE_RAW,16)
MODE=MODE_0
payload_t.MODE=MODE_0

--Get Alarm
ALARM_HEX=string.sub(payload,26,26)
ALARM_RAW=utility.hex2str(ALARM_HEX)
ALARM_0=bit.bit_and(tonumber(ALARM_RAW,16),tonumber("01",16))
payload_t.ALARM=ALARM_0

--Get status 
STATUS_RAW=utility.hex2str(string.sub(payload,17,17))
STATUS_0=bit.bit_and(tonumber(STATUS_RAW,16),tonumber("80",16))
STATUS_1=bit.bit_and(tonumber(STATUS_RAW,16),tonumber("40",16))



if MODE==1 then 
OPEN_TIMES_RAW_20=tonumber(utility.hex2str(string.sub(payload,20,20)),16)
OPEN_TIMES_RAW_21=tonumber(utility.hex2str(string.sub(payload,21,21)),16)
OPEN_TIMES_RAW_22=tonumber(utility.hex2str(string.sub(payload,22,22)),16)
minus_flag_1 = bit.bit_lshift(OPEN_TIMES_RAW_21,8)
OPEN_TIMES_0=bit.bit_or((bit.bit_or(bit.bit_lshift(OPEN_TIMES_RAW_20,16),minus_flag_1)),OPEN_TIMES_RAW_22)
payload_t.DOOR_OPEN_TIMES=OPEN_TIMES_0

OPEN_DURATION_RAW_23=tonumber(utility.hex2str(string.sub(payload,23,23)),16)
OPEN_DURATION_RAW_24=tonumber(utility.hex2str(string.sub(payload,24,24)),16)
OPEN_DURATION_RAW_25=tonumber(utility.hex2str(string.sub(payload,25,25)),16)
minus_flag_2 = bit.bit_lshift(OPEN_DURATION_RAW_24,8)
OPEN_DURATION_0=bit.bit_or((bit.bit_or(bit.bit_lshift(OPEN_DURATION_RAW_23,16),minus_flag_2)),OPEN_DURATION_RAW_25)
payload_t.LAST_DOOR_OPEN_DURATION=OPEN_DURATION_0

   if STATUS_0==1 then
   payload_t.DOOR_OPEN_STATUS=1
   elseif STATUS_0==0 then
   payload_t.DOOR_OPEN_STATUS=0
   end
 

 
elseif MODE==2 then 
   LEAK_TIMES_RAW_20=tonumber(utility.hex2str(string.sub(payload,20,20)),16)
   LEAK_TIMES_RAW_21=tonumber(utility.hex2str(string.sub(payload,21,21)),16)
   LEAK_TIMES_RAW_22=tonumber(utility.hex2str(string.sub(payload,22,22)),16)
   minus_flag_3 = bit.bit_lshift(LEAK_TIMES_RAW_21,8)
   LEAK_TIMES_0=bit.bit_or((bit.bit_or(bit.bit_lshift(LEAK_TIMES_RAW_20,16),minus_flag_3)),LEAK_TIMES_RAW_22)
  payload_t.WATER_LEAK_TIMES=LEAK_TIMES_0

   LEAK_DURATION_RAW_23=tonumber(utility.hex2str(string.sub(payload,23,23)),16)
   LEAK_DURATION_RAW_24=tonumber(utility.hex2str(string.sub(payload,24,24)),16)
   LEAK_DURATION_RAW_25=tonumber(utility.hex2str(string.sub(payload,25,25)),16)
   minus_flag_4 = bit.bit_lshift(LEAK_DURATION_RAW_24,8)
   LEAK_DURATION_0=bit.bit_or((bit.bit_or(bit.bit_lshift(LEAK_DURATION_RAW_23,16),minus_flag_4)),LEAK_DURATION_RAW_25)
  payload_t.LAST_WATER_LEAK_DURATION=LEAK_DURATION_0

  if STATUS_0==1 then
   payload_t.WATER_LEAK_STATUS=1
   elseif STATUS_0==0 then
   payload_t.WATER_LEAK_STATUS=0
   end
 
elseif MODE==3 then  
   if STATUS_0==1 then
   payload_t.DOOR_OPEN_STATUS=1
   payload_t.WATER_LEAK_STATUS=1
   elseif STATUS_0==0 then 
   payload_t.DOOR_OPEN_STATUS=0
   payload_t.WATER_LEAK_STATUS=0
   end
   
 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.LAST_WATER_LEAK_DURATION .. "&field2=".. payload_t.LAST_DOOR_OPEN_DURATION .. "&field3=".. payload_t.ALARM .. "&field4=".. payload_t.WATER_LEAK_STATUS .."&field5=".. payload_t.DOOR_OPEN_STATUS .."&field6=".. payload_t.MODE .."&field7=".. payload_t.BatV .. "&field8=".. payload_t.RSSI .. "&field9=".. payload_t.SNR .."&field10=".. payload_t.NIHAOA .."&status=MQTTPUBLISH" 
		print(data_up) 
		return data_up
	end
end 

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





