From 737e4e248ce408c43ac02917a5fa9aced89b7af6 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Wed, 7 May 2025 14:46:05 +0800 Subject: Delete all prints. --- fpm.c | 261 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fpm.h | 30 +++++++ fpm10a.c | 269 --------------------------------------------------------------- fpm10a.h | 30 ------- main.c | 51 +++++++++--- r503.c | 22 +++++- r503.h | 6 +- 7 files changed, 351 insertions(+), 318 deletions(-) create mode 100644 fpm.c create mode 100644 fpm.h delete mode 100644 fpm10a.c delete mode 100644 fpm10a.h diff --git a/fpm.c b/fpm.c new file mode 100644 index 0000000..657a1a8 --- /dev/null +++ b/fpm.c @@ -0,0 +1,261 @@ +#include +#include +#include + +#include "fpm.h" + +#define MAXPDLEN 64 +#define RST_DELAY_MS 500 + +#define OK 0x00 + +static uint8_t start_code[] = { 0xEF, 0x01 }; +static uint8_t addr[] = { 0xFF, 0xFF, 0xFF, 0xFF }; + +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 write_bulk(uint8_t *data, uint16_t n) +{ + int i; + + for (i = 0; i < n; i++) + write(data[i]); +} + +static inline void send(uint8_t pktid, uint8_t *data, uint8_t n) +{ + int i; + uint16_t pktlen, sum; + + write_bulk(start_code, 2); + write_bulk(addr, 4); + write(pktid); + + pktlen = n + 3; + write((uint8_t)(pktlen >> 8)); + write((uint8_t)pktlen); + + sum = (pktlen >> 8) + (pktlen & 0xFF) + pktid; + for (i = 0; i < n; i++) { + write(data[i]); + sum += data[i]; + } + + write((uint8_t)(sum >> 8)); + write((uint8_t)sum); +} + +static inline void recv(uint8_t buf[MAXPDLEN], uint16_t *n) +{ + int i; + uint16_t len; + uint8_t byte; + + i = 0, len = 0; + + for (;;) { + byte = read(); + switch (i) { + case 0: + if (byte != start_code[0]) + continue; + break; + case 1: + if (byte != start_code[1]) + goto bad_pkt; + break; + case 2: + case 3: + case 4: + case 5: + // toss the address + break; + case 6: + // toss the 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) { + *n = len; + return; + } + } else { + goto bad_pkt; + } + break; + } + i++; + } + +bad_pkt: + *n = 0; + return; +} + +static inline uint8_t check_pwd(void) +{ + unsigned int n; + 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(0x01, buf, 5); + recv(buf, &n); + return buf[0] == OK; +} + +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); + + uint8_t buf[5]; + buf[0] = 0x35; + buf[1] = 0x03; + buf[2] = 0x00; + buf[3] = 0x01; + buf[4] = 0x00; + send(0x01, buf, 5); + + return check_pwd(); +} + +uint8_t fpm_getcfg(struct fpm_cfg *cfg) +{ + uint16_t n; + uint8_t buf[MAXPDLEN]; + + buf[0] = 0x0F; + send(0x01, buf, 1); + recv(buf, &n); + + 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_setpwd(uint32_t pwd) +{ + uint16_t n; + 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(0x01, buf, 5); + recv(buf, &n); + return buf[0] == OK; +} + +uint16_t fpm_getcount(void) +{ + uint16_t n, count; + uint8_t buf[MAXPDLEN]; + + buf[0] = 0x1D; + send(0x01, buf, 1); + recv(buf, &n); + + count = 0; + if (buf[0] == OK && n >= 2) { + count = buf[1]; + count <<= 8; + count |= buf[2]; + } + return count; +} + +uint8_t fpm_enroll(void) +{ + uint16_t n, retries; + uint8_t buf[MAXPDLEN]; + + retries = 0; + + do { + _delay_ms(100); + buf[0] = 0x10; + send(0x01, buf, 1); + recv(buf, &n); + retries++; + } while (buf[0] != OK && retries < 50); + + return buf[0] == OK; +} + +uint8_t fpm_match(void) +{ + uint16_t n, retries; + uint8_t buf[MAXPDLEN]; + + retries = 0; + + do { + _delay_ms(100); + buf[0] = 0x11; + send(0x01, buf, 1); + recv(buf, &n); + retries++; + } while (buf[0] != OK && retries < 10); + + return buf[0] == OK; +} + +uint8_t fpm_delete_all(void) +{ + uint16_t n; + uint8_t buf[MAXPDLEN]; + + buf[0] = 0x0D; + send(0x01, buf, 1); + recv(buf, &n); + return buf[0] == OK; +} diff --git a/fpm.h b/fpm.h new file mode 100644 index 0000000..f165958 --- /dev/null +++ b/fpm.h @@ -0,0 +1,30 @@ +#ifndef FPM_H +#define FPM_H + +#include + +struct fpm_cfg { + uint16_t status; + uint16_t sysid; + uint16_t cap; + uint16_t sec_level; + uint8_t addr[4]; + uint16_t pkt_size; + uint16_t baud; +}; + +uint8_t fpm_init(void); + +uint8_t fpm_getcfg(struct fpm_cfg *cfg); + +uint8_t fpm_setpwd(uint32_t pwd); + +uint16_t fpm_getcount(void); + +uint8_t fpm_enroll(void); + +uint8_t fpm_match(void); + +uint8_t fpm_delete_all(void); + +#endif /* FPM_H */ diff --git a/fpm10a.c b/fpm10a.c deleted file mode 100644 index 44f8b4c..0000000 --- a/fpm10a.c +++ /dev/null @@ -1,269 +0,0 @@ -#include -#include -#include - -#include "fpm.h" - -#define MAXPDLEN 64 -#define RST_DELAY_MS 500 - -#define OK 0x00 - -static uint8_t start_code[] = { 0xEF, 0x01 }; -static uint8_t addr[] = { 0xFF, 0xFF, 0xFF, 0xFF }; - -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 write_bulk(uint8_t *data, uint16_t n) -{ - int i; - - for (i = 0; i < n; i++) - write(data[i]); -} - -static inline void send(uint8_t pktid, uint8_t *data, uint8_t n) -{ - int i; - uint16_t pktlen, sum; - - write_bulk(start_code, 2); - write_bulk(addr, 4); - write(pktid); - - pktlen = n + 3; - write((uint8_t)(pktlen >> 8)); - write((uint8_t)pktlen); - - sum = (pktlen >> 8) + (pktlen & 0xFF) + pktid; - for (i = 0; i < n; i++) { - write(data[i]); - sum += data[i]; - } - - write((uint8_t)(sum >> 8)); - write((uint8_t)sum); -} - -static inline void recv(uint8_t buf[MAXPDLEN], uint16_t *n) -{ - int i; - uint16_t len; - uint8_t byte; - - i = 0, len = 0; - - for (;;) { - byte = read(); - switch (i) { - case 0: - if (byte != start_code[0]) - continue; - break; - case 1: - if (byte != start_code[1]) - goto bad_pkt; - break; - case 2: - case 3: - case 4: - case 5: - // toss the address - break; - case 6: - // toss the 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) { - *n = len; - return; - } - } else { - goto bad_pkt; - } - break; - } - i++; - } - -bad_pkt: - *n = 0; - return; -} - -static inline uint8_t check_pwd(void) -{ - unsigned int n; - 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(0x01, buf, 5); - recv(buf, &n); - return buf[0] == OK; -} - -static inline void uint8_t aura_on(void) -{ - unsigned int n; - uint8_t buf[MAXPDLEN]; - - buf[0] = 0x35; - buf[1] = 0x01; - buf[2] = 0x00; - buf[3] = 0x01; - buf[4] = 0x00; - - send(0x01, buf, 5); - recv(buf, &n); - return buf[0] == OK; -} - -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); - aura_on(); - return check_pwd(); -} - -uint8_t fpm_getcfg(struct fpm_cfg *cfg) -{ - uint16_t n; - uint8_t buf[MAXPDLEN]; - - buf[0] = 0x0F; - send(0x01, buf, 1); - recv(buf, &n); - - 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_setpwd(uint32_t pwd) -{ - uint16_t n; - 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(0x01, buf, 5); - recv(buf, &n); - return buf[0] == OK; -} - -uint16_t fpm_getcount(void) -{ - uint16_t n, count; - uint8_t buf[MAXPDLEN]; - - buf[0] = 0x1D; - send(0x01, buf, 1); - recv(buf, &n); - - count = 0; - if (buf[0] == OK && n >= 2) { - count = buf[1]; - count <<= 8; - count |= buf[2]; - } - return count; -} - -uint8_t fpm_enroll(void) -{ - uint16_t n, retries; - uint8_t buf[MAXPDLEN]; - - retries = 0; - - do { - _delay_ms(100); - buf[0] = 0x10; - send(0x01, buf, 1); - recv(buf, &n); - retries++; - } while (buf[0] != OK && retries < 50); - - return buf[0] == OK; -} - -uint8_t fpm_match(void) -{ - uint16_t n, retries; - uint8_t buf[MAXPDLEN]; - - retries = 0; - - do { - _delay_ms(100); - buf[0] = 0x11; - send(0x01, buf, 1); - recv(buf, &n); - retries++; - } while (buf[0] != OK && retries < 10); - - return buf[0] == OK; -} - -uint8_t fpm_delete_all(void) -{ - uint16_t n; - uint8_t buf[MAXPDLEN]; - - buf[0] = 0x0D; - send(0x01, buf, 1); - recv(buf, &n); - return buf[0] == OK; -} diff --git a/fpm10a.h b/fpm10a.h deleted file mode 100644 index f165958..0000000 --- a/fpm10a.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef FPM_H -#define FPM_H - -#include - -struct fpm_cfg { - uint16_t status; - uint16_t sysid; - uint16_t cap; - uint16_t sec_level; - uint8_t addr[4]; - uint16_t pkt_size; - uint16_t baud; -}; - -uint8_t fpm_init(void); - -uint8_t fpm_getcfg(struct fpm_cfg *cfg); - -uint8_t fpm_setpwd(uint32_t pwd); - -uint16_t fpm_getcount(void); - -uint8_t fpm_enroll(void); - -uint8_t fpm_match(void); - -uint8_t fpm_delete_all(void); - -#endif /* FPM_H */ diff --git a/main.c b/main.c index 6784d44..5b616b3 100644 --- a/main.c +++ b/main.c @@ -1,26 +1,51 @@ +/* + * example_usage.c + * + */ + +#define bit_clr(a,b) ((a) &=~(1<<(b))) +#define bit_set(a,b) ((a) |= (1<<(b))) +#define bit_tst(a,b) ((a) & (1<<(b))) +#define bit_change(a,b) ((a) ^= (1<<(b))) + +#include + +#include +#include #include +#define Soft_UART_TX_PORT PORTD +#define Soft_UART_TX_DDR DDRD +#define Soft_UART_TX_PIN 3 +#define Soft_UART_Baud 9600 +#include "Soft_UART_Timer1.h" + #include "r503.h" +static inline void uart_write(const char *s) +{ + for (; *s; s++) { + Soft_UART_send_byte(*s); + } + Soft_UART_send_byte('\r'); + Soft_UART_send_byte('\n'); +} + int main(void) { + cli(); + Soft_UART_init(); + bit_set(DDRB,5); + sei(); + fpm_init(); + if (fpm_clear_db()) + fpm_led_on(PURPLE); - for (;;) + while (1) { - fpm_led_on(RED); - _delay_ms(500); - fpm_led_off(); - _delay_ms(500); - fpm_led_on(BLUE); - _delay_ms(500); - fpm_led_off(); - _delay_ms(500); - fpm_led_on(PURPLE); - _delay_ms(500); - fpm_led_off(); - _delay_ms(500); } return 0; } + diff --git a/r503.c b/r503.c index cb37f32..e970c59 100644 --- a/r503.c +++ b/r503.c @@ -126,9 +126,10 @@ static inline uint8_t check_pwd(void) return buf[0] == OK; } -void fpm_led_on(FPM_LED_COLOR color) +void fpm_led_on(COLOR color) { - uint8_t buf[5]; + uint16_t n; + uint8_t buf[MAXPDLEN]; buf[0] = 0x35; buf[1] = 0x03; @@ -137,11 +138,13 @@ void fpm_led_on(FPM_LED_COLOR color) buf[4] = 0x00; send(0x01, buf, 5); + recv(buf, &n); } void fpm_led_off(void) { - uint8_t buf[5]; + uint16_t n; + uint8_t buf[MAXPDLEN]; buf[0] = 0x35; buf[1] = 0x04; @@ -150,6 +153,7 @@ void fpm_led_off(void) buf[4] = 0x00; send(0x01, buf, 5); + recv(buf, &n); } uint8_t fpm_init(void) @@ -165,6 +169,16 @@ uint8_t fpm_init(void) UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); _delay_ms(RST_DELAY_MS); - return 1; + return check_pwd(); } +uint8_t fpm_clear_db(void) +{ + uint16_t n; + uint8_t buf[MAXPDLEN]; + + buf[0] = 0x0D; + send(0x01, buf, 1); + recv(buf, &n); + return buf[0] == OK; +} diff --git a/r503.h b/r503.h index 66ab5eb..f941cb9 100644 --- a/r503.h +++ b/r503.h @@ -7,12 +7,14 @@ typedef enum { RED = 0x01, BLUE = 0x02, PURPLE = 0x03 -} FPM_LED_COLOR; +} COLOR; uint8_t fpm_init(void); -void fpm_led_on(FPM_LED_COLOR color); +void fpm_led_on(COLOR color); void fpm_led_off(void); +uint8_t fpm_clear_db(void); + #endif /* FPM_R50_H */ -- cgit v1.2.3