/*
 * Module_PowerSharing.h
 *
 *  Created on: 2020/12/07
 *      Author: foluswen
 */

#ifndef MODULE_POWERSHARING_H_
#define MODULE_POWERSHARING_H_

#include 	<sys/time.h>
#include 	<sys/timeb.h>
#include    <sys/types.h>
#include    <sys/stat.h>
#include 	<sys/types.h>
#include 	<sys/ioctl.h>
#include 	<sys/socket.h>
#include 	<sys/ipc.h>
#include 	<sys/shm.h>
#include 	<sys/shm.h>
#include 	<sys/mman.h>
#include 	<linux/wireless.h>
#include 	<arpa/inet.h>
#include 	<netinet/in.h>

#include 	<unistd.h>
#include 	<stdarg.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <unistd.h>
#include    <fcntl.h>
#include    <termios.h>
#include    <errno.h>
#include 	<errno.h>
#include 	<string.h>
#include	<time.h>
#include	<ctype.h>
#include 	<ifaddrs.h>
#include 	<sys/types.h>
#include 	<sys/socket.h>
#include 	<netinet/in.h>
#include 	<netdb.h>
#include 	<error.h>
#include 	<signal.h>
#include	"define.h"

//#define DEBUG
#define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)), __LINE__, __FUNCTION__, ##args)
#define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)), __LINE__, __FUNCTION__, ##args)
#define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)), __LINE__, __FUNCTION__, ##args)

#define DEBUG_INFO_CLIENT(format, args...) StoreLogMsgClient("[%s:%d][%s][Info] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)), __LINE__, __FUNCTION__, ##args)
#define DEBUG_WARN_CLIENT(format, args...) StoreLogMsgClient("[%s:%d][%s][Warn] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)), __LINE__, __FUNCTION__, ##args)
#define DEBUG_ERROR_CLIENT(format, args...) StoreLogMsgClient("[%s:%d][%s][Error] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)), __LINE__, __FUNCTION__, ##args)

#define is_error(ptr) 					((unsigned long)ptr > (unsigned long)-4000L)
#define ARRAY_SIZE(A)					(sizeof(A) / sizeof(A[0]))
#define PASS							1
#define FAIL			   				-1
#define ON								1
#define OFF								0
#define YES								1
#define NO								0


#define LISTEN_PORT_TCP					118
#define	CONNECTION_LIMIT				5
#define TIMEOUT_SPEC_HEARTBEAT			180
#define INTERVAL_SPEC_CHECK_CAPACITY	10
#define INTERVAL_SPEC_POLLING_CMD		1
#define SHARE_MIN_AC					6
#define SHARE_MIN_DC					6

#define ShmPowerShargingKey			LISTEN_PORT_TCP+8000

enum SHARING_COMMAND
{
	SHARING_CMD_GET_STATUS=0x01,
	SHARING_CMD_SET_CAPACITY=0x02,
	SHARING_CMD_CONNECTION_FULL=0xfd,
	SHARING_CMD_CHKSUM_ERROR=0xfe,
	SHARING_CMD_UNKNOWN=0xff
};

enum POWERSHARING_TIMER_IDX
{
	POWERSHARING_TMR_IDX_HEARTBEAT,
	POWERSHARING_TMR_IDX_GET_STATUS,
	POWERSHARING_TMR_IDX_SET_CAPACITY,
	POWERSHARING_TMR_IDX_CNT
};

enum GUN_TYPE
{
	GUN_TYPE_UNKNOWN=0,
	GUN_TYPE_CHAdeMO,
	GUN_TYPE_CCS,
	GUN_TYPE_GBT,
	GUN_TYPE_DO,
	GUN_TYPE_AC
};

enum CONNECTOR_TYPE
{
	CONNECTOR_TYPE_AC=0,
	CONNECTOR_TYPE_AC_THREE,
	CONNECTOR_TYPE_DC
};

struct Message
{
	int			size;
	uint8_t		buffer[2048];
};

typedef struct CONNECTOR_INFO
{
	uint8_t 	connectorType;
	uint16_t	availableSharingCurrent;		// Each connector available sharing current, resolution: 1A
	uint16_t	presentOutputCurrent;			// Each connector preset output current, resolution: 1A
	uint16_t	SOC;							// Each connector preset SOC, resolution: 0.1%
	uint16_t	remindTime;						// Each connector remind charging time, resolution: 1min
	struct timespec	tmrCheckCapacity;			// Each connector check capacity timer
	uint8_t		isGunConnected:1;				// Each connection gun connected flag
}Connector_Info;

struct CONNECTION_INFO
{
	int 			socketFd;					// Socket file description
	int				connectorCount;				// Each connection connector count
	Connector_Info	connectorInfo[4];			// Connector info
	struct timespec	timer[POWERSHARING_TMR_IDX_CNT];

	uint8_t			isSocketConnected:1;		// Each connection socket connected flag
};

struct POWER_SHARING
{
	uint8_t					connectedConnectionQty;
	uint8_t					connectedConnectorQty;
	int32_t					onHandCurrent;
	struct CONNECTION_INFO	Connection_Info[CONNECTION_LIMIT];
	uint8_t					isDetectNewConnected:1;
};

#endif /* MODULE_POWERSHARING_H_ */