From 4f80330bae049dec0e69433a0e87c5427553febe Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sat, 17 May 2025 10:57:12 +0800 Subject: Rename files and use -f flag in rm. --- lock/client.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 lock/client.c (limited to 'lock/client.c') diff --git a/lock/client.c b/lock/client.c new file mode 100644 index 0000000..1d1fe12 --- /dev/null +++ b/lock/client.c @@ -0,0 +1,160 @@ +/* Lock front, connected to the fingerprint scanner */ + +#include +#include + +#include +#include +#include +#include + +#include "fpm.h" +#include "nrfm.h" +#include "util.h" + +#define LOCK_PIN PD2 +#define UNLOCK_PIN PD3 + +#define RX_IRQ_PIN PC1 +#define RX_DDR DDRC +#define RX_PIN PINC +#define RX_ICR PCICR +#define RX_IE PCIE1 +#define RX_INT PCINT9 +#define RX_MSK PCMSK1 +#define RX_INTVEC PCINT1_vect + +#define VCC_MIN 4000 + +static volatile uint8_t rxd = 0; +static volatile uint8_t sync = 0; +static volatile uint8_t islock = 0; +static volatile uint8_t isunlock = 0; + +static inline void wdt_off(void) +{ + cli(); + wdt_reset(); + MCUSR &= ~(1 << WDRF); + WDTCSR |= (1 << WDCE) | (1 << WDE); + WDTCSR = 0x00; +} + +static inline void init_rx(void) +{ + RX_DDR &= ~(1 << RX_IRQ_PIN); + RX_ICR |= (1 << RX_IE); + RX_MSK |= (1 << RX_INT); +} + +static inline void init_btns(void) +{ + DDRD &= ~((1 << LOCK_PIN) | (1 << UNLOCK_PIN)); + PORTD |= ((1 << LOCK_PIN) | (1 << UNLOCK_PIN)); + + EICRA = 0b00000000; + EIMSK = (1 << INT0) | (1 << INT1); +} + +int main(void) +{ + int i, retries; + uint8_t rxaddr[ADDRLEN] = { 194, 178, 82 }; + uint8_t txaddr[ADDRLEN] = { 194, 178, 83 }; + + char buf[WDLEN], key[WDLEN]; + + wdt_off(); + led_init(); + fpm_init(); + + init_rx(); + init_btns(); + + radio_init(rxaddr); + + sei(); + radio_listen(); + + for (;;) { + if (!sync && (islock || isunlock)) { + if (isunlock) { + if (!fpm_match()) { + isunlock = 0; + continue; + } + } + + xor(KEY, SYN, buf, WDLEN); + retries = 0; + do { + sync = radio_sendto(txaddr, buf, WDLEN); + retries++; + _delay_ms(50); + } while (!sync && retries < 40); + + if (!sync) { + islock = 0; + isunlock = 0; + } + } + + if (rxd) { + radio_recv(buf, WDLEN); + rxd = 0; + if (sync && (islock || isunlock)) { + sync = 0; + xor(KEY, buf, key, WDLEN); + if (islock) { + islock = 0; + xor(key, LOCK, buf, WDLEN); + if (radio_sendto(txaddr, buf, WDLEN)) + led_locked(); + } else if (isunlock) { + isunlock = 0; + xor(key, UNLOCK, buf, WDLEN); + if (radio_sendto(txaddr, buf, WDLEN)) + led_unlocked(); + } + } + } + + if (!sync) { + if (getvcc() < VCC_MIN) { + for (i = 0; i < 5; i++) { + led_bat(); + _delay_ms(100); + } + } + + radio_pwr_dwn(); + sleep_bod_disable(); + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + sleep_mode(); + radio_listen(); + } + } + return 0; +} + +ISR(RX_INTVEC) +{ + if (!(RX_PIN & (1 << RX_IRQ_PIN))) + rxd = 1; +} + +ISR(INT0_vect) +{ + if (is_btn_pressed(PIND, LOCK_PIN)) { + sync = 0; + islock = 1; + } +} + +ISR(INT1_vect) +{ + if (is_btn_pressed(PIND, UNLOCK_PIN)) { + sync = 0; + isunlock = 1; + } +} -- cgit v1.2.3