511 lines
13 KiB
C++
511 lines
13 KiB
C++
#include <SmingCore.h>
|
|
#include "FingerPrint.h"
|
|
|
|
int CFingerPrint::AsyncVerifyPassword(VerifyPasswordCallback fnCallback, void *pUser)
|
|
{
|
|
uint8_t aPayload[] = {
|
|
COMMAND_VFYPWD,
|
|
(uint8_t)(m_Password >> 24 & 0xFF),
|
|
(uint8_t)(m_Password >> 16 & 0xFF),
|
|
(uint8_t)(m_Password >> 8 & 0xFF),
|
|
(uint8_t)(m_Password >> 0 & 0xFF),
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncVerifyPassword;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncVerifyPassword(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
((VerifyPasswordCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!");
|
|
return;
|
|
}
|
|
|
|
if(length != 1)
|
|
{
|
|
((VerifyPasswordCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "Incorrect data length!");
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
((VerifyPasswordCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr);
|
|
}
|
|
|
|
|
|
int CFingerPrint::AsyncReadSystemParameters(ReadSystemParametersCallback fnCallback, void *pUser)
|
|
{
|
|
uint8_t aPayload[] = {
|
|
COMMAND_READSYSPARA,
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncReadSystemParameters;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncReadSystemParameters(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
((ReadSystemParametersCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!", NULL);
|
|
return;
|
|
}
|
|
|
|
if(length != 1 + sizeof(CFingerSystemParameters))
|
|
{
|
|
((ReadSystemParametersCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "Incorrect data length!", NULL);
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
CFingerSystemParameters *param = (CFingerSystemParameters *)m_aBuffer;
|
|
param->statusRegister = pData[1] << 8 | pData[2];
|
|
param->systemID = pData[3] << 8 | pData[4];
|
|
param->storageCapacity = pData[5] << 8 | pData[6];
|
|
param->securityLevel = pData[7] << 8 | pData[8];
|
|
param->deviceAddress = pData[9] << 24 | pData[10] << 16 | pData[11] << 8 | pData[12];
|
|
param->packetLength = pData[13] << 8 | pData[14];
|
|
param->baudRate = pData[15] << 8 | pData[16];
|
|
|
|
((ReadSystemParametersCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr, param);
|
|
}
|
|
|
|
|
|
int CFingerPrint::AsyncReadImage(ReadImageCallback fnCallback, void *pUser)
|
|
{
|
|
uint8_t aPayload[] = {
|
|
COMMAND_GENIMG,
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncReadImage;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncReadImage(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
((ReadImageCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!");
|
|
return;
|
|
}
|
|
|
|
if(length != 1)
|
|
{
|
|
((ReadImageCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "Incorrect data length!");
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
((ReadImageCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr);
|
|
}
|
|
|
|
|
|
int CFingerPrint::AsyncConvertImage(ConvertImageCallback fnCallback, void *pUser, uint8_t numCharBuffer)
|
|
{
|
|
if(numCharBuffer != 0x01 && numCharBuffer != 0x02)
|
|
return -1;
|
|
|
|
uint8_t aPayload[] = {
|
|
COMMAND_IMG2TZ,
|
|
numCharBuffer,
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncConvertImage;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncConvertImage(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
((ConvertImageCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!");
|
|
return;
|
|
}
|
|
|
|
if(length != 1)
|
|
{
|
|
((ConvertImageCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "Incorrect data length!");
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
((ConvertImageCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr);
|
|
}
|
|
|
|
|
|
int CFingerPrint::AsyncSearchTemplate(SearchTemplateCallback fnCallback, void *pUser, uint8_t numCharBuffer, uint16_t positionStart, uint16_t numTemplates)
|
|
{
|
|
if(numCharBuffer != 0x01 && numCharBuffer != 0x02)
|
|
return -1;
|
|
|
|
uint8_t aPayload[] = {
|
|
COMMAND_SEARCH,
|
|
numCharBuffer,
|
|
(uint8_t)(positionStart >> 8 & 0xFF),
|
|
(uint8_t)(positionStart >> 0 & 0xFF),
|
|
(uint8_t)(numTemplates >> 8 & 0xFF),
|
|
(uint8_t)(numTemplates >> 0 & 0xFF),
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncSearchTemplate;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncSearchTemplate(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
|
|
int16_t position = -1;
|
|
int16_t score = -1;
|
|
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
((SearchTemplateCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!", position, score);
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
if(error == ERROR_OK)
|
|
{
|
|
if(length != 5)
|
|
{
|
|
((SearchTemplateCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "Incorrect data length!", position, score);
|
|
return;
|
|
}
|
|
|
|
position = pData[1] << 8 | pData[2];
|
|
score = pData[3] << 8 | pData[4];
|
|
}
|
|
|
|
((SearchTemplateCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr, position, score);
|
|
}
|
|
|
|
|
|
int CFingerPrint::AsyncCompareCharacteristics(CompareCharacteristicsCallback fnCallback, void *pUser)
|
|
{
|
|
uint8_t aPayload[] = {
|
|
COMMAND_MATCH,
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncCompareCharacteristics;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncCompareCharacteristics(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
|
|
int16_t score = -1;
|
|
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
((CompareCharacteristicsCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!", score);
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
if(error == ERROR_OK)
|
|
{
|
|
if(length != 3)
|
|
{
|
|
((CompareCharacteristicsCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "Incorrect data length!", score);
|
|
return;
|
|
}
|
|
|
|
score = pData[1] << 8 | pData[2];
|
|
}
|
|
|
|
((CompareCharacteristicsCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr, score);
|
|
}
|
|
|
|
|
|
int CFingerPrint::AsyncCreateTemplate(CreateTemplateCallback fnCallback, void *pUser)
|
|
{
|
|
uint8_t aPayload[] = {
|
|
COMMAND_REGMODEL,
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncCreateTemplate;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncCreateTemplate(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
((CreateTemplateCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!");
|
|
return;
|
|
}
|
|
|
|
if(length != 1)
|
|
{
|
|
((CreateTemplateCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "Incorrect data length!");
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
((CreateTemplateCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr);
|
|
}
|
|
|
|
|
|
int CFingerPrint::AsyncDownloadCharacteristics(DownloadCharacteristicsCallback fnCallback, void *pUser, uint8_t numCharBuffer)
|
|
{
|
|
if(numCharBuffer != 0x01 && numCharBuffer != 0x02)
|
|
return -1;
|
|
|
|
uint8_t aPayload[] = {
|
|
COMMAND_UPCHAR,
|
|
numCharBuffer,
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncDownloadCharacteristics;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
m_iBuffer = -1;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncDownloadCharacteristics(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
if(m_iBuffer == -1)
|
|
{
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
((DownloadCharacteristicsCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!", NULL, 0);
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
if(error != ERROR_OK)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
((DownloadCharacteristicsCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr, NULL, 0);
|
|
return;
|
|
}
|
|
|
|
m_iBuffer = 0;
|
|
m_RecvState = RECV_WAITING;
|
|
return;
|
|
}
|
|
|
|
if(ident != IDENT_DATA && ident != IDENT_ENDOFDATA)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
((DownloadCharacteristicsCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no data packet", NULL, 0);
|
|
return;
|
|
}
|
|
|
|
if(sizeof(m_aBuffer) - m_iBuffer < length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
((DownloadCharacteristicsCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "Not enough space to store received data", NULL, 0);
|
|
return;
|
|
}
|
|
|
|
memcpy(&m_aBuffer[m_iBuffer], pData, length);
|
|
m_iBuffer += length;
|
|
|
|
if(ident == IDENT_ENDOFDATA)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
((DownloadCharacteristicsCallback)m_fnUserCallback)(m_pUserData, ERROR_OK, ExplainFingerError(ERROR_OK), (int8_t *)m_aBuffer, m_iBuffer);
|
|
return;
|
|
}
|
|
|
|
m_RecvState = RECV_WAITING;
|
|
}
|
|
|
|
|
|
int CFingerPrint::AsyncLoadTemplate(LoadTemplateCallback fnCallback, void *pUser, uint16_t positionNumber, uint8_t numCharBuffer)
|
|
{
|
|
if(numCharBuffer != 0x01 && numCharBuffer != 0x02)
|
|
return -1;
|
|
|
|
uint8_t aPayload[] = {
|
|
COMMAND_LOADCHAR,
|
|
numCharBuffer,
|
|
(uint8_t)(positionNumber >> 8 & 0xFF),
|
|
(uint8_t)(positionNumber >> 0 & 0xFF),
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncLoadTemplate;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncLoadTemplate(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
((LoadTemplateCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!");
|
|
return;
|
|
}
|
|
|
|
if(length != 1)
|
|
{
|
|
((LoadTemplateCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "Incorrect data length!");
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
((LoadTemplateCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr);
|
|
}
|
|
|
|
|
|
int CFingerPrint::AsyncStoreTemplate(StoreTemplateCallback fnCallback, void *pUser, uint16_t positionNumber, uint8_t numCharBuffer)
|
|
{
|
|
if(numCharBuffer != 0x01 && numCharBuffer != 0x02)
|
|
return -1;
|
|
|
|
uint8_t aPayload[] = {
|
|
COMMAND_STORE,
|
|
numCharBuffer,
|
|
(uint8_t)(positionNumber >> 8 & 0xFF),
|
|
(uint8_t)(positionNumber >> 0 & 0xFF),
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncStoreTemplate;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
m_iBuffer = positionNumber;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncStoreTemplate(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
((StoreTemplateCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!", m_iBuffer);
|
|
return;
|
|
}
|
|
|
|
if(length != 1)
|
|
{
|
|
((StoreTemplateCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "Incorrect data length!", m_iBuffer);
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
((StoreTemplateCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr, m_iBuffer);
|
|
}
|
|
|
|
|
|
int CFingerPrint::AsyncReadTemplateMap(ReadTemplateMapCallback fnCallback, void *pUser, uint8_t numPage)
|
|
{
|
|
uint8_t aPayload[] = {
|
|
COMMAND_READCONLIST,
|
|
numPage
|
|
};
|
|
|
|
m_fnRecvCallback = &CFingerPrint::OnAsyncReadTemplateMap;
|
|
m_fnUserCallback = (void *)fnCallback;
|
|
m_pUserData = pUser;
|
|
|
|
Write(IDENT_COMMAND, aPayload, sizeof(aPayload));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CFingerPrint::OnAsyncReadTemplateMap(FingerPrintIdent ident, uint8_t *pData, uint16_t length)
|
|
{
|
|
m_RecvState = RECV_DROP;
|
|
|
|
if(ident != IDENT_ACK)
|
|
{
|
|
((ReadTemplateMapCallback)m_fnUserCallback)(m_pUserData, ERROR_COMMUNICATION, "The received packet is no ack packet!", NULL, 0);
|
|
return;
|
|
}
|
|
|
|
uint8_t error = pData[0];
|
|
const char *errorStr = ExplainFingerError(error);
|
|
|
|
if(error != ERROR_OK)
|
|
{
|
|
((ReadTemplateMapCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr, NULL, 0);
|
|
return;
|
|
}
|
|
|
|
((ReadTemplateMapCallback)m_fnUserCallback)(m_pUserData, (FingerPrintError)error, errorStr, &pData[1], length - 1);
|
|
}
|