/**
  ******************************************************************************
  * @file    53l7a1_ranging_sensor.h
  * @author  IMG SW Application Team
  * @brief   This file contains the common defines and functions prototypes for
  *          the 53l7a1_ranging_sensor.c driver.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef XNUCLEO_53L7A1_RANGING_SENSOR_H
#define XNUCLEO_53L7A1_RANGING_SENSOR_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "ranging_sensor.h"
#include "53l7a1_conf.h"
#include "vl53l7cx.h"

/** @addtogroup BSP
  * @{
  */

/** @defgroup XNUCLEO_53L7A1 X-NUCLEO-53L7A1
  * @{
  */

/** @defgroup XNUCLEO_53L7A1_RANGING_SENSOR RANGING SENSOR
  * @{
  */

/** @defgroup XNUCLEO_53L7A1_RANGING_SENSOR_Exported_Constants Exported Constants
  * @{
  */
#define RANGING_SENSOR_VL53L7CX_ADDRESS    (VL53L7CX_DEVICE_ADDRESS)
#define RANGING_SENSOR_NB_TARGET_PER_ZONE  (VL53L7CX_NB_TARGET_PER_ZONE)
#define RANGING_SENSOR_MAX_NB_ZONES        (VL53L7CX_MAX_NB_ZONES)

#define RANGING_SENSOR_POWERMODE_WAKEUP    (VL53L7CX_POWER_MODE_WAKEUP)
#define RANGING_SENSOR_POWERMODE_SLEEP     (VL53L7CX_POWER_MODE_SLEEP)

#define RS_PROFILE_4x4_CONTINUOUS          (VL53L7CX_PROFILE_4x4_CONTINUOUS)
#define RS_PROFILE_4x4_AUTONOMOUS          (VL53L7CX_PROFILE_4x4_AUTONOMOUS)
#define RS_PROFILE_8x8_CONTINUOUS          (VL53L7CX_PROFILE_8x8_CONTINUOUS)
#define RS_PROFILE_8x8_AUTONOMOUS          (VL53L7CX_PROFILE_8x8_AUTONOMOUS)

#define RS_IT_DEFAULT        (VL53L7CX_IT_DEFAULT)       /*!< IT if new measurement is ready (no thresholds) */
#define RS_IT_IN_WINDOW      (VL53L7CX_IT_IN_WINDOW)     /*!< IT if distance > thresh_high */
#define RS_IT_OUT_OF_WINDOW  (VL53L7CX_IT_OUT_OF_WINDOW) /*!< IT if distance < LowThreshold OR distance > HighThreshold */
#define RS_IT_BELOW_LOW      (VL53L7CX_IT_BELOW_LOW)     /*!< IT if distance <= LowThreshold */
#define RS_IT_ABOVE_HIGH     (VL53L7CX_IT_ABOVE_HIGH)    /*!< IT if distance > HighThreshold */
#define RS_IT_EQUAL_LOW      (VL53L7CX_IT_EQUAL_LOW)     /*!< IT if distance == LowThreshold */
#define RS_IT_NOT_EQUAL_LOW  (VL53L7CX_IT_NOT_EQUAL_LOW) /*!< IT if distance != LowThreshold */

#define RS_MODE_BLOCKING_CONTINUOUS        (VL53L7CX_MODE_BLOCKING_CONTINUOUS)
#define RS_MODE_BLOCKING_ONESHOT           (VL53L7CX_MODE_BLOCKING_ONESHOT)
#define RS_MODE_ASYNC_CONTINUOUS           (VL53L7CX_MODE_ASYNC_CONTINUOUS)
#define RS_MODE_ASYNC_ONESHOT              (VL53L7CX_MODE_ASYNC_ONESHOT)

#define VL53L7A1_DEV_LEFT      (0U) /*!< left satellite device */
#define VL53L7A1_DEV_CENTER    (1U) /*!< center (built-in) device */
#define VL53L7A1_DEV_RIGHT     (2U) /*!< right satellite device */
/**
  * @}
  */

/** @defgroup XNUCLEO_53L7A1_RANGING_SENSOR_Exported_Types Exported Types
  * @{
  */
typedef struct
{
  uint32_t NumberOfZones;
  uint32_t MaxNumberOfTargetsPerZone;
  uint32_t CustomROI;               /*!< Not available: 0, Available: 1 */
  uint32_t ThresholdDetection;      /*!< Not available: 0, Available: 1 */
} RANGING_SENSOR_Capabilities_t;

