summaryrefslogtreecommitdiffstats
path: root/main.c
blob: abc5b1bc1994398a6c88ab768f21cbbc576435cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdint.h>
#include <stdlib.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#include "fpm.h"

#define FRONT_UNLOCK_PIN   PD2
#define FRONT_LOCK_PIN     PD3
#define ENROLL_PIN         PD4
#define BACK_LOCK_PIN      PD5
#define BACK_UNLOCK_PIN    PD6

#define INPUT_DDR          DDRD
#define INPUT_PORT         PORTD

#define FPM_UNLOCK_INT     INT0
#define FPM_INT_VEC        INT0_vect

#define FRONT_LOCK_INT     PCINT19
#define ENROLL_INT         PCINT20
#define BACK_LOCK_INT      PCINT21
#define BACK_UNLOCK_INT    PCINT22
#define BTN_INT_VEC        PCINT2_vect

int main(void)
{
	/* input ports */
	INPUT_DDR &= ~((1 << BACK_LOCK_PIN) | (1 << BACK_UNLOCK_PIN) | 
	               (1 << FRONT_LOCK_PIN) | (1 << FRONT_UNLOCK_PIN) | 
	               (1 << ENROLL_PIN));

	INPUT_PORT |= ((1 << BACK_LOCK_PIN) | (1 << BACK_UNLOCK_PIN) | 
	               (1 << FRONT_LOCK_PIN) | (1 << FRONT_UNLOCK_PIN) | 
	               (1 << ENROLL_PIN));

	EICRA = 0b00000000;
	EIMSK = (1 << FPM_UNLOCK_INT);

	PCICR |= (1 << PCIE2);
	PCMSK2 |= ((1 << FRONT_LOCK_INT) | (1 << ENROLL_INT) | 
	           (1 << BACK_LOCK_INT) | (1 << BACK_UNLOCK_INT));

	fpm_init();
	sei();

	for (;;) {
	}

	return 0;
}

static inline int is_pressed(uint8_t btn)
{
	if (!((PIND >> btn) & 0x01)) {
		_delay_ms(50);
		return !((PIND >> btn) & 0x01);
	}
	return 0;
}

ISR(FPM_INT_VEC)
{
	cli();

	if (fpm_match()) {
		fpm_led(BREATHE, BLUE, 1);
	} else {
		fpm_led(BREATHE, RED, 1);
	}

	sei();
}

ISR(BTN_INT_VEC)
{
	uint16_t id;

	cli();

	if (is_pressed(FRONT_LOCK_PIN)) {
		fpm_led(FLASH, RED, 1);
	} else if (is_pressed(BACK_LOCK_PIN)) {
	} else if (is_pressed(BACK_UNLOCK_PIN)) {
	} else if (is_pressed(ENROLL_PIN)) {
		id = fpm_match();
		if (id == 1 || id == 2) {
			fpm_led(BREATHE, BLUE, 1);
			_delay_ms(1000);
			if (fpm_enroll())
				fpm_led(BREATHE, BLUE, 1);
		} else
			fpm_led(BREATHE, RED, 1);
	}

	sei();
}