Skip to content

Commit

Permalink
Switch to mgos_fingerprint_svc_*()
Browse files Browse the repository at this point in the history
  • Loading branch information
pimvanpelt committed Dec 24, 2019
1 parent 250bead commit 8b01278
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 154 deletions.
3 changes: 2 additions & 1 deletion mos.yml
Expand Up @@ -27,7 +27,8 @@ config_schema:

# List of libraries used by this app, in order of initialisation
libs:
- origin: https://github.com/mongoose-os-libs/fingerprint
# - origin: https://github.com/mongoose-os-libs/fingerprint
- origin: /Users/pim/src/fingerprint

# Used by the mos tool to catch mos binaries incompatible with this file format
manifest_version: 2017-05-18
207 changes: 54 additions & 153 deletions src/main.c
Expand Up @@ -18,161 +18,19 @@
#include "mgos_config.h"
#include "mgos_fingerprint.h"

#define MODE_NONE 0
#define MODE_MATCH 1
#define MODE_ENROLL 2
#define STATE_NONE 0
#define STATE_FIRST_IMAGE 1
#define STATE_SECOND_IMAGE 2

static uint8_t s_mode = MODE_MATCH;
static uint8_t s_state = STATE_NONE;

static void match_cb(struct mgos_fingerprint *finger) {
int16_t p;
if (!finger) return;

p = mgos_fingerprint_image_genchar(finger, 1);
if (p != MGOS_FINGERPRINT_OK) {
LOG(LL_ERROR, ("Error image_genchar(): %d!", p));
goto out;
}

uint16_t fid = -1, score = 0;
p = mgos_fingerprint_database_search(finger, &fid, &score, 1);
switch (p) {
case MGOS_FINGERPRINT_OK:
LOG(LL_INFO, ("Fingerprint match: fid=%d score=%d", fid, score));
break;
case MGOS_FINGERPRINT_NOTFOUND:
LOG(LL_INFO, ("Fingerprint not found"));
break;
default:
LOG(LL_ERROR, ("Error database_search(): %d!", p));
}

out:
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_BREATHING, 0xA0,
p == MGOS_FINGERPRINT_OK
? MGOS_FINGERPRINT_AURA_BLUE
: MGOS_FINGERPRINT_AURA_RED,
1);
return;
}

static void enroll_cb(struct mgos_fingerprint *finger) {
int16_t p;

switch (s_state) {
case STATE_FIRST_IMAGE:
if (MGOS_FINGERPRINT_OK !=
(p = mgos_fingerprint_image_genchar(finger, 1))) {
LOG(LL_ERROR, ("Could not generate first image"));
goto err;
}
LOG(LL_INFO, ("Stored first fingerprint: Remove finger"));

while (p != MGOS_FINGERPRINT_NOFINGER) {
p = mgos_fingerprint_image_get(finger);
usleep(50000);
}

s_state = STATE_SECOND_IMAGE;
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_BREATHING, 0x40,
MGOS_FINGERPRINT_AURA_BLUE, 0);
return;

break;
case STATE_SECOND_IMAGE: {
int16_t fid;

if (MGOS_FINGERPRINT_OK != mgos_fingerprint_image_genchar(finger, 2)) {
LOG(LL_ERROR, ("Could not generate second fingerprint"));
goto err;
}
LOG(LL_INFO, ("Stored second fingerprint"));

if (MGOS_FINGERPRINT_OK != mgos_fingerprint_model_combine(finger)) {
LOG(LL_ERROR, ("Could not combine fingerprints into a model"));
goto err;
}
LOG(LL_INFO, ("Fingerprints combined successfully"));

if (MGOS_FINGERPRINT_OK != mgos_fingerprint_get_free_id(finger, &fid)) {
LOG(LL_ERROR, ("Could not get free flash slot"));
goto err;
}

if (MGOS_FINGERPRINT_OK != mgos_fingerprint_model_store(finger, fid, 1)) {
LOG(LL_ERROR, ("Could not store model in flash slot %u", fid));
goto err;
}
LOG(LL_INFO, ("Model stored in flash slot %d", fid));
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_FLASHING, 0x08,
MGOS_FINGERPRINT_AURA_BLUE, 5);
sleep(2);

s_mode = MODE_ENROLL;
s_state = STATE_FIRST_IMAGE;
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_BREATHING, 0x40,
MGOS_FINGERPRINT_AURA_BLUE, 0);
return;
}
}

// Bail with error, and return to match mode.
err:
LOG(LL_ERROR, ("Error, returning to enroll mode"));
s_state = STATE_FIRST_IMAGE;
s_mode = MODE_ENROLL;
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_FLASHING, 0x08,
MGOS_FINGERPRINT_AURA_RED, 5);
sleep(2);
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_BREATHING, 0x40,
MGOS_FINGERPRINT_AURA_BLUE, 0);
}

