diff options
| author | Sadeep Madurange <sadeep@asciimx.com> | 2025-06-10 16:56:27 +0800 |
|---|---|---|
| committer | Sadeep Madurange <sadeep@asciimx.com> | 2025-06-10 16:56:27 +0800 |
| commit | fcc9fee1437b0b2bd2b19b014650a4f82b5df456 (patch) | |
| tree | 3d4d4f86b660d4a5459b655d1ee07a7fb17a9792 | |
| parent | e636b3d8bf8b3400e9b2eec57fbf416fd7c31806 (diff) | |
| download | fpm-door-lock-fcc9fee1437b0b2bd2b19b014650a4f82b5df456.tar.gz | |
Move logic to main function.
| -rw-r--r-- | main.c | 111 |
1 files changed, 73 insertions, 38 deletions
@@ -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(); } |
