/**
 *@file sr_netdev_om.h
 *@brief 网卡设备运维功能抽象接口
 *@details 提供网卡设备运维相关枚举、结构体、API声明
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author Lierda-RDC
 *@date 2024-04-01
 *@example ZhaoyangSDK\example\pal\hal\netdev_om_example.c
 */

#ifndef _SR_NETDEV_OM_H
#define _SR_NETDEV_OM_H

#include "sr_netdev.h"


#if  0
typedef enum
{
    SR_CFUN_LEVEL_MIN  = 0u,  /*!<AT+CFUN=0  最小功能模式，飞行模式，关闭RF、USIM卡 */
    SR_CFUN_LEVEL_FULL = 1u,  /*!<AT+CFUN=1  全功能模式，退出飞行模式 */
    SR_CFUN_LEVEL_AIR  = 4u,  /*!<仅关闭RF射频 */

}SR_CFUN_LEVEL_E;
#endif





#define SR_NET_CELL_MAX_NUM 9  /*!<邻近小区信息最大保存数量 */


/**
 * @brief 小区信息数据结构体
 */
typedef struct SR_CELL_INFO
{
   uint32_t cid;       /*!<Cell ID, (0 indicates information is not represent).*/
   uint16_t mcc;       /*!<This field should be ignored when cid is not present*/
   uint16_t mnc;       /*!<This field should be ignored when cid is not present*/
   uint16_t tac;       /*!<Tracing area code (This field should be ignored when cid is not present). */
   uint16_t pci;       /*!<Physical cell ID. Range: 0 to 503. */
   uint32_t earfcn;    /*!<E-UTRA absolute radio frequency channel number of the cell. RANGE: 0 TO 65535. */
   int16_t  rssi;      /*!<Receive signal strength, Value range: rsrp-140 for dbm format */
   int16_t  rsrp;      /*!<参考信号接收质量，用于 LTE 制式下*/
   int16_t  rsrq;      /*!<参考信号接收功率，用于 LTE 制式下*/
   int16_t  snr;       /*!<信噪比*/
   uint8_t  band;      
} SR_CELL_INFO_T;



/**
 * @brief 小区信息存储结构体
 */
typedef struct SR_NET_CELL_INFO 
{ 
	SR_CELL_INFO_T  srvInfo;     /*!<服务小区信息  */
    SR_CELL_INFO_T  nbrInfo[SR_NET_CELL_MAX_NUM]; /*!<邻近小区信息  */
	uint8_t         nbrInfoNum;  /*!<邻近小区信息的数量*/
	
} SR_NET_CELL_INFO_T;




/**
 * @brief 网络信号强度结构体
 */
typedef struct SR_NET_SGN_STRENG
{ 
    int16_t rssi;		  /*!< Receive signal strength*/
	int16_t rsrp;         /*!<参考信号接收质量，用于 LTE 制式下*/
	int16_t rsrq;         /*!<参考信号接收功率，用于 LTE 制式下*/
	int16_t snr;          /*!<信噪比*/
	
} SR_NET_SGN_STRENG_T;


/**
 * @brief 模组固件版本结构体
 */
typedef struct SR_MODULE_FW_VER
{
    srSize_t lineCounts;     /*!< The number of lines of firmware version information */
    char    **ver_info;      /*!< The text of the firmware version information */
} SR_MODULE_FW_VER_T;


/**
 * @brief CFUN模式枚举
 */
typedef enum
{
    SR_CFUN_MODE_FLY    = 0u,   /*!<AT+CFUN=0  进入飞行模式 */
    SR_CFUN_MODE_FULL   = 1u,   /*!<AT+CFUN=1  全功能模式，退出飞行模式 */
    SR_CFUN_MODE_MAX
}SR_CFUN_MODE_E;


/**
 * @brief SIM卡状态枚举
 */
typedef enum 
{
	SR_SIM_READY   = 0,  /*!<SIM卡正常工作*/
	SR_SIM_NO_EXIST,     /*!<SIM卡不存在*/
	SR_SIM_NEED_PIN,     /*!<SIM卡需要输入PIN码*/
}SR_SIM_STATUS_E;


