diff options
| -rw-r--r-- | lock/fend.c | 96 |
1 files changed, 58 insertions, 38 deletions
diff --git a/lock/fend.c b/lock/fend.c index 41e907d..853fa24 100644 --- a/lock/fend.c +++ b/lock/fend.c @@ -11,61 +11,81 @@ #include "uart.h" #include "util.h" -#define BTN_PIN PINB -#define BTN_PCIE PCIE0 -#define BTN_PCINTVEC PCINT0_vect -#define LOCK_BTN PB0 -#define LOCK_BTN_PCINT PCINT0 - -#define RX_PIN PD7 -#define RX_DDR DDRD -#define RX_PORT PORTD -#define RX_PCIE PCIE2 -#define RX_PCINT PCINT23 -#define RX_PCMSK PCMSK2 -#define RX_PCINTVEC PCINT2_vect - -uint8_t syncing = 0; -static volatile uint8_t rxdr = 0; -static volatile uint8_t btn_press = 0; +#define LOCK_PIN PD2 + +#define RX_PIN PD7 +#define RX_DDR DDRD +#define RX_PORT PORTD +#define RX_PCIE PCIE2 +#define RX_PCINT PCINT23 +#define RX_PCMSK PCMSK2 +#define RX_PCINTVEC PCINT2_vect + +uint8_t synced = 0; +static volatile uint8_t rxd = 0; +static volatile uint8_t islock = 0; +static volatile uint8_t isunlock = 0; + +static inline void init_rx(void) +{ + RX_DDR &= ~(1 << RX_PIN); + RX_PORT |= (1 << RX_PIN); + PCICR |= (1 << RX_PCIE); + RX_PCMSK |= (1 << RX_PCINT); +} + +static inline void init_btns(void) +{ + DDRD &= ~(1 << LOCK_PIN); + PORTD |= (1 << LOCK_PIN); + + EICRA = 0b00000000; + EIMSK = (1 << INT0); +} int main(void) { - uint8_t n, rc; + uint8_t n; uint8_t rxaddr[ADDRLEN] = { 194, 178, 82 }; uint8_t txaddr[ADDRLEN] = { 194, 178, 83 }; char buf[WDLEN + 1], key[WDLEN + 1]; - RX_DDR &= ~(1 << RX_PIN); - RX_PORT |= (1 << RX_PIN); - PCICR |= (1 << RX_PCIE); - RX_PCMSK |= (1 << RX_PCINT); + init_rx(); + init_btns(); uart_init(); - btn_init(); radio_init(rxaddr); radio_print_config(); sei(); for (;;) { - if (rxdr) { - rxdr = 0; - if (syncing) { + if ((islock || isunlock) && !synced) { + xor(KEY, SYN, buf, WDLEN); + do { + synced = radio_sendto(txaddr, buf, WDLEN); + _delay_ms(10); + } while (!synced); + synced = 1; + } + + if (rxd) { + if (synced) { n = radio_recv(buf, WDLEN); buf[n] = '\0'; xor(KEY, buf, key, WDLEN); + if (islock) { + islock = 0; + xor(key, LOCK, buf, WDLEN); + } else if (isunlock) { + isunlock = 0; + xor(key, UNLOCK, buf, WDLEN); + } + radio_sendto(txaddr, buf, WDLEN); + synced = 0; } - } - - if (btn_press) { - syncing = 1; - btn_press = 0; - xor(KEY, SYN, buf, WDLEN); - do { - rc = radio_sendto(txaddr, buf, WDLEN); - } while (!rc); + rxd = 0; } } return 0; @@ -73,10 +93,10 @@ int main(void) ISR(RX_PCINTVEC) { - rxdr = 1; + rxd = 1; } -ISR(BTN_PCINTVEC) +ISR(INT0_vect) { - btn_press = 1; + islock = 1; } |
