import serial, time, datetime
import struct           #Convert between strings and binary data
import sys
import os
import binascii
import requests
#import mysql.connector as mariadb
#cnx = mariadb.connect(user='monitor', password='', database='fingerdb', host='localhost')
#cnx=mysql.connector.connect(user='root',password='',host='localhost',database='fingerdb')       # connect to MySql database
#cur=cnx.cursor()

ser = serial.Serial("/dev/ttyS0", baudrate = 57600, timeout = 2) #serial.Serial('/dev/ttyUSB0',57600)     port =  # serial communication in Linux
#ser = serial.Serial("COM6", baudrate=9600, timeout=1)   #serial communication in Windows

pack = [0xef01, 0xffffffff, 0x1]        # Header, Address and Package Identifier

def readPacket():       # Function to read the Acknowledge packet
        time.sleep(1)
        w = ser.inWaiting()
        ret = []
        if w >= 9:
                s = ser.read(9)         # Partial read to get length
                ret.extend(struct.unpack('!HIBH', s))
                ln = ret[-1]

                time.sleep(1)
                w = ser.inWaiting()
                if w >= ln:
                        s = ser.read(ln)
                        form = '!' + 'B' * (ln - 2) + 'H'       # Specifying byte size
                        ret.extend(struct.unpack(form, s))
        return ret

def readPacket1():      # Function to read the Acknowledge packet
        time.sleep(1)
        w = ser.inWaiting()
        ret = []
        form = 'B' * 700
        s = ser.read(700)
        t=binascii.hexlify(s)   # convert to hex
        u=t[24:]
        ser.write(u)
        if store(idno):
                print 'store error'
                sys.exit(0)
                print "Enrolled successfully at id %d"%j
 #       cur.execute("insert into fingertb(name,finger) values('%s','%s')" %(name,u) )     # upadate database
 #       cnx.commit()
 #       v=binascii.unhexlify(u)
#        form1='B'*688
 #       ret1=[]
  #      ret1.extend(struct.unpack(form1, v))
 #       ret.extend(struct.unpack(form, s))

def writePacket(data):          # Function to write the Command Packet
        pack2 = pack + [(len(data) + 2)]
        a = sum(pack2[-2:] + data)
        pack_str = '!HIBH' + 'B' * len(data) + 'H'
        l = pack2 + data + [a]
        s = struct.pack(pack_str, *l)
        ser.write(s)


def verifyFinger():     # Verify Module?s handshaking password
        data = [0x13, 0x0, 0, 0, 0]
        writePacket(data)
        s = readPacket()
        return s[4]

def genImg():   # Detecting finger and store the detected finger image in ImageBuffer
        data = [0x1]
        writePacket(data)
        s = readPacket()
        return s[4]

def img2Tz(buf):        # Generate character file from the original finger image in ImageBuffer and store the file in CharBuffer1 or CharBuffer2.
        data = [0x2, buf]
        writePacket(data)
        s = readPacket()
        return s[4]

def regModel():         # Combine information of character files from CharBuffer1 and CharBuffer2 and generate a template which is stroed back in both CharBuffer1 and CharBuffer2.
        data = [0x5]
        writePacket(data)
        s = readPacket()
        return s[4]

def DownChar(buf):      # download character file or template from upper computer to the specified buffer of Module
        data = [0x9,buf]
        writePacket(data)
        s = readPacket1()

def store(id):          # store the template of specified buffer (Buffer1 Buffer2) at the designated location of Flash library
        data = [0x6, 0x1, 0x0, id]
        writePacket(data)
        s = readPacket()
        return s[4]

print ("Type done to exit")
name=raw_input("Enter name : ")
classid=raw_input("Enter Class Name: ")
idno=int(raw_input('enter the store id'))

while (name!='done'):

        if verifyFinger():
                print 'Verification Error'
                sys.exit(0)

        print 'Put finger',
        sys.stdout.flush()

        time.sleep(1)
        while genImg():
                time.sleep(0.1)
                print '.',
                sys.stdout.flush()

        print ''
        sys.stdout.flush()

        if img2Tz(1):
                print 'Conversion Error'
                sys.exit(0)

        print 'Put finger again',
        sys.stdout.flush()

        time.sleep(1)
        while genImg():
                time.sleep(0.1)
                print '.',
                sys.stdout.flush()

        print ''
        sys.stdout.flush()

        if img2Tz(2):
                print 'Conversion Error'
                sys.exit(0)

        
        if regModel():
                print 'Template Error'
                sys.exit(0)

        if DownChar(1):
                print 'Template Error'
                sys.exit(0)
        name=str(name)
        idno=str(idno)
        response=requests.get("http://192.168.43.36/finger/write.php?sname="+name+"&sclass="+classid+"&fid="+idno+"")
        name=raw_input("Enter name : ")
        classid=raw_input("Enter Class Name: ")
        idno=int(raw_input('enter the store id'))
