#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; // �Ƿ�ɹ���ȡ���ı�־
	uint8_t value[4];          //��ȡ��������ֵ
	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;		   // �ӻ�Ӧ��ֵ�ij���
	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:��Ч  ����:��Ч
	char host[20];		  // MQTT��������ַ
	uint16_t port;			  // MQTT�������˿ں�
	uint8_t messageTopic[50]; // MQTT��Ϣ����
	uint8_t commandTopic[50]; // MQTTָ������
	char username[20];			//MQTT�û���
	char 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 bandwidth;
	uint8_t parity;				//У��λ
	
} GATEWAY_PARAMS;

void addGatewayParams(char *gatewayString);
void addDeviceParams(char *deviceString);


int parseIntField(const char *data, const char *field);
void parseStringField(const char *data, const char *field, char *value);

GATEWAY_PARAMS *get_gateway_config_params();
DEVICE_PARAMS *get_device_config_params();
#endif