#!/usr/bin/env python

import array
import serial
import time

stream     = 0
datacount  = 0
readcount  = 0
got        = 0
gotinv     = 0
inv        = ''
outinv     = ''
gotbmk     = 0
bmk        = ''
outbmk     = ''
readbuffer = array.array('c')

try:
    ser = serial.Serial(port='/dev/ttyUSB0', baudrate=19200, timeout=None, interCharTimeout=0)
except:
#    print('failed.')
    exit()

ser.isOpen()
ser.flushInput()

while ((gotinv==0) or (gotbmk==0)):
    start = time.time()
    try:
        c = ser.read(1)
    except:
        exit()
    end = time.time()
    elapsed = end - start
    if (elapsed>0.02):
        if (datacount==44):
#            print "Inverter"
            inv=readbuffer
            gotinv=1
        if (datacount==62):
#            print "BMK"
            bmk=readbuffer
            gotbmk=1
            got=1
        readbuffer=[]
        datacount=0
        stream=1

    if (stream==1):
        readbuffer.append(c)
        datacount = datacount+1
#        print('[{0:d}] {1}     {2}'.format(datacount, ord(c), elapsed))
    readcount=readcount+1

if (gotbmk==1): # BMK
        volts = (((ord(bmk[46])*256)+ord(bmk[47]))&0xFFFF)/100.0
        amps = ((ord(bmk[48])*256)+ord(bmk[49]))&0xFFFF
        if (amps>32768): amps=-(65536-amps)
        amps = float(amps/10.0)
        ampH = ((ord(bmk[54])*256)+ord(bmk[55]))&0xFFFF
        if (ampH>32768): ampH=-(65536-ampH)
#        if (volts<40.0 or volts>70.0): gotbmk=0
#        if (abs(amps)>100.0): gotbmk=0
#        if (abs(ampH)>400.0): gotbmk=0
        outbmk = "BMK,"+str(ord(bmk[45]))+","+str(amps)+","+str(volts)+","+str(ampH)+","
if (gotinv==1): # INV
        outinv="INV"+","+str(ord(inv[0]))+","+str(ord(inv[1]))+","+str((((ord(inv[2])*256)+ord(inv[3]))&0xFFFF)/10.0)+","+str(((ord(inv[4])*256)+ord(inv[5]))&0xFFFF)+","+str(ord(inv[6]))+","+str(ord(inv[7]))+","+str(ord(inv[8]))+","+str(ord(inv[9]))+","+str(ord(inv[10])/10.0)+","+str(ord(inv[11])*1.8+32.0)+","+str(ord(inv[12])*1.8+32.0)+","+str(ord(inv[13])*1.8+32.0)+","+str(ord(inv[14]))+","+str(ord(inv[15]))+","+str(ord(inv[16]))+","+str(ord(inv[17]))+","+str((((ord(inv[18])*256)+ord(inv[19]))&0xFFFF)/10.0)+","+str(ord(inv[20]))+","

print "Content-type: text/html\n\n<head>"
if (gotbmk==1):print outbmk
if (gotinv==1):print outinv
print "</head>"
