/** 
* @file      xieneng_car_comm.h 
* @brief     description about xieneng car BMS
* @details  e.g. xieneng CAR BMS
* @author   xianpeng.zhao@lnxall.com
* @date     2020.03.25
* @version  A001 
* @par Copyright (c):  
*       LNXALL
* @par History:          
*   version: draft\n 
*/  
#ifndef __XIENENG_CAR_COMMON_H
#define __XIENENG_CAR_COMMON_H

/***************HEADER FILES****************/
#include <string.h>
#include <syslog.h>
#include "ipc_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/dy_db.h"
#include "dy_utils/modbus_utils.h"
#include "dy_utils/period_service.h"
#include "dy_utils/hash_intptr.h"
/******************************************/

uint64_t uptime_msec(uint64_t * upt);
time_t ess_uptime(time_t * timp, unsigned int * msec);

#define BSWAP_8(x)  ((x) & 0xff)
#define BSWAP_16(x) ((BSWAP_8(x) << 8) | BSWAP_8((x) >> 8))
#define BSWAP_32(x) ((BSWAP_16(x) << 16) | BSWAP_16((x) >> 16))
#define BSWAP_64(x) ((BSWAP_32(x) << 32) | BSWAP_32((x) >> 32))

struct ess_info_var;
struct ess_caninfo;
typedef int (* ess_parse_func)(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

struct ess_caninfo {
    unsigned int            msgid;          /* fixed message ID for comparison */
    const char *            tagname;        /* static allocated TAG NAME */
    unsigned int            canport;        /* CAN0/CAN1 */
    char                    devsn[SN_MAX_LEN]; /* 设备SN */
    ess_parse_func          parse_func;     /* parse function */
    struct can_frame        canfrm;         /* CAN frame */
    int32_t                 period;         /* period in milliseconds */
    uint32_t                lastper;        /* last periodic data report, in seconds */
    uint64_t                count;          /* update counter */
    uint64_t                lastup;         /* last update timestamp in boot-time, milliseconds */
};

#define ESS_DATA_VALIDTIME  5000 /* 5 seconds */
#define ESS_CSC_MAX         5
#define ESS_UCELL_NUM       19
#define ESS_UCELL_MSGID     0x0F11EE41
#define ESS_TCELL_NUM       3
#define ESS_TCELL_MSGID     0x0F12EE41

/*******************STRUCTURE**************/
typedef struct ess_info_var {
    unsigned int            num_can;        /* number of `ess_caninfo */
    struct ess_caninfo    * caninfp;        /* ess_caninfo pointers */
    struct ess_caninfo    * ucell[ESS_CSC_MAX];
    struct ess_caninfo    * tcell[ESS_CSC_MAX];
    struct hash_intptr    * canhash;        /* CAN hash pointers */
    pthread_mutex_t         ess_lock;       /* lock for multiple thread access */

    ipc_session_t* session; //内部broker的MQTT client，用于进程间通信
    nodes_cfg_table_t *nodes_cfg_table; //节点信息
    template_table_t *template_table; //模板信息
    period_service_t *period;
    can_cfg_t *can_cfg;
    char sn_str[SN_MAX_LEN];
    char proc_name[PROGRAM_NAME_LEN];
    dev_status_table_t *ds; //下挂节点的状态信息
    int node_status_timer;
    int period_poll_timer;
    time_t nodes_status_sync_date;
} ess_info_var_t;

/******************************************/
int ess_parse_S2A_ALARM(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_hardwarefault(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_gaojingxinxi(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_dantixinxi(struct ess_caninfo * ci,
	struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_S2A_SUMDATA1(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_S2A_SUMDATA2(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_zhuangtai(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_S2A_SUMDATA3(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_S2A_SUMDATA4(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_rackxinxi(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_Read1001_100B(struct ess_caninfo * ci,
	struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_ClusterTotal(struct ess_caninfo * ci,
	struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_ClusterSystem(struct ess_caninfo * ci,
	struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_Cluster_charge_discharge(struct ess_caninfo * ci,
	struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_S2A_SUMDATA5(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_S2A_SUMDATA6(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_S2A_SUMDATA8(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_S2A_LiquidInfo(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_S2A_DryContact(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_S2P_Detail_Ucell1(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell2(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell3(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell4(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell5(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell6(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell7(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell8(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell9(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell10(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell11(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell12(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell13(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell14(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell15(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell16(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell17(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell18(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);
int ess_parse_S2P_Detail_Ucell19(struct ess_caninfo * ci,
    struct ess_info_var * varp,void * * pretval, int flags);

int ess_parse_S2P_Detail_Tcell1(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_S2P_Detail_Tcell2(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_S2P_Detail_Tcell3(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_M2S_CMD1(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_M2S_CMD2(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_P2S_CMD(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_dummy(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_ALARM_STATUS(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_READ_TEMP(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_READ_ON(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_READ1(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);
int ess_parse_READ2(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_ucell(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

int ess_parse_tcell(struct ess_caninfo * ci,
    struct ess_info_var * varp, void * * pretval, int flags);

#define ESS_CELL_MAX_NUM	18
#endif /* __XIENENG_CAR_COMMON_H */
