From c0766d32115ef8b5e92608555fad55a3618b69da Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Mon, 7 Apr 2025 14:32:41 +0800 Subject: frnt logic for radio comms. --- lock/frnt.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++------- lock/util.c | 9 +++++++++ lock/util.h | 14 ++++++++++++++ 3 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 lock/util.c create mode 100644 lock/util.h (limited to 'lock') 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 #include #include #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; +} diff --git a/lock/util.c b/lock/util.c new file mode 100644 index 0000000..e9a7a5a --- /dev/null +++ b/lock/util.c @@ -0,0 +1,9 @@ +#include "util.h" + +void xor(const char *k, const char *s, char *d, int n) +{ + int i; + + for (i = 0; i < n; i++) + d[i] = s[i] ^ k[i]; +} diff --git a/lock/util.h b/lock/util.h new file mode 100644 index 0000000..3f6d7a2 --- /dev/null +++ b/lock/util.h @@ -0,0 +1,14 @@ +#ifndef MY_UTIL_H +#define MY_UTIL_H + +#define WDLEN 32 + +#define KEY "dM>}jdb,6gsnC$J^K 8(I5vyPemPs%;K" +#define SYN "43iqr5$NB8SpN?Z/52{iVl>o|i!.'dsT" +#define LOCK "R,I7l^E4j]KyLR9'*Q{Jd'zu.~!84}Ij" +#define LOCKED "R,I7l^E4j]KyLR9'*Q{Jd'zu.~!84}Ik" +#define UNLOCKED "R,I7l^E4j]KyLR9'*Q{Jd'zu.~!84}Il" + +void xor(const char *k, const char *s, char *d, uint8_t n); + +#endif /* MY_UTIL_H */ -- cgit v1.2.3