Pārlūkot izejas kodu

20200722, 联调通信

huli 5 gadi atpakaļ
vecāks
revīzija
f89932ac8b

+ 4 - 3
CMakeLists.txt

@@ -43,6 +43,8 @@ aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/task TASK_MANAGER_SRC )
 aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/tool TOOL_SRC )
 aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/communication COMMUNICATION_SRC )
 aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/system SYSTEM_SRC )
+aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/dispatch DISPATCH_SRC )
+
 
 add_executable(terminal
         main.cpp
@@ -59,9 +61,8 @@ add_executable(terminal
         ${TOOL_SRC}
         ${COMMUNICATION_SRC}
         ${SYSTEM_SRC}
-
-
-		)
+		${DISPATCH_SRC}
+		dispatch/dispatch_manager.cpp dispatch/dispatch_manager.h dispatch/carrier_base.cpp dispatch/carrier_base.h)
 
 target_link_libraries(terminal
         /usr/local/lib/libglog.a

+ 30 - 10
communication/communication_message.h

@@ -29,21 +29,41 @@ public:
 		eLocate_request_msg=0x12,               //定位请求消息
 		eLocate_response_msg=0x13,              //定位反馈消息
 
-		eHarware_statu_msg=0x21,                //调度模块硬件状态消息
-		eExecute_request_msg=0x22,              //请求调度消息
-		eExecute_response_msg=0x23,             //调度结果反馈消息
+		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,    //释放车位反馈消息
+
+        eStore_command_request_msg=0x41,        //终端停车请求消息
+        eStore_command_response_msg=0x42,       //停车请求反馈消息
+        ePickup_command_request_msg=0x43,       //取车请求消息
+        ePickup_command_response_msg=0x44,       //取车请求反馈消息
+
+        eEntrance_statu_msg=0x51,              //出入口状态消息
+
+
 	};
 
 //通讯单元
 	enum Communicator
 	{
-		eEmpty=0x0000,		//空
-		eMain=0x0001,    	//主流程
-		eTerminor=0x0100,	//终端
-		eTable=0x0200,		//数据表
-		eMeasurer=0x0300,	//测量单元
-		eProcess=0x0400,	//调度机构
-		//...
+		eEmpty=0x0000,
+		eMain=0x0001,    //主流程
+
+		eTerminor=0x0100,
+
+		eParkspace=0x0200,          //车位表
+
+		eMeasurer=0x0300,           //测量单元
+
+		eDispatch=0x0400,            //调度机构
 	};
 public:
 	Communication_message();

+ 36 - 0
dispatch/carrier_base.cpp

@@ -0,0 +1,36 @@
+//
+// Created by huli on 2020/7/20.
+//
+
+#include "carrier_base.h"
+
+Carrier_base::Carrier_base()
+{
+	m_carrier_status = E_CARRIER_UNKNOW;
+}
+
+Carrier_base::~Carrier_base()
+{
+	carrier_base_uninit();
+}
+
+
+//搬运器 初始化
+Error_manager Carrier_base::carrier_base_init()
+{
+	m_carrier_status = E_CARRIER_READY;
+}
+//搬运器 反初始化
+Error_manager Carrier_base::carrier_base_uninit()
+{
+	m_carrier_status = E_CARRIER_UNKNOW;
+}
+
+
+
+Carrier_base::Carrier_status Carrier_base::get_carrier_status()
+{
+	return m_carrier_status;
+}
+
+

+ 49 - 0
dispatch/carrier_base.h

@@ -0,0 +1,49 @@
+//
+// Created by huli on 2020/7/20.
+//
+
+#ifndef NNXX_TESTS_CARRIER_BASE_H
+#define NNXX_TESTS_CARRIER_BASE_H
+
+#include "../error_code/error_code.h"
+#include <glog/logging.h>
+
+
+//搬运器的基类, AGV和抓取机器人从他继承
+class Carrier_base
+{
+public:
+	//搬运器状态, 楚天项目就是AGV系统
+	enum Carrier_status
+	{
+		E_CARRIER_UNKNOW               = 0,     //未知
+		E_CARRIER_READY                = 1,     //准备,待机
+		E_CARRIER_STORE                = 2,	    //正在存车
+		E_CARRIER_PICKUP               = 3,	    //正在取车
+
+		E_CARRIER_FAULT                = 10,     //故障
+	};
+
+public:
+	Carrier_base();
+	Carrier_base(const Carrier_base& other)= default;
+	Carrier_base& operator =(const Carrier_base& other)= default;
+	~Carrier_base();
+public://API functions
+	//搬运器 初始化
+	virtual Error_manager carrier_base_init();
+	//搬运器 反初始化
+	virtual Error_manager carrier_base_uninit();
+public://get or set member variable
+	Carrier_status get_carrier_status();
+
+protected://member variable
+	enum Carrier_status					m_carrier_status;	//搬运器状态,
+
+
+private:
+
+};
+
+
+#endif //NNXX_TESTS_CARRIER_BASE_H

+ 104 - 0
dispatch/dispatch_manager.cpp