/**
 * @brief 网络注册状态枚举
 */
typedef enum 
{
	SR_NET_REG_UNREGISTER = 0,       /*!< 网络未注册*/
	SR_NET_REG_REGISTERED,           /*!< 网络已注册*/
	SR_NET_REG_SEARCHING,            /*!< 网络搜索中*/
	SR_NET_REG_DENIED,  	         /*!< 网络注册被拒绝*/
	SR_NET_REG_UNKNOW,		         /*!< 网络状态未知*/
	SR_NET_REG_REGISTERED_ROAMING, 	 /*!< 网络已注册，漫游*/
	
}SR_NET_REG_STA_E;


/**
 * @brief PDP状态枚举
 */
typedef enum 
{
	SR_PDP_UNACTIVED = 0,    /*!< PDP未激活*/
	SR_PDP_ACTIVED   = 1,    /*!< PDP已激活*/
}SR_PDP_STA_E;


/**
 * @brief 核心网连接状态枚举
 */
typedef enum 
{
	SR_NET_LINK_OFF = 0,   /*!< 断网*/  
	SR_NET_LINK_ON,	       /*!< 已联网*/
}SR_NET_LINK_STA_E;
	

/**
 * @brief CSCON RRC状态枚举
 */
typedef enum 
{
	SR_CSCON_RRC_IDLE = 0,      /*!< 空闲*/
	SR_CSCON_RRC_ACTIVDE,	    /*!< 已激活*/  
}SR_CSCON_RRC_STA_E;


/**
 * @brief 网卡运维事件枚举
 * 
 */
typedef enum SR_NET_EVENT
{
    SR_NET_EVT_CFUN = 0,            /*!< CFUN消息事件 */
    SR_NET_EVT_SIM,                 /*!< SIM卡消息事件*/
    SR_NET_EVT_REGSTA,              /*!< 移动网络注册消息事件*/
    //SR_NET_EVT_CELL_INFO,         /*!< 预留：小区基站信息和网络信号变更消息事件*/  
    SR_NET_EVT_PDP,                 /*!< PDP状态消息事件*/
    SR_NET_EVT_LINK,                /*!< 核心网连接状态消息事件*/
    SR_NET_EVT_CSCON,               /*!< RRC状态消息事件，0 idle 1 active*/
}SR_NET_EVENT_E;

/**
 * @brief 网络开关操作枚举
 */
typedef enum 
{
    SR_NET_CLOSE = 0,	  /*!< 关闭网路*/
	SR_NET_OPEN = 1,      /*!< 打开网络*/
  
}SR_NET_SW_E;


/**  
* @brief 网卡运维事件回调函数类型
*   
* @param[in] args    用户参数
* @param[in] event   产生的网卡运维事件 
* @param[in] index   索引，不同事件含义不同。目前SIM卡事件中表示sim卡id
* @param[in] status  状态码，不同事件含义不同
*  
* @return 无 
*/
typedef void (*NetdevEvtCb)(void *args,SR_NET_EVENT_E event, uint8_t index, uint8_t status);


/**
 * @brief netdev 底层运维操作函数集合
 */
