Skip to content

Commit e387d30

Browse files
authored
Merge pull request #148 from Tinyu-Zhao/master
0.2.4
2 parents 4623d05 + 65183ae commit e387d30

File tree

7 files changed

+785
-67
lines changed

7 files changed

+785
-67
lines changed
Lines changed: 65 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,81 @@
1-
/*
2-
*******************************************************************************
3-
* Copyright (c) 2021 by M5Stack
4-
* Equipped with M5StickC sample source code
5-
* 配套 M5StickC 示例源代码
6-
* Visit the website for more information:https://docs.m5stack.com/en/unit/finger
7-
* 获取更多资料请访问:https://docs.m5stack.com/zh_CN/unit/finger
8-
*
9-
* describe: Finger.
10-
* date:2021/8/26
11-
*******************************************************************************
12-
*/
131
#include <M5StickC.h>
14-
#include "M5_FPC1020A.h"
2+
#include "finger.h"
153

164
uint8_t userNum; //User number
175
FingerPrint FP_M;
186

197
void CleanScreen()
208
{
21-
M5.Lcd.setTextColor(WHITE);
22-
M5.Lcd.fillRect(0,50,400,300,BLACK);
23-
M5.Lcd.setCursor(0, 10);
24-
userNum = FP_M.fpm_getUserNum();
25-
M5.Lcd.print("userNum:");
26-
M5.Lcd.println(userNum);
9+
M5.Lcd.setTextColor(WHITE);
10+
M5.Lcd.fillRect(0,50,400,300,BLACK);
11+
M5.Lcd.setCursor(0, 50);
12+
M5.Lcd.setTextSize(2);
13+
userNum = FP_M.fpm_getUserNum();
14+
M5.Lcd.print("userNum:");
15+
M5.Lcd.println(userNum);
2716
}
2817

2918
void setup() {
30-
M5.begin();
31-
Serial2.begin(19200, SERIAL_8N1, 33, 32);
32-
M5.Lcd.setRotation(3);
33-
M5.Lcd.setCursor(0, 0);
34-
M5.Lcd.println("Finger example");
35-
M5.Lcd.setTextColor(WHITE);
36-
M5.Lcd.setCursor(0, 10);
37-
userNum = FP_M.fpm_getUserNum();
19+
M5.begin();
20+
//Serial.begin(19200);
21+
Serial2.begin(19200, SERIAL_8N1, 33, 32);
22+
M5.Lcd.setRotation(3);
23+
//M5.Lcd.clear(BLACK);
24+
//M5.Lcd.setTextColor(YELLOW);
25+
//M5.Lcd.setTextFont(2);
26+
//M5.Lcd.setTextSize(3);
27+
M5.Lcd.setCursor(0, 0);
28+
M5.Lcd.println("Finger example");
29+
30+
M5.Lcd.setTextColor(WHITE);
31+
M5.Lcd.setCursor(0, 50);
32+
userNum = FP_M.fpm_getUserNum();
33+
M5.Lcd.print("userNum:");
34+
M5.Lcd.println(userNum);
35+
3836
}
3937

