/**
* @file CM_TCP.h
* @brief TCP通信的封装
* @author GT-BU
* @date 2022.03.29
* @version V1.1
* @copyright TCT
* @par 修改日志
* <table>
* <tr><th>Date        <th>Version  <th>Author     <th>Description
* <tr><td>2017.12.20  <td>V1.0     <td>MSCP项目组 <td>创建初始版本
* <tr><td>2021.02.01  <td>V1.1     <td>GT-BU      <td>TSCP项目集成、更新
* </table>
*/
#ifndef CM_TCP_H
#define CM_TCP_H

#include "CM_Socket.h"
#include "CM_Mutex.h"

#ifdef VXWORKS
#include <ioLib.h>
#endif
#ifdef __cplusplus
extern "C"
{
#endif /**< __cplusplus */

#define CM_TCP_BUFERSIZE (1024 * 8)

	/*定义TCP套接字状态*/
	typedef enum
	{
		ENUM_CM_NOCREATE = 0u,	/**< 未创建 */
		ENUM_CM_NOCONN 	 = 1u ,  /**< 已创建，未连接 */
		ENUM_CM_CONNFAIL = 2u ,	/**< 已创建，连接失败 */
		ENUM_CM_CONNECTED = 3u ,	  /**< 已创建，连接成功 */
		ENUM_CM_CLOSED 	 = 4u 	/**< 已断开连接，待创建 */
	}ENUM_CM_TCPSTATE;

	/*定义TCP套接字相关信息*/
	typedef struct
	{
		CM_UINT16 TcpId;	/**< TcpId */
		CM_SOCKET TcpSock;/**< Tcp套接字 */
		CM_UINT32 TcpState;/**< Tcp状态 */
		CM_UINT32 TcpServerIp;/**< Tcp服务端ip */
		CM_UINT16 TcpServerPort;	/**< Tcp服务端端口号 */
		CM_MUTEX_T mutex;       /**< 互斥信号量，用来保护套接字相关信息 */
	}STRU_TCP_MSG;
	
    /**
    * @brief CM_TCP_Init
    *
    * TCP初始化，仅需初始化一次.
    * @return ENUM_CM_RETURN
    */
    ENUM_CM_RETURN CM_TCP_Init(void);

	/**
	* @brief TCP套接字相关信息插入或更新
	* @param tcpId tcpid用以映射，不能为0
	* @param TcpSock 套接字，不能为0
	* @param TcpState 套接字状态，不能为0
	* @param TcpServerIp 服务端IP地址，不能为0
	* @param TcpServerPort 服务端端口号，不能为0
	* @preturn 插入结果
	* - ENUM_CM_TRUE 查询成功
	* - ENUM_CM_FALSE 查询失败
	*/
    ENUM_CM_RETURN CM_TCP_MsgIstOrUpd(IN CM_UINT16 tcpId, IN CM_SOCKET TcpSock, IN CM_UINT32 TcpState, IN CM_UINT32 TcpServerIp, IN CM_UINT16 TcpServerPort);

	/**
	* @brief TCP套接字相关信息更新
	* @param tcpId tcpid用以映射，不能为0
	* @param TcpState 套接字状态，不能为0
	* @preturn 插入结果
	* - ENUM_CM_TRUE 查询成功
	* - ENUM_CM_FALSE 查询失败
	*/
	ENUM_CM_RETURN CM_TCP_Msgstate_Update(IN CM_UINT16 tcpId, IN CM_UINT32 TcpState);


	/**
	* @brief TCP套接字查询
	* @param tcpId tcpid用以映射，不能为0
	* @param pTcpState TCP状态
	* @preturn 查询结果
	* - ENUM_CM_TRUE 查询成功
	* - ENUM_CM_FALSE 查询失败
	*/
	ENUM_CM_RETURN CM_TCP_Msgstate_Query(IN CM_UINT16 tcpId, INOUT CM_SOCKET *pTcpSock,INOUT CM_UINT32 *pTcpState,INOUT CM_UINT32 *pTcpServerIp,INOUT CM_UINT16 *pTcpServerPort );


	/**
	* @brief TCP套接字选项设置
	* @param pSock TCP套接字
	* @preturn 设置结果
	* - ENUM_CM_TRUE 设置成功
	* - ENUM_CM_FALSE 设置失败
	*/
	ENUM_CM_RETURN CM_TCP_SetSockOpt(IN CM_SOCKET *pSock);

	/**
	* @brief 宕机情况下，关闭所有TCP连接
	* @return 关闭结果
	* - ENUM_CM_TRUE 成功
	* - ENUM_CM_FALSE 失败
	*/
	ENUM_CM_RETURN CM_TCP_Socket_Close_shutdown(void);

	/**
	* @brief 关闭TCP socket，并且更新Tcp_Message结构信息
	* @param tcpId tcpid用以映射，不能为0
	* @param TcpState Tcp状态标志
	* @return 关闭结果
	* - ENUM_CM_TRUE 成功
	* - ENUM_CM_FALSE 失败
	*/
	ENUM_CM_RETURN CM_TCP_Socket_Close(IN CM_UINT16 tcpId, IN CM_UINT32 TcpState);


	/**
	* @brief 创建TCP socket
	* @param pSock socket指针
	* @param ServeraddrIP 服务端IP地址
	* @param ServerportNumber 服务端端口号
	* @param tcpId tcpid用以映射，不能为0
	* @return 创建结果
	* - ENUM_CM_TRUE 创建成功
	* - ENUM_CM_FALSE 创建失败
	*/
	ENUM_CM_RETURN CM_TCP_Socket_Create(INOUT CM_SOCKET *pSock, IN CM_UINT32 ClientaddrIP, IN CM_UINT16 ClientPort,IN CM_UINT16 tcpId , IN CM_UINT32 ServeraddrIP, IN CM_UINT16 ServerPort);
	/**
	* @brief TCP建立连接
	* @param tcpId tcpid用以映射，不能为0
	* @param time_out 连接超时时间
	* @return 连接结果
	* - ENUM_CM_TRUE 成功
	* - ENUM_CM_FALSE 失败
	*/
	ENUM_CM_RETURN CM_TCP_Socket_Connect(IN CM_UINT16 tcpId, IN CM_UINT32 time_out);

	/**
	* @brief TCP发送
	* @param tcpId tcpid用以映射，不能为0
	* @param pBuf 发送报文指针
	* @param bufSize 发送报文长度
	* @return 发送结果
	* - ENUM_CM_TRUE 成功
	* - ENUM_CM_FALSE 失败
	*/
	ENUM_CM_RETURN CM_TCP_Send_Msg(IN CM_UINT16 tcpId, IN const CM_UINT8 pBuf[], IN CM_INT32 bufSize);
	/**
	* @brief TCP接收消息查找完整帧
	* @param pBuf tcp消息Buf
	* @param bufSize buf长度
	* @param pFullFrameSize 完整帧长度
	* @preturn 完整包结果
	* - ENUM_CM_TRUE 有完整帧
	* - ENUM_CM_FALSE 没有完整帧
	*/
	ENUM_CM_RETURN CM_TCP_Find_Full_Frame(IN CM_UINT8 pBuf[], IN CM_INT32 bufSize, INOUT CM_INT32 *pFullFrameSize);

	/**
	* @brief TCP接收
	* @param tcpId tcpid用以映射，不能为0
	* @param pBuf 接收报文指针
	* @param bufSize 接收报文长度
	* @return 收到报文长度
	* - 正整数 收到的报文长度
	* - 0 未收到报文
	* - -1 接收异常
	* - -2 参数检查不合法
	*/
	CM_INT32 CM_TCP_Recv_Msg(IN CM_UINT16 tcpId, INOUT CM_UINT8 pBuf[], IN CM_INT32 bufSize);
#ifdef __cplusplus
}

#endif /**< __cplusplus */

#endif /**< _CM_UDP_H */

