From 7327d5e93e0386914dbe712f8f82e2d015ad7029 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Wed, 6 Nov 2024 13:02:18 +0800 Subject: USe enum for commands. --- door_lock/cmd.c | 44 +++++++++++++++++++++++++++++++++++--------- door_lock/cmd.h | 9 +++++++-- door_lock/servo.c | 9 ++++----- 3 files changed, 46 insertions(+), 16 deletions(-) (limited to 'door_lock') diff --git a/door_lock/cmd.c b/door_lock/cmd.c index f00eb6a..a1edc8f 100644 --- a/door_lock/cmd.c +++ b/door_lock/cmd.c @@ -3,11 +3,13 @@ #include "cmd.h" -#define XORLEN 32 -#define KEY "dM>}jdb,6gsnC$J^K 8(I5vyPemPs%;K" -#define ULOCK_CMD "43iqr5$NB8SpN?Z/52{iVl>o|i!.'dsT" +#define XORLEN 32 -static char ulock_crypt_cmd[XORLEN]; +#define KEY "dM>}jdb,6gsnC$J^K 8(I5vyPemPs%;K" +#define LOCK_CMD "43iqr5$NB8SpN?Z/52{iVl>o|i!.'dsT" +#define UNLOCK_CMD "43iqr5$NB8SpN?Z/52{iVl>o|i!.'dsT" + +static char cmd[XORLEN]; static inline void xor(const char *s, char *d, uint8_t n) { @@ -17,18 +19,42 @@ static inline void xor(const char *s, char *d, uint8_t n) d[i] = s[i] ^ KEY[i]; } -int is_ulock_cmd(const char *s) +int is_valid_cmd(const char *s, enum command c) { + int rc; char buf[XORLEN + 1]; xor(s, buf, XORLEN); buf[XORLEN] = 0; - return strcmp(ULOCK_CMD, buf) == 0; + switch (c) { + case DOOR_LOCK: + rc = strcmp(LOCK_CMD, buf) == 0; + break; + case DOOR_UNLOCK: + rc = strcmp(UNLOCK_CMD, buf) == 0; + break; + default: + rc = 0; + break; + } + + return rc; } -char * get_encrypted_ulock_cmd(void) +char * get_cmd_hash(enum command c) { - xor(ULOCK_CMD, ulock_crypt_cmd, XORLEN); - return ulock_crypt_cmd; + switch (c) { + case DOOR_LOCK: + xor(LOCK_CMD, cmd, XORLEN); + break; + case DOOR_UNLOCK: + xor(UNLOCK_CMD, cmd, XORLEN); + break; + default: + cmd[0] = 0; + break; + } + + return cmd; } diff --git a/door_lock/cmd.h b/door_lock/cmd.h index de9d4b0..c31f197 100644 --- a/door_lock/cmd.h +++ b/door_lock/cmd.h @@ -1,8 +1,13 @@ #ifndef SA_CMD_H #define SA_CMD_H -int is_ulock_cmd(const char *s); +enum command { + DOOR_LOCK, + DOOR_UNLOCK +}; -char * get_encrypted_ulock_cmd(void); +int is_valid_cmd(const char *s, enum command c); + +char * get_cmd_hash(enum command c); #endif /* SA_CMD_H */ diff --git a/door_lock/servo.c b/door_lock/servo.c index 5ba867f..3e78353 100644 --- a/door_lock/servo.c +++ b/door_lock/servo.c @@ -40,19 +40,18 @@ static inline uint8_t is_btn_pressed(uint8_t btn) int main(void) { - char *ulock_cmd; + char *cmd; servo_init(); pcint2_init(); - serial_init(); sei(); for(;;) { - ulock_cmd = get_encrypted_ulock_cmd(); - - if (is_ulock_cmd(ulock_cmd)) + cmd = get_cmd_hash(DOOR_UNLOCK); + + if (is_valid_cmd(cmd, DOOR_UNLOCK)) serial_write_line("unlock door"); else serial_write_line("do not unlock door"); -- cgit v1.2.3