/*********************************************************************************/
/* FILE NAME  : scene_recognition.h                                                    */
/* AUTHOR     : Zhang Jingrui, ID: 11082826, Version: V0.1_Beta, Data:2019-03-28       */
/* DESCRIPTION: This header file conterns the prototype description of the external    */
/*              interface funtions of the scene recognition module and the definit-    */
/*              ion of related resources.                                              */
/* HISTORY    : (NONE)                                                                 */
/********************************************************************************/

#ifndef _PDR_SCENE_RECOGNITION_H_
#define _PDR_SCENE_RECOGNITION_H_

/* Header Files Including -----------------------------------------*/
/*=================================================================*/
#include "PDRSensor.h"

/* Macro Declaration ----------------------------------------------*/
/*=================================================================*/

#define _TIME_BUFFER_SIZE               10      /* Buffer size for the time calculation.                   */
#define _ACCURACY_BUFFER_SIZE           9       /* Accuracy time-based buffer size.                        */
#define _GNSS_INDEX_LEN                 103     /* Structural array size in _GnssInfo.                     */

/* Extern Variable Declaration ------------------------------------*/
/*=================================================================*/
//extern int scene_recognition_debug_flag ;
//extern int scene_recognition_log_debug_flag ;

/* Status Declaration ---------------------------------------------*/
/*=================================================================*/
/* Usage: 场景识别模块初始化、重置操作结果状态标志位                   */
typedef enum SCENE_INIT_STATE
{
    // 场景识别模块初始化相关状态
            INIT_SUCCESS = 0,
    INIT_NOT_PERFORMED,

    INIT_ERROR_MEMORY_OCCUPIED,     // 模块资源未提前释放，需先释放资源
    INIT_ERROR_MEMORY_INIT_FAILED,  // 初始化内存申请失败
    INIT_ERROR_REDUNDANCY,          // 模块重复初始化，此时初始化无效。若需要重启模块，可以：
    // 方法1：先关闭模块，关闭成功后，重新初始化模块。
    // 方法2：重启模块，效果同方法1。
    // 场景识别模块重置相关状态(for debug)
            INIT_RESET_SUCCESS = 0,
    INIT_RESET_FAILED
} SCENE_INIT_STATE;

/* Usage: 场景分类结果                                            */
typedef enum SCENE_RECOGNITION_RESULT
{
    RECOG_UNKNOWN,                  // 未能确定场景的状态(默认状态)
    RECOG_OPEN_AREA,                // 场景open-area
    RECOG_OTHERS,                   // 除了上述确定场景外的其他场景
    RECOG_ERROR_PARAM_INCRECT,      // 输入参数检查错误
    RECOG_ERROR_NMEA_INFO_MISS,     // 输入参数正确但是内容有误
    /* 预研检测结果(不稳定) */
            RECOG_MULTIPATH             // 检测多径
} SCENE_RECOGNITION_RESULT;

/* Usage: 场景识别模块资源释放操作结果                             */
typedef enum SCENE_DESTROY_STATE
{
    DESTROY_SUCCESS = 0,
    DESTROY_FIALED,
    DESTROY_ERROR,
    DESTROY_INVALID     // 无效释放操作，表示没有对应的初始化或重置操作
} SCENE_DESTROY_STATE;


/* Status Declaration--------------------------------------------*/
/*===============================================================*/

// 描述当前场景识别模块的工作状态
typedef enum _SCENE_MODEL_WORK_STATE
{
    MODEL_OFF,
    MODEL_ON
} _SCENE_MODEL_WORK_STATE;

/* Usage: Identifier of the quality of the satellites' signal source. */
typedef enum _SIGNAL_QUALITY
{
    SIG_UNKNOWN,
    GOOD,
    BAD
} SIGNAL_QUALITY;

/* Usage: extract and save information from Nmea_t for the module. */
/*        This is the interface for the Nmea_t.                    */
typedef struct _GnssInfo
{
    int    update;                                         // GNSS更新标志位 1：更新 0：不更新
    double local_timestamp;                                // 当地时间
    float  accuracy;                                       // GPS 输出的Accuracy参数，Accuracy > 0 当其为负数表示无效
    int    sat_visible_number;                             // 当前时间可见卫星数量
    float  snr_list[_GNSS_INDEX_LEN];               // 当前时间可见卫星的SNR列表
    int    sat_used_list[_GNSS_INDEX_LEN];               // 当前使用卫星列表
} GnssInfo;

/* Usage: 标记GNSS中的各个卫星系统                                 */

/* Struct Declaration -------------------------------------------*/
/*===============================================================*/


/* Function Declaration -------------------------------------------*/
/*=================================================================*/
#ifdef __cplusplus
extern "C" {
#endif

/* Function Name: sceneRecognitionInit()                   */
/* Usage: Initialization module for configuring related resources  */
/*        and must be executed once first beforing using the scene */
/*        recognition module funcition.                            */
/* Param  @ (NONE)                                                 */
/* Return @ init_res: Result state of the initialization process.  */
SCENE_INIT_STATE SceneRecog_Init(void);

/* Function Name: scene_recognition_reset()                      */
/* Usage: 初始化模块，配置相关资源，在使用模块前必须首先被执行。      */
/* Param  @ (NONE)                                               */
/* Return @ init_res: 重置执行结果。                              */
SCENE_INIT_STATE scene_recognition_reset(void);

/**----------------------------------------------------------------------
* Function    : sceneRecognitionProc
* Description : GNSS场景识别处理流程：
*               1）将nmea转换为gnss
*               2) 通过accuracy、snr、卫星数量分析GNSS信号质量
*               3) 返回结果
* Input       : PDR的nmea结构体
* Return      : 场景识别结果
* Date        : 2020/02/18  
*---------------------------------------------------------------------**/
SCENE_RECOGNITION_RESULT sceneRecognitionProc(const Nmea_t* nmea);

/* Function Name: scene_recognition_destroy()                    */
/* Usage: 场景识别处理结束后的资源释放操作，资源释放后无法继续进行场  */
/*        景识别过程。                                            */
/* Param  @ (NONE)                                               */
/* Return @ destroy_state: 资源释放操作结果。                      */
SCENE_DESTROY_STATE scene_recognition_destroy(void);

/**----------------------------------------------------------------------
* Function    : isOpenArea
* Description : GNSS开阔地检测，通过输入GNSS信号，分析当前信号质量，从而确定
*               目标是否处于开阔场地。
* Return      : 0 : 非开阔地  1：开阔地(信号质量较好)
* Author      : Zhang Jingrui, Geek ID: 11082826
* Date        : 2020/02/18  logzhan
*---------------------------------------------------------------------**/
int isOpenArea(const Nmea_t* nmea);

#ifdef __cplusplus
}
#endif
#endif  //__SCENE_RECOGNITION_H__