From 50381c06244e944390de382f6bdd85cc8b9a3332 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Wed, 6 Nov 2024 11:51:41 +0800 Subject: XOR cypher. --- door_lock/Makefile | 2 +- door_lock/main.c | 57 ------------------------------------ door_lock/servo.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 58 deletions(-) delete mode 100644 door_lock/main.c create mode 100644 door_lock/servo.c diff --git a/door_lock/Makefile b/door_lock/Makefile index c188507..92b9945 100644 --- a/door_lock/Makefile +++ b/door_lock/Makefile @@ -2,7 +2,7 @@ CC = avr-gcc MCU = atmega328p TARGET = app -SRC = main.c serial.c +SRC = servo.c serial.c OBJ = $(SRC:.c=.o) CFLAGS = -std=gnu99 diff --git a/door_lock/main.c b/door_lock/main.c deleted file mode 100644 index d272a7f..0000000 --- a/door_lock/main.c +++ /dev/null @@ -1,57 +0,0 @@ -#include - -#include -#include - -#define PWM_MIN 1200 -#define PWM_MID 3000 -#define PWM_MAX 5000 - -#define SERVO_PIN PB1 -#define LOCK_BTN PD6 -#define UNLOCK_BTN PD7 - -static inline void servo_init(void) -{ - DDRB |= 1 << SERVO_PIN; - TCCR1A |= (1 << WGM11) | (1 << COM1A1); - TCCR1B |= (1 << WGM12) | (1 << WGM13) | (1 << CS11); - - ICR1 = 40000; - - DDRD &= ~((1 << LOCK_BTN) | (1 << UNLOCK_BTN)); - PORTD |= (1 << LOCK_BTN) | (1 << UNLOCK_BTN); -} - -static inline void pcint2_init(void) -{ - PCICR |= (1 << PCIE2); - PCMSK2 |= ((1 << PCINT22) | (1 << PCINT23)); -} - -static inline uint8_t is_btn_pressed(uint8_t btn) -{ - return !((PIND >> btn) & 0x01); -} - -int main(void) -{ - servo_init(); - pcint2_init(); - - sei(); - - for(;;) - ; - - return 0; -} - -ISR(PCINT2_vect) -{ - if (is_btn_pressed(LOCK_BTN)) - OCR1A = PWM_MID; - - if (is_btn_pressed(UNLOCK_BTN)) - OCR1A = PWM_MIN; -} diff --git a/door_lock/servo.c b/door_lock/servo.c new file mode 100644 index 0000000..45640df --- /dev/null +++ b/door_lock/servo.c @@ -0,0 +1,86 @@ +#include + +#include +#include +#include + +#include "serial.h" + +#define PWM_MIN 1200 +#define PWM_MID 3000 +#define PWM_MAX 5000 + +#define SERVO_PIN PB1 +#define LOCK_BTN PD6 +#define ULOCK_BTN PD7 + +#define XORLEN 32 +#define KEY "dM>}jdb,6gsnC$J^K 8(I5vyPemPs%;K" +#define ULOCK_FLAG "43iqr5$NB8SpN?Z/52{iVl>o|i!.'dsT" + +static inline void servo_init(void) +{ + DDRB |= 1 << SERVO_PIN; + TCCR1A |= (1 << WGM11) | (1 << COM1A1); + TCCR1B |= (1 << WGM12) | (1 << WGM13) | (1 << CS11); + + ICR1 = 40000; + + DDRD &= ~((1 << LOCK_BTN) | (1 << ULOCK_BTN)); + PORTD |= (1 << LOCK_BTN) | (1 << ULOCK_BTN); +} + +static inline void pcint2_init(void) +{ + PCICR |= (1 << PCIE2); + PCMSK2 |= ((1 << PCINT22) | (1 << PCINT23)); +} + +static inline uint8_t is_btn_pressed(uint8_t btn) +{ + return !((PIND >> btn) & 0x01); +} + +static inline void xor(const char *s, char *d, uint8_t n) +{ + int i; + + for (i = 0; i < n && s[i]; i++) + d[i] = s[i] ^ KEY[i]; +} + +int main(void) +{ + char s1[XORLEN]; + char s2[XORLEN + 1]; + + servo_init(); + pcint2_init(); + + serial_init(); + + sei(); + + for(;;) { + // encrypt + xor(ULOCK_FLAG, s1, XORLEN); + + // decrypt + xor(s1, s2, XORLEN); + s2[XORLEN] = 0; + serial_write_line(s2); + + _delay_ms(1000); + } + + return 0; +} + +ISR(PCINT2_vect) +{ + if (is_btn_pressed(LOCK_BTN)) + OCR1A = PWM_MID; + + if (is_btn_pressed(ULOCK_BTN)) + OCR1A = PWM_MIN; +} -- cgit v1.2.3