typedef struct
{
  uint32_t RangingProfile;
  uint32_t TimingBudget;            /*!< Expressed in milliseconds */
  uint32_t Frequency;               /*!< Expressed in Hz */
  uint32_t EnableAmbient;           /*!< Enable: 1, Disable: 0 */
  uint32_t EnableSignal;            /*!< Enable: 1, Disable: 0 */
} RANGING_SENSOR_ProfileConfig_t;

typedef struct 
{
  uint8_t TopLeftX;   /*!< Top Left x coordinate */
  uint8_t TopLeftY;   /*!< Top Left y coordinate */
  uint8_t BotRightX;  /*!< Bot Right x coordinate */
  uint8_t BotRightY;  /*!< Bot Right y coordinate */
} RANGING_SENSOR_ROIConfig_t;

typedef struct
{
  uint32_t Criteria;      /*!< Interrupt generation criteria */
  uint32_t LowThreshold;  /*!< Expressed in millimeters */
  uint32_t HighThreshold; /*!< Expressed in millimeters */
} RANGING_SENSOR_ITConfig_t;

typedef struct
{
  uint8_t NumberOfTargets;
  uint32_t Distance[RANGING_SENSOR_NB_TARGET_PER_ZONE]; /*!< millimeters */
  uint32_t Status[RANGING_SENSOR_NB_TARGET_PER_ZONE];   /*!< OK: 0, NOK: !0 */
  float_t Ambient[RANGING_SENSOR_NB_TARGET_PER_ZONE];   /*!< kcps / spad */
  float_t Signal[RANGING_SENSOR_NB_TARGET_PER_ZONE];    /*!< kcps / spad */
} RANGING_SENSOR_ZoneResult_t;

typedef struct
{
  uint32_t NumberOfZones;
  RANGING_SENSOR_ZoneResult_t ZoneResult[RANGING_SENSOR_MAX_NB_ZONES];
} RANGING_SENSOR_Result_t;
/**
  * @}
  */

/** @addtogroup XNUCLEO_53L7A1_RANGING_SENSOR_Exported_Variables
  * @{
  */
extern void *VL53L7A1_RANGING_SENSOR_CompObj[RANGING_SENSOR_INSTANCES_NBR];
/**
  * @}
  */

/** @addtogroup XNUCLEO_53L7A1_RANGING_SENSOR_Exported_Functions
  * @{
  */
int32_t VL53L7A1_RANGING_SENSOR_Init(uint32_t Instance);
int32_t VL53L7A1_RANGING_SENSOR_DeInit(uint32_t Instance);
int32_t VL53L7A1_RANGING_SENSOR_ReadID(uint32_t Instance, uint32_t *pId);
int32_t VL53L7A1_RANGING_SENSOR_GetCapabilities(uint32_t Instance, RANGING_SENSOR_Capabilities_t *pCapabilities);
int32_t VL53L7A1_RANGING_SENSOR_ConfigProfile(uint32_t Instance, RANGING_SENSOR_ProfileConfig_t *pConfig);
int32_t VL53L7A1_RANGING_SENSOR_ConfigROI(uint32_t Instance, RANGING_SENSOR_ROIConfig_t *pConfig);
int32_t VL53L7A1_RANGING_SENSOR_ConfigIT(uint32_t Instance, RANGING_SENSOR_ITConfig_t *pConfig);
int32_t VL53L7A1_RANGING_SENSOR_GetDistance(uint32_t Instance, RANGING_SENSOR_Result_t *pResult);
int32_t VL53L7A1_RANGING_SENSOR_Start(uint32_t Instance, uint32_t Mode);
int32_t VL53L7A1_RANGING_SENSOR_Stop(uint32_t Instance);
int32_t VL53L7A1_RANGING_SENSOR_SetAddress(uint32_t Instance, uint32_t Address);
int32_t VL53L7A1_RANGING_SENSOR_GetAddress(uint32_t Instance, uint32_t *pAddress);
int32_t VL53L7A1_RANGING_SENSOR_SetPowerMode(uint32_t Instance, uint32_t PowerMode);
int32_t VL53L7A1_RANGING_SENSOR_GetPowerMode(uint32_t Instance, uint32_t *pPowerMode);
int32_t VL53L7A1_RANGING_SENSOR_XTalkCalibration(uint32_t Instance, uint16_t Reflectance, uint16_t Distance);
/**
  * @}
  */

/**
  * @}
  */

/**
  * @}
  */

/**
  * @}
  */

#ifdef __cplusplus
}
#endif

#endif /* XNUCLEO_53L7A1_RANGING_SENSOR_H */