grove_fingerprint

grove_fingerprint.cpp

Committer:
JackyZhangFromSeeed
Date:
2015-06-09
Revision:
0:20273e15a6ee

File content as of revision 0:20273e15a6ee:



#include "suli2.h"
#include "grove_fingerprint.h"

//local functions
static void grove_fingerprint_writePacket(UART_T *uart, uint32_t addr, uint8_t packettype, 
                       uint16_t len, uint8_t *packet);
static uint8_t grove_fingerprint_getReply(UART_T *uart, uint8_t packet[], uint16_t timeout);

//local variables
static uint32_t thePassword;
static uint32_t theAddress;
static uint16_t fingerID, confidence, templateCount;
static unsigned char cmd[CMD_LENGTH];



void grove_fingerprint_init(UART_T *uart, int pintx, int pinrx)
{
    suli_uart_init(uart, pintx, pinrx, 57600);
}

bool grove_fingerprint_write_setup(UART_T *uart)
{
    thePassword = 0;
    theAddress = 0xFFFFFFFF;
    
    return true;
}

bool grove_fingerprint_verifyPassword(UART_T *uart) {
  uint8_t packet[20] = {FINGERPRINT_VERIFYPASSWORD, 
                      (thePassword >> 24), (thePassword >> 16),
                      (thePassword >> 8), thePassword};
  grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 5+2, packet);
  uint8_t len = grove_fingerprint_getReply(uart, packet, 500);
  
  if ((len == 1) && (packet[0] == FINGERPRINT_ACKPACKET) && (packet[1] == FINGERPRINT_OK))
    return true;

/*
  Serial.print("\nGot packet type "); Serial.print(packet[0]);
  for (uint8_t i=1; i<len+1;i++) {
    Serial.print(" 0x");
    Serial.print(packet[i], HEX);
  }
  */
  return false;
}

bool grove_fingerprint_getImage(UART_T *uart, uint8_t *res) {
  uint8_t packet[20] = {FINGERPRINT_GETIMAGE};
  grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 1+2, packet);
  uint8_t len = grove_fingerprint_getReply(uart, packet, 500);
  
  if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
   return false;
   else
   {
    *res = packet[1];
    return true;
   }
}

bool grove_fingerprint_image2Tz(UART_T *uart, uint8_t slot, uint8_t *res) {
  uint8_t packet[20] = {FINGERPRINT_IMAGE2TZ, slot};
  grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 2+2, packet);
  uint8_t len = grove_fingerprint_getReply(uart, packet, 500);
  
  if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
   return false;
   else
   {
    *res = packet[1];
    return true;
   }
}

bool grove_fingerprint_createModel(UART_T *uart, uint8_t *res) {
  uint8_t packet[20] = {FINGERPRINT_REGMODEL};
  grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 1+2, packet);
  uint8_t len = grove_fingerprint_getReply(uart, packet, 500);
  
  if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
   return false;
   else
   {
    *res = packet[1];
    return true;
   }
}


bool grove_fingerprint_storeModel(UART_T *uart, uint16_t id, uint8_t *res) {
  uint8_t packet[20] = {FINGERPRINT_STORE, 0x01, id >> 8, id & 0xFF};
  grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 4+2, packet);
  uint8_t len = grove_fingerprint_getReply(uart, packet, 500);
  
  if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
   return false;
   else
   {
    *res = packet[1];
    return true;
   }
}

bool grove_fingerprint_deleteModel(UART_T *uart, uint16_t id, uint8_t *res) {
    uint8_t packet[20] = {FINGERPRINT_DELETE, id >> 8, id & 0xFF, 0x00, 0x01};
    grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 5+2, packet);
    uint8_t len = grove_fingerprint_getReply(uart, packet, 500);
        
   if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
   return false;
   else
   {
    *res = packet[1];
    return true;
   }
}

bool grove_fingerprint_emptyDatabase(UART_T *uart, uint8_t *res) {
  uint8_t packet[20] = {FINGERPRINT_EMPTY};
  grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 1+2, packet);
  uint8_t len = grove_fingerprint_getReply(uart, packet, 500);
  
  if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
   return false;
   else
   {
    *res = packet[1];
    return true;
   }
}

