summaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorSadeep Madurange <sadeep@asciimx.com>2025-06-07 14:26:01 +0800
committerSadeep Madurange <sadeep@asciimx.com>2025-06-08 18:12:55 +0800
commita3a63e64d00a6554f935d574358c88afb453b09d (patch)
treed81dc86551f1ede68e385d4ee06115f59ffb1aae /main.c
downloadfpm-door-lock-a3a63e64d00a6554f935d574358c88afb453b09d.tar.gz
FPM and the buttons.
Diffstat (limited to 'main.c')
-rw-r--r--main.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..abc5b1b
--- /dev/null
+++ b/main.c
@@ -0,0 +1,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();
+}