diff options
| author | Sadeep Madurange <sadeep@asciimx.com> | 2025-09-07 17:04:34 +0800 |
|---|---|---|
| committer | Sadeep Madurange <sadeep@asciimx.com> | 2025-09-07 17:04:34 +0800 |
| commit | 276856de6c63bbbf3e56cc08dcca00ba10080b7e (patch) | |
| tree | c68484bc312cc3a8abcea4fa9f4948a6f1f65cc6 /lock/fpm.c | |
| parent | f4b0b734a595919cf451ab9448b06274c8e609a4 (diff) | |
| download | smart-home-master.tar.gz | |
Diffstat (limited to 'lock/fpm.c')
| -rw-r--r-- | lock/fpm.c | 324 |
1 files changed, 0 insertions, 324 deletions
diff --git a/lock/fpm.c b/lock/fpm.c deleted file mode 100644 index 73a175a..0000000 --- a/lock/fpm.c +++ /dev/null @@ -1,324 +0,0 @@ -#include <avr/io.h> -#include <util/delay.h> -#include <util/setbaud.h> - -#include "fpm.h" - -#define MAXPDLEN 64 -#define RST_DELAY_MS 500 - -#define HEADER_HO 0xEF -#define HEADER_LO 0x01 -#define ADDR 0xFFFFFFFF - -#define OK 0x00 -#define PACKID 0x01 - -static inline uint8_t read(void) -{ - while (!(UCSR0A & (1 << RXC0))) - ; - return UDR0; -} - -static inline void write(uint8_t c) -{ - while (!(UCSR0A & (1 << UDRE0))) - ; - UDR0 = c; -} - -static inline void send(uint8_t *data, uint8_t n) -{ - int i; - uint16_t pktlen, sum; - - write(HEADER_HO); - write(HEADER_LO); - - write((uint8_t)(ADDR >> 24)); - write((uint8_t)(ADDR >> 16)); - write((uint8_t)(ADDR >> 8)); - write((uint8_t)(ADDR & 0xFF)); - - write(PACKID); - - pktlen = n + 2; - write((uint8_t)(pktlen >> 8)); - write((uint8_t)pktlen); - - sum = (pktlen >> 8) + (pktlen & 0xFF) + PACKID; - for (i = 0; i < n; i++) { - write(data[i]); - sum += data[i]; - } - - write((uint8_t)(sum >> 8)); - write((uint8_t)sum); -} - -static inline uint16_t recv(uint8_t buf[MAXPDLEN]) -{ - int i; - uint16_t len; - uint8_t byte; - - i = 0, len = 0; - - for (;;) { - byte = read(); - switch (i) { - case 0: - if (byte != HEADER_HO) - continue; - break; - case 1: - if (byte != HEADER_LO) - return 0; - case 2: - case 3: - case 4: - case 5: - // toss address - break; - case 6: - // toss packet id - break; - case 7: - len = (uint16_t)byte << 8; - break; - case 8: - len |= byte; - break; - default: - if ((i - 9) < MAXPDLEN) { - buf[i - 9] = byte; - if ((i - 8) == len) - return len; - } else - return 0; - break; - } - i++; - } - return 0; -} - -static inline void led_ctrl(uint8_t mode, COLOR color) -{ - uint8_t buf[MAXPDLEN]; - - buf[0] = 0x35; - buf[1] = mode; - buf[2] = 0x60; - buf[3] = color; - buf[4] = 0x00; - - send(buf, 5); - recv(buf); -} - -static inline uint8_t check_pwd(void) -{ - uint8_t buf[MAXPDLEN]; - - buf[0] = 0x13; - buf[1] = (uint8_t)((uint32_t)FPM_PWD >> 24); - buf[2] = (uint8_t)((uint32_t)FPM_PWD >> 16); - buf[3] = (uint8_t)((uint32_t)FPM_PWD >> 8); - buf[4] = (uint8_t)((uint32_t)FPM_PWD & 0xFF); - - send(buf, 5); - recv(buf); - return buf[0] == OK; -} - -static inline uint8_t scan(void) -{ - uint16_t retries; - uint8_t buf[MAXPDLEN]; - - retries = 0; - led_ctrl(0x01, PURPLE); - - do { - buf[0] = 0x28; - send(buf, 1); - recv(buf); - if (buf[0] != OK) { - retries++; - _delay_ms(100); - } - } while(buf[0] != OK && retries < 100); - - led_ctrl(0x06, PURPLE); - return buf[0] == OK; -} - -static inline uint8_t img2tz(uint8_t bufid) -{ - uint8_t buf[MAXPDLEN]; - - buf[0] = 0x02; - buf[1] = bufid; - send(buf, 2); - recv(buf); - return buf[0] == OK; -} - -void fpm_led_on(COLOR color) -{ - led_ctrl(0x03, color); -} - -void fpm_led_off(void) -{ - led_ctrl(0x04, 0x00); -} - -uint8_t fpm_init(void) -{ - UBRR0H = UBRRH_VALUE; - UBRR0L = UBRRL_VALUE; -#if USE_2X - UCSR0A |= (1 << U2X0); -#else - UCSR0A &= ~(1 << U2X0); -#endif - UCSR0B = (1 << TXEN0) | (1 << RXEN0); - UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); - - _delay_ms(RST_DELAY_MS); - return check_pwd(); -} - -uint8_t fpm_get_cfg(struct fpm_cfg *cfg) -{ - uint16_t n; - uint8_t buf[MAXPDLEN]; - - buf[0] = 0x0F; - send(buf, 1); - n = recv(buf); - - if (buf[0] == OK && n >= 17) { - cfg->status = ((uint16_t)buf[1] << 8) | buf[2]; - cfg->sysid = ((uint16_t)buf[3] << 8) | buf[4]; - cfg->cap = ((uint16_t)buf[5] << 8) | buf[6]; - cfg->sec_level = ((uint16_t)buf[7] << 8) | buf[8]; - cfg->addr[0] = buf[9]; - cfg->addr[1] = buf[10]; - cfg->addr[2] = buf[11]; - cfg->addr[3] = buf[12]; - cfg->pkt_size = ((uint16_t)buf[13] << 8) | buf[14]; - cfg->pkt_size = 1 << (cfg->pkt_size + 5); - cfg->baud = (((uint16_t)buf[15] << 8) | buf[16]); - - return 1; - } - return 0; -} - -uint8_t fpm_set_pwd(uint32_t pwd) -{ - uint8_t buf[MAXPDLEN]; - - buf[0] = 0x12; - buf[1] = (uint8_t)(pwd >> 24); - buf[2] = (uint8_t)(pwd >> 16); - buf[3] = (uint8_t)(pwd >> 8); - buf[4] = (uint8_t)(pwd & 0xFF); - - send(buf, 5); - recv(buf); - return buf[0] == OK; -} - -uint16_t fpm_get_count(void) -{ - uint16_t n, count; - uint8_t buf[MAXPDLEN]; - - buf[0] = 0x1D; - send(buf, 1); - n = recv(buf); - - count = 0; - if (buf[0] == OK && n >= 2) { - count = buf[1]; - count <<= 8; - count |= buf[2]; - } - return count; -} - -uint8_t fpm_enroll(void) -{ - struct fpm_cfg cfg; - uint16_t n; - uint8_t buf[MAXPDLEN]; - - fpm_get_cfg(&cfg); - n = fpm_get_count() + 1; - if (n >= cfg.cap) - return 0; - - if (!scan()) - return 0; - - if (!img2tz(1)) - return 0; - - _delay_ms(2000); - - if (!scan()) - return 0; - - if (!img2tz(2)) - return 0; - - buf[0] = 0x05; - send(buf, 1); - recv(buf); - if (buf[0] != OK) - return 0; - - buf[0] = 0x06; - buf[1] = 1; - buf[2] = (uint8_t)(n >> 8); - buf[3] = (uint8_t)(n & 0xFF); - send(buf, 4); - recv(buf); - - return buf[0] == OK; -} - -uint16_t fpm_match(void) -{ - struct fpm_cfg cfg; - uint8_t buf[MAXPDLEN]; - - if (!fpm_get_cfg(&cfg)) - return 0; - - if (!scan()) - return 0; - - if (!img2tz(1)) - return 0; - - buf[0] = 0x04; - buf[1] = 1; - buf[2] = 0x00; - buf[3] = 0x00; - buf[4] = (uint8_t)(cfg.cap >> 8); - buf[5] = (uint8_t)(cfg.cap & 0xFF); - - send(buf, 6); - recv(buf); - - if (buf[0] != OK) - return 0; - - return ((uint16_t)buf[1] << 8) | buf[2]; -} |
