174 lines
7.4 KiB
C
174 lines
7.4 KiB
C
/*******************************************************************************
|
||
* @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__
|
||
|
||
/* -------------------------------------------------------------------------
|
||
* Firmware 식별 코드
|
||
* - VBTFW0100 = 개발(시험)용 Ver 1.00
|
||
* - VB0FW0100 = 양산용 Ver 1.00
|
||
------------------------------------------------------------------------- */
|
||
#define FIRMWARE_VERSION "VBTFW0100"
|
||
|
||
/*==============================================================================
|
||
* 데이터 길이 상수
|
||
*============================================================================*/
|
||
#define SERIAL_NO_LENGTH 12 /* 시리얼 번호 길이 (예: "VB026030000") */
|
||
#define HW_NO_LENGTH 12 /* 하드웨어 번호(버전) 길이 */
|
||
#define PASSKEY_LENGTH 6 /* BLE 페어링 패스키 길이 (숫자 6자리) */
|
||
|
||
#include <stdio.h>
|
||
#include <stdint.h>
|
||
#include <string.h>
|
||
#include <stdarg.h>
|
||
#include <stdbool.h>
|
||
#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__
|
||
|