fingerprint_sample.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. /*
  2. * @Author: Aurora-zk
  3. * @Date: 2021-03-14 12:39:09
  4. * @LastEditors: Aurora-zk
  5. * @LastEditTime: 2021-10-05 20:39:18
  6. * @contact: pk-ing@nyist.edu.cn
  7. * @FilePath: \fingerprint\fingerprint_sample.c
  8. */
  9. #include <fingerprint.h>
  10. #define THREAD_PRIORITY 25
  11. #define THREAD_STACK_SIZE 512
  12. #define THREAD_TIMESLICE 5
  13. #ifndef FINGERPRINT_UART_NAME
  14. #define FINGERPRINT_UART_NAME "uart2"
  15. #endif
  16. #define EVENT_QUERY (1 << 1)
  17. int fp_port(void)
  18. {
  19. rt_thread_t fp_init_tid = RT_NULL;
  20. fp_init_tid = rt_thread_create("fp_init",
  21. fp_init, FINGERPRINT_UART_NAME,
  22. THREAD_STACK_SIZE,
  23. THREAD_PRIORITY, THREAD_TIMESLICE);
  24. /* 如果获得线程控制块,启动这个线程 */
  25. if (fp_init_tid != RT_NULL)
  26. rt_thread_startup(fp_init_tid);
  27. return 0;
  28. }
  29. //INIT_ENV_EXPORT(fp_port);
  30. MSH_CMD_EXPORT(fp_port, fp_port)
  31. /*
  32. * 功能说明:删除一个指纹
  33. */
  34. void fp_delet_char_cmd(int argc,char** argv)
  35. {
  36. if (argc >= 2) {
  37. uint8_t code = fp_delet_char(atoi(argv[1]), 1);
  38. rt_kprintf("id:%d delet is %d !!\n", atoi(argv[1]), code);
  39. }else {
  40. rt_kprintf("Please enter the ID to verify!!\n");
  41. }
  42. }
  43. MSH_CMD_EXPORT(fp_delet_char_cmd, "fp_delet_char_cmd");
  44. /*
  45. * 功能说明:删除全部指纹
  46. */
  47. MSH_CMD_EXPORT(fp_empty, "fp_empty");
  48. /*
  49. * 功能说明:读取指纹模块基本信息
  50. */
  51. void fp_get_sys_para()
  52. {
  53. SysPara p;
  54. fp_ack_type_t code = fp_read_sys_para(&p);
  55. rt_kprintf("code = %lx\n", code);
  56. rt_kprintf("p->state = %lx\n", p.state);
  57. rt_kprintf("p->sensor = %lx\n", p.sensor);
  58. rt_kprintf("p->capacity = %d\n", p.capacity);
  59. rt_kprintf("p->grade = %lx\n", p.grade);
  60. rt_kprintf("p->addr = %lx\n", p.addr);
  61. rt_kprintf("p->size = %lx\n", p.size);
  62. rt_kprintf("p->baud = %lx\n", p.baud);
  63. }
  64. MSH_CMD_EXPORT(fp_get_sys_para, "fp_read_sys_para");
  65. /*
  66. * 功能说明:读取有效模板的个数
  67. */
  68. void fp_get_num(void)
  69. {
  70. rt_uint16_t valid_n;
  71. fp_ack_type_t code = fp_valid_templete_num(&valid_n);
  72. rt_kprintf("code = %lx\n", code);
  73. rt_kprintf("valid_n = %lx,", valid_n);
  74. }
  75. MSH_CMD_EXPORT(fp_get_num, "fp_valid_templete_num");
  76. /*
  77. * 获取有效id
  78. */
  79. uint16_t get_eff_id(void)
  80. {
  81. uint16_t count = 0;
  82. uint8_t page;
  83. IndexTable p;
  84. for (page = 0; page < 4; ++page) {
  85. fp_read_index_table(page,&p);
  86. for (int var = 0; var < 32; ++var) {
  87. for (int i = 0; i < 8; ++i) {
  88. if ((p.table[var] >> i) & 0x01) {
  89. count++;
  90. }
  91. else {
  92. // rt_kprintf("count = %d!!!\n",count);
  93. return count;
  94. }
  95. }
  96. }
  97. }
  98. return -1;
  99. }
  100. MSH_CMD_EXPORT(get_eff_id, "get_eff_id");
  101. /*
  102. * 获取id的状态,有无指纹
  103. */
  104. uint8_t get_id_state(uint16_t page_id)
  105. {
  106. uint8_t page = page_id / 256;
  107. IndexTable p;
  108. fp_read_index_table(page,&p);
  109. page = page_id % 256;
  110. return (p.table[page/8] >> (page%8)) & 0x01;
  111. }
  112. void get_id_state_cmd(int argc,char** argv)
  113. {
  114. if (argc >= 2) {
  115. uint8_t var = get_id_state(atoi(argv[1]));
  116. rt_kprintf("id:%d is %d !!\n", atoi(argv[1]), var);
  117. }else {
  118. rt_kprintf("Please enter the ID to verify!!\n");
  119. }
  120. }
  121. MSH_CMD_EXPORT(get_id_state_cmd, "get_id_state_cmd");
  122. //模块应答包确认码信息解析
  123. //功能:解析确认码错误信息返回信息
  124. //参数: ensure
  125. const char *EnsureMessage(uint8_t ensure)
  126. {
  127. const char *p;
  128. switch(ensure)
  129. {
  130. case 0x00:
  131. p="OK";break;
  132. case 0x01:
  133. p="数据包接收错误";break;
  134. case 0x02:
  135. p="传感器上没有手指";break;
  136. case 0x03:
  137. p="录入指纹图像失败";break;
  138. case 0x04:
  139. p="指纹图像太干、太淡而生不成特征";break;
  140. case 0x05:
  141. p="指纹图像太湿、太糊而生不成特征";break;
  142. case 0x06:
  143. p="指纹图像太乱而生不成特征";break;
  144. case 0x07:
  145. p="指纹图像正常,但特征点太少(或面积太小)而生不成特征";break;
  146. case 0x08:
  147. p="指纹不匹配";break;
  148. case 0x09:
  149. p="没搜索到指纹";break;
  150. case 0x0a:
  151. p="特征合并失败";break;
  152. case 0x0b:
  153. p="ID超出指纹库范围";
  154. case 0x0c:
  155. p="从指纹库读模板出错或无效";
  156. case 0x0d:
  157. p="上传特征失败";
  158. case 0x0e:
  159. p="模块不能接受后续数据包";
  160. case 0x0f:
  161. p="上传图像失败";
  162. case 0x10:
  163. p="删除模板失败";break;
  164. case 0x11:
  165. p="清空指纹库失败";break;
  166. case 0x12:
  167. p="不能进入低功耗状态";break;
  168. case 0x13:
  169. p="口令不正确";break;
  170. case 0x14:
  171. p="系统复位失败";break;
  172. case 0x15:
  173. p="缓冲区内没有有效原始图而生不成图像";break;
  174. case 0x16:
  175. p="在线升级失败";break;
  176. case 0x17:
  177. p="残留指纹或两次采集之间手指没有移动过";break;
  178. case 0x18:
  179. p="读写 FLASH 出错";break;
  180. case 0x19:
  181. p="未定义错误";break;
  182. case 0x1a:
  183. p="无效寄存器号";break;
  184. case 0x1b:
  185. p="寄存器设定内容错误";break;
  186. case 0x1c:
  187. p="记事本页码指定错误";break;
  188. case 0x1e:
  189. p="自动注册失败";break;
  190. case 0x1f:
  191. p="指纹库满";break;
  192. case 0x20:
  193. p="地址错误";break;
  194. case 0x23:
  195. p="指纹模板为空";break;
  196. case 0x24:
  197. p="指纹库为空";break;
  198. case 0x26:
  199. p="自动注册超时";break;
  200. case 0x27:
  201. p="自动注册指纹已存在";break;
  202. default :
  203. p=" ";break;
  204. }
  205. return p;
  206. }
  207. //显示确认码错误信息
  208. void ShowErrMessage(uint8_t ensure)
  209. {
  210. // rt_kprintf((uint8_t*)EnsureMessage(ensure));
  211. // rt_kprintf("\n");
  212. }
  213. /*
  214. * 功能说明:添加指纹,连续四次按压,并且中途需要抬起手指
  215. */
  216. void fp_add_fp(void)
  217. {
  218. uint8_t i=0,ensure ,processnum=1,pressCout=1, str_buffer[40];
  219. uint16_t ID = get_eff_id();
  220. while(1)
  221. {
  222. switch (processnum)
  223. {
  224. case 0: //连续按压4次指纹分别存到4个charBuffer里
  225. i++;
  226. rt_sprintf((char*)str_buffer,"Please raise your finger: %d\n",pressCout);
  227. rt_kprintf((char*)str_buffer);
  228. ensure=fp_get_image();
  229. if(ensure==0x02)
  230. {
  231. i=0;
  232. processnum=1;//跳到第一步
  233. pressCout++;
  234. if(pressCout >=5)
  235. {
  236. pressCout = 0;
  237. processnum=2;//跳到第二步
  238. }
  239. }
  240. break;
  241. case 1: //连续按压4次指纹分别存到4个charBuffer里
  242. i++;
  243. rt_sprintf((char*)str_buffer,"Please press your finger: %d\n",pressCout);
  244. rt_kprintf((char*)str_buffer);
  245. ensure=fp_get_image();
  246. if(ensure==0x00)
  247. {
  248. i=0;
  249. rt_thread_mdelay(100);//这里需要延时一下,模块内部处理图像需要时间
  250. ensure=fp_gen_char(pressCout);//生成特征
  251. if(ensure==0x00)
  252. {
  253. processnum=0;//跳到第零步
  254. }else ShowErrMessage(ensure);
  255. }else ShowErrMessage(ensure);
  256. break;
  257. case 2:
  258. rt_kprintf("Generate fingerprint template!\n");
  259. ensure=fp_reg_model();
  260. if(ensure==0x00)
  261. {
  262. rt_kprintf("Generate fingerprint template successfully!\n");
  263. processnum=3;//跳到第三步
  264. }else {processnum=1;ShowErrMessage(ensure);}
  265. rt_thread_mdelay(1200);
  266. break;
  267. case 3:
  268. rt_kprintf("Fingerprint storage in %d!\n",ID);
  269. ensure=fp_store_char(CharBuffer1,ID);//储存模板
  270. if(ensure==0x00)
  271. {
  272. rt_kprintf("Fingerprint entered successfully!\n");
  273. uint16_t ValidN;
  274. fp_valid_templete_num(&ValidN);//读库指纹个数
  275. // LCD_ShowNum(56,80,LB301Para.PS_max-ValidN,3,16);//显示剩余指纹容量
  276. rt_thread_mdelay(1500);
  277. return ;
  278. }else {processnum=1;ShowErrMessage(ensure);}
  279. break;
  280. }
  281. rt_thread_mdelay(200);
  282. if(i>=20)//超过20次没有按手指则退出
  283. {
  284. break;
  285. }
  286. }
  287. }
  288. MSH_CMD_EXPORT(fp_add_fp, "fp_valid_templete_num");
  289. /*
  290. * 功能说明:刷指纹
  291. */
  292. void fp_read(void)
  293. {
  294. SearchResult p;
  295. fp_ack_type_t code;
  296. code = fp_auto_identify(&p);
  297. rt_kprintf("Find the fingerprint! code =%d page_id=%lx, mat_score=%lx", code, p.pageID, p.mathscore);
  298. }
  299. MSH_CMD_EXPORT(fp_read, "fp_valid_templete_num");