@@ -0,0 +1,104 @@
+//
+// Created by huli on 2020/7/20.
+//
+
+#include "dispatch_manager.h"
+#include <cstdlib>
+
+Dispatch_manager::Dispatch_manager()
+{
+	m_dispatch_manager_status = E_DISPATCH_MANAGER_UNKNOW;
+//	m_carrier_number = 0;
+}
+
+Dispatch_manager::~Dispatch_manager()
+{
+	dispatch_manager_uninit();
+}
+
+
+
+//调度管理 初始化
+Error_manager Dispatch_manager::dispatch_manager_init()
+{
+	m_dispatch_manager_status = E_DISPATCH_MANAGER_READY;
+//	m_carrier_number = size;
+//
+//	for (int i = 0; i < size; ++i)
+//	{
+//		Carrier_base * p_arrier_base = new Carrier_base;
+//		p_arrier_base->carrier_base_init();
+//		m_carrier_vector.push_back(p_arrier_base);
+//	}
+	return Error_code::SUCCESS;
+}
+//调度管理 反初始化
+Error_manager Dispatch_manager::dispatch_manager_uninit()
+{
+//	//回收搬运器的内存
+//	for (int i = 0; i < m_carrier_number; ++i)
+//	{
+//		m_carrier_vector[i]->carrier_base_uninit();
+//		delete(m_carrier_vector[i]);
+//	}
+
+	m_dispatch_manager_status = E_DISPATCH_MANAGER_UNKNOW;
+//	m_carrier_number = 0;
+//	m_carrier_vector.clear();
+	return Error_code::SUCCESS;
+}
+
+//对外的接口函数,负责接受并处理任务单,
+Error_manager Dispatch_manager::execute_task(Dispatch_manager::Dispatch_motion_direction dispatch_motion_direction)
+{
+
+	std::this_thread::sleep_for(std::chrono::seconds(rand()%3+3));
+
+	if ( dispatch_motion_direction == E_STORE_CAR )
+	{
+		return Error_code::SUCCESS;
+	}
+
+	return Error_code::SUCCESS;
+
+//	srand(0);
+	unsigned int t_probability = rand();
+
+	if ( t_probability%100 >=40 )
+	{
+	    return Error_code::SUCCESS;
+	}
+	else
+	{
+	    return Error_manager(Error_code::ERROR, Error_level::MINOR_ERROR,
+	    					" Dispatch_manager::execute_task() error ");
+	}
+}
+
+//检查状态
+Error_manager Dispatch_manager::check_status()
+{
+	if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_READY )
+	{
+		return Error_code::SUCCESS;
+	}
+	else if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_STORE || m_dispatch_manager_status == E_DISPATCH_MANAGER_STORE )
+	{
+		return Error_manager(Error_code::DISPATCH_MANAGER_STATUS_BUSY, Error_level::NEGLIGIBLE_ERROR,
+							 " Dispatch_manager::check_status() error ");
+	}
+	else
+	{
+		return Error_manager(Error_code::DISPATCH_MANAGER_STATUS_ERROR, Error_level::MINOR_ERROR,
+							 " Dispatch_manager::check_status() error ");
+	}
+	return Error_code::SUCCESS;
+}
+
+Dispatch_manager::Dispatch_manager_status Dispatch_manager::get_dispatch_manager_status()
+{
+	return m_dispatch_manager_status;
+}
+
+
+

+ 78 - 0
dispatch/dispatch_manager.h

@@ -0,0 +1,78 @@
+//
+// Created by huli on 2020/7/20.
+//
+
+#ifndef NNXX_TESTS_DISPATCH_MANAGER_H
+#define NNXX_TESTS_DISPATCH_MANAGER_H
+
+
+#include "../error_code/error_code.h"
+#include "../tool/singleton.h"
+#include "../tool/thread_condition.h"
+
+#include "../dispatch/carrier_base.h"
+#include <vector>
+#include <glog/logging.h>
+
+
+//调度管理模块
+class Dispatch_manager:public Singleton<Dispatch_manager>
+{
+// 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
+   friend class Singleton<Dispatch_manager>;
+
+public:
+	//调度管理 的状态
+	enum Dispatch_manager_status
+	{
+		E_DISPATCH_MANAGER_UNKNOW               = 0,    //未知
+		E_DISPATCH_MANAGER_READY                = 1,    //准备,待机
+		E_DISPATCH_MANAGER_STORE                = 2,    //正在存车
+		E_DISPATCH_MANAGER_PICKUP               = 3,    //正在取车
+
+		E_DISPATCH_MANAGER_FAULT               = 10,    //故障
+	};
+
+	//调度方向, 停车取车
+	enum Dispatch_motion_direction
+	{
+		E_STORE_CAR             =0,         //停车, 出入口 -> 停车位
+		E_PICKUP_CAR            =1,         //取车, 停车位 -> 出入口
+	};
+private:
+ // 父类的构造函数必须保护,子类的构造函数必须私有。
+   Dispatch_manager();
+public:
+    //必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
+    Dispatch_manager(const Dispatch_manager& other) = delete;
+    Dispatch_manager& operator =(const Dispatch_manager& other) = delete;
+    ~Dispatch_manager();
+public://API functions
+	//调度管理 初始化
+	Error_manager dispatch_manager_init();
+	//调度管理 反初始化
+	Error_manager dispatch_manager_uninit();
+
+	//对外的接口函数,负责接受并处理任务单,
+	Error_manager execute_task(Dispatch_manager::Dispatch_motion_direction dispatch_motion_direction);
+
+	//检查状态
+	Error_manager check_status();
+public://get or set member variable
+	Dispatch_manager_status get_dispatch_manager_status();
+
+protected://member variable
+
+	Dispatch_manager_status						m_dispatch_manager_status;			//调度管理 的状态
+
+
+//	int 										m_carrier_number;					//搬运器的数量, 默认3个
+//	std::vector<Carrier_base*>					m_carrier_vector;					//搬运器的对象实例,内存由本类管理
+
+
+private:
+
+};
+
+
+#endif //NNXX_TESTS_DISPATCH_MANAGER_H

