summaryrefslogtreecommitdiffstats
path: root/lock
diff options
context:
space:
mode:
authorSadeep Madurange <sadeep@asciimx.com>2025-04-15 18:43:49 +0800
committerSadeep Madurange <sadeep@asciimx.com>2025-04-15 20:46:46 +0800
commit065594d8b1344ed8110f7e7e1ff4b7281e8eb291 (patch)
tree45b520ad2a8219fbf313e403a0a592fdf7af83d9 /lock
parent18502ba0f60906d6fc886d85096d8c2eef9ca4a9 (diff)
downloadsmart-home-065594d8b1344ed8110f7e7e1ff4b7281e8eb291.tar.gz
Backend btns and debounce logic.
Diffstat (limited to 'lock')
-rw-r--r--lock/bend.c88
-rw-r--r--lock/util.c11
-rw-r--r--lock/util.h2
3 files changed, 74 insertions, 27 deletions
diff --git a/lock/bend.c b/lock/bend.c
index 0b1061d..a830c5e 100644
--- a/lock/bend.c
+++ b/lock/bend.c
@@ -11,22 +11,28 @@
#include "uart.h"
#include "util.h"
-#define PWM_MIN 500
-#define PWM_MID 1500
-#define PWM_MAX 2500
-#define PWM_TOP 20000
-
-#define SERVO_PIN PB1
-#define LOCK_BTN PD6
-#define UNLOCK_BTN PD7
-
-#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
+#define PWM_MIN 500
+#define PWM_MID 1500
+#define PWM_MAX 2500
+#define PWM_TOP 20000
+
+#define SERVO_PIN PB1
+
+#define BTN_PIN PINC
+#define BTN_PCIE PCIE1
+#define BTN_PCINTVEC PCINT1_vect
+#define LOCK_BTN PD6
+#define UNLOCK_BTN PD7
+#define LOCK_BTN_PCINT PCINT12
+#define UNLOCK_BTN_PCINT PCINT13
+
+#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
static char tab[] = {
'0', '8', '3', '6', 'a', 'Z', '$', '4', 'v', 'R', '@',
@@ -65,6 +71,14 @@ static inline void keydel(char *buf, uint8_t n)
buf[i] = 0;
}
+static inline void btn_init(void)
+{
+ DDRD &= ~((1 << LOCK_BTN) | (1 << UNLOCK_BTN));
+ PORTD |= (1 << LOCK_BTN) | (1 << UNLOCK_BTN);
+ PCICR |= (1 << BTN_PCIE);
+ PCMSK2 |= ((1 << LOCK_BTN_PCINT) | (1 << UNLOCK_BTN_PCINT));
+}
+
static inline void servo_init(void)
{
DDRB |= (1 << SERVO_PIN);
@@ -72,9 +86,20 @@ static inline void servo_init(void)
TCCR1A |= (1 << WGM11) | (1 << COM1A1);
TCCR1B |= (1 << WGM13) | (1 << CS11);
ICR1 = PWM_TOP;
+}
- DDRD &= ~((1 << LOCK_BTN) | (1 << UNLOCK_BTN));
- PORTD |= (1 << LOCK_BTN) | (1 << UNLOCK_BTN);
+static inline void lock(void)
+{
+ OCR1A = PWM_MID;
+ _delay_ms(100);
+ OCR1A = PWM_TOP;
+}
+
+static inline void unlock(void)
+{
+ OCR1A = PWM_MAX - 50;
+ _delay_ms(100);
+ OCR1A = PWM_TOP;
}
int main(void)
@@ -91,6 +116,7 @@ int main(void)
RX_PCMSK |= (1 << RX_PCINT);
uart_init();
+ btn_init();
servo_init();
radio_init(rxaddr);
radio_print_config();
@@ -99,6 +125,9 @@ int main(void)
radio_listen();
for (;;) {
+ if (!rxdr)
+ _delay_ms(500);
+
if (rxdr) {
rxdr = 0;
n = radio_recv(buf, WDLEN);
@@ -106,24 +135,23 @@ int main(void)
if (!syn) {
xor(KEY, buf, msg, WDLEN);
if (strncmp(msg, SYN, WDLEN) == 0) {
+ syn = 1;
keygen(key, WDLEN + 1);
xor(KEY, key, buf, WDLEN);
radio_sendto(txaddr, buf, WDLEN);
- syn = 1;
}
} else {
syn = 0;
xor(key, buf, msg, WDLEN);
- if (strncmp(msg, LOCK, WDLEN) == 0) {
- // todo: lock
- } else if (strncmp(msg, UNLOCK, WDLEN) == 0) {
- // todo: unlock
- }
+ if (strncmp(msg, LOCK, WDLEN) == 0)
+ lock();
+ else if (strncmp(msg, UNLOCK, WDLEN) == 0)
+ unlock();
keydel(buf, WDLEN);
}
- } else {
- // todo: sleep
}
+
+ // todo: sleep
}
return 0;
}
@@ -132,3 +160,11 @@ ISR(RX_PCINTVEC)
{
rxdr = 1;
}
+
+ISR(BTN_PCINTVEC)
+{
+ if (is_btn_pressed(BTN_PIN, LOCK_BTN))
+ lock();
+ else if (is_btn_pressed(BTN_PIN, UNLOCK_BTN))
+ unlock();
+}
diff --git a/lock/util.c b/lock/util.c
index 32a1fcf..683faa2 100644
--- a/lock/util.c
+++ b/lock/util.c
@@ -1,9 +1,18 @@
#include <avr/io.h>
#include <avr/interrupt.h>
-#include <avr/wdt.h>
+#include <util/delay.h>
#include "util.h"
+int is_btn_pressed(uint8_t pin, uint8_t btn)
+{
+ if (!((pin >> btn) & 0x01)) {
+ _delay_us(2000);
+ return !((pin >> btn) & 0x01);
+ }
+ return 0;
+}
+
void xor(const char *k, const char *s, char *d, uint8_t n)
{
int i;
diff --git a/lock/util.h b/lock/util.h
index 32dbcad..51a990c 100644
--- a/lock/util.h
+++ b/lock/util.h
@@ -10,6 +10,8 @@
#define WDLEN 32
+int is_btn_pressed(uint8_t pin, uint8_t btn);
+
void xor(const char *k, const char *s, char *d, uint8_t n);
#endif /* MY_UTIL_H */