finger.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #include "finger.h"
  2. #include <M5Stack.h>
  3. FingerPrint::FingerPrint(void) {}
  4. FingerPrint FP;
  5. #define F_Time 10000
  6. uint8_t FingerPrint::fpm_sendAndReceive(uint16_t timeout) {
  7. uint8_t i, j;
  8. uint8_t checkSum = 0;
  9. FP.RxCnt = 0;
  10. FP.TxBuf[5] = 0;
  11. Serial2.write(CMD_HEAD);
  12. for (i = 1; i < 6; i++) {
  13. Serial2.write(FP.TxBuf[i]);
  14. checkSum ^= FP.TxBuf[i];
  15. }
  16. Serial2.write(checkSum);
  17. Serial2.write(CMD_TAIL);
  18. while ((!Serial2.available()) && timeout > 0) {
  19. delay(1);
  20. timeout--;
  21. }
  22. uint8_t ch;
  23. for (i = 0; i < 8; i++) {
  24. if (Serial2.available()) {
  25. ch = Serial2.read();
  26. FP.RxCnt++;
  27. FP.RxBuf[i] = ch;
  28. }
  29. }
  30. if (FP.RxCnt != 8) {
  31. FP.RxCnt = 0;
  32. return ACK_TIMEOUT;
  33. }
  34. if (FP.RxBuf[HEAD] != CMD_HEAD) return ACK_FAIL;
  35. if (FP.RxBuf[TAIL] != CMD_TAIL) return ACK_FAIL;
  36. if (FP.RxBuf[CMD] != (FP.TxBuf[CMD])) return ACK_FAIL;
  37. checkSum = 0;
  38. for (j = 1; j < CHK; j++) {
  39. checkSum ^= FP.RxBuf[j];
  40. }
  41. if (checkSum != FP.RxBuf[CHK]) {
  42. return ACK_FAIL;
  43. }
  44. return ACK_SUCCESS;
  45. }
  46. uint8_t FingerPrint::fpm_sleep(void) {
  47. uint8_t res;
  48. FP.TxBuf[CMD] = CMD_SLEEP_MODE;
  49. FP.TxBuf[P1] = 0;
  50. FP.TxBuf[P2] = 0;
  51. FP.TxBuf[P3] = 0;
  52. res = fpm_sendAndReceive(500);
  53. if (res == ACK_SUCCESS) {
  54. return ACK_SUCCESS;
  55. } else {
  56. return ACK_FAIL;
  57. }
  58. }
  59. uint8_t FingerPrint::fpm_setAddMode(uint8_t fpm_mode) {
  60. uint8_t res;
  61. FP.TxBuf[CMD] = CMD_ADD_MODE;
  62. FP.TxBuf[P1] = 0;
  63. FP.TxBuf[P2] = fpm_mode;
  64. FP.TxBuf[P3] = 0;
  65. res = fpm_sendAndReceive(200);
  66. if (res == ACK_SUCCESS && RxBuf[Q3] == ACK_SUCCESS) {
  67. return ACK_SUCCESS;
  68. } else {
  69. return ACK_FAIL;
  70. }
  71. }
  72. uint8_t FingerPrint::fpm_readAddMode(void) {
  73. FP.TxBuf[CMD] = CMD_ADD_MODE;
  74. FP.TxBuf[P1] = 0;
  75. FP.TxBuf[P2] = 0;
  76. FP.TxBuf[P3] = 0X01;
  77. fpm_sendAndReceive(200);
  78. return RxBuf[Q2];
  79. }
  80. uint16_t FingerPrint::fpm_getUserNum(void) {
  81. uint8_t res;
  82. FP.TxBuf[CMD] = CMD_USER_CNT;
  83. FP.TxBuf[P1] = 0;
  84. FP.TxBuf[P2] = 0;
  85. FP.TxBuf[P3] = 0;
  86. res = fpm_sendAndReceive(200);
  87. if (res == ACK_SUCCESS && FP.RxBuf[Q3] == ACK_SUCCESS) {
  88. return FP.RxBuf[Q2];
  89. } else {
  90. return 0XFF;
  91. }
  92. }
  93. uint8_t FingerPrint::fpm_deleteAllUser(void) {
  94. uint8_t res;
  95. FP.TxBuf[CMD] = CMD_DEL_ALL;
  96. FP.TxBuf[P1] = 0;
  97. FP.TxBuf[P2] = 0;
  98. FP.TxBuf[P3] = 0;
  99. res = fpm_sendAndReceive(200);
  100. if (res == ACK_SUCCESS && RxBuf[Q3] == ACK_SUCCESS) {
  101. return ACK_SUCCESS;
  102. } else {
  103. return ACK_FAIL;
  104. }
  105. }
  106. uint8_t FingerPrint::fpm_deleteUser(uint8_t userNum) {
  107. uint8_t res;
  108. FP.TxBuf[CMD] = CMD_DEL;
  109. FP.TxBuf[P1] = 0;
  110. FP.TxBuf[P2] = userNum;
  111. FP.TxBuf[P3] = 0;
  112. res = fpm_sendAndReceive(200);
  113. if (res == ACK_SUCCESS && RxBuf[Q3] == ACK_SUCCESS) {
  114. return ACK_SUCCESS;
  115. } else {
  116. return ACK_FAIL;
  117. }
  118. }
  119. uint8_t FingerPrint::fpm_addUser(uint8_t userNum, uint8_t userPermission) {
  120. uint8_t res;
  121. FP.TxBuf[CMD] = CMD_ADD_1;
  122. FP.TxBuf[P1] = 0;
  123. FP.TxBuf[P2] = userNum;
  124. FP.TxBuf[P3] = userPermission;
  125. res = fpm_sendAndReceive(F_Time);
  126. if (res == ACK_SUCCESS) {
  127. if (FP.RxBuf[Q3] == ACK_SUCCESS) {
  128. FP.TxBuf[CMD] = CMD_ADD_2;
  129. res = fpm_sendAndReceive(F_Time);
  130. if (res == ACK_SUCCESS) {
  131. if (FP.RxBuf[Q3] == ACK_SUCCESS) {
  132. FP.TxBuf[CMD] = CMD_ADD_3;
  133. res = fpm_sendAndReceive(F_Time);
  134. if (res == ACK_SUCCESS) {
  135. return FP.RxBuf[Q3];
  136. }
  137. }
  138. }
  139. }
  140. }
  141. return res;
  142. }
  143. uint8_t FingerPrint::fpm_compareFinger(void) {
  144. uint8_t res;
  145. FP.TxBuf[CMD] = CMD_MATCH;
  146. FP.TxBuf[P1] = 0;
  147. FP.TxBuf[P2] = 0;
  148. FP.TxBuf[P3] = 0;
  149. res = fpm_sendAndReceive(8000);
  150. if (res == ACK_SUCCESS) {
  151. if (FP.RxBuf[Q3] == ACK_NOUSER) {
  152. return ACK_NOUSER;
  153. }
  154. if (FP.RxBuf[Q3] == ACK_TIMEOUT) {
  155. return ACK_TIMEOUT;
  156. }
  157. if ((FP.RxBuf[Q2] != 0) &&
  158. (FP.RxBuf[Q3] == 1 || FP.RxBuf[Q3] == 2 || FP.RxBuf[Q3] == 3)) {
  159. return ACK_SUCCESS;
  160. }
  161. }
  162. return res;
  163. }