+ 7 - 0
error_code/error_code.h

@@ -299,6 +299,13 @@ enum Error_code
     LOCATER_MSG_REQUEST_INVALID,
     LOCATER_MSG_RESPONSE_HAS_NO_REQUEST,
 
+	//Dispatch_manager 调度管理模块 错误码
+	DISPATCH_MANAGER_ERROR_BASE						= 0x13010000,
+	DISPATCH_MANAGER_READ_PROTOBUF_ERROR,				//调度管理模块,读取参数错误
+	DISPATCH_MANAGER_STATUS_BUSY,						//调度管理模块,状态正忙
+	DISPATCH_MANAGER_STATUS_ERROR,						//调度管理模块,状态错误
+	DISPATCH_MANAGER_TASK_TYPE_ERROR,					//调度管理模块,任务类型错误
+	DISPATCH_MANAGER_IS_NOT_READY,						//调度管理模块,不在准备状态
 };
 
 //错误等级,用来做故障处理

+ 3 - 3
laser/laser_manager.cpp

@@ -50,8 +50,8 @@ Error_manager Laser_manager::laser_manager_init_from_protobuf(Laser_proto::Laser
 	m_laser_manager_working_flag = false;
 
 	//创建大疆雷达
-	int laser_cout=laser_parameters.laser_parameters_size();
-	m_laser_vector.resize(laser_cout);
+	int laser_count=laser_parameters.laser_parameters_size();
+	m_laser_vector.resize(laser_count);
 	for(int i=0;i<laser_parameters.laser_parameters_size();++i)
 	{
 		//创建雷达, CreateLaser 会为雷达实例new内存
@@ -221,7 +221,7 @@ Error_manager Laser_manager::check_status()
 	}
 	else if ( m_laser_manager_status == LASER_MANAGER_ISSUED_TASK || m_laser_manager_status == LASER_MANAGER_WAIT_REPLY )
 	{
-		return Error_manager(Error_code::LASER_MANAGER_STATUS_BUSY, Error_level::MINOR_ERROR,
+		return Error_manager(Error_code::LASER_MANAGER_STATUS_BUSY, Error_level::NEGLIGIBLE_ERROR,
 							 " Laser_manager::check_status error ");
 	}
 	else

+ 49 - 11
main.cpp

@@ -19,23 +19,59 @@
 #include "./system/system_communication.h"
 #include "./system/system_executor.h"
 
+#include "./dispatch/dispatch_manager.h"
+
+
+
+
 #define LIVOX_NUMBER	     2
 
 
-void asd(int i)
+GOOGLE_GLOG_DLL_DECL void shut_down_logging(const char* data, int size)
 {
-	std::cout << " i = " << i << std::endl;
+	time_t tt;
+	time( &tt );
+	tt = tt + 8*3600;  // transform the time zone
+	tm* t= gmtime( &tt );
+	char buf[255]={0};
+	sprintf(buf,"./%d%02d%02d-%02d%02d%02d-dump.txt",
+			t->tm_year + 1900,
+			t->tm_mon + 1,
+			t->tm_mday,
+			t->tm_hour,
+			t->tm_min,
+			t->tm_sec);
+
+	FILE* tp_file=fopen(buf,"w");
+	fprintf(tp_file,data,strlen(data));
+	fclose(tp_file);
+
 }
 
 int main(int argc,char* argv[])
 {
-	Laser_manager::get_instance_references().laser_manager_init();
-	std::cout << "Laser_manager = " << Laser_manager::get_instance_references().get_laser_manager_status() << std::endl;
-	Locate_manager::get_instance_references().Locate_manager_init();
-	std::cout << "Locate_manager = " << Locate_manager::get_instance_references().get_locate_manager_status() << std::endl;
-	System_executor::get_instance_references().system_executor_init(4);
+	const char* logPath = "./";
+	google::InitGoogleLogging("LidarMeasurement");
+	google::SetStderrLogging(google::INFO);
+	google::SetLogDestination(0, logPath);
+	google::SetLogFilenameExtension("zxlog");
+	google::InstallFailureSignalHandler();
+	google::InstallFailureWriter(&shut_down_logging);
+	FLAGS_colorlogtostderr = true;        // Set log color
+	FLAGS_logbufsecs = 0;                // Set log output speed(s)
+	FLAGS_max_log_size = 1024;            // Set max log file size(GB)
+	FLAGS_stop_logging_if_full_disk = true;
+
+//	Laser_manager::get_instance_references().laser_manager_init();
+//	std::cout << "Laser_manager = " << Laser_manager::get_instance_references().get_laser_manager_status() << std::endl;
+//	Locate_manager::get_instance_references().Locate_manager_init();
+//	std::cout << "Locate_manager = " << Locate_manager::get_instance_references().get_locate_manager_status() << std::endl;
+
+	Dispatch_manager::get_instance_references().dispatch_manager_init();
+	std::cout << "Dispatch_manager = " << Dispatch_manager::get_instance_references().get_dispatch_manager_status() << std::endl;
+
+	System_executor::get_instance_references().system_executor_init(8);
 	std::cout << "System_executor = " << System_executor::get_instance_references().get_system_executor_status() << std::endl;
-
 	System_communication::get_instance_references().communication_init();
 
 	char ch ;
@@ -43,8 +79,10 @@ int main(int argc,char* argv[])
 
 	System_communication::get_instance_references().communication_uninit();
 	System_executor::get_instance_references().system_executor_uninit();
-	Locate_manager::get_instance_references().Locate_manager_uninit();
-	Laser_manager::get_instance_references().laser_manager_uninit();
+	Dispatch_manager::get_instance_references().dispatch_manager_uninit();
+
+//	Locate_manager::get_instance_references().Locate_manager_uninit();
+//	Laser_manager::get_instance_references().laser_manager_uninit();
 
 	return 0;
 
@@ -62,7 +100,7 @@ int main(int argc,char* argv[])
 //		);
 //	}
 
-	pool.enqueue(&asd,8);
+//	pool.enqueue(&asd,8);
 
 	for(auto && result: results)
 		std::cout << result.get() << ' ';

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1902 - 0
message/dispatch_message.pb.cc


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1232 - 0
message/dispatch_message.pb.h


+ 73 - 0
message/dispatch_message.proto

@@ -0,0 +1,73 @@
+syntax = "proto2";
+package message;
+import "message_base.proto";
+
+//调度管理 的状态
+enum Dispatch_manager_status
+{
+    E_DISPATCH_MANAGER_UNKNOW               = 0;    //未知
+    E_DISPATCH_MANAGER_READY                = 1;    //准备,待机
+    E_DISPATCH_MANAGER_STORE                = 2;    //正在存车
+    E_DISPATCH_MANAGER_PICKUP               = 3;    //正在取车
+
+    E_DISPATCH_MANAGER_FAULT               = 10;    //故障
+}
+
+//搬运器状态, 楚天项目就是AGV系统
+enum Carrier_status
+{
+    E_CARRIER_UNKNOW               = 0;     //未知
+    E_CARRIER_READY                = 1;     //准备,待机
+    E_CARRIER_STORE                = 2;	    //正在存车
+    E_CARRIER_PICKUP               = 3;	    //正在取车
+
+    E_CARRIER_FAULT                = 10;     //故障
+}
+
+
+//搬运器位置. AGV或者抓取机器人的坐标
+message Carrier_position
+{
+    required float x=1;             //X轴坐标
+    required float y=2;             //Y轴坐标
+    required float z=3;             //Z轴坐标, 楚天AGV和电梯一一对应,所以Z轴就用电梯高度表示
+}
+
+//搬运机构各个零部件状态
+message Dispatch_status_msg
+{
+    required Base_info                  base_info=1;                    //消息类型
+
+    required Dispatch_manager_status    dispatch_manager_status = 2;    //调度管理 的状态
+ //   repeated Carrier_status             carrier_status = 3;             //搬运器状态, 楚天有3套AGV系统
+
+}
+
+//调度方向, 停车取车
+enum Dispatch_motion_direction
+{
+    E_STORE_CAR             =0;         //停车, 出入口 -> 停车位
+    E_PICKUP_CAR            =1;         //取车, 停车位 -> 出入口
+}
+
+//执行搬运请求
+message Dispatch_request_msg
+{
+    required Base_info                  base_info=1;                            //消息类型
+    required int32                      command_id=2;                           //指令唯一标识符id
+
+    required Dispatch_motion_direction  dispatch_motion_direction=3;            //调度方向, 停车取车
+    required int32                      terminal_id=4;                          //终端id, 出入口
+    required int32                      parkspace_id=5;                         //车位编号, 停车位
+    optional Locate_information         locate_information=6;                   //汽车测量信息, 只有停车时有数据, 取车时没有数据.
+}
+
+//搬运动作执行完成后反馈结果
+message Dispatch_response_msg
+{
+    required Base_info                  base_info=1;                    //消息类型
+    required int32                      command_id=2;                   //指令唯一标识符id
+    required Error_manager              error_manager = 3;
+}
+
+

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 2564
message/hardware_message.pb.cc


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 1758
message/hardware_message.pb.h


+ 0 - 68
message/hardware_message.proto

@@ -1,68 +0,0 @@
-syntax = "proto2";
-package message;
-import "message_base.proto";
-
-enum Hardware_statu        //硬件状态
-{
-    eNormal=0;             //正常且空闲
-    eBusy=1;               //工作中
-    eMiss=2;                //连接丢失
-    eError=3;              //故障报错
-
-}
-
-//硬件位置.
-message Position
-{
-    required float x=1;
-    required float y=2;
-    required float z=3;
-
-}
-
-//搬运器状态
-message Carrier_status
-{
-    required Hardware_statu             statu=1;                   //状态
-    optional int32                      command_id=2;                   //指令唯一标识符id
-    optional string                     error_description=3;       //搬运器错误信息(可无)
-    required Position                   position=4;                //搬运器位置(z表示电梯位置)
-    required bool                       empty=5;                   //是否空载
-}
-
-//搬运机构各个零部件状态
-message Harware_statu_msg
-{
-    required Message_type               msg_type=1;                 //消息类型
-    required Carrier_status             carrier1_statu=2;           //搬运器1状态
-    required Carrier_status             carrier2_statu=3;           //搬运器2状态
-    required Carrier_status             carrier3_statu=4;           //搬运器3状态
-}
-
-enum Action_type
-{
-    ePark=0;
-    ePick=1;
-}
-
-//执行搬运请求
-message Execute_request_msg
-{
-    required Base_info                   msg_info=1;         //消息类型                         //消息类型
-    required int32                      command_id=2;                   //指令唯一标识符id
-    required Action_type                action_type=3;
-    required int32                      from_id=4;
-    required int32                      destination=5;
-    required Locate_information         locate_information=6;
-}
-
-//搬运动作执行完成后反馈结果
-message Execute_response_msg
-{
-    required Base_info                   msg_info=1;                    //消息类型
-    required int32                      command_id=2;                   //指令唯一标识符id
-    required int32                      error_code=3;
-    optional string                     error_description=4;
-}
-
-

+ 2 - 2
message/measure_message.proto

@@ -50,9 +50,9 @@ message Measure_status_msg
 //定位请求消息
 message Measure_request_msg
 {
-    required Base_info                  base_info=1;        //消息类型
+    required Base_info                  base_info=1;                    //消息类型
     required int32                      command_id=2;                   //指令唯一标识符id
-    required int32                      terminal_id=3;          //终端id
+    required int32                      terminal_id=3;                  //终端id
 }
 
 //定位测量返回消息

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1286 - 15
message/message_base.pb.cc


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 982 - 8
message/message_base.pb.h


+ 63 - 10
message/message_base.proto

@@ -13,9 +13,25 @@ enum Message_type
     eLocate_response_msg=0x13;              //定位反馈消息
 
 
-    eHarware_statu_msg=0x21;                //调度模块硬件状态消息
-    eExecute_request_msg=0x22;              //请求调度消息
-    eExecute_response_msg=0x23;             //调度结果反馈消息
+		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;    //释放车位反馈消息
+
+        eStore_command_request_msg=0x41;        //终端停车请求消息
+        eStore_command_response_msg=0x42;       //停车请求反馈消息
+        ePickup_command_request_msg=0x43;       //取车请求消息
+        ePickup_command_response_msg=0x44;       //取车请求反馈消息
+
+        eEntrance_statu_msg=0x51;              //出入口状态消息
+
 
 }
 
@@ -26,14 +42,12 @@ enum Communicator
     eMain=0x0001;    //主流程
 
     eTerminor=0x0100;
-    //数据表
-    eTable=0x0200;
-    //测量单元
-    eMeasurer=0x0300;
-    //调度机构
-    eProcess=0x0400;
-    //...
 
+    eParkspace=0x0200;          //车位表
+
+    eMeasurer=0x0300;           //测量单元
+
+    eDispatch=0x0400;            //调度机构
 
 }
 ////base message 用于解析未知类型的消息
@@ -86,3 +100,42 @@ message Locate_information
     optional bool locate_correct = 9;		    //整车的校准标记位
 }
 
