/******************************************************************************* * @file main.h * @author CandyPops Co. * @version V1.0.0 * @date 2022-09-05 * @brief VesiScan BASIC 메인 헤더 파일 * * [시스템 개요] * VesiScan BASIC은 nRF52840 기반 BLE 방광 모니터링 패치 디바이스이다. * 본 헤더는 시스템 전역에서 사용하는 열거형, 함수 선언, 전역 변수를 정의한다. * * [통신 방식] * - BLE NUS (Nordic UART Service): 스마트폰 앱과 바이너리 프로토콜 통신 * - 물리 UART (1Mbps): 디버그 및 공장 테스트용 * * [데이터 전송 흐름] * 1. 앱/UART에서 명령 수신 → received_command_process() * 2. 센서 데이터 수집 (배터리, 온도, IMU, 압력) * 3. format_data() 계열 함수로 바이너리 패킷 생성 * 4. dr_binary_tx_safe()로 CRC16 추가 후 BLE 전송 ******************************************************************************/ #ifndef MAIN_H__ #define MAIN_H__ /*============================================================================== * 데이터 길이 상수 *============================================================================*/ #define SERIAL_NO_LENGTH 12 /* 시리얼 번호 길이 (예: "VB026030000") */ #define HW_NO_LENGTH 12 /* 하드웨어 번호(버전) 길이 */ #define PASSKEY_LENGTH 6 /* BLE 페어링 패스키 길이 (숫자 6자리) */ #include #include #include #include #include #include "boards.h" /*============================================================================== * 열거형 정의 *============================================================================*/ /* 디바이스 ON/OFF 제어용 열거형 (EEPROM, 전원 등) */ typedef enum { OFF = 0, /* 꺼짐 */ ON = 1 /* 켜짐 */ }on_off_cont_t; /* 명령 수신 경로 구분 (BLE 또는 UART) */ typedef enum { CMD_BLE = 0, /* BLE NUS를 통해 수신된 명령 */ CMD_UART = 1 /* 물리 UART를 통해 수신된 명령 */ }which_cmd_t; /* 챔버 자동 테스트 모드 (FEATURE_CHAMBER_AUTO_TEST 활성 시) */ #if FEATURE_CHAMBER_AUTO_TEST typedef enum { SIMPLE_AUTO_MODE = 0, /* 간단 자동 모드 */ HALF_AUTO_MODE = 1, /* 반자동 모드 */ FULL_AUTO_MODE = 2, /* 전체 자동 모드 */ NONE_AUTO_MODE = 3 /* 자동 모드 없음 */ }auto_meas_mode_t; #endif /* BLE 연결 상태 */ typedef enum { BLE_DISCONNECTED_ST = 0, /* BLE 미연결 */ BLE_CONNECTED_ST = 1 /* BLE 연결됨 */ }ble_status_t; /*============================================================================== * 함수 선언 *============================================================================*/ #if FEATURE_SECURE_CONNECTION /* BLE 광고 시작 (erase_bonds=true이면 본딩 정보 삭제 후 시작) */ static void advertising_start(bool erase_bonds); #endif /* 슬립 모드 진입: LED 표시 후 POWER_OFF_DELAY(3초) 후 전원 차단 */ void sleep_mode_enter(void); /* 전원 OFF 타이머 콜백: POWER_OFF_DELAY 경과 후 실제 전원 차단 */ static void t_power_off_timeout_handler(void * p_context); /* 디바이스 전원 OFF: LED 표시 후 타이머로 지연 전원 차단 */ void device_power_off(void); /* 전원 제어 핸들러: POWER_HOLD 핀으로 물리적 전원 ON/OFF */ static void power_control_handler(on_off_cont_t device_power_st); /* 전원 버튼 상태머신 (타이머 콜백, 5ms 간격): * - 짧은 눌림(<1.5초): 전원 OFF * - 중간 눌림(1.5초~10초): 부팅 시퀀스 시작 * - 긴 눌림(>10초): 공장 초기화 (패스키 리셋 + 전원 OFF) */ static void main_s(void * p_context); /* Peer Manager 타이머 콜백: reset_status==5이면 BLE 연결 강제 해제 */ static void PM_s(void * p_context); //static void main_re(void * p_context); /* 메인 루틴 핸들러 (레거시, 현재 미사용) */ static void main_routine_handler(void * p_context); /*------------------------------------------------------------------------------ * 데이터 전송 함수 *----------------------------------------------------------------------------*/ /* ASCII 텍스트 BLE 전송 ('\r'까지 전송, CRC16 자동 추가) */ void data_tx_handler(char const *p_data_to_send); /* 바이너리 데이터 BLE 안전 전송 (CRC16 자동 추가, 재시도 로직 포함) * @param ble_bin_buff 전송할 바이너리 버퍼 * @param length 데이터 길이 (uint16_t 워드 단위, 실제 바이트 = length × 2) */ void dr_binary_tx_safe(uint8_t const *ble_bin_buff, uint16_t length); /* SoftDevice 호환 딜레이 (nrf_delay_ms 래퍼) */ void dr_sd_delay_ms(uint32_t ms); /*------------------------------------------------------------------------------ * 바이너리 패킷 포맷 함수 * 패킷 구조: [4바이트 태그][데이터][2바이트 CRC16] *----------------------------------------------------------------------------*/ /* 단일 uint16_t 값 포맷: [tag 4B][value 2B] */ void single_format_data(uint8_t *buffer, const char *tag, const uint16_t value) ; /* uint16_t 배열 포맷: [tag 4B][data0 2B][data1 2B]... */ void format_data(uint8_t *buffer, const char *tag, const uint16_t *data_array, size_t length); /* uint8_t 바이트 배열 포맷: [tag 4B][byte0][byte1]... */ void format_data_byte(uint8_t *buffer, const char *tag, const uint8_t *data_array, size_t length); /* ASCII 문자열 포맷: [tag 4B][char0][char1]... */ void ascii_format_data(uint8_t *buffer, const char *tag, const char *data_ascii, size_t length); /*============================================================================== * 전역 변수 (extern) *============================================================================*/ extern volatile bool data_tx_in_progress; /* BLE TX 전송 진행 중 플래그 */ extern volatile bool ble_connection_st; /* BLE 연결 상태 (0=미연결, 1=연결) */ extern volatile bool processing; /* 센서 데이터 처리 중 플래그 (중복 명령 방지) */ /* 2026-03-17: cmd_parse.c에서 main.c로 이동한 전역변수 */ extern char SERIAL_NO[SERIAL_NO_LENGTH]; /* 시리얼 번호 */ extern char HW_NO[HW_NO_LENGTH]; /* 하드웨어 번호 */ extern char m_static_passkey[PASSKEY_LENGTH]; /* BLE 정적 패스키 */ extern bool bond_data_delete; /* 본딩 데이터 삭제 요청 플래그 */ extern uint32_t m_life_cycle; /* 디바이스 수명 사이클 카운터 */ extern uint8_t resetCount; /* 통신 타임아웃 카운터 */ extern bool info4; /* 추가 정보 포함 측정 플래그 */ extern uint8_t m_reset_status; /* 리셋 상태 코드 */ extern uint8_t ble_bin_buffer[]; /* BLE 바이너리 응답 버퍼 */ /* 에러 응답 전송 */ void param_error(const char *cmd); #endif //MAIN_H__