finger.cpp 4.4 KB

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