//
// Created by huli on 2020/6/29.
//

#ifndef NNXX_TESTS_COMMUNICATION_MESSAGE_H
#define NNXX_TESTS_COMMUNICATION_MESSAGE_H

#include "../error_code/error_code.h"

#include <time.h>
#include <sys/time.h>
#include <chrono>
//#include <iosfwd>

#include <string>
#include "../message/message_base.pb.h"


class Communication_message
{
public:
	//消息类型定义,每个在网络上传输的消息必须含有这个属性
	enum Message_type
	{
		eBase_msg=0x00,
		eCommand_msg=0x01,                      //指令消息

		eLocate_status_msg=0x11,                //定位模块状态消息
		eLocate_request_msg=0x12,               //定位请求消息
		eLocate_response_msg=0x13,              //定位反馈消息

        eDispatch_status_msg=0x21,                //调度模块硬件状态消息
        eDispatch_request_msg=0x22,              //请求调度消息
        eDispatch_response_msg=0x23,             //调度结果反馈消息

        eParkspace_allocation_status_msg = 0x31,   //车位分配模块状态消息，包括车位信息
        eParkspace_allocation_request_msg = 0x32,  //请求分配车位消息
        eParkspace_allocation_response_msg = 0x33, //分配车位结果反馈消息
        eParkspace_search_request_msg = 0x34,    //查询车位请求消息
        eParkspace_search_response_msg = 0x35,    //查询车位反馈消息
        eParkspace_release_request_msg = 0x36,    //释放车位请求消息
        eParkspace_release_response_msg = 0x37,    //释放车位反馈消息
        eParkspace_force_update_request_msg = 0x38,	//手动修改车位消息
        eParkspace_force_update_response_msg = 0x39,//手动修改车位反馈消息
        eParkspace_confirm_alloc_request_msg = 0x3A,//确认分配车位请求消息
        eParkspace_confirm_alloc_response_msg = 0x3B,//确认分配车位反馈消息

        eStore_command_request_msg=0x41,                    //终端停车请求消息
        eStore_command_response_msg=0x42,                   //停车请求反馈消息
        ePickup_command_request_msg=0x43,                   //取车请求消息
        ePickup_command_response_msg=0x44,                  //取车请求反馈消息

        eStoring_process_statu_msg=0x90,                    //停车进度条消息
        ePicking_process_statu_msg=0x91,                    //取车进度消息

        eCentral_controller_statu_msg=0xa0,                 //中控状态消息

        eEntrance_manual_operation_msg=0xb0,            //针对出入口状态操作的手动消息
        eProcess_manual_operation_msg=0xb1,



        eGoal_msg=0xf0,
        ePointCloud_msg=0xf1,
        ePose2d_msg=0xf2,
    };

//通讯单元
	enum Communicator
	{
		eEmpty=0x0000,		//空
		eMain=0x0001,    	//主流程
		eTerminor=0x0100,	//终端
		eTable=0x0200,		//数据表
		eMeasurer=0x0300,	//测量单元
		eDispatch=0x0400,	//调度机构
		//...

        eAGV=0x0f00,
	};
public:
	Communication_message();
	Communication_message(std::string message_buf);
	Communication_message(char* p_buf, int size);
	Communication_message(const Communication_message& other)= default;
	Communication_message& operator =(const Communication_message& other)= default;
	~Communication_message();
public://API functions
	bool is_over_time();
public://get or set member variable
	void reset(const message::Base_info& base_info, std::string receive_string);

	Message_type get_message_type();
	Communicator get_sender();
	Communicator get_receiver();
	std::string& get_message_buf();

protected://member variable
	Message_type								m_message_type;				//消息类型
	std::chrono::system_clock::time_point		m_receive_time;				//接收消息的时间点
	std::chrono::milliseconds					m_timeout_ms;				//超时时间, 整个软件都统一为毫秒
	Communicator								m_sender;					//发送者
	Communicator								m_receiver;					//接受者

	std::string									m_message_buf;				//消息数据

private:

};


#endif //NNXX_TESTS_COMMUNICATION_MESSAGE_H