+
+message Car_info
+{
+    optional float                      car_length=1;           //车长
+    required float                      car_width=2;            //车宽
+    required float                      car_height=3;           //车高
+    required string                     license=4;              //车辆凭证号
+}
+
+//车位状态枚举
+enum Parkspace_status
+{
+    eParkspace_empty            = 0;         //空闲,可分配
+    eParkspace_occupied         = 1;         //被占用,不可分配
+    eParkspace_reserverd        = 2;         //被预约,预约车辆可分配
+    eParkspace_error            = 3;         //车位机械结构或硬件故障
+}
+
+enum Direction
+{
+    eForward = 1;
+    eBackward = 2;
+}
+
+//单个车位基本信息与状态信息
+message Parkspace_info
+{
+    optional int32              parkspace_id=1;         //车位编号
+    optional int32              index=2;                //同层编号
+    optional Direction          direction=3;            //前后
+    optional int32              floor=4;                //楼层
+    optional float              length=5;               //车位长
+    optional float              width=6;                //车位宽
+    optional float              height=7;               //车位高
+    optional Parkspace_status   parkspace_status=8;     //车位当前状态
+    optional Car_info           car_info=9;              //当前车位存入车辆的凭证号
+    optional string             entry_time=10;          //入场时间
+    optional string             leave_time=11;          //离场时间
+}

