#ifndef __PCS_DEV__
#define __PCS_DEV__

#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 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

#define PCS_CHARGE_NAME_TAG 0x4E92
#define PCS_OPEN_NAME_TAG 0x4EAE
#define PCS_CLOSE_NAME_TAG 0x4EAF
#define PCS_CONNECT_NET_TAG 0x4EB1
#define PCS_DISCONNECT_NET_TAG 0x4EB2
#define PCS_DEV_OFFSET 400

#define PCS_POWER_EQ_SET_NUM 30

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 on;
    USHORT off;
    USHORT remote;
    USHORT open;
    USHORT close;
    USHORT reset;
} PCS_TYPE_OPERATE_T;

typedef struct pcs_dev_info_s
{
    BYTE state;
    BYTE connect;
    BYTE conenable;
    BYTE errState;
    BYTE pcsChargeState;
    BYTE cont;
    WORD maxChargeP;
    WORD maxDischarP;
    WORD yggl;
    WORD 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 pcs_dev_var_s
{
    ipc_session_t *session;
    nodes_cfg_table_t *nodes_cfg_table; // 节点信息
    template_table_t *template_table;   // 模板信息
    object_table_t *object_table;
    BYTE runMode;
    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];
} pcs_dev_var_t;

static int pcs_dev_report_alarm(pcs_dev_var_t *var, CHAR *identifier);
static int publish_to_dev_data(ipc_session_t *session, char *sn, unsigned char *data, int len, char *desSn, char *porttype);
#endif