typedef struct SR_NETDEV_OM_OPS 
{
	int (*get_imei)(SR_NETDEV_T *dev, uint8_t simId, char *value, srSize_t len);
    int (*get_imsi)(SR_NETDEV_T *dev, uint8_t simId, char *value, srSize_t len);
    int (*get_iccid)(SR_NETDEV_T *dev, uint8_t simId, char *value, srSize_t len);	
    int (*get_cfun)(SR_NETDEV_T *dev, uint8_t simId, SR_CFUN_MODE_E *cfunMode);
    int (*set_cfun)(SR_NETDEV_T *dev, uint8_t simId, SR_CFUN_MODE_E cfunMode);
    int (*get_cell_info)(SR_NETDEV_T *dev, uint8_t simId,SR_NET_CELL_INFO_T *cellInfo);
	int (*get_signal_streng)(SR_NETDEV_T *dev,uint8_t simId,SR_NET_SGN_STRENG_T *streng);
	int (*get_net_reg_sta)(SR_NETDEV_T *dev, uint8_t simId,SR_NET_REG_STA_E *regSta);
	int (*check_sim_ready)(SR_NETDEV_T *dev, uint8_t simId);
	int (*get_netlink_sta)(SR_NETDEV_T *dev, uint8_t simId,SR_NET_LINK_STA_E *linkSta);
	int (*get_pdp_sta)(SR_NETDEV_T *dev, uint8_t simId,SR_PDP_STA_E *pdpSta);
    int (*net_switch)(SR_NETDEV_T *dev, uint8_t simId,SR_NET_SW_E opt);

    //int (*get_gm_time)(SR_NETDEV_T *dev, struct tm *l_tm);
    //int (*get_firmware_version)(SR_NETDEV_T *dev, SR_MODULE_FW_VER_T *version);

} SR_NETDEV_OM_OPS_T;




/********************************************网卡设备运维抽象接口************************************************************/
/**  
* @brief 获取当前网卡设备的国际移动设备识别码（IMEI）。 
*  
* @param[in] dev     网卡设备对象指针。  
* @param[in] simId   SIM卡ID。[0,1]
* @param[out] buf    指向字符数组的指针，用于存储获取的IMEI值。  
* @param[in] len     指定字符数组的长度。>=15
*
* @return 返回操作结果，成功返回0，失败返回负值错误码。  
*/  
int SR_HalNetGetImei(SR_NETDEV_T *dev, uint8_t simId,char *buf, srSize_t len);

/**  
* @brief 获取当前网卡设备的国际移动用户识别码（IMSI）。  
*
* @param[in] dev    网卡设备对象指针。 
* @param[in] simId  SIM卡ID。 [0,1]
* @param[out] buf   指向字符数组的指针，用于存储获取的IMSI值。  
* @param[in] len    指定字符数组的长度。 >=15
*
* @return 返回操作结果，成功返回0，失败返回负值错误码。  
*/ 
int SR_HalNetGetImsi(SR_NETDEV_T *dev, uint8_t simId,char *buf, srSize_t len);


/**  
* @brief 获取当前网卡设备的集成电路卡识别码（ICCID）。 
* 
* @param[in] dev    网卡设备对象指针。
* @param[in] simId  SIM卡ID。[0,1]
* @param[out] buf   指向字符数组的指针，用于存储获取的ICCID值。  
* @param[in] len    指定字符数组的长度。 >=20
*  
* @return 返回操作结果，成功返回0，失败返回负值错误码。  
*/  
int SR_HalNetGetIccid(SR_NETDEV_T *dev,uint8_t simId, char *buf, srSize_t len);



/**  
* @brief 设置网卡设备运维事件回调接口
*   
* @param[in] dev   网卡设备对象指针
* @param[in] cb    网络事件回调函数
* @param[in] args  回调函数的参数
*  
* @return 成功返回0，失败返回负值错误码
*/ 
int SR_HalNetSetEvtCb(SR_NETDEV_T *dev,NetdevEvtCb cb,void *args);

/**  
* @brief 获取CFUN功能模式 
*
* @param[in] dev       网卡设备对象指针。 
* @param[in] simId     SIM卡ID。 [0,1]
* @param[out] cfunMode cfun模式读取取值(飞行、全功能) 
*
* @return 返回操作结果，成功返回0，失败返回负值错误码。  
*/
int SR_HalNetGetCfun(SR_NETDEV_T *dev, uint8_t simId, SR_CFUN_MODE_E *cfunMode);

/**  
* @brief 设置CFUN功能模式
*
* @param[in] dev      网卡设备对象指针。 
* @param[in] simId    SIM卡ID。 [0,1]
* @param[in] cfunMode 待设置的cfun模式(飞行、全功能) 
*     
* @return 返回操作结果，成功返回0，失败返回负值错误码。  
*/
int SR_HalNetSetCfun(SR_NETDEV_T *dev, uint8_t simId,SR_CFUN_MODE_E cfunMode);


