blob: 583d1ed3f6fadb0814391999458a79d8733b9667 [file] [log] [blame]
/*
* Copyright (c) 2021 Linumiz
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/drivers/uart.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/sensor/grow_r502a.h>
static bool enroll;
static struct sensor_value fid, val;
static void finger_match(const struct device *dev)
{
struct sensor_value input;
int ret;
ret = sensor_attr_get(dev, SENSOR_CHAN_FINGERPRINT,
SENSOR_ATTR_R502A_RECORD_FIND, &input);
if (ret != 0) {
printk("Sensor attr get failed %d\n", ret);
return;
}
printk("Matched ID : %d\n", input.val1);
printk("confidence : %d\n", input.val2);
}
static void finger_enroll(const struct device *dev)
{
int ret;
ret = sensor_attr_set(dev, SENSOR_CHAN_FINGERPRINT, SENSOR_ATTR_R502A_RECORD_ADD, &fid);
if (ret == 0) {
printk("Fingerprint successfully stored at #%d\n", fid.val1);
enroll = false;
}
}
static void template_count_get(const struct device *dev)
{
int ret;
ret = sensor_sample_fetch(dev);
if (ret < 0) {
printk("Sample Fetch Error %d\n", ret);
return;
}
ret = sensor_channel_get(dev, SENSOR_CHAN_FINGERPRINT, &val);
if (ret < 0) {
printk("Channel Get Error %d\n", ret);
return;
}
printk("template count : %d\n", val.val1);
}
static void trigger_handler(const struct device *dev,
const struct sensor_trigger *trigger)
{
if (enroll) {
finger_enroll(dev);
} else {
template_count_get(dev);
finger_match(dev);
}
}
int main(void)
{
static struct sensor_value del, fid_get;
int ret;
const struct device *dev = DEVICE_DT_GET_ONE(hzgrow_r502a);
if (dev == NULL) {
printk("Error: no device found\n");
return 0;
}
if (!device_is_ready(dev)) {
printk("Error: Device %s is not ready\n", dev->name);
return 0;
}
template_count_get(dev);
del.val1 = 3;
ret = sensor_attr_set(dev, SENSOR_CHAN_FINGERPRINT, SENSOR_ATTR_R502A_RECORD_DEL, &del);
if (ret != 0) {
printk("Sensor attr set failed %d\n", ret);
return 0;
}
printk("Fingerprint Deleted at ID #%d\n", del.val1);
ret = sensor_attr_get(dev, SENSOR_CHAN_FINGERPRINT,
SENSOR_ATTR_R502A_RECORD_FREE_IDX, &fid_get);
if (ret != 0) {
printk("Sensor attr get failed %d\n", ret);
return 0;
}
printk("Fingerprint template free idx at ID #%d\n", fid_get.val1);
fid.val1 = fid_get.val1;
printk("Waiting for valid finger to enroll as ID #%d\n"
"Place your finger\n", fid.val1);
enroll = true;
if (IS_ENABLED(CONFIG_GROW_R502A_TRIGGER)) {
struct sensor_trigger trig = {
.type = SENSOR_TRIG_TOUCH,
.chan = SENSOR_CHAN_FINGERPRINT,
};
ret = sensor_trigger_set(dev, &trig, trigger_handler);
if (ret != 0) {
printk("Could not set trigger\n");
return 0;
}
}
return 0;
}