summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSadeep Madurange <sadeep@asciimx.com>2025-06-10 16:56:27 +0800
committerSadeep Madurange <sadeep@asciimx.com>2025-06-10 16:56:27 +0800
commitfcc9fee1437b0b2bd2b19b014650a4f82b5df456 (patch)
tree3d4d4f86b660d4a5459b655d1ee07a7fb17a9792
parente636b3d8bf8b3400e9b2eec57fbf416fd7c31806 (diff)
downloadfpm-door-lock-fcc9fee1437b0b2bd2b19b014650a4f82b5df456.tar.gz
Move logic to main function.
-rw-r--r--main.c111
1 files changed, 73 insertions, 38 deletions
diff --git a/main.c b/main.c
index 7329e11..dbbf086 100644
--- a/main.c
+++ b/main.c
@@ -39,6 +39,26 @@
#define LED_DDR DDRB
#define LED_PORT PORTB
+static volatile int enroll = 0;
+static volatile int lock_in = 0;
+static volatile int lock_out = 0;
+static volatile int unlock_in = 0;
+static volatile int unlock_out = 0;
+
+static inline void lock(void)
+{
+ OCR1A = PWM_MID;
+ _delay_ms(100);
+ OCR1A = PWM_TOP;
+}
+
+static inline void unlock(void)
+{
+ OCR1A = PWM_MAX - 50;
+ _delay_ms(100);
+ OCR1A = PWM_TOP;
+}
+
/* Measure vcc by measuring known internal 1.1v bandgap
* reference voltage against AVCC.
*/
@@ -64,6 +84,8 @@ uint16_t getvcc(void)
int main(void)
{
+ uint16_t id;
+
/* disable watchdog timer */
cli();
wdt_reset();
@@ -75,6 +97,11 @@ int main(void)
LED_DDR |= (1 << LED_PIN);
LED_PORT &= ~(1 << LED_PIN);
+ for (int i = 0; i < 4; i++) {
+ LED_PORT ^= (1 << LED_PIN);
+ _delay_ms(70);
+ }
+
/* init input ports */
INPUT_DDR &= ~((1 << BACK_LOCK_PIN) | (1 << BACK_UNLOCK_PIN) |
(1 << FRONT_LOCK_PIN) | (1 << FRONT_UNLOCK_PIN) |
@@ -102,6 +129,38 @@ int main(void)
sei();
for (;;) {
+ if (lock_in) {
+ lock();
+ fpm_led(BREATHE, RED, 1);
+ lock_in = 0;
+ } else if (lock_out) {
+ lock();
+ fpm_led(BREATHE, RED, 1);
+ lock_out = 0;
+ } else if (unlock_in) {
+ unlock();
+ fpm_led(BREATHE, BLUE, 1);
+ unlock_in = 0;
+ } else if (unlock_out) {
+ if (fpm_match()) {
+ unlock();
+ fpm_led(BREATHE, BLUE, 1);
+ } else {
+ fpm_led(BREATHE, RED, 1);
+ }
+ unlock_out = 0;
+ } else if (enroll) {
+ 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);
+ enroll = 0;
+ }
+
if (getvcc() < VCC_MIN)
LED_PORT |= (1 << LED_PIN);
@@ -113,20 +172,6 @@ int main(void)
return 0;
}
-static inline void lock(void)
-{
- OCR1A = PWM_MID;
- _delay_ms(100);
- OCR1A = PWM_TOP;
-}
-
-static inline void unlock(void)
-{
- OCR1A = PWM_MAX - 50;
- _delay_ms(100);
- OCR1A = PWM_TOP;
-}
-
static inline int is_pressed(uint8_t btn)
{
if (!((PIND >> btn) & 0x01)) {
@@ -138,33 +183,23 @@ static inline int is_pressed(uint8_t btn)
ISR(FPM_INT_VEC)
{
- if (fpm_match()) {
- unlock();
- fpm_led(BREATHE, BLUE, 1);
- } else {
- fpm_led(BREATHE, RED, 1);
- }
+ cli();
+ unlock_out = 1;
+ sei();
}
ISR(BTN_INT_VEC)
{
- uint16_t id;
+ cli();
- if (is_pressed(FRONT_LOCK_PIN)) {
- lock();
- fpm_led(FLASH, RED, 1);
- } else if (is_pressed(BACK_LOCK_PIN)) {
- lock();
- } else if (is_pressed(BACK_UNLOCK_PIN)) {
- unlock();
- } 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);
- }
+ if (is_pressed(FRONT_LOCK_PIN))
+ lock_out = 1;
+ else if (is_pressed(BACK_LOCK_PIN))
+ lock_in = 1;
+ else if (is_pressed(BACK_UNLOCK_PIN))
+ unlock_in = 1;
+ else if (is_pressed(ENROLL_PIN))
+ enroll = 1;
+
+ sei();
}