
#ifndef DEVICE_MESSAGE_H
#define DEVICE_MESSAGE_H
 
#include <stdint.h>
 

#define	MODBUS  3
#define	DLT645_97 2
#define	DLT645_07 1


// 节点所存储的modbus写命令
typedef struct _WRITE_MODBUS_COMMAND
{
	uint8_t slaveAddress;
	uint16_t registerByteNum;
	uint8_t functionCode;
	uint8_t keyword[20]; // 所写属性的名称
	uint16_t registerAddress;	// 寄存器地址
	uint8_t write_command_flag; // 是否成功写入的标志
	struct _WRITE_MODBUS_COMMAND *nextParams;
} WRITE_MODBUS_COMMAND;

// 节点所存储的modbus读命令
typedef struct _READ_MODBUS_COMMAND
{
	uint8_t slaveAddress;
	uint8_t functionCode;
	uint8_t keyword[20]; // 所读属性的名称
	
	uint16_t registerAddress;  // 寄存器地址
	uint8_t read_command_flag; // 是否成功读取到的标志
	uint8_t value[4];          //读取到的数据值
	uint8_t rxLen;
	uint16_t registerByteNum;
	uint8_t decimalPoint;
	struct _READ_MODBUS_COMMAND *nextParams;
} READ_MODBUS_COMMAND;

// 节点所存储都DLT645读指令
typedef struct _READ_DLT645_COMMAND
{
	uint8_t deviceID645[6];
	uint8_t keyword[20];   // 所读属性的名称
	uint32_t Identification; // 645数据标识
	uint8_t data[9];	   // 读到的数据
	uint8_t rxLen;		   // 从机应答值的长度
	struct _READ_DLT645_COMMAND *nextParams;
} READ_DLT645_COMMAND;

typedef struct _PARAMS_PROTOCOL_COMMAND
{
	READ_MODBUS_COMMAND   *node_read_modbus_command;
	WRITE_MODBUS_COMMAND  *node_write_modbus_command;
	READ_DLT645_COMMAND   *node_read_dlt645_command;
}PARAMS_PROTOCOL_COMMAND;

// 节点包含的设备信息
typedef struct _DEVICE_PARAMS
{
	uint8_t aliveflag; // 存活证明(由轮询来进行保证,当有轮询回应是确定其存活，当链路变化时立即上报设备已经死去，当轮询有相应的相应值时去上报已经存活)
	uint8_t deviceID[20];
	uint8_t protocol;  // 所属协议类型                  1:modbus read 2:modbus write     3:dlt97  4:dlt07            一个设备只能存在一个协议
	PARAMS_PROTOCOL_COMMAND	*params;
	//当为modbus协议时设备层还包含大小端，和底层数据类型
	uint8_t MDBbigLittleFormat;
	uint8_t MDBdataType;
	struct _DEVICE_PARAMS *nextDevice; // 指向下一个设备地址
} DEVICE_PARAMS;

typedef struct _GATEWAY_PARAMS
{
	uint8_t data_valid_flag;  // 数据有效标志  0xF1:有效  其它:无效
	uint8_t host[20];		  // MQTT服务器地址
	uint16_t port;			  // MQTT服务器端口号
	uint8_t messageTopic[50]; // MQTT消息主题
	uint8_t commandTopic[50]; // MQTT指令主题
	uint8_t deviceId[25];	  // 设备ID
	uint32_t pollTime;		  // 轮询时间
	uint32_t inboundTime;
	uint8_t state;			 // 检测是否上位机配置过当上位机配置过该状态位，则以后均不走http获取相应配置 置位值为0xF1
	
	uint32_t baudrate;
	uint8_t dataBits;
	uint8_t stopBit;
	uint8_t checkBit;
	
	uint8_t gatewayId[10];	 // 固化信息
	uint8_t gatewayMode[10]; // 工作模式、后续版本迭代使用
	uint8_t version[10];
	// 网关相关信息
	uint8_t gateName[10];

	// 附属设备相关信息
	DEVICE_PARAMS *device_params;
} GATEWAY_PARAMS;
int addGatewayParams(char *gatewayString);
GATEWAY_PARAMS *get_gateway_config_params();
#endif