static void timer_cb(void *arg) {
struct mgos_fingerprint *finger = (struct mgos_fingerprint *) arg;

int16_t p = mgos_fingerprint_image_get(finger);
if (p == MGOS_FINGERPRINT_NOFINGER) {
return;
} else if (p != MGOS_FINGERPRINT_OK) {
LOG(LL_ERROR, ("image_get() error: %d", p));
return;
}

LOG(LL_INFO, ("Fingerprint image taken (%s mode)", s_mode==MODE_MATCH?"match":"enroll"));
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_FLASHING, 0x08,
MGOS_FINGERPRINT_AURA_PURPLE, 2);

switch (s_mode) {
case MODE_MATCH:
return match_cb(finger);
break;
case MODE_ENROLL:
return enroll_cb(finger);
break;
}
}

static void enroll_handler(int pin, void *arg) {
static void mode_handler(int pin, void *arg) {
struct mgos_fingerprint *finger = (struct mgos_fingerprint *) arg;
int mode;
if (!finger) return;

if (s_mode == MODE_ENROLL) {
if (!mgos_fingerprint_svc_mode_get(finger, &mode)) return;
if (mode == MGOS_FINGERPRINT_MODE_ENROLL) {
LOG(LL_INFO, ("Entering match mode"));
s_state = STATE_NONE;
s_mode = MODE_MATCH;
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_OFF, 0xF0,
MGOS_FINGERPRINT_AURA_PURPLE, 0);
mgos_fingerprint_svc_mode_set(finger, MGOS_FINGERPRINT_MODE_MATCH);
return;
}
LOG(LL_INFO, ("Entering enroll mode"));
s_mode = MODE_ENROLL;
s_state = STATE_FIRST_IMAGE;
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_BREATHING, 0x40,
MGOS_FINGERPRINT_AURA_BLUE, 0);
mgos_fingerprint_svc_mode_set(finger, MGOS_FINGERPRINT_MODE_ENROLL);
}

static void erase_handler(int pin, void *arg) {
Expand All @@ -182,33 +40,76 @@ static void erase_handler(int pin, void *arg) {
mgos_fingerprint_model_count(finger, &num_models);

LOG(LL_INFO, ("Erasing %u model(s) from database", num_models));
s_mode = MODE_MATCH;
s_state = STATE_NONE;
mgos_fingerprint_database_erase(finger);
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_FLASHING, 0x40,
MGOS_FINGERPRINT_AURA_RED, 3);
}

static void mgos_fingerprint_handler(struct mgos_fingerprint *finger, int ev,
void *ev_data, void *user_data) {
switch (ev) {
case MGOS_FINGERPRINT_EV_INITIALIZED:
break;
case MGOS_FINGERPRINT_EV_IMAGE:
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_FLASHING, 0x08,
MGOS_FINGERPRINT_AURA_PURPLE, 2);
break;
case MGOS_FINGERPRINT_EV_MATCH_OK:
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_BREATHING, 0xF0,
MGOS_FINGERPRINT_AURA_BLUE, 1);
break;
case MGOS_FINGERPRINT_EV_MATCH_ERROR:
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_BREATHING, 0xF0,
MGOS_FINGERPRINT_AURA_RED, 1);
break;
case MGOS_FINGERPRINT_EV_STATE_MATCH:
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_OFF, 0xF0,
MGOS_FINGERPRINT_AURA_PURPLE, 0);
break;
case MGOS_FINGERPRINT_EV_STATE_ENROLL1:
case MGOS_FINGERPRINT_EV_STATE_ENROLL2:
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_BREATHING, 0x40,
MGOS_FINGERPRINT_AURA_BLUE, 0);
break;
case MGOS_FINGERPRINT_EV_ENROLL_OK:
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_FLASHING, 0x08,
MGOS_FINGERPRINT_AURA_BLUE, 5);
sleep(2);
break;
case MGOS_FINGERPRINT_EV_ENROLL_ERROR:
mgos_fingerprint_led_aura(finger, MGOS_FINGERPRINT_AURA_FLASHING, 0x08,
MGOS_FINGERPRINT_AURA_RED, 5);
sleep(2);
break;
default:
LOG(LL_WARN, ("Unknown event %d", ev));
}
(void) ev_data;
(void) user_data;
}

enum mgos_app_init_result mgos_app_init(void) {
struct mgos_fingerprint *finger = NULL;
struct mgos_fingerprint_cfg cfg;

mgos_fingerprint_config_set_defaults(&cfg);
cfg.uart_no = 2;
cfg.handler = mgos_fingerprint_handler;

if (NULL == (finger = mgos_fingerprint_create(&cfg))) {
LOG(LL_ERROR, ("Did not find fingerprint sensor"));
return false;
}

mgos_set_timer(250, true, timer_cb, finger);
// Start service
mgos_fingerprint_svc_init(finger, 250);

// Register enroll button
mgos_gpio_set_mode(mgos_sys_config_get_app_enroll_gpio(),
MGOS_GPIO_MODE_INPUT);
mgos_gpio_set_button_handler(mgos_sys_config_get_app_enroll_gpio(),
MGOS_GPIO_PULL_UP, MGOS_GPIO_INT_EDGE_POS, 50,
enroll_handler, finger);
mode_handler, finger);

// Register erase button
mgos_gpio_set_mode(mgos_sys_config_get_app_erase_gpio(),
Expand Down

0 comments on commit 8b01278

Please sign in to comment.