summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ding.c55
1 files changed, 48 insertions, 7 deletions
diff --git a/ding.c b/ding.c
index 2bf9fe6..548c618 100644
--- a/ding.c
+++ b/ding.c
@@ -17,7 +17,42 @@
#define RX_PCMSK PCMSK2
#define RX_PCINTVEC PCINT2_vect
+#define LOCK_PIN PC5
+#define LOCK_DDR DDRC
+#define LOCK_PORT PORTC
+#define LOCK_PCIE PCIE1
+#define LOCK_PCINT PCINT13
+#define LOCK_PCMSK PCMSK1
+#define LOCK_PCINTVEC PCINT1_vect
+
static volatile int rxdr = 0;
+static volatile int lock = 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)
+{
+ LOCK_DDR &= ~(1 << LOCK_PIN);
+ LOCK_PORT |= (1 << LOCK_PIN);
+ PCICR |= (1 << LOCK_PCIE);
+ LOCK_PCMSK |= (1 << LOCK_PCINT);
+}
+
+static inline int is_btn_pressed(unsigned char btn)
+{
+ if (!((PINC >> btn) & 0x01)) {
+ _delay_us(2000);
+ return !((PINC >> btn) & 0x01);
+ }
+
+ return 0;
+}
int main(void)
{
@@ -27,6 +62,9 @@ int main(void)
uint8_t rxaddr[ADDRLEN] = { 194, 178, 82 };
uint8_t txaddr[ADDRLEN] = { 194, 178, 83 };
+ init_rx();
+ init_btns();
+
//wdt_stop();
uart_init();
radio_init(rxaddr);
@@ -35,9 +73,6 @@ int main(void)
sei();
radio_listen();
- _delay_ms(2000);
- radio_sendto(txaddr, "SYN", 3);
-
for (;;) {
if (rxdr) {
n = radio_recv(buf, MAXPDLEN);
@@ -47,12 +82,12 @@ int main(void)
uart_write("INFO: ");
uart_write_line(buf);
}
- } else {
- uart_write_line("No IRQ");
}
- _delay_ms(2000);
- radio_sendto(txaddr, "SYN", 3);
+ if (lock) {
+ radio_sendto(txaddr, "SYN", 3);
+ lock = 0;
+ }
}
return 0;
@@ -62,3 +97,9 @@ ISR(RX_PCINTVEC)
{
rxdr = 1;
}
+
+ISR(LOCK_PCINTVEC)
+{
+ if (is_btn_pressed(LOCK_PIN))
+ lock = 1;
+}