/*******************************************************************************
 * @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 <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__