+ 1 - 2
proto.sh

@@ -1,4 +1,3 @@
 protoc -I=./message message_base.proto --cpp_out=./message
 protoc -I=./message measure_message.proto --cpp_out=./message
-protoc -I=./message hardware_message.proto --cpp_out=./message
-#protoc -I=./ setting.proto --cpp_out=./
+protoc -I=./message dispatch_message.proto --cpp_out=./message

+ 2 - 2
setting/communication.prototxt

@@ -10,8 +10,8 @@ communication_parameters
   # connect_string_vector:"tcp://192.168.2.125:9876"
   # connect_string_vector:"tcp://192.168.2.166:1234"
 
-   bind_string:"tcp://192.168.2.166:4444"
-
+  # bind_string:"tcp://192.168.2.166:4444"
 
+    bind_string:"tcp://192.168.2.192:5555"
 }
 

+ 9 - 5
system/system_communication.cpp

@@ -23,8 +23,8 @@ Error_manager System_communication::check_msg(Communication_message*  p_msg)
 {
 
 	//通过 p_msg->get_message_type() 和 p_msg->get_receiver() 判断这条消息是不是给我的.
-	if ( p_msg->get_message_type() == Communication_message::Message_type::eLocate_request_msg
-		 && p_msg->get_receiver() == Communication_message::Communicator::eMeasurer )
+	if ( p_msg->get_message_type() == Communication_message::Message_type::eDispatch_request_msg
+		 && p_msg->get_receiver() == Communication_message::Communicator::eDispatch )
 	{
 		return Error_code::SUCCESS;
 	}
@@ -70,7 +70,8 @@ Error_manager System_communication::execute_msg(Communication_message* p_msg)
 Error_manager System_communication::encapsulate_send_data()
 {
 	Error_manager t_error;
-
+	return System_executor::get_instance_references().encapsulate_send_status();
+/*
 	message::Measure_request_msg t_measure_request_msg;
 	t_measure_request_msg.mutable_base_info()->set_msg_type(message::Message_type::eLocate_request_msg);
 	t_measure_request_msg.mutable_base_info()->set_timeout_ms(5000);
@@ -80,7 +81,10 @@ Error_manager System_communication::encapsulate_send_data()
 	t_measure_request_msg.set_terminal_id(1);
 	string t_msg = t_measure_request_msg.SerializeAsString();
 	System_communication::get_instance_references().encapsulate_msg(t_msg);
-	/*
+ */
+
+
+/*
 	//创建一条状态消息
 	message::Measure_status_msg t_measure_status_msg;
 	t_measure_status_msg.mutable_base_info()->set_msg_type(message::Message_type::eLocate_status_msg);
@@ -103,7 +107,7 @@ Error_manager System_communication::encapsulate_send_data()
 
 	t_measure_status_msg.mutable_error_manager()->set_error_code(t_error.get_error_code());
 	t_measure_status_msg.mutable_error_manager()->set_error_level((message::Error_level)t_error.get_error_level());
-	t_measure_status_msg.mutable_error_manager()->set_error_description(t_error.get_error_description());
+	t_measure_status_msg.mutable_error_manager()->set_error_description(t_error.get_error_description(), t_error.get_description_length());
 
 	t_measure_status_msg.mutable_locate_information_realtime()->set_locate_x(0);
 	t_measure_status_msg.mutable_locate_information_realtime()->set_locate_y(0);

+ 158 - 6
system/system_executor.cpp

@@ -7,6 +7,8 @@
 #include "../laser/laser_manager.h"
 #include "../locate/locate_manager.h"
 #include "../system/system_communication.h"
+#include "../message/dispatch_message.pb.h"
+#include "../dispatch/dispatch_manager.h"
 
 System_executor::System_executor()
 {
@@ -97,7 +99,60 @@ Error_manager System_executor::check_executer(Communication_message* p_msg)
 					}
 					else
 					{
-						LOG(INFO) << " System_executor::check_executer second PARSE_ERROR "<< this;
+						LOG(INFO) << " System_executor::check_executer Second analysis ERROR "<< this;
+						return Error_manager(Error_code::SYSTEM_EXECUTOR_PARSE_ERROR, Error_level::MINOR_ERROR,
+											 " message::Measure_request_msg  ParseFromString error ");
+					}
+				}
+			}
+			break;
+		}
+		case Communication_message::Message_type::eDispatch_request_msg:
+		{
+			Error_manager t_dispatch_result = Dispatch_manager::get_instance_references().check_status();
+			Error_manager t_executor_result = System_executor::get_instance_references().check_status();
+			if (t_dispatch_result == SUCCESS
+				&& t_executor_result == SUCCESS)
+			{
+				return Error_code::SUCCESS;
+			}
+			else
+			{
+				//整合所有的错误码
+				t_error.compare_and_cover_error(t_dispatch_result);
+				t_error.compare_and_cover_error(t_executor_result);
+				if (t_error.get_error_level() == NEGLIGIBLE_ERROR)//一级故障,轻微故障,
+				{
+					std::cout << "executer_is_busy , " << std::endl;
+					//返回繁忙之后, 通信模块1秒后再次调用check
+					return Error_code::COMMUNICATION_EXCUTER_IS_BUSY;
+				}
+				else//返回二级故障,可以封装一条答复信息, 返回错误码
+				{
+					message::Dispatch_response_msg t_dispatch_request_msg;
+					//针对消息类型, 对消息进行二次解析
+					if (t_dispatch_request_msg.ParseFromString(p_msg->get_message_buf()))
+					{
+						//创建一条答复消息
+						message::Dispatch_response_msg t_dispatch_response_msg;
+						t_dispatch_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_response_msg);
+						t_dispatch_response_msg.mutable_base_info()->set_timeout_ms(5000);
+						t_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch);
+						t_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
+
+						t_dispatch_response_msg.set_command_id(t_dispatch_request_msg.command_id());
+						t_dispatch_response_msg.mutable_error_manager()->set_error_code(t_error.get_error_code());
+						t_dispatch_response_msg.mutable_error_manager()->set_error_level((message::Error_level)t_error.get_error_level());
+						t_dispatch_response_msg.mutable_error_manager()->set_error_description(t_error.get_error_description());
+
+						string t_msg = t_dispatch_response_msg.SerializeAsString();
+						System_communication::get_instance_references().encapsulate_msg(t_msg);
+						LOG(INFO) << " System_executor::check_executer executer status error "<< this;
+						return t_error;
+					}
+					else
+					{
+						LOG(INFO) << " System_executor::check_executer Second analysis ERROR "<< this;
 						return Error_manager(Error_code::SYSTEM_EXECUTOR_PARSE_ERROR, Error_level::MINOR_ERROR,
 											 " message::Measure_request_msg  ParseFromString error ");
 					}
@@ -125,22 +180,61 @@ Error_manager System_executor::execute_msg(Communication_message* p_msg)
 	}
 	switch ( p_msg->get_message_type() )
 	{
-		case Communication_message::eLocate_request_msg:
+		case Communication_message::Message_type::eLocate_request_msg:
+		{
 			message::Measure_request_msg t_measure_request_msg;
 			//针对消息类型, 对消息进行二次解析
-			if( t_measure_request_msg.ParseFromString(p_msg->get_message_buf()) )
+			if (t_measure_request_msg.ParseFromString(p_msg->get_message_buf()))
 			{
 				//往线程池添加执行任务, 之后会唤醒一个线程去执行他.
 				m_thread_pool.enqueue(&System_executor::execute_for_measure, this,
-				t_measure_request_msg.command_id(), t_measure_request_msg.terminal_id());
+									  t_measure_request_msg.command_id(), t_measure_request_msg.terminal_id());
 			}
 			else
 			{
-			    return Error_manager(Error_code::SYSTEM_EXECUTOR_PARSE_ERROR, Error_level::MINOR_ERROR,
-			    					" message::Measure_request_msg  ParseFromString error ");
+				return Error_manager(Error_code::SYSTEM_EXECUTOR_PARSE_ERROR, Error_level::MINOR_ERROR,
+									 " message::Measure_request_msg  ParseFromString error ");
 			}
 			break;
+		}
+		case Communication_message::Message_type::eDispatch_request_msg:
+		{
+			message::Dispatch_request_msg t_dispatch_request_msg;
+			//针对消息类型, 对消息进行二次解析
+			if (t_dispatch_request_msg.ParseFromString(p_msg->get_message_buf()))
+			{
+				Locate_information t_locate_information;
 
+				if ( t_dispatch_request_msg.dispatch_motion_direction() == message::Dispatch_motion_direction::E_STORE_CAR
+				&& t_dispatch_request_msg.has_locate_information())
+				{
+					t_locate_information.locate_x = t_dispatch_request_msg.locate_information().locate_x();
+					t_locate_information.locate_y = t_dispatch_request_msg.locate_information().locate_y();
+					t_locate_information.locate_angle = t_dispatch_request_msg.locate_information().locate_angle();
+					t_locate_information.locate_length = t_dispatch_request_msg.locate_information().locate_length();
+					t_locate_information.locate_width = t_dispatch_request_msg.locate_information().locate_width();
+					t_locate_information.locate_height = t_dispatch_request_msg.locate_information().locate_height();
+					t_locate_information.locate_wheel_base = t_dispatch_request_msg.locate_information().locate_wheel_base();
+					t_locate_information.locate_wheel_width = t_dispatch_request_msg.locate_information().locate_wheel_width();
+					t_locate_information.locate_correct = t_dispatch_request_msg.locate_information().locate_correct();
+				}
+				//往线程池添加执行任务, 之后会唤醒一个线程去执行他.
+				m_thread_pool.enqueue(&System_executor::execute_for_dispatch, this,
+									  t_dispatch_request_msg.command_id(),
+									  (Dispatch_manager::Dispatch_motion_direction)t_dispatch_request_msg.dispatch_motion_direction(),
+									  t_dispatch_request_msg.terminal_id(),
+									  t_dispatch_request_msg.parkspace_id(),
+									  &t_locate_information		);
+			}
+			else
+			{
+				return Error_manager(Error_code::SYSTEM_EXECUTOR_PARSE_ERROR, Error_level::MINOR_ERROR,
+									 " message::Dispatch_request_msg  ParseFromString error ");
+			}
+			break;
+		}
+		default:
+			break;
 	}
 
 
@@ -169,6 +263,26 @@ Error_manager System_executor::check_status()
 	}
 }
 
+//定时发送状态信息
+Error_manager System_executor::encapsulate_send_status()
+{
+	Error_manager t_error;
+	//创建一条状态消息
+	message::Dispatch_status_msg t_dispatch_status_msg;
+	t_dispatch_status_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_status_msg);
+	t_dispatch_status_msg.mutable_base_info()->set_timeout_ms(5000);
+	t_dispatch_status_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch);
+	t_dispatch_status_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
+
+	Dispatch_manager::Dispatch_manager_status t_dispatch_manager_status = Dispatch_manager::get_instance_references().get_dispatch_manager_status();
+	t_dispatch_status_msg.set_dispatch_manager_status((message::Dispatch_manager_status)t_dispatch_manager_status);
+
+	string t_msg = t_dispatch_status_msg.SerializeAsString();
+	System_communication::get_instance_references().encapsulate_msg(t_msg);
+
+	return Error_code::SUCCESS;
+}
+
 //判断是否为待机,如果已经准备好,则可以执行任务。
 bool System_executor::is_ready()
 {
@@ -226,5 +340,43 @@ void System_executor::execute_for_measure(int command_id, int terminal_id)
 
 	string t_msg = t_measure_response_msg.SerializeAsString();
 	System_communication::get_instance_references().encapsulate_msg(t_msg);
+	LOG(INFO) << " System_executor::execute_for_measure end "<< this;
+
 	return ;
+}
+
+
+//调度模块的处理函数
+void System_executor::execute_for_dispatch(int command_id, Dispatch_manager::Dispatch_motion_direction dispatch_motion_direction,
+										   int terminal_id, int parkspace_id, Locate_information * p_locate_information)
+{
+	Error_manager t_error;
+
+	LOG(INFO) << " System_executor::execute_for_dispatch run "<< this;
+	//这里要处理.......以后再写
+
+	t_error = Dispatch_manager::get_instance_references().execute_task(dispatch_motion_direction);
+
+	//创建一条答复消息
+	message::Dispatch_response_msg t_dispatch_response_msg;
+	t_dispatch_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_response_msg);
+	t_dispatch_response_msg.mutable_base_info()->set_timeout_ms(5000);
+	t_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch);
+	t_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
+
+	t_dispatch_response_msg.set_command_id(command_id);
+	t_dispatch_response_msg.mutable_error_manager()->set_error_code(t_error.get_error_code());
+	t_dispatch_response_msg.mutable_error_manager()->set_error_level((message::Error_level)t_error.get_error_level());
+	t_dispatch_response_msg.mutable_error_manager()->set_error_description(t_error.get_error_description(), t_error.get_description_length());
+
+	string t_msg = t_dispatch_response_msg.SerializeAsString();
+	System_communication::get_instance_references().encapsulate_msg(t_msg);
+
+	std::cout << "huli test dispatch_motion_direction = " << dispatch_motion_direction << std::endl;
+	std::cout << "huli test error = " << t_error << std::endl;
+
+
+	LOG(INFO) << " System_executor::execute_for_dispatch end "<< this;
+	return ;
+
 }

+ 9 - 1
system/system_executor.h

@@ -9,7 +9,9 @@
 #include "../tool/singleton.h"
 #include "../error_code/error_code.h"
 #include "../communication/communication_message.h"
-
+#include "../dispatch/dispatch_manager.h"
+#include "../locate/locate_manager.h"
+#include "../locate/locate_manager_task.h"
 
 class System_executor:public Singleton<System_executor>
 {
@@ -49,6 +51,9 @@ public://API functions
 	//检查状态
 	Error_manager check_status();
 
+	//定时发送状态信息
+	Error_manager encapsulate_send_status();
+
 	//判断是否为待机,如果已经准备好,则可以执行任务。
 	bool is_ready();
 public://get or set member variable
@@ -60,6 +65,9 @@ public:
 //return::void, 没有返回, 执行结果直接生成一条答复消息, 然后通过通信返回
 	void execute_for_measure(int command_id, int terminal_id);
 
+	//调度模块的处理函数
+	void execute_for_dispatch(int command_id, Dispatch_manager::Dispatch_motion_direction dispatch_motion_direction,
+							  int terminal_id, int parkspace_id, Locate_information * p_locate_information);
 
 protected://member variable
 

+ 11 - 1
test.txt

@@ -5,7 +5,17 @@
 
 
 
-
+//搬运器状态
+message Carrier_status
+{
+    E_CARRIER_
+    
+    E_CARRIER_UNKNOW               = 0;    //未知
+        E_CARRIER_READY                = 1;    //准备,待机
+        E_CARRIER_STORE                = 2;	//正在存车
+        E_CARRIER_PICKUP               = 3;	//正在取车
+        E_CARRIER__FAULT               = 4;    //故障
+}