/*******************************************************************************
 * @file	fstorage.h
 * @author	CandyPops Co.
 * @version V1.0.0
 * @date	2022-09-05
 * @brief	FDS(Flash Data Storage) 기반 설정 저장 모듈 인터페이스
 *******************************************************************************
 *
 * [헤더 개요]
 * nRF52840 내장 플래시에 디바이스 설정을 저장/로드하는 FDS 모듈의 공용 API.
 * 외부 EEPROM을 대체하며, SoftDevice와 공존하여 플래시를 안전하게 관리한다.
 *
 * [config_data_t 구조체] (45바이트, 패킹됨)
 *   magic_number(4B): 포맷 확인용 (0x20231226)
 *   hw_no(12B): 하드웨어 번호
 *   serial_no(12B): 시리얼 번호 (BLE 디바이스 이름으로도 사용)
 *   static_passkey(6B): BLE 페어링 패스키 (숫자 6자리)
 *   bond_data_delete(1B): 본딩 삭제 플래그
 *   reset_status(1B): 리셋 상태 코드
 *   pd_adc_cnt(1B): ADC 샘플링 횟수
 *   pd_delay_us(2B): PD 안정화 딜레이 (마이크로초)
 *   life_cycle(4B): 디바이스 사용 횟수
 *
 * [주요 API]
 *   fs_storage_init(): FDS 초기화 (부트 시 1회)
 *   config_load():     FDS에서 설정 로드 (없으면 기본값 생성)
 *   config_save():     현재 설정을 FDS에 저장
 *
 ******************************************************************************/

#ifndef IHP_FSTORAGE_H_
#define IHP_FSTORAGE_H_

#include "sdk_config.h"

#include "nordic_common.h"
#include <stdint.h>

/* -------------------------------------------------------------------------
* 기본 버전 정보 (FDS 기본값 및 빈 필드 복구 시 사용) 
* 
* 하드웨어 식별 코드
*   - VBTHW0100 = 개발(시험)용 Ver 1.00
*   - VB0HW0100 = 양산용 Ver 1.00
*
* Firmware 식별 코드
*   - VBTFW0100 = 개발(시험)용 Ver 1.00
*   - VB0FW0100 = 양산용 Ver 1.00
*
* 시리얼 넘버 식별 코드
*   - VBT26030001 = 개발(시험)용 26년 3월 생산 1번
*   - VB026030001 = 양산용 26년 3월 생산 1번
------------------------------------------------------------------------- */
#define HARDWARE_VERSION                "VBTHW0100"
#define SERIAL_NUMBER                   "VBT26030001"
#define DEFAULT_PASSKEY                 "123456"

#pragma pack(1)
typedef struct
{
	uint32_t 	magic_number;       /* 4B  - 포맷 확인용 매직 넘버 */
	char        hw_no[12];          /* 12B - HW Version */
	char        serial_no[12];      /* 12B - Serial Number */
	uint8_t     static_passkey[6];  /* 6B  - BLE Passkey */
	uint8_t     bond_data_delete;   /* 1B  - Bond delete flag */
	int8_t      reset_status;       /* 1B  - Reset status */
	uint32_t    life_cycle;         /* 4B  - Device usage count */

	/* Piezo 측정 파라미터 - 8B */
	uint8_t     piezo_freq_option;  /* 1B  - Frequency : 송신 펄스 주파수 (0=1.8M, 1=2.1M, 2=2.0M, 3=1.7M) */
	uint8_t     piezo_cycles;       /* 1B  - Burst Cycle : 송신 펄스 사이클 수 (3~7) */
	uint16_t    piezo_averaging;    /* 2B  - 평균화 수 : 채널당 반복 측정 횟수 (1~10) */
	uint16_t    piezo_delay_us;     /* 2B  - 대기 시간(Delay) : 송신 펄스 출력 후 ADC 시작 시까지 대기시간 (us) (0~30) */
	uint16_t    piezo_num_samples;  /* 2B  - 측정 ADC 샘플 개수 (80~140) */
} config_data_t;  /* Total: 48 bytes - FDS에 저장하는 디바이스 설정 */

extern config_data_t m_config;

void fds_default_value_set(void);
void config_load( void );
void config_save( void );

void fs_set_value(void);
void fs_storage_init(void);

#endif /* IHP_FSTORAGE_H_ */

