#ifndef __GATEWAY_MESSAGE_H
#define __GATEWAY_MESSAGE_H
#include "stm32f2xx.h"

// 网关所存储的modbus写命令
typedef struct _GATEWAY_WRITE_MODBUS_COMMAND
{
	uint16_t registerByteNum;
	uint8_t slaveAddress;
	uint8_t functionCode;
	uint8_t dataType;          //数据类型
	uint8_t keyword[20]; // 所写属性的名称
	uint8_t bigLittleFormat;
	uint16_t registerAddress;	// 寄存器地址
	uint8_t write_command_flag; // 是否成功写入的标志
	struct _GATEWAY_WRITE_MODBUS_COMMAND *nextParams;
} GATEWAY_WRITE_MODBUS_COMMAND;

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


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

typedef struct _PARAMS_PROTOCOL_COMMAND
{
	GATEWAY_READ_MODBUS_COMMAND   *gateway_read_modbus_command;
	GATEWAY_WRITE_MODBUS_COMMAND  *gateway_write_modbus_command;
	GATEWAY_READ_DLT645_COMMAND   *gateway_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    一个设备只能存在一个协议	
	uint8_t MDBbigLittleFormat;
	uint8_t MDBdataType;	
	PARAMS_PROTOCOL_COMMAND	*params;
	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 username[20];			//MQTT用户名
	uint8_t passwd[20];				// MQTT用户密码
	uint8_t deviceId[25];	  // 设备ID
	uint8_t dataSource;		  // 协议类型                 0 保留 1 表示645协议 2表示modbus协议
	uint8_t dataType645;	  // 645协议数据类型          0 保留 1 表示07版本  2表示97版本
	uint32_t pollTime;		  // 轮询时间
	uint32_t inboundTime;
	uint8_t state;			 // 检测是否上位机配置过当上位机配置过该状态位，则以后均不走http获取相应配置 置位值为0xF1
	uint8_t gatewayId[10];	 // 固化信息
	uint8_t gatewayMode[10]; // 工作模式、后续版本迭代使用
		uint8_t gateName[10];		// 网关相关信息

	// 包含的设备结构体
	uint8_t deviceCount;
	DEVICE_PARAMS *device_params;
		// 外设的串口工作属性仅只有一个
	uint32_t baudrate;	 // 波特率
	uint8_t dataBits;	 // 数据位
	uint8_t checkBit;	 // 校验位
	uint8_t stopBit;	 // 停止位
	uint8_t flowControl; // 流控制
	uint8_t parity;				//校验位
	uint8_t bandwidth;	
} GATEWAY_PARAMS;

void addGatewayParams(char *gatewayString);
int parseIntField(const char *data, const char *field);
void parseStringField(const char *data, const char *field, char *value);
GATEWAY_PARAMS *get_gateway_config_params(void);
int extract_substring(const char *input_string, const char *start_token, const char *end_token, char *result);

//////////////////////////////////////////////////////////////////////////////////////////////////////////

void analysis_read_data(DEVICE_PARAMS *device, char* buf);

typedef struct _MODBUS_READ_DATA
{
	uint8_t deviceId[20];
	// modbus读出的数据名
	uint8_t power;	
	uint8_t temp;
	uint8_t mode;
	uint8_t fan;
	uint8_t roomTemp;
	uint8_t fault;
	
	struct _MODBUS_READ_DATA *nextParams;
} MODBUS_READ_DATA;

typedef struct _DLT_READ_DATA
{
	uint8_t deviceId[20];
	// dlt读出的数据名
	uint8_t deviceID645[6];
	uint8_t keyword[20];   // 所读属性的名称
	uint32_t Identification; // 645数据标识
	uint8_t data[9];
	
	struct _DLT_READ_DATA *nextParams;
} DLT_READ_DATA;

typedef struct _READ_DATA
{
	MODBUS_READ_DATA   *read_modbus_data;
	DLT_READ_DATA  		 *read_dlt645_data;
}READ_DATA;
#endif
