#!/usr/bin/env python3

# Decoding provided by JP Meijers - http://jpmeijers.com/

# Send lora packet to node-red when being triggered by postgresql
# Nico Schottelius <nico.schottelius -at- ungleich.ch>
# 2016-11-02
# GPLv3+


import binascii
import struct
import lorautil
import logging
import sys


known_devices = [ "0004A30B001C6613" ]

def convert_gps_from_stdin():
    for line in sys.stdin:
        res = get_gps("", line)
        if res:
            print(res[0][1:])

# Parsing code from jpmeiyers
def get_gps(deveui, payload):
    res = []
    data = binascii.a2b_base64(payload)

    if(len(data)!=9):
        return res

    parsed = struct.unpack("<BBBBBBBBB", data)
    values = {}
    values['lat'] = (parsed[0]*(2**16) + parsed[1]*(2**8) + parsed[2])/16777215.0*180.0-90
    values['lon'] = (parsed[3]*(2**16) + parsed[4]*(2**8) + parsed[5])/16777215.0*360.0-180
    values['alt'] = parsed[6]*(2**8) + parsed[7]
    values['acc'] = parsed[8]/10.0

    text = ":lat={lat:.6f} lon={lon:.6f} alt={alt:.6f} acc={acc:.2f}".format(**values)
    res = [ deveui + text ]

    log.debug("ttn mapper: {}".format(res[0]))

    return res

def decode(pkg):
    data = pkg.split(":")

    deveui = data[0]
    payload = data[1]

    res = []

    # Only handle known devices
    if not deveui in known_devices:
        return res

    res += get_gps(deveui, payload)

    return res

def nodered(provider, data):
    res = decode(data)
    if not res:
        return

    for d in res:
        lorautil.nodered_send(provider, d)

if __name__ == '__main__':
    logging.basicConfig(format='%(levelname)s: %(message)s')
    log = logging.getLogger(__name__)
    log.setLevel(logging.DEBUG)

    conns = lorautil.pg_conn_notify()

    while True:
        lorautil.pg_wait_for_pkg(conns, nodered)