parser 분리

- 파서 인프라/커맨드 핸들러로 분리
- 커맨드 핸들러는 기기 제어/기기 정보/센서/Piezo로 분리
This commit is contained in:
2026-04-16 01:28:11 +09:00
parent c11ce4ec3e
commit c98d9ae14e
18 changed files with 1469 additions and 1410 deletions

View File

@@ -1,24 +1,75 @@
/* parser.h */
/*==============================================================================
* parser.h - BLE command parser public API
*
* Parser infrastructure (parsing/CRC/dispatch) and command handlers are
* decoupled:
* - Parser: parser.c (defines the functions here)
* - Handlers: handlers/cmd_device.c / cmd_info.c / ...
* - Table: cmd_table.c (injected via cmd_table_init)
*
* Boot sequence: main.c calls cmd_table_init() -> dr_parser_init() to inject
* the command table pointer into the parser.
*============================================================================*/
#ifndef PARSER_H
#define PARSER_H
#include <stdint.h>
#include <stdbool.h>
/* Platform-dependent function pointer set */
/* Maximum payload length (excludes TAG) */
#define DR_MAX_DATA 128
/*------------------------------------------------------------------------------
* Platform interface
*----------------------------------------------------------------------------*/
typedef struct {
void (*log)(const char *fmt, ...);
void (*tx_bin)(const uint8_t *buf, uint16_t len);
bool crc_check;
void (*tx_bin)(const uint8_t *buf, uint16_t len); /* len: word (uint16) count */
bool crc_check;
} dr_platform_if_t;
/* Global interface & log flag */
extern dr_platform_if_t g_plat;
extern bool g_log_enable;
extern bool g_log_enable;
/* Main parser entry point */
int dr_cmd_parser(const uint8_t *buf, uint8_t len);
/*------------------------------------------------------------------------------
* Parsed command - input passed to handlers
*----------------------------------------------------------------------------*/
typedef struct {
char tag[5]; /* Command TAG (e.g. "mid?") + '\0' */
uint8_t data[DR_MAX_DATA]; /* Payload bytes following the TAG */
uint8_t data_len; /* Valid length of data[] */
} ParsedCmd;
/*------------------------------------------------------------------------------
* Command table entry - defined in cmd_table.c
*----------------------------------------------------------------------------*/
typedef struct {
char tag[5]; /* TAG: 4 chars + '\0' */
bool enabled; /* false -> rxd: response */
int (*handler)(const ParsedCmd *cmd); /* 1=success, 0=failure */
} CmdEntry;
/*------------------------------------------------------------------------------
* Parser API
*----------------------------------------------------------------------------*/
/* Inject command table (called once at boot). */
void dr_parser_init(const CmdEntry *table, uint16_t count);
/* Entry point: invoked from BLE NUS / UART receive callbacks. */
int dr_cmd_parser(const uint8_t *buf, uint8_t len);
/*------------------------------------------------------------------------------
* Public utilities for handlers
*----------------------------------------------------------------------------*/
/* Extract Big-Endian uint16. Returns false if not enough data. */
bool dr_get_u16(const ParsedCmd *cmd, uint8_t word_index, uint16_t *out);
/* Extract null-terminated ASCII string. out must hold at least max_len+1. */
void dr_get_ascii(const ParsedCmd *cmd, uint8_t offset, char *out, uint8_t max_len);
/* CRC16 (Nordic SDK CRC-CCITT variant). p_crc=NULL -> initial 0xFFFF. */
uint16_t dr_crc16_compute(const uint8_t *p_data, uint32_t size, const uint16_t *p_crc);
#endif /* PARSER_H */