/**
 * @file        xieneng_can_supervisor.h
 * @brief
 * @details
 * @author      JHC
 * @date        2022-10-21
 * @version     V1.0
 * @copyright   Copyright (C) 2001-2022 BMSER Technology
********************************************************************************
 * @attention
 * 系统平台: LINUX4.15 \n
 * @par :
 * <table>
 * <tr><th>Date        <th>Version  <th>Author    <th>Description
 * <tr><td>2022-10-21  <td>1.0      <td>JHC  <td>
 * </table>
 *
********************************************************************************
*/
#ifndef XIENENG_CAN_SUPERVISOR_H_
#define XIENENG_CAN_SUPERVISOR_H_

/***************HEADER FILES****************/
#include <string.h>
#include <syslog.h>
#include "bmser_mqtt.h"
#include "can_base.h"
#include "xieneng_can_component.h"

/******************MACRO********************/
#define CAN_NODE_STATUS_BAK_FILE "/app/xieneng_can_status.bak"

#define SHAREMEM_PREFIX "/tmp/shm"
#define GET_RACK_ID_BROADCAST "get_rack_id_broadcast"
#define SET_RACK_ID_MANUALLY "set_rack_id_manually"
#define SWITCH_CAN_FRAMES_FILTER "switch_can_frames_filter"
#define SWITCH_TO_7FF_FRAMES "switch_to_7ff_frames"
#define SWITCH_TO_NORMAL_FRAMES "switch_to_normal_frames"
#define MAX_REG_CNT (64 * 1024)
#define L1 64
#define L2 1024
#define SRC_ID_LEN 64
#define REQUESTER_LEN 8
#define DATA_LEN 256
#define MAX_DEV_NUM (BMS_CFG_ROCKSNUM_MAX+1)  //一个BAU加最大簇数
#define SECOND_TIME 1000
#define SN_MAX_LEN 64

#define NB_CONNECTION 5
#define MAX_REG_SIZE 65536
#define RESERVE_SIZE 64
#define SHAREMEM_OFFSET RESERVE_SIZE/2
#define CACHE_INVALIDTION_TIME 30000

typedef enum e_totol_reg_type
{
    E_TOTAL_CFG_PARA, // 0
    E_TOTAL_SUMMARY_STATE,
    E_TOTAL_CRITICAL_STATE,
    E_TOTAL_CTRL_PARA,
    E_TOTAL_BCU_WARN_PARA,
    E_TOTAL_BCU_RECOVER_PARA,
    E_TOTAL_BCU_CFG_PARA,
    E_TOTAL_RESERVE
} E_TOTAL_REG_TYPE;


typedef enum e_master_reg_type
{
    E_MASTER_CTRL_PARA,
    E_MASTER_CFG_PARA,
    E_MASTER_SUMMARY_INFO,
    E_MASTER_SAMPLE_INFO,
    E_MASTER_CRITICAL_STATE,
    E_MASTER_WARN_PARA,
    E_MASTER_WARN_PARA_RECOVER,
    E_MASTER_RESERVE
} E_MASTER_RET_TYPE;

typedef enum e_can_option
{
    E_CAN_REVERD,
    E_CAN_WRITE,
    E_CAN_WRITE_REPLY,
    E_CAN_READ,
    E_CAN_READ_REPLY,
    E_CAN_ERR,
    E_CAN_INFO,
    E_CAN_INFO_REPLY,
} E_CAN_OPTION;

typedef enum e_can_bus_state
{
    E_CAN_BUF_STATE_IDLE,
    E_CAN_BUF_STATE_OK,
} E_CAN_BUS_STATE;
#define SLAVE_LAYER  1
#define MASTER_LAYER 2
#define TOTAL_LAYER  3
#define BDU_LAYER    5


#define L2_ADDR_MASK 0x3ff //0x1ff

#define L1_INDEX_OFFSET 10 //

typedef struct
{
    unsigned char devId;
    unsigned char in_use;
    unsigned char is_timeout;
    long long last_rcv;
} can_bus_state_t;


typedef struct
{
    struct mosquitto *session;          //内部broker的MQTT client，用于进程间通信
    //nodes_cfg_table_t *nodes_cfg_table; //节点信息
    //template_table_t *template_table;   //模板信息
    //can_cfg_t *can_cfg;
    char sn_str[SN_MAX_LEN];
    int period_poll_timer;
    int can_buf_state_timer;
    int cache_invalidtion_timer;
    period_table_t period_tables[MAX_CAN_PORT];
    can_bus_state_t can_bus_tables[MAX_DEV_NUM];
    int upgradeflag;
    unsigned int canObjId;
    pthread_mutex_t mutex; 
} xieneng_can_var_t;

/******************************************/
xieneng_can_var_t *get_xieneng_can_var();
//void get_lastUpgradeTime(uint64_t *time);
bool judgeSysIsUpdate(void);

#endif