bool grove_fingerprint_fingerFastSearch(UART_T *uart, uint8_t *res) {
  fingerID = 0xFFFF;
  confidence = 0xFFFF;
  // high speed search of slot #1 starting at page 0x0000 and page #0x00A3 
  uint8_t packet[20] = {FINGERPRINT_HISPEEDSEARCH, 0x01, 0x00, 0x00, 0x00, 0xA3};
  grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 6+2, packet);
  uint8_t len = grove_fingerprint_getReply(uart, packet, 500);
  
  if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
   return false;

  fingerID = packet[2];
  fingerID <<= 8;
  fingerID |= packet[3];
  
  confidence = packet[4];
  confidence <<= 8;
  confidence |= packet[5];
  
  *res = packet[1];
    return true;
}

bool grove_fingerprint_getTemplateCount(UART_T *uart, uint8_t *res) {
  templateCount = 0xFFFF;
  // get number of templates in memory
  uint8_t packet[20] = {FINGERPRINT_TEMPLATECOUNT};
  grove_fingerprint_writePacket(uart, theAddress, FINGERPRINT_COMMANDPACKET, 1+2, packet);
  uint8_t len = grove_fingerprint_getReply(uart, packet, 500);
  
  if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
   return false;

  templateCount = packet[2];
  templateCount <<= 8;
  templateCount |= packet[3];
  
  *res = packet[1];
    return true;
}

static void grove_fingerprint_writePacket(UART_T *uart, uint32_t addr, uint8_t packettype, 
                       uint16_t len, uint8_t *packet) {
    uint8_t i = 0;
 

    cmd[0] = (uint8_t)(FINGERPRINT_STARTCODE >> 8);
    cmd[1] = (uint8_t)FINGERPRINT_STARTCODE;
    cmd[2] = (uint8_t)(addr >> 24);
    cmd[3] = (uint8_t)(addr >> 16);
    cmd[4] = (uint8_t)(addr >> 8);
    cmd[5] = (uint8_t)(addr);
    cmd[6] = (uint8_t)packettype;
    cmd[7] = (uint8_t)(len >> 8);
    cmd[8] = (uint8_t)(len);

  uint16_t sum = (len>>8) + (len&0xFF) + packettype;
  for (i=0; i< len-2; i++) {
    cmd[9+i] = packet[i];
    sum += packet[i];
  }

    cmd[9+i] = (uint8_t)(sum>>8);
    cmd[9+i+1] = (uint8_t)sum;
    
    suli_uart_write_bytes(uart, (uint8_t*)cmd, 9+i+1+1);
}


static uint8_t grove_fingerprint_getReply(UART_T *uart, uint8_t packet[], uint16_t timeout) {
  uint8_t reply[20], idx;
  uint16_t timer=0;
  
  idx = 0;
#ifdef FINGERPRINT_DEBUG
  Serial.print("<--- ");
#endif
while (true) {
    while (!suli_uart_readable(uart))
    {
      suli_delay_ms(1);
      timer++;
      if (timer >= timeout) return FINGERPRINT_TIMEOUT;
    }
    
    reply[idx] = suli_uart_read(uart);

    if ((idx == 0) && (reply[0] != (FINGERPRINT_STARTCODE >> 8)))
      continue;
    idx++;
    
    // check packet!
    if (idx >= 9) {
      if ((reply[0] != (FINGERPRINT_STARTCODE >> 8)) ||
          (reply[1] != (FINGERPRINT_STARTCODE & 0xFF)))
          return FINGERPRINT_BADPACKET;
      uint8_t packettype = reply[6];
      
      uint16_t len = reply[7];
      len <<= 8;
      len |= reply[8];
      len -= 2;
      
      if (idx <= (len+10)) continue;
      packet[0] = packettype;      
      for (uint8_t i=0; i<len; i++) {
        packet[1+i] = reply[9+i];
      }

      return len;
    }
  }
}