/** 
* @file      rs485_comm.h 
* @brief     description about rs485
* @details  e.g. 485 port config, period polling
* @author   wangleilei@zjdyiot.com
* @date     2019.06.20
* @version  A001 
* @par Copyright (c):  
*       DYIOT
* @par History:          
*   version: draft\n 
*/  
#ifndef __RS485_COMMON_H
#define __RS485_COMMON_H

/***************HEADER FILES****************/
#include <string.h>
#include <syslog.h>
#include "ipc_session.h"
#include "lnxall_list.h"
#include "dy_utils/dy_modbus_sniffer_session.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/period_service.h"

#include "uart.h"
/******************************************/

/*************ENUM*************************/
typedef enum
{
    COORDINATOR = 0,  // 协调器
    ROUTER,           // 路由器
    END_DEVICE,       // 终端
} dev_type_e;

typedef enum
{
    TRANSPARENT = 0,     // 透传模式
    SEMI_TRANSPARENT,    // 半透传模式
    PROTOCOL,            // 协议模式
} trans_mode_e;

typedef enum
{
    BROADCAST1, // 该消息广播到全网络中所有设备
    BROADCAST2, // 该消息广播到只对打开了接收（除休眠模式）的设备
    BROADCAST3, // 该消息广播到所有全功能设备（路由器和协调器）
    MULTICAST,  // 在加入网络的情况下，用户可对全网非休眠设备进行组播。
    UNICAST_NO, // 在加入网络的情况下，用户可以根据指令在以短地址方式单独与网络中的设备通信 透传方式——（无携带信息）
    UNICAST_SHORT, // 短地址方式——（携带信息为短地址）
    UNICAST_MAC,   // MAC 地址方式——（携带信息为MAC 地址)
} send_method_e;
/******************************************/

/******************MACRO********************/
#define BAUD_RATE   115200	
#define TTY_DEV     "/dev/ttyS1"
#define ZIGBEE_NODE_STATUS_BAK_FILE "/app/zigbee_status.bak"
/******************************************/


/*******************STRUCTURE**************/
typedef struct _zigbee_cfg_s
{
    int tty_fd;
    dev_type_e type;
    trans_mode_e mode;
    char PAN_ID[8];
    char key[36];
    int group_id;
    int channel;
    int tx_power;
    int data_time;
} zigbee_cfg_t;


typedef struct _zigbee_var_t
{
	ipc_session_t* session; //内部broker的MQTT client，用于进程间通信
    zigbee_cfg_t zigbee_cfg;
    nodes_cfg_table_t *nodes_cfg_table; //节点信息
    template_table_t *template_table; //模板信息
    const char *board_name;
    char sn_str[SN_MAX_LEN];
	dev_status_table_t *ds; //下挂节点的状态信息
	time_t nodes_status_sync_date;
	int node_status_timer;
    int period_poll_timer;
    period_service_t *period;
    kv_array_t identifier_backup;
} zigbee_var_t;
/******************************************/


/******************FUNCTION****************/
/** 
 * Enter AT command mode
 * @param[in] fd zigbee descriptor
 * @retval  0 for success -1 for failed
 */  
int set_zigbee_AT_enter(int fd);
int set_zigbee_AT_exit(int fd);
int set_zigbee_dev_type(int fd, dev_type_e type);
int set_zigbee_trans_mode(int fd, trans_mode_e mode);
int set_zigbee_PAN_ID(int fd, char* PAN);
int set_zigbee_key(int fd, char* key);
int set_zigbee_group_id(int fd, int group);
int set_zigbee_channel(int fd, int ch);
int set_zigbee_tx_power(int fd, int tx_power);
int set_zigbee_data_time(int fd, int data_time);
int set_zigbee_rmode(int fd, int rmode);
int set_zigbee_reset(int fd);
int send_zigbee_data(zigbee_var_t *var, char *send_buf, int len, unsigned char *mac, int group_id, send_method_e method);
unsigned short get_short_addr_by_mac(int fd, unsigned char *mac);
void *recv_loop(void *param);
/******************************************/


#endif /* __RS485_COMMON_H */
