/** 
* @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 "modbus/modbus.h"
#include "sqlite3.h"
/******************************************/


/******************MACRO********************/
#define CAN_NODE_STATUS_BAK_FILE "/app/can_status.bak"
#define XIENENG_CAR_CFG_PATH "/app/config/xieneng_car.json"
#define XIENENG_CAR_DB_PATH "/app/xieneng_data.db"

#define MAX_LECU_CNT    256
#define MAX_FRAME_NUMBER    256
#define CAN_DATA_LEN       8

#define MODBUS_FC_SLAVE_CTRL_SET  0x30
#define MODBUS_FC_SLAVE_CTRL_GET  0x31
#define MODBUS_FC_BALANCE_CONF_SET   0x32
#define MODBUS_FC_BALANCE_CONF_GET   0x33

#define CURRENT_TRANSFORMER_CAN_ID 0x3C2


/******************************************************************************
	+─────────────+──────────+───────────────────────────────+
	| 字段名       | 类型     | 描述                          |
	+─────────────+──────────+───────────────────────────────+
	| id          | INTEGER  | 索引                          |
	+─────────────+──────────+───────────────────────────────+
	| slave_id    | INTERGER | 从控ID                        |
	+─────────────+──────────+───────────────────────────────+
	| time        | INTEGER  | 数据时间戳                     |
	+─────────────+──────────+───────────────────────────────+
	| data        | TEXT     | 数据                          |
    +─────────────+──────────+───────────────────────────────+
	| type        | INTEGER  | 类型（0：电压温度）            |
	+─────────────+──────────+───────────────────────────────+
******************************************************************************/
#define DATA_TABLE_CREATE \
    "id INTEGER PRIMARY KEY AUTOINCREMENT,"\
    "slave_id VARCHAR(64),"\
    "time INTEGER,"\
    "data BLOB," \
    "type INTEGER"

#define DATA_TABLE_NAME "data"

#define XIENENG_CAR_INSERT_SQL "INSERT INTO "DATA_TABLE_NAME" VALUES (NULL,?,?,?,?)"
#define XIENENG_CAR_DELETE_DATA_SQL "DELETE FROM "DATA_TABLE_NAME" WHERE time < ?"
#define XIENENG_CAR_PACK_DATABASE "VACUUM"

#define XIENENG_CAR_GET_DATA_SQL "SELECT * FROM "DATA_TABLE_NAME


/******************************************/


/*************ENUM*************************/
enum
{
    FUNC_BRIEF_INFO = 0, // CAN ID 2xx
    FUNC_DETAIL_INFO, // CAN ID 3xx
    FUNC_CONF_INFO, // CAN ID 4xx
    FUNC_CHARGE_CUR, // 充电电流 CAN ID 5xx
    FUNC_BALANCE_STATUS_731, // CAN ID 731, 均衡模块状态信息
    FUNC_BALANCE_STATUS_732, // CAN ID 732, 均衡模块断线检测
    FUNC_BALANCE_STATUS_733, // CAN ID 733, 箱间均衡信息
    FUNC_BALANCE_STATUS_734, // CAN ID 734, 均衡模块门限信息
    FUNC_BALANCE_STATUS_735, // CAN ID 735, 均衡模块概要信息
    FUNC_BALANCE_STATUS_736, // CAN ID 736, 均衡模块电压信息
    FUNC_CTRL_720, // CAN ID 720, 配置均衡板
    FUNC_CTRL_721, // CAN ID 721, 配置均衡板返回
    FUNC_CTRL_7FA, // CAN ID 7FA, DB协议 均衡配置
    FUNC_CTRL_7FF, // CAN ID 7FF, DB协议 从控配置
    FUNC_MAX, // MAX FUNCTION
};


/******************************************/


/*******************STRUCTURE**************/
struct detail_info
{
    unsigned char *start;
    unsigned char *end;
    unsigned char id;
    time_t update_time;
    time_t uplast[3];
};

typedef struct
{
    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];
    kv_array_t identifier_backup;
    dev_status_table_t *ds; //下挂节点的状态信息
    int node_status_timer;
    int period_poll_timer;
    time_t nodes_status_sync_date;
    bool need_send;
    bool upgrading;
    int CellVolUpdate_period;
    int TempUpdate_period;
    int CurrentUpdate_period;
    node_cfg_t *CurrentTransformer_node;
    sqlite3 *db; //db连接
} xieneng_car_var_t;

static inline int get_func_code_by_modbus_addr(int addr)
{
    int func = 0;

    func = (addr*2)/(MAX_FRAME_NUMBER * CAN_DATA_LEN);

    return func;
}

/******************************************/

int can_start_thread(xieneng_car_var_t *var);
int can_frame_handle_thread(xieneng_car_var_t *var);
int modbus_recv(xieneng_car_var_t *var, int port, unsigned char *data, int data_len, unsigned char *rsp);
int xieneng_car_db_init(xieneng_car_var_t *var);
int store_vol_temp(xieneng_car_var_t *var, unsigned int nowtim);
int xieneng_car_history_data(xieneng_car_var_t *var, cJSON *msg);

#endif /* __XIENENG_CAR_COMMON_H */
