You've already forked M5-ProductExampleCodes
mirror of
https://github.com/m5stack/M5-ProductExampleCodes.git
synced 2026-05-20 10:24:10 -07:00
231 lines
4.4 KiB
C++
231 lines
4.4 KiB
C++
|
|
#include <M5Stack.h>
|
||
|
|
#include "finger.h"
|
||
|
|
|
||
|
|
|
||
|
|
FingerPrint::FingerPrint(void){
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
FingerPrint FP;
|
||
|
|
|
||
|
|
#define F_Time 10000
|
||
|
|
|
||
|
|
uint8_t FingerPrint::fpm_sendAndReceive(uint16_t timeout)
|
||
|
|
{
|
||
|
|
uint8_t i, j;
|
||
|
|
uint8_t checkSum = 0;
|
||
|
|
|
||
|
|
FP.RxCnt = 0;
|
||
|
|
FP.TxBuf[5] = 0;
|
||
|
|
|
||
|
|
Serial2.write(CMD_HEAD);
|
||
|
|
for (i = 1; i < 6; i++)
|
||
|
|
{
|
||
|
|
Serial2.write(FP.TxBuf[i]);
|
||
|
|
checkSum ^= FP.TxBuf[i];
|
||
|
|
}
|
||
|
|
Serial2.write(checkSum);
|
||
|
|
Serial2.write(CMD_TAIL);
|
||
|
|
|
||
|
|
while ((!Serial2.available()) && timeout > 0)
|
||
|
|
{
|
||
|
|
delay(1);
|
||
|
|
timeout--;
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8_t ch;
|
||
|
|
for(i=0;i<8;i++)
|
||
|
|
{
|
||
|
|
if(Serial2.available()){
|
||
|
|
ch = Serial2.read();
|
||
|
|
FP.RxCnt++;
|
||
|
|
FP.RxBuf[i] = ch;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (FP.RxCnt != 8) {FP.RxCnt = 0;return ACK_TIMEOUT;}
|
||
|
|
if (FP.RxBuf[HEAD] != CMD_HEAD) return ACK_FAIL;
|
||
|
|
if (FP.RxBuf[TAIL] != CMD_TAIL) return ACK_FAIL;
|
||
|
|
if (FP.RxBuf[CMD] != (FP.TxBuf[CMD])) return ACK_FAIL;
|
||
|
|
|
||
|
|
checkSum = 0;
|
||
|
|
for (j = 1; j < CHK; j++) {
|
||
|
|
checkSum ^= FP.RxBuf[j];
|
||
|
|
}
|
||
|
|
if (checkSum != FP.RxBuf[CHK]) {
|
||
|
|
return ACK_FAIL;
|
||
|
|
}
|
||
|
|
return ACK_SUCCESS;
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8_t FingerPrint::fpm_sleep(void)
|
||
|
|
{
|
||
|
|
uint8_t res;
|
||
|
|
|
||
|
|
FP.TxBuf[CMD] = CMD_SLEEP_MODE;
|
||
|
|
FP.TxBuf[P1] = 0;
|
||
|
|
FP.TxBuf[P2] = 0;
|
||
|
|
FP.TxBuf[P3] = 0;
|
||
|
|
|
||
|
|
res = fpm_sendAndReceive(500);
|
||
|
|
|
||
|
|
if(res == ACK_SUCCESS) {
|
||
|
|
return ACK_SUCCESS;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return ACK_FAIL;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8_t FingerPrint::fpm_setAddMode(uint8_t fpm_mode)
|
||
|
|
{
|
||
|
|
uint8_t res;
|
||
|
|
|
||
|
|
FP.TxBuf[CMD] = CMD_ADD_MODE;
|
||
|
|
FP.TxBuf[P1] = 0;
|
||
|
|
FP.TxBuf[P2] = fpm_mode;
|
||
|
|
FP.TxBuf[P3] = 0;
|
||
|
|
|
||
|
|
res = fpm_sendAndReceive(200);
|
||
|
|
|
||
|
|
if(res == ACK_SUCCESS && RxBuf[Q3] == ACK_SUCCESS) {
|
||
|
|
return ACK_SUCCESS;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return ACK_FAIL;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8_t FingerPrint::fpm_readAddMode(void)
|
||
|
|
{
|
||
|
|
FP.TxBuf[CMD] = CMD_ADD_MODE;
|
||
|
|
FP.TxBuf[P1] = 0;
|
||
|
|
FP.TxBuf[P2] = 0;
|
||
|
|
FP.TxBuf[P3] = 0X01;
|
||
|
|
|
||
|
|
fpm_sendAndReceive(200);
|
||
|
|
|
||
|
|
return RxBuf[Q2];
|
||
|
|
}
|
||
|
|
|
||
|
|
uint16_t FingerPrint::fpm_getUserNum(void)
|
||
|
|
{
|
||
|
|
uint8_t res;
|
||
|
|
|
||
|
|
FP.TxBuf[CMD] = CMD_USER_CNT;
|
||
|
|
FP.TxBuf[P1] = 0;
|
||
|
|
FP.TxBuf[P2] = 0;
|
||
|
|
FP.TxBuf[P3] = 0;
|
||
|
|
|
||
|
|
res = fpm_sendAndReceive(200);
|
||
|
|
|
||
|
|
if(res == ACK_SUCCESS && FP.RxBuf[Q3] == ACK_SUCCESS) {
|
||
|
|
return FP.RxBuf[Q2];
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return 0XFF;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8_t FingerPrint::fpm_deleteAllUser(void)
|
||
|
|
{
|
||
|
|
uint8_t res;
|
||
|
|
|
||
|
|
FP.TxBuf[CMD] = CMD_DEL_ALL;
|
||
|
|
FP.TxBuf[P1] = 0;
|
||
|
|
FP.TxBuf[P2] = 0;
|
||
|
|
FP.TxBuf[P3] = 0;
|
||
|
|
|
||
|
|
res = fpm_sendAndReceive(200);
|
||
|
|
|
||
|
|
if(res == ACK_SUCCESS && RxBuf[Q3] == ACK_SUCCESS) {
|
||
|
|
return ACK_SUCCESS;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return ACK_FAIL;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8_t FingerPrint::fpm_deleteUser(uint8_t userNum)
|
||
|
|
{
|
||
|
|
uint8_t res;
|
||
|
|
|
||
|
|
FP.TxBuf[CMD] = CMD_DEL;
|
||
|
|
FP.TxBuf[P1] = 0;
|
||
|
|
FP.TxBuf[P2] = userNum;
|
||
|
|
FP.TxBuf[P3] = 0;
|
||
|
|
|
||
|
|
res = fpm_sendAndReceive(200);
|
||
|
|
|
||
|
|
if(res == ACK_SUCCESS && RxBuf[Q3] == ACK_SUCCESS) {
|
||
|
|
return ACK_SUCCESS;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return ACK_FAIL;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8_t FingerPrint::fpm_addUser(uint8_t userNum, uint8_t userPermission)
|
||
|
|
{
|
||
|
|
uint8_t res;
|
||
|
|
|
||
|
|
FP.TxBuf[CMD] = CMD_ADD_1;
|
||
|
|
FP.TxBuf[P1] = 0;
|
||
|
|
FP.TxBuf[P2] = userNum;
|
||
|
|
FP.TxBuf[P3] = userPermission;
|
||
|
|
|
||
|
|
res = fpm_sendAndReceive(F_Time);
|
||
|
|
|
||
|
|
if(res == ACK_SUCCESS) {
|
||
|
|
if(FP.RxBuf[Q3] == ACK_SUCCESS) {
|
||
|
|
FP.TxBuf[CMD] = CMD_ADD_2;
|
||
|
|
|
||
|
|
res = fpm_sendAndReceive(F_Time);
|
||
|
|
|
||
|
|
if(res == ACK_SUCCESS) {
|
||
|
|
if(FP.RxBuf[Q3] == ACK_SUCCESS) {
|
||
|
|
FP.TxBuf[CMD] = CMD_ADD_3;
|
||
|
|
|
||
|
|
res = fpm_sendAndReceive(F_Time);
|
||
|
|
|
||
|
|
if(res == ACK_SUCCESS) {
|
||
|
|
return FP.RxBuf[Q3];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return res;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
uint8_t FingerPrint::fpm_compareFinger(void)
|
||
|
|
{
|
||
|
|
uint8_t res;
|
||
|
|
|
||
|
|
FP.TxBuf[CMD] = CMD_MATCH;
|
||
|
|
FP.TxBuf[P1] = 0;
|
||
|
|
FP.TxBuf[P2] = 0;
|
||
|
|
FP.TxBuf[P3] = 0;
|
||
|
|
|
||
|
|
res = fpm_sendAndReceive(8000);
|
||
|
|
|
||
|
|
if(res == ACK_SUCCESS)
|
||
|
|
{
|
||
|
|
if(FP.RxBuf[Q3] == ACK_NOUSER) {
|
||
|
|
return ACK_NOUSER;
|
||
|
|
}
|
||
|
|
if(FP.RxBuf[Q3] == ACK_TIMEOUT) {
|
||
|
|
return ACK_TIMEOUT;
|
||
|
|
}
|
||
|
|
if((FP.RxBuf[Q2] != 0) && (FP.RxBuf[Q3] == 1 || FP.RxBuf[Q3] == 2 || FP.RxBuf[Q3] == 3)) {
|
||
|
|
return ACK_SUCCESS;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return res;
|
||
|
|
}
|
||
|
|
|
||
|
|
|