//
// 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,              //定位反馈消息

		eLocate_sift_request_msg = 0x14,            //预测算法请求消息
		eLocate_sift_response_msg = 0x15,           //预测算法反馈消息

		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,             //针对流程的手动消息


		eGround_detect_request_msg=0xf0,        //地面雷达测量请求消息
    	eGround_detect_response_msg=0xf1,       //地面雷达测量反馈消息

	};

//通讯单元
	enum Communicator
	{
		eEmpty=0x0000,
		eMain=0x0001,    //主流程

		eTerminor=0x0100,
		//车位表
		eParkspace=0x0200,
		//测量单元
		eMeasurer=0x0300,
		//测量单元
		eMeasurer_sift_server=0x0301,
		//调度机构
		eDispatch=0x0400,
		//...

		//地面测量单元
		eGround_measurer=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();
	std::chrono::system_clock::time_point get_receive_time();

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
