summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lock/fend.c96
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;
}