diff options
Diffstat (limited to 'lock')
| -rw-r--r-- | lock/Bend.Makefile (renamed from lock/Scan.Makefile) | 4 | ||||
| -rw-r--r-- | lock/Fend.Makefile (renamed from lock/Servo.Makefile) | 4 | ||||
| -rw-r--r-- | lock/bend.c | 134 | ||||
| -rw-r--r-- | lock/fend.c (renamed from lock/scan.c) | 8 | ||||
| -rw-r--r-- | lock/servo.c | 80 | ||||
| -rw-r--r-- | lock/util.c | 34 | ||||
| -rw-r--r-- | lock/util.h | 7 |
7 files changed, 141 insertions, 130 deletions
diff --git a/lock/Scan.Makefile b/lock/Bend.Makefile index eedf079..a88257e 100644 --- a/lock/Scan.Makefile +++ b/lock/Bend.Makefile @@ -1,8 +1,8 @@ CC = avr-gcc MCU = atmega328p -TARGET = scan +TARGET = bend -SRC = scan.c uart.c nrfm.c util.c +SRC = bend.c uart.c nrfm.c util.c OBJ = $(SRC:.c=.o) CFLAGS = -std=gnu99 diff --git a/lock/Servo.Makefile b/lock/Fend.Makefile index d4f8e0c..a525854 100644 --- a/lock/Servo.Makefile +++ b/lock/Fend.Makefile @@ -1,8 +1,8 @@ CC = avr-gcc MCU = atmega328p -TARGET = servo +TARGET = fend -SRC = servo.c uart.c nrfm.c util.c +SRC = fend.c uart.c nrfm.c util.c OBJ = $(SRC:.c=.o) CFLAGS = -std=gnu99 diff --git a/lock/bend.c b/lock/bend.c new file mode 100644 index 0000000..0b1061d --- /dev/null +++ b/lock/bend.c @@ -0,0 +1,134 @@ +/* Lock back, connected to the servo */ + +#include <stdint.h> +#include <string.h> + +#include <avr/interrupt.h> +#include <avr/wdt.h> +#include <util/delay.h> + +#include "nrfm.h" +#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 + +static char tab[] = { + '0', '8', '3', '6', 'a', 'Z', '$', '4', 'v', 'R', '@', + 'E', '1', 'o', '#', ')', '2', '5', 'q', ';', '.', 'I', + 'c', '7', '9', '*', 'L', 'V', '&', 'k', 'K', '!', 'm', + 'N', '(', 'O', 'Q', 'A', '>', 'T', 't', '?', 'S', 'h', + 'w', '/', 'n', 'W', 'l', 'M', 'e', 'H', 'j', 'g', '[', + 'P', 'f', ':', 'B', ']', 'Y', '^', 'F', '%', 'C', 'x' +}; + +static uint8_t syn = 0; +static volatile uint8_t rxdr = 0; +static uint16_t tablen = sizeof(tab) / sizeof(tab[0]); + +static inline void keygen(char *buf, uint8_t n) +{ + int i, imax; + uint8_t sreg; + uint16_t seed; + + sreg = SREG; + cli(); + seed = TCNT1; + SREG = sreg; + + for (i = 0, imax = n - 1; i < imax; i++, seed++) + buf[i] = tab[(seed % tablen)]; + buf[imax] = '\0'; +} + +static inline void keydel(char *buf, uint8_t n) +{ + int i; + + for (i = 0; i < n; i++) + buf[i] = 0; +} + +static inline void servo_init(void) +{ + DDRB |= (1 << SERVO_PIN); + + 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); +} + +int main(void) +{ + uint8_t n; + uint8_t rxaddr[ADDRLEN] = { 194, 178, 83 }; + uint8_t txaddr[ADDRLEN] = { 194, 178, 82 }; + + char buf[WDLEN + 1], key[WDLEN + 1], msg[WDLEN + 1]; + + RX_DDR &= ~(1 << RX_PIN); + RX_PORT |= (1 << RX_PIN); + PCICR |= (1 << RX_PCIE); + RX_PCMSK |= (1 << RX_PCINT); + + uart_init(); + servo_init(); + radio_init(rxaddr); + radio_print_config(); + + sei(); + radio_listen(); + + for (;;) { + if (rxdr) { + rxdr = 0; + n = radio_recv(buf, WDLEN); + buf[n] = '\0'; + if (!syn) { + xor(KEY, buf, msg, WDLEN); + if (strncmp(msg, SYN, WDLEN) == 0) { + 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 + } + keydel(buf, WDLEN); + } + } else { + // todo: sleep + } + } + return 0; +} + +ISR(RX_PCINTVEC) +{ + rxdr = 1; +} diff --git a/lock/scan.c b/lock/fend.c index 6784e9a..7d86ab1 100644 --- a/lock/scan.c +++ b/lock/fend.c @@ -15,15 +15,10 @@ int main(void) { uint8_t n; uint8_t rxaddr[ADDRLEN] = { 194, 178, 82 }; + uint8_t txaddr[ADDRLEN] = { 194, 178, 83 }; char buf[WDLEN + 1], msg[WDLEN + 1]; - /* timer for keygen */ - TCCR1A |= (1 << WGM11) | (1 << COM1A1); - TCCR1B |= (1 << WGM13) | (1 << CS11); - ICR1 = 20000; - - wdt_init(); uart_init(); radio_init(rxaddr); radio_print_config(); @@ -31,7 +26,6 @@ int main(void) sei(); for (;;) { - wdt_reset(); _delay_ms(2000); } diff --git a/lock/servo.c b/lock/servo.c deleted file mode 100644 index 9b735ea..0000000 --- a/lock/servo.c +++ /dev/null @@ -1,80 +0,0 @@ -/* Lock back, connected to the servo */ - -#include <stdint.h> -#include <string.h> - -#include <avr/interrupt.h> -#include <avr/wdt.h> -#include <util/delay.h> - -#include "nrfm.h" -#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 - -static volatile uint8_t rxdr = 0; - -static inline void servo_init(void) -{ - DDRB |= (1 << SERVO_PIN); - - 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); -} - -int main(void) -{ - uint8_t n; - uint8_t rxaddr[ADDRLEN] = { 194, 178, 83 }; - - char buf[WDLEN + 1], key[WDLEN + 1], msg[WDLEN + 1]; - - RX_DDR &= ~(1 << RX_PIN); - RX_PORT |= (1 << RX_PIN); - PCICR |= (1 << RX_PCIE); - RX_PCMSK |= (1 << RX_PCINT); - - wdt_init(); - uart_init(); - servo_init(); - radio_init(rxaddr); - radio_print_config(); - - sei(); - radio_listen(); - - for (;;) { - wdt_reset(); - if (rxdr) { - } else { - _delay_ms(2000); - } - } - return 0; -} - -ISR(RX_PCINTVEC) -{ - rxdr = 1; -} diff --git a/lock/util.c b/lock/util.c index 6810c1e..32a1fcf 100644 --- a/lock/util.c +++ b/lock/util.c @@ -4,40 +4,6 @@ #include "util.h" -static char tab[] = { - '0', '8', '3', '6', 'a', 'Z', '$', '4', 'v', 'R', '@', - 'E', '1', 'o', '#', ')', '2', '5', 'q', ';', '.', 'I', - 'c', '7', '9', '*', 'L', 'V', '&', 'k', 'K', '!', 'm', - 'N', '(', 'O', 'Q', 'A', '>', 'T', 't', '?', 'S', 'h', - 'w', '/', 'n', 'W', 'l', 'M', 'e', 'H', 'j', 'g', '[', - 'P', 'f', ':', 'B', ']', 'Y', '^', 'F', '%', 'C', 'x' -}; - -static uint16_t tablen = sizeof(tab) / sizeof(tab[0]); - -void wdt_init(void) -{ - wdt_reset(); - WDTCSR |= (1 << WDCE) | (1 << WDE); - WDTCSR = (1 << WDE) | (1 << WDP3) | (1 << WDP0); -} - -void keygen(char *buf, uint8_t n) -{ - int i, imax; - uint8_t sreg; - uint16_t seed; - - sreg = SREG; - cli(); - seed = TCNT1; - SREG = sreg; - - for (i = 0, imax = n - 1; i < imax; i++, seed++) - buf[i] = tab[(seed % tablen)]; - buf[imax] = '\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 cb4e86f..32dbcad 100644 --- a/lock/util.h +++ b/lock/util.h @@ -4,15 +4,12 @@ #include <stdint.h> #define KEY "dM>}jdb,6gsnC$J^K 8(I5vyPemPs%;K" +#define SYN "dM>}jdb,6gsnC$J^K 8(I5vyPemPs%;O" #define LOCK "R,I7l^E4j]KyLR9'*Q{Jd'zu.~!84}Ij" -#define UNLOCK "R,I7l^E4j]KyLR9'*Q{Jd'zu.~!84}Ik" +#define UNLOCK "R,I7l^E4j]KyLR9'*Q{Jd'zu.~!84}IL" #define WDLEN 32 -void wdt_init(void); - -void keygen(char *buf, uint8_t n); - void xor(const char *k, const char *s, char *d, uint8_t n); #endif /* MY_UTIL_H */ |
