#ifndef __PV_PCS_H__
#define __PV_PCS_H__

#include <syslog.h>
#include "ipc_session.h"
#include "mqtt_session.h"
#include "lnxall_list.h"
#include "dy_utils/dy_common.h"
#include "dy_utils/dy_ds.h"
#include "dy_utils/kv_array.h"
#include "dy_utils/dy_ipc.h"
#include "dy_utils/dy_can.h"
#include "dy_utils/modbus_utils.h"
#include "dy_utils/period_service.h"
#include "modbus/modbus.h"
#include "dy_utils/bitmap.h"

#include "my_public.h"

#define DEV_NODE_NAME_LEN 16
#define PCS_MI 12323

#define POWER_UNIT_VAL 10

#define PCS_OFF_SET close_set
#define PCS_OPEN_SET open_set
#define PCS_CHARGING_POWER_SET charge_power_set
#define PCS_DISCHARG_POWER_SET dischargingset
#define PCS_DISCONNECT_NET_SET discharge_power_set
#define PCS_CONNECT_NET_SET connect_net_set
#define PCS_FAULT_ALARM pcs_fault_alarm

typedef enum pcs_charge_mode_e{
    PCS_CHAREG_MODE_CONSTANT_CURR=1,
    PCS_CHAREG_MODE_CONSTANT_VOL,
    PCS_CHAREG_MODE_CONSTANT_POWER,
}PCS_CHARGE_MODE_E;

typedef enum pcs_charge_state_e
{
    E_IDLE,
    E_CHARGE_DOING,
    E_DISCHARING
} PCS_CHARGE_STATE_E;


typedef struct pcs_type_operate_s
{
    USHORT onOff;
    USHORT open;
    USHORT close;
    USHORT enable;
    USHORT disable;
} PCS_TYPE_OPERATE_T;

typedef struct pcs_dev_info_s
{
    BYTE state;
    BYTE connect;
    BYTE conenable;
    BYTE errState;
    BYTE pcsChargeState;
    WORD maxChargeP;
    WORD maxDischarP;
    double yggl;
    double wggl;
} PCS_DEV_INFO_T;

typedef struct tag_node_s
{
    CHAR name[DEV_NODE_NAME_LEN];
    CHAR tag[DEV_NODE_NAME_LEN];
} TAG_NODE_T;

typedef struct tag_node_info_s
{
    BYTE nodecont;
    TAG_NODE_T *ptagNode;
} TAG_NODE_INFO; 

typedef struct service_info_s
{
    CHAR identifier[IDENTIFIER_LEN];
    CHAR inidentifier[IDENTIFIER_LEN];
    CHAR name[DEV_NODE_NAME_LEN];
    TAG_NODE_INFO tagNode;
} SERVICE_INFO_T;

typedef struct dev_node_cfg_s
{
    CHAR devSn[SN_MAX_LEN];
    CHAR type[DEV_NODE_NAME_LEN];
    CHAR devgwSn[SN_MAX_LEN];
    PCS_DEV_INFO_T pcsInfo;
} DEV_NODE_CFG_T;

typedef struct dev_node_info_s
{
    DEV_NODE_CFG_T *pdevnodecfg;
    SERVICE_INFO_T *pserviceInfoUP;
    SERVICE_INFO_T *pserviceInfoDOWN;
    SERVICE_INFO_T *pserviceInfoTodev;
    BYTE servicetodevcont;
    BYTE serviceupcont;
    BYTE servicedowncont;
    BYTE devcont;
} DEV_NODE_INFO_T;

typedef struct service_pack_s
{
    WORD mi;
    WORD timestamp;
    CHAR devSn[SN_MAX_LEN];
    CHAR identifier[IDENTIFIER_LEN];
} SERVICE_PACK_T;

#define  PCS_TYPE_NUM 2 

typedef struct pv_pcs_var_s
{
    ipc_session_t *session;
    BYTE pcsType;
    CHAR desSn[SN_MAX_LEN];
    CHAR vir_sn_str[SN_MAX_LEN];
    CHAR sn_str[SN_MAX_LEN];
    SERVICE_PACK_T servInfo;
    DEV_NODE_INFO_T devNodeInfo;
    MQTT_INFO_T mqttInfo;
    PCS_TYPE_OPERATE_T pcs_type_operate[PCS_TYPE_NUM];
} pv_pcs_var_t;


#endif