/**
 *@file    sr_netdev_om.c
 *@brief   网络设备运维功能的抽象接口
 *@details 提供网卡规格信息查询、网络状态查询、参数配置等功能的具体实现
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author  Lierda-RDC
 *@date    2024-04-01
 *@example ZhaoyangSDK\example\pal\hal\netdev_om_example.c
 */

#include "sr_netdev_om.h"

#include "sr_config.h"


int SR_HalNetSetEvtCb(SR_NETDEV_T *dev,NetdevEvtCb cb,void *args)
{
 
	if(SR_NULL == dev || SR_NULL == cb) return SR_INVALID;
	dev->netEvtCb = (void *)cb;
	dev->netEvtArgs = args;
	
	return SR_OK;
}

#ifdef SR_USE_OS
int SR_HalNetGetImei(SR_NETDEV_T *dev, uint8_t simId,char *buf, srSize_t len)
{

	if((SR_NULL == dev) || (SR_NULL == buf) || (len < 15) ||(simId > 1)) return SR_INVALID;

	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

    if ((SR_NULL == ops) || (SR_NULL == ops->get_imei))
    {
        return SR_NOIMPT;
    }


    return ops->get_imei(dev, simId,buf, len);
}




int SR_HalNetGetImsi(SR_NETDEV_T *dev, uint8_t simId,char *buf, srSize_t len)
{
	if((SR_NULL == dev) || (SR_NULL == buf) || (len < 15) ||(simId > 1)) return SR_INVALID;

	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

	if ((SR_NULL == ops) || (SR_NULL == ops->get_imsi))
	 {
		 return SR_NOIMPT;
	 }


    return ops->get_imsi(dev, simId,buf, len);
}



int SR_HalNetGetIccid(SR_NETDEV_T *dev,uint8_t simId, char *buf, srSize_t len)
{
	if((SR_NULL == dev) || (SR_NULL == buf) || (len < 20) ||(simId > 1)) return SR_INVALID;

	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

	if ((SR_NULL == ops) || (SR_NULL == ops->get_iccid))
	 {
		 return SR_NOIMPT;
	 }


    return ops->get_iccid(dev,simId, buf, len);
}




int SR_HalNetGetCfun(SR_NETDEV_T *dev, uint8_t simId, SR_CFUN_MODE_E *cfunMode)
{
	
	if( (SR_NULL == dev) || (SR_NULL == cfunMode) || (simId > 1)) return SR_INVALID;
	

	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

    if ((SR_NULL == ops) || (SR_NULL == ops->get_cfun))
    {
        return SR_NOIMPT;
    }


    return ops->get_cfun(dev, simId,cfunMode);
}



int SR_HalNetSetCfun(SR_NETDEV_T *dev, uint8_t simId,SR_CFUN_MODE_E cfunMode)
{
	if( (SR_NULL == dev) || (simId > 1) || (cfunMode>=SR_CFUN_MODE_MAX)) return SR_INVALID;

	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

    if((SR_NULL == ops) || (SR_NULL == ops->set_cfun))
    {
        return SR_NOIMPT;
    }

    return ops->set_cfun(dev, simId,cfunMode);
}



int SR_HalNetGetCellInfo(SR_NETDEV_T *dev, uint8_t simId,SR_NET_CELL_INFO_T *cellInfo)
{

	if( (SR_NULL == dev) || (SR_NULL == cellInfo) || (simId > 1)) return SR_INVALID;
	

	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

	if ((SR_NULL == ops) || (SR_NULL == ops->get_cell_info))
	{
		return SR_NOIMPT;
	}


	return ops->get_cell_info(dev, simId,cellInfo);

}


int SR_HalNetGetSgnStreng(SR_NETDEV_T *dev,uint8_t simId,SR_NET_SGN_STRENG_T *streng)
{
	if( (SR_NULL == dev) || (SR_NULL == streng) || (simId > 1)) return SR_INVALID;
		
	
	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

	if ((SR_NULL == ops) || (SR_NULL == ops->get_signal_streng))
	{
		return SR_NOIMPT;
	}


	return ops->get_signal_streng(dev, simId,streng);


}

int SR_HalNetCheckSimReady(SR_NETDEV_T *dev, uint8_t simId)
{
	if( (SR_NULL == dev) || (simId > 1)) return SR_INVALID;
	

	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

    if ((SR_NULL == ops) || (SR_NULL == ops->check_sim_ready))
    {
        return SR_NOIMPT;
    }

    
    return ops->check_sim_ready(dev, simId);
}


int SR_HalNetGetRegSta(SR_NETDEV_T *dev, uint8_t simId,SR_NET_REG_STA_E *regSta)
{
	if( (SR_NULL == dev) || (SR_NULL == regSta) || (simId > 1)) return SR_INVALID;
	

	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

    if ((SR_NULL == ops) || (SR_NULL == ops->get_net_reg_sta))
    {
        return SR_NOIMPT;
    }

    
    return ops->get_net_reg_sta(dev, simId,regSta);

}




int SR_HalNetGetLinkSta(SR_NETDEV_T *dev, uint8_t simId,SR_NET_LINK_STA_E *linkSta)
{
	if( (SR_NULL == dev) || (SR_NULL == linkSta) || (simId > 1)) return SR_INVALID;
	

	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

    if ((SR_NULL == ops) || (SR_NULL == ops->get_netlink_sta))
    {
        return SR_NOIMPT;
    }

    
    return ops->get_netlink_sta(dev, simId,linkSta);

}

int SR_HalNetGetPdpSta(SR_NETDEV_T *dev, uint8_t simId,SR_PDP_STA_E *pdpSta)
{
	if( (SR_NULL == dev) || (SR_NULL == pdpSta) || (simId > 1)) return SR_INVALID;
		

	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

	if ((SR_NULL == ops) || (SR_NULL == ops->get_pdp_sta))
	{
		return SR_NOIMPT;
	}

	
	return ops->get_pdp_sta(dev, simId,pdpSta);
}



int SR_HalNetSwitch(SR_NETDEV_T *dev,uint8_t simId,SR_NET_SW_E opt)
{
	if( (SR_NULL == dev) || (simId > 1)) return SR_INVALID;
		
	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

	if ((SR_NULL == ops) || (SR_NULL == ops->net_switch))
	{
		return SR_NOIMPT;
	}

	return ops->net_switch(dev, simId,opt);
}

#else
#include "sr_osal.h"
//裸机环境
int _HalNetSwitch(SR_NETDEV_T *dev,uint8_t simId,SR_NET_SW_E opt)
{
	int ret = 0;
	SR_GET_CT();
		
	if( (SR_NULL == dev) || (simId > 1)) return SR_INVALID;
		
	SR_NETDEV_OM_OPS_T *ops = (SR_NETDEV_OM_OPS_T *)dev->devomOps;

	if ((SR_NULL == ops) || (SR_NULL == ops->net_switch)) return SR_NOIMPT;

	SR_CT_BEGIN();

	SR_CT_CHILD_RET(ret,ops->net_switch(dev, simId,opt));

	return ret;

	SR_CT_END();
}



#endif


