/**
 *@file sr_netdev_wifi.h
 *@brief wifi基础功能抽象接口
 *@details 提供wifi功能相关枚举、结构体、API声明
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author Lierda-RDC
 *@date 2024-04-01
 *@example ZhaoyangSDK\example\pal\hal\netdev_wifi_example.c
 */


#ifndef _SR_NET_WIFI_H
#define _SR_NET_WIFI_H


#include "sr_netdev.h"


#define SR_WIFI_MAX_SCAN_NUM        10  /*!<最大扫描数量*/
#define SR_WIFI_MAX_SSID_LEN        32  /*!< SSID 的最大长度*/



/**
 * @brief wifi事件类型枚举
 */

typedef enum
{
  SR_WIFI_EVT_SCAN = 0,        /*!<WiFi scan 事件*/  
  
}SR_WIFI_EVENT_E;


/**
* @brief wifi事件通知回调函数类型
* 
* @param[in] args  用户参数
* @param[in] event wifi事件类型
* @param[in] data  事件携带的数据
* @param[in] len   事件携带数据的长度
* 
* @return 无
*/
typedef void (*WifiEvtCb)(void *args,SR_WIFI_EVENT_E event,void *data, uint32_t len);



/**
 * @brief wifi扫描信息
 */
typedef struct
{
    uint8_t channel;    /*!<radio channel*/
    int8_t  rssi;       /*!<signal strength*/
    uint8_t ssidLen;    /*!<ssid的长度*/
    uint8_t rsvd;       /*!<保留*/
    uint8_t bssid[6];   /*!<hwaddr/MAC*/
    char    ssid[SR_WIFI_MAX_SSID_LEN];    /*!<保存ssid的数组，数据长度为ssidLen*/          
}WIFI_INFO_T;



/**
 * @brief wifi扫描结果结构体
 */
typedef struct 
{
    WIFI_INFO_T    infoArray[SR_WIFI_MAX_SCAN_NUM]; /*!<具体的扫描结果信息*/
    uint32_t       infoNum;    /*!<有效的扫描数量*/
} SR_WIFI_SCAN_RES_T;


/**
 * @brief wifi扫描配置结构体
 */
typedef struct 
{
 
	uint32_t maxTimeOut;   /*!<最大执行时间,取值范围[4000~255000],单位ms，默认值10000*/
	uint8_t  round;        /*!<Wi-Fi Scan 的轮数，范围：[1~3]，默认值：1  */
	uint8_t  maxBssidNum;  /*!<期望扫描到的 Wi-Fi 热点个数，范围：[4~10]，默认值：10*/
	uint8_t  scanTimeOut;  /*!<Wi-Fi Scan 的RRC轮询超时时间，范围：[1~255]，默认值：5，单位：秒*/
	uint8_t	 wifiPriority; /*!<Wi-Fi Scan 优先参数， 0：数据优先(默认) 1：Wi-Fi Scan 优先。（说明：数据优先模式下，只会在CFUN=0或UE处于IDLE状态下才会开始wifi扫描；Wi-Fi Scan 优先模式下，如果此时UE在连接态期间，不管是否有数据业务，都会打断当前连接态返回idle， 发起wifi搜网）  */

}SR_WIFI_SCAN_CFG_T;

#define IS_SCAN_CFG(p) ((p == SR_NULL) || ((p->maxTimeOut >= 4000 && p->maxTimeOut <= 255000) \
                        && (p->round >= 1 && p->round <= 3) \
                        && (p->maxBssidNum >= 4 && p->maxBssidNum <= 10) \
                        && (p->scanTimeOut >= 1 && p->scanTimeOut <= 255) \
                        && (p->wifiPriority == 0 || p->wifiPriority == 1)))

/**
 * @brief wifi底层操作函数集结构体
 */
typedef struct 
{
    int (*get_scan_info)(SR_NETDEV_T *dev, SR_WIFI_SCAN_CFG_T *cfg,SR_WIFI_SCAN_RES_T *result);
    int (*get_scan_info_async)(SR_NETDEV_T *dev,SR_WIFI_SCAN_CFG_T *cfg);
}SR_WIFI_OPS_T;






/************************wifi基础功能抽象API**************************/
/**  
* @brief 阻塞方式执行WiFi扫描
*   
* @param[in] dev     网卡设备指针 
* @param[in] cfg     WiFi扫描配置指针。可以为SR_NULL，使用默认配置
  
* @param[out] result 扫描结果存储指针
*  
* @return 成功返回0，失败返回负值错误码  
*/
int SR_HalWifiScan(SR_NETDEV_T *dev, SR_WIFI_SCAN_CFG_T *cfg,SR_WIFI_SCAN_RES_T *result);


/**  
* @brief 非阻塞方式执行WiFi扫描
*   
* @param[in] dev   网卡设备指针 
* @param[in] cfg   WiFi扫描配置指针。可以为SR_NULL，使用默认配置  
*  
* @return 成功返回0，失败返回负值错误码  
*/ 
int SR_HalWifiScanAsync(SR_NETDEV_T *dev, SR_WIFI_SCAN_CFG_T *cfg);

/**  
* @brief 设置WiFi事件回调函数
*   
* @param[in] dev   网卡设备指针 
* @param[in] cb    事件回调函数指针  
* @param[in] args  回调函数参数指针
*  
* @return 成功返回0，失败返回负值错误码  
*/
int SR_HalWifiSetEvtCb(SR_NETDEV_T *dev,WifiEvtCb cb,void *args);


#endif


