#include <bsp_netdev_wifi_hzluat.h>

#include "sr_osal.h"


//hezhou
#include <ps_lib_api.h>
#include <luat_wlan.h>

static void _WifiCopyScanInfo(SR_WIFI_SCAN_RES_T *scanResult,GetWifiScanInfo *pWifiScanInfo)
{
	if (pWifiScanInfo->bssidNum >= LUAT_MAX_WIFI_BSSID_NUM)
	  {
		  scanResult->infoNum = LUAT_MAX_WIFI_BSSID_NUM;
	  }
	  else
	  {
		  scanResult->infoNum =pWifiScanInfo->bssidNum;
	  }
	  
	  for (int i = 0; i < scanResult->infoNum; i++)
	  {
	      scanResult->infoArray[i].rsvd = 0;
		  scanResult->infoArray[i].ssidLen = pWifiScanInfo->ssidHexLen[i];
		  for (int j = 0; j < pWifiScanInfo->ssidHexLen[i]; j++)
		  {
			  scanResult->infoArray[i].ssid[j] = pWifiScanInfo->ssidHex[i][j];
		  }
		  
		  scanResult->infoArray[i].rssi = pWifiScanInfo->rssi[i];
		  scanResult->infoArray[i].channel = pWifiScanInfo->channel[i];
		  for (int n = 0; n < 6; n++)
		  {
			  scanResult->infoArray[i].bssid[n] = pWifiScanInfo->bssid[i][n];
		  }
	  }

}

int _LuatWifiScan(SR_NETDEV_T *dev, SR_WIFI_SCAN_CFG_T *scanCfg,SR_WIFI_SCAN_RES_T *scanResult)
{
	int32_t ret = -1;

	SetWifiScanParams wifiscanreq = {0};
	GetWifiScanInfo pWifiScanInfo;

	wifiscanreq.maxTimeOut=10000;
	wifiscanreq.round=1;
	wifiscanreq.maxBssidNum=10;
	wifiscanreq.scanTimeOut=5;
	wifiscanreq.wifiPriority=LUAT_WIFISCAN_DATA_PERFERRD;
	wifiscanreq.channelRecLen=280;
	wifiscanreq.channelCount=1;
	wifiscanreq.channelId[0]=0;

	if(scanCfg!=SR_NULL)
	{
		wifiscanreq.maxTimeOut=scanCfg->maxTimeOut;
		wifiscanreq.round=scanCfg->round;
		wifiscanreq.maxBssidNum=scanCfg->maxBssidNum;
		wifiscanreq.scanTimeOut=scanCfg->scanTimeOut;
		wifiscanreq.scanTimeOut=scanCfg->wifiPriority;
	}

	ret=appGetWifiScanInfo(&wifiscanreq, &pWifiScanInfo);
	if (ret == 0)
	{
  
	   _WifiCopyScanInfo(scanResult,&pWifiScanInfo);
	  
	  return 0;
	}

	scanResult->infoNum =0;

	return -1;

}







/***异步方式***/
#include "ps_dev_if.h"

static SR_NETDEV_T *wifiDev = SR_NULL;


//soc_service_misc_callback为弱函数，参考下面直接调用
void soc_service_misc_callback(uint8_t *data, uint32_t len)
{
	uint8_t *wifi_scan_data;
	uint8_t sg_id = (((len) >> 12) & 0x000F);
	uint16_t prim_id = ((len)&0x0FFF);
	int ret=-1;
	switch (sg_id)
	{
	case CAM_DEV:
		switch (prim_id)
		{
			case CMI_DEV_SET_WIFISCAN_CNF://下面为处理函数 
				{				 
					GetWifiScanInfo *getInfo = (GetWifiScanInfo *)data;
					SR_WIFI_SCAN_RES_T *scanResult = (SR_WIFI_SCAN_RES_T *)SR_OsMalloc(sizeof(SR_WIFI_SCAN_RES_T));
				
					_WifiCopyScanInfo(scanResult,getInfo);
			
					//调用用户回调
					if(wifiDev && wifiDev->wifiEvtCb) 
					{
						WifiEvtCb eventCb = (WifiEvtCb)wifiDev->wifiEvtCb; 
						eventCb(wifiDev->wifiEvtArgs,SR_WIFI_EVT_SCAN,scanResult,sizeof(SR_WIFI_SCAN_RES_T));
					}

					SR_OsFree(scanResult);
				}
			
			break;
		}
		break;
	}
}




static void luat_wlan_scan_nonblock_init(UINT16 paramSize, void *pParam)
{
	devSetWIFISCAN(PS_DIAL_REQ_HANDLER, pParam);
}


int _LuatWifiScanAsync(SR_NETDEV_T *dev, SR_WIFI_SCAN_CFG_T *scanCfg)
{
	int ret =-1;
	
	wifiDev = dev;

	SetWifiScanParams wifiscanreq ={0};
    wifiscanreq.maxTimeOut=10000;
	wifiscanreq.round=1;
	wifiscanreq.maxBssidNum=10;
	wifiscanreq.scanTimeOut=5;
	wifiscanreq.wifiPriority=LUAT_WIFISCAN_DATA_PERFERRD;
	wifiscanreq.channelRecLen=280;
	wifiscanreq.channelCount=1;
	wifiscanreq.channelId[0]=0;

	if(scanCfg!=SR_NULL)
	{
		wifiscanreq.maxTimeOut=scanCfg->maxTimeOut;
		wifiscanreq.round=scanCfg->round;
		wifiscanreq.maxBssidNum=scanCfg->maxBssidNum;
		wifiscanreq.scanTimeOut=scanCfg->scanTimeOut;
		wifiscanreq.scanTimeOut=scanCfg->wifiPriority;
	}
	
	ret=cmsNonBlockApiCall(luat_wlan_scan_nonblock_init, sizeof(wifiscanreq), &wifiscanreq);


	return (ret==0)? 0:-1;
}







