diff options
Diffstat (limited to 'lock/frnt.c')
| -rw-r--r-- | lock/frnt.c | 59 |
1 files changed, 52 insertions, 7 deletions
diff --git a/lock/frnt.c b/lock/frnt.c index d0cfe74..18eac98 100644 --- a/lock/frnt.c +++ b/lock/frnt.c @@ -1,28 +1,73 @@ +/* Door front, connected to the fingerprint scanner */ + #include <stdint.h> #include <string.h> #include <util/delay.h> #include "nrfm.h" #include "uart.h" +#include "util.h" -int main(void) +#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 + +// todo: atomic var +static volatile int rxdr = 0; + +static inline void await_reply(void) { - const char *s = "hello world!"; - //const char *s = "hello how are you doing? This is supposed to be a very long message!"; - uint8_t slen = strlen(s); + radio_listen(); + for (i = 0; i < 500 && rxdr == 0; i += 100) + _delay_ms(100); +} +int main(void) +{ + uint8_t i; uint8_t rxaddr[ADDRLEN] = { 194, 178, 82 }; uint8_t txaddr[ADDRLEN] = { 194, 178, 83 }; + char key[WDLEN + 1], msg[WDLEN + 1]; + uart_init(); radio_init(rxaddr); radio_print_config(); for (;;) { - radio_sendto(txaddr, s, slen); - _delay_ms(2000); - } + _delay_ms(2000); /* todo: fingerprint check */ + xor(KEY, SYN, msg, WDLEN); + radio_sendto(txaddr, msg, WDLEN); + await_reply(); + if (rxdr) { + n = radio_recv(msg, WDLEN); + msg[n] = '\0'; + rxdr = 0; + + xor(KEY, msg, key, WDLEN); + xor(key, LOCK, msg, WDLEN); + radio_sendto(txaddr, msg, WDLEN); + await_reply(); + if (rxdr) { + n = radio_recv(msg, WDLEN); + msg[n] = '\0'; + rxdr = 0; + uart_write_line(msg); + } + } else { + // power down + } + } return 0; } + +ISR(RX_PCINTVEC) +{ + rxdr = 1; +} |
