/*******************************************************************************
 * @file	app_raw.h
 * @author	CandyPops Co.
 * @version V1.0.0
 * @date	2022-09-05
 * @brief
 ******************************************************************************/

/*******************************************************************************
 * [헤더 개요] ICM42670P IMU 드라이버 상위 레이어 선언
 *
 * IMU 센서의 초기화, 설정, 데이터 읽기를 위한 함수 프로토타입과
 * 동작 모드 설정 매크로를 정의한다.
 *
 * 주요 설정 매크로:
 *   SERIF_TYPE         - 통신 인터페이스 (UI_I2C)
 *   USE_LOW_NOISE_MODE - 1:저잡음(800Hz), 0:저전력(100Hz)
 *   USE_HIGH_RES_MODE  - 1:20비트 고해상도, 0:16비트 표준
 *   USE_FIFO           - 1:FIFO 사용, 0:레지스터 직접 읽기
 ******************************************************************************/

#ifndef _APP_RAW_H_
#define _APP_RAW_H_
#include "sdk_config.h"

#include <stdint.h>
#include "inv_imu_transport.h"
#include "inv_imu_defs.h"
#include "inv_imu_driver.h"


/*** 설정 매크로 ***/

/*
 * MCU와 IMU 간 통신 인터페이스 선택
 * UI_I2C: I2C 통신 사용 (기본)
 */
#define SERIF_TYPE           UI_I2C

/*
 * 전원 모드 설정
 * 1: 저잡음 모드 — 800Hz ODR, 높은 정밀도, 높은 전력 소모
 * 0: 저전력 모드 — 100Hz ODR, 낮은 전력 소모
 * 주의: 12.5Hz 미만 ODR에서는 저잡음 모드 사용 불가
 */
#define USE_LOW_NOISE_MODE   1

/*
 * FIFO 해상도 모드 선택
 * 0: 저해상도 — 16비트 데이터 (기본)
 * 1: 고해상도 — 20비트 데이터 (FSR이 16g/2000dps로 강제 고정됨)
 */
#define USE_HIGH_RES_MODE    0

/*
 * 데이터 읽기 방식 선택
 * 0: 레지스터 직접 읽기 (현재 사용 중)
 * 1: FIFO에서 읽기
 */
#define USE_FIFO             0


/**
 * \brief IMU 디바이스를 리셋하고 초기화한다. WHOAMI 확인 포함.
 *        다른 IMU 접근 함수 호출 전에 반드시 성공적으로 실행되어야 한다.
 *
 * \return 0=성공, 음수=에러
 */
int setup_imu_device(struct inv_imu_serif *icm_serif);

/**
 * \brief 자이로 및 가속도계 출력을 위한 디바이스 설정을 수행한다.
 *        FSR, ODR, 전원 모드, FIFO 설정 등을 적용한다.
 * \return 0=성공, 음수=에러
 */
int configure_imu_device(void);

/**
 * \brief FIFO 또는 레지스터에서 IMU 데이터를 추출한다.
 *        내부적으로 imu_callback()이 호출되어 데이터를 처리한다.
 * \return 0=성공, 음수=에러
 */
int get_imu_data(void);

/**
 * \brief 센서 데이터 수신 콜백. 마운팅 매트릭스 적용 후
 *        info4/BLE/UART 모드에 따라 데이터를 출력한다.
 * \param[in] event 하나의 센서 데이터 패킷을 담은 구조체
 */
void imu_callback(inv_imu_sensor_event_t *event);

/**
 * \brief 드라이버 API를 우회한 직접 I2C 레지스터 읽기.
 *        DRDY 인터럽트 없이 즉시 센서 데이터를 읽어 BLE로 전송한다.
 *        읽기 후 IMU를 슬립 모드로 전환하여 전력을 절감한다.
 * \return 0=성공, 음수=에러
 */
int imu_read_direct(void);


#endif /* !_APP_RAW_H_ */