38+
//ButtonA: Add user
39+
//ButtonB: Matching
4040
void loop(){
41-
uint8_t res1;
42-
//ButtonA: Add user. 添加用户
43-
M5.Lcd.setCursor(0, 10);
44-
M5.Lcd.setTextSize(1);
45-
if(M5.BtnA.wasPressed()){
46-
CleanScreen();
47-
M5.Lcd.println("Fingerprint Typing");
48-
res1 = FP_M.fpm_addUser(userNum,1);
49-
if(res1 == ACK_SUCCESS){
50-
M5.Lcd.println("Success");
41+
42+
uint8_t res1;
43+
if(M5.BtnA.wasPressed()){
44+
CleanScreen();
45+
M5.Lcd.println("Fingerprint Typing");
46+
47+
res1 = FP_M.fpm_addUser(userNum,1);
48+
if(res1 == ACK_SUCCESS){
49+
M5.Lcd.println("Success");
50+
}
51+
else if(res1 == ACK_FAIL){
52+
M5.Lcd.println("Fail");
53+
}
54+
else if(res1 == ACK_FULL){
55+
M5.Lcd.println("Full");
56+
}
57+
else{
58+
M5.Lcd.println("Timeout");
59+
}
60+
userNum++;
5161
}
52-
else if(res1 == ACK_FAIL){
53-
M5.Lcd.println("Fail");
54-
}
55-
else if(res1 == ACK_FULL){
56-
M5.Lcd.println("Full");
57-
}
58-
else{
59-
M5.Lcd.println("Timeout");
60-
}
61-
userNum++;
62-
}
63-
//ButtonB: Matching. 匹配指纹
64-
if(M5.BtnB.wasPressed()){
65-
CleanScreen();
66-
M5.Lcd.println("Matching");
67-
res1 = FP_M.fpm_compareFinger();
68-
if(res1 == ACK_SUCCESS){
69-
M5.Lcd.println("Success");
70-
}
71-
if(res1 == ACK_NOUSER){
72-
M5.Lcd.println("No Such User");
73-
}
74-
if(res1 == ACK_TIMEOUT){
75-
M5.Lcd.println("Timeout");
62+
63+
if(M5.BtnB.wasPressed()){
64+
CleanScreen();
65+
M5.Lcd.println("Matching");
66+
67+
res1 = FP_M.fpm_compareFinger();
68+
if(res1 == ACK_SUCCESS){
69+
M5.Lcd.println("Success");
70+
}
71+
if(res1 == ACK_NOUSER){
72+
M5.Lcd.println("No Such User");
73+
}
74+
if(res1 == ACK_TIMEOUT){
75+
M5.Lcd.println("Timeout");
76+
}
7677
}
77-
}
78-
M5.update();
78+
79+
M5.update();
80+
7981
}
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
#include <M5StickC.h>
2+
#include "finger.h"
3+
4+
5+
FingerPrint::FingerPrint(void){
6+
7+
}
8+
9+
FingerPrint FP;
10+
11+
uint8_t FingerPrint::fpm_sendAndReceive(uint16_t timeout)
12+
{
13+
uint8_t i, j;
14+
uint8_t checkSum = 0;
15+
16+
FP.RxCnt = 0;
17+
FP.TxBuf[5] = 0;
18+
19+
Serial2.write(CMD_HEAD);
20+
for (i = 1; i < 6; i++)
21+
{
22+
Serial2.write(FP.TxBuf[i]);
23+
checkSum ^= FP.TxBuf[i];
24+
}
25+
Serial2.write(checkSum);
26+
Serial2.write(CMD_TAIL);
27+
28+
while (FP.RxCnt < 8 && timeout > 0)
29+
{
30+
delay(1);
31+
timeout--;
32+
}
33+
34+
uint8_t ch;
35+
for(i=0;i<8;i++)
36+
{
37+
if(Serial2.available()){
38+
ch = Serial2.read();
39+
FP.RxCnt++;
40+
FP.RxBuf[i] = ch;
41+
}
42+
}
43+
44+
if (FP.RxCnt != 8) {FP.RxCnt = 0;return ACK_TIMEOUT;}
45+
if (FP.RxBuf[HEAD] != CMD_HEAD) return ACK_FAIL;
46+
if (FP.RxBuf[TAIL] != CMD_TAIL) return ACK_FAIL;
47+
if (FP.RxBuf[CMD] != (FP.TxBuf[CMD])) return ACK_FAIL;
48+
49+
checkSum = 0;
50+
for (j = 1; j < CHK; j++) {
51+
checkSum ^= FP.RxBuf[j];
52+
}
53+
if (checkSum != FP.RxBuf[CHK]) {
54+
return ACK_FAIL;
55+
}
56+
return ACK_SUCCESS;
57+
}
58+
59+
uint8_t FingerPrint::fpm_sleep(void)
60+
{
61+
uint8_t res;
62+
63+
FP.TxBuf[CMD] = CMD_SLEEP_MODE;
64+
FP.TxBuf[P1] = 0;
65+
FP.TxBuf[P2] = 0;
66+
FP.TxBuf[P3] = 0;
67+
68+
res = fpm_sendAndReceive(500);
69+
70+
if(res == ACK_SUCCESS) {
71+
return ACK_SUCCESS;
72+
}
73+
else {
74+
return ACK_FAIL;
75+
}
76+
77+
}
78+
79+
uint8_t FingerPrint::fpm_setAddMode(uint8_t fpm_mode)
80+
{
81+
uint8_t res;
82+
83+
FP.TxBuf[CMD] = CMD_ADD_MODE;
84+
FP.TxBuf[P1] = 0;
85+
FP.TxBuf[P2] = fpm_mode;
86+
FP.TxBuf[P3] = 0;
87+
88+
res = fpm_sendAndReceive(200);
89+
90+
if(res == ACK_SUCCESS && RxBuf[Q3] == ACK_SUCCESS) {
91+
return ACK_SUCCESS;
92+
}
93+
else {
94+
return ACK_FAIL;
95+
}
96+
}
97+
98+
uint8_t FingerPrint::fpm_readAddMode(void)
99+
{
100+
FP.TxBuf[CMD] = CMD_ADD_MODE;
101+
FP.TxBuf[P1] = 0;
102+
FP.TxBuf[P2] = 0;
103+
FP.TxBuf[P3] = 0X01;
104+
105+
fpm_sendAndReceive(200);
106+
107+
return FP.RxBuf[Q2];
108+
}
109+
110+
uint16_t FingerPrint::fpm_getUserNum(void)
111+
{
112+
uint8_t res;
113+
114+
FP.TxBuf[CMD] = CMD_USER_CNT;
115+
FP.TxBuf[P1] = 0;
116+
FP.TxBuf[P2] = 0;
117+
FP.TxBuf[P3] = 0;
118+
119+
res = fpm_sendAndReceive(200);
120+
121+
if(res == ACK_SUCCESS && RxBuf[Q3] == ACK_SUCCESS) {
122+
return FP.RxBuf[Q2];
123+
}
124+
else {
125+
return 0XFF;
126+
}
127+
128+
}
129+
130+
uint8_t FingerPrint::fpm_deleteAllUser(void)
131+
{
132+
uint8_t res;
133+
134+
FP.TxBuf[CMD] = CMD_DEL_ALL;
135+
FP.TxBuf[P1] = 0;
136+
FP.TxBuf[P2] = 0;
137+
FP.TxBuf[P3] = 0;
138+
139+
res = fpm_sendAndReceive(200);
140+
141+
if(res == ACK_SUCCESS && RxBuf[Q3] == ACK_SUCCESS) {
142+
return ACK_SUCCESS;
143+
}
144+
else {
145+
return ACK_FAIL;
146+
}
147+
}
148+
149+
uint8_t FingerPrint::fpm_deleteUser(uint8_t userNum)
150+
{
151+
uint8_t res;
152+
153+
FP.TxBuf[CMD] = CMD_DEL;
154+
FP.TxBuf[P1] = 0;
155+
FP.TxBuf[P2] = userNum;
156+
FP.TxBuf[P3] = 0;
157+
158+
res = fpm_sendAndReceive(200);
159+
160+
if(res == ACK_SUCCESS && RxBuf[Q3] == ACK_SUCCESS) {
161+
return ACK_SUCCESS;
162+
}
163+
else {
164+
return ACK_FAIL;
165+
}
166+
}
167+
168+
uint8_t FingerPrint::fpm_addUser(uint8_t userNum, uint8_t userPermission)
169+
{
170+
uint8_t res;
171+
172+
FP.TxBuf[CMD] = CMD_ADD_1;
173+
FP.TxBuf[P1] = 0;
174+
FP.TxBuf[P2] = userNum;
175+
FP.TxBuf[P3] = userPermission;
176+
177+
res = fpm_sendAndReceive(30000);
178+
179+
if(res == ACK_SUCCESS) {
180+
if(FP.RxBuf[Q3] == ACK_SUCCESS) {
181+
FP.TxBuf[CMD] = CMD_ADD_2;
182+
183+
res = fpm_sendAndReceive(30000);
184+
185+
if(res == ACK_SUCCESS) {
186+
if(FP.RxBuf[Q3] == ACK_SUCCESS) {
187+
FP.TxBuf[CMD] = CMD_ADD_3;
188+
189+
res = fpm_sendAndReceive(30000);
190+
191+
if(res == ACK_SUCCESS) {
192+
return FP.RxBuf[Q3];
193+
}
194+
}
195+
}
196+
}
197+
}
198+
return res;
199+
200+
}
201+
202+
uint8_t FingerPrint::fpm_compareFinger(void)
203+
{
204+
uint8_t res;
205+
206+
FP.TxBuf[CMD] = CMD_MATCH;
207+
FP.TxBuf[P1] = 0;
208+
FP.TxBuf[P2] = 0;
209+
FP.TxBuf[P3] = 0;
210+
211+
res = fpm_sendAndReceive(30000);
212+
213+
if(res == ACK_SUCCESS)
214+
{
215+
if(FP.RxBuf[Q3] == ACK_NOUSER) {
216+
return ACK_NOUSER;
217+
}
218+
if(FP.RxBuf[Q3] == ACK_TIMEOUT) {
219+
return ACK_TIMEOUT;
220+
}
221+
if((FP.RxBuf[Q2] != 0) && (FP.RxBuf[Q3] == 1 || FP.RxBuf[Q3] == 2 || FP.RxBuf[Q3] == 3)) {
222+
return ACK_SUCCESS;
223+
}
224+
}
225+
return res;
226+
}
227+
228+

0 commit comments

Comments
 (0)