/**  
* @brief 获取基站cell信息     
*  
* @param[in] dev       网卡设备对象指针。
* @param[in] simId     SIM卡ID。 [0,1]  
* @param[out] cellInfo 指向cell信息的结构体指针。  
*
* @return 返回操作结果，成功返回0，失败返回负值错误码。  
*/  
int SR_HalNetGetCellInfo(SR_NETDEV_T *dev, uint8_t simId,SR_NET_CELL_INFO_T *cellInfo);



/**  
* @brief 获取无线信号强度信息   
*
* @param[in] dev       网卡设备对象指针。
* @param[in] simId     SIM卡ID。 [0,1]  
* @param[out] streng   指向信号强度的结构体指针。  
*
* @return 返回操作结果，成功返回0，失败返回负值错误码。  
*/ 
int SR_HalNetGetSgnStreng(SR_NETDEV_T *dev,uint8_t simId,SR_NET_SGN_STRENG_T *streng);


/**  
* @brief 获取核心网注册状态  
*
* @param[in] dev      网卡设备对象指针。  
* @param[in] simId    SIM卡ID。[0,1]   
* @param[out] regSta  指向网络注册状态的结构体指针。  
*
* @return 返回操作结果，成功返回0，失败返回负值错误码。  
*/ 
int SR_HalNetGetRegSta(SR_NETDEV_T *dev, uint8_t simId,SR_NET_REG_STA_E *regSta);


/**  
* @brief 检测sim开ready状态   
*
* @param[in] dev     网卡设备对象指针。  
* @param[in] simId   SIM卡ID。[0,1] 
*
* @return 返回sim卡准备状态，ready ok返回0，未准备好返回-1。  
*/ 
int SR_HalNetCheckSimReady(SR_NETDEV_T *dev, uint8_t simId);


/**  
* @brief 获取核心网连接状态   
*
* @param[in] dev       网卡设备对象指针。  
* @param[in] simId     SIM卡ID。[0,1]   
* @param[out] linkSta  指向核心网连接状态的结构体指针。  
* 
* @return 返回操作结果，成功返回0，失败返回负值错误码。  
*/  
int SR_HalNetGetLinkSta(SR_NETDEV_T *dev, uint8_t simId,SR_NET_LINK_STA_E *linkSta);


/**  
* @brief 获取PDP上下文状态  
*
* @param[in] dev       网卡设备对象指针。  
* @param[in] simId     SIM卡ID。 [0,1]  
* @param[out] pdpSta   指向pdp状态的结构体指针。  
*
* @return 返回操作结果，成功返回0，失败返回负值错误码。  
*/
int SR_HalNetGetPdpSta(SR_NETDEV_T *dev, uint8_t simId,SR_PDP_STA_E *pdpSta);



/**  
* @brief 网卡设备关机 
*
* @param[in] dev       网卡设备对象指针。    
*
* @return 返回操作结果，成功返回0，失败返回复制错误码。  
*/
int SR_HalNetPoweroff(SR_NETDEV_T *dev);

/**  
* @brief 网卡设备开机
*
* @param[in] dev       网卡设备对象指针。    
*
* @return 返回操作结果，成功返回0，失败返回复制错误码。  
*/
int SR_HalNetPoweron(SR_NETDEV_T *dev);





int _HalNetSwitch(SR_NETDEV_T *dev,uint8_t simId,SR_NET_SW_E opt);


#ifdef SR_USE_OS


#else
/**  
* @brief 网络开关切换操作  
*
* @param[in] dev       网卡设备对象指针。  
* @param[in] simId     SIM卡ID。 [0,1]  
* @param[out] opt      网络开关操作枚举。  
*
* @return 返回操作结果，成功返回0，失败返回复制错误码。  
*/
#define SR_HalNetSwitch(dev,simId,opt)	SR_CT_CHILD(_HalNetSwitch(dev,simId,opt))


#endif





#endif

